Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
#!/usr/bin/php '); define('BOX_EXTRACT_PATTERN_OPEN',"__HALT"."_COMPILER(); ?>\r\n"); if (class_exists('Phar')) { Phar::mapPhar(''); require 'phar://' . __FILE__ . '/bin/wappspector.php'; } else { $extract = new Extract(__FILE__, Extract::findStubLength(__FILE__)); $dir = $extract->go(); set_include_path($dir . PATH_SEPARATOR . get_include_path()); require "$dir/bin/wappspector.php"; } class Extract { const PATTERN_DEFAULT=BOX_EXTRACT_PATTERN_DEFAULT; const PATTERN_OPEN=BOX_EXTRACT_PATTERN_OPEN; const GZ=4096; const BZ2=8192; const MASK=12288; private$file; private$handle; private$stub; function __construct($file,$stub){ if(!is_file($file)){ throw new InvalidArgumentException(sprintf('The path "%s" is not a file or does not exist.',$file )); } $this->file=$file; $this->stub=$stub; } static function findStubLength($file,$pattern=self::PATTERN_OPEN ){ if(!($fp=fopen($file,'rb'))){ throw new RuntimeException(sprintf('The phar "%s" could not be opened for reading.',$file )); } $stub=null; $offset=0; $combo=str_split($pattern); while(!feof($fp)){ if(fgetc($fp)===$combo[$offset]){ $offset++; if(!isset($combo[$offset])){ $stub=ftell($fp); break; } }else{ $offset=0; } } fclose($fp); if(null===$stub){ throw new InvalidArgumentException(sprintf('The pattern could not be found in "%s".',$file )); } return$stub; } function go($dir=null){ if(null===$dir){ $dir=rtrim(sys_get_temp_dir(),'\\/').DIRECTORY_SEPARATOR .'pharextract'.DIRECTORY_SEPARATOR .basename($this->file,'.phar'); }else{ $dir=realpath($dir); } $md5=$dir.DIRECTORY_SEPARATOR.md5_file($this->file); if(file_exists($md5)){ return$dir; } if(!is_dir($dir)){ $this->createDir($dir); } $this->open(); if(-1===fseek($this->handle,$this->stub)){ throw new RuntimeException(sprintf('Could not seek to %d in the file "%s".',$this->stub,$this->file )); } $info=$this->readManifest(); if($info['flags']&self::GZ){ if(!function_exists('gzinflate')){ throw new RuntimeException('The zlib extension is (gzinflate()) is required for "%s.',$this->file ); } } if($info['flags']&self::BZ2){ if(!function_exists('bzdecompress')){ throw new RuntimeException('The bzip2 extension (bzdecompress()) is required for "%s".',$this->file ); } } self::purge($dir); $this->createDir($dir); $this->createFile($md5); foreach($info['files']as$info){ $path=$dir.DIRECTORY_SEPARATOR.$info['path']; $parent=dirname($path); if(!is_dir($parent)){ $this->createDir($parent); } if(preg_match('{/$}',$info['path'])){ $this->createDir($path,511,false); }else{ $this->createFile($path,$this->extractFile($info)); } } return$dir; } static function purge($path){ if(is_dir($path)){ foreach(scandir($path)as$item){ if(('.'===$item)||('..'===$item)){ continue; } self::purge($path.DIRECTORY_SEPARATOR.$item); } if(!rmdir($path)){ throw new RuntimeException(sprintf('The directory "%s" could not be deleted.',$path )); } }else{ if(!unlink($path)){ throw new RuntimeException(sprintf('The file "%s" could not be deleted.',$path )); } } } private function createDir($path,$chmod=511,$recursive=true){ if(!mkdir($path,$chmod,$recursive)){ throw new RuntimeException(sprintf('The directory path "%s" could not be created.',$path )); } } private function createFile($path,$contents='',$mode=438){ if(false===file_put_contents($path,$contents)){ throw new RuntimeException(sprintf('The file "%s" could not be written.',$path )); } if(!chmod($path,$mode)){ throw new RuntimeException(sprintf('The file "%s" could not be chmodded to %o.',$path,$mode )); } } private function extractFile($info){ if(0===$info['size']){ return''; } $data=$this->read($info['compressed_size']); if($info['flags']&self::GZ){ if(false===($data=gzinflate($data))){ throw new RuntimeException(sprintf('The "%s" file could not be inflated (gzip) from "%s".',$info['path'],$this->file )); } }elseif($info['flags']&self::BZ2){ if(false===($data=bzdecompress($data))){ throw new RuntimeException(sprintf('The "%s" file could not be inflated (bzip2) from "%s".',$info['path'],$this->file )); } } if(($actual=strlen($data))!==$info['size']){ throw new UnexpectedValueException(sprintf('The size of "%s" (%d) did not match what was expected (%d) in "%s".',$info['path'],$actual,$info['size'],$this->file )); } $crc32=sprintf('%u',crc32($data)&4294967295); if($info['crc32']!=$crc32){ throw new UnexpectedValueException(sprintf('The crc32 checksum (%s) for "%s" did not match what was expected (%s) in "%s".',$crc32,$info['path'],$info['crc32'],$this->file )); } return$data; } private function open(){ if(null===($this->handle=fopen($this->file,'rb'))){ $this->handle=null; throw new RuntimeException(sprintf('The file "%s" could not be opened for reading.',$this->file )); } } private function read($bytes){ $read=''; $total=$bytes; while(!feof($this->handle)&&$bytes){ if(false===($chunk=fread($this->handle,$bytes))){ throw new RuntimeException(sprintf('Could not read %d bytes from "%s".',$bytes,$this->file )); } $read.=$chunk; $bytes-=strlen($chunk); } if(($actual=strlen($read))!==$total){ throw new RuntimeException(sprintf('Only read %d of %d in "%s".',$actual,$total,$this->file )); } return$read; } private function readManifest(){ $size=unpack('V',$this->read(4)); $size=$size[1]; $raw=$this->read($size); $count=unpack('V',substr($raw,0,4)); $count=$count[1]; $aliasSize=unpack('V',substr($raw,10,4)); $aliasSize=$aliasSize[1]; $raw=substr($raw,14+$aliasSize); $metaSize=unpack('V',substr($raw,0,4)); $metaSize=$metaSize[1]; $offset=0; $start=4+$metaSize; $manifest=array('files'=>array(),'flags'=>0,); for($i=0;$i<$count;$i++){ $length=unpack('V',substr($raw,$start,4)); $length=$length[1]; $start+=4; $path=substr($raw,$start,$length); $start+=$length; $file=unpack('Vsize/Vtimestamp/Vcompressed_size/Vcrc32/Vflags/Vmetadata_length',substr($raw,$start,24)); $file['path']=$path; $file['crc32']=sprintf('%u',$file['crc32']&4294967295); $file['offset']=$offset; $offset+=$file['compressed_size']; $start+=24+$file['metadata_length']; $manifest['flags']|=$file['flags']&self::MASK; $manifest['files'][]=$file; } return$manifest; } } __HALT_COMPILER(); ?> :bin/wappspector.phpjo composer.jsonjIԤ README.mdAjAa composer-installer.phpLjLCtsrc/Command/Inspect.phpHjH!<src/Wappspector.php j _(+src/DIContainer.phpj]`%src/MatchResult/Ruby.phpj͙Ksrc/MatchResult/Prestashop.phpjl~src/MatchResult/Laravel.phpj {src/MatchResult/CodeIgniter.phpjsrc/MatchResult/Symfony.phpj9!src/MatchResult/CakePHP.phpjsrc/MatchResult/DotNet.phpj?src/MatchResult/Joomla.phpjǗ֤src/MatchResult/Php.phpj5&src/MatchResult/Wordpress.phpjȻ'src/MatchResult/Duda.phpjz$src/MatchResult/EmptyMatchResult.phpjwsrc/MatchResult/NodeJs.phpjsrc/MatchResult/Typo3.phpjr٤src/MatchResult/Composer.phpj >(src/MatchResult/MatchResultInterface.phpjQsrc/MatchResult/Sitejet.phpjzJ&src/MatchResult/WebPresenceBuilder.phpjwC|src/MatchResult/Yii.phpjsrc/MatchResult/Python.phpj-"Usrc/MatchResult/Siteplus.phpjJSsrc/MatchResult/Sitepro.phpj䟥src/MatchResult/MatchResult.php j WLsrc/MatchResult/Drupal.phpjr,src/container.phpQjQ4src/Matchers/Ruby.phpjsrc/Matchers/Prestashop.phpjGqFsrc/Matchers/Laravel.phpjKsrc/Matchers/CodeIgniter.phpjњ8src/Matchers/Symfony.phpjS[src/Matchers/CakePHP.phpj[src/Matchers/DotNet.php7j7?src/Matchers/Joomla.php'j'%src/Matchers/Php.phpHjHUMe!src/Matchers/Wordpress.phpj^\src/Matchers/Duda.phpjT̤$src/Matchers/UpLevelMatcherTrait.phpjsrc/Matchers/NodeJs.phpbjb"src/Matchers/Typo3.phpj1src/Matchers/Composer.php[j[#u!src/Matchers/MatcherInterface.phpWjW8c'src/Matchers/Sitejet.phpj=-ޤ#src/Matchers/WebPresenceBuilder.phpj^Zsrc/Matchers/Yii.phpjKɑsrc/Matchers/Python.phpj>}src/Matchers/Siteplus.php*j*-src/Matchers/Sitepro.phpjsrc/Matchers/Drupal.phpj2 psrc/Helper/InspectorHelper.phpjiҢsrc/FileSystemFactory.phpljlnLICENSE],j],]{ composer.lock?dj?d?֤ea-wappspector-wrapperdjdPvendor/autoload.phpjҤvendor/composer/ClassLoader.php?j?2@u%vendor/composer/InstalledVersions.phpCjC1vendor/clue/phar-composer/src/Phar/TargetPhar.phpj'B٤/vendor/clue/phar-composer/src/Phar/Packager.phpf*jf*"6դ!vendor/clue/phar-composer/LICENSE:j:TiEBvendor/dealerdirect/phpcodesniffer-composer-installer/CHANGELOG.md nj nڟ'ޤCvendor/dealerdirect/phpcodesniffer-composer-installer/composer.jsonjؤ?vendor/dealerdirect/phpcodesniffer-composer-installer/README.md -j -{@vendor/dealerdirect/phpcodesniffer-composer-installer/LICENSE.md{j{v=ؤDvendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.phpMjMvU'vendor/doctrine/inflector/composer.jsonj|u#vendor/doctrine/inflector/README.md j w)Q2vendor/doctrine/inflector/src/InflectorFactory.phpj;:3*vendor/doctrine/inflector/src/Language.phpjw3/vendor/doctrine/inflector/src/WordInflector.phpj##l@vendor/doctrine/inflector/src/Rules/English/InflectorFactory.phpjY?;vendor/doctrine/inflector/src/Rules/English/Inflectible.php.j.ԟ5vendor/doctrine/inflector/src/Rules/English/Rules.phpjjjD;vendor/doctrine/inflector/src/Rules/English/Uninflected.phpj&'4vendor/doctrine/inflector/src/Rules/Substitution.phpjΤ@vendor/doctrine/inflector/src/Rules/Italian/InflectorFactory.phpjɷ#;vendor/doctrine/inflector/src/Rules/Italian/Inflectible.php !j !$+5vendor/doctrine/inflector/src/Rules/Italian/Rules.phpjjj^;vendor/doctrine/inflector/src/Rules/Italian/Uninflected.phpjeҤ/vendor/doctrine/inflector/src/Rules/Pattern.phpja_/vendor/doctrine/inflector/src/Rules/Ruleset.php j fP6vendor/doctrine/inflector/src/Rules/Transformation.phpj'Hvendor/doctrine/inflector/src/Rules/NorwegianBokmal/InflectorFactory.phpj;0Cvendor/doctrine/inflector/src/Rules/NorwegianBokmal/Inflectible.phpj{<=vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Rules.phprjrTCvendor/doctrine/inflector/src/Rules/NorwegianBokmal/Uninflected.phpdjdٮd@vendor/doctrine/inflector/src/Rules/Spanish/InflectorFactory.phpj[;vendor/doctrine/inflector/src/Rules/Spanish/Inflectible.php9j9͕5vendor/doctrine/inflector/src/Rules/Spanish/Rules.phpjjjj?;vendor/doctrine/inflector/src/Rules/Spanish/Uninflected.phpgjg@OCvendor/doctrine/inflector/src/Rules/Portuguese/InflectorFactory.phpj3>vendor/doctrine/inflector/src/Rules/Portuguese/Inflectible.phpj@Yo8vendor/doctrine/inflector/src/Rules/Portuguese/Rules.phpmjm!<ۘ>vendor/doctrine/inflector/src/Rules/Portuguese/Uninflected.phpjn*@vendor/doctrine/inflector/src/Rules/Turkish/InflectorFactory.phpj ;vendor/doctrine/inflector/src/Rules/Turkish/Inflectible.phpjJȤ5vendor/doctrine/inflector/src/Rules/Turkish/Rules.phpjjjڃ;vendor/doctrine/inflector/src/Rules/Turkish/Uninflected.phpgjg>Yε7vendor/doctrine/inflector/src/Rules/Transformations.phpjh%ASBvendor/doctrine/inflector/src/Rules/Esperanto/InflectorFactory.phpjq#=vendor/doctrine/inflector/src/Rules/Esperanto/Inflectible.phpj:[F7vendor/doctrine/inflector/src/Rules/Esperanto/Rules.phpljlņ8A=vendor/doctrine/inflector/src/Rules/Esperanto/Uninflected.phpjiz0vendor/doctrine/inflector/src/Rules/Patterns.phpZjZ$4#?vendor/doctrine/inflector/src/Rules/French/InflectorFactory.phpj~2:vendor/doctrine/inflector/src/Rules/French/Inflectible.phpZjZ,zR4vendor/doctrine/inflector/src/Rules/French/Rules.phpijild:vendor/doctrine/inflector/src/Rules/French/Uninflected.phpWjW#5vendor/doctrine/inflector/src/Rules/Substitutions.php\j\m,vendor/doctrine/inflector/src/Rules/Word.php&j&KHW3vendor/doctrine/inflector/src/NoopWordInflector.phpjIˤ:vendor/doctrine/inflector/src/LanguageInflectorFactory.php%j%x뷤+vendor/doctrine/inflector/src/Inflector.php02j022vendor/doctrine/inflector/src/RulesetInflector.phpKjKed5vendor/doctrine/inflector/src/CachedWordInflector.phpj[_iAvendor/doctrine/inflector/src/GenericLanguageInflectorFactory.phpj;!vendor/doctrine/inflector/LICENSE)j)9ޤ+vendor/doctrine/inflector/docs/en/index.rstj8a%vendor/guzzlehttp/guzzle/CHANGELOG.md&Xj&X6~ѥ&vendor/guzzlehttp/guzzle/composer.jsonjt7"vendor/guzzlehttp/guzzle/README.mdjGC*vendor/guzzlehttp/guzzle/package-lock.jsonUjUPw%vendor/guzzlehttp/guzzle/UPGRADING.mdyjy1vendor/guzzlehttp/guzzle/src/MessageFormatter.phpujuL-+vendor/guzzlehttp/guzzle/src/Middleware.php+j+*%vendor/guzzlehttp/guzzle/src/Pool.php`j`\i//vendor/guzzlehttp/guzzle/src/RequestOptions.php*j*d2vendor/guzzlehttp/guzzle/src/functions_include.phpjE9=vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.phpjP4vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php2j2I]9vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php-"j-";.vendor/guzzlehttp/guzzle/src/Handler/Proxy.php j >r6vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.phpVjVw%3vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.phpT jT ?C8vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php j 7{4vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.phponjon40?4vendor/guzzlehttp/guzzle/src/Handler/MockHandler.phpjY75vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php j Y8vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.phpj1vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php8j8n:1vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.phpA%jA%e׮n:vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php j L׸.vendor/guzzlehttp/guzzle/src/TransferStats.phpl jl oD0vendor/guzzlehttp/guzzle/src/ClientInterface.phpU jU 3LĤ6vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php7 j7 be;vendor/guzzlehttp/guzzle/src/Exception/ConnectException.phpjMvy?vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.phpjW<vendor/guzzlehttp/guzzle/src/Exception/TransferException.phpyjy/Dvendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.phpeje$:vendor/guzzlehttp/guzzle/src/Exception/ServerException.phpjFj:vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.phpj5O\$;vendor/guzzlehttp/guzzle/src/Exception/RequestException.phpYjY8=:vendor/guzzlehttp/guzzle/src/Exception/ClientException.phpjjCvendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.phpjco&vendor/guzzlehttp/guzzle/src/Utils.phpg3jg3Gݤ*vendor/guzzlehttp/guzzle/src/functions.php,j,c3vendor/guzzlehttp/guzzle/src/RedirectMiddleware.phpjDS,vendor/guzzlehttp/guzzle/src/ClientTrait.php.#j.#Vx-vendor/guzzlehttp/guzzle/src/HandlerStack.php"j"v|/vendor/guzzlehttp/guzzle/src/BodySummarizer.php`j`ۺT1'vendor/guzzlehttp/guzzle/src/Client.phpHjHߤ0vendor/guzzlehttp/guzzle/src/RetryMiddleware.phpj@:vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php1j18vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.phpj]Ӥ vendor/guzzlehttp/guzzle/LICENSEjՇ'vendor/guzzlehttp/promises/CHANGELOG.md# j# Q G(vendor/guzzlehttp/promises/composer.jsonjߨ$vendor/guzzlehttp/promises/README.mdDjDؔ4vendor/guzzlehttp/promises/src/PromisorInterface.phpjd.vendor/guzzlehttp/promises/src/EachPromise.phpj偢'*vendor/guzzlehttp/promises/src/Promise.php#j#r)vendor/guzzlehttp/promises/src/Create.phpjR5vendor/guzzlehttp/promises/src/AggregateException.phpjb{,vendor/guzzlehttp/promises/src/TaskQueue.phpj4g(vendor/guzzlehttp/promises/src/Utils.php j Bͩ8vendor/guzzlehttp/promises/src/CancellationException.phpjLt5vendor/guzzlehttp/promises/src/RejectionException.phpjuZa5vendor/guzzlehttp/promises/src/TaskQueueInterface.phpj>=2vendor/guzzlehttp/promises/src/RejectedPromise.phpj^=%vendor/guzzlehttp/promises/src/Is.phpj0m,vendor/guzzlehttp/promises/src/Coroutine.phpCjCijK3vendor/guzzlehttp/promises/src/FulfilledPromise.phpj'g3vendor/guzzlehttp/promises/src/PromiseInterface.php j (x'vendor/guzzlehttp/promises/src/Each.phph jh 3"vendor/guzzlehttp/promises/LICENSEjz*/#vendor/guzzlehttp/psr7/CHANGELOG.mdB/jB/$vendor/guzzlehttp/psr7/composer.json j +@ vendor/guzzlehttp/psr7/README.md7sj7s,vendor/guzzlehttp/psr7/src/InflateStream.phpjk*vendor/guzzlehttp/psr7/src/UriResolver.php!j!b'vendor/guzzlehttp/psr7/src/FnStream.phpj=aԤ,vendor/guzzlehttp/psr7/src/CachingStream.phpjj!G,vendor/guzzlehttp/psr7/src/ServerRequest.phpM%jM%--vendor/guzzlehttp/psr7/src/LazyOpenStream.php@j@u+vendor/guzzlehttp/psr7/src/MessageTrait.phptjtWܤ,vendor/guzzlehttp/psr7/src/StreamWrapper.php!j! ,vendor/guzzlehttp/psr7/src/UriNormalizer.php!j!פ*vendor/guzzlehttp/psr7/src/HttpFactory.php j QZ+vendor/guzzlehttp/psr7/src/AppendStream.php;j;'>vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.phpjN|,vendor/guzzlehttp/psr7/src/UriComparator.php~j~Ŝ %vendor/guzzlehttp/psr7/src/Header.phpeje&vendor/guzzlehttp/psr7/src/Message.php j J$vendor/guzzlehttp/psr7/src/Utils.phpG>jG>Eg%vendor/guzzlehttp/psr7/src/Stream.phpjz$vendor/guzzlehttp/psr7/src/Query.phpjg*'vendor/guzzlehttp/psr7/src/MimeType.phpLjLn -vendor/guzzlehttp/psr7/src/DroppingStream.phpjq: t&vendor/guzzlehttp/psr7/src/Request.phpBjB]+vendor/guzzlehttp/psr7/src/NoSeekStream.php j ×'vendor/guzzlehttp/psr7/src/Response.php+j+AA&vendor/guzzlehttp/psr7/src/Rfc7230.phpjџU+vendor/guzzlehttp/psr7/src/BufferStream.php j Dy"vendor/guzzlehttp/psr7/src/Uri.phpUjUNd3vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php j jg+vendor/guzzlehttp/psr7/src/UploadedFile.phpju72.vendor/guzzlehttp/psr7/src/MultipartStream.phphjhkGۤ*vendor/guzzlehttp/psr7/src/LimitStream.phpjR;)vendor/guzzlehttp/psr7/src/PumpStream.phpj=vendor/guzzlehttp/psr7/LICENSEzjz^pL*vendor/knplabs/packagist-api/composer.jsonj Z5Hvendor/knplabs/packagist-api/src/Packagist/Api/Result/Package/Author.phpj8_\Hvendor/knplabs/packagist-api/src/Packagist/Api/Result/Package/Source.phpjKvendor/knplabs/packagist-api/src/Packagist/Api/Result/Package/Downloads.phpjLvendor/knplabs/packagist-api/src/Packagist/Api/Result/Package/Maintainer.phpjRFvendor/knplabs/packagist-api/src/Packagist/Api/Result/Package/Dist.phpj=Ivendor/knplabs/packagist-api/src/Packagist/Api/Result/Package/Version.phpfjf<ϳHvendor/knplabs/packagist-api/src/Packagist/Api/Result/AbstractResult.php+j+}Avendor/knplabs/packagist-api/src/Packagist/Api/Result/Factory.php j LդAvendor/knplabs/packagist-api/src/Packagist/Api/Result/Package.php^ j^ }@vendor/knplabs/packagist-api/src/Packagist/Api/Result/Result.phpljll^9vendor/knplabs/packagist-api/src/Packagist/Api/Client.php$j$U1$vendor/knplabs/packagist-api/LICENSE!j!FN1vendor/laravel/serializable-closure/composer.jsonjt-vendor/laravel/serializable-closure/README.mdB jB q\.vendor/laravel/serializable-closure/LICENSE.md3j3α8vendor/laravel/serializable-closure/src/Signers/Hmac.phpUjU]B>vendor/laravel/serializable-closure/src/Serializers/Native.phplCjlC#n<>vendor/laravel/serializable-closure/src/Serializers/Signed.phpxjx58G@vendor/laravel/serializable-closure/src/Support/ClosureScope.phpzjzJsxAvendor/laravel/serializable-closure/src/Support/SelfReference.phpjO4WtEvendor/laravel/serializable-closure/src/Support/ReflectionClosure.phpjú ȤAvendor/laravel/serializable-closure/src/Support/ClosureStream.php!j!\Gvendor/laravel/serializable-closure/src/UnsignedSerializableClosure.phpjA^Pvendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.phpj,Pvendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.phpjf?vendor/laravel/serializable-closure/src/SerializableClosure.php j 1)ҤBvendor/laravel/serializable-closure/src/Contracts/Serializable.phpajawӤ<vendor/laravel/serializable-closure/src/Contracts/Signer.phpjڜ%vendor/league/flysystem/composer.jsonj9vendor/league/flysystem/INFO.mdj`&vendor/league/flysystem/src/Config.phpji΍3vendor/league/flysystem/src/DirectoryAttributes.phpj%ߤ0vendor/league/flysystem/src/DirectoryListing.phpjOs7vendor/league/flysystem/src/UnableToCreateDirectory.phpNjNͤBvendor/league/flysystem/src/UnixVisibility/VisibilityConverter.phpj.|呤Jvendor/league/flysystem/src/UnixVisibility/PortableVisibilityConverter.phpQ jQ C7vendor/league/flysystem/src/PortableVisibilityGuard.phpj1V.vendor/league/flysystem/src/PathNormalizer.phpjk;vendor/league/flysystem/src/CalculateChecksumFromStream.phpjl7?vendor/league/flysystem/src/UnableToCheckDirectoryExistence.phpjEa0vendor/league/flysystem/src/UnableToReadFile.phpj <vendor/league/flysystem/src/ProxyArrayAccessToProperties.phpj!-T>vendor/league/flysystem/src/UnableToResolveFilesystemMount.phpj$F1vendor/league/flysystem/src/StorageAttributes.php j P=:vendor/league/flysystem/src/ChecksumAlgoIsNotSupported.phpjT>Q2vendor/league/flysystem/src/FilesystemOperator.phpjg0vendor/league/flysystem/src/ChecksumProvider.php#j#e<vendor/league/flysystem/src/ResolveIdenticalPathConflict.phpjE0vendor/league/flysystem/src/UnableToCopyFile.phpjk0vendor/league/flysystem/src/DecoratedAdapter.phpu ju 7vendor/league/flysystem/src/UnableToMountFilesystem.phpjK!"8vendor/league/flysystem/src/UnableToRetrieveMetadata.phpj(u'C0vendor/league/flysystem/src/UnableToMoveFile.phpbjb.!ݤ5vendor/league/flysystem/src/PathTraversalDetected.phpj^ڤ6vendor/league/flysystem/src/UnableToCheckExistence.phpj+F4vendor/league/flysystem/src/UnableToListContents.phpj\7vendor/league/flysystem/src/UnableToDeleteDirectory.phpjf0vendor/league/flysystem/src/FilesystemReader.phpyjyAc#9vendor/league/flysystem/src/UnableToGeneratePublicUrl.phpj[դ2vendor/league/flysystem/src/UnableToDeleteFile.phpjGӤ1vendor/league/flysystem/src/FilesystemAdapter.php j ' Ĥ0vendor/league/flysystem/src/FilesystemWriter.phpjL?7vendor/league/flysystem/src/UnableToProvideChecksum.phpj_*vendor/league/flysystem/src/Filesystem.php|&j|&.,vendor/league/flysystem/src/MountManager.php;j;9vendor/league/flysystem/src/UnreadableFileEncountered.php,j,v5vendor/league/flysystem/src/InvalidStreamProvided.phpjɜ<vendor/league/flysystem/src/UnableToGenerateTemporaryUrl.phpj n5vendor/league/flysystem/src/UnableToSetVisibility.phpj:vendor/league/flysystem/src/UnableToCheckFileExistence.phpjXv9vendor/league/flysystem/src/FilesystemOperationFailed.phpj(7vendor/league/flysystem/src/SymbolicLinkEncountered.phpje?,vendor/league/flysystem/src/PathPrefixer.phpjM0*vendor/league/flysystem/src/Visibility.phpj7ۤ1vendor/league/flysystem/src/UnableToWriteFile.phpjMvendor/league/flysystem/src/UrlGeneration/ShardedPrefixPublicUrlGenerator.phpjΕӤ@vendor/league/flysystem/src/UrlGeneration/PublicUrlGenerator.php9j9ZäGvendor/league/flysystem/src/UrlGeneration/ChainedPublicUrlGenerator.phpj(yFvendor/league/flysystem/src/UrlGeneration/PrefixPublicUrlGenerator.phpjX3XCvendor/league/flysystem/src/UrlGeneration/TemporaryUrlGenerator.phpyjy`KѤ3vendor/league/flysystem/src/FilesystemException.phpjФ9vendor/league/flysystem/src/InvalidVisibilityProvided.php)j)dk5vendor/league/flysystem/src/CorruptedPathDetected.php<j< d8vendor/league/flysystem/src/WhitespacePathNormalizer.phpj.vendor/league/flysystem/src/FileAttributes.php j g3vendor/league/flysystem/LICENSE'j'yؤ!vendor/league/flysystem/readme.mdrjr|L+vendor/league/flysystem-local/composer.jsonzjzܝ%vendor/league/flysystem-local/LICENSE'j'yؤ8vendor/league/flysystem-local/LocalFilesystemAdapter.php=j=M:vendor/league/flysystem-local/FallbackMimeTypeDetector.phpj.vendor/league/mime-type-detection/CHANGELOG.mdjޖ=[/vendor/league/mime-type-detection/composer.json!j!K3Cvendor/league/mime-type-detection/src/ExtensionMimeTypeDetector.phpj>9vEvendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.phpj 2?vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php j !%Ivendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.phpj@vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.phpjzc9vendor/league/mime-type-detection/src/ExtensionLookup.phpj+@Jvendor/league/mime-type-detection/src/OverridingExtensionToMimeTypeMap.phpjy:vendor/league/mime-type-detection/src/MimeTypeDetector.phpjU^RR)vendor/league/mime-type-detection/LICENSE'j'M &vendor/mikey179/vfsstream/CHANGELOG.mdX*jX*/z'vendor/mikey179/vfsstream/composer.jsonj|T#vendor/mikey179/vfsstream/README.mdrjrrv*vendor/mikey179/vfsstream/phpunit.xml.distjiR[vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue18TestCase.php j K韤\vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamContainerIteratorTestCase.php j lLKvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamTestCase.php.cj.cu*[vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperSetOptionTestCase.phpj[vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperLargeFileTestCase.phpjC}Pvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamBlockTestCase.phpj,Uvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirTestCase.phpb<jb<ʤMvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/PermissionsTestCase.php% j% Jvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/FilenameTestCase.phpjtRvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperTestCase.phpkjk^ӯ^vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/proxy/vfsStreamWrapperRecordingProxy.phpj^vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperStreamSelectTestCase.phpj.~Wvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFlockTestCase.php8j8 *%Ovendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamFileTestCase.php,j,Q4 Nvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamZipTestCase.php1j1}Z|Vvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTestCase.php4j4*r ڤTvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryTestCase.php+j+m0]vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamResolveIncludePathTestCase.phpj\vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperUnregisterTestCase.phpj\/]vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperWithoutRootTestCase.phpjqS9Jvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/Issue104TestCase.phptjt!)Qvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamExLockTestCase.phpjmΫWvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperQuotaTestCase.phpj֤bvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitorTestCase.php j e)ڤ_vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitorTestCase.php j dcvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitorTestCase.phpT jT Pvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamUmaskTestCase.phpjcvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperAlreadyRegisteredTestCase.phpjؤ`vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/StringBasedFileContentTestCase.phpjݤZvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/LargeFileContentTestCase.phpjPV*Ovendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamGlobTestCase.phpjꚤ^vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirSeparatorTestCase.phpjӤZvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamAbstractContentTestCase.phpjh\vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue134TestCase.phpj~'[vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTimesTestCase.php,j,y*6Vvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperBaseTestCase.php j tTvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/DirectoryIterationTestCase.php.j. "Gvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/QuotaTestCase.php j v4Hvendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/UnlinkTestCase.phpj ˆ0vendor/mikey179/vfsstream/src/test/bootstrap.phpjY-Tvendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/aFile.txtj!es_vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/subfolder1/file1.txtj5vendor/mikey179/vfsstream/src/test/phpt/bug71287.phptjuTvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContainerIterator.phpjAUFvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/DotDirectory.phpjpSRvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamAbstractContent.php"j"JkJvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContent.phpj/Cvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStream.php=j=Hvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamBlock.phpj[CJvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamWrapper.php|sj|s(+Rvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamVisitor.phpEjEնWvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitor.php j *[vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitor.php j `bZvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitor.phpjFXvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/StringBasedFileContent.phpJjJVZ5Rvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/LargeFileContent.phpj Uvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/SeekableFileContent.phps js yKޤMvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/FileContent.phpKjKLvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamException.phpmjm.2yLvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamDirectory.phpwjw9QƤ?vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/Quota.phpjd?Gvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamFile.php%j%iLvendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContainer.phpEjEx!vendor/mikey179/vfsstream/LICENSEjE&vendor/myclabs/deep-copy/composer.jsonj 9@{"vendor/myclabs/deep-copy/README.md*j*|7vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php\j\6SMvendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.phpjWvendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpj;Rvendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.phpHjH>vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.phpjDCe@vendor/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.phpj,>>vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.phpj] j;;vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.phpjOvendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phphjhLbEvendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.phpXjX!t-9vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.phpjqeAvendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.phpj?SbEvendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.phpjYx3vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.phpj"eBvendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.phpjLtEvendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.phpxjx4?vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.phpj-hFvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.phpjZ٤Jvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.phpj0)Rvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpjJ霤Lvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.phpj̤Bvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php j 7Lvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpjGFФJvendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.phpJjJ0PaAvendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.phpjsw֤2vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.phpK"jK"UEvendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php~j~:̤ vendor/myclabs/deep-copy/LICENSE5j5ʭ˄%vendor/nikic/php-parser/bin/php-parsej~+%vendor/nikic/php-parser/composer.jsonKjK6}!vendor/nikic/php-parser/README.mdji avendor/nikic/php-parser/LICENSEj*4vendor/nikic/php-parser/lib/PhpParser/PhpVersion.phpjNW[1/vendor/nikic/php-parser/lib/PhpParser/Lexer.phpj/2 6vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php,j,s4vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php/ j/ c"J\>vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php$j$x;vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.phpj@z+ä@vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php%j%&ULvendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.phpm jm =5bu9vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.phpjv`1vendor/nikic/php-parser/lib/PhpParser/Builder.phpj6I.vendor/nikic/php-parser/lib/PhpParser/Node.phpj(դ?vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.phpj7Y5vendor/nikic/php-parser/lib/PhpParser/NameContext.phpE'jE'INx5vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php j >vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php j 4ϫ8vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.phpjf:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php}j} z=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php1j1u#8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.phpMjMN?UAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php,j,ߓFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php6j6_uBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php.j.=|Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php1j1OsGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php9j9OWz@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php)j)Ul{Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php4j4֤Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php5j5Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php+j+#Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php1j1ԤFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php6j6-)Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php7j73Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php-j- >$Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php@j@$Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php7j7hN오Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php/j/EFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php6j6ФFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php7j7S ;Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php@j@a֤Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php9j9}ä@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php*j*@Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php4j4@Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php8j8;%@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php)j)+\Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php8j8hA9Ivendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php=j=5^@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php)j)=Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php7j7(:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.phpj?(:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php?j?h<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php}j}&8r>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.phpjI?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.phpj[g?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.phpjckޓ@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.phpbjbD@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.phpj ̤>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php\j\nJ ?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.phpj8=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.phpXjX@[Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php6j6=R>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.phpj,Fj3Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.phpjn<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.phpjR?Aפ=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php7j7?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php\j\{):vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.phpNjN5]>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.phpj,Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.phpjN'&=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.phpj)<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.phpGjGD 9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.phpojo1bܤAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php j XIvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.phpjw=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.phpj&>;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php j A<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.phpj+6<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php j Yw<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.phpjP9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.phpj=hfGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.phpjF:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php|j|4 9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.phpjjU>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php5j51ˤ>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.phpj.@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.phpj-64Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.phpjRYqޤAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.phpj)ޤFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.phpj\Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.phpjŤGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.phpj&h;Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.phpjNsQ@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.phpj!Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.phpj@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.phpjGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.phpjj@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.phpj)qGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.phpj@sä:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.phpjzrb;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.phpjѫ;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.phpj*Ӥ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.phpjW0:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php|j|v>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.phpjXMf8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php7j7sPGAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.phpj;9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php}j}{%>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.phpj&Iդ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.phpji*>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.phpjR:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.phpjj;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.phpj_EFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.phpj}=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.phpj:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.phpj!'=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.phpp jp Q7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.phppjp_ݾBvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.phpMjM֤:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php6j6 >>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.phpjkj;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php(j(_aŤFvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php%j%)8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.phpj7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php'j';vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.phpjq>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.phpjq*":vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php j \:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.phpjެ>A9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.phpj;77<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.phpjcw?vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.phpljl¤:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.phpZjZ}]=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php1j1_|49@vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.phpj 5:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.phpjfu=9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.phpjBǬ9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.phpj <vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.phpjgM:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php/j/|;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php:j:r=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php j <9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.phpjƙ<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php%j%$|<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.phpjwLvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.phpj]TSQvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpj!Ұ>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.phpj o<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.phpyjy&X9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php*j*9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.phpejeZcĤ;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.phpj?>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.phpTjTUޜ9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.phpjoJ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.phpj_^W<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.phpjW8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.phpj;6}7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php3j39t<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.phpjݯMDvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.phpSjS"E<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.phpb jb =vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.phpjDA>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php-j-)M);vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.phpjX:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php5j53첤:vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.phpjXBvendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.phpjɒ!<vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.phpjlN7vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.phpjvS;vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php0j08vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.phpj֖ E8vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php4j4࢈;vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.phpg jg h锤<vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php5j5YCYHvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.phpjǢP>vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.phpAjA]=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.phpjI0̤=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.phpjs!@vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.phpZjZԸeGJvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.phpDjD^RDvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php4j4M+/Evendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php7j7Kvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.phpGjG古Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php;j;;@NGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php=j=OּGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php;j;eEvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php7j7_^Ivendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.phpCjCPɤ:vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php j {mf=Hvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.phpjw^=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.phpjVפ2vendor/nikic/php-parser/lib/PhpParser/Node/Arg.phpj'+:vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.phpCjC(dN8vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.phpj`a$3vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.phpjYm"5vendor/nikic/php-parser/lib/PhpParser/Node/Const_.phpjƤ;vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.phpjIi 3vendor/nikic/php-parser/lib/PhpParser/Node/Expr.phpj}序9vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.phpjl@vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.phpjJW5vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phpbjbkQKBvendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.phpjwEF|3vendor/nikic/php-parser/lib/PhpParser/Node/Name.php!j!b4vendor/nikic/php-parser/lib/PhpParser/Node/Param.phpju^=vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.phpjQ/;vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.phpj*/9vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.phpEjE<#Evendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.phpRjR3?vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.phpj A6vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.phpjQ+ͤ@vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.phpVjV.ۤ͞1vendor/nikic/php-parser/lib/PhpParser/Comment.phpj@ X5vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phpgjg[ĠZ0vendor/nikic/php-parser/lib/PhpParser/Parser.phpj?[vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.phpj)ˆSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php!j!:@Kvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php3j3\Q/Svendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.phpjYm ݤMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.phpj^HKߤMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php+j+v_vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php j /,Ovendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.phpjȩ3Nvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php$ j$ iSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.phpj7E5fRvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.phpjL+NSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.phpj 3ߤPvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.phpjR̤Ovendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.phpjMy9vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.phpN!jN!JUIvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.phpjе*Dvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.phpwjwIDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.phpj'pBvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php(j(HLKvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php j T Nvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php j ϤMvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php=j=t;<vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.phpO%jO%S6vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.phpj/w@vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.phpj=vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.phpj [פ;vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.phpjDvendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.phpj$Ф6vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.phpjXWy<vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php1j1~u~8vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.phpKjKj):vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.phpj=vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.phpjo8vendor/nikic/php-parser/lib/PhpParser/Builder/Method.phpjR8vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php4 j4 8:vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.phpvjv^Ҥ7vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php j ڣ7vendor/nikic/php-parser/lib/PhpParser/Builder/Param.phprjr1Ƥ>vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.phpj,V<vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php#j#^O):vendor/nikic/php-parser/lib/PhpParser/Builder/Property.phpsjs}<vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.phpD jD qԴ8vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php&j&%4vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php(j(</vendor/nikic/php-parser/lib/PhpParser/Error.phpXjXV/vendor/nikic/php-parser/lib/PhpParser/Token.phpj Fvendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.phppjpҀ7vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpj}Ɓ3vendor/nikic/php-parser/lib/PhpParser/Modifiers.php j Y7D7vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.phpj E8vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php\j\в7vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php[(j[(5vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.phpj*5vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.phpGjG 5vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.phpSjS8vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php5)j5)Avendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.phpeje0ޤ?vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.phppjp Ф$vendor/phar-io/manifest/CHANGELOG.mdjXy%vendor/phar-io/manifest/composer.jsonj0!vendor/phar-io/manifest/README.mdj7vendor/phar-io/manifest/tools/php-cs-fixer.d/header.txt7j7ڈUIvendor/phar-io/manifest/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.phpj Ф2vendor/phar-io/manifest/src/ManifestSerializer.phpjۂ;vendor/phar-io/manifest/src/xml/AuthorElementCollection.phpSjS(72vendor/phar-io/manifest/src/xml/LicenseElement.php|j|tTX8vendor/phar-io/manifest/src/xml/ExtElementCollection.phpJjJ5vendor/phar-io/manifest/src/xml/ElementCollection.phpj砲L.vendor/phar-io/manifest/src/xml/ExtElement.phpj3vendor/phar-io/manifest/src/xml/RequiresElement.phpKjKܗ3vendor/phar-io/manifest/src/xml/ContainsElement.phpjaΤ4vendor/phar-io/manifest/src/xml/ComponentElement.phpj$Sg>vendor/phar-io/manifest/src/xml/ComponentElementCollection.php\j\6 1vendor/phar-io/manifest/src/xml/AuthorElement.phpj22vendor/phar-io/manifest/src/xml/BundlesElement.phpzjz}4vendor/phar-io/manifest/src/xml/ExtensionElement.phpjzj4vendor/phar-io/manifest/src/xml/ManifestDocument.php j 9S.vendor/phar-io/manifest/src/xml/PhpElement.phpjwO3vendor/phar-io/manifest/src/xml/ManifestElement.phpnjnp4vendor/phar-io/manifest/src/xml/CopyrightElement.php j t)T6vendor/phar-io/manifest/src/ManifestDocumentMapper.phpjqBvendor/phar-io/manifest/src/exceptions/NoEmailAddressException.phpjq:4vendor/phar-io/manifest/src/exceptions/Exception.phpjPCvendor/phar-io/manifest/src/exceptions/ManifestElementException.phpj#mߤ>vendor/phar-io/manifest/src/exceptions/InvalidUrlException.phpjYBvendor/phar-io/manifest/src/exceptions/ManifestLoaderException.phpj4oJvendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.phpj`'iEvendor/phar-io/manifest/src/exceptions/ElementCollectionException.phpj_UjKvendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.phpjգJvendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php1j1MVDvendor/phar-io/manifest/src/exceptions/ManifestDocumentException.phpj o@vendor/phar-io/manifest/src/exceptions/InvalidEmailException.phpjˤ.vendor/phar-io/manifest/src/ManifestLoader.phpjq̤<vendor/phar-io/manifest/src/values/RequirementCollection.php\j\X?0vendor/phar-io/manifest/src/values/Extension.phpjZ7'7vendor/phar-io/manifest/src/values/AuthorCollection.phpj¤.vendor/phar-io/manifest/src/values/Library.phpj-vendor/phar-io/manifest/src/values/Author.phpjvendor/phar-io/manifest/src/values/PhpExtensionRequirement.phpj(*vendor/phar-io/manifest/src/values/Url.phpj#lͣ7vendor/phar-io/manifest/src/values/BundledComponent.phpHjHZ .vendor/phar-io/manifest/src/values/License.phpj^<vendor/phar-io/manifest/src/values/PhpVersionRequirement.php$j$"&Avendor/phar-io/manifest/src/values/BundledComponentCollection.phpj$+vendor/phar-io/manifest/src/values/Type.phpj<26vendor/phar-io/manifest/src/values/ApplicationName.phpj2vendor/phar-io/manifest/src/values/Application.phpjf=;vendor/phar-io/manifest/src/values/CopyrightInformation.php\j\,vendor/phar-io/manifest/src/values/Email.phpjS|Ivendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.phpj:"漤?vendor/phar-io/manifest/src/values/AuthorCollectionIterator.phpj]=Dvendor/phar-io/manifest/src/values/RequirementCollectionIterator.phpj vendor/phar-io/manifest/LICENSE`j`p$vendor/phar-io/manifest/manifest.xsd|j|\Ѥ%vendor/phar-io/manifest/composer.lock j .1#vendor/phar-io/version/CHANGELOG.mdj\$vendor/phar-io/version/composer.jsonjw¤ vendor/phar-io/version/README.md9 j9 6vendor/phar-io/version/src/VersionConstraintParser.phpj13,vendor/phar-io/version/src/BuildMetaData.phpjHQvendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.phpjLKIvendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.phpj Pvendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.phpj^Dvendor/phar-io/version/src/constraints/AndVersionConstraintGroup.phpj/j-ҤDvendor/phar-io/version/src/constraints/AbstractVersionConstraint.phpjoSMy?vendor/phar-io/version/src/constraints/AnyVersionConstraint.php@j@[ <vendor/phar-io/version/src/constraints/VersionConstraint.phpjWAvendor/phar-io/version/src/constraints/ExactVersionConstraint.phpj:BCvendor/phar-io/version/src/constraints/OrVersionConstraintGroup.phpjؤ3vendor/phar-io/version/src/exceptions/Exception.phpjGJvendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.phpjOvendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.phpjGdBvendor/phar-io/version/src/exceptions/NoBuildMetaDataException.phpjEvendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.phpjXbpԤAvendor/phar-io/version/src/exceptions/InvalidVersionException.phpj|&vendor/phar-io/version/src/Version.php+j+fr붤/vendor/phar-io/version/src/PreReleaseSuffix.php^j^.o ,vendor/phar-io/version/src/VersionNumber.phpjJ}rvendor/phar-io/version/LICENSE&j&Ҫ #vendor/php-di/invoker/composer.jsonTjTqvendor/php-di/invoker/README.mdj.B%vendor/php-di/invoker/src/Invoker.php j =9u*Avendor/php-di/invoker/src/ParameterResolver/ParameterResolver.phpjv64@vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.phpNjNeMDvendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php-j-\Hvendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.phpTjT\ Dvendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.phpajaqSvendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.phpje=iXvendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.phpjk葮=vendor/php-di/invoker/src/ParameterResolver/ResolverChain.phpWjWݫ<vendor/php-di/invoker/src/Exception/NotCallableException.phpj$%Dvendor/php-di/invoker/src/Exception/NotEnoughParametersException.phpjg㢤;vendor/php-di/invoker/src/Exception/InvocationException.phpj`[.vendor/php-di/invoker/src/CallableResolver.php|j|8.vendor/php-di/invoker/src/InvokerInterface.phpj׬.V;vendor/php-di/invoker/src/Reflection/CallableReflection.php+j+vendor/php-di/invoker/LICENSE5j50o"vendor/php-di/php-di/composer.jsonAjA $I٤vendor/php-di/php-di/README.mdj-Y:vendor/php-di/php-di/src/Definition/AutowireDefinition.phpj -Ȧ9vendor/php-di/php-di/src/Definition/FactoryDefinition.phpjK7Bvendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.phpj]Avendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.phppjpe\ Cvendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.phpj2k@vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.phpj?B>vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.phpjp/OCvendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.phpjvp=Lvendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.phpKjKͤ>vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.phpj Bvendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.phpjOƈ:vendor/php-di/php-di/src/Definition/Source/SourceChain.php j GϬHvendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.phpv jv K6MΤ9vendor/php-di/php-di/src/Definition/Source/Autowiring.phpjq$>vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php j 3=vendor/php-di/php-di/src/Definition/Source/DefinitionFile.phpCjC*?vendor/php-di/php-di/src/Definition/Source/DefinitionSource.phpyjy9*Cvendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.phpj̀Fvendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.phpdjdLJGvendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php]"j]"f;vendor/php-di/php-di/src/Definition/Source/NoAutowiring.phpCjC{qw:vendor/php-di/php-di/src/Definition/Source/SourceCache.php j E@vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.phpj2ˤ:vendor/php-di/php-di/src/Definition/InstanceDefinition.phpzjzQAvendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.phpCjC7vendor/php-di/php-di/src/Definition/ValueDefinition.phptjtΤBvendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.phpjLCvendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.phprjrƨ8vendor/php-di/php-di/src/Definition/ObjectDefinition.php0j0r3ޤ2vendor/php-di/php-di/src/Definition/Definition.phpOjO>/ 8vendor/php-di/php-di/src/Definition/StringDefinition.phpjcyEvendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.phpj0ꕤ;vendor/php-di/php-di/src/Definition/DecoratorDefinition.phpj 1vendor/php-di/php-di/src/Definition/Reference.php$j$CΤEvendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php j 4ZtcGvendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php j ٱeEvendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.phpj;hFvendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.phpj9D6?vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.phpijiKM?vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.phpj恤7vendor/php-di/php-di/src/Definition/ArrayDefinition.php;j;~Hvendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.phpmjmW9Jvendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.phpjC(1--vendor/php-di/php-di/src/FactoryInterface.phpj4y.vendor/php-di/php-di/src/NotFoundException.phpjB=vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.phpjv}@vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.phpVjVvW=0vendor/php-di/php-di/src/DependencyException.phpjj>-vendor/php-di/php-di/src/ContainerBuilder.phpT)jT)-^.vendor/php-di/php-di/src/CompiledContainer.phpj+&vendor/php-di/php-di/src/functions.phpqjq>1#1vendor/php-di/php-di/src/Attribute/Injectable.php,j,Ĥ-vendor/php-di/php-di/src/Attribute/Inject.phpj)3vendor/php-di/php-di/src/Factory/RequestedEntry.phpjՌ٤8vendor/php-di/php-di/src/Proxy/ProxyFactoryInterface.phpj~ 5vendor/php-di/php-di/src/Proxy/NativeProxyFactory.phpyjyq/vendor/php-di/php-di/src/Proxy/ProxyFactory.php j 0.vendor/php-di/php-di/src/Compiler/Compiler.php;j;|k<vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.phpj.vendor/php-di/php-di/src/Compiler/Template.phpjF:vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.phphjh@=&vendor/php-di/php-di/src/Container.php.5j.55Jk"vendor/php-di/php-di/change-log.mdijiH>vendor/php-di/php-di/support.md! j! GW$vendor/php-di/php-di/LICENSE5j5P:+*vendor/phpstan/phpdoc-parser/composer.jsonjޟ,e&vendor/phpstan/phpdoc-parser/README.mdj{N)vendor/phpstan/phpdoc-parser/UPGRADING.md#j#&~g1vendor/phpstan/phpdoc-parser/src/ParserConfig.php'j'#60vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.phpj<Ǥ7vendor/phpstan/phpdoc-parser/src/Ast/NodeAttributes.phpj<&DBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.phpjA~_Cvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.phpjfAMvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.phpjktD&Fvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.phpj+Ivendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.phpjoUmJvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.phpijiuKvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.phpjz(@Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.phpjf=vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.phpjAvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.phpjp?vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.phpvjvVCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.phpJjJFCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.phpjXuoPLvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php]j]땥Fvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.phpjo{ڤFvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php/j/ĭؤBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.phpjy ȤCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.phpj [nkBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.phpjIvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.phpjp Avendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.phpj>Dvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.phpUjUKvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.phpj^BZ->vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.phpjQ{Mvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.phpjlJvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.phpj?[vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.phpjrTȤVvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.phpjoBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SealedTagValueNode.phpjb"Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.phpjfc:Uvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.phpj -+@vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.phpj ':vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php)j)"6)zDvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.phpUjUͱHvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.phpj9Jvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.phpjhjKvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.phpYjY-?vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.phpjDvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.phpOjO+Evendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.phpzjz#@-vendor/phpstan/phpdoc-parser/src/Ast/Node.php\j\,Nvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php]j])XGvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.phpjK2Evendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.phpLjLEvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.phpSjSsqzFvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.phpv jv G5@vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.phpjwu{Avendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.phpjlEvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.phpjxyIvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.phpj洏Dvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.phpJjJ$դDvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.phpJjJiHB0vendor/phpstan/phpdoc-parser/src/Ast/Comment.phpj]ܤ2vendor/phpstan/phpdoc-parser/src/Ast/Attribute.phpUjUaaCvendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.phpjrʤ<vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.phpjR#6vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php j ݓf4vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php j \\:vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php<j<&GzMvendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.phpjFAvendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.phpj`; =vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.phpjm(>vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.phpj ~;vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php$j$;vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.phpzjz"QGvendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.phpj-7=vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.phpjB\[Bvendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.phpjIh@vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.phpj}Avendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php-j-D:T6vendor/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.phpj7PBvendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.phpj^<vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.phpjٝ ;vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.phpj ZoC>vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.phpjB@vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.phpj74Hvendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.phpj=vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.phpZjZ;0;vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.phpjvڤ;vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.phpX jX 8z9vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php=#j=#,;vendor/phpstan/phpdoc-parser/src/Parser/ParserException.phphjh즤8vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php9j9dyB6vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php4j4%m4vendor/phpstan/phpdoc-parser/src/Printer/Printer.php{j{b<35vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.phpkjk6%3vendor/phpstan/phpdoc-parser/src/Printer/Differ.phpj%¤$vendor/phpstan/phpdoc-parser/LICENSEQjQw$vendor/phpstan/phpstan/bootstrap.phpj3[$vendor/phpstan/phpstan/composer.jsonj8 vendor/phpstan/phpstan/README.md'j'"nvendor/phpstan/phpstan/phpstanjy.#vendor/phpstan/phpstan/phpstan.phar*&kj*&kse'vendor/phpstan/phpstan/phpstan.phar.ascAjA@ ?vendor/phpstan/phpstan/LICENSE/j/#Ȥ-vendor/phpstan/phpstan/conf/bleedingEdge.neon8j87.vendor/phpunit/php-code-coverage/composer.jsonj:"*vendor/phpunit/php-code-coverage/README.mdj ,vendor/phpunit/php-code-coverage/SECURITY.mdujuKJ/vendor/phpunit/php-code-coverage/src/Filter.php j ,դ:vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.phpj76vendor/phpunit/php-code-coverage/src/Driver/Driver.php j Kvh8vendor/phpunit/php-code-coverage/src/Driver/Selector.phpj+<vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php=j= $Rvendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.phpVjV?yjKvendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php]j]vCDvendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.phpjFinKvendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.phpjuiCvendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.phpjq"Uvendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php1j1/OiNvendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php'j'[6;vendor/phpunit/php-code-coverage/src/TestStatus/Failure.php\j\ =>vendor/phpunit/php-code-coverage/src/TestStatus/TestStatus.phpj0;vendor/phpunit/php-code-coverage/src/TestStatus/Unknown.phpajauѤ9vendor/phpunit/php-code-coverage/src/TestStatus/Known.phpjE;vendor/phpunit/php-code-coverage/src/TestStatus/Success.php\j\i:vendor/phpunit/php-code-coverage/src/Node/AbstractNode.phpmjm}5vendor/phpunit/php-code-coverage/src/Node/Builder.phpWjW2vendor/phpunit/php-code-coverage/src/Node/File.phpaja/ 7vendor/phpunit/php-code-coverage/src/Node/CrapIndex.phpjE6vendor/phpunit/php-code-coverage/src/Node/Iterator.phpqjqbI7vendor/phpunit/php-code-coverage/src/Node/Directory.php &j &yNvendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.phpTjT<vendor/phpunit/php-code-coverage/src/Exception/Exception.phptjtvYvendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php&j&(E7Ivendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.phpjVvendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.phpj;s \vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.phpjcQvendor/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.phpjmwbwLvendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.phpPjP[8]vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.phpjO}APvendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.phpwjwRvendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php1j1tstBvendor/phpunit/php-code-coverage/src/Exception/ParserException.phpjs$Fvendor/phpunit/php-code-coverage/src/Exception/ReflectionException.phpj&Lpvendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.phpXjX;Yvendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.phpjrDVvendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.phpjeW٤Lvendor/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.phpjŒd?vendor/phpunit/php-code-coverage/src/Exception/XmlException.phpj"Wvendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.phpjKvendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.phpjTE98vendor/phpunit/php-code-coverage/src/Util/Filesystem.phpj*98vendor/phpunit/php-code-coverage/src/Util/Percentage.php^j^aeGvendor/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php'j'^Avendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.phpS$jS$<_0vendor/phpunit/php-code-coverage/src/Version.phpj6vendor/phpunit/php-code-coverage/src/Report/Crap4j.phpKjK9vendor/phpunit/php-code-coverage/src/Report/Cobertura.php*2j*26;vendor/phpunit/php-code-coverage/src/Report/Html/Colors.phpj'qBvendor/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.phpFjFL;vendor/phpunit/php-code-coverage/src/Report/Html/Facade.phpj-(Vvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg0j0QUU[vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svgjZQvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.distj{Vvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.distjD]vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.distjDVvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.distjՆ`vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist'j'O}Qvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.distP jP j*Svendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js@^j@^ Mvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.jsjb䆤Rvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.jsRjRj>ǹ;vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php j Dvendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.phpn jn x9vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.phpjMO=vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.phpj8vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.phpMjMhO:vendor/phpunit/php-code-coverage/src/TestSize/TestSize.php}j}77vendor/phpunit/php-code-coverage/src/TestSize/Large.phpjY8T9vendor/phpunit/php-code-coverage/src/TestSize/Unknown.php]j]9B8vendor/phpunit/php-code-coverage/src/TestSize/Medium.phpjx7vendor/phpunit/php-code-coverage/src/TestSize/Small.phpjn7vendor/phpunit/php-code-coverage/src/TestSize/Known.phpLjL`5vendor/phpunit/php-code-coverage/src/CodeCoverage.phpEjE~Y_(vendor/phpunit/php-code-coverage/LICENSEj>R2vendor/phpunit/php-code-coverage/ChangeLog-10.1.md9j90W< .vendor/phpunit/php-file-iterator/composer.jsonj*vendor/phpunit/php-file-iterator/README.mdj{C,vendor/phpunit/php-file-iterator/SECURITY.mdujuKJ8vendor/phpunit/php-file-iterator/src/ExcludeIterator.phpLjLwd/vendor/phpunit/php-file-iterator/src/Facade.phpjY0vendor/phpunit/php-file-iterator/src/Factory.php j nH1vendor/phpunit/php-file-iterator/src/Iterator.php j -vendor/phpunit/php-file-iterator/ChangeLog.mdFjFJz (vendor/phpunit/php-file-iterator/LICENSEj-~y֤(vendor/phpunit/php-invoker/composer.jsonrjr)$vendor/phpunit/php-invoker/README.mdjh&vendor/phpunit/php-invoker/SECURITY.mdPjPE >Ϥ*vendor/phpunit/php-invoker/src/Invoker.phpjh\Wvendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.phpjGH67vendor/phpunit/php-invoker/src/exceptions/Exception.phpiji֮>vendor/phpunit/php-invoker/src/exceptions/TimeoutException.phpjU&פ'vendor/phpunit/php-invoker/ChangeLog.mdjD"vendor/phpunit/php-invoker/LICENSEjp.vendor/phpunit/php-text-template/composer.json4j4z *vendor/phpunit/php-text-template/README.mdj(yK,vendor/phpunit/php-text-template/SECURITY.mdujuKJ1vendor/phpunit/php-text-template/src/Template.php j w=vendor/phpunit/php-text-template/src/exceptions/Exception.phppjpז&Dvendor/phpunit/php-text-template/src/exceptions/RuntimeException.phpjVͤLvendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.phpj-vendor/phpunit/php-text-template/ChangeLog.mdj(vendor/phpunit/php-text-template/LICENSEj-~y֤&vendor/phpunit/php-timer/composer.jsonj-"vendor/phpunit/php-timer/README.md j 'Ǥ$vendor/phpunit/php-timer/SECURITY.mdPjPE >Ϥ&vendor/phpunit/php-timer/src/Timer.phpjE%7vendor/phpunit/php-timer/src/ResourceUsageFormatter.phpEjE_5vendor/phpunit/php-timer/src/exceptions/Exception.phpejeѷtӤXvendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.phpjNBvendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.phpjƆ)vendor/phpunit/php-timer/src/Duration.php j G6Ϋ%vendor/phpunit/php-timer/ChangeLog.mdkjk vendor/phpunit/php-timer/LICENSEj"vendor/phpunit/phpunit/phpunit.xsdGjGaI$vendor/phpunit/phpunit/composer.jsonS jS ܤ vendor/phpunit/phpunit/README.mdXjX_d(vendor/phpunit/phpunit/ChangeLog-10.5.mdrjrh_Ҥ"vendor/phpunit/phpunit/SECURITY.mdjo@(vendor/phpunit/phpunit/src/Exception.phpKjK<[>vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php/j/stqKQvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.phpeje?"Evendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.phpj%U`vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php3j3[쎘Ovendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.phpYjYNPvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php_j_.W6Uvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.phpjsUvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.phpsjsQvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.phpjR#jvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.phpj2 Xvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.phpj oPvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php_j_ڤVvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.phpjq1Yvendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.phpj0Dvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.phpj*,Mvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.phpY1jY1HσVvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php@j@ѵ4[vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.phpgjg @Ovendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.phpjY!jvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php]j](zcvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php3j39Yvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.phpjHoYvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.phpjEbvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php-j-֨8Zvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.phpjCWrgvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.phpKjKw nvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.phpujuT[vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.phpj]bvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php-j-NA¤fvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.phpEjE䘤Zvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.phpj2*hvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.phpQjQ)Ԥevendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php?j?$%pGcvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php3j3mݤjvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php]j] 'Nvendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php6j6`:j;vendor/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.phpj#Ѥ=vendor/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php"j"%Ĥ@vendor/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.phpj=]vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.phpXjXvendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpld jd f{u =vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpljK?vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tplj jj I:vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php j CΤ9vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php;j;3<+vendor/phpunit/phpunit/src/Util/Xml/Xml.phpj])>.vendor/phpunit/phpunit/src/Util/Xml/Loader.php3 j3 \V5vendor/phpunit/phpunit/src/TextUI/Command/Command.php.j.btRvendor/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.phpjSvendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php. j. ˎSvendor/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.phpMjM-bLvendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.phpyjyJvendor/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.phpc jc rیLvendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.phpjU"Fvendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.phptjtjᧀMvendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php j j:zSvendor/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php j [\Lvendor/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.phpjyIvendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.phptjtXۤHvendor/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php j hw4vendor/phpunit/phpunit/src/TextUI/Command/Result.phpj=D>vendor/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php j [=vendor/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.phpjK^9vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php#j#Z`Nvendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php=j=WIvendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php3j3e@vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php5j54)Fvendor/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.phpOjO/d[Ivendor/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php]j]P{>vendor/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php,j,3Avendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.phpZjZC٤Rvendor/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.phpmjm"s?vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.phpjtƤEvendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php>j>kqDvendor/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.phpj ;vendor/phpunit/phpunit/src/TextUI/Configuration/Builder.phpjx@vendor/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.phpj:vendor/phpunit/phpunit/src/TextUI/Configuration/Merger.phpj#Tvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.phpFjF=|Nvendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.phpejeZE}Mvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.phpjW Bvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.phpj͉Vvendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php_j_ 8Ivendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.phpjBvendor/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.phpjtTvendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php^j^5OQvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.phpjrMvendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.phpjW&Lvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.phpujul漤@vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Source.phpj=^Svendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.phpj4OgQvendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php=j=YTvendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php^j^ʅP?vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Group.phpjW̋8Pvendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php2j23=vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php j 89UHvendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.phpVjV Dvendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php1j1e+1Uvendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.phpojo ƤGvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.phpj~Lvendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.phpCjCzۤ[vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.phpjħ^vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.phpj| >vendor/phpunit/phpunit/src/TextUI/Configuration/Value/File.php.j.1Ivendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.phpjLvendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.phpCjCĿUvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.phpijimLvendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.phpjYȸCvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.phpjX[Cvendor/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.phpjZVvendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.phptjtVB[Bvendor/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php>j>v!GYvendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.phpjʤZvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.phpejemTvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php_j_alGvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php1j15PWvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.phpj(U^_vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.phpjjjZ@Zvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.phpejec1Y[vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.phpfjf|"_vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.phpjjjUavendor/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.phpljl TWvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.phpbjbgZ3Qvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php\j\dafvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.phpqjq^kRvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php]j]N&Yvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.phpdjd,~HVvendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.phpajaNvendor/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.phpj?@vendor/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php j ,Avendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php&j&<vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.phpQ jQ ܋Avendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php^j^/PФGvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.phpC jC n=Hvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php#j#[}DLvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php'j'}"m=Lvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php'j'vEvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php j 8Svendor/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.phpjk.~Rvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.phpjq#3Uvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php0j0\BPvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php j \äOvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php*j*&*qOvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php>j>6=Pvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.phpjjzRvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php-j-ުQvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.phpjޤ>vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.phpjVKvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php[j[ԤRvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php@j@L:?vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.phpFjFG0=Lvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.phpmjm%~Gvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.phpJjJ<">vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.phprjr5>ۤEvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php j QDvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.phpj4&|Jvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.phpjfRvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.phpjO$Rvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.phpt jt ETvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.phpujuz*Vvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php^j^W@/lvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.phpj ]yvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.phpjt*hdvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.phpjR@avendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.phpjקk[cvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.phpj'ӪRlvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.phpjQdevendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.phpNjN:٤[vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.phpj7Tvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.phpjdivendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.phpja}Dgvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.phpjQ!bvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.phpvjv,BRvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.phpj/"_cvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.phppjp얤avendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.phpj#]Τgvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php|j|Jsvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.phpZjZ ֺ7lvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.phpjqNʤxvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.phpj?cvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.phpj'lvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.phpjNH;$\vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php`j`wqvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.phpojo-avendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.phpj5ǖe^vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.phpjt{vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.phpjtmvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.phpjrvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.phpqjq&9ۤ\vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.phprjr E[mvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.phpjmkvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.phpjФavendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.phpjD?yvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.phpj m+`vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.phpjQ1`vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.phpj8 bvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.phpWjWDZI[fvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.phpuju:4\vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.phpj Uvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.phpjNAvendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.phpj;3vendor/phpunit/phpunit/src/TextUI/Output/Facade.php$j$lۤBvendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php&j&\r;vendor/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.phptjtW%Bvendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php'Rj'R!rfvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.phpjAZvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.phpjo]+uvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.phpqjq2JĤnvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.phpGjG dvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.phpjjJmvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.phpAjASvvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.phpjxevendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php j OѤlvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php;j;`)rvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php_j_% `yvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.phpjxڤfvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.phpj{mvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php;j;ɓ,lqvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.phpYjY;evendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.phpjHUBpvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.phpSjS;̤tvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php_j_asnvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.phpAjAFhܤuvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.phpkjkwTvendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php/j/d$Lvendor/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php5j5<vendor/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php[j[u~Cvendor/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.phpC jC 3ʤ@vendor/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.phpjä1vendor/phpunit/phpunit/src/TextUI/Application.phpGfjGf^Ϥ0vendor/phpunit/phpunit/src/TextUI/TestRunner.php j _i*vendor/phpunit/phpunit/src/TextUI/Help.phpGjG[[uGvendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.phpjwRGvendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.phpj|j|@vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.phpjzTAvendor/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php,j,!"4vendor/phpunit/phpunit/src/Runner/Filter/Factory.phpBjBKL7?vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.phpj5(2vendor/phpunit/phpunit/src/Runner/ErrorHandler.phpjJ2vendor/phpunit/phpunit/src/Runner/PhptTestCase.php_j_p/Ӥ:vendor/phpunit/phpunit/src/Runner/TestResult/Collector.phpLjLx;vendor/phpunit/phpunit/src/Runner/TestResult/TestResult.php+Cj+Cc)Ҥ7vendor/phpunit/phpunit/src/Runner/TestResult/Facade.php j M(beRvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php j ՘Fvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.phpj݀Lavendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.phpcjc=Odvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.phpijiJdCZvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php9j9դPvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.phpjHYvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php3j3,|bvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.phpyjylޤQvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.phpjФ`vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.phpQjQEOXvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php-j-zBMUVvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.phpojoѩ-Vvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.phpjn^vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.phpQjQĤVvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.phpj~äevendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php{j{;Rvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.phpj!+avendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.phpojoA_tYvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php3j3w]vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.phpKjK$Z8Qvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.phpj( Wvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.phpj'_vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.phpWjW3\vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.phpEjEWZvendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php9j9avendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.phpcjcU6vendor/phpunit/phpunit/src/Runner/TestResult/Issue.php j o ̤<vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php' j' Ew Avendor/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.phpj>)Svendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.phpjdפGvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.phpjjQvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.phpjRvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.phpjĠWvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php j 7DݤSvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.phpj ,٤Zvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php.j.ĤRvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.phpjqPXvendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.phpjY.8[vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php4j4מ/Dvendor/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.phpjN=vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCache.phpkjk?ɤDvendor/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.phpjn9vendor/phpunit/phpunit/src/Runner/Exception/Exception.phpj Svendor/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.phpjuKvendor/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.phpjjj0+Hvendor/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.phpljl0zIvendor/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php3j3INvendor/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php`j`5&Ovendor/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.phpZjZD+Hvendor/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.phpSjS(Ovendor/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.phpPjP Evendor/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.phpPjPPw>vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php7j7de[Wvendor/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.phpj2]Nvendor/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php=j=uPvendor/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php j @JYvendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.phpj(äMvendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php'j'ut]vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php j Cߨ^vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.phpjJ7vendor/phpunit/phpunit/src/Runner/Baseline/Baseline.php6j6*Dvendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.phpj_vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.phpj]Xvendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.phpj 8ZWvendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.phpjk9\vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.phpjDa[vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.phpjB ͤZvendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.phpjٴ5vendor/phpunit/phpunit/src/Runner/Baseline/Reader.phpS jS \zUvendor/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.phpjqTvendor/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php}j}p +Evendor/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php# j# -5vendor/phpunit/phpunit/src/Runner/Baseline/Writer.phpj!4vendor/phpunit/phpunit/src/Runner/Baseline/Issue.php j 8vendor/phpunit/phpunit/src/Runner/Baseline/Generator.phpj@G5vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.phpx"jx"}-vendor/phpunit/phpunit/src/Runner/Version.phpKjKT z`5vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.phpjOJCvendor/phpunit/phpunit/src/Runner/Extension/ParameterCollection.phpj3 9vendor/phpunit/phpunit/src/Runner/Extension/Extension.phpPjPwL:vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.phpjE6vendor/phpunit/phpunit/src/Runner/Extension/Facade.php j ΕEvendor/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php j F#2vendor/phpunit/phpunit/src/Runner/CodeCoverage.php 7j 7H/vendor/phpunit/phpunit/src/Event/Subscriber.phpjf+vendor/phpunit/phpunit/src/Event/Tracer.phpjJ1+vendor/phpunit/phpunit/src/Event/Facade.php!j!Lx@vendor/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.phpjS~Fvendor/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.phpj@~yTDvendor/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.phpj7:vendor/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.phpljlCvendor/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php j jCvendor/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php\j\EgKvendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.phpj^Xvendor/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.phpj-ȳ@vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.phpqjqrh=vendor/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.phpj @vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.phpfjf.5n;vendor/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php& j& gDvendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.phpjR+;vendor/phpunit/phpunit/src/Event/Value/Telemetry/System.phpBjBoL>vendor/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php1j1AךNvendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.phpDjDFvendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.phpijie9vendor/phpunit/phpunit/src/Event/Value/Telemetry/Info.phpA jA ^ѤXvendor/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php%j%gJSvendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.phpUjU$獤=vendor/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php j kU<vendor/phpunit/phpunit/src/Event/Value/ComparisonFailure.phpj\8[vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.phptjtbLbEvendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.phpj jj N:Jvendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.phpj?>vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.phpji}Fvendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.phpjjjh6vendor/phpunit/phpunit/src/Event/Value/ClassMethod.phpj]mX>vendor/phpunit/phpunit/src/Event/Value/Test/TestCollection.phpjv4vendor/phpunit/phpunit/src/Event/Value/Test/Phpt.phpHjH;Ϥ:vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php7j7ĕؤFvendor/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.phpj!|¤Avendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.phph jh [6ͤ>vendor/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.phpMjMx34vendor/phpunit/phpunit/src/Event/Value/Test/Test.phpj1A,Mvendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.phpjݔ{Svendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.phpjbKvendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php j dAvendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.phpj!X0Ovendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.phpj|s7vendor/phpunit/phpunit/src/Event/Value/Test/TestDox.php$j$(ۤBvendor/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.phpj\:vendor/phpunit/phpunit/src/Event/Value/Runtime/Runtime.phpWjWif:vendor/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.phpsjscC6vendor/phpunit/phpunit/src/Event/Value/Runtime/PHP.php_ j_ `ά4vendor/phpunit/phpunit/src/Event/Value/Throwable.phpW jW K;vendor/phpunit/phpunit/src/Event/Value/ThrowableBuilder.phpj/ܤDvendor/phpunit/phpunit/src/Event/Exception/InvalidEventException.phpj){Svendor/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.phpj~7^Ivendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.phpj.8vendor/phpunit/phpunit/src/Event/Exception/Exception.phpJjJ:2*vQvendor/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php&j&O0zLvendor/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.phpj=Kvendor/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.phpj.mMvendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.phpj2[1Zvendor/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php/j/ɤIvendor/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.phpjyMKvendor/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.phpjR?vendor/phpunit/phpunit/src/Event/Exception/RuntimeException.phpj'oښHvendor/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.phpj~7vendor/phpunit/phpunit/src/Event/Exception/MapError.phpj7.Kvendor/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.phpjDvendor/phpunit/phpunit/src/Event/Exception/UnknownEventException.phpjѤ>Wvendor/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.phpjKGvendor/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.phpjS,vendor/phpunit/phpunit/src/Event/TypeMap.phpKjKO8z1vendor/phpunit/phpunit/src/Event/Events/Event.phpj տJvendor/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.phpjʫ?vendor/phpunit/phpunit/src/Event/Events/Application/Started.phpj! Ivendor/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.phpj$@vendor/phpunit/phpunit/src/Event/Events/Application/Finished.phpj1oQvendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.phpj.Gvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.phpjؤOvendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.phpjyVUvendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php1j1"ϤQvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php)j)-2gIvendor/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.phpj"Rvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php+j+㜤Gvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.phpjHKvendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.phpjNvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.phpj aRvendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php+j+W/xKvendor/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.phpj8Hvendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.phpjMVvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php3j3Xvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php7j72Zvendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php;j;kR>vendor/phpunit/phpunit/src/Event/Events/TestRunner/Started.phpyjy8yAvendor/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php}j}N뜤[vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php=j=> Rvendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php+j+LHvendor/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.phpj=Hvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.phpj+Pvendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.phpjkǧɤQvendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php)j)<Hvendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.phpj GPYvendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php9j9k?vendor/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php{j{%tjQvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php)j)n+rGvendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.phpjNN Lvendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.phpjXFvendor/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.phpj՜Hvendor/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.phpj7>vendor/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.phpj =vendor/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.phpojo۰<vendor/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.phpjHvendor/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.phpjFvendor/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.phpj:r=vendor/phpunit/phpunit/src/Event/Events/TestSuite/Started.phpjna$Gvendor/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.phpjnTVĤ<vendor/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php8j8S Gvendor/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.phpjTܤ>vendor/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php j :;vendor/phpunit/phpunit/src/Event/Events/EventCollection.php!j!|~Tvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php)j)4Vvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php-j-O#ԤXvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php1j1PIvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php j KAܤFvendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php j 0Nvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.phpj.Uvendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php+j+vxOvendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.phpjр_Kvendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php j oNvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php j $Fvendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php=j=^)ԤLvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.phpjURvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.phpjXvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php1j1K+դEvendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php j ZPvendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php!j!)Svendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php'j'!\vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php9j9磤Jvendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php j w%T!Qvendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php#j#hD_Gvendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php j 4Pvendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php!j!#aHvendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php_j_0bl^vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php3j3ŞOvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.phpj{=Yvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php)j)c_KARvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.phpj-ͤ`vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php7j7xUvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.phpjaXvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php'j'M|Ovendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php0j0cLؤRvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php0j0;5uZvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php+j+Vvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php9j9ccz\vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php/j/a\ҤNvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.phpjA_cvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php=j=U~ݤTvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.phpj ﰤYvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.phpjEm\vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php/j/`i Wvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.phpjiP]vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php1j1y_,avendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php9j9@;Svendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.phpj-\avendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php9j9 0Xvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php=j=XQvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.phpjvbvendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php;j;bɤ[vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php-j-Vgvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.phpEjEݤWvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php%j%RN[^vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php3j3Uvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php j >VfTvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.phphjhbMvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php0j0|Lvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php6j6YodUvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php8j8ZA"fvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php{j{ 5]vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php@j@{Opvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.phpWjW!h_vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php5j5_vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php5j5AZKvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php j lYhvendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.phpj qRvendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php1j1:jEvendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php5j5[,Jvendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php1j1=Wvendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php9j9PMvendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php7j7>ĤTvendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php3j3m+ݤOvendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php+j+9\@vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php<j<-NkUIvendor/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.phpjy@vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.phpjJvendor/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.phpjIvendor/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.phpjMDʤIvendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.phpOjO/Svendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php#j# ;?vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.phpjFJvendor/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.phpjVT?vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.phpjeCvendor/phpunit/phpunit/src/Event/Events/EventCollectionIterator.phpjGH ?vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php;j;H6^4vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php-j-Om>vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php j J>vendor/phpunit/phpunit/src/Framework/Attributes/AfterClass.phpj7Qvendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php j v\{=vendor/phpunit/phpunit/src/Framework/Attributes/UsesClass.phpj$_@vendor/phpunit/phpunit/src/Framework/Attributes/UsesFunction.phpjeiߤIvendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.phpjP^IGvendor/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.phpjUSd9vendor/phpunit/phpunit/src/Framework/Attributes/Large.phpjfRGvendor/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php j >;vendor/phpunit/phpunit/src/Framework/Attributes/Depends.phpjuBvendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.phpj{6Bvendor/phpunit/phpunit/src/Framework/Attributes/CoversFunction.phpjiIaHvendor/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.phpjY<ۤDvendor/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.phpjX:J9vendor/phpunit/phpunit/src/Framework/Attributes/Group.phpj`<@vendor/phpunit/phpunit/src/Framework/Attributes/TestWithJson.phpj,LSvendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.phpjLYjFvendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php"j"ĺ;Qvendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.phpjF:vendor/phpunit/phpunit/src/Framework/Attributes/Before.phpj0?vendor/phpunit/phpunit/src/Framework/Attributes/CoversClass.phpjv蚤Bvendor/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.phpjD}Ovendor/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.phpjl kAvendor/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.phpjM٤Avendor/phpunit/phpunit/src/Framework/Attributes/CoversNothing.phpjQvendor/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.phpj߫ɤTvendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php j  I?vendor/phpunit/phpunit/src/Framework/Attributes/BeforeClass.phpjys`<vendor/phpunit/phpunit/src/Framework/Attributes/TestWith.phpj*@vendor/phpunit/phpunit/src/Framework/Attributes/PreCondition.phpjƉNvendor/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.phpjפLvendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.phpj]@vendor/phpunit/phpunit/src/Framework/Attributes/DataProvider.phpjCvendor/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.phpj6Fvendor/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.phpmjm Pvendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.phpj@ZGJvendor/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.phpjA9vendor/phpunit/phpunit/src/Framework/Attributes/After.phpj{yLvendor/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php(j(ljKvendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.phpjRk:vendor/phpunit/phpunit/src/Framework/Attributes/Ticket.phpj#8vendor/phpunit/phpunit/src/Framework/Attributes/Test.phpjvZ,:vendor/phpunit/phpunit/src/Framework/Attributes/Medium.phpj]  9vendor/phpunit/phpunit/src/Framework/Attributes/Small.phpj˵?vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.phpj;vendor/phpunit/phpunit/src/Framework/Attributes/TestDox.phpjh핤Cvendor/phpunit/phpunit/src/Framework/Attributes/DependsExternal.phpjeHvendor/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php j "*H Avendor/phpunit/phpunit/src/Framework/Attributes/PostCondition.phpj+Mvendor/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.phpjBHvendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.phpj%n`Ovendor/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.phpRjRT¤Svendor/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php6j6uqSvendor/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.phpj]_Cvendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.phpji!O/vendor/phpunit/phpunit/src/Framework/Assert.php j  9;vendor/phpunit/phpunit/src/Framework/TestStatus/Failure.php@j@ip'?vendor/phpunit/phpunit/src/Framework/TestStatus/Deprecation.phpPjPX >vendor/phpunit/phpunit/src/Framework/TestStatus/TestStatus.phpj\aӤ>vendor/phpunit/phpunit/src/Framework/TestStatus/Incomplete.phpLjLv(;vendor/phpunit/phpunit/src/Framework/TestStatus/Skipped.php@j@2dI;vendor/phpunit/phpunit/src/Framework/TestStatus/Unknown.phpFjFH9vendor/phpunit/phpunit/src/Framework/TestStatus/Error.php8j8:vendor/phpunit/phpunit/src/Framework/TestStatus/Notice.php<j<T9vendor/phpunit/phpunit/src/Framework/TestStatus/Risky.php8j86=9vendor/phpunit/phpunit/src/Framework/TestStatus/Known.phpj q\;vendor/phpunit/phpunit/src/Framework/TestStatus/Success.php@j@O[/;vendor/phpunit/phpunit/src/Framework/TestStatus/Warning.php@j@b]R?vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php1j1-aGvendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php*j*ݝ[vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.phpjq7Tvendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.phpOjOcbvendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.phpjO+w|[vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.phpjŐ^vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.phpjfhvendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.phpjZߤNvendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.phpCjC[Apcvendor/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.phpjL_vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.phpMjM%_vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.phpj:m^vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.phpja}[vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.phpUjUqR_vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.phpjPvFvendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.phpZjZ(-Pvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.phpjzhCPvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php6j69{Jvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.phpjl(Pvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.phpjAA!.Rvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.phpsjs#ФXvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php j 5wMvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.phpj΁3Cvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php]j]]mHvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php3j3 X#¤Lvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.phpjkױpSvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.phpojoVISvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php*j*WFUvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.phpj­Tvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.phpn#jn#K|Jvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.phpjy&Kvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php2j2fޤEvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.phpjOvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.phpjgOvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php}j}_Qvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.phpj!SPvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.phpDjD3WԤOvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.phpjKvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php!j!ڤGvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php_j_ȤFvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.phpjcRvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.phpj*ɽMvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.phpj$%Rvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.phpj16Mvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php j E+ˤKvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php~j~ܮZuOvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.phpj#{Nvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.phpj}ѤPvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.phpCjCPauSvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.phpjPvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php`j`VKvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.phpojoUhܤTvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.phpjҳȤSvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.phpDjD|ӤFvendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.phpjѤHvendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php /j /KZFvendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.phprjrkLvendor/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.phpjˑçQvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.phpmjmޏ\vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.phpJjJ&^G]vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.phpcjc$֤dvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.phpjW*t`vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.phpijiE9Ӥ`vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.phpyjyT]vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.phpHjHO#[vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php[j[Hecvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.phpgjg,Xvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.phpXjXҝ$avendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.phpj0Nvvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php j }?8 ]vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.phpj?jvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.phpjbPڤbvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.phpYjY7ˤKvendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.phpjwaGvendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php*j*?Svendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/deprecation.tpl;j;O5sTvendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/intersection.tplLjL-XYvendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/test_double_class.tplfjf' Svendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/trait_class.tplQjQ<ȤRvendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_class.tpljVvendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/proxied_method.tplj Svendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_method.tpl<j<iVvendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_method.tplVjV%]vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_static_method.tplj 4RGvendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php4j4{Gvendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.phpjGAvendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.phpj9(4vendor/phpunit/phpunit/src/Framework/TestBuilder.php+)j+)[Z:vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.phpcjc)<vendor/phpunit/phpunit/src/Framework/Exception/Exception.php, j, !Qvendor/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.phpljlAxGvendor/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php j Lvendor/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php$j$ELvendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php$j$h Mvendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.phpj0|ǤPvendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.phpBjBXFvendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php(j(Vvendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.phpHjHXTOvendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php'j'#=DKvendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.phpjIzvendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.phpj"|tvendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.phpjsvendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.phpj&Siavendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.phpj 91uvendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.phpj9?/evendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php]j]T#ѤHvendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.phpj8ɤGvendor/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php.j.tĤLvendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php+j+GQvendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.phpCjCoҾMvendor/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.phpGjG%q3ޤSvendor/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php(j(OKvendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php&j&EOvendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php3j3D,[Gvendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.phpjOl3vendor/phpunit/phpunit/src/Framework/TestRunner.php?j?,5-vendor/phpunit/phpunit/src/Framework/Test.phpjpGvendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php;j;2Kvendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php j 竤Evendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.phpj>[Jvendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php j v1RGvendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.phpj%owFvendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.phpjޤGvendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.phpju?vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.phpjhǤ?vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.phpc jc ;HAvendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php\j\~u>vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.phpPjP<2Cvendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.phpdjds'Ivendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.phpj֗Ivendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.phpjXoIvendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.phpj|Nvendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.phpj>vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php j nGvendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.phpdjd@Zvendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.phpjjjZJ>fvendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php&j&.Kvendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.phpPjP*BSvendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.phpj!WXvendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php j "P\vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.phpjԨhWvendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.phpjgݤFvendor/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php9j9 omKvendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.phpcjc Mvendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php} j} LJDvendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php j T<Rvendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.phpW jW 7Pvendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.phpl jl %DѤ>vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.phpjjjGvendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.phpjmLvendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.phpjaϤYvendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php j 7QyФAvendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php$ j$ U`vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.phpj*Lvendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.phpejepԤIvendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.phpj8"0#Kvendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.phpj6Ivendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php.j.!m<vendor/phpunit/phpunit/src/Framework/Constraint/Callback.phpjƤEvendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php j hKvendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php7j72 Gvendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.phpj\ŏzHvendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.phpjaQZHvendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php1j1=|➤Bvendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php=j=N;Cvendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php@j@O9ԤEvendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.phpjU?vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.phpj᥸?vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php=j= 2vendor/phpunit/phpunit/src/Framework/TestSuite.phpVKjVK7vendor/phpunit/phpunit/src/Framework/SelfDescribing.phpwjw|S1vendor/phpunit/phpunit/src/Framework/TestCase.php!j!xX4vendor/phpunit/phpunit/src/Framework/Reorderable.phpjm0,:vendor/phpunit/phpunit/src/Framework/TestSize/TestSize.php!j!FAڤ7vendor/phpunit/phpunit/src/Framework/TestSize/Large.php_j_h,69vendor/phpunit/phpunit/src/Framework/TestSize/Unknown.phpj8vendor/phpunit/phpunit/src/Framework/TestSize/Medium.phpbjbS7vendor/phpunit/phpunit/src/Framework/TestSize/Small.phpRjR#?7vendor/phpunit/phpunit/src/Framework/TestSize/Known.phpjYL9vendor/phpunit/phpunit/src/Framework/Assert/Functions.phpNjNGn7vendor/phpunit/phpunit/src/Metadata/DependsOnMethod.phpj2vendor/phpunit/phpunit/src/Metadata/AfterClass.phpVjVF1vendor/phpunit/phpunit/src/Metadata/UsesClass.php'j'?I4vendor/phpunit/phpunit/src/Metadata/UsesFunction.php2j2D;vendor/phpunit/phpunit/src/Metadata/PreserveGlobalState.phpjV#;vendor/phpunit/phpunit/src/Metadata/WithoutErrorHandler.phpqjqPt2ޤ6vendor/phpunit/phpunit/src/Metadata/DependsOnClass.phpj6vendor/phpunit/phpunit/src/Metadata/CoversFunction.php8j8{Rc0:vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php8j8Xn8vendor/phpunit/phpunit/src/Metadata/RequiresFunction.php`j`ç(-vendor/phpunit/phpunit/src/Metadata/Group.php*j*AYEvendor/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.phpOjO ];vendor/phpunit/phpunit/src/Metadata/Version/Requirement.phpDjD_vEvendor/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php+j+U.vendor/phpunit/phpunit/src/Metadata/Covers.phpj-gͤ:vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.phpnjn Evendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.phpj-\U,vendor/phpunit/phpunit/src/Metadata/Uses.phpj>A.vendor/phpunit/phpunit/src/Metadata/Before.phpJjJF3vendor/phpunit/phpunit/src/Metadata/CoversClass.php-j-' 6vendor/phpunit/phpunit/src/Metadata/RequiresMethod.phpjPc¤;vendor/phpunit/phpunit/src/Metadata/Exception/Exception.phpMjM Kvendor/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php j 2դTvendor/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.phpj.gvendor/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.phpjߦSEvendor/phpunit/phpunit/src/Metadata/Exception/ReflectionException.phpgjgjg`Ovendor/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.phpj@ˤCvendor/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.phpjM5vendor/phpunit/phpunit/src/Metadata/BackupGlobals.phpja o5vendor/phpunit/phpunit/src/Metadata/CoversNothing.php_j_|Evendor/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.phpj&C`3vendor/phpunit/phpunit/src/Metadata/BeforeClass.phpYjY^0vendor/phpunit/phpunit/src/Metadata/TestWith.phpyjy44vendor/phpunit/phpunit/src/Metadata/PreCondition.php\j\[6Bvendor/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.phpjH4vendor/phpunit/phpunit/src/Metadata/DataProvider.phpjc7vendor/phpunit/phpunit/src/Metadata/RequiresSetting.phprjrRS>vendor/phpunit/phpunit/src/Metadata/BackupStaticProperties.phpjݵeˤ-vendor/phpunit/phpunit/src/Metadata/After.phpGjG6c0vendor/phpunit/phpunit/src/Metadata/Metadata.phpRjRz@vendor/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.phpjA:vendor/phpunit/phpunit/src/Metadata/CoversDefaultClass.phpEjE e?vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.phpj*3,vendor/phpunit/phpunit/src/Metadata/Test.phpDjDb@7vendor/phpunit/phpunit/src/Metadata/Api/HookMethods.phpj8vendor/phpunit/phpunit/src/Metadata/Api/Requirements.php7j792vendor/phpunit/phpunit/src/Metadata/Api/Groups.php3j34VY8vendor/phpunit/phpunit/src/Metadata/Api/Dependencies.phpjxX8vendor/phpunit/phpunit/src/Metadata/Api/DataProvider.phpE+jE+8vendor/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php*j*ˤBvendor/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.phpj43vendor/phpunit/phpunit/src/Metadata/RequiresPhp.phpjnl 8vendor/phpunit/phpunit/src/Metadata/UsesDefaultClass.php?j?il/vendor/phpunit/phpunit/src/Metadata/TestDox.php j ;ڤ<vendor/phpunit/phpunit/src/Metadata/RunInSeparateProcess.phptjt5vendor/phpunit/phpunit/src/Metadata/PostCondition.php_j_Avendor/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.phpj٤<vendor/phpunit/phpunit/src/Metadata/RequiresPhpExtension.phpj {Cvendor/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.phpjǰ}Bvendor/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php7&j7&54Bvendor/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php j ZC>vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.phpajaY5vendor/phpunit/phpunit/src/Metadata/Parser/Parser.phpJjJ5t#<vendor/phpunit/phpunit/src/Metadata/Parser/CachingParser.php j IC :vendor/phpunit/phpunit/src/Metadata/Parser/ParserChain.phpjE7vendor/phpunit/phpunit/src/Metadata/Parser/Registry.phpjm".}?vendor/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.phpzKjzKRߤGvendor/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.phpj7Gvendor/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.phpj/a7vendor/phpunit/phpunit/src/Metadata/RequiresPhpunit.phpjOۤvendor/phpunit/phpunit/LICENSEje3&vendor/phpunit/phpunit/DEPRECATIONS.md5j5$vendor/phpunit/phpunit/composer.lockjIw&vendor/phpunit/phpunit/schema/10.1.xsdBjBܭr&vendor/phpunit/phpunit/schema/10.3.xsdFjF3&%vendor/phpunit/phpunit/schema/8.5.xsdBjB2A[&vendor/phpunit/phpunit/schema/10.2.xsdQEjQEn%vendor/phpunit/phpunit/schema/9.0.xsd4Bj4B7w%vendor/phpunit/phpunit/schema/9.4.xsd Fj FDOFI%vendor/phpunit/phpunit/schema/9.3.xsdEjEq&vendor/phpunit/phpunit/schema/10.0.xsd=j=|H&vendor/phpunit/phpunit/schema/10.4.xsdGFjGF?%vendor/phpunit/phpunit/schema/9.5.xsdDFjDFs|%vendor/phpunit/phpunit/schema/9.2.xsdBjBc-%vendor/phpunit/phpunit/schema/9.1.xsdBjBq'8vendor/phpunit/phpunit/phpunit j $9"vendor/psr/container/composer.jsonjmvendor/psr/container/README.mdBjBg?7vendor/psr/container/src/NotFoundExceptionInterface.phpj>悤8vendor/psr/container/src/ContainerExceptionInterface.phpj^33/vendor/psr/container/src/ContainerInterface.phpjvendor/psr/container/LICENSEyjyOp#vendor/psr/http-client/CHANGELOG.mdjz򪌤$vendor/psr/http-client/composer.jsonj vendor/psr/http-client/README.md%j%F8vendor/psr/http-client/src/NetworkExceptionInterface.phpj"77vendor/psr/http-client/src/ClientExceptionInterface.phpj:8vendor/psr/http-client/src/RequestExceptionInterface.phpJjJEu.vendor/psr/http-client/src/ClientInterface.phpjҞv vendor/psr/http-client/LICENSE=j=S%vendor/psr/http-factory/composer.jsonjO!vendor/psr/http-factory/README.md,j,zwf=vendor/psr/http-factory/src/ServerRequestFactoryInterface.phpjBHA7vendor/psr/http-factory/src/RequestFactoryInterface.phpjrTX6vendor/psr/http-factory/src/StreamFactoryInterface.phpjyۜ8vendor/psr/http-factory/src/ResponseFactoryInterface.php"j"X3vendor/psr/http-factory/src/UriFactoryInterface.phpEjEDh<vendor/psr/http-factory/src/UploadedFileFactoryInterface.phphjhBj㬤vendor/psr/http-factory/LICENSE(j(}]$vendor/psr/http-message/CHANGELOG.md3j3:\Y%vendor/psr/http-message/composer.jsonsjsLo$!vendor/psr/http-message/README.mdj/vendor/psr/http-message/src/StreamInterface.phpjжJ0vendor/psr/http-message/src/MessageInterface.phpj?6vendor/psr/http-message/src/ServerRequestInterface.php:(j:(iP:^,vendor/psr/http-message/src/UriInterface.php2j2o1vendor/psr/http-message/src/ResponseInterface.phpJ jJ bY60vendor/psr/http-message/src/RequestInterface.php7j7_85vendor/psr/http-message/src/UploadedFileInterface.phpjZݤvendor/psr/http-message/LICENSE=j=*vendor/psr/http-message/docs/PSR7-Usage.mdtjtz X/vendor/psr/http-message/docs/PSR7-Interfaces.mdL%jL%6vendor/psr/log/composer.json-j-^vendor/psr/log/README.mdBjB'!vendor/psr/log/src/NullLogger.phpj*%vendor/psr/log/src/AbstractLogger.phpjۛvendor/psr/log/src/LogLevel.phpPjP'vendor/psr/log/src/LoggerAwareTrait.phpj"+ &vendor/psr/log/src/LoggerInterface.php j 4+vendor/psr/log/src/LoggerAwareInterface.php)j)j /vendor/psr/log/src/InvalidArgumentException.php`j` X1"vendor/psr/log/src/LoggerTrait.phpAjAlvvendor/psr/log/LICENSE=j=pO,vendor/ralouphie/getallheaders/composer.jsonjG(vendor/ralouphie/getallheaders/README.md@j@\4vendor/ralouphie/getallheaders/src/getallheaders.phphjhz&vendor/ralouphie/getallheaders/LICENSE8j8Ka,vendor/rector/rector/bin/resolve-version.phpjk.vendor/rector/rector/bin/rector_j_7#vendor/rector/rector/bin/rector.phpj"vendor/rector/rector/bootstrap.php j I僤"vendor/rector/rector/composer.jsonjӒsvendor/rector/rector/README.mdujuΙ@/vendor/rector/rector/config/phpstan/parser.neonj|Ĥ5vendor/rector/rector/config/phpstan/better-infer.neon>j>:vendor/rector/rector/config/phpstan/static-reflection.neonj.94vendor/rector/rector/config/set/type-declaration.phpjN)vendor/rector/rector/config/set/php82.phpnjn-6vendor/rector/rector/config/set/gmagick-to-imagick.php (j ( #ͤ)vendor/rector/rector/config/set/php71.phpj_-d)vendor/rector/rector/config/set/php80.php j xq0vendor/rector/rector/config/set/code-quality.php9j9h)vendor/rector/rector/config/set/php83.php{j{ E*vendor/rector/rector/config/set/naming.phpjvФ-vendor/rector/rector/config/set/dead-code.phpj9O)vendor/rector/rector/config/set/php84.php#j#8Ѯ)vendor/rector/rector/config/set/php74.php3j3iVx1vendor/rector/rector/config/set/privatization.php%j%k.a1vendor/rector/rector/config/set/php-polyfills.phpjs0vendor/rector/rector/config/set/coding-style.php j H$1vendor/rector/rector/config/set/rector-preset.phpj()vendor/rector/rector/config/set/php54.phpjF`)vendor/rector/rector/config/set/php70.php j nh)vendor/rector/rector/config/set/php52.phpjyi)vendor/rector/rector/config/set/php53.phpjӍrҤ)vendor/rector/rector/config/set/php56.phpj,3vendor/rector/rector/config/set/strict-booleans.phpjG)vendor/rector/rector/config/set/php72.phpjŤ0vendor/rector/rector/config/set/early-return.phpajaf |)vendor/rector/rector/config/set/php73.phpjrP)vendor/rector/rector/config/set/php55.php<j<-lp)vendor/rector/rector/config/set/php81.phpBjBe6vendor/rector/rector/config/set/datetime-to-carbon.phpRjRȇ.vendor/rector/rector/config/set/instanceof.phpjG5vendor/rector/rector/config/set/level/up-to-php74.php5j5y5vendor/rector/rector/config/set/level/up-to-php73.php5j5:Z5vendor/rector/rector/config/set/level/up-to-php80.php5j5Q5vendor/rector/rector/config/set/level/up-to-php83.php5j5JQ,5vendor/rector/rector/config/set/level/up-to-php55.php5j5z5vendor/rector/rector/config/set/level/up-to-php82.php5j5<`75vendor/rector/rector/config/set/level/up-to-php70.php5j5դ5vendor/rector/rector/config/set/level/up-to-php56.php5j50H5vendor/rector/rector/config/set/level/up-to-php54.php5j54y5vendor/rector/rector/config/set/level/up-to-php71.php5j5,5vendor/rector/rector/config/set/level/up-to-php81.php5j5\*5vendor/rector/rector/config/set/level/up-to-php53.phpj 5vendor/rector/rector/config/set/level/up-to-php84.php5j5r5vendor/rector/rector/config/set/level/up-to-php72.php5j5LM&vendor/rector/rector/config/config.php4j4/gEJvendor/rector/rector/rules/Renaming/Contract/MethodCallRenameInterface.php@j@7=Jvendor/rector/rector/rules/Renaming/Contract/RenameAnnotationInterface.phpj_08Ovendor/rector/rector/rules/Renaming/Contract/RenameClassConstFetchInterface.php#j#"0VDvendor/rector/rector/rules/Renaming/ValueObject/MethodCallRename.phpjbLvendor/rector/rector/rules/Renaming/ValueObject/RenameClassAndConstFetch.phpjGDvendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotation.phpj}Bvendor/rector/rector/rules/Renaming/ValueObject/RenameProperty.phpjjPvendor/rector/rector/rules/Renaming/ValueObject/MethodCallRenameWithArrayKey.phpj{!Ivendor/rector/rector/rules/Renaming/ValueObject/RenameClassConstFetch.phpj6dFvendor/rector/rector/rules/Renaming/ValueObject/RenameStaticMethod.phpjJJvendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotationByType.php+j+Cvendor/rector/rector/rules/Renaming/ValueObject/RenameAttribute.phpj \vendor/rector/rector/rules/Renaming/ValueObject/RenameFunctionLikeParamWithinCallLikeArg.phpj)arTEvendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php8 j8 vqNvendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.phpj5 DLvendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.phpjC׶Rvendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php j 4괤Ivendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.phpj qQvendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.phpxjxKQvendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.phpvjvy3`Zvendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php j gmjvendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php=j=Lvendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php!j!gOKvendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php2 j2 (NFvendor/rector/rector/rules/Renaming/Collector/RenamedNameCollector.phpjIvendor/rector/rector/rules/Renaming/NodeManipulator/SwitchManipulator.phpj[Dvendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php#j#An܁jvendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.phpjukvendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.phpiji .jvendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.phpjCHvendor/rector/rector/rules/Php80/NodeFactory/NestedAttrGroupsFactory.php,j,."=vendor/rector/rector/rules/Php80/NodeFactory/MatchFactory.php j Avendor/rector/rector/rules/Php80/NodeFactory/MatchArmsFactory.phpjBBvendor/rector/rector/rules/Php80/NodeFactory/AttrGroupsFactory.phpaja[ӻMvendor/rector/rector/rules/Php80/NodeFactory/StrStartsWithFuncCallFactory.phpjzMvendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.phpjv'aSvendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.phpj2QLJvendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php!j!}*qFvendor/rector/rector/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.phpjAEvendor/rector/rector/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.phpj4 @vendor/rector/rector/rules/Php80/NodeAnalyzer/SwitchAnalyzer.phpjf<Evendor/rector/rector/rules/Php80/Guard/MakePropertyPromotionGuard.phpj jA[vendor/rector/rector/rules/Php80/AttributeDecorator/DoctrineConverterAttributeDecorator.phpj^vendor/rector/rector/rules/Php80/AttributeDecorator/SensioParamConverterAttributeDecorator.phpjXvendor/rector/rector/rules/Php80/Contract/ValueObject/AnnotationToAttributeInterface.phpj<Rvendor/rector/rector/rules/Php80/Contract/ConverterAttributeDecoratorInterface.phpj̤Svendor/rector/rector/rules/Php80/Contract/StrStartWithMatchAndRefactorInterface.php1j1e٤<vendor/rector/rector/rules/Php80/ValueObject/CondAndExpr.phpHjHtTvendor/rector/rector/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.phpTjT@sZvendor/rector/rector/rules/Php80/ValueObject/NestedDoctrineTagAndAnnotationToAttribute.phpjBKvendor/rector/rector/rules/Php80/ValueObject/PropertyPromotionCandidate.phpjz@ʤLvendor/rector/rector/rules/Php80/ValueObject/NestedAnnotationToAttribute.php j  GyFvendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.phpj6bSvendor/rector/rector/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.phpjV_K>vendor/rector/rector/rules/Php80/ValueObject/StrStartsWith.phpj7*<vendor/rector/rector/rules/Php80/ValueObject/MatchResult.phpj|3vendor/rector/rector/rules/Php80/Enum/MatchKind.phpsjsŘMvendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php]j]P,Vvendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php j .UlHvendor/rector/rector/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php2j2򓎤Jvendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.phpj=V^vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php#j# YHNvendor/rector/rector/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.phpUjU$ߤ]vendor/rector/rector/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.phpja[vendor/rector/rector/rules/Php80/Rector/ClassConstFetch/ClassOnThisVariableObjectRector.php j 80Hvendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.phpj4tFvendor/rector/rector/rules/Php80/Rector/Ternary/GetDebugTypeRector.phpkjk@sMGvendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php j zIvendor/rector/rector/rules/Php80/Rector/Identical/StrStartsWithRector.php j Mbvendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php2-j2-7AMNvendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.phpj@ȤNvendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.phpZ'jZ''ũTvendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php6j6Lvendor/rector/rector/rules/Php80/ValueObjectFactory/StrStartsWithFactory.phpjpdF[vendor/rector/rector/rules/Php80/NodeManipulator/AttributeGroupNamedArgumentManipulator.phpSjSǎC@vendor/rector/rector/rules/Php80/NodeResolver/ArgumentSorter.php%j% Nvendor/rector/rector/rules/Php80/NodeResolver/RequireOptionalParamResolver.phptjt_jEvendor/rector/rector/rules/Php80/NodeResolver/SwitchExprsResolver.phpjORvendor/rector/rector/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.phpjSJvendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php3 j3 VlKvendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php0j01u Nvendor/rector/rector/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.phpjuHJJvendor/rector/rector/rules/Php73/Rector/FuncCall/SensitiveDefineRector.phpjLvendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php]j]f4Dvendor/rector/rector/rules/Php73/Rector/FuncCall/SetCookieRector.php j ʤMvendor/rector/rector/rules/Php73/Rector/String_/SensitiveHereNowDocRector.php` j` 1EGvendor/rector/rector/rules/Php73/Rector/BooleanOr/IsCountableRector.phpm jm `'\vendor/rector/rector/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php?j?B2}=Nvendor/rector/rector/rules/Arguments/NodeAnalyzer/ChangedArgumentsDetector.phpj݀Ivendor/rector/rector/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php-j-?hAEvendor/rector/rector/rules/Arguments/ArgumentDefaultValueReplacer.php'j'eVvendor/rector/rector/rules/Arguments/Contract/ReplaceArgumentDefaultValueInterface.php8j8Uvendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdderWithoutDefaultValue.phpj>[SlBvendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdder.phpjJvendor/rector/rector/rules/Arguments/ValueObject/RemoveMethodCallParam.phpj5Xvendor/rector/rector/rules/Arguments/ValueObject/ReplaceFuncCallArgumentDefaultValue.phpj {Pvendor/rector/rector/rules/Arguments/ValueObject/ReplaceArgumentDefaultValue.phpj- cvendor/rector/rector/rules/Arguments/Rector/FuncCall/FunctionArgumentDefaultValueReplacerRector.php j G>]vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector.phpj<'Ovendor/rector/rector/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.phpH2jH24Vvendor/rector/rector/rules/Arguments/Rector/MethodCall/RemoveMethodCallParamRector.php j ĤEvendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.phpS'jS'xdNvendor/rector/rector/rules/Strict/NodeAnalyzer/UnitializedPropertyAnalyzer.php j AʤZvendor/rector/rector/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.phpQ jQ IOvendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.phpj,1Tvendor/rector/rector/rules/Strict/Rector/If_/BooleanInIfConditionRuleFixerRector.php, j, 1dZvendor/rector/rector/rules/Strict/Rector/Ternary/DisallowedShortTernaryRuleFixerRector.phpj\vendor/rector/rector/rules/Strict/Rector/Ternary/BooleanInTernaryOperatorRuleFixerRector.phpl jl Rvendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.phpj]Mvendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.phpjH`nMvendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.phpj )Ovendor/rector/rector/rules/DeadCode/PhpDoc/Guard/StandaloneTypeRemovalGuard.phpj Jvendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php j ڕIvendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php j ;!Gvendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.phpj{Jvendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.phpZjZZ=PLvendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php!j!QJvendor/rector/rector/rules/DeadCode/UselessIfCondBeforeForeachDetector.phpEjEi=Nvendor/rector/rector/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.phpjݠUvendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php- j- )ʤMvendor/rector/rector/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.phpjVKvendor/rector/rector/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.phpj@Kvendor/rector/rector/rules/DeadCode/NodeAnalyzer/CallCollectionAnalyzer.phpj<;Nvendor/rector/rector/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php&j&XCvendor/rector/rector/rules/DeadCode/Contract/ConditionInterface.phpgjg)Kvendor/rector/rector/rules/DeadCode/ValueObject/VersionCompareCondition.phpjϤSvendor/rector/rector/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.phpjO5lMvendor/rector/rector/rules/DeadCode/NodeCollector/UnusedParameterResolver.php=j=ܤ[vendor/rector/rector/rules/DeadCode/Rector/Return_/RemoveDeadConditionAboveReturnRector.php j ңfvendor/rector/rector/rules/DeadCode/Rector/PropertyProperty/RemoveNullPropertyInitializationRector.phpjEYvendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.phpjs-CTvendor/rector/rector/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php j uJvendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.phpjEuGNvendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php[j[/4Vvendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.phpj[Pvendor/rector/rector/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.phpvjv5 ƟMvendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.phpjGXvendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.phpjMTvendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php1j1Zvendor/rector/rector/rules/DeadCode/Rector/If_/RemoveTypedPropertyDeadInstanceOfRector.phpjBVvendor/rector/rector/rules/DeadCode/Rector/If_/SimplifyIfElseWithSameContentRector.php j kl[vendor/rector/rector/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfPhpVersionRector.php j !P_vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php-j-:FTMvendor/rector/rector/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.phpjTVҤNvendor/rector/rector/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php j S5)Pvendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php j f|DWvendor/rector/rector/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.phpTjTn;Yvendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php_j_;Vvendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessReadOnlyTagRector.php j +JQvendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.phpj1k'Pvendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.phpjSAHvendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.phpcjc.dLvendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadContinueRector.phpjEݤavendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.phpj)Ovendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php$j${a]vendor/rector/rector/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.phpjTbvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.phpjm=cvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.phpEjEKX]vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php j (cvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php j X4Wvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.phpjMWvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.phpjf׵]vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.phpj?4PWvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php j zVvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php j Zvendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.phpj13]ƤTvendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.phpj/Tvendor/rector/rector/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.phpjߤRvendor/rector/rector/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php j ay`vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php[j[Y$Nvendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.phpVjVAFTvendor/rector/rector/rules/DeadCode/Rector/Expression/SimplifyMirrorAssignRector.phpFjF~rQ`vendor/rector/rector/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php> j> "sWvendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.phpljl8-Svendor/rector/rector/rules/DeadCode/TypeNodeAnalyzer/MixedArrayTypeNodeAnalyzer.php{j{c38Pvendor/rector/rector/rules/DeadCode/TypeNodeAnalyzer/GenericTypeNodeAnalyzer.php<j<N 9vendor/rector/rector/rules/DeadCode/ConditionResolver.phpjz@sTvendor/rector/rector/rules/DeadCode/NodeManipulator/VariadicFunctionLikeDetector.phpvjv͐Hvendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.phpj|Xvendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.phpjOvendor/rector/rector/rules/DeadCode/NodeManipulator/ClassMethodParamRemover.phpbjb$cMvendor/rector/rector/rules/DeadCode/NodeManipulator/LivingCodeManipulator.phpdjdIvendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php-j-Gvendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.phpj*:vendor/rector/rector/rules/DeadCode/ConditionEvaluator.php j pTvendor/rector/rector/rules/TypeDeclaration/NodeTypeAnalyzer/DetailedTypeAnalyzer.phpjqg`Uvendor/rector/rector/rules/TypeDeclaration/NodeTypeAnalyzer/PropertyTypeDecorator.php j "Ԥ\vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/TypeExpressionFromVarTagResolver.phpj/nxޤRvendor/rector/rector/rules/TypeDeclaration/PhpDocParser/ParamPhpDocNodeFactory.phpj_ELvendor/rector/rector/rules/TypeDeclaration/Matcher/PropertyAssignMatcher.phpj*u Jvendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php#j#1Mvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.phpjR $Zvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodAndPropertyAnalyzer.php j /fIvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.phpYjY&פbvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.phpSjSQvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/NeverFuncCallAnalyzer.phpGjGYvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.phpGjGyӤuvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php4j42Wfvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.phpjSvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/DeclareStrictTypeFinder.phpjr*Imvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php}j}̤Nvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallerParamMatcher.phpj5/ѤJvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.phpj楤Mvendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/TypeNodeUnwrapper.phpj'Tvendor/rector/rector/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.phppjp܄~Mvendor/rector/rector/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php j *%Lvendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.phpjVvendor/rector/rector/rules/TypeDeclaration/TypeInferer/AssignToPropertyTypeInferer.php"j"/s`wvendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterTypeDeclarationPropertyTypeInferer.phpOjO}"`ovendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php j wvendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/SetterTypeDeclarationPropertyTypeInferer.phpj~vtvendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php"&j"&vvendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.phpLjLIZFvendor/rector/rector/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php j YNvendor/rector/rector/rules/TypeDeclaration/Guard/PropertyTypeOverrideGuard.phpgjgg¤Tvendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.phpwjw2C C\vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/GenericClassStringTypeNormalizer.phpjvendor/rector/rector/rules/Php70/ValueObject/ComparedExprs.phpj]x@vendor/rector/rector/rules/Php70/Enum/BattleshipCompareOrder.phpjEeWvendor/rector/rector/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.phpD jD ~lUvendor/rector/rector/rules/Php70/Rector/Switch_/ReduceMultipleDefaultSwitchRector.phpUjUBLAvendor/rector/rector/rules/Php70/Rector/List_/EmptyListRector.phpjGDHvendor/rector/rector/rules/Php70/Rector/Assign/ListSplitStringRector.phpj֨VKvendor/rector/rector/rules/Php70/Rector/Assign/ListSwapArrayOrderRector.php j FԤCvendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.phpvjv/Xvendor/rector/rector/rules/Php70/Rector/FuncCall/RenameMktimeWithoutArgsToTimeRector.phpj򰹤Ivendor/rector/rector/rules/Php70/Rector/FuncCall/CallUserMethodRector.phpjCIvendor/rector/rector/rules/Php70/Rector/FuncCall/RandomFunctionRector.php j MB Gvendor/rector/rector/rules/Php70/Rector/FuncCall/MultiDirnameRector.php j Jvendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.phpjy`vendor/rector/rector/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.phpSjSI+Mvendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.phpjN&Wvendor/rector/rector/rules/Php70/Rector/FunctionLike/ExceptionHandlerTypehintRector.php& j& omQvendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.phphjhG#Lvendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.phpj_vendor/rector/rector/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.phpjAYvendor/rector/rector/rules/Php70/Rector/StmtsAwareInterface/IfIssetToCoalescingRector.php j ;i`vendor/rector/rector/rules/Php70/Rector/Variable/WrapVariableVariableNameInCurlyBracesRector.php@j@gj]vendor/rector/rector/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.phpj"wQvendor/rector/rector/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.phpu ju >Bevendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.phpjmKvendor/rector/rector/rules/Php83/Rector/ClassConst/AddTypeToConstRector.phpj.0Lvendor/rector/rector/rules/Visibility/ValueObject/ChangeMethodVisibility.php[j[^Nvendor/rector/rector/rules/Visibility/ValueObject/ChangeConstantVisibility.phpj.Yvendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.phpw jw r\vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ExplicitPublicClassMethodRector.phpj0+ȤZvendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php> j> Ivendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.phpjlpz<vendor/rector/rector/rules/Php72/ValueObject/ListAndEach.phpjȗBvendor/rector/rector/rules/Php72/Rector/Unset_/UnsetCastRector.phpljliKvendor/rector/rector/rules/Php72/Rector/While_/WhileEachToForeachRector.phpd jd JR#\vendor/rector/rector/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php\j\k8dAvendor/rector/rector/rules/Php72/Rector/Assign/ListEachRector.phpvjv!@Ivendor/rector/rector/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php j KԤ\vendor/rector/rector/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.phpjh$Jvendor/rector/rector/rules/Php72/Rector/FuncCall/StringifyDefineRector.php j jUvendor/rector/rector/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php j _Mvendor/rector/rector/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php j ydHQvendor/rector/rector/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.phpv jv wXOvendor/rector/rector/rules/Naming/NamingConvention/NamingConventionAnalyzer.phpj9Cvendor/rector/rector/rules/Naming/PhpDoc/VarTagValueNodeRenamer.phpYjYEvendor/rector/rector/rules/Naming/RenameGuard/PropertyRenameGuard.php_j_|Jvendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.phpjUؤ9vendor/rector/rector/rules/Naming/Matcher/CallMatcher.php j <vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php j OGvendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php j V=Kvendor/rector/rector/rules/Naming/Guard/DateTimeAtNamingConventionGuard.phppjpxnvendor/rector/rector/rules/Naming/Guard/PropertyConflictingNameGuard/MatchPropertyTypeConflictingNameGuard.phpj}?vendor/rector/rector/rules/Naming/Guard/HasMagicGetSetGuard.phpj]#Rvendor/rector/rector/rules/Naming/Contract/AssignVariableNameResolverInterface.php7j7W?@vendor/rector/rector/rules/Naming/ValueObject/PropertyRename.phpje,Hvendor/rector/rector/rules/Naming/ValueObject/VariableAndCallForeach.phpje=vendor/rector/rector/rules/Naming/ValueObject/ParamRename.phpj8>vendor/rector/rector/rules/Naming/ValueObject/ExpectedName.phpjcȤGvendor/rector/rector/rules/Naming/ValueObject/VariableAndCallAssign.phpj1hvendor/rector/rector/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.phpjE^vendor/rector/rector/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.phpmjm(?vendor/rector/rector/rules/Naming/ParamRenamer/ParamRenamer.phpO jO ޡ?vendor/rector/rector/rules/Naming/Naming/UseImportsResolver.php j bZ;vendor/rector/rector/rules/Naming/Naming/PropertyNaming.phpf&jf&`Dvendor/rector/rector/rules/Naming/Naming/ConflictingNameResolver.phpLjLĤ;vendor/rector/rector/rules/Naming/Naming/VariableNaming.phpmjm0>vendor/rector/rector/rules/Naming/Naming/AliasNameResolver.phpj8dKvendor/rector/rector/rules/Naming/Naming/OverridenExistingNamesResolver.phpj#pAvendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.phpj2cvendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.phpj^ArUvendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameParamToMatchTypeRector.phpj;%[vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.phpOjOSѐqqvendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.phpjl rivendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.phpj_#iSvendor/rector/rector/rules/Naming/Rector/Class_/RenamePropertyToMatchTypeRector.phpsjsBM1;vendor/rector/rector/rules/Naming/RectorNamingInflector.phpjgKvendor/rector/rector/rules/Naming/ValueObjectFactory/ParamRenameFactory.phpj.ЉNvendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.phpLjL(m:vendor/rector/rector/rules/Naming/PhpArray/ArrayFilter.php|j|b0Tvendor/rector/rector/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php j ]vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.phpjS`vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.phpj`<Nvendor/rector/rector/rules/Naming/PropertyRenamer/MatchTypePropertyRenamer.phpjVJvendor/rector/rector/rules/Naming/PropertyRenamer/PropertyFetchRenamer.phpj7"Nvendor/rector/rector/rules/Naming/PropertyRenamer/PropertyPromotionRenamer.phpjm/$v5vendor/rector/rector/rules/Naming/VariableRenamer.php]j]<vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php[j[½[;Dvendor/rector/rector/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.phpjNvendor/rector/rector/rules/Php81/NodeAnalyzer/CoalesePropertyAssignMatcher.php3j3ߤIvendor/rector/rector/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php*j*[ͤ7vendor/rector/rector/rules/Php81/Enum/AttributeName.phpj]7Kvendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php%j%Eg?Xvendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.phpo&jo&-l_Nvendor/rector/rector/rules/Php81/Rector/ClassMethod/NewInInitializerRector.phpj0Kvendor/rector/rector/rules/Php81/Rector/Array_/FirstClassCallableRector.phphjh>ݤYvendor/rector/rector/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php#j#?Q\vendor/rector/rector/rules/Php81/Rector/MethodCall/SpatieEnumMethodCallToEnumConstRector.phpjlNvendor/rector/rector/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php j 3Kvendor/rector/rector/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php'j'!Ivendor/rector/rector/rules/EarlyReturn/ValueObject/BareSingleAssignIf.phpjY.Lvendor/rector/rector/rules/EarlyReturn/NodeTransformer/ConditionInverter.phpj&Zvendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php}j}Y[vendor/rector/rector/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.phpjDr3,`vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.phpGjGv.eLvendor/rector/rector/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.phpYjY,]vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeOrIfContinueToMultiContinueRector.phpjؤXvendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeNestedIfsToEarlyReturnRector.phpnjnw]^ fvendor/rector/rector/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.phpjavendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.phpj)>vendor/rector/rector/rules/Php71/IsArrayAndDualCheckToAble.php j =vendor/rector/rector/rules/Php71/ValueObject/TwoNodeMatch.phpjL<Yvendor/rector/rector/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.phpj*7Kvendor/rector/rector/rules/Php71/Rector/List_/ListToArrayDestructRector.phpjtDLvendor/rector/rector/rules/Php71/Rector/Assign/AssignArrayToStringRector.phpjA Nvendor/rector/rector/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php* j* `Pvendor/rector/rector/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.phpj$Fvendor/rector/rector/rules/Php71/Rector/BooleanOr/IsIterableRector.php j H>Uvendor/rector/rector/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php j ྤNvendor/rector/rector/rules/Php74/NodeAnalyzer/ClosureArrowFunctionAnalyzer.phpZjZɯLBvendor/rector/rector/rules/Php74/Guard/PropertyTypeChangeGuard.php j aoAvendor/rector/rector/rules/Php74/Guard/MakePropertyTypedGuard.phpjrUvendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.phpjY0Ovendor/rector/rector/rules/Php74/Rector/Assign/NullCoalescingOperatorRector.phpjz]ߤ_vendor/rector/rector/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.phpjGcvendor/rector/rector/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.phpjeSvendor/rector/rector/rules/Php74/Rector/FuncCall/ArrayKeyExistsOnPropertyRector.phpjMTvendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php j k9äOvendor/rector/rector/rules/Php74/Rector/FuncCall/HebrevcToNl2brHebrevRector.phpj̀\vendor/rector/rector/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.phpiji6SYvendor/rector/rector/rules/Php74/Rector/FuncCall/RestoreIncludePathToIniRestoreRector.phpjL`k+Pvendor/rector/rector/rules/Php74/Rector/FuncCall/FilterVarToAddSlashesRector.php,j,YᘤLvendor/rector/rector/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php j  8Pvendor/rector/rector/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php j ^m|OWvendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php j Svendor/rector/rector/rules/Php74/Rector/Ternary/ParenthesizeNestedTernaryRector.phpDjDQvendor/rector/rector/rules/Php74/Tokenizer/ParenthesizedNestedTernaryAnalyzer.phpjQ{Lvendor/rector/rector/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.phpj}LOvendor/rector/rector/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.phpEjEBƒKvendor/rector/rector/rules/CodeQuality/NodeFactory/TypedPropertyFactory.phpWjWuwVvendor/rector/rector/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php j BḤIvendor/rector/rector/rules/CodeQuality/NodeAnalyzer/ClassLikeAnalyzer.phpjAUGvendor/rector/rector/rules/CodeQuality/NodeAnalyzer/ForeachAnalyzer.phpjOMvendor/rector/rector/rules/CodeQuality/NodeAnalyzer/LocalPropertyAnalyzer.phpj[bAvendor/rector/rector/rules/CodeQuality/ValueObject/KeyAndExpr.phpjOvendor/rector/rector/rules/CodeQuality/Rector/NotEqual/CommonNotEqualRector.phpj |Svendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/LogicalToBooleanRector.phpj͕\vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/AndAssignsToSeparateLinesRector.php(j(Ovendor/rector/rector/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.phpj4Yvendor/rector/rector/rules/CodeQuality/Rector/BooleanNot/SimplifyDeMorganBinaryRector.phpbjbï\vendor/rector/rector/rules/CodeQuality/Rector/BooleanNot/ReplaceMultipleBooleanNotRector.phpj׋#Nvendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.phpi ji H{Rvendor/rector/rector/rules/CodeQuality/Rector/Switch_/SingularSwitchToIfRector.php{ j{ /1Mvendor/rector/rector/rules/CodeQuality/Rector/Assign/CombinedAssignRector.phpj[Ovendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php\ j\ ˮZvendor/rector/rector/rules/CodeQuality/Rector/BooleanAnd/SimplifyEmptyArrayCheckRector.phpzjz4]vendor/rector/rector/rules/CodeQuality/Rector/BooleanAnd/RemoveUselessIsObjectCheckRector.phpMjMKpΤlvendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.phpjAWgTvendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.phpQ!jQ!dfSvendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.phpj`FOvendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php5$j5$bϦXvendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php% j% HpZPvendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.phpjQZIvendor/rector/rector/rules/CodeQuality/Rector/If_/ShortenElseIfRector.phpD jD XSvendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php/ j/ L~6Evendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php j 4jvendor/rector/rector/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php j | Zvendor/rector/rector/rules/CodeQuality/Rector/For_/ForRepeatedCountToOwnVariableRector.phpi ji ">]vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/ChangeArrayPushToArrayAssignRector.php j ZtTvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php\j\\fvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CallUserFuncWithArrowFunctionToInlineRector.php j MpWvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SingleInArrayToCompareRector.phpjW'Nvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php9j9פUvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php j 6cYvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/UnwrapSprintfOneArgumentRector.phpdjdcvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/ArrayMergeOfNonArraysToSimpleArrayRector.php j X_Vvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyInArrayValuesRector.phpjƧȤYvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyFuncGetArgsCountRector.phpj)F3_vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/IsAWithStringWithThirdArgumentRector.phpjAѤTvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/InlineIsAInstanceOfRector.php j Svendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CompactToVariablesRector.php j +Wvendor/rector/rector/rules/CodeQuality/Rector/FuncCall/RemoveSoleValueSprintfRector.phpj.dvendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.phpj^ɤ`vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php0j0iVvendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/ExplicitReturnNullRector.phpj[vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.phpj0Xicvendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php+j+htߤhvendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.phpzjzUu\vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/SimplifyForeachToCoalescingRector.php_j_ڋgvendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.phpjVQvendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.phpTjTu^vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.phpjIjvendor/rector/rector/rules/CodeQuality/Rector/ClassConstFetch/ConvertStaticPrivateConstantToSelfRector.php] j] ( s\vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.phpj(s{jvendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php j RMhvendor/rector/rector/rules/CodeQuality/Rector/Ternary/TernaryEmptyArrayArrayDimFetchToCoalesceRector.phpmjm..Zvendor/rector/rector/rules/CodeQuality/Rector/Ternary/NumberCompareToMaxFuncCallRector.php j ]@\vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.phpj5)Tvendor/rector/rector/rules/CodeQuality/Rector/Ternary/SwitchNegatedTernaryRector.phpkjkV׌Xvendor/rector/rector/rules/CodeQuality/Rector/Ternary/SimplifyTautologyTernaryRector.phpWjWm2eWvendor/rector/rector/rules/CodeQuality/Rector/Expression/InlineIfToExplicitIfRector.phpA jA hVޤ]vendor/rector/rector/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.phpgjgG_)]vendor/rector/rector/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php4j4 A0_vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php* j* Dcvendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.phpDjDA[vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php j +Iυcvendor/rector/rector/rules/CodeQuality/Rector/Identical/BooleanNotIdenticalToNotIdenticalRector.php j Z,dʤUvendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php j QGTvendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.phpjbvendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php j 6"=Xvendor/rector/rector/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.phpj2gvendor/rector/rector/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php j Oavendor/rector/rector/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.phpjfvendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.phpJ jJ Yvendor/rector/rector/rules/CodeQuality/Rector/Catch_/ThrowWithPreviousExceptionRector.phpPjPGpLQvendor/rector/rector/rules/CodeQuality/TypeResolver/ArrayDimFetchTypeResolver.phpyjyRvendor/rector/rector/rules/CodeQuality/TypeResolver/AssignVariableTypeResolver.php j kusIvendor/rector/rector/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php j =Ӥ;vendor/rector/rector/rules/CodeQuality/CompactConverter.phpjΚPvendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php% j% -'wRvendor/rector/rector/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.phpj_Nvendor/rector/rector/rules/Php54/Rector/Array_/LongArrayToShortArrayRector.php@j@NWQvendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.phpjg˙Nvendor/rector/rector/rules/Php52/Rector/Property/VarToPublicPropertyRector.php0j0sڨ[vendor/rector/rector/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.phpjV6Hvendor/rector/rector/rules/Php53/Rector/Ternary/TernaryToElvisRector.phpj;4^Xvendor/rector/rector/rules/Php53/Rector/Variable/ReplaceHttpServerVarsByServerRector.phpj|MbKvendor/rector/rector/rules/Privatization/TypeManipulator/TypeNormalizer.phpjXMvendor/rector/rector/rules/Privatization/Guard/OverrideByParentClassGuard.phpjZHLvendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.phpj͝}^vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.phpjk_vendor/rector/rector/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.phpojo|Vcvendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php j =vVvendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php: j: ~JI!Rvendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php;j;)MWvendor/rector/rector/rules/Privatization/VisibilityGuard/ClassMethodVisibilityGuard.php?j?UEvendor/rector/rector/rules/Removing/ValueObject/RemoveFuncCallArg.phpjtCvendor/rector/rector/rules/Removing/ValueObject/ArgumentRemover.phpjCˤOvendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php j |HLvendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php2j2(Pvendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.phpjb׏Jvendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.phpjhslLvendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.phpj yJvendor/rector/rector/rules/Removing/NodeManipulator/ComplexNodeRemover.php j kS=Hvendor/rector/rector/rules/CodingStyle/Application/UseImportsRemover.phpjFvendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php#j#_Wvendor/rector/rector/rules/CodingStyle/NodeFactory/ArrayCallableToMethodCallFactory.php>j>gܤ<vendor/rector/rector/rules/CodingStyle/Node/NameImporter.php[j[+Lvendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.phpbjbf<vendor/rector/rector/rules/CodingStyle/Guard/StaticGuard.phpj2Tjevendor/rector/rector/rules/CodingStyle/Contract/ClassNameImport/ClassNameImportSkipVoterInterface.phpjMIvendor/rector/rector/rules/CodingStyle/ValueObject/ObjectMagicMethods.phpjr/7=vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.phpj%Ǥ]vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.phpjܣCRvendor/rector/rector/rules/CodingStyle/Rector/Stmt/NewlineAfterStatementRector.phpjvPvendor/rector/rector/rules/CodingStyle/Rector/Assign/SplitDoubleAssignRector.phpO jO Qvendor/rector/rector/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.phpt jt m)}\Wvendor/rector/rector/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.phpjJ_vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.phpjfavendor/rector/rector/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.phpiji|[vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php j [NYvendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncToMethodCallRector.php{ j{ U\vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.phpjRvendor/rector/rector/rules/CodingStyle/Rector/FuncCall/StrictArraySearchRector.phpjɢZRvendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ConsistentImplodeRector.phpY jY ¤avendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CountArrayToEmptyArrayComparisonRector.phpjC Mvendor/rector/rector/rules/CodingStyle/Rector/Closure/StaticClosureRector.phpj}QTvendor/rector/rector/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.phpjpmUvendor/rector/rector/rules/CodingStyle/Rector/PostInc/PostIncDecToPreIncDecRector.phpX jX F= 'evendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php]j]dSvendor/rector/rector/rules/CodingStyle/Rector/String_/SymplifyQuoteEscapeRector.phpjyj]vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.phpj9^vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.phpj=ͤmvendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.phpj 2~evendor/rector/rector/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.phpj,G%Yvendor/rector/rector/rules/CodingStyle/Rector/ArrowFunction/StaticArrowFunctionRector.phpj+!rbvendor/rector/rector/rules/CodingStyle/Rector/Ternary/TernaryConditionVariableAssignmentRector.php9j9뉔Qbvendor/rector/rector/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php[j[f81Yvendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.phpjJ ]vendor/rector/rector/rules/CodingStyle/Rector/ClassConst/SplitGroupedClassConstantsRector.phpjBWvendor/rector/rector/rules/CodingStyle/Rector/ClassConst/RemoveFinalFromConstRector.phpVjV<_]vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.phpjnΤQvendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.phpjNvendor/rector/rector/rules/CodingStyle/ClassNameImport/UseImportsTraverser.phpKjKcNvendor/rector/rector/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php j pvendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.phpj{;4~vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php1j12@)qvendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.phpjyvendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.phpj JRvendor/rector/rector/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.phpj| Lvendor/rector/rector/rules/CodingStyle/ClassNameImport/AliasUsesResolver.phpjjLvendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.phpj"MLvendor/rector/rector/rules/CodingStyle/Reflection/VendorLocationDetector.phpj]\vendor/rector/rector/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.phpKjKP< Ivendor/rector/rector/rules/Transform/NodeFactory/PropertyFetchFactory.phpj@7\vendor/rector/rector/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.phpjaoNvendor/rector/rector/rules/Transform/ValueObject/PropertyFetchToMethodCall.php j Iޤ?vendor/rector/rector/rules/Transform/ValueObject/WrapReturn.phpjeοKvendor/rector/rector/rules/Transform/ValueObject/StaticCallToMethodCall.phpkjk)Ivendor/rector/rector/rules/Transform/ValueObject/FuncCallToMethodCall.phpXjX蓃Pvendor/rector/rector/rules/Transform/ValueObject/ConstFetchToClassConstFetch.phpAjAb ĤIvendor/rector/rector/rules/Transform/ValueObject/StaticCallToFuncCall.phpjŗDvendor/rector/rector/rules/Transform/ValueObject/NewToStaticCall.phpNjN V'Dvendor/rector/rector/rules/Transform/ValueObject/StaticCallToNew.phpj$:KNvendor/rector/rector/rules/Transform/ValueObject/MethodCallToPropertyFetch.php#j#AE fLvendor/rector/rector/rules/Transform/ValueObject/ScalarValueToConstFetch.php<j<Q)Ivendor/rector/rector/rules/Transform/ValueObject/MethodCallToFuncCall.phpVjVWRvendor/rector/rector/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php6j6PDvendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.phpj9.Tvendor/rector/rector/rules/Transform/ValueObject/ReplaceParentCallByPropertyCall.phpjyJvendor/rector/rector/rules/Transform/ValueObject/StringToClassConstant.phpVjVFSH֤Hvendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.phpj*:U:Kvendor/rector/rector/rules/Transform/ValueObject/MethodCallToStaticCall.phpjsXOvendor/rector/rector/rules/Transform/ValueObject/PropertyAssignToMethodCall.phpMjM6Ivendor/rector/rector/rules/Transform/ValueObject/FuncCallToStaticCall.php&j&=D/Nvendor/rector/rector/rules/Transform/ValueObject/ArrayDimFetchToMethodCall.phpjˤIvendor/rector/rector/rules/Transform/ValueObject/ClassMethodReference.phpjWJvendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.phpj=zYVvendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.phpPjP5Wvendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.phpE jE F\vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.phpcjcxh]vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php?j?k Lvendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.phpjSISvendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.phpLjL!BSvendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.phpjn-Svendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.phpjOФTvendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.phpjsP^vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.phpj^/]vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.phpju7SUvendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.phpIjIHmPvendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.phpT jT oh!.Wvendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.phpj‚!Svendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php j s"Vvendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.phpj}\M6Lvendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php- j- *#`vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php j Uvendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php j .0Wvendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php j $Pvendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.phpjx(Zvendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php< j< zZPvendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php j ^瑤Pvendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php/ j/ ?Lvendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php j :_vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.phpPjP2_Cvendor/rector/rector/rules/Carbon/NodeFactory/CarbonCallFactory.phpzjz_)¤Pvendor/rector/rector/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php j >Pvendor/rector/rector/rules/Carbon/Rector/FuncCall/TimeFuncCallToCarbonRector.phpvjvs>Pvendor/rector/rector/rules/Carbon/Rector/FuncCall/DateFuncCallToCarbonRector.php{j{1Xvendor/rector/rector/rules/Carbon/Rector/MethodCall/DateTimeMethodCallToCarbonRector.php j Qvendor/rector/rector/rules/Php82/Rector/New_/FilesystemIteratorSkipDotsRector.phpi ji (`#!^vendor/rector/rector/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.phpFjF"DVvendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php j դ]vendor/rector/rector/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.phpj$HFvendor/rector/rector/rules/Php82/Rector/Class_/ReadOnlyClassRector.php$j$~i\vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ClassAndInterfaceTypeResolver.phpFjFb֤Pvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ParamTypeResolver.phpj9uOvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/CastTypeResolver.phpjw+Svendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.phpj"Zvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ClassConstFetchTypeResolver.phpjDUĤPvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/TraitTypeResolver.phpj$|Qvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ScalarTypeResolver.phpj^齤Uvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/IdentifierTypeResolver.phpWjWxNvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/NewTypeResolver.php j Lt Xvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php1 j1 r_vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/StaticCallMethodCallTypeResolver.phpdjdXOvendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/NameTypeResolver.php j (1>vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.phplJjlJsǤVvendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.phpj5hVvendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.phpjφUvendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockTagReplacer.phpj:&Qvendor/rector/rector/src/NodeTypeResolver/TypeComparator/ScalarTypeComparator.php<j<{ޤPvendor/rector/rector/src/NodeTypeResolver/TypeComparator/ArrayTypeComparator.phpjWKvendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php"j"?vendor/rector/rector/src/NodeTypeResolver/Node/AttributeKey.php~j~UTvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.phppRjpRΏɤZvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php)j)*avendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php j VΤWvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/NameNodeVisitor.phpj!np^vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefReturnNodeVisitor.phpj9Zvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ContextNodeVisitor.phpjeVvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ArgNodeVisitor.php$j$q`vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefVariableNodeVisitor.php j ֤]vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.phpj}avendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php j \rvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/Contract/NodeVisitor/ScopeResolverNodeVisitorInterface.phpj@Hvendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.phpj$rS_vendor/rector/rector/src/NodeTypeResolver/PHPStan/ParametersAcceptorSelectorVariantsWrapper.phpXjXY [vendor/rector/rector/src/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.phpj0_|@vendor/rector/rector/src/NodeTypeResolver/PHPStan/TypeHasher.phpd jd 6"jFvendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/TypeFactory.php+j+Mvendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php}j}h0Kvendor/rector/rector/src/NodeTypeResolver/NodeScopeAndMetadataDecorator.phpkjkLJLvendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.phpdjd?UMvendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/StringTypeAnalyzer.phprjr4_UUvendor/rector/rector/src/NodeTypeResolver/Contract/NodeTypeResolverAwareInterface.phpjyRƮPvendor/rector/rector/src/NodeTypeResolver/Contract/NodeTypeResolverInterface.phpjVFvendor/rector/rector/src/NodeTypeResolver/ValueObject/OldToNewType.phpgjg~Ҥ^vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.phpg)jg);P\vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.phpjlf-_vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/GenericClassStringTypeCorrector.phpjKdvendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyStringTypeCorrector.phpHjHA|vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php j Iqvendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocator/IntermediateSourceLocator.phpj/Z;tvendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.phpjrXvendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.phpjB勤;vendor/rector/rector/src/Set/SetProvider/PHPSetProvider.php1j1<vendor/rector/rector/src/Set/SetProvider/CoreSetProvider.phpj˝+vendor/rector/rector/src/Set/SetManager.phpjd6vendor/rector/rector/src/Set/Contract/SetInterface.phpjf2Ĥ:vendor/rector/rector/src/Set/Contract/SetListInterface.php;j;S>vendor/rector/rector/src/Set/Contract/SetProviderInterface.phpj`ͤ0vendor/rector/rector/src/Set/ValueObject/Set.phpj4vendor/rector/rector/src/Set/ValueObject/SetList.php4 j4 t¤Avendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.phpaja'1N{9vendor/rector/rector/src/Set/ValueObject/LevelSetList.phpqjqI.vendor/rector/rector/src/Set/Enum/SetGroup.phpfjf»Evendor/rector/rector/src/PostRector/Application/PostFileProcessor.phpjGz%Bvendor/rector/rector/src/PostRector/Guard/AddUseStatementGuard.phpjpKvendor/rector/rector/src/PostRector/Contract/Rector/PostRectorInterface.phpj/ZĤDvendor/rector/rector/src/PostRector/ValueObject/PropertyMetadata.phpTjT0Bvendor/rector/rector/src/PostRector/Rector/UseAddingPostRector.phpljlTx|Avendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php:j:?wNvendor/rector/rector/src/PostRector/Rector/DocblockNameImportingPostRector.php j Fvendor/rector/rector/src/PostRector/Rector/ClassRenamingPostRector.php|j|ŹFvendor/rector/rector/src/PostRector/Rector/NameImportingPostRector.php=j=O{Mvendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.phpjJ(Hvendor/rector/rector/src/PostRector/Collector/UseNodesToAddCollector.phpjT4Bvendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php< j< ^8vendor/rector/rector/src/Application/VersionResolver.phpjXEvendor/rector/rector/src/Application/Provider/CurrentFileProvider.phpjՖAvendor/rector/rector/src/Application/ApplicationFileProcessor.php)+j)+36vendor/rector/rector/src/Application/FileProcessor.phpl#jl#,Jvendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php j bYvendor/rector/rector/src/PhpDocParser/PhpDocParser/Exception/InvalidTraverseException.phpj3WȤZvendor/rector/rector/src/PhpDocParser/PhpDocParser/Contract/PhpDocNodeVisitorInterface.phpvjvSK Uvendor/rector/rector/src/PhpDocParser/PhpDocParser/ValueObject/PhpDocAttributeKey.phpjUbvendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/AbstractPhpDocNodeVisitor.phpQjQbvendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CallablePhpDocNodeVisitor.phpjǓbjvendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.phpj Ȥavendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.phpj&Ivendor/rector/rector/src/PhpDocParser/NodeVisitor/CallableNodeVisitor.phpjiBvendor/rector/rector/src/PhpDocParser/ValueObject/AttributeKey.phpj&eIvendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParserFactory.phpjޛkBvendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParser.phpjxkSvendor/rector/rector/src/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php j  .9vendor/rector/rector/src/Php/PolyfillPackagesProvider.phpjf 3vendor/rector/rector/src/Php/PhpVersionProvider.php j Rvendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php j (8vendor/rector/rector/src/Php/ReservedKeywordAnalyzer.phpj2¤=vendor/rector/rector/src/FileSystem/InitFilePathsResolver.php?j?Ő'9vendor/rector/rector/src/FileSystem/FilesystemTweaker.phpj>vendor/rector/rector/src/FileSystem/FileAndDirectoryFilter.phpjw(3vendor/rector/rector/src/FileSystem/FilesFinder.phpeje~6vendor/rector/rector/src/FileSystem/FilePathHelper.php j \6vendor/rector/rector/src/FileSystem/JsonFileSystem.phpjt鰤Gvendor/rector/rector/src/FamilyTree/NodeAnalyzer/ClassChildAnalyzer.phpg jg \4%Jvendor/rector/rector/src/FamilyTree/Reflection/FamilyRelationsAnalyzer.php j ll?vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.phpjj=vendor/rector/rector/src/Autoloading/AdditionalAutoloader.phpjm-1vendor/rector/rector/src/Differ/DefaultDiffer.phpj{^9vendor/rector/rector/src/CustomRules/SimpleNodeDumper.phpjiKď^vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnVendorLockResolver.phpj jj LM]vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php{j{L_]vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php j 8ԤNvendor/rector/rector/src/VendorLocker/Exception/UnresolvableClassException.phpjeLvendor/rector/rector/src/VendorLocker/ParentClassMethodTypeOverrideGuard.phpAjAxp0Kvendor/rector/rector/src/StaticReflection/DynamicSourceLocatorDecorator.php|j|$UrPvendor/rector/rector/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php j HPvendor/rector/rector/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.phpj<ϤSvendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php j rjځTvendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.phpj<Rvendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.phpj_yKvendor/rector/rector/src/BetterPhpDocParser/Annotation/AnnotationNaming.phpjCUvendor/rector/rector/src/BetterPhpDocParser/PhpDoc/DoctrineAnnotationTagValueNode.phpDjDf lMvendor/rector/rector/src/BetterPhpDocParser/PhpDoc/SpacelessPhpDocTagNode.phpjAvendor/rector/rector/src/BetterPhpDocParser/PhpDoc/StringNode.phpj4c%Dvendor/rector/rector/src/BetterPhpDocParser/PhpDoc/ArrayItemNode.phpjЩOvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php j `gvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.phpj2\ڑlvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.phpj[ Xvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.phpjrorXvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.phpFjFQQJXvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php j sSvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.phpjM9Mvendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.phpjq[vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.phpj_4Lvendor/rector/rector/src/BetterPhpDocParser/Attributes/AttributeMirrorer.phpj{Fvendor/rector/rector/src/BetterPhpDocParser/Comment/CommentsMerger.phpjCSvendor/rector/rector/src/BetterPhpDocParser/Guard/NewPhpDocFromPHPStanTypeGuard.phpj/lA#@vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.phpjo bvendor/rector/rector/src/BetterPhpDocParser/Contract/PhpDocParser/PhpDocNodeDecoratorInterface.phpj_Wvendor/rector/rector/src/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.phpjkR=Evendor/rector/rector/src/BetterPhpDocParser/ValueObject/NodeTypes.phpLjLycvendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/SpacingAwareTemplateTagValueNode.phpj+_cvendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.phpj߾mvendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/AbstractValuesAwareNode.phpjI*Nvendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDocAttributeKey.phpj&Gvendor/rector/rector/src/BetterPhpDocParser/ValueObject/StartAndEnd.phpj9`HVvendor/rector/rector/src/BetterPhpDocParser/ValueObject/Parser/BetterTokenIterator.php j *ʤ]vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/SpacingAwareCallableTypeNode.php[ j[ y>Zvendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/SpacingAwareArrayTypeNode.php, j, 7o[vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/BracketsAwareUnionTypeNode.phpjavendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/FullyQualifiedIdentifierTypeNode.phpQjQSҤ\vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/ShortenedIdentifierTypeNode.phpjAsbvendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/BracketsAwareIntersectionTypeNode.phpQjQϵ[vendor/rector/rector/src/BetterPhpDocParser/ValueObject/DoctrineAnnotation/SilentKeyMap.php!j!פOvendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/TokenIteratorFactory.php6j6ILvendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.phpj3UEvendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.phpaBjaBMΧ\vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.phpjj[vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php j ڈ`vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php j Mי_vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.phpNjNT;gvendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.phpQjQs̤Zvendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.phpDjD9Wvendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php j >Yvendor/rector/rector/src/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.phpjXIvendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php0j00GKvendor/rector/rector/src/BetterPhpDocParser/Printer/EmptyPhpDocDetector.phpjъGvendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.phpjVvendor/rector/rector/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.phpj/4vendor/rector/rector/src/Validation/RectorAssert.php j l+)d=vendor/rector/rector/src/Validation/RectorConfigValidator.php j \T<vendor/rector/rector/src/NodeAnalyzer/ConstFetchAnalyzer.phpjSܤ6vendor/rector/rector/src/NodeAnalyzer/ArgsAnalyzer.phpj{Ӥ:vendor/rector/rector/src/NodeAnalyzer/VariableAnalyzer.php[j[66vendor/rector/rector/src/NodeAnalyzer/CallAnalyzer.php} j} Ѥ?vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.phpjox:vendor/rector/rector/src/NodeAnalyzer/PropertyAnalyzer.phpj1j7vendor/rector/rector/src/NodeAnalyzer/ParamAnalyzer.phpjƧ?`7vendor/rector/rector/src/NodeAnalyzer/ClassAnalyzer.phpj;*Avendor/rector/rector/src/NodeAnalyzer/CompactFuncCallAnalyzer.php?j?j5Avendor/rector/rector/src/NodeAnalyzer/PropertyPresenceChecker.phpjF@vendor/rector/rector/src/NodeAnalyzer/DoctrineEntityAnalyzer.phpj6vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.phpzjzfYįBvendor/rector/rector/src/NodeAnalyzer/MagicClassMethodAnalyzer.phpj˶:vendor/rector/rector/src/NodeAnalyzer/BinaryOpAnalyzer.phpj/7vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.phpj':vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.phpj𕰡@vendor/rector/rector/src/NodeAnalyzer/TerminatedNodeAnalyzer.phpjXP S2vendor/rector/rector/src/functions/node_helper.phpj^S&7vendor/rector/rector/src/Exception/VersionException.phpjlAvendor/rector/rector/src/Exception/NotImplementedYetException.phpjtT?vendor/rector/rector/src/Exception/ShouldNotHappenException.phpj ä=vendor/rector/rector/src/Exception/Cache/CachingException.phpj+ߛRvendor/rector/rector/src/Exception/Configuration/InvalidConfigurationException.phpjEuQvendor/rector/rector/src/Exception/Reflection/MissingPrivatePropertyException.phpjƵA=vendor/rector/rector/src/Skipper/SkipVoter/ClassSkipVoter.phpj*#>vendor/rector/rector/src/Skipper/FileSystem/PathNormalizer.phpj2gEvendor/rector/rector/src/Skipper/FileSystem/FnMatchPathNormalizer.phpj<$<vendor/rector/rector/src/Skipper/Matcher/FileInfoMatcher.phpj|0s4vendor/rector/rector/src/Skipper/Skipper/Skipper.phpjSFw68vendor/rector/rector/src/Skipper/Skipper/SkipSkipper.php$j$(8vendor/rector/rector/src/Skipper/Skipper/PathSkipper.phpjf2/4vendor/rector/rector/src/Skipper/RealpathMatcher.phpj&٤.vendor/rector/rector/src/Skipper/Fnmatcher.phpbjbMlWNvendor/rector/rector/src/Skipper/SkipCriteriaResolver/SkippedClassResolver.phpjՀnNvendor/rector/rector/src/Skipper/SkipCriteriaResolver/SkippedPathsResolver.phpj],vendor/rector/rector/src/Util/FileHasher.phpje3vendor/rector/rector/src/Util/PhpVersionFactory.phpj[7vendor/rector/rector/src/Util/ArrayParametersMerger.phpXjX[ʤ-vendor/rector/rector/src/Util/StringUtils.php&j&.vendor/rector/rector/src/Util/ArrayChecker.phpjc1vendor/rector/rector/src/Util/NewLineSplitter.phpj=/vendor/rector/rector/src/Util/MemoryLimiter.phpj %-vendor/rector/rector/src/Util/NodePrinter.phpj} =vendor/rector/rector/src/Util/Reflection/PrivatesAccessor.php j 'QHvendor/rector/rector/src/Contract/PhpParser/Node/StmtsAwareInterface.phpjyeHvendor/rector/rector/src/Contract/Rector/ConfigurableRectorInterface.phpljll$٤<vendor/rector/rector/src/Contract/Rector/RectorInterface.phpjƤFvendor/rector/rector/src/Contract/Rector/ScopeAwareRectorInterface.phpjƛLvendor/rector/rector/src/Contract/DependencyInjection/ResetableInterface.phpjLPvendor/rector/rector/src/Contract/DependencyInjection/RelatedConfigInterface.phpjЫ_3vendor/rector/rector/src/ValueObject/PhpVersion.php|j|b=פ9vendor/rector/rector/src/ValueObject/Application/File.php j nϜ 3vendor/rector/rector/src/ValueObject/MethodName.phpjb4 :vendor/rector/rector/src/ValueObject/Error/SystemError.php j (8vendor/rector/rector/src/ValueObject/FuncCallAndExpr.phpj5.:vendor/rector/rector/src/ValueObject/FileProcessResult.phpjͻCvendor/rector/rector/src/ValueObject/Bootstrap/BootstrapConfigs.phpjVr6vendor/rector/rector/src/ValueObject/Configuration.phpjR8vendor/rector/rector/src/ValueObject/PolyfillPackage.phpj-s6vendor/rector/rector/src/ValueObject/ProcessResult.php&j&Uz :vendor/rector/rector/src/ValueObject/PhpVersionFeature.phpBjB A3vendor/rector/rector/src/ValueObject/Visibility.phpj4Ȗ=vendor/rector/rector/src/ValueObject/SprintfStringAndArgs.phpj{먤;vendor/rector/rector/src/ValueObject/Reporting/FileDiff.phpjȤFvendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.phpjFGvendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php%j%v<vendor/rector/rector/src/Parallel/ValueObject/BridgeItem.phpj F8vendor/rector/rector/src/Parallel/ValueObject/Bridge.php j ]8>vendor/rector/rector/src/VersionBonding/PhpVersionedFilter.phpEjEMvendor/rector/rector/src/VersionBonding/Contract/RelatedPolyfillInterface.phpRjRG?Kvendor/rector/rector/src/VersionBonding/Contract/MinPhpVersionInterface.phpj# HLvendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php j Avendor/rector/rector/src/Configuration/VendorMissAnalyseGuard.phpOjOj=1vendor/rector/rector/src/Configuration/Option.php&j&8*Svendor/rector/rector/src/Configuration/Deprecation/Contract/DeprecatedInterface.php7j7fx>vendor/rector/rector/src/Configuration/PhpLevelSetResolver.phpj?vendor/rector/rector/src/Configuration/ConfigurationFactory.php<j<Px8Dvendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.phpj7Fvendor/rector/rector/src/Configuration/RenamedClassesDataCollector.php4j4<vendor/rector/rector/src/Configuration/ConfigInitializer.php j _ >vendor/rector/rector/src/Configuration/RectorConfigBuilder.phpvjv19 Qvendor/rector/rector/src/NodeCollector/ScopeResolver/ParentClassScopeResolver.phpjbޚRvendor/rector/rector/src/NodeCollector/NodeAnalyzer/ArrayCallableMethodMatcher.php]j]99vendor/rector/rector/src/NodeCollector/StaticAnalyzer.phpj81Qvendor/rector/rector/src/NodeCollector/ValueObject/ArrayCallableDynamicMethod.phpjjDvendor/rector/rector/src/NodeCollector/ValueObject/ArrayCallable.phpj⦖Fvendor/rector/rector/src/NodeCollector/BinaryOpConditionsCollector.phpjQ2vendor/rector/rector/src/PhpParser/AstResolver.php&8j&8y6?vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php j AƤ<vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php)j)cP?vendor/rector/rector/src/PhpParser/Node/Value/ValueResolver.php+j+x>vendor/rector/rector/src/PhpParser/Node/AssignAndBinaryMap.phpDjDi17vendor/rector/rector/src/PhpParser/Node/NodeFactory.php.:j.:*AHKvendor/rector/rector/src/PhpParser/Node/CustomNode/FileWithoutNamespace.phpjF5Evendor/rector/rector/src/PhpParser/NodeFinder/PropertyFetchFinder.php+j+1Gvendor/rector/rector/src/PhpParser/NodeFinder/LocalMethodCallFinder.php j *p'ΤAvendor/rector/rector/src/PhpParser/ValueObject/StmtsAndTokens.phpCjCRHvendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php j bVvendor/rector/rector/src/PhpParser/NodeTraverser/FileWithoutNamespaceNodeTraverser.phpj;O"6vendor/rector/rector/src/PhpParser/NodeTransformer.php4j4ۅr>vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.phpj:*):vendor/rector/rector/src/PhpParser/Parser/ParserErrors.phpji$:vendor/rector/rector/src/PhpParser/Parser/RectorParser.phpjV ä=vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.phpi ji C`Dvendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.phpKAjKA)I+vendor/rector/rector/src/Enum/ClassName.phpjp1vendor/rector/rector/src/Enum/ObjectReference.php*j*oW_8vendor/rector/rector/src/Bridge/SetProviderCollector.phpljl\{Ȥ6vendor/rector/rector/src/Bridge/SetRectorsResolver.phpN jN 4vendor/rector/rector/src/Comments/CommentRemover.phpj|FLvendor/rector/rector/src/Comments/NodeVisitor/CommentRemovingNodeVisitor.phpIjIqbPvendor/rector/rector/src/Comments/NodeTraverser/CommentRemovingNodeTraverser.phpj<Bvendor/rector/rector/src/Comments/NodeDocBlock/DocBlockUpdater.phpjpݤ<vendor/rector/rector/src/Rector/AbstractScopeAwareRector.phpjjjj62vendor/rector/rector/src/Rector/AbstractRector.php61j61sBvendor/rector/rector/src/Caching/Detector/ChangedFilesDetector.phpj&+9vendor/rector/rector/src/Caching/UnchangedFilesFilter.phpj* Wvendor/rector/rector/src/Caching/Contract/ValueObject/Storage/CacheStorageInterface.php>j>9A:vendor/rector/rector/src/Caching/ValueObject/CacheItem.phpjP?vendor/rector/rector/src/Caching/ValueObject/CacheFilePaths.phpljl1*SKvendor/rector/rector/src/Caching/ValueObject/Storage/MemoryCacheStorage.phpj#SIvendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php)j)boim2vendor/rector/rector/src/Caching/Enum/CacheKey.phpj>[rޤ1vendor/rector/rector/src/Caching/CacheFactory.phpjћg<vendor/rector/rector/src/Caching/Config/FileHashComputer.php[j[븤*vendor/rector/rector/src/Caching/Cache.phpAjA)&=vendor/rector/rector/src/Console/Command/ListRulesCommand.phpj]ݤ;vendor/rector/rector/src/Console/Command/ProcessCommand.php!j!R\ :vendor/rector/rector/src/Console/Command/WorkerCommand.phpj+}>vendor/rector/rector/src/Console/Command/CustomRuleCommand.php'j'y@Ǥ;vendor/rector/rector/src/Console/Command/SetupCICommand.phpjh7vendor/rector/rector/src/Console/ConsoleApplication.phpj=P6<vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.phpjx5Hvendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php j ҤDvendor/rector/rector/src/Console/Output/OutputFormatterCollector.phpj<%wH-vendor/rector/rector/src/Console/ExitCode.phpjS)6vendor/rector/rector/src/Console/Style/RectorStyle.php j =B>vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php_j_?>vendor/rector/rector/src/Console/ProcessConfigureDecorator.phpj`-vendor/rector/rector/src/Console/Notifier.phpj)>vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php j P Bvendor/rector/rector/src/Composer/ValueObject/InstalledPackage.php*j*3>vendor/rector/rector/src/Composer/InstalledPackageResolver.phpj <vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php j  ,>vendor/rector/rector/src/Bootstrap/ExtensionConfigResolver.phpsjs2d`AHvendor/rector/rector/src/NodeNameResolver/Regex/RegexPatternDetector.php4j4>vendor/rector/rector/src/NodeNameResolver/NodeNameResolver.phpj5#Pvendor/rector/rector/src/NodeNameResolver/Contract/NodeNameResolverInterface.phpjg)TSvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FunctionNameResolver.phpjjj'lSvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/VariableNameResolver.phpjpGPvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/ParamNameResolver.php j Svendor/rector/rector/src/NodeNameResolver/NodeNameResolver/PropertyNameResolver.phpjXۤNvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/UseNameResolver.phpjOvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/NameNameResolver.phpCjC7PSvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FuncCallNameResolver.phpjTZvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/ClassConstFetchNameResolver.phpjAUvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/ClassConstNameResolver.phpjDxPvendor/rector/rector/src/NodeNameResolver/NodeNameResolver/ClassNameResolver.phpejew1vendor/rector/rector/src/Git/RepositoryHelper.php+j+;0vendor/rector/rector/src/Config/RectorConfig.php6j6h!U5vendor/rector/rector/src/Config/RegisteredService.phpj4y7vendor/rector/rector/src/Config/Level/DeadCodeLevel.phpjͽf:vendor/rector/rector/src/Config/Level/CodeQualityLevel.php'j'F^>vendor/rector/rector/src/Config/Level/TypeDeclarationLevel.phpjq{ŤCvendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php j Q ]vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.phpz jz /OJvendor/rector/rector/src/PhpAttribute/NodeFactory/AttributeNameFactory.phpu ju Fvendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php j AڤNvendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.phpj7ZTvendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php*j*S=vendor/rector/rector/src/PhpAttribute/UseAliasNameMatcher.php j  Wvendor/rector/rector/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php`j`SkFvendor/rector/rector/src/PhpAttribute/ValueObject/UseAliasMetadata.phpjjv>vendor/rector/rector/src/PhpAttribute/Enum/DocTagNodeState.phpjdEvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.phpIjI즤nvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php j nvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ConstExprNodeAnnotationToAttributeMapper.phpUjUGb♤svendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/DoctrineAnnotationAnnotationToAttributeMapper.phpc jc p9Lkvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/StringNodeAnnotationToAttributeMapper.phpQjQ:eUfvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php j :pvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ClassConstFetchAnnotationToAttributeMapper.phpj٤nvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.phpj;9gvendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/StringAnnotationToAttributeMapper.phpj(פ@vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.phpjAvendor/rector/rector/src/NodeDecorator/CreatedByRuleDecorator.php;j;=@vendor/rector/rector/src/NodeManipulator/BinaryOpManipulator.phpPjPn.Kvendor/rector/rector/src/NodeManipulator/PropertyFetchAssignManipulator.php j $uIvendor/rector/rector/src/NodeManipulator/ClassMethodAssignManipulator.phpdjd,@vendor/rector/rector/src/NodeManipulator/FuncCallManipulator.phpTjT^=vendor/rector/rector/src/NodeManipulator/ClassManipulator.php+j+X1Dvendor/rector/rector/src/NodeManipulator/FunctionLikeManipulator.phpj`O_>vendor/rector/rector/src/NodeManipulator/AssignManipulator.php j I;Bvendor/rector/rector/src/NodeManipulator/ClassConstManipulator.phpm jm [Cvendor/rector/rector/src/NodeManipulator/ClassMethodManipulator.phpj =vendor/rector/rector/src/NodeManipulator/StmtsManipulator.phpS jS rbbr:vendor/rector/rector/src/NodeManipulator/IfManipulator.phpj}@vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php"j"bJPvendor/rector/rector/src/NodeManipulator/ClassMethodPropertyFetchManipulator.phpjQ٤Gvendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.phpU$jU$8ͤCvendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.phpm jm Vvendor/rector/rector/src/ChangesReporting/Contract/Output/OutputFormatterInterface.phpOjOZNvendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.phpVjVFHvendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.phpv jv ˽Kvendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.phpkjk0Mvendor/rector/rector/src/ChangesReporting/ValueObjectFactory/ErrorFactory.phpjzPvendor/rector/rector/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.phpjSĤAvendor/rector/rector/src/Testing/Contract/RectorTestInterface.phpjPG@vendor/rector/rector/src/Testing/TestingParser/TestingParser.php" j" 0+=vendor/rector/rector/src/Testing/PHPUnit/AbstractTestCase.php-j-[/Cvendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.phpz*jz*Ivendor/rector/rector/src/Testing/PHPUnit/ValueObject/RectorTestResult.phpbjb`v9JEvendor/rector/rector/src/Testing/PHPUnit/StaticPHPUnitEnvironment.php]j] "Avendor/rector/rector/src/Testing/PHPUnit/AbstractLazyTestCase.phpj@Bvendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.phpjZEE>vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php/j/֤<vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.phpj+>?vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.phpfjf^Ф>vendor/rector/rector/src/StaticTypeMapper/StaticTypeMapper.phpjؤEvendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.phpjSvendor/rector/rector/src/StaticTypeMapper/PhpDocParser/NullablePhpDocTypeMapper.phpj oޤWvendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IntersectionPhpDocTypeMapper.php{j{0ҥPvendor/rector/rector/src/StaticTypeMapper/PhpDocParser/UnionPhpDocTypeMapper.php j ܗdUvendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.phpj!/Mvendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php j ~Hvendor/rector/rector/src/StaticTypeMapper/Mapper/PhpParserNodeMapper.phpjnEߤ]vendor/rector/rector/src/StaticTypeMapper/Contract/PhpDocParser/PhpDocTypeMapperInterface.phpjyZɤ]vendor/rector/rector/src/StaticTypeMapper/Contract/PhpParser/PhpParserNodeMapperInterface.phpjiMvendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/SelfStaticType.phpj#enOvendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ParentStaticType.phpjWvendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.phpjTvendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/NonExistingObjectType.phpjOOvendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.phpjo8Ӥ>vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.phpj@vendor/rector/rector/src/Reporting/MissConfigurationReporter.php7 j7 ۀ<vendor/rector/rector/src/Reflection/ClassModifierChecker.phpjx@vendor/rector/rector/src/Reflection/MethodReflectionResolver.phpjt:vendor/rector/rector/src/Reflection/ReflectionResolver.php,j,z̢ä?vendor/rector/rector/src/Reflection/ClassReflectionAnalyzer.phpj VEvendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php:pj:pGǣzGvendor/rector/rector/src/DependencyInjection/RectorContainerFactory.phpjؒ2Ivendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.phpjcLvendor/rector/rector/LICENSEfjf|7vendor/rector/rector/templates/rector-gitlab-check.yamljXͤ>vendor/rector/rector/templates/rector-github-action-check.yamljl.vendor/rector/rector/templates/rector.php.distjt4>kvendor/rector/rector/templates/custom-rules-annotations/utils/rector/tests/Rector/__Name__/__Name__Test.php^j^rOvendor/rector/rector/templates/custom-rule/utils/rector/src/Rector/__Name__.phpIjI'-+hvendor/rector/rector/templates/custom-rule/utils/rector/tests/Rector/__Name__/config/configured_rule.phpj'̤^vendor/rector/rector/templates/custom-rule/utils/rector/tests/Rector/__Name__/__Name__Test.php}j}C$khvendor/rector/rector/templates/custom-rule/utils/rector/tests/Rector/__Name__/Fixture/some_class.php.incj vendor/rector/rector/preload.phpAyjAy<vendor/rector/rector/stubs-rector/Internal/NativeClasses.phpjQ8vendor/rector/rector/stubs-rector/Internal/Constants.php^j^FȤ=vendor/rector/rector/stubs-rector/Internal/EnumInterfaces.phpjYj@vendor/rector/rector/stubs-rector/PHPUnit/Framework/TestCase.php?j?\Ԥ)vendor/sebastian/cli-parser/composer.jsonj[9_%vendor/sebastian/cli-parser/README.md+j+b'vendor/sebastian/cli-parser/SECURITY.mdujuKJ*vendor/sebastian/cli-parser/src/Parser.phpjjk 8vendor/sebastian/cli-parser/src/exceptions/Exception.phpljl@1Rvendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.phpj ?3Evendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php|j|Gvendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.phpj ,xUvendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.phpjw(vendor/sebastian/cli-parser/ChangeLog.mdLjL#vendor/sebastian/cli-parser/LICENSEjk(vendor/sebastian/code-unit/composer.jsonjˆ$vendor/sebastian/code-unit/README.mdjsρ&vendor/sebastian/code-unit/SECURITY.mdPjPE >Ϥ6vendor/sebastian/code-unit/src/InterfaceMethodUnit.phpjl`)vendor/sebastian/code-unit/src/Mapper.phpjXVX2vendor/sebastian/code-unit/src/ClassMethodUnit.php j J,vendor/sebastian/code-unit/src/TraitUnit.phpjTJ˿5vendor/sebastian/code-unit/src/CodeUnitCollection.phpjN'+vendor/sebastian/code-unit/src/FileUnit.phpj=vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.phpUjU%|7vendor/sebastian/code-unit/src/exceptions/Exception.phpjjjwk>vendor/sebastian/code-unit/src/exceptions/NoTraitException.phpjΤAvendor/sebastian/code-unit/src/exceptions/ReflectionException.phpjOFvendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.phpj6*a2vendor/sebastian/code-unit/src/TraitMethodUnit.php j  1Z+vendor/sebastian/code-unit/src/CodeUnit.php30j30=i/vendor/sebastian/code-unit/src/FunctionUnit.phpjrY0vendor/sebastian/code-unit/src/InterfaceUnit.phpj=%t,vendor/sebastian/code-unit/src/ClassUnit.phpjm='vendor/sebastian/code-unit/ChangeLog.md j G3"vendor/sebastian/code-unit/LICENSEjP@٤7vendor/sebastian/code-unit-reverse-lookup/composer.jsonAjAT솤3vendor/sebastian/code-unit-reverse-lookup/README.mdj=8 5vendor/sebastian/code-unit-reverse-lookup/SECURITY.mdPjPE >Ϥ8vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php j 26vendor/sebastian/code-unit-reverse-lookup/ChangeLog.mdjцd1vendor/sebastian/code-unit-reverse-lookup/LICENSEjf)vendor/sebastian/comparator/composer.json$j$%vendor/sebastian/comparator/README.md;j;'vendor/sebastian/comparator/SECURITY.mdujuKJ7vendor/sebastian/comparator/src/ExceptionComparator.phpj'5vendor/sebastian/comparator/src/DOMNodeComparator.phpC jC 4vendor/sebastian/comparator/src/ScalarComparator.php j 6vendor/sebastian/comparator/src/DateTimeComparator.php j ɏ>[.vendor/sebastian/comparator/src/Comparator.phpFjF0t5vendor/sebastian/comparator/src/ComparisonFailure.phpjC-3vendor/sebastian/comparator/src/ArrayComparator.php:j:ԯ5vendor/sebastian/comparator/src/NumericComparator.phpjZpR+vendor/sebastian/comparator/src/Factory.phpX jX + [8vendor/sebastian/comparator/src/exceptions/Exception.phpmjmt ?vendor/sebastian/comparator/src/exceptions/RuntimeException.phpjӤ>vendor/sebastian/comparator/src/SplObjectStorageComparator.phpjpr8vendor/sebastian/comparator/src/MockObjectComparator.php8j84vendor/sebastian/comparator/src/ObjectComparator.phpE jE bkA$6vendor/sebastian/comparator/src/ResourceComparator.phpj:H2vendor/sebastian/comparator/src/TypeComparator.phpjq(vendor/sebastian/comparator/ChangeLog.mdj^#vendor/sebastian/comparator/LICENSEj^2)vendor/sebastian/complexity/composer.json;j;N2ˤ%vendor/sebastian/complexity/README.mdj['vendor/sebastian/complexity/SECURITY.mdujuKJHvendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php j %#2Rvendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.phpj;ɽ,.vendor/sebastian/complexity/src/Calculator.php9 j9 $7vendor/sebastian/complexity/src/Exception/Exception.phpmjm->vendor/sebastian/complexity/src/Exception/RuntimeException.phpjlE9vendor/sebastian/complexity/src/Complexity/Complexity.php;j; Kvendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.phpjhCvendor/sebastian/complexity/src/Complexity/ComplexityCollection.phpm jm xh(vendor/sebastian/complexity/ChangeLog.mdjH#vendor/sebastian/complexity/LICENSEjP@٤#vendor/sebastian/diff/composer.jsonjYvendor/sebastian/diff/README.mdx jx Z!vendor/sebastian/diff/SECURITY.mdujuKJOvendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.phps js >A$vendor/sebastian/diff/src/Parser.phpn jn F1vendor/sebastian/diff/src/Exception/Exception.phpaja>f>vendor/sebastian/diff/src/Exception/ConfigurationException.phpj)@vendor/sebastian/diff/src/Exception/InvalidArgumentException.phpjL}f#vendor/sebastian/diff/src/Chunk.php j cݤ:vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php1j1M'?vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php j 0?vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.phpjwCvendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php*j*K5P=vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php j s"vendor/sebastian/diff/src/Diff.phpWjWsv."vendor/sebastian/diff/src/Line.phpjRMvendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php@ j@ KU{@vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.phpj>D$vendor/sebastian/diff/src/Differ.phpMjMƤ"vendor/sebastian/diff/ChangeLog.mdjAvendor/sebastian/diff/LICENSEjܡ7*vendor/sebastian/environment/composer.json?j?BB&vendor/sebastian/environment/README.mdfjf٤(vendor/sebastian/environment/SECURITY.mdujuKJ,vendor/sebastian/environment/src/Runtime.phpjF,vendor/sebastian/environment/src/Console.phpj_B9)vendor/sebastian/environment/ChangeLog.md j WĤ$vendor/sebastian/environment/LICENSEj'|'vendor/sebastian/exporter/composer.jsonAjA#vendor/sebastian/exporter/README.md j _P%vendor/sebastian/exporter/SECURITY.mdujuKJ*vendor/sebastian/exporter/src/Exporter.php6&j6&[{&vendor/sebastian/exporter/ChangeLog.mdwjwMä!vendor/sebastian/exporter/LICENSEj^2+vendor/sebastian/global-state/composer.jsonjƤ'vendor/sebastian/global-state/README.mdKjKM)vendor/sebastian/global-state/SECURITY.mdujuKJ.vendor/sebastian/global-state/src/Snapshot.phpi(ji(q.vendor/sebastian/global-state/src/Restorer.php j vl1vendor/sebastian/global-state/src/ExcludeList.php j 2vendor/sebastian/global-state/src/CodeExporter.php> j> k:vendor/sebastian/global-state/src/exceptions/Exception.phppjp Avendor/sebastian/global-state/src/exceptions/RuntimeException.phpjpƤ*vendor/sebastian/global-state/ChangeLog.mdMjM,Kf%vendor/sebastian/global-state/LICENSEjik,vendor/sebastian/lines-of-code/composer.jsonFjFw(vendor/sebastian/lines-of-code/README.md=j=Τ*vendor/sebastian/lines-of-code/SECURITY.mdujuKJ:vendor/sebastian/lines-of-code/src/LineCountingVisitor.php j kJM:vendor/sebastian/lines-of-code/src/Exception/Exception.phpqjq0+Ivendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.phpj Avendor/sebastian/lines-of-code/src/Exception/RuntimeException.phpj/Gvendor/sebastian/lines-of-code/src/Exception/NegativeValueException.phpjy<2vendor/sebastian/lines-of-code/src/LinesOfCode.php^ j^ s.vendor/sebastian/lines-of-code/src/Counter.php j i辪+vendor/sebastian/lines-of-code/ChangeLog.mdjD㩤&vendor/sebastian/lines-of-code/LICENSEjP@٤0vendor/sebastian/object-enumerator/composer.jsonja&,vendor/sebastian/object-enumerator/README.mdj_`U.vendor/sebastian/object-enumerator/SECURITY.mdPjPE >Ϥ5vendor/sebastian/object-enumerator/src/Enumerator.php)j)3.vendor/sebastian/object-enumerator/phpunit.xmljx/vendor/sebastian/object-enumerator/ChangeLog.md j *vendor/sebastian/object-enumerator/LICENSEjf/vendor/sebastian/object-reflector/composer.jsonjp+vendor/sebastian/object-reflector/README.mdjɤ-vendor/sebastian/object-reflector/SECURITY.mdPjPE >Ϥ9vendor/sebastian/object-reflector/src/ObjectReflector.phpjt.vendor/sebastian/object-reflector/ChangeLog.mdja)vendor/sebastian/object-reflector/LICENSEjR60vendor/sebastian/recursion-context/composer.jsonjzWq,vendor/sebastian/recursion-context/README.md-j- >.vendor/sebastian/recursion-context/SECURITY.mdujuKJ2vendor/sebastian/recursion-context/src/Context.php<j<,/vendor/sebastian/recursion-context/ChangeLog.mdjKdj*vendor/sebastian/recursion-context/LICENSEj^2#vendor/sebastian/type/composer.jsonjMjvendor/sebastian/type/README.mdjM˳!vendor/sebastian/type/SECURITY.mdPjPE >Ϥ&vendor/sebastian/type/src/TypeName.php@j@X钤.vendor/sebastian/type/src/type/UnknownType.php j ?Ȥ4vendor/sebastian/type/src/type/GenericObjectType.phpj@5,vendor/sebastian/type/src/type/UnionType.php j i-vendor/sebastian/type/src/type/StaticType.phpjӆs'vendor/sebastian/type/src/type/Type.phpjP^++vendor/sebastian/type/src/type/VoidType.phpj+vendor/sebastian/type/src/type/TrueType.phpkjk幤,vendor/sebastian/type/src/type/NeverType.phpj ,vendor/sebastian/type/src/type/MixedType.phpjL/̤-vendor/sebastian/type/src/type/ObjectType.phpj-{/vendor/sebastian/type/src/type/IterableType.phpj2A-vendor/sebastian/type/src/type/SimpleType.php6j6Ť+vendor/sebastian/type/src/type/NullType.phpjo|,vendor/sebastian/type/src/type/FalseType.phppjpV!3vendor/sebastian/type/src/type/IntersectionType.php j <㤤/vendor/sebastian/type/src/type/CallableType.phpj/_Ȥ1vendor/sebastian/type/src/exception/Exception.phpajag@ɼ8vendor/sebastian/type/src/exception/RuntimeException.phpwjw56.vendor/sebastian/type/src/ReflectionMapper.php.j.@i'vendor/sebastian/type/src/Parameter.phpj "vendor/sebastian/type/ChangeLog.mdjyvendor/sebastian/type/LICENSEj $vendor/sebastian/type/infection.jsonj &vendor/sebastian/version/composer.jsonnjn"vendor/sebastian/version/README.mdjW$vendor/sebastian/version/SECURITY.mdPjPE >Ϥ(vendor/sebastian/version/src/Version.phpjBt vendor/sebastian/version/LICENSEjVoBvendor/slevomat/coding-standard/SlevomatCodingStandard/ruleset.xmljӒlNvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FixerHelper.phpj.=Qvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHintHelper.php*j*Rvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ConditionHelper.php(j(C\ФRvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SniffLocalCache.phpj71Qvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ReferencedName.phpJjJ@ Nvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/CatchHelper.phpjiPvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayKeyValue.phpejewRvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/NamespaceHelper.php3j3A},Qvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ConstantHelper.phpj^[pQvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FunctionHelper.php7Bj7BԠSvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationHelper.php"j";Uvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/PhpDocParserHelper.php;j;ZNSvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ParsedDocComment.php j 7Nvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayHelper.phpj_Ovendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/StringHelper.phpjaܤSvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/DocCommentHelper.phpwjwߦOvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/UseStatement.php j U*Vvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/IdentificatorHelper.php^j^Tvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/IndentationHelper.php\ j\ *KLJvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Comment.phpj?k;Lvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Attribute.phpjUvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/EmptyFileException.phpjFVvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SniffSettingsHelper.php j =!(Wvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php(j(\Nvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TokenHelper.php3j3 [xUvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/UseStatementHelper.phpJjJ!3Mvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation.phpojoaǤQvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/PropertyHelper.phpjMgRvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ParameterHelper.php}j}#Xvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TernaryOperatorHelper.phpjKNvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ClassHelper.php j oQvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/VariableHelper.phpjۭWvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ReferencedNameHelper.php<j<fKvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHint.phpjG Qvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SuppressHelper.php j MPvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/CommentHelper.php j ,Nvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ScopeHelper.phpjQMvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHelper.phpjx1 Rvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AttributeHelper.phpj Mvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/YodaHelper.php%j%L:cvendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TokenPointerOutOfBoundsException.phpjːavendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/AttributesOrderSniff.phpjЍ>svendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/DisallowMultipleAttributesPerLineSniff.php j ^ˤqvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/RequireAttributeAfterDocCommentSniff.php j <kvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/AttributeAndTargetSpacingSniff.phpjra&<kvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/DisallowAttributesJoiningSniff.php7j7`yvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceEqualOperatorSniff.phpjBFsvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireSingleLineConditionSniff.phpN jN Jтtvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireShortTernaryOperatorSniff.phpS jS \<yvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/LanguageConstructWithParenthesesSniff.phpP jP w,akvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/NewWithParenthesesSniff.php j Xuvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/BlockControlStructureSpacingSniff.php j 3X[6svendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.phpEjEf]bvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/EarlyExitSniff.php6j6/!qivendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractLineCondition.php0j0Ҥuvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessIfConditionWithReturnSniff.php)j)0ovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireTernaryOperatorSniff.phpa#ja#W3ovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessTernaryOperatorSniff.php j n'nvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/JumpStatementsSpacingSniff.phpjivvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullSafeObjectOperatorSniff.phpAjA>Ruvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowShortTernaryOperatorSniff.php[j[[Hwvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowNullSafeObjectOperatorSniff.php7j7XJvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowContinueWithoutIntegerOperandInSwitchSniff.phpqjq3rvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireMultiLineConditionSniff.phpjovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UnsupportedKeywordException.phppjpF ¤nvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/NewWithoutParenthesesSniff.php j šnvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireYodaComparisonSniff.phpj*xvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireMultiLineTernaryOperatorSniff.phpj]vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowTrailingMultiLineTernaryOperatorSniff.php j hDfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowEmptySniff.phpjo22tvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceOperatorSniff.phpj @nvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AssignmentInConditionSniff.php j Dovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/DisallowYodaComparisonSniff.phpjfCkfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php" j" A9evendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/SuperfluousTraitNamingSniff.phpj&^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/EnumCaseSpacingSniff.phpdjdRfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassConstantVisibilitySniff.php j RZhvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/UnsupportedClassGroupException.php2j2hqw]vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php)mj)mevendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/SuperfluousErrorNamingSniff.phpjO<^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseSpacingSniff.php&j&>nvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowMultiPropertyDefinitionSniff.phpjOavendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/AbstractMethodSignature.php j )פdvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/BackedEnumTypeSpacingSniff.phpy jy &:evendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/MissingClassGroupsException.phpj Hevendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireAbstractOrFinalSniff.phpj,tvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowStringExpressionPropertyFetchSniff.phpjjfmvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/SuperfluousAbstractClassNamingSniff.php:j:~$Фtvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/AbstractPropertyConstantAndEnumCaseSpacing.phpj2 ivendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/SuperfluousInterfaceNamingSniff.phpjñ]avendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassMemberSpacingSniff.php"j"\h Zvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassLengthSniff.phpjuդnvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireMultiLineMethodSignatureSniff.phpjK\`vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ParentCallSpacingSniff.php| j| kn^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ConstantSpacingSniff.phpJ jJ Kjvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/EmptyLinesAroundClassBracesSniff.php{j{ ?(^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/PropertySpacingSniff.phpu ju eYovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireSingleLineMethodSignatureSniff.php j EZrbvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseDeclarationSniff.php j ;ivendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/SuperfluousExceptionNamingSniff.php$j$[פsvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowConstructorPropertyPromotionSniff.phpj+0nvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowMultiConstantDefinitionSniff.phpgjgJcgvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/UselessLateStaticBindingSniff.php j 6*1tvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowLateStaticBindingForConstantsSniff.php*j*Pacvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireSelfReferenceSniff.php j  {<gvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ModernClassNameReferenceSniff.phpj vbvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/PropertyDeclarationSniff.php[3j[3Urvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireConstructorPropertyPromotionSniff.php /j /ő\vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/MethodSpacingSniff.phpj[>|fvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSpacingSniff.phpj^+fvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowMixedTypeHintSniff.phpj^Ӥdvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UnionTypeHintFormatSniff.php4 j4 `_vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php]j]-q1bvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ParameterTypeHintSniff.phpVjVu4hvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UselessConstantTypeHintSniff.phpM jM vpvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/NullableTypeForNullDefaultValueSniff.php j ivendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ParameterTypeHintSpacingSniff.phpjLcvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php!j!4plvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniff.php!j!R mbvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DNFTypeHintFormatSniff.php+j+6Фkvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/NullTypeHintOnLastPositionSniff.php j ^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/LongTypeHintsSniff.php! j! ~fvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ClassConstantTypeHintSniff.php}j}2tavendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/PropertyTypeHintSniff.phpTjT'mvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/InlineDocCommentDeclarationSniff.php7j7kvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/UselessFunctionDocCommentSniff.phpjQ!jvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowCommentAfterCodeSniff.phpj4qvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DeprecatedAnnotationDeclarationSniff.php.j.Lcvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenCommentsSniff.phpjTJ^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/EmptyCommentSniff.phpjjmvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/AbstractRequireOneLineDocComment.php2j2؂B`vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/AnnotationNameSniff.phpj"Jjvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/UselessInheritDocCommentSniff.php j Psvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowOneLinePropertyDocCommentSniff.php j prŤrvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/RequireOneLinePropertyDocCommentSniff.phpjfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenAnnotationsSniff.phpNjNjvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/RequireOneLineDocCommentSniff.php8j8ocvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DocCommentSpacingSniff.phpdjd72Zvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireOnlyStandaloneIncrementAndDecrementOperatorsSniff.phpjgC)gvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/DisallowEqualOperatorsSniff.phpaja[XbPhvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/NegationOperatorSpacingSniff.php: j: V8Τrvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireCombinedAssignmentOperatorSniff.php/j/,=ˤfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/SpreadOperatorSpacingSniff.php j  1wvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/DisallowIncrementAndDecrementOperatorsSniff.php j o2[vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Complexity/CognitiveSniff.phpX jX ndovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedGlobalFunctionsSniff.phpjuvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedClassNameInAnnotationSniff.phpEjE<܈hvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/ReferenceUsedNamesOnlySniff.phpfjf6CK\vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UnusedUsesSniff.php$j$)*\vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseSpacingSniff.phpB+jB+wJnvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseDoesNotStartWithBackslashSniff.phpj5Mfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/NamespaceDeclarationSniff.phpjMevendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/MultipleUsesPerLineSniff.phpjbvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/DisallowGroupUseSniff.php j 4 Ťbvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/NamespaceSpacingSniff.phpjH?2fvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseFromSameNamespaceSniff.phpjovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedGlobalConstantsSniff.phpj\^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UselessAliasSniff.phpj!Mkvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/RequireOneNamespaceInFileSniff.phpj\Trvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AbstractFullyQualifiedGlobalReference.php?j?JLjvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedExceptionsSniff.php2j2Vnvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseOnlyWhitelistedNamespacesSniff.phpkjk5 tjvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AlphabeticallySortedUsesSniff.phpj=gݤ[vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/DeadCatchSniff.phpjԤMkvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/DisallowNonCapturingCatchSniff.php?j?|tƤhvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/ReferenceThrowableOnlySniff.php@j@~"jvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/RequireNonCapturingCatchSniff.php.j.oޤbvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/FilepathNamespaceExtractor.phpj RgWvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/LineLengthSniff.php j =dvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/TypeNameMatchesFileNameSniff.phpjpYWvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/FileLengthSniff.php:j: 񡒤fvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Strings/DisallowVariableParsingSniff.phpejedziJvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TestCase.phpj7Ҙhvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/AlphabeticallySortedByKeysSniff.phpj<ƤYvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/ArrayAccessSniff.phpdjdZ}Jgvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/SingleLineArrayWhitespaceSniff.phpj}dvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowPartiallyKeyedSniff.phpjM`5ovendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/MultiLineArrayEndBracketPlacementSniff.php j ñkvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowImplicitArrayCreationSniff.phpk jk H `vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/TrailingArrayCommaSniff.phpj6y=`vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/UnusedParameterSniff.php j olvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/DisallowTrailingCommaInCallSniff.phpU jU x^evendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireArrowFunctionSniff.phpj!evendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireMultiLineCallSniff.php!j!}cpwvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/UnusedInheritedVariablePassedToClosureSniff.php3j3{4\vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/AbstractLineCall.php` j` 9xsvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/DisallowTrailingCommaInDeclarationSniff.phpjy Sevendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/NamedArgumentSpacingSniff.phpj(jfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireSingleLineCallSniff.php~j~?7mvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/UselessParameterDefaultValueSniff.phpjkvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireTrailingCommaInCallSniff.php j 8:[vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/StrictCallSniff.phpv jv 7%fvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/DisallowEmptyFunctionSniff.php"j"`qvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireTrailingCommaInClosureUseSniff.phpjF0^vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/StaticClosureSniff.phpC jC BXivendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/ArrowFunctionDeclarationSniff.php;j;ypfvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/DisallowArrowFunctionSniff.phpj~z_vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/FunctionLengthSniff.phpxjxdervendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/DisallowTrailingCommaInClosureUseSniff.phpP jP Ɛ .gvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/DisallowNamedArgumentsSniff.phpj Τrvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireTrailingCommaInDeclarationSniff.phpj.bvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Whitespaces/DuplicateSpacesSniff.phpgjg#Rivendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/DisallowVariableVariableSniff.php(j( _vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php%Oj%OOn'nvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/DuplicateAssignmentToVariableSniff.php~j~ `vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php-.j-.7lvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/DisallowSuperGlobalVariableSniff.php/j/whvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/DisallowDirectMagicInvokeCallSniff.phpj~ؤ[vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ForbiddenClassesSniff.php j >3cvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/RequireExplicitAssertionSniff.php8j8#ӕ]vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/UselessParenthesesSniff.phpJjJܻ[vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/UselessSemicolonSniff.phpj6/\vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/DisallowReferenceSniff.phpj jj %n.Xvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/RequireNowdocSniff.phpjZFmvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/OptimizedFunctionsWithoutUnpackingSniff.phpjywVѤTvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ShortListSniff.php/j/[E[vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ReferenceSpacingSniff.phpjSvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/TypeCastSniff.phpX jX ]%mvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Numbers/RequireNumericLiteralSeparatorSniff.phptjtPyˤnvendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Numbers/DisallowNumericLiteralSeparatorSniff.phpjㄧ-vendor/slevomat/coding-standard/composer.jsonjQܤ)vendor/slevomat/coding-standard/README.md8uj8uM2vendor/slevomat/coding-standard/CODE_OF_CONDUCT.md j +6*vendor/slevomat/coding-standard/LICENSE.md=j=6vendor/slevomat/coding-standard/autoload-bootstrap.php#j#6Jd̤1vendor/slevomat/coding-standard/doc/namespaces.md j x٠.vendor/slevomat/coding-standard/doc/numbers.mdqjq Ɗ2vendor/slevomat/coding-standard/doc/whitespaces.mdojo!բ1vendor/slevomat/coding-standard/doc/type-hints.md*j*-vendor/slevomat/coding-standard/doc/arrays.mdMjM1vendor/slevomat/coding-standard/doc/exceptions.mdj.vendor/slevomat/coding-standard/doc/strings.mdj\0vendor/slevomat/coding-standard/doc/operators.mdqjqפ0vendor/slevomat/coding-standard/doc/variables.mdj@ʤ1vendor/slevomat/coding-standard/doc/complexity.md j ,C~,vendor/slevomat/coding-standard/doc/files.md) j) Pb.vendor/slevomat/coding-standard/doc/classes.mdJ7jJ7C{1vendor/slevomat/coding-standard/doc/attributes.mdj*vendor/slevomat/coding-standard/doc/php.mdX jX ^M9vendor/slevomat/coding-standard/doc/control-structures.mdL%jL%0vendor/slevomat/coding-standard/doc/functions.mdj(1vendor/slevomat/coding-standard/doc/commenting.mdjϤ#vendor/symfony/console/CHANGELOG.md j P!vendor/symfony/console/Cursor.php"j"і .vendor/symfony/console/Command/ListCommand.phpB jB Z$F0vendor/symfony/console/Command/LockableTrait.phpj8vendor/symfony/console/Command/DumpCompletionCommand.php=j="i5*vendor/symfony/console/Command/Command.phpPjP舢g.vendor/symfony/console/Command/LazyCommand.php j n_D=vendor/symfony/console/Command/SignalableCommandInterface.phpjGeM2vendor/symfony/console/Command/CompleteCommand.phpV!jV!!=N.vendor/symfony/console/Command/HelpCommand.php( j( ͚(vendor/symfony/console/ConsoleEvents.php~j~~6/vendor/symfony/console/Logger/ConsoleLogger.phpjU vendor/symfony/console/Color.phpj*vendor/symfony/console/Formatter/OutputFormatterStyleStack.php j d\8vendor/symfony/console/Formatter/NullOutputFormatter.phpYjYpɤ=vendor/symfony/console/Formatter/OutputFormatterInterface.php7j7?V8vendor/symfony/console/Output/ConsoleOutputInterface.php j _6vendor/symfony/console/Output/ConsoleSectionOutput.phpXjXGRä/vendor/symfony/console/Output/ConsoleOutput.php8j8S.1vendor/symfony/console/Output/OutputInterface.php\ j\ t,vendor/symfony/console/Output/NullOutput.php j Ф(vendor/symfony/console/Output/Output.php>j>~8.vendor/symfony/console/Output/StreamOutput.phpj0vendor/symfony/console/Output/BufferedOutput.phpUjUBE$ޤ5vendor/symfony/console/Output/TrimmedBufferOutput.php<j<k &vendor/symfony/console/Application.php.j.r&:vendor/symfony/console/LICENSE,j,U+vendor/symfony/console/Helper/HelperSet.php j AtW(vendor/symfony/console/Helper/Dumper.phpjڮ?9+vendor/symfony/console/Helper/TableCell.phpj.1vendor/symfony/console/Helper/HelperInterface.phpNjNԎD7vendor/symfony/console/Helper/SymfonyQuestionHelper.php j 3T/vendor/symfony/console/Helper/ProcessHelper.phpzjz3(vendor/symfony/console/Helper/Helper.phpBjBcE1vendor/symfony/console/Helper/FormatterHelper.phpX jX uwY2vendor/symfony/console/Helper/DescriptorHelper.php j X^}ߤ-vendor/symfony/console/Helper/ProgressBar.php"Ij"Iez3vendor/symfony/console/Helper/ProgressIndicator.phpjܤ,vendor/symfony/console/Helper/TableStyle.php1j1'vendor/symfony/console/Helper/Table.phptjtf: +vendor/symfony/console/Helper/TableRows.phpEjEa2vendor/symfony/console/Helper/InputAwareHelper.phpj0vendor/symfony/console/Helper/QuestionHelper.php5Lj5LM=0vendor/symfony/console/Helper/TableCellStyle.phpj-76vendor/symfony/console/Helper/DebugFormatterHelper.phpJ jJ G(0vendor/symfony/console/Helper/TableSeparator.phpj& 5vendor/symfony/console/Completion/CompletionInput.php j GY8Fvendor/symfony/console/Completion/Output/CompletionOutputInterface.phpj3OAvendor/symfony/console/Completion/Output/BashCompletionOutput.phpjS0vendor/symfony/console/Completion/Suggestion.phpjbۋ;vendor/symfony/console/Completion/CompletionSuggestions.phpNjN(4vendor/symfony/console/Descriptor/JsonDescriptor.phpjj0vendor/symfony/console/Descriptor/Descriptor.php j k%98vendor/symfony/console/Descriptor/MarkdownDescriptor.phpj4{<vendor/symfony/console/Descriptor/ApplicationDescription.phpj !3vendor/symfony/console/Descriptor/XmlDescriptor.php&j&5/4vendor/symfony/console/Descriptor/TextDescriptor.phpL1jL1ቜ9vendor/symfony/console/Descriptor/DescriptorInterface.php-j-0M$4vendor/symfony/console/Resources/bin/hiddeninput.exe$j$v0vendor/symfony/console/Resources/completion.bash j 'r/vendor/symfony/console/Style/StyleInterface.phpP jP p+Ť,vendor/symfony/console/Style/OutputStyle.php j -vendor/symfony/console/Style/SymfonyStyle.php(9j(91Ϥ4vendor/symfony/console/Event/ConsoleCommandEvent.php)j)6vendor/symfony/console/Event/ConsoleTerminateEvent.php"j"q3vendor/symfony/console/Event/ConsoleSignalEvent.phpjb-vendor/symfony/console/Event/ConsoleEvent.phptjt:[&2vendor/symfony/console/Event/ConsoleErrorEvent.phpj!38vendor/symfony/console/SignalRegistry/SignalRegistry.php1j1v.Dvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php"j"䪴2vendor/symfony/console/Question/ChoiceQuestion.phpj8vendor/symfony/console/Question/ConfirmationQuestion.phpj?uȤ,vendor/symfony/console/Question/Question.phpYjY91vendor/symfony/deprecation-contracts/CHANGELOG.mdjh{#2vendor/symfony/deprecation-contracts/composer.jsonIjI .vendor/symfony/deprecation-contracts/README.mdjX1vendor/symfony/deprecation-contracts/function.phpjOݤ,vendor/symfony/deprecation-contracts/LICENSE,j, K"vendor/symfony/finder/CHANGELOG.md j 3g%vendor/symfony/finder/SplFileInfo.phpj}#vendor/symfony/finder/composer.jsonjvendor/symfony/finder/README.mdjC9vendor/symfony/finder/Exception/AccessDeniedException.phpjcWޤ>vendor/symfony/finder/Exception/DirectoryNotFoundException.phpjRI3vendor/symfony/finder/Comparator/DateComparator.phpjY/vendor/symfony/finder/Comparator/Comparator.phpj2TG5vendor/symfony/finder/Comparator/NumberComparator.php j hMLۤvendor/symfony/finder/Glob.phpjm+G vendor/symfony/finder/Finder.php^j^Hmwvendor/symfony/finder/LICENSE,j,U;vendor/symfony/finder/Iterator/DepthRangeFilterIterator.phpbjb,/vendor/symfony/finder/Iterator/LazyIterator.phpj-9<vendor/symfony/finder/Iterator/FilecontentFilterIterator.phpj~ =vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php j D7vendor/symfony/finder/Iterator/CustomFilterIterator.phpj #9vendor/symfony/finder/Iterator/FilenameFilterIterator.phpQjQAvendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php j f1:vendor/symfony/finder/Iterator/SizeRangeFilterIterator.phpPjPgɤ;vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.phpnjnكt:vendor/symfony/finder/Iterator/DateRangeFilterIterator.phpyjy9vendor/symfony/finder/Iterator/FileTypeFilterIterator.phpojo"f3vendor/symfony/finder/Iterator/SortableIterator.phpj澺5vendor/symfony/finder/Iterator/PathFilterIterator.phpjdސ{=vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php(j( 襤#vendor/symfony/finder/Gitignore.php j k'+vendor/symfony/polyfill-ctype/bootstrap.php@j@jQ9+vendor/symfony/polyfill-ctype/composer.jsonje'vendor/symfony/polyfill-ctype/README.md^j^lHk%vendor/symfony/polyfill-ctype/LICENSE,j,-vendor/symfony/polyfill-ctype/bootstrap80.phprjrF)'vendor/symfony/polyfill-ctype/Ctype.phpj83vendor/symfony/polyfill-intl-grapheme/bootstrap.php8 j8 m3vendor/symfony/polyfill-intl-grapheme/composer.jsonjvs?/vendor/symfony/polyfill-intl-grapheme/README.mdj6-vendor/symfony/polyfill-intl-grapheme/LICENSE,j,H5vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpB jB `-2vendor/symfony/polyfill-intl-grapheme/Grapheme.php1j1j15vendor/symfony/polyfill-intl-normalizer/bootstrap.phpj#p 5vendor/symfony/polyfill-intl-normalizer/composer.jsonj rT1vendor/symfony/polyfill-intl-normalizer/README.mdj+tK/vendor/symfony/polyfill-intl-normalizer/LICENSE,j,H7vendor/symfony/polyfill-intl-normalizer/bootstrap80.phpj,Fvendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.phpj%Lvendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.phpD5jD5 Rvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.phpDjD'CԤTvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php{j{jeXvendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.phpojoc,6vendor/symfony/polyfill-intl-normalizer/Normalizer.phpd%jd%u-vendor/symfony/polyfill-mbstring/Mbstring.phpnjn<.vendor/symfony/polyfill-mbstring/bootstrap.php j Nc).vendor/symfony/polyfill-mbstring/composer.jsonjvE*vendor/symfony/polyfill-mbstring/README.mdrjrA`(vendor/symfony/polyfill-mbstring/LICENSE,j,H0vendor/symfony/polyfill-mbstring/bootstrap80.php'j' ~ @vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php_j_d@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.phpfjfPFvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php9j9>|zKBvendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.phpa ja |ⳤ+vendor/symfony/polyfill-php73/bootstrap.phpj|+vendor/symfony/polyfill-php73/composer.jsonjt'vendor/symfony/polyfill-php73/README.md/j/m%vendor/symfony/polyfill-php73/LICENSE,j,?vendor/symfony/polyfill-php73/Resources/stubs/JsonException.phpEjE8S'vendor/symfony/polyfill-php73/Php73.phpbjbJ<*vendor/symfony/polyfill-php80/PhpToken.phpjϴ+vendor/symfony/polyfill-php80/bootstrap.phpj.Ĥ+vendor/symfony/polyfill-php80/composer.jsonjJm'vendor/symfony/polyfill-php80/README.mdj"tF'vendor/symfony/polyfill-php80/Php80.php j )%vendor/symfony/polyfill-php80/LICENSE,j, KEvendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.phpGjGֈ+:vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.phpwjw=7T8;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.phpjMK<<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php>j>g<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpjt]\ڤ(vendor/symfony/process/PhpSubprocess.phpjgsg#vendor/symfony/process/CHANGELOG.mdj%8$vendor/symfony/process/composer.jsonjϱe/vendor/symfony/process/Pipes/PipesInterface.phpj\ *vendor/symfony/process/Pipes/UnixPipes.php5j5WŤ.vendor/symfony/process/Pipes/AbstractPipes.phpj-vendor/symfony/process/Pipes/WindowsPipes.phpj_ vendor/symfony/process/README.mdj\3$Ϥ=vendor/symfony/process/Exception/ProcessTimedOutException.phpjj#a=vendor/symfony/process/Exception/ProcessSignaledException.phpj47vendor/symfony/process/Exception/ExceptionInterface.phpj+5vendor/symfony/process/Exception/RuntimeException.phpj>H>vendor/symfony/process/Exception/RunProcessFailedException.phpjU-.3vendor/symfony/process/Exception/LogicException.phpjW=vendor/symfony/process/Exception/InvalidArgumentException.phpj˅;vendor/symfony/process/Exception/ProcessFailedException.phpjY'%vendor/symfony/process/PhpProcess.php j 'vendor/symfony/process/ProcessUtils.phpj0+vendor/symfony/process/ExecutableFinder.php j [bk6vendor/symfony/process/Messenger/RunProcessMessage.phpjQ6vendor/symfony/process/Messenger/RunProcessContext.phptjt䌻p=vendor/symfony/process/Messenger/RunProcessMessageHandler.phpj^|Ĥ.vendor/symfony/process/PhpExecutableFinder.php j 6˼"vendor/symfony/process/Process.phpjp&vendor/symfony/process/InputStream.php j HgKvendor/symfony/process/LICENSE,j,U?vendor/symfony/service-contracts/ServiceSubscriberInterface.php j Ŵ-vendor/symfony/service-contracts/CHANGELOG.mdjh{#.vendor/symfony/service-contracts/composer.jsonvjv6ʤ*vendor/symfony/service-contracts/README.mdJjJГ=vendor/symfony/service-contracts/ServiceProviderInterface.phpfjfΤ<vendor/symfony/service-contracts/ContainerAwareInterface.phpj?>ۤ7vendor/symfony/service-contracts/Attribute/Required.phpje;Z@vendor/symfony/service-contracts/Attribute/SubscribedService.phpjXѓ<vendor/symfony/service-contracts/Test/ServiceLocatorTest.php~j~Âs@vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php j p>8vendor/symfony/service-contracts/ServiceLocatorTrait.phpjv|3vendor/symfony/service-contracts/ResetInterface.php j 񁒳;vendor/symfony/service-contracts/ServiceSubscriberTrait.php j r(vendor/symfony/service-contracts/LICENSE,j,Bvendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.phpMjMjĤ?vendor/symfony/service-contracts/ServiceCollectionInterface.phprjrK0"vendor/symfony/string/CHANGELOG.mdzjzub3vendor/symfony/string/Inflector/FrenchInflector.phpKjKn@6vendor/symfony/string/Inflector/InflectorInterface.phpCjCQcc4vendor/symfony/string/Inflector/EnglishInflector.phpFjFΤ#vendor/symfony/string/composer.json4j4Y&W$vendor/symfony/string/ByteString.php>9j>9'vendor/symfony/string/UnicodeString.phpH5jH5% ävendor/symfony/string/README.md+j+L)vendor/symfony/string/CodePointString.php(j( M6vendor/symfony/string/Exception/ExceptionInterface.phpQjQ$դ4vendor/symfony/string/Exception/RuntimeException.phppjp0ʤ<vendor/symfony/string/Exception/InvalidArgumentException.phpje/vendor/symfony/string/AbstractUnicodeString.phphjh&U(vendor/symfony/string/AbstractString.phpIjI, $vendor/symfony/string/LazyString.phpojo jݤvendor/symfony/string/LICENSE,j,զ_Ϥ.vendor/symfony/string/Slugger/AsciiSlugger.phpjIVm2vendor/symfony/string/Slugger/SluggerInterface.phpj^-vendor/symfony/string/Resources/functions.phpTjT0<vendor/symfony/string/Resources/data/wcswidth_table_wide.php2j2?Y<vendor/symfony/string/Resources/data/wcswidth_table_zero.php]<j]<?p%vendor/theseer/tokenizer/CHANGELOG.md?j?/\&vendor/theseer/tokenizer/composer.json2j2xR"vendor/theseer/tokenizer/README.mdjR;*vendor/theseer/tokenizer/src/Exception.phpfjf0vendor/theseer/tokenizer/src/TokenCollection.phpj˜*vendor/theseer/tokenizer/src/Tokenizer.phpFjFJ 9vendor/theseer/tokenizer/src/TokenCollectionException.phptjtu6vendor/theseer/tokenizer/src/NamespaceUriException.phpqjq)0U.vendor/theseer/tokenizer/src/XMLSerializer.phpjO7&vendor/theseer/tokenizer/src/Token.phpjK>j-vendor/theseer/tokenizer/src/NamespaceUri.phpSjS vendor/theseer/tokenizer/LICENSEjR (&vendor/theseer/tokenizer/composer.lockjget(Application::class); $app->run();{ "name": "plesk/wappspector", "version": "0.2.8", "description": "Command-line interface utility to analyze the file structure of a web hosting server and identify the frameworks and CMS used in the websites hosted on it.", "type": "project", "license": "Apache-2.0", "bin": [ "bin/wappspector.php" ], "scripts": { "test": "phpunit", "rector": "rector --dry-run", "rector:fix": "rector", "lint": "phpcs -s --parallel=4", "lint:fix": "phpcbf", "ci:standards": "phpcs -s --parallel=4 --report=json", "ci:rector": "rector --dry-run --output-format=json" }, "scripts-descriptions": { "lint": "Run linters" }, "autoload": { "psr-4": { "Plesk\\Wappspector\\": "src/", "Test\\": "tests/" } }, "require-dev": { "mikey179/vfsstream": "^1.6", "phpunit/phpunit": "^10", "psr/log": "^2.0", "rector/rector": "^1.0", "slevomat/coding-standard": "^8.8.0", "squizlabs/php_codesniffer": "^3.7.2", "symfony/console": "^5.0" }, "require": { "php": ">=8.0", "clue/phar-composer": "^1.4", "league/flysystem": "^3.0", "php-di/php-di": "^6.0 || ^7.0" }, "config": { "sort-packages": true, "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true } } } # wappspector Command-line interface utility to analyze the file structure of a web hosting server and identify the frameworks and CMS used in the websites hosted on it. [![unit-test](https://github.com/plesk/wappspector/actions/workflows/unit-test.yml/badge.svg)](https://github.com/plesk/wappspector/actions/workflows/unit-test.yml) ## Matchers ### Technology & Frameworks | Technology | Version | Check type | |-------------|------------|----------------------------------| | PHP | - | Any `*.php` file | | Ruby | 2, 3 | `Rakefile` in root dir | | Python | 2, 3 | Any `*.py` file | | Laravel | 8, 9, 10 | `artisan` file in root dir | | Symfony | 3, 4, 5, 6 | `symfony.lock` file in root dir | | CodeIgniter | 4 | `spark` file in root dir | | CakePHP | 3, 4 | `bin/cake` file | | Yii | 2 | `yii` file in root dir | | Composer | - | `composer.json` file in root dir | | .NET | - | Any `*.dll` file | | Node.js | - | `package.json` file in root dir | ### CMS | Name | Major version | Check type | |------------|-------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | WordPress | 2 - 6 | Existence and contents of `wp-includes/version.php` | | Joomla! | 1 - 4 | Existence and contents of `configuration.php` in root dir | | Drupal | 6 - 10 | Existence and contents of `/modules/system/system.info` or `/core/modules/system/system.info.yml` | | PrestaShop | 1.6, 1.7.8, 8.0 | Existence and contents of `/config/settings.inc.php` | | TYPO3 | 7.6, 8.7, 9, 10, 11, 12 | Existence and contents of `/typo3/sysext/core/Classes/Core/SystemEnvironmentBuilder.php` or `/typo3/sysext/core/Classes/Information/Typo3Version.php` or `/t3lib/config_default.php` | ### Site builders | Name | Check type | |--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Sitejet | The `index.html` file exists and contains the `ed-element` and `webcard.apiHost=` strings | | WebPresenceBuilder | The `index.html` file contains the `` tag or contains the following DOM structure: the `div` tag with the `page` ID contains the `div` tags with the `watermark` and `layout` IDs | | Site.pro | The `sitepro` folder exists and the `sitepro` string is contained in the `web.config` or `.htaccess` files | | Duda.co | The `Style` folder contains the `desktop.css`, `mobile.css`, or `tablet.css` files. The style file contains the `dmDudaonePreviewBody` or `dudaSnipcartProductGalleryId` strings, or the `Scripts/runtime.js` file contains the `duda` string | | Siteplus | The `index.html` file exists and contains the `edit.site` string, and the `/bundle/publish/` directory exists and contains the `bundle.js` file. The `bundle.js` file contains the `siteplus` string | ## How to build phar ```shell composer global require clue/phar-composer composer install php -d phar.readonly=off ~/.composer/vendor/bin/phar-composer build . ``` Run the created `wappspector.phar`: ```shell ./wappspector.phar ./test-data ``` ## Changing matchers order To change the matchers order or to disable some of them, you should override `matchers` entry of DI container. ```php $diContainer = \Plesk\Wappspector\DIContainer::build(); $matchers = $diContainer->get('matchers'); array_unshift($matchers, \Some\New\Matcher::class); $diContainer->set('matchers', $matchers); ``` or ```php // only detect WordPress installs $diContainer = \Plesk\Wappspector\DIContainer::build(); $diContainer->set('matchers', [\Plesk\Wappspector\Matchers\Wordpress::class]); ``` ## Testing ```shell ./vendor/bin/phpunit ``` * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ setupEnvironment(); process(is_array($argv) ? $argv : array()); /** * Initializes various values * * @throws RuntimeException If uopz extension prevents exit calls */ function setupEnvironment() { ini_set('display_errors', 1); if (extension_loaded('uopz') && !(ini_get('uopz.disable') || ini_get('uopz.exit'))) { // uopz works at opcode level and disables exit calls if (function_exists('uopz_allow_exit')) { @uopz_allow_exit(true); } else { throw new RuntimeException('The uopz extension ignores exit calls and breaks this installer.'); } } $installer = 'ComposerInstaller'; if (defined('PHP_WINDOWS_VERSION_MAJOR')) { if ($version = getenv('COMPOSERSETUP')) { $installer = sprintf('Composer-Setup.exe/%s', $version); } } define('COMPOSER_INSTALLER', $installer); } /** * Processes the installer */ function process($argv) { // Determine ANSI output from --ansi and --no-ansi flags setUseAnsi($argv); $help = in_array('--help', $argv) || in_array('-h', $argv); if ($help) { displayHelp(); exit(0); } $check = in_array('--check', $argv); $force = in_array('--force', $argv); $quiet = in_array('--quiet', $argv); $channel = 'stable'; if (in_array('--snapshot', $argv)) { $channel = 'snapshot'; } elseif (in_array('--preview', $argv)) { $channel = 'preview'; } elseif (in_array('--1', $argv)) { $channel = '1'; } elseif (in_array('--2', $argv)) { $channel = '2'; } elseif (in_array('--2.2', $argv)) { $channel = '2.2'; } $disableTls = in_array('--disable-tls', $argv); $installDir = getOptValue('--install-dir', $argv, false); $version = getOptValue('--version', $argv, false); $filename = getOptValue('--filename', $argv, 'composer.phar'); $cafile = getOptValue('--cafile', $argv, false); if (!checkParams($installDir, $version, $cafile)) { exit(1); } $ok = checkPlatform($warnings, $quiet, $disableTls, true); if ($check) { // Only show warnings if we haven't output any errors if ($ok) { showWarnings($warnings); showSecurityWarning($disableTls); } exit($ok ? 0 : 1); } if ($ok || $force) { if ($channel === '1' && !$quiet) { out('Warning: You forced the install of Composer 1.x via --1, but Composer 2.x is the latest stable version. Updating to it via composer self-update --stable is recommended.', 'error'); } $installer = new Installer($quiet, $disableTls, $cafile); if ($installer->run($version, $installDir, $filename, $channel)) { showWarnings($warnings); showSecurityWarning($disableTls); exit(0); } } exit(1); } /** * Displays the help */ function displayHelp() { echo << $value) { $next = $key + 1; if (0 === strpos($value, $opt)) { if ($optLength === strlen($value) && isset($argv[$next])) { return trim($argv[$next]); } else { return trim(substr($value, $optLength + 1)); } } } return $default; } /** * Checks that user-supplied params are valid * * @param mixed $installDir The required istallation directory * @param mixed $version The required composer version to install * @param mixed $cafile Certificate Authority file * * @return bool True if the supplied params are okay */ function checkParams($installDir, $version, $cafile) { $result = true; if (false !== $installDir && !is_dir($installDir)) { out("The defined install dir ({$installDir}) does not exist.", 'info'); $result = false; } if (false !== $version && 1 !== preg_match('/^\d+\.\d+\.\d+(\-(alpha|beta|RC)\d*)*$/', $version)) { out("The defined install version ({$version}) does not match release pattern.", 'info'); $result = false; } if (false !== $cafile && (!file_exists($cafile) || !is_readable($cafile))) { out("The defined Certificate Authority (CA) cert file ({$cafile}) does not exist or is not readable.", 'info'); $result = false; } return $result; } /** * Checks the platform for possible issues running Composer * * Errors are written to the output, warnings are saved for later display. * * @param array $warnings Populated by method, to be shown later * @param bool $quiet Quiet mode * @param bool $disableTls Bypass tls * @param bool $install If we are installing, rather than diagnosing * * @return bool True if there are no errors */ function checkPlatform(&$warnings, $quiet, $disableTls, $install) { getPlatformIssues($errors, $warnings, $install); // Make openssl warning an error if tls has not been specifically disabled if (isset($warnings['openssl']) && !$disableTls) { $errors['openssl'] = $warnings['openssl']; unset($warnings['openssl']); } if (!empty($errors)) { // Composer-Setup.exe uses "Some settings" to flag platform errors out('Some settings on your machine make Composer unable to work properly.', 'error'); out('Make sure that you fix the issues listed below and run this script again:', 'error'); outputIssues($errors); return false; } if (empty($warnings) && !$quiet) { out('All settings correct for using Composer', 'success'); } return true; } /** * Checks platform configuration for common incompatibility issues * * @param array $errors Populated by method * @param array $warnings Populated by method * @param bool $install If we are installing, rather than diagnosing * * @return bool If any errors or warnings have been found */ function getPlatformIssues(&$errors, &$warnings, $install) { $errors = array(); $warnings = array(); if ($iniPath = php_ini_loaded_file()) { $iniMessage = PHP_EOL.'The php.ini used by your command-line PHP is: ' . $iniPath; } else { $iniMessage = PHP_EOL.'A php.ini file does not exist. You will have to create one.'; } $iniMessage .= PHP_EOL.'If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.'; if (ini_get('detect_unicode')) { $errors['unicode'] = array( 'The detect_unicode setting must be disabled.', 'Add the following to the end of your `php.ini`:', ' detect_unicode = Off', $iniMessage ); } if (extension_loaded('suhosin')) { $suhosin = ini_get('suhosin.executor.include.whitelist'); $suhosinBlacklist = ini_get('suhosin.executor.include.blacklist'); if (false === stripos($suhosin, 'phar') && (!$suhosinBlacklist || false !== stripos($suhosinBlacklist, 'phar'))) { $errors['suhosin'] = array( 'The suhosin.executor.include.whitelist setting is incorrect.', 'Add the following to the end of your `php.ini` or suhosin.ini (Example path [for Debian]: /etc/php5/cli/conf.d/suhosin.ini):', ' suhosin.executor.include.whitelist = phar '.$suhosin, $iniMessage ); } } if (!function_exists('json_decode')) { $errors['json'] = array( 'The json extension is missing.', 'Install it or recompile php without --disable-json' ); } if (!extension_loaded('Phar')) { $errors['phar'] = array( 'The phar extension is missing.', 'Install it or recompile php without --disable-phar' ); } if (!extension_loaded('filter')) { $errors['filter'] = array( 'The filter extension is missing.', 'Install it or recompile php without --disable-filter' ); } if (!extension_loaded('hash')) { $errors['hash'] = array( 'The hash extension is missing.', 'Install it or recompile php without --disable-hash' ); } if (!extension_loaded('iconv') && !extension_loaded('mbstring')) { $errors['iconv_mbstring'] = array( 'The iconv OR mbstring extension is required and both are missing.', 'Install either of them or recompile php without --disable-iconv' ); } if (!ini_get('allow_url_fopen')) { $errors['allow_url_fopen'] = array( 'The allow_url_fopen setting is incorrect.', 'Add the following to the end of your `php.ini`:', ' allow_url_fopen = On', $iniMessage ); } if (extension_loaded('ionCube Loader') && ioncube_loader_iversion() < 40009) { $ioncube = ioncube_loader_version(); $errors['ioncube'] = array( 'Your ionCube Loader extension ('.$ioncube.') is incompatible with Phar files.', 'Upgrade to ionCube 4.0.9 or higher or remove this line (path may be different) from your `php.ini` to disable it:', ' zend_extension = /usr/lib/php5/20090626+lfs/ioncube_loader_lin_5.3.so', $iniMessage ); } if (version_compare(PHP_VERSION, '5.3.2', '<')) { $errors['php'] = array( 'Your PHP ('.PHP_VERSION.') is too old, you must upgrade to PHP 5.3.2 or higher.' ); } if (version_compare(PHP_VERSION, '5.3.4', '<')) { $warnings['php'] = array( 'Your PHP ('.PHP_VERSION.') is quite old, upgrading to PHP 5.3.4 or higher is recommended.', 'Composer works with 5.3.2+ for most people, but there might be edge case issues.' ); } if (!extension_loaded('openssl')) { $warnings['openssl'] = array( 'The openssl extension is missing, which means that secure HTTPS transfers are impossible.', 'If possible you should enable it or recompile php with --with-openssl' ); } if (extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < 0x1000100f) { // Attempt to parse version number out, fallback to whole string value. $opensslVersion = trim(strstr(OPENSSL_VERSION_TEXT, ' ')); $opensslVersion = substr($opensslVersion, 0, strpos($opensslVersion, ' ')); $opensslVersion = $opensslVersion ? $opensslVersion : OPENSSL_VERSION_TEXT; $warnings['openssl_version'] = array( 'The OpenSSL library ('.$opensslVersion.') used by PHP does not support TLSv1.2 or TLSv1.1.', 'If possible you should upgrade OpenSSL to version 1.0.1 or above.' ); } if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && ini_get('apc.enable_cli')) { $warnings['apc_cli'] = array( 'The apc.enable_cli setting is incorrect.', 'Add the following to the end of your `php.ini`:', ' apc.enable_cli = Off', $iniMessage ); } if (!$install && extension_loaded('xdebug')) { $warnings['xdebug_loaded'] = array( 'The xdebug extension is loaded, this can slow down Composer a little.', 'Disabling it when using Composer is recommended.' ); if (ini_get('xdebug.profiler_enabled')) { $warnings['xdebug_profile'] = array( 'The xdebug.profiler_enabled setting is enabled, this can slow down Composer a lot.', 'Add the following to the end of your `php.ini` to disable it:', ' xdebug.profiler_enabled = 0', $iniMessage ); } } if (!extension_loaded('zlib')) { $warnings['zlib'] = array( 'The zlib extension is not loaded, this can slow down Composer a lot.', 'If possible, install it or recompile php with --with-zlib', $iniMessage ); } if (defined('PHP_WINDOWS_VERSION_BUILD') && (version_compare(PHP_VERSION, '7.2.23', '<') || (version_compare(PHP_VERSION, '7.3.0', '>=') && version_compare(PHP_VERSION, '7.3.10', '<')))) { $warnings['onedrive'] = array( 'The Windows OneDrive folder is not supported on PHP versions below 7.2.23 and 7.3.10.', 'Upgrade your PHP ('.PHP_VERSION.') to use this location with Composer.' ); } if (extension_loaded('uopz') && !(ini_get('uopz.disable') || ini_get('uopz.exit'))) { $warnings['uopz'] = array( 'The uopz extension ignores exit calls and may not work with all Composer commands.', 'Disabling it when using Composer is recommended.' ); } ob_start(); phpinfo(INFO_GENERAL); $phpinfo = ob_get_clean(); if (preg_match('{Configure Command(?: *| *=> *)(.*?)(?:|$)}m', $phpinfo, $match)) { $configure = $match[1]; if (false !== strpos($configure, '--enable-sigchild')) { $warnings['sigchild'] = array( 'PHP was compiled with --enable-sigchild which can cause issues on some platforms.', 'Recompile it without this flag if possible, see also:', ' https://bugs.php.net/bug.php?id=22999' ); } if (false !== strpos($configure, '--with-curlwrappers')) { $warnings['curlwrappers'] = array( 'PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub.', 'Recompile it without this flag if possible' ); } } // Stringify the message arrays foreach ($errors as $key => $value) { $errors[$key] = PHP_EOL.implode(PHP_EOL, $value); } foreach ($warnings as $key => $value) { $warnings[$key] = PHP_EOL.implode(PHP_EOL, $value); } return !empty($errors) || !empty($warnings); } /** * Outputs an array of issues * * @param array $issues */ function outputIssues($issues) { foreach ($issues as $issue) { out($issue, 'info'); } out(''); } /** * Outputs any warnings found * * @param array $warnings */ function showWarnings($warnings) { if (!empty($warnings)) { out('Some settings on your machine may cause stability issues with Composer.', 'error'); out('If you encounter issues, try to change the following:', 'error'); outputIssues($warnings); } } /** * Outputs an end of process warning if tls has been bypassed * * @param bool $disableTls Bypass tls */ function showSecurityWarning($disableTls) { if ($disableTls) { out('You have instructed the Installer not to enforce SSL/TLS security on remote HTTPS requests.', 'info'); out('This will leave all downloads during installation vulnerable to Man-In-The-Middle (MITM) attacks', 'info'); } } /** * colorize output */ function out($text, $color = null, $newLine = true) { $styles = array( 'success' => "\033[0;32m%s\033[0m", 'error' => "\033[31;31m%s\033[0m", 'info' => "\033[33;33m%s\033[0m" ); $format = '%s'; if (isset($styles[$color]) && USE_ANSI) { $format = $styles[$color]; } if ($newLine) { $format .= PHP_EOL; } printf($format, $text); } /** * Returns the system-dependent Composer home location, which may not exist * * @return string */ function getHomeDir() { $home = getenv('COMPOSER_HOME'); if ($home) { return $home; } $userDir = getUserDir(); if (defined('PHP_WINDOWS_VERSION_MAJOR')) { return $userDir.'/Composer'; } $dirs = array(); if (useXdg()) { // XDG Base Directory Specifications $xdgConfig = getenv('XDG_CONFIG_HOME'); if (!$xdgConfig) { $xdgConfig = $userDir . '/.config'; } $dirs[] = $xdgConfig . '/composer'; } $dirs[] = $userDir . '/.composer'; // select first dir which exists of: $XDG_CONFIG_HOME/composer or ~/.composer foreach ($dirs as $dir) { if (is_dir($dir)) { return $dir; } } // if none exists, we default to first defined one (XDG one if system uses it, or ~/.composer otherwise) return $dirs[0]; } /** * Returns the location of the user directory from the environment * @throws RuntimeException If the environment value does not exists * * @return string */ function getUserDir() { $userEnv = defined('PHP_WINDOWS_VERSION_MAJOR') ? 'APPDATA' : 'HOME'; $userDir = getenv($userEnv); if (!$userDir) { throw new RuntimeException('The '.$userEnv.' or COMPOSER_HOME environment variable must be set for composer to run correctly'); } return rtrim(strtr($userDir, '\\', '/'), '/'); } /** * @return bool */ function useXdg() { foreach (array_keys($_SERVER) as $key) { if (strpos($key, 'XDG_') === 0) { return true; } } if (is_dir('/etc/xdg')) { return true; } return false; } function validateCaFile($contents) { // assume the CA is valid if php is vulnerable to // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html if ( PHP_VERSION_ID <= 50327 || (PHP_VERSION_ID >= 50400 && PHP_VERSION_ID < 50422) || (PHP_VERSION_ID >= 50500 && PHP_VERSION_ID < 50506) ) { return !empty($contents); } return (bool) openssl_x509_parse($contents); } class Installer { private $quiet; private $disableTls; private $cafile; private $displayPath; private $target; private $tmpFile; private $tmpCafile; private $baseUrl; private $algo; private $errHandler; private $httpClient; private $pubKeys = array(); private $installs = array(); /** * Constructor - must not do anything that throws an exception * * @param bool $quiet Quiet mode * @param bool $disableTls Bypass tls * @param mixed $cafile Path to CA bundle, or false */ public function __construct($quiet, $disableTls, $caFile) { if (($this->quiet = $quiet)) { ob_start(); } $this->disableTls = $disableTls; $this->cafile = $caFile; $this->errHandler = new ErrorHandler(); } /** * Runs the installer * * @param mixed $version Specific version to install, or false * @param mixed $installDir Specific installation directory, or false * @param string $filename Specific filename to save to, or composer.phar * @param string $channel Specific version channel to use * @throws Exception If anything other than a RuntimeException is caught * * @return bool If the installation succeeded */ public function run($version, $installDir, $filename, $channel) { try { $this->initTargets($installDir, $filename); $this->initTls(); $this->httpClient = new HttpClient($this->disableTls, $this->cafile); $result = $this->install($version, $channel); // in case --1 or --2 is passed, we leave the default channel for next self-update to stable if (1 === preg_match('{^\d+$}D', $channel)) { $channel = 'stable'; } if ($result && $channel !== 'stable' && !$version && defined('PHP_BINARY')) { $null = (defined('PHP_WINDOWS_VERSION_MAJOR') ? 'NUL' : '/dev/null'); @exec(escapeshellarg(PHP_BINARY) .' '.escapeshellarg($this->target).' self-update --'.$channel.' --set-channel-only -q > '.$null.' 2> '.$null, $output); } } catch (Exception $e) { $result = false; } // Always clean up $this->cleanUp($result); if (isset($e)) { // Rethrow anything that is not a RuntimeException if (!$e instanceof RuntimeException) { throw $e; } out($e->getMessage(), 'error'); } return $result; } /** * Initialization methods to set the required filenames and composer url * * @param mixed $installDir Specific installation directory, or false * @param string $filename Specific filename to save to, or composer.phar * @throws RuntimeException If the installation directory is not writable */ protected function initTargets($installDir, $filename) { $this->displayPath = ($installDir ? rtrim($installDir, '/').'/' : '').$filename; $installDir = $installDir ? realpath($installDir) : getcwd(); if (!is_writeable($installDir)) { throw new RuntimeException('The installation directory "'.$installDir.'" is not writable'); } $this->target = $installDir.DIRECTORY_SEPARATOR.$filename; $this->tmpFile = $installDir.DIRECTORY_SEPARATOR.basename($this->target, '.phar').'-temp.phar'; $uriScheme = $this->disableTls ? 'http' : 'https'; $this->baseUrl = $uriScheme.'://getcomposer.org'; } /** * A wrapper around methods to check tls and write public keys * @throws RuntimeException If SHA384 is not supported */ protected function initTls() { if ($this->disableTls) { return; } if (!in_array('sha384', array_map('strtolower', openssl_get_md_methods()))) { throw new RuntimeException('SHA384 is not supported by your openssl extension'); } $this->algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384'; $home = $this->getComposerHome(); $this->pubKeys = array( 'dev' => $this->installKey(self::getPKDev(), $home, 'keys.dev.pub'), 'tags' => $this->installKey(self::getPKTags(), $home, 'keys.tags.pub') ); if (empty($this->cafile) && !HttpClient::getSystemCaRootBundlePath()) { $this->cafile = $this->tmpCafile = $this->installKey(HttpClient::getPackagedCaFile(), $home, 'cacert-temp.pem'); } } /** * Returns the Composer home directory, creating it if required * @throws RuntimeException If the directory cannot be created * * @return string */ protected function getComposerHome() { $home = getHomeDir(); if (!is_dir($home)) { $this->errHandler->start(); if (!mkdir($home, 0777, true)) { throw new RuntimeException(sprintf( 'Unable to create Composer home directory "%s": %s', $home, $this->errHandler->message )); } $this->installs[] = $home; $this->errHandler->stop(); } return $home; } /** * Writes public key data to disc * * @param string $data The public key(s) in pem format * @param string $path The directory to write to * @param string $filename The name of the file * @throws RuntimeException If the file cannot be written * * @return string The path to the saved data */ protected function installKey($data, $path, $filename) { $this->errHandler->start(); $target = $path.DIRECTORY_SEPARATOR.$filename; $installed = file_exists($target); $write = file_put_contents($target, $data, LOCK_EX); @chmod($target, 0644); $this->errHandler->stop(); if (!$write) { throw new RuntimeException(sprintf('Unable to write %s to: %s', $filename, $path)); } if (!$installed) { $this->installs[] = $target; } return $target; } /** * The main install function * * @param mixed $version Specific version to install, or false * @param string $channel Version channel to use * * @return bool If the installation succeeded */ protected function install($version, $channel) { $retries = 3; $result = false; $infoMsg = 'Downloading...'; $infoType = 'info'; while ($retries--) { if (!$this->quiet) { out($infoMsg, $infoType); $infoMsg = 'Retrying...'; $infoType = 'error'; } if (!$this->getVersion($channel, $version, $url, $error)) { out($error, 'error'); continue; } if (!$this->downloadToTmp($url, $signature, $error)) { out($error, 'error'); continue; } if (!$this->verifyAndSave($version, $signature, $error)) { out($error, 'error'); continue; } $result = true; break; } if (!$this->quiet) { if ($result) { out(PHP_EOL."Composer (version {$version}) successfully installed to: {$this->target}", 'success'); out("Use it: php {$this->displayPath}", 'info'); out(''); } else { out('The download failed repeatedly, aborting.', 'error'); } } return $result; } /** * Sets the version url, downloading version data if required * * @param string $channel Version channel to use * @param false|string $version Version to install, or set by method * @param null|string $url The versioned url, set by method * @param null|string $error Set by method on failure * * @return bool If the operation succeeded */ protected function getVersion($channel, &$version, &$url, &$error) { $error = ''; if ($version) { if (empty($url)) { $url = $this->baseUrl."/download/{$version}/composer.phar"; } return true; } $this->errHandler->start(); if ($this->downloadVersionData($data, $error)) { $this->parseVersionData($data, $channel, $version, $url); } $this->errHandler->stop(); return empty($error); } /** * Downloads and json-decodes version data * * @param null|array $data Downloaded version data, set by method * @param null|string $error Set by method on failure * * @return bool If the operation succeeded */ protected function downloadVersionData(&$data, &$error) { $url = $this->baseUrl.'/versions'; $errFmt = 'The "%s" file could not be %s: %s'; if (!$json = $this->httpClient->get($url)) { $error = sprintf($errFmt, $url, 'downloaded', $this->errHandler->message); return false; } if (!$data = json_decode($json, true)) { $error = sprintf($errFmt, $url, 'json-decoded', $this->getJsonError()); return false; } return true; } /** * A wrapper around the methods needed to download and save the phar * * @param string $url The versioned download url * @param null|string $signature Set by method on successful download * @param null|string $error Set by method on failure * * @return bool If the operation succeeded */ protected function downloadToTmp($url, &$signature, &$error) { $error = ''; $errFmt = 'The "%s" file could not be downloaded: %s'; $sigUrl = $url.'.sig'; $this->errHandler->start(); if (!$fh = fopen($this->tmpFile, 'w')) { $error = sprintf('Could not create file "%s": %s', $this->tmpFile, $this->errHandler->message); } elseif (!$this->getSignature($sigUrl, $signature)) { $error = sprintf($errFmt, $sigUrl, $this->errHandler->message); } elseif (!fwrite($fh, $this->httpClient->get($url))) { $error = sprintf($errFmt, $url, $this->errHandler->message); } if (is_resource($fh)) { fclose($fh); } $this->errHandler->stop(); return empty($error); } /** * Verifies the downloaded file and saves it to the target location * * @param string $version The composer version downloaded * @param string $signature The digital signature to check * @param null|string $error Set by method on failure * * @return bool If the operation succeeded */ protected function verifyAndSave($version, $signature, &$error) { $error = ''; if (!$this->validatePhar($this->tmpFile, $pharError)) { $error = 'The download is corrupt: '.$pharError; } elseif (!$this->verifySignature($version, $signature, $this->tmpFile)) { $error = 'Signature mismatch, could not verify the phar file integrity'; } else { $this->errHandler->start(); if (!rename($this->tmpFile, $this->target)) { $error = sprintf('Could not write to file "%s": %s', $this->target, $this->errHandler->message); } chmod($this->target, 0755); $this->errHandler->stop(); } return empty($error); } /** * Parses an array of version data to match the required channel * * @param array $data Downloaded version data * @param mixed $channel Version channel to use * @param false|string $version Set by method * @param mixed $url The versioned url, set by method */ protected function parseVersionData(array $data, $channel, &$version, &$url) { foreach ($data[$channel] as $candidate) { if ($candidate['min-php'] <= PHP_VERSION_ID) { $version = $candidate['version']; $url = $this->baseUrl.$candidate['path']; break; } } if (!$version) { $error = sprintf( 'None of the %d %s version(s) of Composer matches your PHP version (%s / ID: %d)', count($data[$channel]), $channel, PHP_VERSION, PHP_VERSION_ID ); throw new RuntimeException($error); } } /** * Downloads the digital signature of required phar file * * @param string $url The signature url * @param null|string $signature Set by method on success * * @return bool If the download succeeded */ protected function getSignature($url, &$signature) { if (!$result = $this->disableTls) { $signature = $this->httpClient->get($url); if ($signature) { $signature = json_decode($signature, true); $signature = base64_decode($signature['sha384']); $result = true; } } return $result; } /** * Verifies the signature of the downloaded phar * * @param string $version The composer versione * @param string $signature The downloaded digital signature * @param string $file The temp phar file * * @return bool If the operation succeeded */ protected function verifySignature($version, $signature, $file) { if (!$result = $this->disableTls) { $path = preg_match('{^[0-9a-f]{40}$}', $version) ? $this->pubKeys['dev'] : $this->pubKeys['tags']; $pubkeyid = openssl_pkey_get_public('file://'.$path); $result = 1 === openssl_verify( file_get_contents($file), $signature, $pubkeyid, $this->algo ); // PHP 8 automatically frees the key instance and deprecates the function if (PHP_VERSION_ID < 80000) { openssl_free_key($pubkeyid); } } return $result; } /** * Validates the downloaded phar file * * @param string $pharFile The temp phar file * @param null|string $error Set by method on failure * * @return bool If the operation succeeded */ protected function validatePhar($pharFile, &$error) { if (ini_get('phar.readonly')) { return true; } try { // Test the phar validity $phar = new Phar($pharFile); // Free the variable to unlock the file unset($phar); $result = true; } catch (Exception $e) { if (!$e instanceof UnexpectedValueException && !$e instanceof PharException) { throw $e; } $error = $e->getMessage(); $result = false; } return $result; } /** * Returns a string representation of the last json error * * @return string The error string or code */ protected function getJsonError() { if (function_exists('json_last_error_msg')) { return json_last_error_msg(); } else { return 'json_last_error = '.json_last_error(); } } /** * Cleans up resources at the end of the installation * * @param bool $result If the installation succeeded */ protected function cleanUp($result) { if (!$result) { // Output buffered errors if ($this->quiet) { $this->outputErrors(); } // Clean up stuff we created $this->uninstall(); } elseif ($this->tmpCafile) { @unlink($this->tmpCafile); } } /** * Outputs unique errors when in quiet mode * */ protected function outputErrors() { $errors = explode(PHP_EOL, ob_get_clean()); $shown = array(); foreach ($errors as $error) { if ($error && !in_array($error, $shown)) { out($error, 'error'); $shown[] = $error; } } } /** * Uninstalls newly-created files and directories on failure * */ protected function uninstall() { foreach (array_reverse($this->installs) as $target) { if (is_file($target)) { @unlink($target); } elseif (is_dir($target)) { @rmdir($target); } } if ($this->tmpFile !== null && file_exists($this->tmpFile)) { @unlink($this->tmpFile); } } public static function getPKDev() { return <<message) { $this->message .= PHP_EOL; } $this->message .= preg_replace('{^file_get_contents\(.*?\): }', '', $msg); } /** * Starts error-handling if not already active * * Any message is cleared */ public function start() { if (!$this->active) { set_error_handler(array($this, 'handleError')); $this->active = true; } $this->message = ''; } /** * Stops error-handling if active * * Any message is preserved until the next call to start() */ public function stop() { if ($this->active) { restore_error_handler(); $this->active = false; } } } class NoProxyPattern { private $composerInNoProxy = false; private $rulePorts = array(); public function __construct($pattern) { $rules = preg_split('{[\s,]+}', $pattern, null, PREG_SPLIT_NO_EMPTY); if ($matches = preg_grep('{getcomposer\.org(?::\d+)?}i', $rules)) { $this->composerInNoProxy = true; foreach ($matches as $match) { if (strpos($match, ':') !== false) { list(, $port) = explode(':', $match); $this->rulePorts[] = (int) $port; } } } } /** * Returns true if NO_PROXY contains getcomposer.org * * @param string $url http(s)://getcomposer.org * * @return bool */ public function test($url) { if (!$this->composerInNoProxy) { return false; } if (empty($this->rulePorts)) { return true; } if (strpos($url, 'http://') === 0) { $port = 80; } else { $port = 443; } return in_array($port, $this->rulePorts); } } class HttpClient { /** @var null|string */ private static $caPath; private $options = array('http' => array()); private $disableTls = false; public function __construct($disableTls = false, $cafile = false) { $this->disableTls = $disableTls; if ($this->disableTls === false) { if (!empty($cafile) && !is_dir($cafile)) { if (!is_readable($cafile) || !validateCaFile(file_get_contents($cafile))) { throw new RuntimeException('The configured cafile (' .$cafile. ') was not valid or could not be read.'); } } $options = $this->getTlsStreamContextDefaults($cafile); $this->options = array_replace_recursive($this->options, $options); } } public function get($url) { $context = $this->getStreamContext($url); $result = file_get_contents($url, false, $context); if ($result && extension_loaded('zlib')) { $decode = false; foreach ($http_response_header as $header) { if (preg_match('{^content-encoding: *gzip *$}i', $header)) { $decode = true; continue; } elseif (preg_match('{^HTTP/}i', $header)) { $decode = false; } } if ($decode) { if (version_compare(PHP_VERSION, '5.4.0', '>=')) { $result = zlib_decode($result); } else { // work around issue with gzuncompress & co that do not work with all gzip checksums $result = file_get_contents('compress.zlib://data:application/octet-stream;base64,'.base64_encode($result)); } if (!$result) { throw new RuntimeException('Failed to decode zlib stream'); } } } return $result; } protected function getStreamContext($url) { if ($this->disableTls === false) { if (PHP_VERSION_ID < 50600) { $this->options['ssl']['SNI_server_name'] = parse_url($url, PHP_URL_HOST); } } // Keeping the above mostly isolated from the code copied from Composer. return $this->getMergedStreamContext($url); } protected function getTlsStreamContextDefaults($cafile) { $ciphers = implode(':', array( 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-AES256-GCM-SHA384', 'DHE-RSA-AES128-GCM-SHA256', 'DHE-DSS-AES128-GCM-SHA256', 'kEDH+AESGCM', 'ECDHE-RSA-AES128-SHA256', 'ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-SHA', 'ECDHE-ECDSA-AES128-SHA', 'ECDHE-RSA-AES256-SHA384', 'ECDHE-ECDSA-AES256-SHA384', 'ECDHE-RSA-AES256-SHA', 'ECDHE-ECDSA-AES256-SHA', 'DHE-RSA-AES128-SHA256', 'DHE-RSA-AES128-SHA', 'DHE-DSS-AES128-SHA256', 'DHE-RSA-AES256-SHA256', 'DHE-DSS-AES256-SHA', 'DHE-RSA-AES256-SHA', 'AES128-GCM-SHA256', 'AES256-GCM-SHA384', 'AES128-SHA256', 'AES256-SHA256', 'AES128-SHA', 'AES256-SHA', 'AES', 'CAMELLIA', 'DES-CBC3-SHA', '!aNULL', '!eNULL', '!EXPORT', '!DES', '!RC4', '!MD5', '!PSK', '!aECDH', '!EDH-DSS-DES-CBC3-SHA', '!EDH-RSA-DES-CBC3-SHA', '!KRB5-DES-CBC3-SHA', )); /** * CN_match and SNI_server_name are only known once a URL is passed. * They will be set in the getOptionsForUrl() method which receives a URL. * * cafile or capath can be overridden by passing in those options to constructor. */ $options = array( 'ssl' => array( 'ciphers' => $ciphers, 'verify_peer' => true, 'verify_depth' => 7, 'SNI_enabled' => true, ) ); /** * Attempt to find a local cafile or throw an exception. * The user may go download one if this occurs. */ if (!$cafile) { $cafile = self::getSystemCaRootBundlePath(); } if (is_dir($cafile)) { $options['ssl']['capath'] = $cafile; } elseif ($cafile) { $options['ssl']['cafile'] = $cafile; } else { throw new RuntimeException('A valid cafile could not be located automatically.'); } /** * Disable TLS compression to prevent CRIME attacks where supported. */ if (version_compare(PHP_VERSION, '5.4.13') >= 0) { $options['ssl']['disable_compression'] = true; } return $options; } /** * function copied from Composer\Util\StreamContextFactory::initOptions * * Any changes should be applied there as well, or backported here. * * @param string $url URL the context is to be used for * @return resource Default context * @throws \RuntimeException if https proxy required and OpenSSL uninstalled */ protected function getMergedStreamContext($url) { $options = $this->options; // Handle HTTP_PROXY/http_proxy on CLI only for security reasons if ((PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') && (!empty($_SERVER['HTTP_PROXY']) || !empty($_SERVER['http_proxy']))) { $proxy = parse_url(!empty($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']); } // Prefer CGI_HTTP_PROXY if available if (!empty($_SERVER['CGI_HTTP_PROXY'])) { $proxy = parse_url($_SERVER['CGI_HTTP_PROXY']); } // Override with HTTPS proxy if present and URL is https if (preg_match('{^https://}i', $url) && (!empty($_SERVER['HTTPS_PROXY']) || !empty($_SERVER['https_proxy']))) { $proxy = parse_url(!empty($_SERVER['https_proxy']) ? $_SERVER['https_proxy'] : $_SERVER['HTTPS_PROXY']); } // Remove proxy if URL matches no_proxy directive if (!empty($_SERVER['NO_PROXY']) || !empty($_SERVER['no_proxy']) && parse_url($url, PHP_URL_HOST)) { $pattern = new NoProxyPattern(!empty($_SERVER['no_proxy']) ? $_SERVER['no_proxy'] : $_SERVER['NO_PROXY']); if ($pattern->test($url)) { unset($proxy); } } if (!empty($proxy)) { $proxyURL = isset($proxy['scheme']) ? $proxy['scheme'] . '://' : ''; $proxyURL .= isset($proxy['host']) ? $proxy['host'] : ''; if (isset($proxy['port'])) { $proxyURL .= ":" . $proxy['port']; } elseif (strpos($proxyURL, 'http://') === 0) { $proxyURL .= ":80"; } elseif (strpos($proxyURL, 'https://') === 0) { $proxyURL .= ":443"; } // check for a secure proxy if (strpos($proxyURL, 'https://') === 0) { if (!extension_loaded('openssl')) { throw new RuntimeException('You must enable the openssl extension to use a secure proxy.'); } if (strpos($url, 'https://') === 0) { throw new RuntimeException('PHP does not support https requests through a secure proxy.'); } } // http(s):// is not supported in proxy $proxyURL = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyURL); $options['http'] = array( 'proxy' => $proxyURL, ); // add request_fulluri for http requests if ('http' === parse_url($url, PHP_URL_SCHEME)) { $options['http']['request_fulluri'] = true; } // handle proxy auth if present if (isset($proxy['user'])) { $auth = rawurldecode($proxy['user']); if (isset($proxy['pass'])) { $auth .= ':' . rawurldecode($proxy['pass']); } $auth = base64_encode($auth); $options['http']['header'] = "Proxy-Authorization: Basic {$auth}\r\n"; } } if (isset($options['http']['header'])) { $options['http']['header'] .= "Connection: close\r\n"; } else { $options['http']['header'] = "Connection: close\r\n"; } if (extension_loaded('zlib')) { $options['http']['header'] .= "Accept-Encoding: gzip\r\n"; } $options['http']['header'] .= "User-Agent: ".COMPOSER_INSTALLER."\r\n"; $options['http']['protocol_version'] = 1.1; $options['http']['timeout'] = 600; return stream_context_create($options); } /** * This method was adapted from Sslurp. * https://github.com/EvanDotPro/Sslurp * * (c) Evan Coury * * For the full copyright and license information, please see below: * * Copyright (c) 2013, Evan Coury * 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. * * 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. */ public static function getSystemCaRootBundlePath() { if (self::$caPath !== null) { return self::$caPath; } // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $envCertFile = getenv('SSL_CERT_FILE'); if ($envCertFile && is_readable($envCertFile) && validateCaFile(file_get_contents($envCertFile))) { return self::$caPath = $envCertFile; } // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $envCertDir = getenv('SSL_CERT_DIR'); if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) { return self::$caPath = $envCertDir; } $configured = ini_get('openssl.cafile'); if ($configured && strlen($configured) > 0 && is_readable($configured) && validateCaFile(file_get_contents($configured))) { return self::$caPath = $configured; } $configured = ini_get('openssl.capath'); if ($configured && is_dir($configured) && is_readable($configured)) { return self::$caPath = $configured; } $caBundlePaths = array( '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package) '/usr/ssl/certs/ca-bundle.crt', // Cygwin '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? '/etc/ssl/cert.pem', // OpenBSD '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package '/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package ); foreach ($caBundlePaths as $caBundle) { if (@is_readable($caBundle) && validateCaFile(file_get_contents($caBundle))) { return self::$caPath = $caBundle; } } foreach ($caBundlePaths as $caBundle) { $caBundle = dirname($caBundle); if (is_dir($caBundle) && glob($caBundle.'/*')) { return self::$caPath = $caBundle; } } return self::$caPath = false; } public static function getPackagedCaFile() { return <<addArgument('path', InputArgument::OPTIONAL, 'Root path', getcwd()); $this->addOption('json', '', InputOption::VALUE_NONE, 'JSON output'); $this->addOption('recursive', '', InputOption::VALUE_NEGATABLE, 'Traverse directories recursive', true); $this->addOption('depth', '', InputOption::VALUE_OPTIONAL, 'Depth of recurse', 1); $this->addOption( 'max', '', InputOption::VALUE_REQUIRED, 'Maximum number of technologies that can be found for directory. Default = 0 (no limit)', 0 ); } public function execute(InputInterface $input, OutputInterface $output): int { $isJson = (bool)$input->getOption('json'); $logger = new ConsoleLogger($output); $result = []; $matchersLimit = (int)$input->getOption('max'); try { foreach ($this->getPath($input) as $path) { $result = [...$result, ...$this->wappspector->run($path, '/', $matchersLimit)]; } $result = $this->filterResults($result); if ($isJson) { $this->jsonOutput($output, $result); return Command::SUCCESS; } $this->tableOutput($output, $result); return Command::SUCCESS; } catch (Throwable $exception) { $logger->error($exception->getMessage()); return Command::FAILURE; } } /** * @throws JsonException */ private function jsonOutput(OutputInterface $output, array $result): void { $output->writeln(json_encode($result, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } /** * @param MatchResultInterface[] $matchers * @return void */ private function tableOutput(OutputInterface $output, array $matchers): void { $rows = []; foreach ($matchers as $matchResult) { $rows[] = [ $matchResult->getId(), $matchResult->getName(), $matchResult->getPath(), $matchResult->getVersion() ?? '-', ]; } $table = new Table($output); $table ->setHeaders(['ID', 'Technology', 'Path', 'Version']) ->setRows($rows); $table->render(); } private function getPath(InputInterface $input): iterable { $path = $input->getArgument('path'); $path = realpath($path); if (!$input->getOption('recursive')) { yield $path; return; } $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS; $itFlags = RecursiveIteratorIterator::SELF_FIRST; $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, $flags), $itFlags); $it->setMaxDepth((int)$input->getOption('depth')); foreach ($it as $path => $item) { /** @var SplFileInfo $item */ if (str_contains($path, '/.')) { continue; } if (!$item->isDir()) { continue; } yield $path; } } /** * @param MatchResultInterface[] $result * @return MatchResultInterface[] */ private function filterResults(array $result): array { return array_values( array_filter($result, static function (MatchResultInterface $matcher) { static $uniq = []; $key = $matcher->getId() . ':' . $matcher->getPath(); if (array_key_exists($key, $uniq)) { return false; } $uniq[$key] = true; return true; }) ); } } fsFactory)($basePath); $result = []; /** @var MatcherInterface $matcher */ foreach ($this->matchers as $matcher) { if (($match = $matcher->match($fs, $path)) instanceof EmptyMatchResult) { continue; } $result[] = $match; if ($matchersLimit > 0 && count($result) >= $matchersLimit) { break; } } return $result; } } addDefinitions(__DIR__ . '/container.php'); return $containerBuilder->build(); } } path = (new WhitespacePathNormalizer())->normalizePath($this->path); } catch (PathTraversalDetected) { $this->path = '/'; } } public function getId(): string { return static::ID; } public function getName(): string { return static::NAME; } public function getPath(): string { return $this->path; } public function getVersion(): ?string { return $this->version; } public function getApplication(): ?string { return $this->application; } public function jsonSerialize(): array { return [ 'id' => $this->getId(), 'name' => $this->getName(), 'path' => $this->getPath(), 'version' => $this->getVersion(), 'application' => $this->getApplication(), ]; } public static function createById( string $id, ?string $path = null, ?string $version = null, ?string $application = null ): MatchResultInterface { $classname = match ($id) { CakePHP::ID => CakePHP::class, CodeIgniter::ID => CodeIgniter::class, Composer::ID => Composer::class, DotNet::ID => DotNet::class, Drupal::ID => Drupal::class, Joomla::ID => Joomla::class, Laravel::ID => Laravel::class, NodeJs::ID => NodeJs::class, Php::ID => Php::class, Prestashop::ID => Prestashop::class, Python::ID => Python::class, Ruby::ID => Ruby::class, Symfony::ID => Symfony::class, Typo3::ID => Typo3::class, Wordpress::ID => Wordpress::class, Yii::ID => Yii::class, Sitejet::ID => Sitejet::class, WebPresenceBuilder::ID => WebPresenceBuilder::class, Sitepro::ID => Sitepro::class, Duda::ID => Duda::class, Siteplus::ID => Siteplus::class, default => null, }; if (!$classname) { return new EmptyMatchResult(); } return new $classname(path: $path ?? '', version: $version, application: $application); } } [ Matchers\Wordpress::class, Matchers\Joomla::class, Matchers\Drupal::class, Matchers\Prestashop::class, Matchers\Typo3::class, Matchers\Laravel::class, Matchers\Symfony::class, Matchers\CodeIgniter::class, Matchers\CakePHP::class, Matchers\Yii::class, Matchers\DotNet::class, Matchers\Ruby::class, Matchers\Python::class, Matchers\NodeJs::class, Matchers\Sitejet::class, Matchers\WebPresenceBuilder::class, Matchers\Sitepro::class, Matchers\Duda::class, Matchers\Siteplus::class, // Low priority wrappers. Should go last. Matchers\Composer::class, Matchers\Php::class, ], Wappspector::class => static function (Container $container): Wappspector { $matchers = []; foreach ($container->get('matchers') as $matcher) { $matchers[] = $container->get($matcher); } return new Wappspector($container->get(FileSystemFactory::class), $matchers); }, Inspect::class => static function (ContainerInterface $container): Inspect { return new Inspect($container->get(Wappspector::class)); }, Application::class => static function (ContainerInterface $container): Application { $application = new Application('Wappspector'); $inspectCommand = $container->get(Inspect::class); $application->add($inspectCommand); $application->setDefaultCommand($inspectCommand->getName(), true); return $application; }, ]; fileExists(rtrim($path, '/') . '/' . self::RAKEFILE)) { return new EmptyMatchResult(); } return new MatchResult($path); } } '/config/settings.inc.php', 'regexp' => '/define\\(\'_PS_VERSION_\', \'(.+)\'\\)/', ], ]; /** * @throws FilesystemException */ public function match(Filesystem $fs, string $path): MatchResultInterface { foreach (self::VERSIONS as $version) { $versionFile = rtrim($path, '/') . '/' . $version['filename']; if (!$fs->fileExists($versionFile)) { continue; } return new MatchResult($path, $this->getVersion($version, $fs, $versionFile)); } return new EmptyMatchResult(); } public function getVersion(array $version, Filesystem $fs, string $versionFile): ?string { $result = null; try { if (preg_match($version['regexp'], $fs->read($versionFile), $matches) && count($matches) > 1) { $result = $matches[1]; } } catch (FilesystemException) { // ignore filesystem extensions } return $result; } } fileExists($path . '/' . self::ARTISAN)) { return new EmptyMatchResult(); } return new MatchResult($path, $this->detectVersion($path, $fs)); } private function detectVersion(string $path, Filesystem $fs): ?string { $result = null; $versionFile = $path . '/' . self::VERSION_FILE; if ($fs->fileExists($versionFile)) { preg_match("/VERSION\\s*=\\s*'([^']+)'/", $fs->read($versionFile), $matches); if ($matches !== []) { $result = $matches[1]; } } else { $composerJsonFile = $path . '/' . self::COMPOSER_JSON; if ($fs->fileExists($composerJsonFile)) { try { $json = json_decode($fs->read($composerJsonFile), true, 512, JSON_THROW_ON_ERROR); if ($laravelPackage = $json['require']['laravel/framework'] ?? null) { $result = str_replace('^', '', $laravelPackage); } } catch (JsonException) { // ignore composer.json errors } } } return $result; } } fileExists($path . '/spark')) { return new EmptyMatchResult(); } return new MatchResult($path, $this->detectVersion($fs, $path)); } /** * @throws FilesystemException */ private function detectVersion(Filesystem $fs, string $path): ?string { $versionFile = $path . '/vendor/codeigniter4/framework/system/CodeIgniter.php'; if (!$fs->fileExists($versionFile)) { return null; } preg_match("/CI_VERSION\\s*=\\s*'([^']+)'/", $fs->read($versionFile), $matches); if ($matches !== []) { return $matches[1]; } return null; } } fileExists($symfonyLockFile)) { return new EmptyMatchResult(); } $json = []; try { $json = json_decode($fs->read($symfonyLockFile), true, 512, JSON_THROW_ON_ERROR); } catch (JsonException) { // ignore symfony.lock errors } return new MatchResult($path, $json["symfony/framework-bundle"]["version"] ?? null); } } fileExists($path . '/bin/cake')) { return new EmptyMatchResult(); } $version = $this->detectVersion($fs, $path); return new MatchResult($path, $version); } private function detectVersion(Filesystem $fs, string $path): ?string { $version = null; $versionFile = $path . '/vendor/cakephp/cakephp/VERSION.txt'; if ($fs->fileExists($versionFile)) { $versionData = explode("\n", trim($fs->read($versionFile))); $version = trim(array_pop($versionData)); } return $version; } } listContents($path) as $item) { /** @var StorageAttributes $item */ if (!$item->isFile() || !str_ends_with($item->path(), '.dll')) { continue; } $handle = $fs->readStream($item->path()); $hex = bin2hex(fread($handle, 4)); if (str_contains($hex, self::HEX_SIGNATURE)) { return new MatchResult($path); } } return new EmptyMatchResult(); } } [ "/includes/version.php", "/libraries/joomla/version.php", "/libraries/cms/version/version.php", "/libraries/src/Version.php", ], "regex_release" => "/\\\$?RELEASE\s*=\s*'([\d.]+)';/", "regex_devlevel" => "/\\\$?DEV_LEVEL\s*=\s*'([^']+)';/", "regex_major" => "/\\\$?MAJOR_VERSION\s*=\s*([\d.]+);/", "regex_minor" => "/\\\$?MINOR_VERSION\s*=\s*([\d.]+);/", "regex_patch" => "/\\\$?PATCH_VERSION\s*=\s*([\d.]+);/", ]; /** * @throws FilesystemException */ private function isJoomla(Filesystem $fs, string $path): bool { $configFile = rtrim($path, '/') . '/' . self::CONFIG_FILE; if (!$fs->fileExists($configFile)) { return false; } $configContents = $fs->read($configFile); if ( stripos($configContents, 'JConfig') === false && stripos($configContents, 'mosConfig') === false ) { return false; } // False positive "Akeeba Backup Installer" if (stripos($configContents, 'class ABIConfiguration') !== false) { return false; } // False positive mock file in unit test folder if (stripos($configContents, 'Joomla.UnitTest') !== false) { return false; } // False positive mock file in unit test folder return stripos($configContents, "Joomla\Framework\Test") === false; } /** * @throws FilesystemException */ private function detectVersion(Filesystem $fs, string $path): ?string { // Iterate through version files foreach (self::VERSION['files'] as $file) { $versionFile = rtrim($path, '/') . '/' . $file; if (!$fs->fileExists($versionFile)) { continue; } $fileContents = $fs->read($versionFile); preg_match(self::VERSION['regex_major'], $fileContents, $major); preg_match(self::VERSION['regex_minor'], $fileContents, $minor); preg_match(self::VERSION['regex_patch'], $fileContents, $patch); if (count($major) && count($minor) && count($patch)) { return $major[1] . '.' . $minor[1] . '.' . $patch[1]; } if (count($major) && count($minor)) { return $major[1] . '.' . $minor[1] . 'x'; } if ($major !== []) { return $major[1] . '.x.x'; } // Legacy handling for all version < 3.8.0 preg_match(self::VERSION['regex_release'], $fileContents, $release); preg_match(self::VERSION['regex_devlevel'], $fileContents, $devlevel); if (count($release) && count($devlevel)) { return $release[1] . '.' . $devlevel[1]; } if ($release !== []) { return $release[1] . '.x'; } } return null; } /** * @throws FilesystemException */ public function match(Filesystem $fs, string $path): MatchResultInterface { if (!$this->isJoomla($fs, $path)) { return new EmptyMatchResult(); } return new MatchResult($path, $this->detectVersion($fs, $path)); } } listContents($path); foreach ($list as $item) { /** @var StorageAttributes $item */ if ($item->isFile() && str_ends_with($item->path(), '.php')) { return new MatchResult($path); } if ($item->isDir() && $item->path() === ltrim(rtrim($path, '/') . '/src', '/')) { return $this->match($fs, rtrim($path, '/') . '/src'); } } } catch (FilesystemException) { // skip dir if it is inaccessible } return new EmptyMatchResult(); } } read($versionFile), $matches); if ($matches !== []) { return $matches[1]; } return null; } /** * @throws FilesystemException */ private function isWordpress(Filesystem $fs, string $path): bool { $versionFile = rtrim($path, '/') . '/' . self::VERSION_FILE; if (!$fs->fileExists($versionFile)) { return false; } $fileContents = $fs->read($versionFile); return stripos($fileContents, '$wp_version =') !== false; } /** * @throws FilesystemException */ public function match(Filesystem $fs, string $path): MatchResultInterface { if (!$this->isWordpress($fs, $path)) { return new EmptyMatchResult(); } return new MatchResult($path, $this->detectVersion($fs, $path)); } } getCssFile($fs, $rTrimPath); $inspectorHelper = new InspectorHelper(); if ($cssFile !== null) { $cssFileContent = $fs->read($rTrimPath . $cssFile); if ( $inspectorHelper->fileContentContainsString($cssFileContent, 'dmDudaonePreviewBody') || $inspectorHelper->fileContentContainsString($cssFileContent, 'dudaSnipcartProductGalleryId') ) { return new MatchResult($path); } } if (!$fs->fileExists($rTrimPath . self::RUNTIME_JS_FILE)) { return new EmptyMatchResult(); } return $inspectorHelper->fileContainsString($fs, $rTrimPath . self::RUNTIME_JS_FILE, 'duda') ? new MatchResult($path) : new EmptyMatchResult(); } private function getCssFile(Filesystem $fs, string $path): ?string { foreach (self::CSS_FILES as $cssFile) { if ($fs->fileExists($path . $cssFile)) { return $cssFile; } } return null; } } safeScanDir($fs, $path); if ($matcher instanceof EmptyMatchResult) { $matcher = $this->safeScanDir($fs, rtrim($path) . '/../'); } return $matcher; } private function safeScanDir(Filesystem $fs, string $path): MatchResultInterface { try { $result = $this->doMatch($fs, $path); } catch (FilesystemException) { // skip dir if it is inaccessible $result = new EmptyMatchResult(); } return $result; } } fileExists($packageFile)) { return new EmptyMatchResult(); } $json = []; try { $json = json_decode($fs->read($packageFile), true, 512, JSON_THROW_ON_ERROR); } catch (JsonException) { // ignore package.json errors } return new MatchResult($path, null, $json['name'] ?? null); } } 'typo3/sysext/core/Classes/Information/Typo3Version.php', 'regexp' => '/VERSION = \'(.*?)\'/', ], [ 'filename' => 'typo3/sysext/core/Classes/Core/SystemEnvironmentBuilder.php', 'regexp' => '/define\\(\'TYPO3_version\', \'(.*?)\'\\)/', ], [ 'filename' => 't3lib/config_default.php', 'regexp' => '/TYPO_VERSION = \'(.*?)\'/', ], ]; public function match(Filesystem $fs, string $path): MatchResultInterface { foreach (self::VERSIONS as $version) { $versionFile = rtrim($path, '/') . '/' . $version['filename']; if (!$fs->fileExists($versionFile)) { continue; } if ($version = $this->detectVersion($version['regexp'], $versionFile, $fs)) { return new MatchResult($path, $version); } } return new EmptyMatchResult(); } public function detectVersion(string $regexPattern, string $versionFile, Filesystem $fs): ?string { try { preg_match($regexPattern, $fs->read($versionFile), $matches); return count($matches) > 1 ? $matches[1] : null; } catch (FilesystemException) { // ignore file reading problem return null; } } } getPath($path); if (!$fs->fileExists($composerJsonFile)) { return new EmptyMatchResult(); } $json = []; try { $json = json_decode($fs->read($composerJsonFile), true, 512, JSON_THROW_ON_ERROR); } catch (JsonException) { // ignore composer.json errors } return new MatchResult($path, $json['version'] ?? 'dev', $json['name'] ?? 'unknown'); } } fileExists($indexHtmlPath)) { return new EmptyMatchResult(); } $fileContent = $fs->read($indexHtmlPath); $inspectorHelper = new InspectorHelper(); return $inspectorHelper->fileContentContainsString($fileContent, 'ed-element') && $inspectorHelper->fileContentContainsString($fileContent, 'webcard.apiHost=') ? new MatchResult($path) : new EmptyMatchResult(); } } fileExists($indexHtmlPath)) { return new EmptyMatchResult(); } $fileContent = $fs->read($indexHtmlPath); $inspectorHelper = new InspectorHelper(); return $inspectorHelper->fileContentMatchesString( $fileContent, '//' ) || $this->fileContainsDOMStructure($fileContent) ? new MatchResult($path) : new EmptyMatchResult(); } private function fileContainsDOMStructure(string $fileContent): bool { $dom = new DOMDocument(); try { libxml_use_internal_errors(true); $domIsLoaded = $dom->loadHTML($fileContent); libxml_clear_errors(); } catch (Throwable) { return false; } if ($domIsLoaded === false) { return false; } $xpath = new DOMXPath($dom); // Find the
with id="page" $pageDiv = $xpath->query("//div[@id='page']"); if ($pageDiv->length === 0) { return false; } $pageNode = $pageDiv->item(0); // Check for direct children with the required IDs $watermarkDiv = $xpath->query("./div[@id='watermark']", $pageNode); $layoutDiv = $xpath->query("./div[@id='layout']", $pageNode); return $watermarkDiv->length > 0 && $layoutDiv->length > 0; } } 'yii', 'versionFile' => '/vendor/yiisoft/yii2/BaseYii.php', 'versionRegexp' => '/public static function getVersion\(\)\s*\{\s*return \'([^\']+)\';\s*}/', ], [ 'file' => 'framework/yiic', 'versionFile' => '/framework/YiiBase.php', 'versionRegexp' => '/public static function getVersion\(\)\s*\{\s*return \'([^\']+)\';\s*}/', ], ]; public function match(Filesystem $fs, string $path): MatchResultInterface { $path = rtrim($path, '/'); foreach (self::VERSIONS as $version) { if (!$fs->fileExists($path . '/' . $version['file'])) { continue; } return new MatchResult($path, $this->detectVersion($fs, $path, $version)); } return new EmptyMatchResult(); } private function detectVersion(Filesystem $fs, string $path, array $versionInfo): ?string { $version = null; $yii2VersionFile = $path . $versionInfo['versionFile']; if ($fs->fileExists($yii2VersionFile)) { preg_match($versionInfo['versionRegexp'], $fs->read($yii2VersionFile), $matches); if (isset($matches[1])) { $version = $matches[1]; } } return $version; } } listContents($path) as $item) { /** @var StorageAttributes $item */ if ($item->isFile() && str_ends_with($item->path(), '.py')) { return new MatchResult($path); } } return new EmptyMatchResult(); } } fileContainsString($fs, $rTrimPath . '/index.html', 'edit.site')) { return new EmptyMatchResult(); } if (!$fs->directoryExists($rTrimPath . self::PUBLISH_DIR_PATH)) { return new EmptyMatchResult(); } $publishDirList = $fs->listContents($rTrimPath . self::PUBLISH_DIR_PATH, false); // do not check if the item is a directory as on the server when the files a copied the type of the // directory is determined as 'file'. // By default, there should be just 1 directory in the publish directory $versionDirPath = $publishDirList->toArray()[0]['path'] ?? null; if ($versionDirPath === null) { return new EmptyMatchResult(); } return $inspectorHelper->fileContainsString($fs, $versionDirPath . '/bundle.js', 'siteplus') ? new MatchResult($rTrimPath, $this->getSiteplusVersion($versionDirPath)) : new EmptyMatchResult(); } private function getSiteplusVersion(string $versionDirPath): string { // get the last part of the path $versionDirPathParts = explode('/', $versionDirPath); return end($versionDirPathParts); } } directoryExists($siteproFolderPath)) { return new EmptyMatchResult(); } $inspectorHelper = new InspectorHelper(); return $inspectorHelper->fileContainsString($fs, $rTrimPath . '/web.config', 'sitepro') || $inspectorHelper->fileContainsString($fs, $rTrimPath . '/.htaccess', 'sitepro') ? new MatchResult($path) : new EmptyMatchResult(); } } 'modules/system/system.info', 'regex' => "/version\\s*=\\s*\"(\\d\\.[^']+)\"[\\s\\S]*project\\s*=\\s*\"drupal\"/", ], [ 'file' => 'core/modules/system/system.info.yml', 'regex' => "/version:\\s*'(\\d+\\.[^']+)'[\\s\\S]*project:\\s*'drupal'/", ], ]; /** * @throws FilesystemException */ public function match(Filesystem $fs, string $path): MatchResultInterface { // Iterate through version patterns foreach (self::VERSIONS as $version) { $versionFile = rtrim($path, '/') . '/' . $version['file']; if (!$fs->fileExists($versionFile)) { continue; } $version = $this->detectVersion($version['regex'], $versionFile, $fs); return new MatchResult($path, $version); } return new EmptyMatchResult(); } private function detectVersion(string $regexPattern, string $versionFile, Filesystem $fs): ?string { preg_match($regexPattern, $fs->read($versionFile), $matches); return count($matches) ? $matches[1] : null; } } fileExists($filePath) && str_contains($fs->read($filePath), $searchString); } } =5.3.6", "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5", "symfony/finder": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5", "symfony/process": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5" }, "require-dev": { "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "bin": [ "bin/phar-composer" ], "type": "library", "autoload": { "psr-4": { "Clue\\PharComposer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Christian Lück", "email": "christian@clue.engineering" } ], "description": "Simple phar creation for any project managed via Composer", "homepage": "https://github.com/clue/phar-composer", "keywords": [ "build process", "bundle dependencies", "composer", "executable phar", "phar" ], "support": { "issues": "https://github.com/clue/phar-composer/issues", "source": "https://github.com/clue/phar-composer/tree/v1.4.0" }, "funding": [ { "url": "https://clue.engineering/support", "type": "custom" }, { "url": "https://github.com/clue", "type": "github" } ], "time": "2022-02-14T11:28:08+00:00" }, { "name": "doctrine/inflector", "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^12.0 || ^13.0", "phpstan/phpstan": "^1.12 || ^2.0", "phpstan/phpstan-phpunit": "^1.4 || ^2.0", "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, { "name": "Roman Borschel", "email": "roman@code-factory.org" }, { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" } ], "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ "inflection", "inflector", "lowercase", "manipulation", "php", "plural", "singular", "strings", "uppercase", "words" ], "support": { "issues": "https://github.com/doctrine/inflector/issues", "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { "url": "https://www.patreon.com/phpdoctrine", "type": "patreon" }, { "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", "type": "tidelift" } ], "time": "2025-08-10T19:31:58+00:00" }, { "name": "guzzlehttp/guzzle", "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^2.3", "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "autoload": { "files": [ "src/functions_include.php" ], "psr-4": { "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Jeremy Lindblom", "email": "jeremeamia@gmail.com", "homepage": "https://github.com/jeremeamia" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], "description": "Guzzle is a PHP HTTP client library", "keywords": [ "client", "curl", "framework", "http", "http client", "psr-18", "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", "type": "tidelift" } ], "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", "keywords": [ "promise" ], "support": { "issues": "https://github.com/guzzle/promises/issues", "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", "type": "tidelift" } ], "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ "http", "message", "psr-7", "request", "response", "stream", "uri", "url" ], "support": { "issues": "https://github.com/guzzle/psr7/issues", "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], "time": "2026-03-10T16:41:02+00:00" }, { "name": "knplabs/packagist-api", "version": "v1.7.2", "source": { "type": "git", "url": "https://github.com/KnpLabs/packagist-api.git", "reference": "4feae228a4505c1cd817da61e752e5dea2b22c2d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/KnpLabs/packagist-api/zipball/4feae228a4505c1cd817da61e752e5dea2b22c2d", "reference": "4feae228a4505c1cd817da61e752e5dea2b22c2d", "shasum": "" }, "require": { "doctrine/inflector": "^1.0 || ^2.0", "guzzlehttp/guzzle": "^6.0 || ^7.0", "php": "^7.1 || ^8.0" }, "require-dev": { "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0", "squizlabs/php_codesniffer": "^3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-0": { "Packagist\\Api\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "KnpLabs Team", "homepage": "http://knplabs.com" } ], "description": "Packagist API client.", "homepage": "http://knplabs.com", "keywords": [ "api", "composer", "packagist" ], "support": { "issues": "https://github.com/KnpLabs/packagist-api/issues", "source": "https://github.com/KnpLabs/packagist-api/tree/v1.7.2" }, "time": "2022-03-01T08:20:15+00:00" }, { "name": "laravel/serializable-closure", "version": "v2.0.13", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.67|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Taylor Otwell", "email": "taylor@laravel.com" }, { "name": "Nuno Maduro", "email": "nuno@laravel.com" } ], "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": [ "closure", "laravel", "serializable" ], "support": { "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, "time": "2026-04-16T14:03:50+00:00" }, { "name": "league/flysystem", "version": "3.34.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", "shasum": "" }, "require": { "league/flysystem-local": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, "conflict": { "async-aws/core": "<1.19.0", "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", "phpseclib/phpseclib": "3.0.15", "symfony/http-client": "<5.2" }, "require-dev": { "async-aws/s3": "^1.5 || ^2.0", "async-aws/simple-s3": "^1.1 || ^2.0", "aws/aws-sdk-php": "^3.295.10", "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", "sabre/dav": "^4.6.0" }, "type": "library", "autoload": { "psr-4": { "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "description": "File storage abstraction for PHP", "keywords": [ "WebDAV", "aws", "cloud", "file", "files", "filesystem", "filesystems", "ftp", "s3", "sftp", "storage" ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", "source": "https://github.com/thephpleague/flysystem/tree/3.34.0" }, "time": "2026-05-14T10:28:08+00:00" }, { "name": "league/flysystem-local", "version": "3.31.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", "shasum": "" }, "require": { "ext-fileinfo": "*", "league/flysystem": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, "type": "library", "autoload": { "psr-4": { "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "description": "Local filesystem adapter for Flysystem.", "keywords": [ "Flysystem", "file", "files", "filesystem", "local" ], "support": { "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" }, "time": "2026-01-23T15:30:45+00:00" }, { "name": "league/mime-type-detection", "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { "ext-fileinfo": "*", "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { "psr-4": { "League\\MimeTypeDetection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { "url": "https://github.com/frankdejonge", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/league/flysystem", "type": "tidelift" } ], "time": "2024-09-21T08:32:55+00:00" }, { "name": "php-di/invoker", "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/PHP-DI/Invoker.git", "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1", "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1", "shasum": "" }, "require": { "php": ">=7.3", "psr/container": "^1.0|^2.0" }, "require-dev": { "athletic/athletic": "~0.1.8", "mnapoli/hard-mode": "~0.3.0", "phpunit/phpunit": "^9.0 || ^10 || ^11 || ^12" }, "type": "library", "autoload": { "psr-4": { "Invoker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Generic and extensible callable invoker", "homepage": "https://github.com/PHP-DI/Invoker", "keywords": [ "callable", "dependency", "dependency-injection", "injection", "invoke", "invoker" ], "support": { "issues": "https://github.com/PHP-DI/Invoker/issues", "source": "https://github.com/PHP-DI/Invoker/tree/2.3.7" }, "funding": [ { "url": "https://github.com/mnapoli", "type": "github" } ], "time": "2025-08-30T10:22:22+00:00" }, { "name": "php-di/php-di", "version": "7.1.1", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", "reference": "f88054cc052e40dbe7b383c8817c19442d480352" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352", "reference": "f88054cc052e40dbe7b383c8817c19442d480352", "shasum": "" }, "require": { "laravel/serializable-closure": "^1.0 || ^2.0", "php": ">=8.0", "php-di/invoker": "^2.0", "psr/container": "^1.1 || ^2.0" }, "provide": { "psr/container-implementation": "^1.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3", "friendsofphp/proxy-manager-lts": "^1", "mnapoli/phpunit-easymock": "^1.3", "phpunit/phpunit": "^9.6 || ^10 || ^11", "vimeo/psalm": "^5|^6" }, "suggest": { "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" }, "type": "library", "autoload": { "files": [ "src/functions.php" ], "psr-4": { "DI\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "The dependency injection container for humans", "homepage": "https://php-di.org/", "keywords": [ "PSR-11", "container", "container-interop", "dependency injection", "di", "ioc", "psr11" ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", "source": "https://github.com/PHP-DI/PHP-DI/tree/7.1.1" }, "funding": [ { "url": "https://github.com/mnapoli", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", "type": "tidelift" } ], "time": "2025-08-16T11:10:48+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/http-client", "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", "homepage": "https://github.com/php-fig/http-client", "keywords": [ "http", "http-client", "psr", "psr-18" ], "support": { "source": "https://github.com/php-fig/http-client" }, "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", "message", "psr", "psr-17", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-factory" }, "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-message/tree/2.0" }, "time": "2023-04-04T09:54:51+00:00" }, { "name": "ralouphie/getallheaders", "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { "php": ">=5.6" }, "require-dev": { "php-coveralls/php-coveralls": "^2.1", "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", "autoload": { "files": [ "src/getallheaders.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ralph Khattar", "email": "ralph.khattar@gmail.com" } ], "description": "A polyfill for getallheaders.", "support": { "issues": "https://github.com/ralouphie/getallheaders/issues", "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, "time": "2019-03-08T08:55:37+00:00" }, { "name": "symfony/console", "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/console.git", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/event-dispatcher": "^4.4|^5.0|^6.0", "symfony/lock": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" }, "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/v5.4.47" }, "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-11-06T11:30:55+00:00" }, { "name": "symfony/deprecation-contracts", "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "3.7-dev" } }, "autoload": { "files": [ "function.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-04-13T15:52:40+00:00" }, { "name": "symfony/finder", "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" }, "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": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/finder/tree/v6.4.34" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-01-28T15:16:37+00:00" }, { "name": "symfony/polyfill-ctype", "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { "php": ">=7.2" }, "provide": { "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-04-26T13:13:48+00:00" }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { "ext-iconv": "*", "php": ">=7.2" }, "provide": { "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php73", "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php73\\": "" }, "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 backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php73/tree/v1.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ion Bazan", "email": "ion.bazan@gmail.com" }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/process", "version": "v6.4.39", "source": { "type": "git", "url": "https://github.com/symfony/process.git", "reference": "6c93071cb8c91dce5a41960d125e019e64ef6cb5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/6c93071cb8c91dce5a41960d125e019e64ef6cb5", "reference": "6c93071cb8c91dce5a41960d125e019e64ef6cb5", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" }, "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": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/process/tree/v6.4.39" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-05-11T16:53:15+00:00" }, { "name": "symfony/service-contracts", "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "3.7-dev" } }, "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.7.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-03-28T09:44:51+00:00" }, { "name": "symfony/string", "version": "v6.4.39", "source": { "type": "git", "url": "https://github.com/symfony/string.git", "reference": "62e3c927de664edadb5bef260987eb047a17a113" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/string/zipball/62e3c927de664edadb5bef260987eb047a17a113", "reference": "62e3c927de664edadb5bef260987eb047a17a113", "shasum": "" }, "require": { "php": ">=8.1", "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/http-client": "^5.4|^6.0|^7.0", "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0|^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/v6.4.39" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2026-05-12T11:44:19+00:00" } ], "packages-dev": [ { "name": "dealerdirect/phpcodesniffer-composer-installer", "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/963f0c67bffde0eac41b56be71ac0e8ba132f0bd", "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd", "shasum": "" }, "require": { "composer-plugin-api": "^2.2", "php": ">=5.4", "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", "php-parallel-lint/php-parallel-lint": "^1.4.0", "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", "extra": { "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, "autoload": { "psr-4": { "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Franck Nijhof", "email": "opensource@frenck.dev", "homepage": "https://frenck.dev", "role": "Open source developer" }, { "name": "Contributors", "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", "code quality", "codesniffer", "composer", "installer", "phpcbf", "phpcs", "plugin", "qa", "quality", "standard", "standards", "style guide", "stylecheck", "tests" ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, "funding": [ { "url": "https://github.com/PHPCSStandards", "type": "github" }, { "url": "https://github.com/jrfnl", "type": "github" }, { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" }, { "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], "time": "2026-05-06T08:26:05+00:00" }, { "name": "mikey179/vfsstream", "version": "v1.6.12", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { "phpunit/phpunit": "^7.5||^8.5||^9.6", "yoast/phpunit-polyfills": "^2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.6.x-dev" } }, "autoload": { "psr-0": { "org\\bovigo\\vfs\\": "src/main/php" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Frank Kleine", "homepage": "http://frankkleine.de/", "role": "Developer" } ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", "support": { "issues": "https://github.com/bovigo/vfsStream/issues", "source": "https://github.com/bovigo/vfsStream/tree/master", "wiki": "https://github.com/bovigo/vfsStream/wiki" }, "time": "2024-08-29T18:43:31+00:00" }, { "name": "myclabs/deep-copy", "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { "files": [ "src/DeepCopy/deep_copy.php" ], "psr-4": { "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], "time": "2025-08-01T08:46:24+00:00" }, { "name": "nikic/php-parser", "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov" } ], "description": "A PHP parser written in PHP", "keywords": [ "parser", "php" ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", "source": "https://github.com/phar-io/version/tree/3.2.1" }, "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpstan/phpdoc-parser", "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "type": "library", "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpstan/phpstan", "version": "1.12.33", "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1", "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1", "shasum": "" }, "require": { "php": "^7.2|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" }, "bin": [ "phpstan", "phpstan.phar" ], "type": "library", "autoload": { "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ "dev", "static analysis" ], "support": { "docs": "https://phpstan.org/user-guide/getting-started", "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", "security": "https://github.com/phpstan/phpstan/security/policy", "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { "url": "https://github.com/ondrejmirtes", "type": "github" }, { "url": "https://github.com/phpstan", "type": "github" } ], "time": "2026-02-28T20:30:03+00:00" }, { "name": "phpunit/php-code-coverage", "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-text-template": "^3.0.1", "sebastian/code-unit-reverse-lookup": "^3.0.0", "sebastian/complexity": "^3.2.0", "sebastian/environment": "^6.1.0", "sebastian/lines-of-code": "^2.0.2", "sebastian/version": "^4.0.1", "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { "dev-main": "10.1.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" }, "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Invoke callables with a timeout", "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ "process" ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "6.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", "version": "10.5.63", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "33198268dad71e926626b618f3ec3966661e4d90" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", "reference": "33198268dad71e926626b618f3ec3966661e4d90", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", "phpunit/php-code-coverage": "^10.1.16", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-invoker": "^4.0.0", "phpunit/php-text-template": "^3.0.1", "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", "sebastian/comparator": "^5.0.5", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.4", "sebastian/global-state": "^6.0.2", "sebastian/object-enumerator": "^5.0.0", "sebastian/recursion-context": "^5.0.1", "sebastian/type": "^4.0.0", "sebastian/version": "^4.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-main": "10.5-dev" } }, "autoload": { "files": [ "src/Framework/Assert/Functions.php" ], "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" }, "funding": [ { "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], "time": "2026-01-27T05:48:37+00:00" }, { "name": "psr/log", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], "support": { "source": "https://github.com/php-fig/log/tree/2.0.0" }, "time": "2021-07-14T16:41:46+00:00" }, { "name": "rector/rector", "version": "1.2.10", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", "reference": "40f9cf38c05296bd32f444121336a521a293fa61" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", "reference": "40f9cf38c05296bd32f444121336a521a293fa61", "shasum": "" }, "require": { "php": "^7.2|^8.0", "phpstan/phpstan": "^1.12.5" }, "conflict": { "rector/rector-doctrine": "*", "rector/rector-downgrade-php": "*", "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, "suggest": { "ext-dom": "To manipulate phpunit.xml via the custom-rule command" }, "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/1.2.10" }, "funding": [ { "url": "https://github.com/tomasvotruba", "type": "github" } ], "time": "2024-11-08T13:59:10+00:00" }, { "name": "sebastian/cli-parser", "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", "php": ">=8.1", "sebastian/diff": "^5.0", "sebastian/exporter": "^5.0" }, "require-dev": { "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { "dev-main": "5.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", "type": "tidelift" } ], "time": "2026-01-24T09:25:16+00:00" }, { "name": "sebastian/complexity", "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.2-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0", "symfony/process": "^6.4" }, "type": "library", "extra": { "branch-alias": { "dev-main": "5.1-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff", "udiff", "unidiff", "unified diff" ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { "dev-main": "6.1-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "0735b90f4da94969541dac1da743446e276defa6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", "reference": "0735b90f4da94969541dac1da743446e276defa6", "shasum": "" }, "require": { "ext-mbstring": "*", "php": ">=8.1", "sebastian/recursion-context": "^5.0" }, "require-dev": { "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { "dev-main": "5.1-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", "type": "tidelift" } ], "time": "2025-09-24T06:09:11+00:00" }, { "name": "sebastian/global-state", "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { "php": ">=8.1", "sebastian/object-reflector": "^3.0", "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "6.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { "php": ">=8.1", "sebastian/object-reflector": "^3.0", "sebastian/recursion-context": "^5.0" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "5.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { "dev-main": "5.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", "type": "tidelift" } ], "time": "2025-08-10T07:50:56+00:00" }, { "name": "sebastian/type", "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-07T11:34:05+00:00" }, { "name": "slevomat/coding-standard", "version": "8.22.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/1dd80bf3b93692bedb21a6623c496887fad05fec", "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", "php": "^7.4 || ^8.0", "phpstan/phpdoc-parser": "^2.3.0", "squizlabs/php_codesniffer": "^3.13.4" }, "require-dev": { "phing/phing": "3.0.1|3.1.0", "php-parallel-lint/php-parallel-lint": "1.4.0", "phpstan/phpstan": "2.1.24", "phpstan/phpstan-deprecation-rules": "2.0.3", "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "2.0.6", "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.10" }, "type": "phpcodesniffer-standard", "extra": { "branch-alias": { "dev-master": "8.x-dev" } }, "autoload": { "psr-4": { "SlevomatCodingStandard\\": "SlevomatCodingStandard/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", "keywords": [ "dev", "phpcs" ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", "source": "https://github.com/slevomat/coding-standard/tree/8.22.1" }, "funding": [ { "url": "https://github.com/kukulich", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", "type": "tidelift" } ], "time": "2025-09-13T08:53:30+00:00" }, { "name": "squizlabs/php_codesniffer", "version": "3.13.5", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": ">=5.4.0" }, "require-dev": { "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ "bin/phpcbf", "bin/phpcs" ], "type": "library", "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Greg Sherwood", "role": "Former lead" }, { "name": "Juliette Reinders Folmer", "role": "Current lead" }, { "name": "Contributors", "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { "url": "https://github.com/PHPCSStandards", "type": "github" }, { "url": "https://github.com/jrfnl", "type": "github" }, { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" }, { "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], "time": "2025-11-04T16:30:35+00:00" }, { "name": "theseer/tokenizer", "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=8.0" }, "platform-dev": {}, "plugin-api-version": "2.9.0" } #!/bin/bash exec /usr/local/cpanel/3rdparty/bin/php /opt/cpanel/ea-wappspector/wappspector.phar "$@" * 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); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use 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 string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to * @internal */ private static $selfDir = null; /** * @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 */ private static $installedIsLocalDir; /** * @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('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(); // when using reload, we disable the duplicate protection to ensure that self::$installed data is // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, // so we have to assume it does not, and that may result in duplicate data being returned when listing // all installed packages for example self::$installedIsLocalDir = false; } /** * @return string */ private static function getSelfDir() { if (self::$selfDir === null) { self::$selfDir = strtr(__DIR__, '\\', '/'); } return self::$selfDir; } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); $copiedLocalDir = false; if (self::$canGetVendors) { $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { $vendorDir = strtr($vendorDir, '\\', '/'); 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'; self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { self::$installed = $required; self::$installedIsLocalDir = true; } } if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { $copiedLocalDir = true; } } } 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() && !$copiedLocalDir) { $installed[] = self::$installed; } return $installed; } } $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PHPUnit\\Event\\Application\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/Finished.php', 'PHPUnit\\Event\\Application\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php', 'PHPUnit\\Event\\Application\\Started' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/Started.php', 'PHPUnit\\Event\\Application\\StartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php', 'PHPUnit\\Event\\Code\\ClassMethod' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ClassMethod.php', 'PHPUnit\\Event\\Code\\ComparisonFailure' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ComparisonFailure.php', 'PHPUnit\\Event\\Code\\ComparisonFailureBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php', 'PHPUnit\\Event\\Code\\NoTestCaseObjectOnCallStackException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php', 'PHPUnit\\Event\\Code\\Phpt' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/Phpt.php', 'PHPUnit\\Event\\Code\\Test' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/Test.php', 'PHPUnit\\Event\\Code\\TestCollection' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestCollection.php', 'PHPUnit\\Event\\Code\\TestCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php', 'PHPUnit\\Event\\Code\\TestDox' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestDox.php', 'PHPUnit\\Event\\Code\\TestDoxBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php', 'PHPUnit\\Event\\Code\\TestMethod' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestMethod.php', 'PHPUnit\\Event\\Code\\TestMethodBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php', 'PHPUnit\\Event\\Code\\Throwable' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Throwable.php', 'PHPUnit\\Event\\Code\\ThrowableBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php', 'PHPUnit\\Event\\CollectingDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php', 'PHPUnit\\Event\\DeferringDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php', 'PHPUnit\\Event\\DirectDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php', 'PHPUnit\\Event\\Dispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php', 'PHPUnit\\Event\\DispatchingEmitter' => $vendorDir . '/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php', 'PHPUnit\\Event\\Emitter' => $vendorDir . '/phpunit/phpunit/src/Event/Emitter/Emitter.php', 'PHPUnit\\Event\\Event' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Event.php', 'PHPUnit\\Event\\EventAlreadyAssignedException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php', 'PHPUnit\\Event\\EventCollection' => $vendorDir . '/phpunit/phpunit/src/Event/Events/EventCollection.php', 'PHPUnit\\Event\\EventCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php', 'PHPUnit\\Event\\EventFacadeIsSealedException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php', 'PHPUnit\\Event\\Exception' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/Exception.php', 'PHPUnit\\Event\\Facade' => $vendorDir . '/phpunit/phpunit/src/Event/Facade.php', 'PHPUnit\\Event\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php', 'PHPUnit\\Event\\InvalidEventException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/InvalidEventException.php', 'PHPUnit\\Event\\InvalidSubscriberException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php', 'PHPUnit\\Event\\MapError' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/MapError.php', 'PHPUnit\\Event\\NoPreviousThrowableException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php', 'PHPUnit\\Event\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/RuntimeException.php', 'PHPUnit\\Event\\Runtime\\OperatingSystem' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php', 'PHPUnit\\Event\\Runtime\\PHP' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/PHP.php', 'PHPUnit\\Event\\Runtime\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php', 'PHPUnit\\Event\\Runtime\\Runtime' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php', 'PHPUnit\\Event\\SubscribableDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php', 'PHPUnit\\Event\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Subscriber.php', 'PHPUnit\\Event\\SubscriberTypeAlreadyRegisteredException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php', 'PHPUnit\\Event\\Telemetry\\Duration' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php', 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatus' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php', 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatusProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php', 'PHPUnit\\Event\\Telemetry\\HRTime' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php', 'PHPUnit\\Event\\Telemetry\\Info' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Info.php', 'PHPUnit\\Event\\Telemetry\\MemoryMeter' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php', 'PHPUnit\\Event\\Telemetry\\MemoryUsage' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php', 'PHPUnit\\Event\\Telemetry\\Php81GarbageCollectorStatusProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php', 'PHPUnit\\Event\\Telemetry\\Php83GarbageCollectorStatusProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php', 'PHPUnit\\Event\\Telemetry\\Snapshot' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php', 'PHPUnit\\Event\\Telemetry\\StopWatch' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php', 'PHPUnit\\Event\\Telemetry\\System' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/System.php', 'PHPUnit\\Event\\Telemetry\\SystemMemoryMeter' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php', 'PHPUnit\\Event\\Telemetry\\SystemStopWatch' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php', 'PHPUnit\\Event\\Telemetry\\SystemStopWatchWithOffset' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php', 'PHPUnit\\Event\\TestData\\DataFromDataProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php', 'PHPUnit\\Event\\TestData\\DataFromTestDependency' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php', 'PHPUnit\\Event\\TestData\\MoreThanOneDataSetFromDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php', 'PHPUnit\\Event\\TestData\\NoDataSetFromDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php', 'PHPUnit\\Event\\TestData\\TestData' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php', 'PHPUnit\\Event\\TestData\\TestDataCollection' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php', 'PHPUnit\\Event\\TestData\\TestDataCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php', 'PHPUnit\\Event\\TestRunner\\BootstrapFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php', 'PHPUnit\\Event\\TestRunner\\BootstrapFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\Configured' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php', 'PHPUnit\\Event\\TestRunner\\ConfiguredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php', 'PHPUnit\\Event\\TestRunner\\DeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php', 'PHPUnit\\Event\\TestRunner\\DeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\TestRunner\\EventFacadeSealed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php', 'PHPUnit\\Event\\TestRunner\\EventFacadeSealedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExecutionAborted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php', 'PHPUnit\\Event\\TestRunner\\ExecutionAbortedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExecutionFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php', 'PHPUnit\\Event\\TestRunner\\ExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExecutionStarted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php', 'PHPUnit\\Event\\TestRunner\\ExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrapped' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php', 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrappedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPhar' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php', 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPharSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php', 'PHPUnit\\Event\\TestRunner\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php', 'PHPUnit\\Event\\TestRunner\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php', 'PHPUnit\\Event\\TestRunner\\Started' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/Started.php', 'PHPUnit\\Event\\TestRunner\\StartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\WarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php', 'PHPUnit\\Event\\TestRunner\\WarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Filtered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php', 'PHPUnit\\Event\\TestSuite\\FilteredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php', 'PHPUnit\\Event\\TestSuite\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Loaded' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php', 'PHPUnit\\Event\\TestSuite\\LoadedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Skipped' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php', 'PHPUnit\\Event\\TestSuite\\SkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Sorted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php', 'PHPUnit\\Event\\TestSuite\\SortedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Started' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Started.php', 'PHPUnit\\Event\\TestSuite\\StartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestClass' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestMethodWithDataProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteWithName' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\AfterTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php', 'PHPUnit\\Event\\Test\\AfterTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\AfterTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php', 'PHPUnit\\Event\\Test\\AfterTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\AfterTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php', 'PHPUnit\\Event\\Test\\AfterTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\AssertionFailed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php', 'PHPUnit\\Event\\Test\\AssertionFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php', 'PHPUnit\\Event\\Test\\AssertionSucceeded' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php', 'PHPUnit\\Event\\Test\\AssertionSucceededSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\ComparatorRegistered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php', 'PHPUnit\\Event\\Test\\ComparatorRegisteredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php', 'PHPUnit\\Event\\Test\\ConsideredRisky' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php', 'PHPUnit\\Event\\Test\\ConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php', 'PHPUnit\\Event\\Test\\DataProviderMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php', 'PHPUnit\\Event\\Test\\DataProviderMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\DataProviderMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php', 'PHPUnit\\Event\\Test\\DataProviderMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\DeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php', 'PHPUnit\\Event\\Test\\DeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\ErrorTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php', 'PHPUnit\\Event\\Test\\ErrorTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\Errored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php', 'PHPUnit\\Event\\Test\\ErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php', 'PHPUnit\\Event\\Test\\Failed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php', 'PHPUnit\\Event\\Test\\FailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php', 'PHPUnit\\Event\\Test\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php', 'PHPUnit\\Event\\Test\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php', 'PHPUnit\\Event\\Test\\MarkedIncomplete' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php', 'PHPUnit\\Event\\Test\\MarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php', 'PHPUnit\\Event\\Test\\MockObjectCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php', 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php', 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectForTraitCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php', 'PHPUnit\\Event\\Test\\MockObjectForTraitCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php', 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\NoComparisonFailureException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php', 'PHPUnit\\Event\\Test\\NoticeTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php', 'PHPUnit\\Event\\Test\\NoticeTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PartialMockObjectCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php', 'PHPUnit\\Event\\Test\\PartialMockObjectCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\Passed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php', 'PHPUnit\\Event\\Test\\PassedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php', 'PHPUnit\\Event\\Test\\PhpDeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php', 'PHPUnit\\Event\\Test\\PhpDeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpNoticeTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php', 'PHPUnit\\Event\\Test\\PhpNoticeTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpWarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php', 'PHPUnit\\Event\\Test\\PhpWarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php', 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpunitErrorTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php', 'PHPUnit\\Event\\Test\\PhpunitErrorTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpunitWarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php', 'PHPUnit\\Event\\Test\\PhpunitWarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PostConditionCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php', 'PHPUnit\\Event\\Test\\PostConditionCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php', 'PHPUnit\\Event\\Test\\PostConditionErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php', 'PHPUnit\\Event\\Test\\PostConditionErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php', 'PHPUnit\\Event\\Test\\PostConditionFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php', 'PHPUnit\\Event\\Test\\PostConditionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\PreConditionCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php', 'PHPUnit\\Event\\Test\\PreConditionCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php', 'PHPUnit\\Event\\Test\\PreConditionErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php', 'PHPUnit\\Event\\Test\\PreConditionErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php', 'PHPUnit\\Event\\Test\\PreConditionFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php', 'PHPUnit\\Event\\Test\\PreConditionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\PreparationFailed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php', 'PHPUnit\\Event\\Test\\PreparationFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php', 'PHPUnit\\Event\\Test\\PreparationStarted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php', 'PHPUnit\\Event\\Test\\PreparationStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php', 'PHPUnit\\Event\\Test\\Prepared' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php', 'PHPUnit\\Event\\Test\\PreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php', 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutput' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php', 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutputSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php', 'PHPUnit\\Event\\Test\\Skipped' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php', 'PHPUnit\\Event\\Test\\SkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php', 'PHPUnit\\Event\\Test\\TestProxyCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php', 'PHPUnit\\Event\\Test\\TestProxyCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\TestStubCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php', 'PHPUnit\\Event\\Test\\TestStubCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php', 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\WarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php', 'PHPUnit\\Event\\Test\\WarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php', 'PHPUnit\\Event\\Tracer\\Tracer' => $vendorDir . '/phpunit/phpunit/src/Event/Tracer.php', 'PHPUnit\\Event\\TypeMap' => $vendorDir . '/phpunit/phpunit/src/Event/TypeMap.php', 'PHPUnit\\Event\\UnknownEventException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownEventException.php', 'PHPUnit\\Event\\UnknownEventTypeException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php', 'PHPUnit\\Event\\UnknownSubscriberException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php', 'PHPUnit\\Event\\UnknownSubscriberTypeException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php', 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Framework\\ActualValueIsNotAnObjectException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php', 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', 'PHPUnit\\Framework\\Attributes\\After' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/After.php', 'PHPUnit\\Framework\\Attributes\\AfterClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/AfterClass.php', 'PHPUnit\\Framework\\Attributes\\BackupGlobals' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php', 'PHPUnit\\Framework\\Attributes\\BackupStaticProperties' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php', 'PHPUnit\\Framework\\Attributes\\Before' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Before.php', 'PHPUnit\\Framework\\Attributes\\BeforeClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php', 'PHPUnit\\Framework\\Attributes\\CodeCoverageIgnore' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php', 'PHPUnit\\Framework\\Attributes\\CoversClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CoversClass.php', 'PHPUnit\\Framework\\Attributes\\CoversFunction' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php', 'PHPUnit\\Framework\\Attributes\\CoversNothing' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php', 'PHPUnit\\Framework\\Attributes\\DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DataProvider.php', 'PHPUnit\\Framework\\Attributes\\DataProviderExternal' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php', 'PHPUnit\\Framework\\Attributes\\Depends' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Depends.php', 'PHPUnit\\Framework\\Attributes\\DependsExternal' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php', 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingDeepClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php', 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingShallowClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php', 'PHPUnit\\Framework\\Attributes\\DependsOnClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php', 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingDeepClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php', 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingShallowClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php', 'PHPUnit\\Framework\\Attributes\\DependsUsingDeepClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php', 'PHPUnit\\Framework\\Attributes\\DependsUsingShallowClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php', 'PHPUnit\\Framework\\Attributes\\DoesNotPerformAssertions' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php', 'PHPUnit\\Framework\\Attributes\\ExcludeGlobalVariableFromBackup' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php', 'PHPUnit\\Framework\\Attributes\\ExcludeStaticPropertyFromBackup' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Framework\\Attributes\\Group' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Group.php', 'PHPUnit\\Framework\\Attributes\\IgnoreClassForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\IgnoreDeprecations' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php', 'PHPUnit\\Framework\\Attributes\\IgnoreFunctionForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\IgnoreMethodForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\Large' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Large.php', 'PHPUnit\\Framework\\Attributes\\Medium' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Medium.php', 'PHPUnit\\Framework\\Attributes\\PostCondition' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/PostCondition.php', 'PHPUnit\\Framework\\Attributes\\PreCondition' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/PreCondition.php', 'PHPUnit\\Framework\\Attributes\\PreserveGlobalState' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php', 'PHPUnit\\Framework\\Attributes\\RequiresFunction' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php', 'PHPUnit\\Framework\\Attributes\\RequiresMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php', 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystem' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php', 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystemFamily' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php', 'PHPUnit\\Framework\\Attributes\\RequiresPhp' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php', 'PHPUnit\\Framework\\Attributes\\RequiresPhpExtension' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php', 'PHPUnit\\Framework\\Attributes\\RequiresPhpunit' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php', 'PHPUnit\\Framework\\Attributes\\RequiresSetting' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php', 'PHPUnit\\Framework\\Attributes\\RunClassInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php', 'PHPUnit\\Framework\\Attributes\\RunInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php', 'PHPUnit\\Framework\\Attributes\\RunTestsInSeparateProcesses' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php', 'PHPUnit\\Framework\\Attributes\\Small' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Small.php', 'PHPUnit\\Framework\\Attributes\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Test.php', 'PHPUnit\\Framework\\Attributes\\TestDox' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/TestDox.php', 'PHPUnit\\Framework\\Attributes\\TestWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/TestWith.php', 'PHPUnit\\Framework\\Attributes\\TestWithJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php', 'PHPUnit\\Framework\\Attributes\\Ticket' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Ticket.php', 'PHPUnit\\Framework\\Attributes\\UsesClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/UsesClass.php', 'PHPUnit\\Framework\\Attributes\\UsesFunction' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php', 'PHPUnit\\Framework\\Attributes\\WithoutErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php', 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotAcceptParameterTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareBoolReturnTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareExactlyOneParameterException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareParameterTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\BinaryOperator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php', 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php', 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php', 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php', 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessageIsOrContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessageMatchesRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php', 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php', 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php', 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php', 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php', 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php', 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php', 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php', 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php', 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php', 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php', 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php', 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php', 'PHPUnit\\Framework\\Constraint\\IsList' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php', 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php', 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php', 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php', 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php', 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php', 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php', 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php', 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php', 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php', 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php', 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', 'PHPUnit\\Framework\\Constraint\\ObjectHasProperty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php', 'PHPUnit\\Framework\\Constraint\\Operator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php', 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php', 'PHPUnit\\Framework\\Constraint\\StringEqualsStringIgnoringLineEndings' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php', 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php', 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php', 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php', 'PHPUnit\\Framework\\Constraint\\UnaryOperator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php', 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', 'PHPUnit\\Framework\\EmptyStringException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php', 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', 'PHPUnit\\Framework\\ExecutionOrderDependency' => $vendorDir . '/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php', 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', 'PHPUnit\\Framework\\GeneratorNotSupportedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php', 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php', 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php', 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', 'PHPUnit\\Framework\\InvalidDependencyException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php', 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php', 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php', 'PHPUnit\\Framework\\MockObject\\CannotUseOnlyMethodsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php', 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', 'PHPUnit\\Framework\\MockObject\\DoubledCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Generator\\CannotUseAddMethodsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsEnumerationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsFinalException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsReadonlyException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\DuplicateMethodException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Generator\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php', 'PHPUnit\\Framework\\MockObject\\Generator\\InvalidMethodNameException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php', 'PHPUnit\\Framework\\MockObject\\Generator\\NameAlreadyInUseException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\OriginalConstructorInvocationRequiredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ReflectionException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\SoapExtensionNotAvailableException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\TemplateLoader' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php', 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownClassException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTraitException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php', 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php', 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php', 'PHPUnit\\Framework\\MockObject\\MatchBuilderNotFoundException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php', 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php', 'PHPUnit\\Framework\\MockObject\\MatcherAlreadyRegisteredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php', 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php', 'PHPUnit\\Framework\\MockObject\\MethodCannotBeConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameAlreadyConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php', 'PHPUnit\\Framework\\MockObject\\MethodNameNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodParametersAlreadyConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockObjectApi' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php', 'PHPUnit\\Framework\\MockObject\\MockObjectInternal' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php', 'PHPUnit\\Framework\\MockObject\\NeverReturningMethodException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php', 'PHPUnit\\Framework\\MockObject\\NoMoreReturnValuesConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\ProxiedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueGenerator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php', 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php', 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php', 'PHPUnit\\Framework\\MockObject\\StubApi' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php', 'PHPUnit\\Framework\\MockObject\\StubInternal' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', 'PHPUnit\\Framework\\PhptAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php', 'PHPUnit\\Framework\\ProcessIsolationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php', 'PHPUnit\\Framework\\Reorderable' => $vendorDir . '/phpunit/phpunit/src/Framework/Reorderable.php', 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php', 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php', 'PHPUnit\\Framework\\SkippedWithMessageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php', 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', 'PHPUnit\\Framework\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/Framework/TestRunner.php', 'PHPUnit\\Framework\\TestSize\\Known' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Known.php', 'PHPUnit\\Framework\\TestSize\\Large' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Large.php', 'PHPUnit\\Framework\\TestSize\\Medium' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Medium.php', 'PHPUnit\\Framework\\TestSize\\Small' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Small.php', 'PHPUnit\\Framework\\TestSize\\TestSize' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/TestSize.php', 'PHPUnit\\Framework\\TestSize\\Unknown' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Unknown.php', 'PHPUnit\\Framework\\TestStatus\\Deprecation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php', 'PHPUnit\\Framework\\TestStatus\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Error.php', 'PHPUnit\\Framework\\TestStatus\\Failure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Failure.php', 'PHPUnit\\Framework\\TestStatus\\Incomplete' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php', 'PHPUnit\\Framework\\TestStatus\\Known' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Known.php', 'PHPUnit\\Framework\\TestStatus\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Notice.php', 'PHPUnit\\Framework\\TestStatus\\Risky' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Risky.php', 'PHPUnit\\Framework\\TestStatus\\Skipped' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Skipped.php', 'PHPUnit\\Framework\\TestStatus\\Success' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Success.php', 'PHPUnit\\Framework\\TestStatus\\TestStatus' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php', 'PHPUnit\\Framework\\TestStatus\\Unknown' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Unknown.php', 'PHPUnit\\Framework\\TestStatus\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Warning.php', 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', 'PHPUnit\\Framework\\UnknownClassOrInterfaceException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php', 'PHPUnit\\Framework\\UnknownTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php', 'PHPUnit\\Logging\\EventLogger' => $vendorDir . '/phpunit/phpunit/src/Logging/EventLogger.php', 'PHPUnit\\Logging\\JUnit\\JunitXmlLogger' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php', 'PHPUnit\\Logging\\JUnit\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php', 'PHPUnit\\Logging\\JUnit\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparationFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparationStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPrintedUnexpectedOutputSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestRunnerExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php', 'PHPUnit\\Logging\\TeamCity\\TeamCityLogger' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php', 'PHPUnit\\Logging\\TeamCity\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestRunnerExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteBeforeFirstTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\HtmlRenderer' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php', 'PHPUnit\\Logging\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php', 'PHPUnit\\Logging\\TestDox\\PlainTextRenderer' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php', 'PHPUnit\\Logging\\TestDox\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php', 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php', 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php', 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php', 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php', 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\Metadata\\After' => $vendorDir . '/phpunit/phpunit/src/Metadata/After.php', 'PHPUnit\\Metadata\\AfterClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/AfterClass.php', 'PHPUnit\\Metadata\\Annotation\\Parser\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php', 'PHPUnit\\Metadata\\Annotation\\Parser\\Registry' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php', 'PHPUnit\\Metadata\\AnnotationsAreNotSupportedForInternalClassesException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php', 'PHPUnit\\Metadata\\Api\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php', 'PHPUnit\\Metadata\\Api\\DataProvider' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/DataProvider.php', 'PHPUnit\\Metadata\\Api\\Dependencies' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/Dependencies.php', 'PHPUnit\\Metadata\\Api\\Groups' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/Groups.php', 'PHPUnit\\Metadata\\Api\\HookMethods' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/HookMethods.php', 'PHPUnit\\Metadata\\Api\\Requirements' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/Requirements.php', 'PHPUnit\\Metadata\\BackupGlobals' => $vendorDir . '/phpunit/phpunit/src/Metadata/BackupGlobals.php', 'PHPUnit\\Metadata\\BackupStaticProperties' => $vendorDir . '/phpunit/phpunit/src/Metadata/BackupStaticProperties.php', 'PHPUnit\\Metadata\\Before' => $vendorDir . '/phpunit/phpunit/src/Metadata/Before.php', 'PHPUnit\\Metadata\\BeforeClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/BeforeClass.php', 'PHPUnit\\Metadata\\Covers' => $vendorDir . '/phpunit/phpunit/src/Metadata/Covers.php', 'PHPUnit\\Metadata\\CoversClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversClass.php', 'PHPUnit\\Metadata\\CoversDefaultClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversDefaultClass.php', 'PHPUnit\\Metadata\\CoversFunction' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversFunction.php', 'PHPUnit\\Metadata\\CoversNothing' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversNothing.php', 'PHPUnit\\Metadata\\DataProvider' => $vendorDir . '/phpunit/phpunit/src/Metadata/DataProvider.php', 'PHPUnit\\Metadata\\DependsOnClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/DependsOnClass.php', 'PHPUnit\\Metadata\\DependsOnMethod' => $vendorDir . '/phpunit/phpunit/src/Metadata/DependsOnMethod.php', 'PHPUnit\\Metadata\\DoesNotPerformAssertions' => $vendorDir . '/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php', 'PHPUnit\\Metadata\\Exception' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/Exception.php', 'PHPUnit\\Metadata\\ExcludeGlobalVariableFromBackup' => $vendorDir . '/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php', 'PHPUnit\\Metadata\\ExcludeStaticPropertyFromBackup' => $vendorDir . '/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Metadata\\Group' => $vendorDir . '/phpunit/phpunit/src/Metadata/Group.php', 'PHPUnit\\Metadata\\IgnoreClassForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php', 'PHPUnit\\Metadata\\IgnoreDeprecations' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php', 'PHPUnit\\Metadata\\IgnoreFunctionForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Metadata\\IgnoreMethodForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Metadata\\InvalidAttributeException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php', 'PHPUnit\\Metadata\\InvalidVersionRequirementException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php', 'PHPUnit\\Metadata\\Metadata' => $vendorDir . '/phpunit/phpunit/src/Metadata/Metadata.php', 'PHPUnit\\Metadata\\MetadataCollection' => $vendorDir . '/phpunit/phpunit/src/Metadata/MetadataCollection.php', 'PHPUnit\\Metadata\\MetadataCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php', 'PHPUnit\\Metadata\\NoVersionRequirementException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php', 'PHPUnit\\Metadata\\Parser\\AnnotationParser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php', 'PHPUnit\\Metadata\\Parser\\AttributeParser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php', 'PHPUnit\\Metadata\\Parser\\CachingParser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/CachingParser.php', 'PHPUnit\\Metadata\\Parser\\Parser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Parser.php', 'PHPUnit\\Metadata\\Parser\\ParserChain' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/ParserChain.php', 'PHPUnit\\Metadata\\Parser\\Registry' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Registry.php', 'PHPUnit\\Metadata\\PostCondition' => $vendorDir . '/phpunit/phpunit/src/Metadata/PostCondition.php', 'PHPUnit\\Metadata\\PreCondition' => $vendorDir . '/phpunit/phpunit/src/Metadata/PreCondition.php', 'PHPUnit\\Metadata\\PreserveGlobalState' => $vendorDir . '/phpunit/phpunit/src/Metadata/PreserveGlobalState.php', 'PHPUnit\\Metadata\\ReflectionException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php', 'PHPUnit\\Metadata\\RequiresFunction' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresFunction.php', 'PHPUnit\\Metadata\\RequiresMethod' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresMethod.php', 'PHPUnit\\Metadata\\RequiresOperatingSystem' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php', 'PHPUnit\\Metadata\\RequiresOperatingSystemFamily' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php', 'PHPUnit\\Metadata\\RequiresPhp' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresPhp.php', 'PHPUnit\\Metadata\\RequiresPhpExtension' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php', 'PHPUnit\\Metadata\\RequiresPhpunit' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresPhpunit.php', 'PHPUnit\\Metadata\\RequiresSetting' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresSetting.php', 'PHPUnit\\Metadata\\RunClassInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php', 'PHPUnit\\Metadata\\RunInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php', 'PHPUnit\\Metadata\\RunTestsInSeparateProcesses' => $vendorDir . '/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php', 'PHPUnit\\Metadata\\Test' => $vendorDir . '/phpunit/phpunit/src/Metadata/Test.php', 'PHPUnit\\Metadata\\TestDox' => $vendorDir . '/phpunit/phpunit/src/Metadata/TestDox.php', 'PHPUnit\\Metadata\\TestWith' => $vendorDir . '/phpunit/phpunit/src/Metadata/TestWith.php', 'PHPUnit\\Metadata\\Uses' => $vendorDir . '/phpunit/phpunit/src/Metadata/Uses.php', 'PHPUnit\\Metadata\\UsesClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/UsesClass.php', 'PHPUnit\\Metadata\\UsesDefaultClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/UsesDefaultClass.php', 'PHPUnit\\Metadata\\UsesFunction' => $vendorDir . '/phpunit/phpunit/src/Metadata/UsesFunction.php', 'PHPUnit\\Metadata\\Version\\ComparisonRequirement' => $vendorDir . '/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php', 'PHPUnit\\Metadata\\Version\\ConstraintRequirement' => $vendorDir . '/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php', 'PHPUnit\\Metadata\\Version\\Requirement' => $vendorDir . '/phpunit/phpunit/src/Metadata/Version/Requirement.php', 'PHPUnit\\Metadata\\WithoutErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php', 'PHPUnit\\Runner\\Baseline\\Baseline' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Baseline.php', 'PHPUnit\\Runner\\Baseline\\CannotLoadBaselineException' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php', 'PHPUnit\\Runner\\Baseline\\FileDoesNotHaveLineException' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php', 'PHPUnit\\Runner\\Baseline\\Generator' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Generator.php', 'PHPUnit\\Runner\\Baseline\\Issue' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Issue.php', 'PHPUnit\\Runner\\Baseline\\Reader' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Reader.php', 'PHPUnit\\Runner\\Baseline\\RelativePathCalculator' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php', 'PHPUnit\\Runner\\Baseline\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\Runner\\Baseline\\Writer' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Writer.php', 'PHPUnit\\Runner\\ClassCannotBeFoundException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php', 'PHPUnit\\Runner\\ClassDoesNotExtendTestCaseException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php', 'PHPUnit\\Runner\\ClassIsAbstractException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php', 'PHPUnit\\Runner\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Runner/CodeCoverage.php', 'PHPUnit\\Runner\\CodeCoverageFileExistsException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php', 'PHPUnit\\Runner\\DirectoryDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php', 'PHPUnit\\Runner\\ErrorException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ErrorException.php', 'PHPUnit\\Runner\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/ErrorHandler.php', 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/Exception.php', 'PHPUnit\\Runner\\Extension\\Extension' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/Extension.php', 'PHPUnit\\Runner\\Extension\\ExtensionBootstrapper' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php', 'PHPUnit\\Runner\\Extension\\Facade' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/Facade.php', 'PHPUnit\\Runner\\Extension\\ParameterCollection' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php', 'PHPUnit\\Runner\\Extension\\PharLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/PharLoader.php', 'PHPUnit\\Runner\\FileDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', 'PHPUnit\\Runner\\Filter\\TestIdFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php', 'PHPUnit\\Runner\\GarbageCollection\\ExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php', 'PHPUnit\\Runner\\GarbageCollection\\ExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php', 'PHPUnit\\Runner\\GarbageCollection\\GarbageCollectionHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php', 'PHPUnit\\Runner\\GarbageCollection\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php', 'PHPUnit\\Runner\\GarbageCollection\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Runner\\InvalidOrderException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php', 'PHPUnit\\Runner\\InvalidPhptFileException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php', 'PHPUnit\\Runner\\ParameterDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php', 'PHPUnit\\Runner\\PhptExternalFileCannotBeLoadedException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php', 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', 'PHPUnit\\Runner\\ResultCache\\DefaultResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php', 'PHPUnit\\Runner\\ResultCache\\NullResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php', 'PHPUnit\\Runner\\ResultCache\\ResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php', 'PHPUnit\\Runner\\ResultCache\\ResultCacheHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php', 'PHPUnit\\Runner\\ResultCache\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', 'PHPUnit\\Runner\\UnsupportedPhptSectionException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php', 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\TestRunner\\TestResult\\AfterTestClassMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\BeforeTestClassMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\Collector' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Collector.php', 'PHPUnit\\TestRunner\\TestResult\\ExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\Facade' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Facade.php', 'PHPUnit\\TestRunner\\TestResult\\Issues\\Issue' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Issue.php', 'PHPUnit\\TestRunner\\TestResult\\PassedTests' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/PassedTests.php', 'PHPUnit\\TestRunner\\TestResult\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/TestResult.php', 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSuiteSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\TextUI\\Application' => $vendorDir . '/phpunit/phpunit/src/TextUI/Application.php', 'PHPUnit\\TextUI\\CannotOpenSocketException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php', 'PHPUnit\\TextUI\\CliArguments\\Builder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php', 'PHPUnit\\TextUI\\CliArguments\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php', 'PHPUnit\\TextUI\\CliArguments\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php', 'PHPUnit\\TextUI\\CliArguments\\XmlConfigurationFileFinder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php', 'PHPUnit\\TextUI\\Command\\AtLeastVersionCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php', 'PHPUnit\\TextUI\\Command\\CheckPhpConfigurationCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php', 'PHPUnit\\TextUI\\Command\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Command.php', 'PHPUnit\\TextUI\\Command\\GenerateConfigurationCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php', 'PHPUnit\\TextUI\\Command\\ListGroupsCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php', 'PHPUnit\\TextUI\\Command\\ListTestSuitesCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php', 'PHPUnit\\TextUI\\Command\\ListTestsAsTextCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php', 'PHPUnit\\TextUI\\Command\\ListTestsAsXmlCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php', 'PHPUnit\\TextUI\\Command\\MigrateConfigurationCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php', 'PHPUnit\\TextUI\\Command\\Result' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Result.php', 'PHPUnit\\TextUI\\Command\\ShowHelpCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php', 'PHPUnit\\TextUI\\Command\\ShowVersionCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php', 'PHPUnit\\TextUI\\Command\\VersionCheckCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php', 'PHPUnit\\TextUI\\Command\\WarmCodeCoverageCacheCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php', 'PHPUnit\\TextUI\\Configuration\\Builder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Builder.php', 'PHPUnit\\TextUI\\Configuration\\CodeCoverageFilterRegistry' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php', 'PHPUnit\\TextUI\\Configuration\\CodeCoverageReportNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php', 'PHPUnit\\TextUI\\Configuration\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Configuration.php', 'PHPUnit\\TextUI\\Configuration\\ConfigurationCannotBeBuiltException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php', 'PHPUnit\\TextUI\\Configuration\\Constant' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php', 'PHPUnit\\TextUI\\Configuration\\ConstantCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php', 'PHPUnit\\TextUI\\Configuration\\ConstantCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\Directory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php', 'PHPUnit\\TextUI\\Configuration\\DirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php', 'PHPUnit\\TextUI\\Configuration\\DirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php', 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrap' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php', 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php', 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\File' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/File.php', 'PHPUnit\\TextUI\\Configuration\\FileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php', 'PHPUnit\\TextUI\\Configuration\\FileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\FilterDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php', 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php', 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\FilterNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php', 'PHPUnit\\TextUI\\Configuration\\Group' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php', 'PHPUnit\\TextUI\\Configuration\\GroupCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php', 'PHPUnit\\TextUI\\Configuration\\GroupCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\IniSetting' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php', 'PHPUnit\\TextUI\\Configuration\\IniSettingCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php', 'PHPUnit\\TextUI\\Configuration\\IniSettingCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\LoggingNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php', 'PHPUnit\\TextUI\\Configuration\\Merger' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Merger.php', 'PHPUnit\\TextUI\\Configuration\\NoBaselineException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php', 'PHPUnit\\TextUI\\Configuration\\NoBootstrapException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php', 'PHPUnit\\TextUI\\Configuration\\NoCacheDirectoryException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php', 'PHPUnit\\TextUI\\Configuration\\NoCliArgumentException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php', 'PHPUnit\\TextUI\\Configuration\\NoConfigurationFileException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php', 'PHPUnit\\TextUI\\Configuration\\NoCoverageCacheDirectoryException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php', 'PHPUnit\\TextUI\\Configuration\\NoCustomCssFileException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php', 'PHPUnit\\TextUI\\Configuration\\NoDefaultTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php', 'PHPUnit\\TextUI\\Configuration\\NoPharExtensionDirectoryException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php', 'PHPUnit\\TextUI\\Configuration\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php', 'PHPUnit\\TextUI\\Configuration\\PhpHandler' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php', 'PHPUnit\\TextUI\\Configuration\\Registry' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Registry.php', 'PHPUnit\\TextUI\\Configuration\\Source' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php', 'PHPUnit\\TextUI\\Configuration\\SourceFilter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php', 'PHPUnit\\TextUI\\Configuration\\SourceMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php', 'PHPUnit\\TextUI\\Configuration\\TestDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php', 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php', 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\TestFile' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php', 'PHPUnit\\TextUI\\Configuration\\TestFileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php', 'PHPUnit\\TextUI\\Configuration\\TestFileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php', 'PHPUnit\\TextUI\\Configuration\\TestSuiteBuilder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php', 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php', 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\Variable' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php', 'PHPUnit\\TextUI\\Configuration\\VariableCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php', 'PHPUnit\\TextUI\\Configuration\\VariableCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php', 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/Exception.php', 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', 'PHPUnit\\TextUI\\InvalidSocketException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php', 'PHPUnit\\TextUI\\Output\\DefaultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\BeforeTestClassMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\ProgressPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestRunnerExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php', 'PHPUnit\\TextUI\\Output\\Default\\UnexpectedOutputPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php', 'PHPUnit\\TextUI\\Output\\Facade' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Facade.php', 'PHPUnit\\TextUI\\Output\\NullPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php', 'PHPUnit\\TextUI\\Output\\Printer' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php', 'PHPUnit\\TextUI\\Output\\SummaryPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php', 'PHPUnit\\TextUI\\Output\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php', 'PHPUnit\\TextUI\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php', 'PHPUnit\\TextUI\\ShellExitCodeCalculator' => $vendorDir . '/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php', 'PHPUnit\\TextUI\\TestDirectoryNotFoundException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php', 'PHPUnit\\TextUI\\TestFileNotFoundException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php', 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', 'PHPUnit\\TextUI\\TestSuiteFilterProcessor' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CannotFindSchemaException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Xml' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConvertLogTypes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCloverToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCrap4jToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageHtmlToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoveragePhpToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageTextToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageXmlToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\DefaultConfiguration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php', 'PHPUnit\\TextUI\\XmlConfiguration\\FailedSchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Generator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Groups' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCacheDirectoryAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCoverageElement' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php', 'PHPUnit\\TextUI\\XmlConfiguration\\LoadedFromFileConfiguration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Loader' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php', 'PHPUnit\\TextUI\\XmlConfiguration\\LogToReportMigration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Junit' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Logging' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveCoverageDirectoriesToSource' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistIncludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutTodoAnnotatedTestsAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheResultFileAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheTokensAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveConversionToExceptionsAttributes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementCacheDirectoryAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementProcessUncoveredFilesAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveEmptyFilter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveListeners' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLogTypes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLoggingElements' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveNoInteractionAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemovePrinterAttributes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestDoxGroupsElement' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestSuiteLoaderAttributes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveVerboseAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBackupStaticAttributesAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBeStrictAboutCoversAnnotationAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RenameForceCoversAnnotationAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetector' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaFinder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SnapshotNodeList' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SuccessfulSchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php', 'PHPUnit\\TextUI\\XmlConfiguration\\UpdateSchemaLocation' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ValidationResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Validator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php', 'PHPUnit\\Util\\Cloner' => $vendorDir . '/phpunit/phpunit/src/Util/Cloner.php', 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/Exception.php', 'PHPUnit\\Util\\ExcludeList' => $vendorDir . '/phpunit/phpunit/src/Util/ExcludeList.php', 'PHPUnit\\Util\\Exporter' => $vendorDir . '/phpunit/phpunit/src/Util/Exporter.php', 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', 'PHPUnit\\Util\\Http\\Downloader' => $vendorDir . '/phpunit/phpunit/src/Util/Http/Downloader.php', 'PHPUnit\\Util\\Http\\PhpDownloader' => $vendorDir . '/phpunit/phpunit/src/Util/Http/PhpDownloader.php', 'PHPUnit\\Util\\InvalidDirectoryException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php', 'PHPUnit\\Util\\InvalidJsonException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php', 'PHPUnit\\Util\\InvalidVersionOperatorException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php', 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\PhpProcessException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/PhpProcessException.php', 'PHPUnit\\Util\\Reflection' => $vendorDir . '/phpunit/phpunit/src/Util/Reflection.php', 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\ThrowableToStringMapper' => $vendorDir . '/phpunit/phpunit/src/Util/ThrowableToStringMapper.php', 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Xml.php', 'PHPUnit\\Util\\Xml\\Loader' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Loader.php', 'PHPUnit\\Util\\Xml\\XmlException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/XmlException.php', 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', 'PharIo\\Manifest\\ElementCollectionException' => $vendorDir . '/phar-io/manifest/src/exceptions/ElementCollectionException.php', 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php', 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', 'PharIo\\Manifest\\NoEmailAddressException' => $vendorDir . '/phar-io/manifest/src/exceptions/NoEmailAddressException.php', 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', 'PharIo\\Version\\BuildMetaData' => $vendorDir . '/phar-io/version/src/BuildMetaData.php', 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', 'PharIo\\Version\\NoBuildMetaDataException' => $vendorDir . '/phar-io/version/src/exceptions/NoBuildMetaDataException.php', 'PharIo\\Version\\NoPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php', 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', 'SebastianBergmann\\CliParser\\Exception' => $vendorDir . '/sebastian/cli-parser/src/exceptions/Exception.php', 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', 'SebastianBergmann\\CliParser\\Parser' => $vendorDir . '/sebastian/cli-parser/src/Parser.php', 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', 'SebastianBergmann\\CliParser\\UnknownOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\Data\\ProcessedCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\Data\\RawCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Selector.php', 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/XdebugDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotEnabledException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php', 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', 'SebastianBergmann\\CodeCoverage\\FileCouldNotBeWrittenException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php', 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => $vendorDir . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', 'SebastianBergmann\\CodeCoverage\\ParserException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ParserException.php', 'SebastianBergmann\\CodeCoverage\\ReflectionException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Cobertura.php', 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Colors' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Colors.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\CustomCssFile' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', 'SebastianBergmann\\CodeCoverage\\Report\\Thresholds' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Thresholds.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Known' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Known.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Large' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Large.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Medium' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Medium.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Small' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Small.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\TestSize' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/TestSize.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Unknown' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Unknown.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Failure' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Failure.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Known' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Known.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Success' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Success.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\TestStatus' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/TestStatus.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Unknown' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Unknown.php', 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Filesystem.php', 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Percentage.php', 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', 'SebastianBergmann\\CodeCoverage\\XmlException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XmlException.php', 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => $vendorDir . '/sebastian/code-unit/src/ClassMethodUnit.php', 'SebastianBergmann\\CodeUnit\\ClassUnit' => $vendorDir . '/sebastian/code-unit/src/ClassUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnit' => $vendorDir . '/sebastian/code-unit/src/CodeUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollection.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', 'SebastianBergmann\\CodeUnit\\Exception' => $vendorDir . '/sebastian/code-unit/src/exceptions/Exception.php', 'SebastianBergmann\\CodeUnit\\FileUnit' => $vendorDir . '/sebastian/code-unit/src/FileUnit.php', 'SebastianBergmann\\CodeUnit\\FunctionUnit' => $vendorDir . '/sebastian/code-unit/src/FunctionUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceMethodUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceUnit.php', 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', 'SebastianBergmann\\CodeUnit\\Mapper' => $vendorDir . '/sebastian/code-unit/src/Mapper.php', 'SebastianBergmann\\CodeUnit\\NoTraitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/NoTraitException.php', 'SebastianBergmann\\CodeUnit\\ReflectionException' => $vendorDir . '/sebastian/code-unit/src/exceptions/ReflectionException.php', 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => $vendorDir . '/sebastian/code-unit/src/TraitMethodUnit.php', 'SebastianBergmann\\CodeUnit\\TraitUnit' => $vendorDir . '/sebastian/code-unit/src/TraitUnit.php', 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', 'SebastianBergmann\\Comparator\\Exception' => $vendorDir . '/sebastian/comparator/src/exceptions/Exception.php', 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', 'SebastianBergmann\\Comparator\\RuntimeException' => $vendorDir . '/sebastian/comparator/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Complexity\\Calculator' => $vendorDir . '/sebastian/complexity/src/Calculator.php', 'SebastianBergmann\\Complexity\\Complexity' => $vendorDir . '/sebastian/complexity/src/Complexity/Complexity.php', 'SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor' => $vendorDir . '/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\ComplexityCollection' => $vendorDir . '/sebastian/complexity/src/Complexity/ComplexityCollection.php', 'SebastianBergmann\\Complexity\\ComplexityCollectionIterator' => $vendorDir . '/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php', 'SebastianBergmann\\Complexity\\CyclomaticComplexityCalculatingVisitor' => $vendorDir . '/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\Exception' => $vendorDir . '/sebastian/complexity/src/Exception/Exception.php', 'SebastianBergmann\\Complexity\\RuntimeException' => $vendorDir . '/sebastian/complexity/src/Exception/RuntimeException.php', 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', 'SebastianBergmann\\FileIterator\\ExcludeIterator' => $vendorDir . '/phpunit/php-file-iterator/src/ExcludeIterator.php', 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', 'SebastianBergmann\\GlobalState\\ExcludeList' => $vendorDir . '/sebastian/global-state/src/ExcludeList.php', 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', 'SebastianBergmann\\Invoker\\Exception' => $vendorDir . '/phpunit/php-invoker/src/exceptions/Exception.php', 'SebastianBergmann\\Invoker\\Invoker' => $vendorDir . '/phpunit/php-invoker/src/Invoker.php', 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', 'SebastianBergmann\\Invoker\\TimeoutException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', 'SebastianBergmann\\LinesOfCode\\Counter' => $vendorDir . '/sebastian/lines-of-code/src/Counter.php', 'SebastianBergmann\\LinesOfCode\\Exception' => $vendorDir . '/sebastian/lines-of-code/src/Exception/Exception.php', 'SebastianBergmann\\LinesOfCode\\IllogicalValuesException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php', 'SebastianBergmann\\LinesOfCode\\LineCountingVisitor' => $vendorDir . '/sebastian/lines-of-code/src/LineCountingVisitor.php', 'SebastianBergmann\\LinesOfCode\\LinesOfCode' => $vendorDir . '/sebastian/lines-of-code/src/LinesOfCode.php', 'SebastianBergmann\\LinesOfCode\\NegativeValueException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/NegativeValueException.php', 'SebastianBergmann\\LinesOfCode\\RuntimeException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/RuntimeException.php', 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', 'SebastianBergmann\\Template\\Exception' => $vendorDir . '/phpunit/php-text-template/src/exceptions/Exception.php', 'SebastianBergmann\\Template\\InvalidArgumentException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', 'SebastianBergmann\\Template\\RuntimeException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Template\\Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', 'SebastianBergmann\\Timer\\Duration' => $vendorDir . '/phpunit/php-timer/src/Duration.php', 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/exceptions/Exception.php', 'SebastianBergmann\\Timer\\NoActiveTimerException' => $vendorDir . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => $vendorDir . '/phpunit/php-timer/src/ResourceUsageFormatter.php', 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => $vendorDir . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/type/CallableType.php', 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', 'SebastianBergmann\\Type\\FalseType' => $vendorDir . '/sebastian/type/src/type/FalseType.php', 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/type/GenericObjectType.php', 'SebastianBergmann\\Type\\IntersectionType' => $vendorDir . '/sebastian/type/src/type/IntersectionType.php', 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/type/IterableType.php', 'SebastianBergmann\\Type\\MixedType' => $vendorDir . '/sebastian/type/src/type/MixedType.php', 'SebastianBergmann\\Type\\NeverType' => $vendorDir . '/sebastian/type/src/type/NeverType.php', 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/type/NullType.php', 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/type/ObjectType.php', 'SebastianBergmann\\Type\\Parameter' => $vendorDir . '/sebastian/type/src/Parameter.php', 'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php', 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/type/SimpleType.php', 'SebastianBergmann\\Type\\StaticType' => $vendorDir . '/sebastian/type/src/type/StaticType.php', 'SebastianBergmann\\Type\\TrueType' => $vendorDir . '/sebastian/type/src/type/TrueType.php', 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/type/Type.php', 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', 'SebastianBergmann\\Type\\UnionType' => $vendorDir . '/sebastian/type/src/type/UnionType.php', 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/type/UnknownType.php', 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/type/VoidType.php', 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', ); $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php', 'b33e3d135e5d9e47d845c576147bda89' => $vendorDir . '/php-di/php-di/src/functions.php', 'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php', '38143a9afc50997d55e4815db8489d1c' => $vendorDir . '/rector/rector/bootstrap.php', ); array($vendorDir . '/mikey179/vfsstream/src/main/php'), 'Packagist\\Api\\' => array($vendorDir . '/knplabs/packagist-api/src'), ); array($baseDir . '/tests'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), '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'), 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), 'SlevomatCodingStandard\\' => array($vendorDir . '/slevomat/coding-standard/SlevomatCodingStandard'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Plesk\\Wappspector\\' => array($baseDir . '/src'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => array($vendorDir . '/dealerdirect/phpcodesniffer-composer-installer/src'), 'League\\MimeTypeDetection\\' => array($vendorDir . '/league/mime-type-detection/src'), 'League\\Flysystem\\Local\\' => array($vendorDir . '/league/flysystem-local'), 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'), 'Laravel\\SerializableClosure\\' => array($vendorDir . '/laravel/serializable-closure/src'), 'Invoker\\' => array($vendorDir . '/php-di/invoker/src'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), 'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/src'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'DI\\' => array($vendorDir . '/php-di/php-di/src'), 'Clue\\PharComposer\\' => array($vendorDir . '/clue/phar-composer/src'), ); register(true); $filesToLoad = \Composer\Autoload\ComposerStaticInit399b376b13fd0c22b7b02968a5a55b35::$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; } } __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php', 'b33e3d135e5d9e47d845c576147bda89' => __DIR__ . '/..' . '/php-di/php-di/src/functions.php', 'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php', '38143a9afc50997d55e4815db8489d1c' => __DIR__ . '/..' . '/rector/rector/bootstrap.php', ); public static $prefixLengthsPsr4 = array ( 'T' => array ( 'Test\\' => 5, ), 'S' => array ( 'Symfony\\Polyfill\\Php80\\' => 23, 'Symfony\\Polyfill\\Php73\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, 'Symfony\\Polyfill\\Ctype\\' => 23, 'Symfony\\Contracts\\Service\\' => 26, 'Symfony\\Component\\String\\' => 25, 'Symfony\\Component\\Process\\' => 26, 'Symfony\\Component\\Finder\\' => 25, 'Symfony\\Component\\Console\\' => 26, 'SlevomatCodingStandard\\' => 23, ), 'P' => array ( 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, 'Psr\\Http\\Client\\' => 16, 'Psr\\Container\\' => 14, 'Plesk\\Wappspector\\' => 18, 'PhpParser\\' => 10, 'PHPStan\\PhpDocParser\\' => 21, 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => 57, ), 'L' => array ( 'League\\MimeTypeDetection\\' => 25, 'League\\Flysystem\\Local\\' => 23, 'League\\Flysystem\\' => 17, 'Laravel\\SerializableClosure\\' => 28, ), 'I' => array ( 'Invoker\\' => 8, ), 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, ), 'D' => array ( 'Doctrine\\Inflector\\' => 19, 'DeepCopy\\' => 9, 'DI\\' => 3, ), 'C' => array ( 'Clue\\PharComposer\\' => 18, ), ); public static $prefixDirsPsr4 = array ( 'Test\\' => array ( 0 => __DIR__ . '/../..' . '/tests', ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), 'Symfony\\Polyfill\\Php73\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), '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', ), 'Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), 'Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), 'Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), 'Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), 'Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), 'SlevomatCodingStandard\\' => array ( 0 => __DIR__ . '/..' . '/slevomat/coding-standard/SlevomatCodingStandard', ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src', ), 'Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), 'Plesk\\Wappspector\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), 'PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), 'PHPStan\\PhpDocParser\\' => array ( 0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src', ), 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => array ( 0 => __DIR__ . '/..' . '/dealerdirect/phpcodesniffer-composer-installer/src', ), 'League\\MimeTypeDetection\\' => array ( 0 => __DIR__ . '/..' . '/league/mime-type-detection/src', ), 'League\\Flysystem\\Local\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem-local', ), 'League\\Flysystem\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem/src', ), 'Laravel\\SerializableClosure\\' => array ( 0 => __DIR__ . '/..' . '/laravel/serializable-closure/src', ), 'Invoker\\' => array ( 0 => __DIR__ . '/..' . '/php-di/invoker/src', ), 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), 'Doctrine\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/src', ), 'DeepCopy\\' => array ( 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', ), 'DI\\' => array ( 0 => __DIR__ . '/..' . '/php-di/php-di/src', ), 'Clue\\PharComposer\\' => array ( 0 => __DIR__ . '/..' . '/clue/phar-composer/src', ), ); public static $prefixesPsr0 = array ( 'o' => array ( 'org\\bovigo\\vfs\\' => array ( 0 => __DIR__ . '/..' . '/mikey179/vfsstream/src/main/php', ), ), 'P' => array ( 'Packagist\\Api\\' => array ( 0 => __DIR__ . '/..' . '/knplabs/packagist-api/src', ), ), ); public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PHPUnit\\Event\\Application\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/Finished.php', 'PHPUnit\\Event\\Application\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php', 'PHPUnit\\Event\\Application\\Started' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/Started.php', 'PHPUnit\\Event\\Application\\StartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php', 'PHPUnit\\Event\\Code\\ClassMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ClassMethod.php', 'PHPUnit\\Event\\Code\\ComparisonFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ComparisonFailure.php', 'PHPUnit\\Event\\Code\\ComparisonFailureBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php', 'PHPUnit\\Event\\Code\\NoTestCaseObjectOnCallStackException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php', 'PHPUnit\\Event\\Code\\Phpt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/Phpt.php', 'PHPUnit\\Event\\Code\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/Test.php', 'PHPUnit\\Event\\Code\\TestCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestCollection.php', 'PHPUnit\\Event\\Code\\TestCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php', 'PHPUnit\\Event\\Code\\TestDox' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestDox.php', 'PHPUnit\\Event\\Code\\TestDoxBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php', 'PHPUnit\\Event\\Code\\TestMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestMethod.php', 'PHPUnit\\Event\\Code\\TestMethodBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php', 'PHPUnit\\Event\\Code\\Throwable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Throwable.php', 'PHPUnit\\Event\\Code\\ThrowableBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php', 'PHPUnit\\Event\\CollectingDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php', 'PHPUnit\\Event\\DeferringDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php', 'PHPUnit\\Event\\DirectDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php', 'PHPUnit\\Event\\Dispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php', 'PHPUnit\\Event\\DispatchingEmitter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php', 'PHPUnit\\Event\\Emitter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Emitter/Emitter.php', 'PHPUnit\\Event\\Event' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Event.php', 'PHPUnit\\Event\\EventAlreadyAssignedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php', 'PHPUnit\\Event\\EventCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/EventCollection.php', 'PHPUnit\\Event\\EventCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php', 'PHPUnit\\Event\\EventFacadeIsSealedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php', 'PHPUnit\\Event\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/Exception.php', 'PHPUnit\\Event\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Facade.php', 'PHPUnit\\Event\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php', 'PHPUnit\\Event\\InvalidEventException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/InvalidEventException.php', 'PHPUnit\\Event\\InvalidSubscriberException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php', 'PHPUnit\\Event\\MapError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/MapError.php', 'PHPUnit\\Event\\NoPreviousThrowableException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php', 'PHPUnit\\Event\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/RuntimeException.php', 'PHPUnit\\Event\\Runtime\\OperatingSystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php', 'PHPUnit\\Event\\Runtime\\PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/PHP.php', 'PHPUnit\\Event\\Runtime\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php', 'PHPUnit\\Event\\Runtime\\Runtime' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php', 'PHPUnit\\Event\\SubscribableDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php', 'PHPUnit\\Event\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Subscriber.php', 'PHPUnit\\Event\\SubscriberTypeAlreadyRegisteredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php', 'PHPUnit\\Event\\Telemetry\\Duration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php', 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatus' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php', 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatusProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php', 'PHPUnit\\Event\\Telemetry\\HRTime' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php', 'PHPUnit\\Event\\Telemetry\\Info' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Info.php', 'PHPUnit\\Event\\Telemetry\\MemoryMeter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php', 'PHPUnit\\Event\\Telemetry\\MemoryUsage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php', 'PHPUnit\\Event\\Telemetry\\Php81GarbageCollectorStatusProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php', 'PHPUnit\\Event\\Telemetry\\Php83GarbageCollectorStatusProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php', 'PHPUnit\\Event\\Telemetry\\Snapshot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php', 'PHPUnit\\Event\\Telemetry\\StopWatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php', 'PHPUnit\\Event\\Telemetry\\System' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/System.php', 'PHPUnit\\Event\\Telemetry\\SystemMemoryMeter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php', 'PHPUnit\\Event\\Telemetry\\SystemStopWatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php', 'PHPUnit\\Event\\Telemetry\\SystemStopWatchWithOffset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php', 'PHPUnit\\Event\\TestData\\DataFromDataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php', 'PHPUnit\\Event\\TestData\\DataFromTestDependency' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php', 'PHPUnit\\Event\\TestData\\MoreThanOneDataSetFromDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php', 'PHPUnit\\Event\\TestData\\NoDataSetFromDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php', 'PHPUnit\\Event\\TestData\\TestData' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php', 'PHPUnit\\Event\\TestData\\TestDataCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php', 'PHPUnit\\Event\\TestData\\TestDataCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php', 'PHPUnit\\Event\\TestRunner\\BootstrapFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php', 'PHPUnit\\Event\\TestRunner\\BootstrapFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\Configured' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php', 'PHPUnit\\Event\\TestRunner\\ConfiguredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php', 'PHPUnit\\Event\\TestRunner\\DeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php', 'PHPUnit\\Event\\TestRunner\\DeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\TestRunner\\EventFacadeSealed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php', 'PHPUnit\\Event\\TestRunner\\EventFacadeSealedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExecutionAborted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php', 'PHPUnit\\Event\\TestRunner\\ExecutionAbortedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExecutionFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php', 'PHPUnit\\Event\\TestRunner\\ExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExecutionStarted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php', 'PHPUnit\\Event\\TestRunner\\ExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrapped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php', 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrappedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPhar' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php', 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPharSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php', 'PHPUnit\\Event\\TestRunner\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php', 'PHPUnit\\Event\\TestRunner\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php', 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php', 'PHPUnit\\Event\\TestRunner\\Started' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/Started.php', 'PHPUnit\\Event\\TestRunner\\StartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php', 'PHPUnit\\Event\\TestRunner\\WarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php', 'PHPUnit\\Event\\TestRunner\\WarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Filtered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php', 'PHPUnit\\Event\\TestSuite\\FilteredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php', 'PHPUnit\\Event\\TestSuite\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Loaded' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php', 'PHPUnit\\Event\\TestSuite\\LoadedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Skipped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php', 'PHPUnit\\Event\\TestSuite\\SkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Sorted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php', 'PHPUnit\\Event\\TestSuite\\SortedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\Started' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Started.php', 'PHPUnit\\Event\\TestSuite\\StartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php', 'PHPUnit\\Event\\TestSuite\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestMethodWithDataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php', 'PHPUnit\\Event\\TestSuite\\TestSuiteWithName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php', 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\AfterTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php', 'PHPUnit\\Event\\Test\\AfterTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\AfterTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php', 'PHPUnit\\Event\\Test\\AfterTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\AfterTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php', 'PHPUnit\\Event\\Test\\AfterTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\AssertionFailed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php', 'PHPUnit\\Event\\Test\\AssertionFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php', 'PHPUnit\\Event\\Test\\AssertionSucceeded' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php', 'PHPUnit\\Event\\Test\\AssertionSucceededSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php', 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php', 'PHPUnit\\Event\\Test\\BeforeTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\ComparatorRegistered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php', 'PHPUnit\\Event\\Test\\ComparatorRegisteredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php', 'PHPUnit\\Event\\Test\\ConsideredRisky' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php', 'PHPUnit\\Event\\Test\\ConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php', 'PHPUnit\\Event\\Test\\DataProviderMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php', 'PHPUnit\\Event\\Test\\DataProviderMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php', 'PHPUnit\\Event\\Test\\DataProviderMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php', 'PHPUnit\\Event\\Test\\DataProviderMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\DeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php', 'PHPUnit\\Event\\Test\\DeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\ErrorTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php', 'PHPUnit\\Event\\Test\\ErrorTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\Errored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php', 'PHPUnit\\Event\\Test\\ErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php', 'PHPUnit\\Event\\Test\\Failed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php', 'PHPUnit\\Event\\Test\\FailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php', 'PHPUnit\\Event\\Test\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php', 'PHPUnit\\Event\\Test\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php', 'PHPUnit\\Event\\Test\\MarkedIncomplete' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php', 'PHPUnit\\Event\\Test\\MarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php', 'PHPUnit\\Event\\Test\\MockObjectCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php', 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php', 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectForTraitCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php', 'PHPUnit\\Event\\Test\\MockObjectForTraitCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php', 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\NoComparisonFailureException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php', 'PHPUnit\\Event\\Test\\NoticeTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php', 'PHPUnit\\Event\\Test\\NoticeTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PartialMockObjectCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php', 'PHPUnit\\Event\\Test\\PartialMockObjectCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\Passed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php', 'PHPUnit\\Event\\Test\\PassedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php', 'PHPUnit\\Event\\Test\\PhpDeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php', 'PHPUnit\\Event\\Test\\PhpDeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpNoticeTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php', 'PHPUnit\\Event\\Test\\PhpNoticeTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpWarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php', 'PHPUnit\\Event\\Test\\PhpWarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php', 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpunitErrorTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php', 'PHPUnit\\Event\\Test\\PhpunitErrorTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PhpunitWarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php', 'PHPUnit\\Event\\Test\\PhpunitWarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php', 'PHPUnit\\Event\\Test\\PostConditionCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php', 'PHPUnit\\Event\\Test\\PostConditionCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php', 'PHPUnit\\Event\\Test\\PostConditionErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php', 'PHPUnit\\Event\\Test\\PostConditionErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php', 'PHPUnit\\Event\\Test\\PostConditionFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php', 'PHPUnit\\Event\\Test\\PostConditionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\PreConditionCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php', 'PHPUnit\\Event\\Test\\PreConditionCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php', 'PHPUnit\\Event\\Test\\PreConditionErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php', 'PHPUnit\\Event\\Test\\PreConditionErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php', 'PHPUnit\\Event\\Test\\PreConditionFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php', 'PHPUnit\\Event\\Test\\PreConditionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php', 'PHPUnit\\Event\\Test\\PreparationFailed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php', 'PHPUnit\\Event\\Test\\PreparationFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php', 'PHPUnit\\Event\\Test\\PreparationStarted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php', 'PHPUnit\\Event\\Test\\PreparationStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php', 'PHPUnit\\Event\\Test\\Prepared' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php', 'PHPUnit\\Event\\Test\\PreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php', 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutput' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php', 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutputSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php', 'PHPUnit\\Event\\Test\\Skipped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php', 'PHPUnit\\Event\\Test\\SkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php', 'PHPUnit\\Event\\Test\\TestProxyCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php', 'PHPUnit\\Event\\Test\\TestProxyCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\TestStubCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php', 'PHPUnit\\Event\\Test\\TestStubCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php', 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php', 'PHPUnit\\Event\\Test\\WarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php', 'PHPUnit\\Event\\Test\\WarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php', 'PHPUnit\\Event\\Tracer\\Tracer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Tracer.php', 'PHPUnit\\Event\\TypeMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/TypeMap.php', 'PHPUnit\\Event\\UnknownEventException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownEventException.php', 'PHPUnit\\Event\\UnknownEventTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php', 'PHPUnit\\Event\\UnknownSubscriberException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php', 'PHPUnit\\Event\\UnknownSubscriberTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php', 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Framework\\ActualValueIsNotAnObjectException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php', 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', 'PHPUnit\\Framework\\Attributes\\After' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/After.php', 'PHPUnit\\Framework\\Attributes\\AfterClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/AfterClass.php', 'PHPUnit\\Framework\\Attributes\\BackupGlobals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php', 'PHPUnit\\Framework\\Attributes\\BackupStaticProperties' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php', 'PHPUnit\\Framework\\Attributes\\Before' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Before.php', 'PHPUnit\\Framework\\Attributes\\BeforeClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php', 'PHPUnit\\Framework\\Attributes\\CodeCoverageIgnore' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php', 'PHPUnit\\Framework\\Attributes\\CoversClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CoversClass.php', 'PHPUnit\\Framework\\Attributes\\CoversFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php', 'PHPUnit\\Framework\\Attributes\\CoversNothing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php', 'PHPUnit\\Framework\\Attributes\\DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DataProvider.php', 'PHPUnit\\Framework\\Attributes\\DataProviderExternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php', 'PHPUnit\\Framework\\Attributes\\Depends' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Depends.php', 'PHPUnit\\Framework\\Attributes\\DependsExternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php', 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingDeepClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php', 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingShallowClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php', 'PHPUnit\\Framework\\Attributes\\DependsOnClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php', 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingDeepClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php', 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingShallowClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php', 'PHPUnit\\Framework\\Attributes\\DependsUsingDeepClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php', 'PHPUnit\\Framework\\Attributes\\DependsUsingShallowClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php', 'PHPUnit\\Framework\\Attributes\\DoesNotPerformAssertions' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php', 'PHPUnit\\Framework\\Attributes\\ExcludeGlobalVariableFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php', 'PHPUnit\\Framework\\Attributes\\ExcludeStaticPropertyFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Framework\\Attributes\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Group.php', 'PHPUnit\\Framework\\Attributes\\IgnoreClassForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\IgnoreDeprecations' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php', 'PHPUnit\\Framework\\Attributes\\IgnoreFunctionForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\IgnoreMethodForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\Large' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Large.php', 'PHPUnit\\Framework\\Attributes\\Medium' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Medium.php', 'PHPUnit\\Framework\\Attributes\\PostCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/PostCondition.php', 'PHPUnit\\Framework\\Attributes\\PreCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/PreCondition.php', 'PHPUnit\\Framework\\Attributes\\PreserveGlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php', 'PHPUnit\\Framework\\Attributes\\RequiresFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php', 'PHPUnit\\Framework\\Attributes\\RequiresMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php', 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php', 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystemFamily' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php', 'PHPUnit\\Framework\\Attributes\\RequiresPhp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php', 'PHPUnit\\Framework\\Attributes\\RequiresPhpExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php', 'PHPUnit\\Framework\\Attributes\\RequiresPhpunit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php', 'PHPUnit\\Framework\\Attributes\\RequiresSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php', 'PHPUnit\\Framework\\Attributes\\RunClassInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php', 'PHPUnit\\Framework\\Attributes\\RunInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php', 'PHPUnit\\Framework\\Attributes\\RunTestsInSeparateProcesses' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php', 'PHPUnit\\Framework\\Attributes\\Small' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Small.php', 'PHPUnit\\Framework\\Attributes\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Test.php', 'PHPUnit\\Framework\\Attributes\\TestDox' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/TestDox.php', 'PHPUnit\\Framework\\Attributes\\TestWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/TestWith.php', 'PHPUnit\\Framework\\Attributes\\TestWithJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php', 'PHPUnit\\Framework\\Attributes\\Ticket' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Ticket.php', 'PHPUnit\\Framework\\Attributes\\UsesClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/UsesClass.php', 'PHPUnit\\Framework\\Attributes\\UsesFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php', 'PHPUnit\\Framework\\Attributes\\WithoutErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php', 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotAcceptParameterTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareBoolReturnTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareExactlyOneParameterException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareParameterTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\BinaryOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php', 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php', 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php', 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php', 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessageIsOrContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessageMatchesRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php', 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php', 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php', 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php', 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php', 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php', 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php', 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php', 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php', 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php', 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php', 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php', 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php', 'PHPUnit\\Framework\\Constraint\\IsList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php', 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php', 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php', 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php', 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php', 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php', 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php', 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php', 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php', 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php', 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php', 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', 'PHPUnit\\Framework\\Constraint\\ObjectHasProperty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php', 'PHPUnit\\Framework\\Constraint\\Operator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php', 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php', 'PHPUnit\\Framework\\Constraint\\StringEqualsStringIgnoringLineEndings' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php', 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php', 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php', 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php', 'PHPUnit\\Framework\\Constraint\\UnaryOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php', 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', 'PHPUnit\\Framework\\EmptyStringException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php', 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', 'PHPUnit\\Framework\\ExecutionOrderDependency' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php', 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', 'PHPUnit\\Framework\\GeneratorNotSupportedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php', 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php', 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php', 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', 'PHPUnit\\Framework\\InvalidDependencyException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php', 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php', 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php', 'PHPUnit\\Framework\\MockObject\\CannotUseOnlyMethodsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php', 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', 'PHPUnit\\Framework\\MockObject\\DoubledCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Generator\\CannotUseAddMethodsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsEnumerationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsFinalException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsReadonlyException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\DuplicateMethodException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Generator\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php', 'PHPUnit\\Framework\\MockObject\\Generator\\InvalidMethodNameException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php', 'PHPUnit\\Framework\\MockObject\\Generator\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php', 'PHPUnit\\Framework\\MockObject\\Generator\\NameAlreadyInUseException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\OriginalConstructorInvocationRequiredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\ReflectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\SoapExtensionNotAvailableException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\TemplateLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php', 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownClassException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTraitException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php', 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php', 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php', 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php', 'PHPUnit\\Framework\\MockObject\\MatchBuilderNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php', 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php', 'PHPUnit\\Framework\\MockObject\\MatcherAlreadyRegisteredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php', 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php', 'PHPUnit\\Framework\\MockObject\\MethodCannotBeConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameAlreadyConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php', 'PHPUnit\\Framework\\MockObject\\MethodNameNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodParametersAlreadyConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockObjectApi' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php', 'PHPUnit\\Framework\\MockObject\\MockObjectInternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php', 'PHPUnit\\Framework\\MockObject\\NeverReturningMethodException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php', 'PHPUnit\\Framework\\MockObject\\NoMoreReturnValuesConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\ProxiedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php', 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php', 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php', 'PHPUnit\\Framework\\MockObject\\StubApi' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php', 'PHPUnit\\Framework\\MockObject\\StubInternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', 'PHPUnit\\Framework\\PhptAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php', 'PHPUnit\\Framework\\ProcessIsolationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php', 'PHPUnit\\Framework\\Reorderable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Reorderable.php', 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php', 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php', 'PHPUnit\\Framework\\SkippedWithMessageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php', 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', 'PHPUnit\\Framework\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestRunner.php', 'PHPUnit\\Framework\\TestSize\\Known' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Known.php', 'PHPUnit\\Framework\\TestSize\\Large' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Large.php', 'PHPUnit\\Framework\\TestSize\\Medium' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Medium.php', 'PHPUnit\\Framework\\TestSize\\Small' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Small.php', 'PHPUnit\\Framework\\TestSize\\TestSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/TestSize.php', 'PHPUnit\\Framework\\TestSize\\Unknown' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Unknown.php', 'PHPUnit\\Framework\\TestStatus\\Deprecation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php', 'PHPUnit\\Framework\\TestStatus\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Error.php', 'PHPUnit\\Framework\\TestStatus\\Failure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Failure.php', 'PHPUnit\\Framework\\TestStatus\\Incomplete' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php', 'PHPUnit\\Framework\\TestStatus\\Known' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Known.php', 'PHPUnit\\Framework\\TestStatus\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Notice.php', 'PHPUnit\\Framework\\TestStatus\\Risky' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Risky.php', 'PHPUnit\\Framework\\TestStatus\\Skipped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Skipped.php', 'PHPUnit\\Framework\\TestStatus\\Success' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Success.php', 'PHPUnit\\Framework\\TestStatus\\TestStatus' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php', 'PHPUnit\\Framework\\TestStatus\\Unknown' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Unknown.php', 'PHPUnit\\Framework\\TestStatus\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Warning.php', 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', 'PHPUnit\\Framework\\UnknownClassOrInterfaceException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php', 'PHPUnit\\Framework\\UnknownTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php', 'PHPUnit\\Logging\\EventLogger' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/EventLogger.php', 'PHPUnit\\Logging\\JUnit\\JunitXmlLogger' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php', 'PHPUnit\\Logging\\JUnit\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php', 'PHPUnit\\Logging\\JUnit\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparationFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparationStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPrintedUnexpectedOutputSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestRunnerExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php', 'PHPUnit\\Logging\\TeamCity\\TeamCityLogger' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php', 'PHPUnit\\Logging\\TeamCity\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestRunnerExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteBeforeFirstTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php', 'PHPUnit\\Logging\\TeamCity\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\HtmlRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php', 'PHPUnit\\Logging\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php', 'PHPUnit\\Logging\\TestDox\\PlainTextRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php', 'PHPUnit\\Logging\\TestDox\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php', 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php', 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php', 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php', 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php', 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', 'PHPUnit\\Logging\\TestDox\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\Metadata\\After' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/After.php', 'PHPUnit\\Metadata\\AfterClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/AfterClass.php', 'PHPUnit\\Metadata\\Annotation\\Parser\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php', 'PHPUnit\\Metadata\\Annotation\\Parser\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php', 'PHPUnit\\Metadata\\AnnotationsAreNotSupportedForInternalClassesException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php', 'PHPUnit\\Metadata\\Api\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php', 'PHPUnit\\Metadata\\Api\\DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/DataProvider.php', 'PHPUnit\\Metadata\\Api\\Dependencies' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/Dependencies.php', 'PHPUnit\\Metadata\\Api\\Groups' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/Groups.php', 'PHPUnit\\Metadata\\Api\\HookMethods' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/HookMethods.php', 'PHPUnit\\Metadata\\Api\\Requirements' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/Requirements.php', 'PHPUnit\\Metadata\\BackupGlobals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/BackupGlobals.php', 'PHPUnit\\Metadata\\BackupStaticProperties' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/BackupStaticProperties.php', 'PHPUnit\\Metadata\\Before' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Before.php', 'PHPUnit\\Metadata\\BeforeClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/BeforeClass.php', 'PHPUnit\\Metadata\\Covers' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Covers.php', 'PHPUnit\\Metadata\\CoversClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversClass.php', 'PHPUnit\\Metadata\\CoversDefaultClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversDefaultClass.php', 'PHPUnit\\Metadata\\CoversFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversFunction.php', 'PHPUnit\\Metadata\\CoversNothing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversNothing.php', 'PHPUnit\\Metadata\\DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DataProvider.php', 'PHPUnit\\Metadata\\DependsOnClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DependsOnClass.php', 'PHPUnit\\Metadata\\DependsOnMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DependsOnMethod.php', 'PHPUnit\\Metadata\\DoesNotPerformAssertions' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php', 'PHPUnit\\Metadata\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/Exception.php', 'PHPUnit\\Metadata\\ExcludeGlobalVariableFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php', 'PHPUnit\\Metadata\\ExcludeStaticPropertyFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Metadata\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Group.php', 'PHPUnit\\Metadata\\IgnoreClassForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php', 'PHPUnit\\Metadata\\IgnoreDeprecations' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php', 'PHPUnit\\Metadata\\IgnoreFunctionForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Metadata\\IgnoreMethodForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Metadata\\InvalidAttributeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php', 'PHPUnit\\Metadata\\InvalidVersionRequirementException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php', 'PHPUnit\\Metadata\\Metadata' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Metadata.php', 'PHPUnit\\Metadata\\MetadataCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/MetadataCollection.php', 'PHPUnit\\Metadata\\MetadataCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php', 'PHPUnit\\Metadata\\NoVersionRequirementException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php', 'PHPUnit\\Metadata\\Parser\\AnnotationParser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php', 'PHPUnit\\Metadata\\Parser\\AttributeParser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php', 'PHPUnit\\Metadata\\Parser\\CachingParser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/CachingParser.php', 'PHPUnit\\Metadata\\Parser\\Parser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Parser.php', 'PHPUnit\\Metadata\\Parser\\ParserChain' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/ParserChain.php', 'PHPUnit\\Metadata\\Parser\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Registry.php', 'PHPUnit\\Metadata\\PostCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/PostCondition.php', 'PHPUnit\\Metadata\\PreCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/PreCondition.php', 'PHPUnit\\Metadata\\PreserveGlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/PreserveGlobalState.php', 'PHPUnit\\Metadata\\ReflectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php', 'PHPUnit\\Metadata\\RequiresFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresFunction.php', 'PHPUnit\\Metadata\\RequiresMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresMethod.php', 'PHPUnit\\Metadata\\RequiresOperatingSystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php', 'PHPUnit\\Metadata\\RequiresOperatingSystemFamily' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php', 'PHPUnit\\Metadata\\RequiresPhp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresPhp.php', 'PHPUnit\\Metadata\\RequiresPhpExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php', 'PHPUnit\\Metadata\\RequiresPhpunit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresPhpunit.php', 'PHPUnit\\Metadata\\RequiresSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresSetting.php', 'PHPUnit\\Metadata\\RunClassInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php', 'PHPUnit\\Metadata\\RunInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php', 'PHPUnit\\Metadata\\RunTestsInSeparateProcesses' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php', 'PHPUnit\\Metadata\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Test.php', 'PHPUnit\\Metadata\\TestDox' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/TestDox.php', 'PHPUnit\\Metadata\\TestWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/TestWith.php', 'PHPUnit\\Metadata\\Uses' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Uses.php', 'PHPUnit\\Metadata\\UsesClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesClass.php', 'PHPUnit\\Metadata\\UsesDefaultClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesDefaultClass.php', 'PHPUnit\\Metadata\\UsesFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesFunction.php', 'PHPUnit\\Metadata\\Version\\ComparisonRequirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php', 'PHPUnit\\Metadata\\Version\\ConstraintRequirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php', 'PHPUnit\\Metadata\\Version\\Requirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/Requirement.php', 'PHPUnit\\Metadata\\WithoutErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php', 'PHPUnit\\Runner\\Baseline\\Baseline' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Baseline.php', 'PHPUnit\\Runner\\Baseline\\CannotLoadBaselineException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php', 'PHPUnit\\Runner\\Baseline\\FileDoesNotHaveLineException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php', 'PHPUnit\\Runner\\Baseline\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Generator.php', 'PHPUnit\\Runner\\Baseline\\Issue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Issue.php', 'PHPUnit\\Runner\\Baseline\\Reader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Reader.php', 'PHPUnit\\Runner\\Baseline\\RelativePathCalculator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php', 'PHPUnit\\Runner\\Baseline\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\Runner\\Baseline\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\Runner\\Baseline\\Writer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Writer.php', 'PHPUnit\\Runner\\ClassCannotBeFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php', 'PHPUnit\\Runner\\ClassDoesNotExtendTestCaseException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php', 'PHPUnit\\Runner\\ClassIsAbstractException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php', 'PHPUnit\\Runner\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/CodeCoverage.php', 'PHPUnit\\Runner\\CodeCoverageFileExistsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php', 'PHPUnit\\Runner\\DirectoryDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php', 'PHPUnit\\Runner\\ErrorException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ErrorException.php', 'PHPUnit\\Runner\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ErrorHandler.php', 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/Exception.php', 'PHPUnit\\Runner\\Extension\\Extension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/Extension.php', 'PHPUnit\\Runner\\Extension\\ExtensionBootstrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php', 'PHPUnit\\Runner\\Extension\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/Facade.php', 'PHPUnit\\Runner\\Extension\\ParameterCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php', 'PHPUnit\\Runner\\Extension\\PharLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/PharLoader.php', 'PHPUnit\\Runner\\FileDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', 'PHPUnit\\Runner\\Filter\\TestIdFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php', 'PHPUnit\\Runner\\GarbageCollection\\ExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php', 'PHPUnit\\Runner\\GarbageCollection\\ExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php', 'PHPUnit\\Runner\\GarbageCollection\\GarbageCollectionHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php', 'PHPUnit\\Runner\\GarbageCollection\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php', 'PHPUnit\\Runner\\GarbageCollection\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Runner\\InvalidOrderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php', 'PHPUnit\\Runner\\InvalidPhptFileException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php', 'PHPUnit\\Runner\\ParameterDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php', 'PHPUnit\\Runner\\PhptExternalFileCannotBeLoadedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php', 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', 'PHPUnit\\Runner\\ResultCache\\DefaultResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php', 'PHPUnit\\Runner\\ResultCache\\NullResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php', 'PHPUnit\\Runner\\ResultCache\\ResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php', 'PHPUnit\\Runner\\ResultCache\\ResultCacheHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php', 'PHPUnit\\Runner\\ResultCache\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\Runner\\ResultCache\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', 'PHPUnit\\Runner\\UnsupportedPhptSectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php', 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\TestRunner\\TestResult\\AfterTestClassMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\BeforeTestClassMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\Collector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Collector.php', 'PHPUnit\\TestRunner\\TestResult\\ExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Facade.php', 'PHPUnit\\TestRunner\\TestResult\\Issues\\Issue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Issue.php', 'PHPUnit\\TestRunner\\TestResult\\PassedTests' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/PassedTests.php', 'PHPUnit\\TestRunner\\TestResult\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/TestResult.php', 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSuiteSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\TextUI\\Application' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Application.php', 'PHPUnit\\TextUI\\CannotOpenSocketException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php', 'PHPUnit\\TextUI\\CliArguments\\Builder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php', 'PHPUnit\\TextUI\\CliArguments\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php', 'PHPUnit\\TextUI\\CliArguments\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php', 'PHPUnit\\TextUI\\CliArguments\\XmlConfigurationFileFinder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php', 'PHPUnit\\TextUI\\Command\\AtLeastVersionCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php', 'PHPUnit\\TextUI\\Command\\CheckPhpConfigurationCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php', 'PHPUnit\\TextUI\\Command\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Command.php', 'PHPUnit\\TextUI\\Command\\GenerateConfigurationCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php', 'PHPUnit\\TextUI\\Command\\ListGroupsCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php', 'PHPUnit\\TextUI\\Command\\ListTestSuitesCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php', 'PHPUnit\\TextUI\\Command\\ListTestsAsTextCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php', 'PHPUnit\\TextUI\\Command\\ListTestsAsXmlCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php', 'PHPUnit\\TextUI\\Command\\MigrateConfigurationCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php', 'PHPUnit\\TextUI\\Command\\Result' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Result.php', 'PHPUnit\\TextUI\\Command\\ShowHelpCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php', 'PHPUnit\\TextUI\\Command\\ShowVersionCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php', 'PHPUnit\\TextUI\\Command\\VersionCheckCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php', 'PHPUnit\\TextUI\\Command\\WarmCodeCoverageCacheCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php', 'PHPUnit\\TextUI\\Configuration\\Builder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Builder.php', 'PHPUnit\\TextUI\\Configuration\\CodeCoverageFilterRegistry' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php', 'PHPUnit\\TextUI\\Configuration\\CodeCoverageReportNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php', 'PHPUnit\\TextUI\\Configuration\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Configuration.php', 'PHPUnit\\TextUI\\Configuration\\ConfigurationCannotBeBuiltException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php', 'PHPUnit\\TextUI\\Configuration\\Constant' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php', 'PHPUnit\\TextUI\\Configuration\\ConstantCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php', 'PHPUnit\\TextUI\\Configuration\\ConstantCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\Directory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php', 'PHPUnit\\TextUI\\Configuration\\DirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php', 'PHPUnit\\TextUI\\Configuration\\DirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php', 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrap' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php', 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php', 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\File' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/File.php', 'PHPUnit\\TextUI\\Configuration\\FileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php', 'PHPUnit\\TextUI\\Configuration\\FileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\FilterDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php', 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php', 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\FilterNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php', 'PHPUnit\\TextUI\\Configuration\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php', 'PHPUnit\\TextUI\\Configuration\\GroupCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php', 'PHPUnit\\TextUI\\Configuration\\GroupCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\IniSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php', 'PHPUnit\\TextUI\\Configuration\\IniSettingCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php', 'PHPUnit\\TextUI\\Configuration\\IniSettingCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\LoggingNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php', 'PHPUnit\\TextUI\\Configuration\\Merger' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Merger.php', 'PHPUnit\\TextUI\\Configuration\\NoBaselineException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php', 'PHPUnit\\TextUI\\Configuration\\NoBootstrapException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php', 'PHPUnit\\TextUI\\Configuration\\NoCacheDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php', 'PHPUnit\\TextUI\\Configuration\\NoCliArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php', 'PHPUnit\\TextUI\\Configuration\\NoConfigurationFileException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php', 'PHPUnit\\TextUI\\Configuration\\NoCoverageCacheDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php', 'PHPUnit\\TextUI\\Configuration\\NoCustomCssFileException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php', 'PHPUnit\\TextUI\\Configuration\\NoDefaultTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php', 'PHPUnit\\TextUI\\Configuration\\NoPharExtensionDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php', 'PHPUnit\\TextUI\\Configuration\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php', 'PHPUnit\\TextUI\\Configuration\\PhpHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php', 'PHPUnit\\TextUI\\Configuration\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Registry.php', 'PHPUnit\\TextUI\\Configuration\\Source' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php', 'PHPUnit\\TextUI\\Configuration\\SourceFilter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php', 'PHPUnit\\TextUI\\Configuration\\SourceMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php', 'PHPUnit\\TextUI\\Configuration\\TestDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php', 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php', 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\TestFile' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php', 'PHPUnit\\TextUI\\Configuration\\TestFileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php', 'PHPUnit\\TextUI\\Configuration\\TestFileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php', 'PHPUnit\\TextUI\\Configuration\\TestSuiteBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php', 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php', 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php', 'PHPUnit\\TextUI\\Configuration\\Variable' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php', 'PHPUnit\\TextUI\\Configuration\\VariableCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php', 'PHPUnit\\TextUI\\Configuration\\VariableCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php', 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/Exception.php', 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', 'PHPUnit\\TextUI\\InvalidSocketException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php', 'PHPUnit\\TextUI\\Output\\DefaultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\BeforeTestClassMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\ProgressPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestRunnerExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php', 'PHPUnit\\TextUI\\Output\\Default\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php', 'PHPUnit\\TextUI\\Output\\Default\\UnexpectedOutputPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php', 'PHPUnit\\TextUI\\Output\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Facade.php', 'PHPUnit\\TextUI\\Output\\NullPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php', 'PHPUnit\\TextUI\\Output\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php', 'PHPUnit\\TextUI\\Output\\SummaryPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php', 'PHPUnit\\TextUI\\Output\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php', 'PHPUnit\\TextUI\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php', 'PHPUnit\\TextUI\\ShellExitCodeCalculator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php', 'PHPUnit\\TextUI\\TestDirectoryNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php', 'PHPUnit\\TextUI\\TestFileNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php', 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', 'PHPUnit\\TextUI\\TestSuiteFilterProcessor' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CannotFindSchemaException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConvertLogTypes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCloverToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCrap4jToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageHtmlToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoveragePhpToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageTextToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageXmlToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\DefaultConfiguration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php', 'PHPUnit\\TextUI\\XmlConfiguration\\FailedSchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Groups' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCacheDirectoryAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCoverageElement' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php', 'PHPUnit\\TextUI\\XmlConfiguration\\LoadedFromFileConfiguration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php', 'PHPUnit\\TextUI\\XmlConfiguration\\LogToReportMigration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Junit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Logging' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveCoverageDirectoriesToSource' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistIncludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutTodoAnnotatedTestsAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheResultFileAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheTokensAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveConversionToExceptionsAttributes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementCacheDirectoryAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementProcessUncoveredFilesAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveEmptyFilter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveListeners' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLogTypes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLoggingElements' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveNoInteractionAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemovePrinterAttributes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestDoxGroupsElement' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestSuiteLoaderAttributes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveVerboseAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBackupStaticAttributesAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBeStrictAboutCoversAnnotationAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RenameForceCoversAnnotationAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetector' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaFinder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SnapshotNodeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php', 'PHPUnit\\TextUI\\XmlConfiguration\\SuccessfulSchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php', 'PHPUnit\\TextUI\\XmlConfiguration\\UpdateSchemaLocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ValidationResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Validator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php', 'PHPUnit\\Util\\Cloner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Cloner.php', 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/Exception.php', 'PHPUnit\\Util\\ExcludeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ExcludeList.php', 'PHPUnit\\Util\\Exporter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exporter.php', 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', 'PHPUnit\\Util\\Http\\Downloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Http/Downloader.php', 'PHPUnit\\Util\\Http\\PhpDownloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Http/PhpDownloader.php', 'PHPUnit\\Util\\InvalidDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php', 'PHPUnit\\Util\\InvalidJsonException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php', 'PHPUnit\\Util\\InvalidVersionOperatorException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php', 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\PhpProcessException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/PhpProcessException.php', 'PHPUnit\\Util\\Reflection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Reflection.php', 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\ThrowableToStringMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ThrowableToStringMapper.php', 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Xml.php', 'PHPUnit\\Util\\Xml\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Loader.php', 'PHPUnit\\Util\\Xml\\XmlException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/XmlException.php', 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', 'PharIo\\Manifest\\ElementCollectionException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ElementCollectionException.php', 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php', 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', 'PharIo\\Manifest\\NoEmailAddressException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/NoEmailAddressException.php', 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', 'PharIo\\Version\\BuildMetaData' => __DIR__ . '/..' . '/phar-io/version/src/BuildMetaData.php', 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', 'PharIo\\Version\\NoBuildMetaDataException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/NoBuildMetaDataException.php', 'PharIo\\Version\\NoPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php', 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', 'SebastianBergmann\\CliParser\\Exception' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/Exception.php', 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', 'SebastianBergmann\\CliParser\\Parser' => __DIR__ . '/..' . '/sebastian/cli-parser/src/Parser.php', 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', 'SebastianBergmann\\CliParser\\UnknownOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\Data\\ProcessedCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\Data\\RawCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Selector.php', 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/XdebugDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotEnabledException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php', 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', 'SebastianBergmann\\CodeCoverage\\FileCouldNotBeWrittenException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php', 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', 'SebastianBergmann\\CodeCoverage\\ParserException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ParserException.php', 'SebastianBergmann\\CodeCoverage\\ReflectionException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Cobertura.php', 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Colors' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Colors.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\CustomCssFile' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', 'SebastianBergmann\\CodeCoverage\\Report\\Thresholds' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Thresholds.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Known' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Known.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Large' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Large.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Medium' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Medium.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Small' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Small.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\TestSize' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/TestSize.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Unknown' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Unknown.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Failure' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Failure.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Known' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Known.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Success' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Success.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\TestStatus' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/TestStatus.php', 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Unknown' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Unknown.php', 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Filesystem.php', 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Percentage.php', 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', 'SebastianBergmann\\CodeCoverage\\XmlException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XmlException.php', 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassMethodUnit.php', 'SebastianBergmann\\CodeUnit\\ClassUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollection.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', 'SebastianBergmann\\CodeUnit\\Exception' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/Exception.php', 'SebastianBergmann\\CodeUnit\\FileUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/FileUnit.php', 'SebastianBergmann\\CodeUnit\\FunctionUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/FunctionUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceMethodUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceUnit.php', 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', 'SebastianBergmann\\CodeUnit\\Mapper' => __DIR__ . '/..' . '/sebastian/code-unit/src/Mapper.php', 'SebastianBergmann\\CodeUnit\\NoTraitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/NoTraitException.php', 'SebastianBergmann\\CodeUnit\\ReflectionException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/ReflectionException.php', 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitMethodUnit.php', 'SebastianBergmann\\CodeUnit\\TraitUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitUnit.php', 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', 'SebastianBergmann\\Comparator\\Exception' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/Exception.php', 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', 'SebastianBergmann\\Comparator\\RuntimeException' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Complexity\\Calculator' => __DIR__ . '/..' . '/sebastian/complexity/src/Calculator.php', 'SebastianBergmann\\Complexity\\Complexity' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/Complexity.php', 'SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor' => __DIR__ . '/..' . '/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\ComplexityCollection' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/ComplexityCollection.php', 'SebastianBergmann\\Complexity\\ComplexityCollectionIterator' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php', 'SebastianBergmann\\Complexity\\CyclomaticComplexityCalculatingVisitor' => __DIR__ . '/..' . '/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\Exception' => __DIR__ . '/..' . '/sebastian/complexity/src/Exception/Exception.php', 'SebastianBergmann\\Complexity\\RuntimeException' => __DIR__ . '/..' . '/sebastian/complexity/src/Exception/RuntimeException.php', 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', 'SebastianBergmann\\FileIterator\\ExcludeIterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/ExcludeIterator.php', 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', 'SebastianBergmann\\GlobalState\\ExcludeList' => __DIR__ . '/..' . '/sebastian/global-state/src/ExcludeList.php', 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', 'SebastianBergmann\\Invoker\\Exception' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/Exception.php', 'SebastianBergmann\\Invoker\\Invoker' => __DIR__ . '/..' . '/phpunit/php-invoker/src/Invoker.php', 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', 'SebastianBergmann\\Invoker\\TimeoutException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', 'SebastianBergmann\\LinesOfCode\\Counter' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Counter.php', 'SebastianBergmann\\LinesOfCode\\Exception' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/Exception.php', 'SebastianBergmann\\LinesOfCode\\IllogicalValuesException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php', 'SebastianBergmann\\LinesOfCode\\LineCountingVisitor' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/LineCountingVisitor.php', 'SebastianBergmann\\LinesOfCode\\LinesOfCode' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/LinesOfCode.php', 'SebastianBergmann\\LinesOfCode\\NegativeValueException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/NegativeValueException.php', 'SebastianBergmann\\LinesOfCode\\RuntimeException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/RuntimeException.php', 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', 'SebastianBergmann\\Template\\Exception' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/Exception.php', 'SebastianBergmann\\Template\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', 'SebastianBergmann\\Template\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Template\\Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', 'SebastianBergmann\\Timer\\Duration' => __DIR__ . '/..' . '/phpunit/php-timer/src/Duration.php', 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/Exception.php', 'SebastianBergmann\\Timer\\NoActiveTimerException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => __DIR__ . '/..' . '/phpunit/php-timer/src/ResourceUsageFormatter.php', 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/type/CallableType.php', 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', 'SebastianBergmann\\Type\\FalseType' => __DIR__ . '/..' . '/sebastian/type/src/type/FalseType.php', 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/GenericObjectType.php', 'SebastianBergmann\\Type\\IntersectionType' => __DIR__ . '/..' . '/sebastian/type/src/type/IntersectionType.php', 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/type/IterableType.php', 'SebastianBergmann\\Type\\MixedType' => __DIR__ . '/..' . '/sebastian/type/src/type/MixedType.php', 'SebastianBergmann\\Type\\NeverType' => __DIR__ . '/..' . '/sebastian/type/src/type/NeverType.php', 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/type/NullType.php', 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/ObjectType.php', 'SebastianBergmann\\Type\\Parameter' => __DIR__ . '/..' . '/sebastian/type/src/Parameter.php', 'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php', 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/type/SimpleType.php', 'SebastianBergmann\\Type\\StaticType' => __DIR__ . '/..' . '/sebastian/type/src/type/StaticType.php', 'SebastianBergmann\\Type\\TrueType' => __DIR__ . '/..' . '/sebastian/type/src/type/TrueType.php', 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/type/Type.php', 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', 'SebastianBergmann\\Type\\UnionType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnionType.php', 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnknownType.php', 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/type/VoidType.php', 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit399b376b13fd0c22b7b02968a5a55b35::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit399b376b13fd0c22b7b02968a5a55b35::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInit399b376b13fd0c22b7b02968a5a55b35::$prefixesPsr0; $loader->classMap = ComposerStaticInit399b376b13fd0c22b7b02968a5a55b35::$classMap; }, null, ClassLoader::class); } } { "packages": [ { "name": "clue/phar-composer", "version": "v1.4.0", "version_normalized": "1.4.0.0", "source": { "type": "git", "url": "https://github.com/clue/phar-composer.git", "reference": "0cae6984e0da45639881d3b26442d525b8b65406" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/clue/phar-composer/zipball/0cae6984e0da45639881d3b26442d525b8b65406", "reference": "0cae6984e0da45639881d3b26442d525b8b65406", "shasum": "" }, "require": { "knplabs/packagist-api": "^1.0", "php": ">=5.3.6", "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5", "symfony/finder": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5", "symfony/process": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5" }, "require-dev": { "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "time": "2022-02-14T11:28:08+00:00", "bin": [ "bin/phar-composer" ], "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Clue\\PharComposer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Christian Lück", "email": "christian@clue.engineering" } ], "description": "Simple phar creation for any project managed via Composer", "homepage": "https://github.com/clue/phar-composer", "keywords": [ "build process", "bundle dependencies", "composer", "executable phar", "phar" ], "support": { "issues": "https://github.com/clue/phar-composer/issues", "source": "https://github.com/clue/phar-composer/tree/v1.4.0" }, "funding": [ { "url": "https://clue.engineering/support", "type": "custom" }, { "url": "https://github.com/clue", "type": "github" } ], "install-path": "../clue/phar-composer" }, { "name": "dealerdirect/phpcodesniffer-composer-installer", "version": "v1.2.1", "version_normalized": "1.2.1.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/963f0c67bffde0eac41b56be71ac0e8ba132f0bd", "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd", "shasum": "" }, "require": { "composer-plugin-api": "^2.2", "php": ">=5.4", "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", "php-parallel-lint/php-parallel-lint": "^1.4.0", "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "time": "2026-05-06T08:26:05+00:00", "type": "composer-plugin", "extra": { "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, "installation-source": "dist", "autoload": { "psr-4": { "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Franck Nijhof", "email": "opensource@frenck.dev", "homepage": "https://frenck.dev", "role": "Open source developer" }, { "name": "Contributors", "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", "code quality", "codesniffer", "composer", "installer", "phpcbf", "phpcs", "plugin", "qa", "quality", "standard", "standards", "style guide", "stylecheck", "tests" ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, "funding": [ { "url": "https://github.com/PHPCSStandards", "type": "github" }, { "url": "https://github.com/jrfnl", "type": "github" }, { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" }, { "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], "install-path": "../dealerdirect/phpcodesniffer-composer-installer" }, { "name": "doctrine/inflector", "version": "2.1.0", "version_normalized": "2.1.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^12.0 || ^13.0", "phpstan/phpstan": "^1.12 || ^2.0", "phpstan/phpstan-phpunit": "^1.4 || ^2.0", "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", "phpunit/phpunit": "^8.5 || ^12.2" }, "time": "2025-08-10T19:31:58+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, { "name": "Roman Borschel", "email": "roman@code-factory.org" }, { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" } ], "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ "inflection", "inflector", "lowercase", "manipulation", "php", "plural", "singular", "strings", "uppercase", "words" ], "support": { "issues": "https://github.com/doctrine/inflector/issues", "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { "url": "https://www.patreon.com/phpdoctrine", "type": "patreon" }, { "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", "type": "tidelift" } ], "install-path": "../doctrine/inflector" }, { "name": "guzzlehttp/guzzle", "version": "7.10.0", "version_normalized": "7.10.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^2.3", "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "time": "2025-08-23T22:36:01+00:00", "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "installation-source": "dist", "autoload": { "files": [ "src/functions_include.php" ], "psr-4": { "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Jeremy Lindblom", "email": "jeremeamia@gmail.com", "homepage": "https://github.com/jeremeamia" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], "description": "Guzzle is a PHP HTTP client library", "keywords": [ "client", "curl", "framework", "http", "http client", "psr-18", "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", "type": "tidelift" } ], "install-path": "../guzzlehttp/guzzle" }, { "name": "guzzlehttp/promises", "version": "2.3.0", "version_normalized": "2.3.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "time": "2025-08-22T14:34:08+00:00", "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "installation-source": "dist", "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", "keywords": [ "promise" ], "support": { "issues": "https://github.com/guzzle/promises/issues", "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", "type": "tidelift" } ], "install-path": "../guzzlehttp/promises" }, { "name": "guzzlehttp/psr7", "version": "2.9.0", "version_normalized": "2.9.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "time": "2026-03-10T16:41:02+00:00", "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "installation-source": "dist", "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ "http", "message", "psr-7", "request", "response", "stream", "uri", "url" ], "support": { "issues": "https://github.com/guzzle/psr7/issues", "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { "url": "https://github.com/GrahamCampbell", "type": "github" }, { "url": "https://github.com/Nyholm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], "install-path": "../guzzlehttp/psr7" }, { "name": "knplabs/packagist-api", "version": "v1.7.2", "version_normalized": "1.7.2.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/packagist-api.git", "reference": "4feae228a4505c1cd817da61e752e5dea2b22c2d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/KnpLabs/packagist-api/zipball/4feae228a4505c1cd817da61e752e5dea2b22c2d", "reference": "4feae228a4505c1cd817da61e752e5dea2b22c2d", "shasum": "" }, "require": { "doctrine/inflector": "^1.0 || ^2.0", "guzzlehttp/guzzle": "^6.0 || ^7.0", "php": "^7.1 || ^8.0" }, "require-dev": { "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0", "squizlabs/php_codesniffer": "^3.0" }, "time": "2022-03-01T08:20:15+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { "Packagist\\Api\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "KnpLabs Team", "homepage": "http://knplabs.com" } ], "description": "Packagist API client.", "homepage": "http://knplabs.com", "keywords": [ "api", "composer", "packagist" ], "support": { "issues": "https://github.com/KnpLabs/packagist-api/issues", "source": "https://github.com/KnpLabs/packagist-api/tree/v1.7.2" }, "install-path": "../knplabs/packagist-api" }, { "name": "laravel/serializable-closure", "version": "v2.0.13", "version_normalized": "2.0.13.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.67|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "time": "2026-04-16T14:03:50+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Taylor Otwell", "email": "taylor@laravel.com" }, { "name": "Nuno Maduro", "email": "nuno@laravel.com" } ], "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": [ "closure", "laravel", "serializable" ], "support": { "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, "install-path": "../laravel/serializable-closure" }, { "name": "league/flysystem", "version": "3.34.0", "version_normalized": "3.34.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", "shasum": "" }, "require": { "league/flysystem-local": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, "conflict": { "async-aws/core": "<1.19.0", "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", "phpseclib/phpseclib": "3.0.15", "symfony/http-client": "<5.2" }, "require-dev": { "async-aws/s3": "^1.5 || ^2.0", "async-aws/simple-s3": "^1.1 || ^2.0", "aws/aws-sdk-php": "^3.295.10", "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", "sabre/dav": "^4.6.0" }, "time": "2026-05-14T10:28:08+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "description": "File storage abstraction for PHP", "keywords": [ "WebDAV", "aws", "cloud", "file", "files", "filesystem", "filesystems", "ftp", "s3", "sftp", "storage" ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", "source": "https://github.com/thephpleague/flysystem/tree/3.34.0" }, "install-path": "../league/flysystem" }, { "name": "league/flysystem-local", "version": "3.31.0", "version_normalized": "3.31.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", "shasum": "" }, "require": { "ext-fileinfo": "*", "league/flysystem": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, "time": "2026-01-23T15:30:45+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "description": "Local filesystem adapter for Flysystem.", "keywords": [ "Flysystem", "file", "files", "filesystem", "local" ], "support": { "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" }, "install-path": "../league/flysystem-local" }, { "name": "league/mime-type-detection", "version": "1.16.0", "version_normalized": "1.16.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { "ext-fileinfo": "*", "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "time": "2024-09-21T08:32:55+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "League\\MimeTypeDetection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { "url": "https://github.com/frankdejonge", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/league/flysystem", "type": "tidelift" } ], "install-path": "../league/mime-type-detection" }, { "name": "mikey179/vfsstream", "version": "v1.6.12", "version_normalized": "1.6.12.0", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { "phpunit/phpunit": "^7.5||^8.5||^9.6", "yoast/phpunit-polyfills": "^2.0" }, "time": "2024-08-29T18:43:31+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.6.x-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { "org\\bovigo\\vfs\\": "src/main/php" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Frank Kleine", "homepage": "http://frankkleine.de/", "role": "Developer" } ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", "support": { "issues": "https://github.com/bovigo/vfsStream/issues", "source": "https://github.com/bovigo/vfsStream/tree/master", "wiki": "https://github.com/bovigo/vfsStream/wiki" }, "install-path": "../mikey179/vfsstream" }, { "name": "myclabs/deep-copy", "version": "1.13.4", "version_normalized": "1.13.4.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "time": "2025-08-01T08:46:24+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "src/DeepCopy/deep_copy.php" ], "psr-4": { "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], "install-path": "../myclabs/deep-copy" }, { "name": "nikic/php-parser", "version": "v5.7.0", "version_normalized": "5.7.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^9.0" }, "time": "2025-12-06T11:56:16+00:00", "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { "dev-master": "5.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov" } ], "description": "A PHP parser written in PHP", "keywords": [ "parser", "php" ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, "install-path": "../nikic/php-parser" }, { "name": "phar-io/manifest", "version": "2.0.4", "version_normalized": "2.0.4.0", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", "php": "^7.2 || ^8.0" }, "time": "2024-03-03T12:33:53+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], "install-path": "../phar-io/manifest" }, { "name": "phar-io/version", "version": "3.2.1", "version_normalized": "3.2.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "time": "2022-02-21T01:04:05+00:00", "type": "library", "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", "source": "https://github.com/phar-io/version/tree/3.2.1" }, "install-path": "../phar-io/version" }, { "name": "php-di/invoker", "version": "2.3.7", "version_normalized": "2.3.7.0", "source": { "type": "git", "url": "https://github.com/PHP-DI/Invoker.git", "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1", "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1", "shasum": "" }, "require": { "php": ">=7.3", "psr/container": "^1.0|^2.0" }, "require-dev": { "athletic/athletic": "~0.1.8", "mnapoli/hard-mode": "~0.3.0", "phpunit/phpunit": "^9.0 || ^10 || ^11 || ^12" }, "time": "2025-08-30T10:22:22+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Invoker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Generic and extensible callable invoker", "homepage": "https://github.com/PHP-DI/Invoker", "keywords": [ "callable", "dependency", "dependency-injection", "injection", "invoke", "invoker" ], "support": { "issues": "https://github.com/PHP-DI/Invoker/issues", "source": "https://github.com/PHP-DI/Invoker/tree/2.3.7" }, "funding": [ { "url": "https://github.com/mnapoli", "type": "github" } ], "install-path": "../php-di/invoker" }, { "name": "php-di/php-di", "version": "7.1.1", "version_normalized": "7.1.1.0", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", "reference": "f88054cc052e40dbe7b383c8817c19442d480352" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352", "reference": "f88054cc052e40dbe7b383c8817c19442d480352", "shasum": "" }, "require": { "laravel/serializable-closure": "^1.0 || ^2.0", "php": ">=8.0", "php-di/invoker": "^2.0", "psr/container": "^1.1 || ^2.0" }, "provide": { "psr/container-implementation": "^1.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3", "friendsofphp/proxy-manager-lts": "^1", "mnapoli/phpunit-easymock": "^1.3", "phpunit/phpunit": "^9.6 || ^10 || ^11", "vimeo/psalm": "^5|^6" }, "suggest": { "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" }, "time": "2025-08-16T11:10:48+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "src/functions.php" ], "psr-4": { "DI\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "The dependency injection container for humans", "homepage": "https://php-di.org/", "keywords": [ "PSR-11", "container", "container-interop", "dependency injection", "di", "ioc", "psr11" ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", "source": "https://github.com/PHP-DI/PHP-DI/tree/7.1.1" }, "funding": [ { "url": "https://github.com/mnapoli", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", "type": "tidelift" } ], "install-path": "../php-di/php-di" }, { "name": "phpstan/phpdoc-parser", "version": "2.3.2", "version_normalized": "2.3.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "time": "2026-01-25T14:56:51+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, "install-path": "../phpstan/phpdoc-parser" }, { "name": "phpstan/phpstan", "version": "1.12.33", "version_normalized": "1.12.33.0", "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1", "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1", "shasum": "" }, "require": { "php": "^7.2|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" }, "time": "2026-02-28T20:30:03+00:00", "bin": [ "phpstan", "phpstan.phar" ], "type": "library", "installation-source": "dist", "autoload": { "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ "dev", "static analysis" ], "support": { "docs": "https://phpstan.org/user-guide/getting-started", "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", "security": "https://github.com/phpstan/phpstan/security/policy", "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { "url": "https://github.com/ondrejmirtes", "type": "github" }, { "url": "https://github.com/phpstan", "type": "github" } ], "install-path": "../phpstan/phpstan" }, { "name": "phpunit/php-code-coverage", "version": "10.1.16", "version_normalized": "10.1.16.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-text-template": "^3.0.1", "sebastian/code-unit-reverse-lookup": "^3.0.0", "sebastian/complexity": "^3.2.0", "sebastian/environment": "^6.1.0", "sebastian/lines-of-code": "^2.0.2", "sebastian/version": "^4.0.1", "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "time": "2024-08-22T04:31:57+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "10.1.x-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-code-coverage" }, { "name": "phpunit/php-file-iterator", "version": "4.1.0", "version_normalized": "4.1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-08-31T06:24:48+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-file-iterator" }, { "name": "phpunit/php-invoker", "version": "4.0.0", "version_normalized": "4.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" }, "time": "2023-02-03T06:56:09+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Invoke callables with a timeout", "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ "process" ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-invoker" }, { "name": "phpunit/php-text-template", "version": "3.0.1", "version_normalized": "3.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-08-31T14:07:24+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-text-template" }, { "name": "phpunit/php-timer", "version": "6.0.0", "version_normalized": "6.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-02-03T06:57:52+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "6.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-timer" }, { "name": "phpunit/phpunit", "version": "10.5.63", "version_normalized": "10.5.63.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "33198268dad71e926626b618f3ec3966661e4d90" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", "reference": "33198268dad71e926626b618f3ec3966661e4d90", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", "phpunit/php-code-coverage": "^10.1.16", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-invoker": "^4.0.0", "phpunit/php-text-template": "^3.0.1", "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", "sebastian/comparator": "^5.0.5", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.4", "sebastian/global-state": "^6.0.2", "sebastian/object-enumerator": "^5.0.0", "sebastian/recursion-context": "^5.0.1", "sebastian/type": "^4.0.0", "sebastian/version": "^4.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" }, "time": "2026-01-27T05:48:37+00:00", "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-main": "10.5-dev" } }, "installation-source": "dist", "autoload": { "files": [ "src/Framework/Assert/Functions.php" ], "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" }, "funding": [ { "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], "install-path": "../phpunit/phpunit" }, { "name": "psr/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": { "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/http-client", "version": "1.0.3", "version_normalized": "1.0.3.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", "psr/http-message": "^1.0 || ^2.0" }, "time": "2023-09-23T14:17:50+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", "homepage": "https://github.com/php-fig/http-client", "keywords": [ "http", "http-client", "psr", "psr-18" ], "support": { "source": "https://github.com/php-fig/http-client" }, "install-path": "../psr/http-client" }, { "name": "psr/http-factory", "version": "1.1.0", "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "time": "2024-04-15T12:06:14+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", "message", "psr", "psr-17", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-factory" }, "install-path": "../psr/http-factory" }, { "name": "psr/http-message", "version": "2.0", "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "time": "2023-04-04T09:54:51+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-message/tree/2.0" }, "install-path": "../psr/http-message" }, { "name": "psr/log", "version": "2.0.0", "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { "php": ">=8.0.0" }, "time": "2021-07-14T16:41:46+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], "support": { "source": "https://github.com/php-fig/log/tree/2.0.0" }, "install-path": "../psr/log" }, { "name": "ralouphie/getallheaders", "version": "3.0.3", "version_normalized": "3.0.3.0", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { "php": ">=5.6" }, "require-dev": { "php-coveralls/php-coveralls": "^2.1", "phpunit/phpunit": "^5 || ^6.5" }, "time": "2019-03-08T08:55:37+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "src/getallheaders.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ralph Khattar", "email": "ralph.khattar@gmail.com" } ], "description": "A polyfill for getallheaders.", "support": { "issues": "https://github.com/ralouphie/getallheaders/issues", "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, "install-path": "../ralouphie/getallheaders" }, { "name": "rector/rector", "version": "1.2.10", "version_normalized": "1.2.10.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", "reference": "40f9cf38c05296bd32f444121336a521a293fa61" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", "reference": "40f9cf38c05296bd32f444121336a521a293fa61", "shasum": "" }, "require": { "php": "^7.2|^8.0", "phpstan/phpstan": "^1.12.5" }, "conflict": { "rector/rector-doctrine": "*", "rector/rector-downgrade-php": "*", "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, "suggest": { "ext-dom": "To manipulate phpunit.xml via the custom-rule command" }, "time": "2024-11-08T13:59:10+00:00", "bin": [ "bin/rector" ], "type": "library", "installation-source": "dist", "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/1.2.10" }, "funding": [ { "url": "https://github.com/tomasvotruba", "type": "github" } ], "install-path": "../rector/rector" }, { "name": "sebastian/cli-parser", "version": "2.0.1", "version_normalized": "2.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2024-03-02T07:12:49+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/cli-parser" }, { "name": "sebastian/code-unit", "version": "2.0.0", "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-02-03T06:58:43+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/code-unit" }, { "name": "sebastian/code-unit-reverse-lookup", "version": "3.0.0", "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-02-03T06:59:15+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/code-unit-reverse-lookup" }, { "name": "sebastian/comparator", "version": "5.0.5", "version_normalized": "5.0.5.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", "php": ">=8.1", "sebastian/diff": "^5.0", "sebastian/exporter": "^5.0" }, "require-dev": { "phpunit/phpunit": "^10.5" }, "time": "2026-01-24T09:25:16+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "5.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", "type": "tidelift" } ], "install-path": "../sebastian/comparator" }, { "name": "sebastian/complexity", "version": "3.2.0", "version_normalized": "3.2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-12-21T08:37:17+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "3.2-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/complexity" }, { "name": "sebastian/diff", "version": "5.1.1", "version_normalized": "5.1.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0", "symfony/process": "^6.4" }, "time": "2024-03-02T07:15:17+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "5.1-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff", "udiff", "unidiff", "unified diff" ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/diff" }, { "name": "sebastian/environment", "version": "6.1.0", "version_normalized": "6.1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" }, "time": "2024-03-23T08:47:14+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "6.1-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/environment" }, { "name": "sebastian/exporter", "version": "5.1.4", "version_normalized": "5.1.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "0735b90f4da94969541dac1da743446e276defa6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", "reference": "0735b90f4da94969541dac1da743446e276defa6", "shasum": "" }, "require": { "ext-mbstring": "*", "php": ">=8.1", "sebastian/recursion-context": "^5.0" }, "require-dev": { "phpunit/phpunit": "^10.5" }, "time": "2025-09-24T06:09:11+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "5.1-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", "type": "tidelift" } ], "install-path": "../sebastian/exporter" }, { "name": "sebastian/global-state", "version": "6.0.2", "version_normalized": "6.0.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { "php": ">=8.1", "sebastian/object-reflector": "^3.0", "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", "phpunit/phpunit": "^10.0" }, "time": "2024-03-02T07:19:19+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "6.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/global-state" }, { "name": "sebastian/lines-of-code", "version": "2.0.2", "version_normalized": "2.0.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-12-21T08:38:20+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/lines-of-code" }, { "name": "sebastian/object-enumerator", "version": "5.0.0", "version_normalized": "5.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { "php": ">=8.1", "sebastian/object-reflector": "^3.0", "sebastian/recursion-context": "^5.0" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-02-03T07:08:32+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "5.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/object-enumerator" }, { "name": "sebastian/object-reflector", "version": "3.0.0", "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-02-03T07:06:18+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/object-reflector" }, { "name": "sebastian/recursion-context", "version": "5.0.1", "version_normalized": "5.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.5" }, "time": "2025-08-10T07:50:56+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "5.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://liberapay.com/sebastianbergmann", "type": "liberapay" }, { "url": "https://thanks.dev/u/gh/sebastianbergmann", "type": "thanks_dev" }, { "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", "type": "tidelift" } ], "install-path": "../sebastian/recursion-context" }, { "name": "sebastian/type", "version": "4.0.0", "version_normalized": "4.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "time": "2023-02-03T07:10:45+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/type" }, { "name": "sebastian/version", "version": "4.0.1", "version_normalized": "4.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { "php": ">=8.1" }, "time": "2023-02-07T11:34:05+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/version" }, { "name": "slevomat/coding-standard", "version": "8.22.1", "version_normalized": "8.22.1.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/1dd80bf3b93692bedb21a6623c496887fad05fec", "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", "php": "^7.4 || ^8.0", "phpstan/phpdoc-parser": "^2.3.0", "squizlabs/php_codesniffer": "^3.13.4" }, "require-dev": { "phing/phing": "3.0.1|3.1.0", "php-parallel-lint/php-parallel-lint": "1.4.0", "phpstan/phpstan": "2.1.24", "phpstan/phpstan-deprecation-rules": "2.0.3", "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "2.0.6", "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.10" }, "time": "2025-09-13T08:53:30+00:00", "type": "phpcodesniffer-standard", "extra": { "branch-alias": { "dev-master": "8.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "SlevomatCodingStandard\\": "SlevomatCodingStandard/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", "keywords": [ "dev", "phpcs" ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", "source": "https://github.com/slevomat/coding-standard/tree/8.22.1" }, "funding": [ { "url": "https://github.com/kukulich", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", "type": "tidelift" } ], "install-path": "../slevomat/coding-standard" }, { "name": "squizlabs/php_codesniffer", "version": "3.13.5", "version_normalized": "3.13.5.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": ">=5.4.0" }, "require-dev": { "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "time": "2025-11-04T16:30:35+00:00", "bin": [ "bin/phpcbf", "bin/phpcs" ], "type": "library", "installation-source": "dist", "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Greg Sherwood", "role": "Former lead" }, { "name": "Juliette Reinders Folmer", "role": "Current lead" }, { "name": "Contributors", "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { "url": "https://github.com/PHPCSStandards", "type": "github" }, { "url": "https://github.com/jrfnl", "type": "github" }, { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" }, { "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], "install-path": "../squizlabs/php_codesniffer" }, { "name": "symfony/console", "version": "v5.4.47", "version_normalized": "5.4.47.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/event-dispatcher": "^4.4|^5.0|^6.0", "symfony/lock": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" }, "time": "2024-11-06T11:30:55+00:00", "type": "library", "installation-source": "dist", "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/v5.4.47" }, "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.7.0", "version_normalized": "3.7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { "php": ">=8.1" }, "time": "2026-04-13T15:52:40+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "3.7-dev" } }, "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.7.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/deprecation-contracts" }, { "name": "symfony/finder", "version": "v6.4.34", "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { "symfony/filesystem": "^6.0|^7.0" }, "time": "2026-01-28T15:16:37+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" }, "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": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/finder/tree/v6.4.34" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/finder" }, { "name": "symfony/polyfill-ctype", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { "php": ">=7.2" }, "provide": { "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "time": "2026-04-10T16:19:22+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-ctype" }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "time": "2026-04-26T13:13:48+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-intl-grapheme" }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "time": "2024-09-09T11:45:10+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-intl-normalizer" }, { "name": "symfony/polyfill-mbstring", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { "ext-iconv": "*", "php": ">=7.2" }, "provide": { "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "time": "2026-04-10T17:25:58+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "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.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-mbstring" }, { "name": "symfony/polyfill-php73", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { "php": ">=7.2" }, "time": "2024-09-09T11:45:10+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "installation-source": "dist", "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php73\\": "" }, "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 backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php73/tree/v1.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-php73" }, { "name": "symfony/polyfill-php80", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { "php": ">=7.2" }, "time": "2026-04-10T16:19:22+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "installation-source": "dist", "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ion Bazan", "email": "ion.bazan@gmail.com" }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-php80" }, { "name": "symfony/process", "version": "v6.4.39", "version_normalized": "6.4.39.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", "reference": "6c93071cb8c91dce5a41960d125e019e64ef6cb5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/6c93071cb8c91dce5a41960d125e019e64ef6cb5", "reference": "6c93071cb8c91dce5a41960d125e019e64ef6cb5", "shasum": "" }, "require": { "php": ">=8.1" }, "time": "2026-05-11T16:53:15+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" }, "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": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/process/tree/v6.4.39" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/process" }, { "name": "symfony/service-contracts", "version": "v3.7.0", "version_normalized": "3.7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, "time": "2026-03-28T09:44:51+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "3.7-dev" } }, "installation-source": "dist", "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.7.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/service-contracts" }, { "name": "symfony/string", "version": "v6.4.39", "version_normalized": "6.4.39.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", "reference": "62e3c927de664edadb5bef260987eb047a17a113" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/string/zipball/62e3c927de664edadb5bef260987eb047a17a113", "reference": "62e3c927de664edadb5bef260987eb047a17a113", "shasum": "" }, "require": { "php": ">=8.1", "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/http-client": "^5.4|^6.0|^7.0", "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "time": "2026-05-12T11:44:19+00:00", "type": "library", "installation-source": "dist", "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/v6.4.39" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/string" }, { "name": "theseer/tokenizer", "version": "1.3.1", "version_normalized": "1.3.1.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": "^7.2 || ^8.0" }, "time": "2025-11-17T20:03:58+00:00", "type": "library", "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], "install-path": "../theseer/tokenizer" } ], "dev": true, "dev-package-names": [ "dealerdirect/phpcodesniffer-composer-installer", "mikey179/vfsstream", "myclabs/deep-copy", "nikic/php-parser", "phar-io/manifest", "phar-io/version", "phpstan/phpdoc-parser", "phpstan/phpstan", "phpunit/php-code-coverage", "phpunit/php-file-iterator", "phpunit/php-invoker", "phpunit/php-text-template", "phpunit/php-timer", "phpunit/phpunit", "psr/log", "rector/rector", "sebastian/cli-parser", "sebastian/code-unit", "sebastian/code-unit-reverse-lookup", "sebastian/comparator", "sebastian/complexity", "sebastian/diff", "sebastian/environment", "sebastian/exporter", "sebastian/global-state", "sebastian/lines-of-code", "sebastian/object-enumerator", "sebastian/object-reflector", "sebastian/recursion-context", "sebastian/type", "sebastian/version", "slevomat/coding-standard", "squizlabs/php_codesniffer", "theseer/tokenizer" ] } array( 'name' => 'plesk/wappspector', 'pretty_version' => '0.2.8', 'version' => '0.2.8.0', 'reference' => null, 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true, ), 'versions' => array( 'clue/phar-composer' => array( 'pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '0cae6984e0da45639881d3b26442d525b8b65406', 'type' => 'library', 'install_path' => __DIR__ . '/../clue/phar-composer', 'aliases' => array(), 'dev_requirement' => false, ), 'dealerdirect/phpcodesniffer-composer-installer' => array( 'pretty_version' => 'v1.2.1', 'version' => '1.2.1.0', 'reference' => '963f0c67bffde0eac41b56be71ac0e8ba132f0bd', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../dealerdirect/phpcodesniffer-composer-installer', 'aliases' => array(), 'dev_requirement' => true, ), 'doctrine/inflector' => array( 'pretty_version' => '2.1.0', 'version' => '2.1.0.0', 'reference' => '6d6c96277ea252fc1304627204c3d5e6e15faa3b', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/inflector', 'aliases' => array(), 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( 'pretty_version' => '7.10.0', 'version' => '7.10.0.0', 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), 'dev_requirement' => false, ), 'guzzlehttp/promises' => array( 'pretty_version' => '2.3.0', 'version' => '2.3.0.0', 'reference' => '481557b130ef3790cf82b713667b43030dc9c957', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), 'dev_requirement' => false, ), 'guzzlehttp/psr7' => array( 'pretty_version' => '2.9.0', 'version' => '2.9.0.0', 'reference' => '7d0ed42f28e42d61352a7a79de682e5e67fec884', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), 'dev_requirement' => false, ), 'knplabs/packagist-api' => array( 'pretty_version' => 'v1.7.2', 'version' => '1.7.2.0', 'reference' => '4feae228a4505c1cd817da61e752e5dea2b22c2d', 'type' => 'library', 'install_path' => __DIR__ . '/../knplabs/packagist-api', 'aliases' => array(), 'dev_requirement' => false, ), 'laravel/serializable-closure' => array( 'pretty_version' => 'v2.0.13', 'version' => '2.0.13.0', 'reference' => 'b566ee0dd251f3c4078bed003a7ce015f5ea6dce', 'type' => 'library', 'install_path' => __DIR__ . '/../laravel/serializable-closure', 'aliases' => array(), 'dev_requirement' => false, ), 'league/flysystem' => array( 'pretty_version' => '3.34.0', 'version' => '3.34.0.0', 'reference' => '2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e', 'type' => 'library', 'install_path' => __DIR__ . '/../league/flysystem', 'aliases' => array(), 'dev_requirement' => false, ), 'league/flysystem-local' => array( 'pretty_version' => '3.31.0', 'version' => '3.31.0.0', 'reference' => '2f669db18a4c20c755c2bb7d3a7b0b2340488079', 'type' => 'library', 'install_path' => __DIR__ . '/../league/flysystem-local', 'aliases' => array(), 'dev_requirement' => false, ), 'league/mime-type-detection' => array( 'pretty_version' => '1.16.0', 'version' => '1.16.0.0', 'reference' => '2d6702ff215bf922936ccc1ad31007edc76451b9', 'type' => 'library', 'install_path' => __DIR__ . '/../league/mime-type-detection', 'aliases' => array(), 'dev_requirement' => false, ), 'mikey179/vfsstream' => array( 'pretty_version' => 'v1.6.12', 'version' => '1.6.12.0', 'reference' => 'fe695ec993e0a55c3abdda10a9364eb31c6f1bf0', 'type' => 'library', 'install_path' => __DIR__ . '/../mikey179/vfsstream', 'aliases' => array(), 'dev_requirement' => true, ), 'myclabs/deep-copy' => array( 'pretty_version' => '1.13.4', 'version' => '1.13.4.0', 'reference' => '07d290f0c47959fd5eed98c95ee5602db07e0b6a', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'dev_requirement' => true, ), 'nikic/php-parser' => array( 'pretty_version' => 'v5.7.0', 'version' => '5.7.0.0', 'reference' => 'dca41cd15c2ac9d055ad70dbfd011130757d1f82', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => true, ), 'phar-io/manifest' => array( 'pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'reference' => '54750ef60c58e43759730615a392c31c80e23176', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/manifest', 'aliases' => array(), 'dev_requirement' => true, ), 'phar-io/version' => array( 'pretty_version' => '3.2.1', 'version' => '3.2.1.0', 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/version', 'aliases' => array(), 'dev_requirement' => true, ), 'php-di/invoker' => array( 'pretty_version' => '2.3.7', 'version' => '2.3.7.0', 'reference' => '3c1ddfdef181431fbc4be83378f6d036d59e81e1', 'type' => 'library', 'install_path' => __DIR__ . '/../php-di/invoker', 'aliases' => array(), 'dev_requirement' => false, ), 'php-di/php-di' => array( 'pretty_version' => '7.1.1', 'version' => '7.1.1.0', 'reference' => 'f88054cc052e40dbe7b383c8817c19442d480352', 'type' => 'library', 'install_path' => __DIR__ . '/../php-di/php-di', 'aliases' => array(), 'dev_requirement' => false, ), 'phpstan/phpdoc-parser' => array( 'pretty_version' => '2.3.2', 'version' => '2.3.2.0', 'reference' => 'a004701b11273a26cd7955a61d67a7f1e525a45a', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/phpstan' => array( 'pretty_version' => '1.12.33', 'version' => '1.12.33.0', 'reference' => '37982d6fc7cbb746dda7773530cda557cdf119e1', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-code-coverage' => array( 'pretty_version' => '10.1.16', 'version' => '10.1.16.0', 'reference' => '7e308268858ed6baedc8704a304727d20bc07c77', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-file-iterator' => array( 'pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => 'a95037b6d9e608ba092da1b23931e537cadc3c3c', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-invoker' => array( 'pretty_version' => '4.0.0', 'version' => '4.0.0.0', 'reference' => 'f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-invoker', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-text-template' => array( 'pretty_version' => '3.0.1', 'version' => '3.0.1.0', 'reference' => '0c7b06ff49e3d5072f057eb1fa59258bf287a748', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-text-template', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-timer' => array( 'pretty_version' => '6.0.0', 'version' => '6.0.0.0', 'reference' => 'e2a2d67966e740530f4a3343fe2e030ffdc1161d', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-timer', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/phpunit' => array( 'pretty_version' => '10.5.63', 'version' => '10.5.63.0', 'reference' => '33198268dad71e926626b618f3ec3966661e4d90', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), 'dev_requirement' => true, ), 'plesk/wappspector' => array( 'pretty_version' => '0.2.8', 'version' => '0.2.8.0', 'reference' => null, 'type' => 'project', 'install_path' => __DIR__ . '/../../', '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.0', ), ), 'psr/http-client' => array( 'pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/http-client-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/http-factory' => array( 'pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/http-factory-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/http-message' => array( 'pretty_version' => '2.0', 'version' => '2.0.0.0', 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/http-message-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/log' => array( 'pretty_version' => '2.0.0', 'version' => '2.0.0.0', 'reference' => 'ef29f6d262798707a9edd554e2b82517ef3a9376', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => true, ), 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0|2.0', ), ), 'ralouphie/getallheaders' => array( 'pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'type' => 'library', 'install_path' => __DIR__ . '/../ralouphie/getallheaders', 'aliases' => array(), 'dev_requirement' => false, ), 'rector/rector' => array( 'pretty_version' => '1.2.10', 'version' => '1.2.10.0', 'reference' => '40f9cf38c05296bd32f444121336a521a293fa61', 'type' => 'library', 'install_path' => __DIR__ . '/../rector/rector', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/cli-parser' => array( 'pretty_version' => '2.0.1', 'version' => '2.0.1.0', 'reference' => 'c34583b87e7b7a8055bf6c450c2c77ce32a24084', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/cli-parser', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/code-unit' => array( 'pretty_version' => '2.0.0', 'version' => '2.0.0.0', 'reference' => 'a81fee9eef0b7a76af11d121767abc44c104e503', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/code-unit-reverse-lookup' => array( 'pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '5e3a687f7d8ae33fb362c5c0743794bbb2420a1d', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/comparator' => array( 'pretty_version' => '5.0.5', 'version' => '5.0.5.0', 'reference' => '55dfef806eb7dfeb6e7a6935601fef866f8ca48d', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/comparator', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/complexity' => array( 'pretty_version' => '3.2.0', 'version' => '3.2.0.0', 'reference' => '68ff824baeae169ec9f2137158ee529584553799', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/complexity', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/diff' => array( 'pretty_version' => '5.1.1', 'version' => '5.1.1.0', 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/environment' => array( 'pretty_version' => '6.1.0', 'version' => '6.1.0.0', 'reference' => '8074dbcd93529b357029f5cc5058fd3e43666984', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/environment', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/exporter' => array( 'pretty_version' => '5.1.4', 'version' => '5.1.4.0', 'reference' => '0735b90f4da94969541dac1da743446e276defa6', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/exporter', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/global-state' => array( 'pretty_version' => '6.0.2', 'version' => '6.0.2.0', 'reference' => '987bafff24ecc4c9ac418cab1145b96dd6e9cbd9', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/global-state', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/lines-of-code' => array( 'pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => '856e7f6a75a84e339195d48c556f23be2ebf75d0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/lines-of-code', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/object-enumerator' => array( 'pretty_version' => '5.0.0', 'version' => '5.0.0.0', 'reference' => '202d0e344a580d7f7d04b3fafce6933e59dae906', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-enumerator', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/object-reflector' => array( 'pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '24ed13d98130f0e7122df55d06c5c4942a577957', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-reflector', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/recursion-context' => array( 'pretty_version' => '5.0.1', 'version' => '5.0.1.0', 'reference' => '47e34210757a2f37a97dcd207d032e1b01e64c7a', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/recursion-context', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/type' => array( 'pretty_version' => '4.0.0', 'version' => '4.0.0.0', 'reference' => '462699a16464c3944eefc02ebdd77882bd3925bf', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/type', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/version' => array( 'pretty_version' => '4.0.1', 'version' => '4.0.1.0', 'reference' => 'c51fa83a5d8f43f1402e3f32a005e6262244ef17', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/version', 'aliases' => array(), 'dev_requirement' => true, ), 'slevomat/coding-standard' => array( 'pretty_version' => '8.22.1', 'version' => '8.22.1.0', 'reference' => '1dd80bf3b93692bedb21a6623c496887fad05fec', 'type' => 'phpcodesniffer-standard', 'install_path' => __DIR__ . '/../slevomat/coding-standard', 'aliases' => array(), 'dev_requirement' => true, ), 'squizlabs/php_codesniffer' => array( 'pretty_version' => '3.13.5', 'version' => '3.13.5.0', 'reference' => '0ca86845ce43291e8f5692c7356fccf3bcf02bf4', 'type' => 'library', 'install_path' => __DIR__ . '/../squizlabs/php_codesniffer', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/console' => array( 'pretty_version' => 'v5.4.47', 'version' => '5.4.47.0', 'reference' => 'c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v3.7.0', 'version' => '3.7.0.0', 'reference' => '50f59d1f3ca46d41ac911f97a78626b6756af35b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/finder' => array( 'pretty_version' => 'v6.4.34', 'version' => '6.4.34.0', 'reference' => '9590e86be1d1c57bfbb16d0dd040345378c20896', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-ctype' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '141046a8f9477948ff284fa65be2095baafb94f2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-grapheme' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '4864388bfbd3001ce88e234fab652acd91fdc57e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '6a21eb99c6973357967f6ce3708cd55a6bec6315', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '0f68c03565dcaaf25a890667542e8bd75fe7e5bb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => 'dfb55726c3a76ea3b6459fcfda1ec2d80a682411', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/process' => array( 'pretty_version' => 'v6.4.39', 'version' => '6.4.39.0', 'reference' => '6c93071cb8c91dce5a41960d125e019e64ef6cb5', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/service-contracts' => array( 'pretty_version' => 'v3.7.0', 'version' => '3.7.0.0', 'reference' => 'd25d82433a80eba6aa0e6c24b61d7370d99e444a', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/string' => array( 'pretty_version' => 'v6.4.39', 'version' => '6.4.39.0', 'reference' => '62e3c927de664edadb5bef260987eb047a17a113', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => false, ), 'theseer/tokenizer' => array( 'pretty_version' => '1.3.1', 'version' => '1.3.1.0', 'reference' => 'b7489ce515e168639d17feec34b8847c326b0b3c', 'type' => 'library', 'install_path' => __DIR__ . '/../theseer/tokenizer', 'aliases' => array(), 'dev_requirement' => true, ), ), ); = 80100)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.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; } } throw new \RuntimeException( 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } #!/usr/bin/env php run(); # Changelog ## 1.4.0 (2022-02-14) * Feature: Windows support, improve package path detection, and retry rename to fix slow network drives. (#129 and #130 by @clue) * Feature / Fix: Escape binary path when executing system binaries (git, php, composer). (#128 by @clue) * Drop legacy HHVM support due to lack of support. (#127 by @clue) ## 1.3.0 (2021-12-29) * Feature: Support Symfony 6 and PHP 8.1 release. (#122 and #123 by @clue) * Feature: Bundle `StubGenerator` and `Extract` from legacy herrera-io/box v1.6.1. (#119 by @clue) * Feature / Fix: Fix check for valid package URL. (#117 by @icedream) * Update project setup, use PSR-4 autoloading, drop `composer.lock` and instead lock PHP version when building phar. (#120 and #124 by @clue and #118 by @PaulRotmann) * Improve test suite and add `.gitattributes` to exclude dev files from exports. Update test suite to support PHPUnit 9 and test against PHP 8.1 release. (#121 and #125 by @clue) ## 1.2.0 (2020-12-11) * Feature: Support Composer 2.0! (#114 by @thojou and @clue) * Minor documentation improvements and simplify install instructions. (#98 and #99 by @clue) * Use GitHub actions for continuous integration (CI). (#112 by @SimonFrings and #113 by @szepeviktor) ## 1.1.0 (2019-11-22) * Feature: Update all dependencies and improve forward compatibility with symfony/console v5 through legacy v2.5. (#87 by @clue) * Feature: Significantly improve performance when adding phar contents. (#90 by @clue) * Feature: Support cloning projects from git SSH URLs. (#96 by @clue) * Feature: Ignore packages without autoload definition and missing vendor directory. (#94 by @clue) * Feature: Write phar to temporary file to support any extension and overwriting. (#93 by @clue) * Feature / Fix: Disable install subcommand on Windows. (#95 by @clue) * Improve test suite by adding PHPUnit to require-dev and support legacy PHP 5.3 through PHP 7.2 and HHVM, add tests for all commands and perform some minor code cleanup/maintenance, minor internal refactoring to clean up some unneeded code duplication and unneeded references and remove dedicated bundler classes, always bundle complete package. (#85, #86, #89 and #92 by @clue) * Add build script removing uneeded files and update development docs. (#91 by @clue) ## 1.0.0 (2015-11-15) * First stable release, now following SemVer. * Feature: Can now be installed as a `require-dev` Composer dependency and supports running as `./vendor/bin/phar-composer`. (#36 by @radford) * Fix: Actually exclude `vendor/` directory. This prevents processing all vendor files twice and reduces build time by 50%. (#38 by @radford) * Fix: Fix error reporting when processing invalid project paths. (#56 by @staabm and @clue) * Fix: Fix description of `phar-composer install` command. (#47 by @staabm) * Updated documentation, tests and project structure. (#54, #57, #58 and #59 by @clue) ## 0.5.0 (2014-07-10) * Feature: The `search` command is the new default if you do not pass any command ([#13](https://github.com/clue/phar-composer/pull/13)). You can now use the following command to get started: ```bash $ phar-composer ``` * Fix: Pass through STDERR output of child processes instead of aborting ([#33](https://github.com/clue/phar-composer/pull/33)) * Fix: Do not timeout when child process takes longer than 60s. This also helps users with slower internet connections. ([#31](https://github.com/clue/phar-composer/pull/31)) * Fix: Update broken dependencies ([#18](https://github.com/clue/phar-composer/pull/18)) * Fix: Fixed an undocumented config key ([#14](https://github.com/clue/phar-composer/pull/14), thanks @mikey179) ## 0.4.0 (2013-09-12) * Feature: New `install` command will now both build the given package and then install it into the system-wide bin directory `/usr/local/bin` (usually already in your `$PATH`). This works for any package name or URL just like with the `build` command, e.g.: ```bash $ phar-composer install phpunit/phpunit ``` After some (lengthy) build output, you should now be able to run it by just issuing: ```bash $ phpunit ``` * Feature: New `search` command provides an interactive command line search. It will ask for the package name and issue an search via packagist.org's API and present a list of matching packages. So if you don't know the exact package name, you can now use the following command: ```bash $ phar-composer search boris ``` * Feature: Both `build` and `install` commands now also optionally accept an additional target directory to place the resulting phar into. ## 0.3.0 (2013-08-21) * Feature: Resulting phar files can now be executed on systems without ext-phar (#8). This vastly improves portability for legacy setups by including a small startup script which self-extracts the current archive into a temporary directory. * Feature: Resulting phar files can now be executed without the phar file name extension. E.g. this convenient feature now allows you to move your `~demo.phar` to `/usr/bin/demo` for easy system wide installations. * Fix: Resolving absolute paths to `vendor/autoload.php` ## 0.2.0 (2013-08-15) * Feature: Packages can now also be cloned from any git URLs (#9), like this: ```bash $ phar-composer build https://github.com/clue/phar-composer.git ``` The above will clone the repository and check out the default branch. You can also specify either a tag or branch name very similar to how composer works: ```bash $ phar-composer build https://github.com/clue/phar-composer.git:dev-master ``` ## 0.1.0 (2013-08-12) * Feature: Packages listed on packagist.org can now automatically be downloaded and installed prior to generating phar (#7), like this: ```bash $ phar-composer build clue/phar-composer ``` The above will download and install the latest stable tagged release (if any). You can also specify a tagged version like this: ```bash $ phar-composer build clue/phar-composer:0.1.* ``` Or you can specify to install the head of a given branch like this: ```bash $ phar-composer build clue/phar-composer:dev-master ``` ## 0.0.2 (2013-05-25) * Feature: Bundle complete project directories ## 0.0.1 (2013-05-18) * First tagged release { "name": "clue/phar-composer", "description": "Simple phar creation for any project managed via Composer", "keywords": ["executable phar", "build process", "bundle dependencies", "phar", "composer"], "homepage": "https://github.com/clue/phar-composer", "license": "MIT", "authors": [ { "name": "Christian Lück", "email": "christian@clue.engineering" } ], "require": { "php": ">=5.3.6", "knplabs/packagist-api": "^1.0", "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5", "symfony/finder": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5", "symfony/process": "^6.0 || ^5.0 || ^4.0 || ^3.0 || ^2.5" }, "require-dev": { "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "autoload": { "psr-4": {"Clue\\PharComposer\\": "src/"} }, "bin": ["bin/phar-composer"], "scripts": { "build": "@php bin/build.php" } } # clue/phar-composer [![CI status](https://github.com/clue/phar-composer/workflows/CI/badge.svg)](https://github.com/clue/phar-composer/actions) [![downloads on GitHub](https://img.shields.io/github/downloads/clue/phar-composer/total?color=blue&label=downloads%20on%20GitHub)](https://github.com/clue/phar-composer/releases) [![installs on Packagist](https://img.shields.io/packagist/dt/clue/phar-composer?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/clue/phar-composer) Simple phar creation for any project managed via Composer. It takes your existing project's `composer.json` and builds an executable phar for your project among with its bundled dependencies. * Create a single executable phar archive, including its dependencies (i.e. vendor directory included) * Automated build process * Zero additional configuration **Table of contents** * [Support us](#support-us) * [Usage](#usage) * [phar-composer](#phar-composer) * [phar-composer build](#phar-composer-build) * [phar-composer install](#phar-composer-install) * [phar-composer search](#phar-composer-search) * [Install](#install) * [As a phar (recommended)](#as-a-phar-recommended) * [Installation using Composer](#installation-using-composer) * [Development](#development) * [Tests](#tests) * [License](#license) ## Support us We invest a lot of time developing, maintaining and updating our awesome open-source projects. You can help us sustain this high-quality of our work by [becoming a sponsor on GitHub](https://github.com/sponsors/clue). Sponsors get numerous benefits in return, see our [sponsoring page](https://github.com/sponsors/clue) for details. Let's take these projects to the next level together! 🚀 ## Usage Once clue/phar-composer is [installed](#install), you can use it via command line like this. ### phar-composer This tool supports several sub-commands. To get you started, you can now use the following simple command: ```bash $ phar-composer ``` This will actually execute the `search` command that allows you to interactively search and build any package listed on packagist (see below description of the [search command](#phar-composer-search) for more details). ### phar-composer build The `build` command can be used to build an executable single-file phar (php archive) for any project managed by composer: ```bash $ phar-composer build ~/path/to/your/project ``` The second argument can be pretty much everything that can be resolved to a valid project managed by composer. Besides creating phar archives for locally installed packages like above, you can also easily download and bundle packages from packagist.org like this: ```bash $ phar-composer build d11wtq/boris ``` The above will download and install the latest stable tagged release (if any). You can also specify a tagged version like this: ```bash $ phar-composer build clue/phar-composer:~1.0 ``` Or you can specify to install the head of a given branch like this: ```bash $ phar-composer build clue/phar-composer:dev-master ``` A similar syntax can be used to clone a package from any git URL. This is particularly useful for private packages or temporary git clones not otherwise listed on packagist: ```bash $ phar-composer build https://github.com/composer/composer.git ``` The above will clone the repository and check out the default branch. Again, you can specify either a tag or branch name very similar to how composer works: ```bash $ phar-composer build https://github.com/composer/composer.git:dev-master ``` ### phar-composer install The `install` command will both build the given package and then install it into the system-wide bin directory `/usr/local/bin` (usually already in your `$PATH`). This works for any package name or URL just like with the `build` command, e.g.: ```bash $ phar-composer install phpunit/phpunit ``` After some (lengthy) build output, you should now be able to run it by just issuing: ```bash $ phpunit ``` > In essence, the `install` command will basically just issue a `build` and then `sudo mv $target.phar /usr/local/bin/$target`. It will ask you for your sudo password when necessary, so it's not needed (and in fact not *recommended*) to run the whole comamnd via `sudo`. > > Windows limitation: Note that this subcommand is not available on Windows. Please use the `build` command and place Phar in your `$PATH` manually. ### phar-composer search The `search` command provides an interactive command line search. It will ask for the package name and issue an search via packagist.org's API and present a list of matching packages. So if you don't know the exact package name, you can use the following command: ```bash $ phar-composer search boris ``` It uses an interactive command line menu to ask you for the matching package name, its version and will then offer you to either `build` or `install` it. ## Install You can grab a copy of clue/phar-composer in either of the following ways. This project aims to run on any platform and thus does not require any PHP extensions and supports running on legacy PHP 5.3 through current PHP 8+. It's *highly recommended to use the latest supported PHP version* for this project. ### As a phar (recommended) You can simply download a pre-compiled and ready-to-use version as a Phar to any directory. You can simply download the latest `phar-composer.phar` file from our [releases page](https://github.com/clue/phar-composer/releases). The [latest release](https://github.com/clue/phar-composer/releases/latest) can always be downloaded like this: ```bash $ curl -JOL https://clue.engineering/phar-composer-latest.phar ``` That's it already. Once downloaded, you can verify everything works by running this: ```bash $ cd ~/Downloads $ php phar-composer.phar --version ``` The above usage examples assume you've installed phar-composer system-wide to your $PATH (recommended), so you have the following options: 1. Only use phar-composer locally and adjust the usage examples: So instead of running `$ phar-composer --version`, you have to type `$ php phar-composer.phar --version`. 2. Use phar-composer's `install` command to install itself to your $PATH by running: ```bash $ php phar-composer.phar install clue/phar-composer ``` 3. Or you can manually make the `phar-composer.phar` executable and move it to your $PATH by running: ```bash $ chmod 755 phar-composer.phar $ sudo mv phar-composer.phar /usr/local/bin/phar-composer ``` If you have installed phar-composer system-wide, you can now verify everything works by running: ```bash $ phar-composer --version ``` There's no separate `update` procedure, simply download the latest release again and overwrite the existing phar. Again, if you have already installed phar-composer system-wide, updating is as easy as running a self-installation like this: ```bash $ phar-composer install clue/phar-composer ``` ### Installation using Composer Alternatively, you can also install phar-composer as part of your development dependencies. You will likely want to use the `require-dev` section to exclude phar-composer in your production environment. You can either modify your `composer.json` manually or run the following command to include the latest tagged release: ```bash $ composer require --dev clue/phar-composer ``` Now you should be able to invoke the following command in your project root: ```bash $ vendor/bin/phar-composer --version ``` > Note: You should only invoke and rely on the main phar-composer bin file. Installing this project as a non-dev dependency in order to use its source code as a library is *not supported*. To update to the latest release, just run `composer update clue/graph-composer`. ## Development clue/phar-composer is an [open-source project](#license) and encourages everybody to participate in its development. You're interested in checking out how clue/phar-composer works under the hood and/or want to contribute to the development of clue/phar-composer? Then this section is for you! The recommended way to install clue/phar-composer is to clone (or download) this repository and use [Composer](https://getcomposer.org/) to download its dependencies. Therefore you'll need PHP, Composer, git and curl installed. For example, on a recent Ubuntu/Debian-based system, simply run: ```bash $ sudo apt install php-cli git curl $ git clone https://github.com/clue/phar-composer.git $ cd phar-composer $ curl -s https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer $ composer install ``` You can now verify everything works by running clue/phar-composer like this: ```bash $ php bin/phar-composer --version ``` If you want to distribute clue/phar-composer as a single standalone release file, you may compile the project into a single `phar-composer.phar` file like this: ```bash $ composer build ``` > Note that compiling will temporarily install a copy of this project to the local `build/` directory and install all non-development dependencies for distribution. This should only take a second or two if you've previously installed its dependencies already. The build script optionally accepts the version number (`VERSION` env) and an output file name or will otherwise try to look up the last release tag, such as `phar-composer-1.0.0.phar`. You can now verify the resulting `phar-composer.phar` file works by running it like this: ```bash $ php phar-composer.phar --version ``` To update your development version to the latest version, just run this: ```bash $ git pull $ composer install ``` Made some changes to your local development version? Make sure to let the world know! :shipit: We welcome PRs and would love to hear from you! Happy hacking! ## Tests To run the test suite, you first need to clone this repo and then install all dependencies [through Composer](https://getcomposer.org/): ```bash $ composer install ``` To run the test suite, go to the project root and run: ```bash $ vendor/bin/phpunit ``` ## License This project is released under the permissive [MIT license](LICENSE). This project bundles the `StubGenerator` and `Extract` classes with minor changes from the original herrera-io/box v1.6.1 licensed under MIT which no longer has an installable candidate. Copyright (c) 2013 Kevin Herrera. > Did you know that I offer custom development services and issuing invoices for sponsorships of releases and for contributions? Contact me (@clue) for details. resources[] = $file; return $this; } /** * add given directory to bundle * * @param Finder $dir * @return Bundle */ public function addDir(Finder $dir) { $this->resources[] = $dir; return $this; } /** * checks if a bundle contains given resource * * @param string $resource * @return bool */ public function contains($resource) { foreach ($this->resources as $containedResource) { if (is_string($containedResource) && $containedResource == $resource) { return true; } if ($containedResource instanceof Finder && $this->directoryContains($containedResource, $resource)) { return true; } } return false; } /** * checks if given directory contains given resource * * @param Finder $dir * @param string $resource * @return bool */ private function directoryContains(Finder $dir, $resource) { foreach ($dir as $containedResource) { /* @var $containedResource \SplFileInfo */ if (substr($containedResource->getRealPath(), 0, strlen($resource)) == $resource) { return true; } } return false; } /** * returns list of resources * * @return \Traversable */ #[\ReturnTypeWillChange] public function getIterator() { return new \ArrayIterator($this->resources); } } package = $package; $this->directory = rtrim($directory, '/') . '/'; } /** * get package name as defined in composer.json * * @return ?string */ public function getName() { return isset($this->package['name']) ? $this->package['name'] : null; } /** * @return string */ public function getShortName() { // skip vendor name from package name or default to last directory component $name = $this->getName(); if ($name === null) { $name = realpath($this->directory); if ($name === false) { $name = $this->directory; } } return basename($name); } /** * Get path to vendor directory (relative to package directory, always ends with slash) * * @return string */ public function getPathVendor() { $vendor = 'vendor'; if (isset($this->package['config']['vendor-dir'])) { $vendor = $this->package['config']['vendor-dir']; } return $vendor . '/'; } /** * Get package directory (the directory containing its composer.json, always ends with slash) * * @return string */ public function getDirectory() { return $this->directory; } /** * @return \Clue\PharComposer\Package\Bundle */ public function bundle() { $bundle = new Bundle(); // return empty bundle if this package does not define any files and directory does not exist if (empty($this->package['autoload']) && !is_dir($this->directory . $this->getPathVendor())) { return $bundle; } $iterator = Finder::create() ->files() ->ignoreVCS(true) ->exclude(rtrim($this->getPathVendor(), '/')) ->notPath('/^composer\.phar/') ->notPath('/^phar-composer\.phar/') ->in($this->getDirectory()); return $bundle->addDir($iterator); } /** * Get list of files defined as "bin" (relative to package directory) * * @return string[] */ public function getBins() { return isset($this->package['bin']) ? $this->package['bin'] : array(); } } packager = $packager; $this->packagist = $packagist; $this->isWindows = $isWindows; parent::__construct(); } protected function configure() { $this->setName('search') ->setDescription('Interactive search for project name') ->addArgument('project', InputArgument::OPTIONAL, 'Project name or path', null); } /** * @param InputInterface $input * @param OutputInterface $output * @param string $label * @param array $choices * @param ?string $abortable * @return ?string */ protected function select(InputInterface $input, OutputInterface $output, $label, array $choices, $abortable = null) { $helper = $this->getHelper('question'); assert($helper instanceof QuestionHelper); if (!$choices) { $output->writeln('No matching packages found'); return null; } // use numeric keys for all options $select = array_merge(array(0 => $abortable), array_values($choices)); if ($abortable === null) { unset($select[0]); } $question = new ChoiceQuestion($label, $select); $index = array_search($helper->ask($input, $output, $question), $select); if ($index === 0) { return null; } $indices = array_keys($choices); return $indices[$index - 1]; } protected function execute(InputInterface $input, OutputInterface $output) { $this->packager->setOutput($output); $this->packager->coerceWritable(); $helper = $this->getHelper('question'); assert($helper instanceof QuestionHelper); $project = $input->getArgument('project'); do { if ($project === null) { // ask for input $question = new Question('Enter (partial) project name > ', ''); $project = $helper->ask($input, $output, $question); } else { $output->writeln('Searching for ' . $project . '...'); } $choices = array(); foreach ($this->packagist->search($project) as $result) { assert($result instanceof Result); $label = str_pad($result->getName(), 39) . ' '; $label = str_replace($project, '' . $project . '', $label); $label .= $result->getDescription(); $label .= ' (⤓' . $result->getDownloads() . ')'; $choices[$result->getName()] = $label; } $project = $this->select($input, $output, 'Select matching package', $choices, 'Start new search'); } while ($project === null); $output->writeln('Selected ' . $project . ', listing versions...'); $package = $this->packagist->get($project); assert($package instanceof Package); $choices = array(); foreach ($package->getVersions() as $version) { assert($version instanceof Version); $label = $version->getVersion(); /* @var ?string $bin */ $bin = $version->getBin(); $label .= $bin !== null ? ' (☑ executable bin)' : ' (no executable bin)'; $choices[$version->getVersion()] = $label; } $version = $this->select($input, $output, 'Select available version', $choices); $action = $this->select( $input, $output, 'Action', array_filter(array( 'build' => 'Build project', 'install' => $this->isWindows ? null : 'Install project system-wide' )), 'Quit' ); if ($action === null) { return 0; } $pharer = $this->packager->getPharer($project, $version); if ($action === 'install') { $path = $this->packager->getSystemBin($pharer->getPackageRoot()); $this->packager->install($pharer, $path); } else { $pharer->build(); } return 0; } } packager = $packager; $this->isWindows = $isWindows; parent::__construct(); } protected function configure() { $this->setName('install') ->setDescription('Install phar into system wide binary directory' . ($this->isWindows ? ' (not available on Windows)' : '')) ->addArgument('project', InputArgument::OPTIONAL, 'Project name or path', '.') ->addArgument('target', InputArgument::OPTIONAL, 'Path to install to', '/usr/local/bin'); } protected function execute(InputInterface $input, OutputInterface $output) { if ($this->isWindows) { $output->writeln('Command not available on this platform. Please use the "build" command and place Phar in your $PATH manually.'); return 1; } $this->packager->setOutput($output); $this->packager->coerceWritable(); $pharer = $this->packager->getPharer($input->getArgument('project')); $path = $this->packager->getSystemBin($pharer->getPackageRoot(), $input->getArgument('target')); if (is_file($path)) { $helper = $this->getHelper('question'); assert($helper instanceof QuestionHelper); $question = new ConfirmationQuestion('Overwrite existing file ' . $path . '? [y] > ', true); if (!$helper->ask($input, $output, $question)) { $output->writeln('Aborting'); return 0; } } $this->packager->install($pharer, $path); return 0; } } packager = $packager; } protected function configure() { $this->setName('build') ->setDescription('Build phar for the given composer project') ->addArgument('project', InputArgument::OPTIONAL, 'Path to project directory or composer.json', '.') ->addArgument('target', InputArgument::OPTIONAL, 'Path to write phar output to (defaults to project name)'); } protected function execute(InputInterface $input, OutputInterface $output) { $this->packager->setOutput($output); $this->packager->coerceWritable(); $pharer = $this->packager->getPharer($input->getArgument('project')); $target = $input->getArgument('target'); if ($target !== null) { $pharer->setTarget($target); } $pharer->build(); return 0; } } */ class StubGenerator { /** * The list of server variables that are allowed to be modified. * * @var array */ private static $allowedMung = array( 'PHP_SELF', 'REQUEST_URI', 'SCRIPT_FILENAME', 'SCRIPT_NAME' ); /** * The alias to be used in "phar://" URLs. * * @var string */ private $alias; /** * The top header comment banner text. * * @var string. */ private $banner = 'Generated by Box. @link https://github.com/herrera-io/php-box/'; /** * Embed the Extract class in the stub? * * @var boolean */ private $extract = false; /** * The processed extract code. * * @var array */ private $extractCode = array(); /** * Force the use of the Extract class? * * @var boolean */ private $extractForce = false; /** * The location within the Phar of index script. * * @var string */ private $index; /** * Use the Phar::interceptFileFuncs() method? * * @var boolean */ private $intercept = false; /** * The map for file extensions and their mimetypes. * * @var array */ private $mimetypes = array(); /** * The list of server variables to modify. * * @var array */ private $mung = array(); /** * The location of the script to run when a file is not found. * * @var string */ private $notFound; /** * The rewrite function. * * @var string */ private $rewrite; /** * The shebang line. * * @var string */ private $shebang = '#!/usr/bin/env php'; /** * Use Phar::webPhar() instead of Phar::mapPhar()? * * @var boolean */ private $web = false; /** * Sets the alias to be used in "phar://" URLs. * * @param string $alias The alias. * * @return StubGenerator The stub generator. */ public function alias($alias) { $this->alias = $alias; return $this; } /** * Sets the top header comment banner text. * * @param string $banner The banner text. * * @return StubGenerator The stub generator. */ public function banner($banner) { $this->banner = $banner; return $this; } /** * Creates a new instance of the stub generator. * * @return StubGenerator The stub generator. */ public static function create() { return new static(); } /** * Embed the Extract class in the stub? * * @param boolean $extract Embed the class? * @param boolean $force Force the use of the class? * * @return StubGenerator The stub generator. */ public function extract($extract, $force = false) { $this->extract = $extract; $this->extractForce = $force; if ($extract) { $this->extractCode = array( 'constants' => array(), 'class' => array(), ); $code = file_get_contents(__DIR__ . '/Extract.min.php'); $code = preg_replace('/\n+/', "\n", $code); $code = explode("\n", $code); $code = array_slice($code, 2); foreach ($code as $i => $line) { if ((0 === strpos($line, 'use')) && (false === strpos($line, '\\')) ) { unset($code[$i]); } elseif (0 === strpos($line, 'define')) { $this->extractCode['constants'][] = $line; } else { $this->extractCode['class'][] = $line; } } } return $this; } /** * Sets location within the Phar of index script. * * @param string $index The index file. * * @return StubGenerator The stub generator. */ public function index($index) { $this->index = $index; return $this; } /** * Use the Phar::interceptFileFuncs() method in the stub? * * @param boolean $intercept Use interceptFileFuncs()? * * @return StubGenerator The stub generator. */ public function intercept($intercept) { $this->intercept = $intercept; return $this; } /** * Generates the stub. * * @return string The stub. */ public function generate() { $stub = array(); if ('' !== $this->shebang) { $stub[] = $this->shebang; } $stub[] = 'banner) { $stub[] = $this->getBanner(); } if ($this->extract) { $stub[] = join("\n", $this->extractCode['constants']); if ($this->extractForce) { $stub = array_merge($stub, $this->getExtractSections()); } } $stub = array_merge($stub, $this->getPharSections()); if ($this->extract) { if ($this->extractForce) { if ($this->index && !$this->web) { $stub[] = "require \"\$dir/{$this->index}\";"; } } else { end($stub); $stub[key($stub)] .= ' else {'; $stub = array_merge($stub, $this->getExtractSections()); if ($this->index) { $stub[] = "require \"\$dir/{$this->index}\";"; } $stub[] = '}'; } $stub[] = join("\n", $this->extractCode['class']); } $stub[] = "__HALT_COMPILER();"; return join("\n", $stub); } /** * Sets the map for file extensions and their mimetypes. * * @param array $mimetypes The map. * * @return StubGenerator The stub generator. */ public function mimetypes(array $mimetypes) { $this->mimetypes = $mimetypes; return $this; } /** * Sets the list of server variables to modify. * * @param array $list The list. * * @return StubGenerator The stub generator. * * @throws \InvalidArgumentException If the list contains an invalid value. */ public function mung(array $list) { foreach ($list as $value) { if (false === in_array($value, self::$allowedMung)) { throw new \InvalidArgumentException(sprintf( 'The $_SERVER variable "%s" is not allowed.', $value )); } } $this->mung = $list; return $this; } /** * Sets the location of the script to run when a file is not found. * * @param string $script The script. * * @return StubGenerator The stub generator. */ public function notFound($script) { $this->notFound = $script; return $this; } /** * Sets the rewrite function. * * @param string $function The function. * * @return StubGenerator The stub generator. */ public function rewrite($function) { $this->rewrite = $function; return $this; } /** * Sets the shebang line. * * @param string $shebang The shebang line. * * @return StubGenerator The stub generator. */ public function shebang($shebang) { $this->shebang = $shebang; return $this; } /** * Use Phar::webPhar() instead of Phar::mapPhar()? * * @param boolean $web Use Phar::webPhar()? * * @return StubGenerator The stub generator. */ public function web($web) { $this->web = $web; return $this; } /** * Escapes an argument so it can be written as a string in a call. * * @param string $arg The argument. * @param string $quote The quote. * * @return string The escaped argument. */ private function arg($arg, $quote = "'") { return $quote . addcslashes($arg, $quote) . $quote; } /** * Returns the alias map. * * @return string The alias map. */ private function getAlias() { $stub = ''; $prefix = ''; if ($this->extractForce) { $prefix = '$dir/'; } if ($this->web) { $stub .= 'Phar::webPhar(' . $this->arg($this->alias); if ($this->index) { $stub .= ', ' . $this->arg($prefix . $this->index, '"'); if ($this->notFound) { $stub .= ', ' . $this->arg($prefix . $this->notFound, '"'); if ($this->mimetypes) { $stub .= ', ' . var_export( $this->mimetypes, true ); if ($this->rewrite) { $stub .= ', ' . $this->arg($this->rewrite); } } } } $stub .= ');'; } else { $stub .= 'Phar::mapPhar(' . $this->arg($this->alias) . ');'; } return $stub; } /** * Returns the banner after it has been processed. * * @return string The processed banner. */ private function getBanner() { $banner = "/**\n * "; $banner .= str_replace( " \n", "\n", str_replace("\n", "\n * ", $this->banner) ); $banner .= "\n */"; return $banner; } /** * Returns the self extracting sections of the stub. * * @return array The stub sections. */ private function getExtractSections() { return array( '$extract = new Extract(__FILE__, Extract::findStubLength(__FILE__));', '$dir = $extract->go();', 'set_include_path($dir . PATH_SEPARATOR . get_include_path());', ); } /** * Returns the sections of the stub that use the Phar class. * * @return array The stub sections. */ private function getPharSections() { $stub = array( 'if (class_exists(\'Phar\')) {', $this->getAlias(), ); if ($this->intercept) { $stub[] = "Phar::interceptFileFuncs();"; } if ($this->mung) { $stub[] = 'Phar::mungServer(' . var_export($this->mung, true) . ");"; } if ($this->index && !$this->web && !$this->extractForce) { $stub[] = "require 'phar://' . __FILE__ . '/{$this->index}';"; } $stub[] = '}'; return $stub; } } '); /** * The open-ended stub pattern. * * @var string */ define('BOX_EXTRACT_PATTERN_OPEN', "__HALT" . "_COMPILER(); ?>\r\n"); /** * Extracts a phar without the extension. * * This class is a rewrite of the `Extract_Phar` class that is included * in the default stub for all phars. The class is designed to work from * inside and outside of a phar. Unlike the original class, the stub * length must be specified. * * @author Kevin Herrera * * @link https://github.com/php/php-src/blob/master/ext/phar/shortarc.php */ class Extract { /** * The default stub pattern. * * @var string */ const PATTERN_DEFAULT = BOX_EXTRACT_PATTERN_DEFAULT; /** * The open-ended stub pattern. * * @var string */ const PATTERN_OPEN = BOX_EXTRACT_PATTERN_OPEN; /** * The gzip compression flag. * * @var integer */ const GZ = 0x1000; /** * The bzip2 compression flag. * * @var integer */ const BZ2 = 0x2000; /** * @var integer */ const MASK = 0x3000; /** * The phar file path to extract. * * @var string */ private $file; /** * The open file handle. * * @var resource */ private $handle; /** * The length of the stub in the phar. * * @var integer */ private $stub; /** * Sets the file to extract and the stub length. * * @param string $file The file path. * @param integer $stub The stub length. * * @throws InvalidArgumentException If the file does not exist. */ public function __construct($file, $stub) { if (!is_file($file)) { throw new InvalidArgumentException( sprintf( 'The path "%s" is not a file or does not exist.', $file ) ); } $this->file = $file; $this->stub = $stub; } /** * Finds the phar's stub length using the end pattern. * * A "pattern" is a sequence of characters that indicate the end of a * stub, and the beginning of a manifest. This determines the complete * size of a stub, and is used as an offset to begin parsing the data * contained in the phar's manifest. * * The stub generated included with the Box library uses what I like * to call an open-ended pattern. This pattern uses the function * "__HALT_COMPILER();" at the end, with no following whitespace or * closing PHP tag. By default, this method will use that pattern, * defined as `Extract::PATTERN_OPEN`. * * The Phar class generates its own default stub. The pattern for the * default stub is slightly different than the one used by Box. This * pattern is defined as `Extract::PATTERN_DEFAULT`. * * If you have used your own custom stub, you will need to specify its * pattern as the `$pattern` argument, if you cannot use either of the * pattern constants defined. * * @param string $file The phar file path. * @param string $pattern The stub end pattern. * * @return integer The stub length. * * @throws InvalidArgumentException If the pattern could not be found. * @throws RuntimeException If the phar could not be read. */ public static function findStubLength( $file, $pattern = self::PATTERN_OPEN ) { if (!($fp = fopen($file, 'rb'))) { throw new RuntimeException( sprintf( 'The phar "%s" could not be opened for reading.', $file ) ); } $stub = null; $offset = 0; $combo = str_split($pattern); while (!feof($fp)) { if (fgetc($fp) === $combo[$offset]) { $offset++; if (!isset($combo[$offset])) { $stub = ftell($fp); break; } } else { $offset = 0; } } fclose($fp); if (null === $stub) { throw new InvalidArgumentException( sprintf( 'The pattern could not be found in "%s".', $file ) ); } return $stub; } /** * Extracts the phar to the directory path. * * If no directory path is given, a temporary one will be generated and * returned. If a directory path is given, the returned directory path * will be the same. * * @param string $dir The directory to extract to. * * @return string The directory extracted to. * * @throws LengthException * @throws RuntimeException */ public function go($dir = null) { // set up the output directory if (null === $dir) { $dir = rtrim(sys_get_temp_dir(), '\\/') . DIRECTORY_SEPARATOR . 'pharextract' . DIRECTORY_SEPARATOR . basename($this->file, '.phar'); } else { $dir = realpath($dir); } // skip if already extracted $md5 = $dir . DIRECTORY_SEPARATOR . md5_file($this->file); if (file_exists($md5)) { return $dir; } if (!is_dir($dir)) { $this->createDir($dir); } // open the file and skip stub $this->open(); if (-1 === fseek($this->handle, $this->stub)) { throw new RuntimeException( sprintf( 'Could not seek to %d in the file "%s".', $this->stub, $this->file ) ); } // read the manifest $info = $this->readManifest(); if ($info['flags'] & self::GZ) { if (!function_exists('gzinflate')) { throw new RuntimeException( 'The zlib extension is (gzinflate()) is required for "%s.', $this->file ); } } if ($info['flags'] & self::BZ2) { if (!function_exists('bzdecompress')) { throw new RuntimeException( 'The bzip2 extension (bzdecompress()) is required for "%s".', $this->file ); } } self::purge($dir); $this->createDir($dir); $this->createFile($md5); foreach ($info['files'] as $info) { $path = $dir . DIRECTORY_SEPARATOR . $info['path']; $parent = dirname($path); if (!is_dir($parent)) { $this->createDir($parent); } if (preg_match('{/$}', $info['path'])) { $this->createDir($path, 0777, false); } else { $this->createFile( $path, $this->extractFile($info) ); } } return $dir; } /** * Recursively deletes the directory or file path. * * @param string $path The path to delete. * * @throws RuntimeException If the path could not be deleted. */ public static function purge($path) { if (is_dir($path)) { foreach (scandir($path) as $item) { if (('.' === $item) || ('..' === $item)) { continue; } self::purge($path . DIRECTORY_SEPARATOR . $item); } if (!rmdir($path)) { throw new RuntimeException( sprintf( 'The directory "%s" could not be deleted.', $path ) ); } } else { if (!unlink($path)) { throw new RuntimeException( sprintf( 'The file "%s" could not be deleted.', $path ) ); } } } /** * Creates a new directory. * * @param string $path The directory path. * @param integer $chmod The file mode. * @param boolean $recursive Recursively create path? * * @throws RuntimeException If the path could not be created. */ private function createDir($path, $chmod = 0777, $recursive = true) { if (!mkdir($path, $chmod, $recursive)) { throw new RuntimeException( sprintf( 'The directory path "%s" could not be created.', $path ) ); } } /** * Creates a new file. * * @param string $path The file path. * @param string $contents The file contents. * @param integer $mode The file mode. * * @throws RuntimeException If the file could not be created. */ private function createFile($path, $contents = '', $mode = 0666) { if (false === file_put_contents($path, $contents)) { throw new RuntimeException( sprintf( 'The file "%s" could not be written.', $path ) ); } if (!chmod($path, $mode)) { throw new RuntimeException( sprintf( 'The file "%s" could not be chmodded to %o.', $path, $mode ) ); } } /** * Extracts a single file from the phar. * * @param array $info The file information. * * @return string The file data. * * @throws RuntimeException If the file could not be extracted. * @throws UnexpectedValueException If the crc32 checksum does not * match the expected value. */ private function extractFile($info) { if (0 === $info['size']) { return ''; } $data = $this->read($info['compressed_size']); if ($info['flags'] & self::GZ) { if (false === ($data = gzinflate($data))) { throw new RuntimeException( sprintf( 'The "%s" file could not be inflated (gzip) from "%s".', $info['path'], $this->file ) ); } } elseif ($info['flags'] & self::BZ2) { if (false === ($data = bzdecompress($data))) { throw new RuntimeException( sprintf( 'The "%s" file could not be inflated (bzip2) from "%s".', $info['path'], $this->file ) ); } } if (($actual = strlen($data)) !== $info['size']) { throw new UnexpectedValueException( sprintf( 'The size of "%s" (%d) did not match what was expected (%d) in "%s".', $info['path'], $actual, $info['size'], $this->file ) ); } $crc32 = sprintf('%u', crc32($data) & 0xffffffff); if ($info['crc32'] != $crc32) { throw new UnexpectedValueException( sprintf( 'The crc32 checksum (%s) for "%s" did not match what was expected (%s) in "%s".', $crc32, $info['path'], $info['crc32'], $this->file ) ); } return $data; } /** * Opens the file for reading. * * @throws RuntimeException If the file could not be opened. */ private function open() { if (null === ($this->handle = fopen($this->file, 'rb'))) { $this->handle = null; throw new RuntimeException( sprintf( 'The file "%s" could not be opened for reading.', $this->file ) ); } } /** * Reads the number of bytes from the file. * * @param integer $bytes The number of bytes. * * @return string The binary string read. * * @throws RuntimeException If the read fails. */ private function read($bytes) { $read = ''; $total = $bytes; while (!feof($this->handle) && $bytes) { if (false === ($chunk = fread($this->handle, $bytes))) { throw new RuntimeException( sprintf( 'Could not read %d bytes from "%s".', $bytes, $this->file ) ); } $read .= $chunk; $bytes -= strlen($chunk); } if (($actual = strlen($read)) !== $total) { throw new RuntimeException( sprintf( 'Only read %d of %d in "%s".', $actual, $total, $this->file ) ); } return $read; } /** * Reads and unpacks the manifest data from the phar. * * @return array The manifest. */ private function readManifest() { $size = unpack('V', $this->read(4)); $size = $size[1]; $raw = $this->read($size); // ++ start skip: API version, global flags, alias, and metadata $count = unpack('V', substr($raw, 0, 4)); $count = $count[1]; $aliasSize = unpack('V', substr($raw, 10, 4)); $aliasSize = $aliasSize[1]; $raw = substr($raw, 14 + $aliasSize); $metaSize = unpack('V', substr($raw, 0, 4)); $metaSize = $metaSize[1]; $offset = 0; $start = 4 + $metaSize; // -- end skip $manifest = array( 'files' => array(), 'flags' => 0, ); for ($i = 0; $i < $count; $i++) { $length = unpack('V', substr($raw, $start, 4)); $length = $length[1]; $start += 4; $path = substr($raw, $start, $length); $start += $length; $file = unpack( 'Vsize/Vtimestamp/Vcompressed_size/Vcrc32/Vflags/Vmetadata_length', substr($raw, $start, 24) ); $file['path'] = $path; $file['crc32'] = sprintf('%u', $file['crc32'] & 0xffffffff); $file['offset'] = $offset; $offset += $file['compressed_size']; $start += 24 + $file['metadata_length']; $manifest['flags'] |= $file['flags'] & self::MASK; $manifest['files'][] = $file; } return $manifest; } } '); define('BOX_EXTRACT_PATTERN_OPEN',"__HALT"."_COMPILER(); ?>\r\n"); class Extract { const PATTERN_DEFAULT=BOX_EXTRACT_PATTERN_DEFAULT; const PATTERN_OPEN=BOX_EXTRACT_PATTERN_OPEN; const GZ=4096; const BZ2=8192; const MASK=12288; private$file; private$handle; private$stub; function __construct($file,$stub){ if(!is_file($file)){ throw new InvalidArgumentException(sprintf('The path "%s" is not a file or does not exist.',$file )); } $this->file=$file; $this->stub=$stub; } static function findStubLength($file,$pattern=self::PATTERN_OPEN ){ if(!($fp=fopen($file,'rb'))){ throw new RuntimeException(sprintf('The phar "%s" could not be opened for reading.',$file )); } $stub=null; $offset=0; $combo=str_split($pattern); while(!feof($fp)){ if(fgetc($fp)===$combo[$offset]){ $offset++; if(!isset($combo[$offset])){ $stub=ftell($fp); break; } }else{ $offset=0; } } fclose($fp); if(null===$stub){ throw new InvalidArgumentException(sprintf('The pattern could not be found in "%s".',$file )); } return$stub; } function go($dir=null){ if(null===$dir){ $dir=rtrim(sys_get_temp_dir(),'\\/').DIRECTORY_SEPARATOR .'pharextract'.DIRECTORY_SEPARATOR .basename($this->file,'.phar'); }else{ $dir=realpath($dir); } $md5=$dir.DIRECTORY_SEPARATOR.md5_file($this->file); if(file_exists($md5)){ return$dir; } if(!is_dir($dir)){ $this->createDir($dir); } $this->open(); if(-1===fseek($this->handle,$this->stub)){ throw new RuntimeException(sprintf('Could not seek to %d in the file "%s".',$this->stub,$this->file )); } $info=$this->readManifest(); if($info['flags']&self::GZ){ if(!function_exists('gzinflate')){ throw new RuntimeException('The zlib extension is (gzinflate()) is required for "%s.',$this->file ); } } if($info['flags']&self::BZ2){ if(!function_exists('bzdecompress')){ throw new RuntimeException('The bzip2 extension (bzdecompress()) is required for "%s".',$this->file ); } } self::purge($dir); $this->createDir($dir); $this->createFile($md5); foreach($info['files']as$info){ $path=$dir.DIRECTORY_SEPARATOR.$info['path']; $parent=dirname($path); if(!is_dir($parent)){ $this->createDir($parent); } if(preg_match('{/$}',$info['path'])){ $this->createDir($path,511,false); }else{ $this->createFile($path,$this->extractFile($info)); } } return$dir; } static function purge($path){ if(is_dir($path)){ foreach(scandir($path)as$item){ if(('.'===$item)||('..'===$item)){ continue; } self::purge($path.DIRECTORY_SEPARATOR.$item); } if(!rmdir($path)){ throw new RuntimeException(sprintf('The directory "%s" could not be deleted.',$path )); } }else{ if(!unlink($path)){ throw new RuntimeException(sprintf('The file "%s" could not be deleted.',$path )); } } } private function createDir($path,$chmod=511,$recursive=true){ if(!mkdir($path,$chmod,$recursive)){ throw new RuntimeException(sprintf('The directory path "%s" could not be created.',$path )); } } private function createFile($path,$contents='',$mode=438){ if(false===file_put_contents($path,$contents)){ throw new RuntimeException(sprintf('The file "%s" could not be written.',$path )); } if(!chmod($path,$mode)){ throw new RuntimeException(sprintf('The file "%s" could not be chmodded to %o.',$path,$mode )); } } private function extractFile($info){ if(0===$info['size']){ return''; } $data=$this->read($info['compressed_size']); if($info['flags']&self::GZ){ if(false===($data=gzinflate($data))){ throw new RuntimeException(sprintf('The "%s" file could not be inflated (gzip) from "%s".',$info['path'],$this->file )); } }elseif($info['flags']&self::BZ2){ if(false===($data=bzdecompress($data))){ throw new RuntimeException(sprintf('The "%s" file could not be inflated (bzip2) from "%s".',$info['path'],$this->file )); } } if(($actual=strlen($data))!==$info['size']){ throw new UnexpectedValueException(sprintf('The size of "%s" (%d) did not match what was expected (%d) in "%s".',$info['path'],$actual,$info['size'],$this->file )); } $crc32=sprintf('%u',crc32($data)&4294967295); if($info['crc32']!=$crc32){ throw new UnexpectedValueException(sprintf('The crc32 checksum (%s) for "%s" did not match what was expected (%s) in "%s".',$crc32,$info['path'],$info['crc32'],$this->file )); } return$data; } private function open(){ if(null===($this->handle=fopen($this->file,'rb'))){ $this->handle=null; throw new RuntimeException(sprintf('The file "%s" could not be opened for reading.',$this->file )); } } private function read($bytes){ $read=''; $total=$bytes; while(!feof($this->handle)&&$bytes){ if(false===($chunk=fread($this->handle,$bytes))){ throw new RuntimeException(sprintf('Could not read %d bytes from "%s".',$bytes,$this->file )); } $read.=$chunk; $bytes-=strlen($chunk); } if(($actual=strlen($read))!==$total){ throw new RuntimeException(sprintf('Only read %d of %d in "%s".',$actual,$total,$this->file )); } return$read; } private function readManifest(){ $size=unpack('V',$this->read(4)); $size=$size[1]; $raw=$this->read($size); $count=unpack('V',substr($raw,0,4)); $count=$count[1]; $aliasSize=unpack('V',substr($raw,10,4)); $aliasSize=$aliasSize[1]; $raw=substr($raw,14+$aliasSize); $metaSize=unpack('V',substr($raw,0,4)); $metaSize=$metaSize[1]; $offset=0; $start=4+$metaSize; $manifest=array('files'=>array(),'flags'=>0,); for($i=0;$i<$count;$i++){ $length=unpack('V',substr($raw,$start,4)); $length=$length[1]; $start+=4; $path=substr($raw,$start,$length); $start+=$length; $file=unpack('Vsize/Vtimestamp/Vcompressed_size/Vcrc32/Vflags/Vmetadata_length',substr($raw,$start,24)); $file['path']=$path; $file['crc32']=sprintf('%u',$file['crc32']&4294967295); $file['offset']=$offset; $offset+=$file['compressed_size']; $start+=24+$file['metadata_length']; $manifest['flags']|=$file['flags']&self::MASK; $manifest['files'][]=$file; } return$manifest; } } add(new Command\Build()); $this->add(new Command\Search()); $this->add(new Command\Install()); $this->setDefaultCommand('search'); } } output = $output; } public function log($message) { $this->output($message . PHP_EOL); } private function output($message) { if ($this->output === true) { echo $message; } elseif ($this->output !== false) { call_user_func($this->output, $message); } } } package = new Package($this->loadJson($path), dirname(realpath($path))); $this->logger = new Logger(); } /** * set output function to use to output log messages * * @param callable|boolean $output callable that receives a single $line argument or boolean echo */ public function setOutput($output) { $this->logger->setOutput($output); } /** * Get path to target phar file (absolute path or relative to current directory) * * @return string */ public function getTarget() { if ($this->target === null) { $this->target = $this->package->getShortName() . '.phar'; } return $this->target; } /** * Set path to target phar file (absolute path or relative to current directory) * * If the given path is a directory, the default target (package short name) * will be appended automatically. * * @param string $target * @return $this */ public function setTarget($target) { // path is actually a directory => append package name if (is_dir($target)) { $this->target = null; $target = rtrim($target, '/') . '/' . $this->getTarget(); } $this->target = $target; return $this; } /** * Get path to main bin (relative to package directory) * * @return string * @throws \UnexpectedValueException */ public function getMain() { if ($this->main === null) { foreach ($this->package->getBins() as $path) { if (!file_exists($this->package->getDirectory() . $path)) { throw new \UnexpectedValueException('Bin file "' . $path . '" does not exist'); } $this->main = $path; break; } } return $this->main; } /** * set path to main bin (relative to package directory) * * @param string $main * @return $this */ public function setMain($main) { $this->main = $main; return $this; } /** * * @return Package */ public function getPackageRoot() { return $this->package; } /** * * @return Package[] */ public function getPackagesDependencies() { $packages = array(); $pathVendor = $this->package->getDirectory() . $this->package->getPathVendor(); // load all installed packages (use installed.json which also includes version instead of composer.lock) if (is_file($pathVendor . 'composer/installed.json')) { // file does not exist if there's nothing to be installed $installed = $this->loadJson($pathVendor . 'composer/installed.json'); // Composer 2.0 format wrapped in additional root key if (isset($installed['packages'])) { $installed = $installed['packages']; } foreach ($installed as $package) { $dir = $package['name'] . '/'; if (isset($package['target-dir'])) { $dir .= trim($package['target-dir'], '/') . '/'; } $dir = $pathVendor . $dir; $packages []= new Package($package, $dir); } } return $packages; } public function build() { $this->log('[' . $this->step . '/' . $this->step.'] Creating phar ' . $this->getTarget() . ''); $time = microtime(true); $pathVendor = $this->package->getDirectory() . $this->package->getPathVendor(); if (!is_dir($pathVendor)) { throw new \RuntimeException('Directory "' . $pathVendor . '" not properly installed, did you run "composer install"?'); } // get target and tempory file name to write to $target = $this->getTarget(); do { $tmp = $target . '.' . mt_rand() . '.phar'; } while (file_exists($tmp)); $targetPhar = new TargetPhar(new \Phar($tmp), $this); $this->log(' - Adding main package "' . $this->package->getName() . '"'); $targetPhar->addBundle($this->package->bundle()); $this->log(' - Adding composer base files'); // explicitly add composer autoloader $targetPhar->addFile($pathVendor . 'autoload.php'); // only add composer base directory (no sub-directories!) $targetPhar->buildFromIterator(new \GlobIterator($pathVendor . 'composer/*.*', \FilesystemIterator::KEY_AS_FILENAME)); foreach ($this->getPackagesDependencies() as $package) { $this->log(' - Adding dependency "' . $package->getName() . '" from "' . $this->getPathLocalToBase($package->getDirectory()) . '"'); $targetPhar->addBundle($package->bundle()); } $this->log(' - Setting main/stub'); $chmod = 0755; $main = $this->getMain(); if ($main === null) { $this->log(' WARNING: No main bin file defined! Resulting phar will NOT be executable'); } else { $generator = StubGenerator::create() ->index($main) ->extract(true) ->banner("Bundled by phar-composer with the help of php-box.\n\n@link https://github.com/clue/phar-composer"); $lines = file($this->package->getDirectory() . $main, FILE_IGNORE_NEW_LINES); if (substr($lines[0], 0, 2) === '#!') { $this->log(' Using referenced shebang "'. $lines[0] . '"'); $generator->shebang($lines[0]); // remove shebang from main file and add (overwrite) unset($lines[0]); $targetPhar->addFromString($main, implode("\n", $lines)); } $targetPhar->setStub($generator->generate()); $chmod = octdec(substr(decoct(fileperms($this->package->getDirectory() . $main)),-4)); $this->log(' Using referenced chmod ' . sprintf('%04o', $chmod)); } // stop buffering contents in memory and write to file // failure to write will emit a warning (ignore) and throw an (uncaught) exception try { @$targetPhar->stopBuffering(); $targetPhar = null; } catch (\PharException $e) { throw new \RuntimeException('Unable to write phar: ' . $e->getMessage()); } if ($chmod !== null) { $this->log(' Applying chmod ' . sprintf('%04o', $chmod)); if (chmod($tmp, $chmod) === false) { throw new \UnexpectedValueException('Unable to chmod target file "' . $target .'"'); } } if (file_exists($target)) { $this->log(' - Overwriting existing file ' . $target . ' (' . $this->getSize($target) . ')'); } if (@rename($tmp, $target) === false) { // retry renaming after sleeping to give slow network drives some time to flush data sleep(5); if (rename($tmp, $target) === false) { throw new \UnexpectedValueException('Unable to rename temporary phar archive to "'.$target.'"'); } } $time = max(microtime(true) - $time, 0); $this->log(''); $this->log(' OK - Creating ' . $this->getTarget() .' (' . $this->getSize($this->getTarget()) . ') completed after ' . round($time, 1) . 's'); } private function getSize($path) { return round(filesize($path) / 1024, 1) . ' KiB'; } public function getPathLocalToBase($path) { $root = $this->package->getDirectory(); if (strpos($path, $root) !== 0) { throw new \UnexpectedValueException('Path "' . $path . '" is not within base project path "' . $root . '"'); } return substr($path, strlen($root)); } public function log($message) { $this->logger->log($message); } public function setStep($step) { $this->step = $step; } /** * @param string $path * @return mixed * @throws \InvalidArgumentException */ private function loadJson($path) { $ret = @json_decode(file_get_contents($path), true); if ($ret === null) { throw new \InvalidArgumentException('Unable to parse given path "' . $path . '"', json_last_error()); } return $ret; } } startBuffering(); $this->phar = $phar; $this->pharComposer = $pharComposer; } /** * finalize writing of phar file */ public function stopBuffering() { $this->phar->stopBuffering(); } /** * adds given list of resources to phar * * @param Bundle $bundle */ public function addBundle(Bundle $bundle) { foreach ($bundle as $resource) { if (is_string($resource)) { $this->addFile($resource); } else { $this->buildFromIterator($resource); } } } /** * Adds a file to the Phar * * @param string $file The file name. */ public function addFile($file) { $this->phar->addFile($file, $this->pharComposer->getPathLocalToBase($file)); } public function buildFromIterator(\Traversable $iterator) { $this->phar->buildFromIterator($iterator, $this->pharComposer->getPackageRoot()->getDirectory()); } /** * Used to set the PHP loader or bootstrap stub of a Phar archive * * @param string $stub */ public function setStub($stub) { $this->phar->setStub($stub); } public function addFromString($local, $contents) { $this->phar->addFromString($local, $contents); } } setOutput(true); } private function log($message) { $fn = $this->output; $fn($message . PHP_EOL); } public function setBinSudo($bin) { $this->binSudo = $bin; } /** * @param OutputInterface|bool|callable $fn */ public function setOutput($fn) { if ($fn instanceof OutputInterface) { $fn = function ($line) use ($fn) { $fn->write($line); }; } elseif ($fn === true) { $fn = function ($line) { echo $line; }; } elseif ($fn === false) { $fn = function () { }; } $this->output = $fn; } /** * ensure writing phar files is enabled or respawn with PHP setting which allows writing * * @param int $wait * @return void * @uses assertWritable() */ public function coerceWritable($wait = 1) { try { $this->assertWritable(); } catch (UnexpectedValueException $e) { if (!function_exists('pcntl_exec')) { $this->log('' . $e->getMessage() . ''); return; } $this->log('' . $e->getMessage() . ', trying to re-spawn with correct config'); if ($wait) { sleep($wait); } $args = array_merge(array('php', '-d phar.readonly=off'), $_SERVER['argv']); if (pcntl_exec('/usr/bin/env', $args) === false) { $this->log('Unable to switch into new configuration'); return; } } } /** * ensure writing phar files is enabled or throw an exception * * @throws UnexpectedValueException */ public function assertWritable() { if (ini_get('phar.readonly') === '1') { throw new UnexpectedValueException('Your configuration disabled writing phar files (phar.readonly = On), please update your configuration or run with "php -d phar.readonly=off ' . $_SERVER['argv'][0].'"'); } } /** * @param string $path * @param string $version * @return PharComposer * @throws UnexpectedValueException * @throws InvalidArgumentException * @throws RuntimeException */ public function getPharer($path, $version = null) { if ($version !== null) { // TODO: should be the other way around $path .= ':' . $version; } $step = 1; $steps = 1; if ($this->isPackageUrl($path)) { $url = $path; $version = null; $steps = 3; if (preg_match('/(.+)\:((?:dev\-|v\d)\S+)$/i', $url, $match)) { $url = $match[1]; $version = $match[2]; if (substr($version, 0, 4) === 'dev-') { $version = substr($version, 4); } } $path = $this->getDirTemporary(); $finder = new ExecutableFinder(); $git = escapeshellarg($finder->find('git', 'git')); $that = $this; $this->displayMeasure( '[' . $step++ . '/' . $steps.'] Cloning ' . $url . ' into temporary directory ' . $path . '', function() use ($that, $url, $path, $version, $git) { $that->exec($git . ' clone ' . escapeshellarg($url) . ' ' . escapeshellarg($path)); if ($version !== null) { $this->exec($git . ' checkout ' . escapeshellarg($version) . ' 2>&1', $path); } }, 'Cloning base repository completed' ); $pharcomposer = new PharComposer($path . '/composer.json'); $package = $pharcomposer->getPackageRoot()->getName(); if (is_file('composer.phar')) { $command = escapeshellarg($finder->find('php', 'php')) . ' composer.phar'; } else { $command = escapeshellarg($finder->find('composer', 'composer')); } $command .= ' install --no-dev --no-progress --no-scripts'; $this->displayMeasure( '[' . $step++ . '/' . $steps.'] Installing dependencies for ' . $package . ' into ' . $path . ' (using ' . $command . ')', function () use ($that, $command, $path) { try { $that->exec($command, $path); } catch (UnexpectedValueException $e) { throw new UnexpectedValueException('Installing dependencies via composer failed', 0, $e); } }, 'Downloading dependencies completed' ); } elseif ($this->isPackageName($path)) { if (is_dir($path)) { $this->log('There\'s also a directory with the given name'); } $steps = 2; $package = $path; $path = $this->getDirTemporary(); $finder = new ExecutableFinder(); if (is_file('composer.phar')) { $command = escapeshellarg($finder->find('php', 'php')) . ' composer.phar'; } else { $command = escapeshellarg($finder->find('composer', 'composer')); } $command .= ' create-project ' . escapeshellarg($package) . ' ' . escapeshellarg($path) . ' --no-dev --no-progress --no-scripts'; $that = $this; $this->displayMeasure( '[' . $step++ . '/' . $steps.'] Installing ' . $package . ' to temporary directory ' . $path . ' (using ' . $command . ')', function () use ($that, $command) { try { $that->exec($command); } catch (UnexpectedValueException $e) { throw new UnexpectedValueException('Installing package via composer failed', 0, $e); } }, 'Downloading package completed' ); } if (is_dir($path)) { $path = rtrim($path, '/') . '/composer.json'; } if (!is_file($path)) { throw new InvalidArgumentException('The given path "' . $path . '" is not a readable file'); } $pharer = new PharComposer($path); $pharer->setOutput($this->output); $pharer->setStep($step); $pathVendor = $pharer->getPackageRoot()->getDirectory() . $pharer->getPackageRoot()->getPathVendor(); if (!is_dir($pathVendor)) { throw new RuntimeException('Project is not installed via composer. Run "composer install" manually'); } return $pharer; } public function measure($fn) { $time = microtime(true); $fn(); return max(microtime(true) - $time, 0); } public function displayMeasure($title, $fn, $success) { $this->log($title); $time = $this->measure($fn); $this->log(''); $this->log(' OK - ' . $success .' (after ' . round($time, 1) . 's)'); } /** * @param string $cmd * @param ?string $chdir * @return void * @throws UnexpectedValueException */ public function exec($cmd, $chdir = null) { $nl = true; // $output = $this->output; // Symfony 5+ requires 'fromShellCommandline', older versions support direct instantiation with command line // @codeCoverageIgnoreStart try { new \ReflectionMethod('Symfony\Component\Process\Process', 'fromShellCommandline'); $process = Process::fromShellCommandline($cmd, $chdir); } catch (\ReflectionException $e) { $process = new Process($cmd, $chdir); } // @codeCoverageIgnoreEnd $process->setTimeout(null); $code = $process->run(function($type, $data) use ($output, &$nl) { if ($nl === true) { $data = PHP_EOL . $data; $nl = false; } if (substr($data, -1) === "\n") { $nl = true; $data = substr($data, 0, -strlen(PHP_EOL)); } $data = str_replace("\n", "\n ", $data); $output($data); }); if ($nl) { $this->log(''); } if ($code !== 0) { throw new UnexpectedValueException('Error status code: ' . $process->getExitCodeText() . ' (code ' . $code . ')'); } } public function install(PharComposer $pharer, $path) { $pharer->build(); $this->log('Move resulting phar to ' . $path . ''); $this->exec($this->binSudo . ' -- mv -f ' . escapeshellarg($pharer->getTarget()) . ' ' . escapeshellarg($path)); $this->log(''); $this->log(' OK - Moved to ' . $path . ''); } /** * @param Package $package * @param ?string $path * @return string */ public function getSystemBin(Package $package, $path = null) { // no path given => place in system bin path if ($path === null) { $path = self::PATH_BIN; } // no slash => path is relative to system bin path if (strpos($path, '/') === false) { $path = self::PATH_BIN . '/' . $path; } // path is actually a directory => append package name if (is_dir($path)) { $path = rtrim($path, '/') . '/' . $package->getShortName(); } return $path; } private function isPackageName($path) { return !!preg_match('/^[^\s\/]+\/[^\s\/]+(\:[^\s]+)?$/i', $path); } public function isPackageUrl($path) { return (strpos($path, '://') !== false && @parse_url($path) !== false) || preg_match('/^[^-\/\s][^:\/\s]*:[^\s\\\\]\S*/', $path); } private function getDirTemporary() { $path = sys_get_temp_dir() . '/phar-composer' . mt_rand(0,9); while (is_dir($path)) { $path .= mt_rand(0, 9); } return $path; } } The MIT License (MIT) Copyright (c) 2013 Christian Lück 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. # Change Log for the Composer Installer for PHP CodeSniffer All notable changes to this project will be documented in this file. This projects adheres to [Keep a CHANGELOG](https://keepachangelog.com/) and uses [Semantic Versioning](https://semver.org/). ## [Unreleased] _Nothing yet._ ## [v1.2.1] - 2026-05-06 ### Changed - Various housekeeping, including improvements to CI. ### Fixed - Fix potential error when running `composer install` with an `open_basedir` restriction in effect. Thanks [@srebb] ! [#271], [#272] [#271]: https://github.com/PHPCSStandards/composer-installer/issues/271 [#272]: https://github.com/PHPCSStandards/composer-installer/pull/272 ## [v1.2.0] - 2025-11-11 ### Changed - Various housekeeping, including improvements to the documentation and tests. ### Removed - Drop support for PHP_CodeSniffer 2.x. Thanks [@jrfnl] ! [#261] [#261]: https://github.com/PHPCSStandards/composer-installer/pull/261 ## [v1.1.2] - 2025-07-17 ### Changed - General housekeeping. ### Fixed - [#247]: Potential fatal error when the Composer EventDispatcher is called programmatically from an integration. Thanks [@jrfnl] ! [#248] [#247]: https://github.com/PHPCSStandards/composer-installer/issues/247 [#248]: https://github.com/PHPCSStandards/composer-installer/pull/248 ## [v1.1.1] - 2025-06-27 ### Changed - Various housekeeping, including improvements to the documentation. ### Fixed - [#239]: The PHP_CodeSniffer package could not be always found when running the plugin in a Drupal or Magento setup. Thanks [@jrfnl] ! [#245] [#239]: https://github.com/PHPCSStandards/composer-installer/issues/239 [#245]: https://github.com/PHPCSStandards/composer-installer/pull/245 ## [v1.1.0] - 2025-06-24 ### Changed - Various housekeeping, including improvements to the documentation and tests. Thanks [@SplotyCode], [@fredden] for contributing! ### Removed - Drop support for Composer v1.x. Thanks [@fredden] ! [#230] [#230]: https://github.com/PHPCSStandards/composer-installer/pull/230 ## [v1.0.0] - 2023-01-05 ### Breaking changes - Rename namespace prefix from Dealerdirect to PHPCSStandards by [@jrfnl] in [#191] - Drop support for PHP 5.3 by [@jrfnl] in [#147] ### Changed - Correct grammar in error message by [@fredden] in [#189] - .gitattributes: sync with current repo state by [@jrfnl] in [#198] - PHPCSVersions: update URL references by [@jrfnl] in [#161] - README: remove references to Scrutinizer by [@jrfnl] in [#157] - Rename references to master branch by [@Potherca] in [#201] - Update repo references by [@jrfnl] in [#158] - GH Actions: add builds against Composer 2.2 for PHP 7.2 - 8.x by [@jrfnl] in [#172] - GH Actions: bust the cache semi-regularly by [@jrfnl] in [#192] - GH Actions: fix builds on Windows with PHP 8.2 by [@jrfnl] in [#180] - GH Actions: fix up fail-fast for setup-php by [@jrfnl] in [#195] - GH Actions: run integration tests against Composer snapshot by [@jrfnl] in [#163] - GH Actions: run linting against against ubuntu-latest by [@jrfnl] in [#184] - GH Actions/Securitycheck: update the security checker download by [@jrfnl] in [#178] - GH Actions/Securitycheck: update the security checker download by [@jrfnl] in [#186] - GH Actions/Securitycheck: update the security checker download by [@jrfnl] in [#190] - GH Actions: selectively use fail-fast with setup-php by [@jrfnl] in [#194] - GH Actions: stop running tests against PHP 5.5/Composer 1.x on Windows (and remove work-arounds) by [@jrfnl] in [#183] - GH Actions: various tweaks / PHP 8.2 not allowed to fail by [@jrfnl] in [#193] - GH Actions: version update for various predefined actions by [@jrfnl] in [#170] - Update YamLint by [@Potherca] in [#173] - Add initial integration test setup and first few tests by [@jrfnl] in [#153] - BaseLineTest: stabilize the message checks by [@jrfnl] in [#162] - PlayNiceWithScriptsTest: wrap output expectation in condition by [@jrfnl] in [#179] - RegisterExternalStandardsTest: add new tests by [@jrfnl] in [#165] - RegisterExternalStandardsTest: stabilize test for Composer v1 on Windows with PHP 5.5 by [@jrfnl] in [#171] - TestCase::executeCliCommand(): retry Composer commands on a particular exception by [@jrfnl] in [#164] - Tests: add new InstalledPathsOrderTest by [@jrfnl] in [#176] - Tests: add new InstallUpdateEventsTest and NonInstallUpdateEventsTest by [@jrfnl] in [#174] - Tests: add new InvalidPackagesTest by [@jrfnl] in [#168] - Tests: add new PlayNiceWithScriptsTest by [@jrfnl] in [#169] - Tests: add new PreexistingPHPCSConfigTest by [@jrfnl] in [#166] - Tests: add new PreexistingPHPCSInstalledPathsConfigTest + bug fix by [@jrfnl] in [#167] - Tests: add new RemovePluginTest by [@jrfnl] in [#177] - Tests: add new RootPackageHandlingTest + bugfix by [@jrfnl] in [#175] ### Fixed - Plugin: improve feedback by [@jrfnl] in [#182] [#147]: https://github.com/PHPCSStandards/composer-installer/pull/147 [#153]: https://github.com/PHPCSStandards/composer-installer/pull/153 [#157]: https://github.com/PHPCSStandards/composer-installer/pull/157 [#158]: https://github.com/PHPCSStandards/composer-installer/pull/158 [#161]: https://github.com/PHPCSStandards/composer-installer/pull/161 [#162]: https://github.com/PHPCSStandards/composer-installer/pull/162 [#163]: https://github.com/PHPCSStandards/composer-installer/pull/163 [#164]: https://github.com/PHPCSStandards/composer-installer/pull/164 [#165]: https://github.com/PHPCSStandards/composer-installer/pull/165 [#166]: https://github.com/PHPCSStandards/composer-installer/pull/166 [#167]: https://github.com/PHPCSStandards/composer-installer/pull/167 [#168]: https://github.com/PHPCSStandards/composer-installer/pull/168 [#169]: https://github.com/PHPCSStandards/composer-installer/pull/169 [#170]: https://github.com/PHPCSStandards/composer-installer/pull/170 [#171]: https://github.com/PHPCSStandards/composer-installer/pull/171 [#172]: https://github.com/PHPCSStandards/composer-installer/pull/172 [#173]: https://github.com/PHPCSStandards/composer-installer/pull/173 [#174]: https://github.com/PHPCSStandards/composer-installer/pull/174 [#175]: https://github.com/PHPCSStandards/composer-installer/pull/175 [#176]: https://github.com/PHPCSStandards/composer-installer/pull/176 [#177]: https://github.com/PHPCSStandards/composer-installer/pull/177 [#178]: https://github.com/PHPCSStandards/composer-installer/pull/178 [#179]: https://github.com/PHPCSStandards/composer-installer/pull/179 [#180]: https://github.com/PHPCSStandards/composer-installer/pull/180 [#182]: https://github.com/PHPCSStandards/composer-installer/pull/182 [#183]: https://github.com/PHPCSStandards/composer-installer/pull/183 [#184]: https://github.com/PHPCSStandards/composer-installer/pull/184 [#186]: https://github.com/PHPCSStandards/composer-installer/pull/186 [#189]: https://github.com/PHPCSStandards/composer-installer/pull/189 [#190]: https://github.com/PHPCSStandards/composer-installer/pull/190 [#191]: https://github.com/PHPCSStandards/composer-installer/pull/191 [#192]: https://github.com/PHPCSStandards/composer-installer/pull/192 [#193]: https://github.com/PHPCSStandards/composer-installer/pull/193 [#194]: https://github.com/PHPCSStandards/composer-installer/pull/194 [#195]: https://github.com/PHPCSStandards/composer-installer/pull/195 [#198]: https://github.com/PHPCSStandards/composer-installer/pull/198 [#201]: https://github.com/PHPCSStandards/composer-installer/pull/201 ## [v0.7.2] - 2022-02-04 ### Changed - Add details regarding QA automation in CONTRIBUTING.md file. by [@Potherca] in [#133] - Add mention of Composer and PHP compatibility to project README. by [@Potherca] in [#132] - Composer: tweak PHPCS version constraint by [@jrfnl] in [#152] - CONTRIBUTING: remove duplicate code of conduct by [@jrfnl] in [#148] - Document release process by [@Potherca] in [#118] - Plugin::loadInstalledPaths(): config-show always shows all by [@jrfnl] in [#154] - README: minor tweaks by [@jrfnl] in [#149] - README: update with information about Composer >= 2.2 by [@jrfnl] in [#141] - Replace deprecated Sensiolabs security checker by [@paras-malhotra] in [#130] - Stabilize a condition by [@jrfnl] in [#127] - Update copyright year by [@jrfnl] in [#138] - Various minor tweaks by [@jrfnl] in [#151] - Change YamlLint config to prevent "truthy" warning. by [@Potherca] in [#144] - GH Actions: PHP 8.1 has been released by [@jrfnl] in [#139] - Travis: line length tweaks by [@jrfnl] in [#128] - CI: Switch to GH Actions by [@jrfnl] in [#137] - CI: various updates by [@jrfnl] in [#140] [#118]: https://github.com/PHPCSStandards/composer-installer/pull/118 [#127]: https://github.com/PHPCSStandards/composer-installer/pull/127 [#128]: https://github.com/PHPCSStandards/composer-installer/pull/128 [#130]: https://github.com/PHPCSStandards/composer-installer/pull/130 [#132]: https://github.com/PHPCSStandards/composer-installer/pull/132 [#133]: https://github.com/PHPCSStandards/composer-installer/pull/133 [#137]: https://github.com/PHPCSStandards/composer-installer/pull/137 [#138]: https://github.com/PHPCSStandards/composer-installer/pull/138 [#139]: https://github.com/PHPCSStandards/composer-installer/pull/139 [#140]: https://github.com/PHPCSStandards/composer-installer/pull/140 [#141]: https://github.com/PHPCSStandards/composer-installer/pull/141 [#144]: https://github.com/PHPCSStandards/composer-installer/pull/144 [#148]: https://github.com/PHPCSStandards/composer-installer/pull/148 [#149]: https://github.com/PHPCSStandards/composer-installer/pull/149 [#151]: https://github.com/PHPCSStandards/composer-installer/pull/151 [#152]: https://github.com/PHPCSStandards/composer-installer/pull/152 [#154]: https://github.com/PHPCSStandards/composer-installer/pull/154 ## [v0.7.1] - 2020-12-07 ### Closed issues - Order of installed_paths inconsistent between runs [#125] - Maintaining this project and Admin rights [#113] ### Changed - Sort list of installed paths before saving for consistency by [@kevinfodness] in [#126] - Update code of conduct by [@Potherca] in [#117] - Add remark configuration by [@Potherca] in [#122] - Travis: add build against PHP 8.0 by [@jrfnl] in [#124] ### Fixed - Fixed v4 constraint by [@GrahamCampbell] in [#115] [#113]: https://github.com/PHPCSStandards/composer-installer/issues/113 [#115]: https://github.com/PHPCSStandards/composer-installer/pull/115 [#117]: https://github.com/PHPCSStandards/composer-installer/pull/117 [#122]: https://github.com/PHPCSStandards/composer-installer/pull/122 [#124]: https://github.com/PHPCSStandards/composer-installer/pull/124 [#125]: https://github.com/PHPCSStandards/composer-installer/issues/125 [#126]: https://github.com/PHPCSStandards/composer-installer/pull/126 ## [v0.7.0] - 2020-06-25 ### Closed issues - Composer 2.x compatibility [#108] - Add link to Packagist on main page [#110] - Switch from Travis CI .org to .com [#112] ### Added - Allow installation on PHP 8 by [@jrfnl] in [#106] - Support Composer 2.0 by [@jrfnl] in [#111] ### Changed - Test with PHPCS 4.x and allow installation when using PHPCS 4.x by [@jrfnl] in [#107] - Fix case of class name by [@Seldaek] in [#109] [#106]: https://github.com/PHPCSStandards/composer-installer/pull/106 [#107]: https://github.com/PHPCSStandards/composer-installer/pull/107 [#108]: https://github.com/PHPCSStandards/composer-installer/issues/108 [#109]: https://github.com/PHPCSStandards/composer-installer/pull/109 [#110]: https://github.com/PHPCSStandards/composer-installer/issues/110 [#111]: https://github.com/PHPCSStandards/composer-installer/pull/111 [#112]: https://github.com/PHPCSStandards/composer-installer/issues/112 ## [v0.6.2] - 2020-01-29 ### Fixed - Composer scripts/commands broken in 0.6.0 update by [@BrianHenryIE] in [#105] [#105]: https://github.com/PHPCSStandards/composer-installer/pull/105 ## [v0.6.1] - 2020-01-27 ### Closed issues - Do not exit with code 1 on uninstall (--no-dev) [#103] ### Changed - Readme: minor tweak now 0.6.0 has been released [#102] ([@jrfnl]) ### Fixed - [#103]: Fix for issue #103 [#104] ([@Potherca]) [#102]: https://github.com/PHPCSStandards/composer-installer/pull/102 [#103]: https://github.com/PHPCSStandards/composer-installer/issues/103 [#104]: https://github.com/PHPCSStandards/composer-installer/pull/104 ## [v0.6.0] - 2020-01-19 ### Closed issues - Composer PHP version appears not to be respected [#79] - Allow a string value for extra.phpcodesniffer-search-depth [#82] - Add [@jrfnl] as (co)maintainer to this project [#87] ### Added - Add support for a string phpcodesniffer-search-depth config value set via composer config by [@TravisCarden] in [#85] - Send an exit code when the script terminates by [@jrfnl] in [#93] - Verify the installed_paths after save by [@jrfnl] in [#97] ### Changed - CS: fix compliance with PSR12 by [@jrfnl] in [#88] - Improve GH issue template by [@jrfnl] in [#94] - Readme: add section about including this plugin from an external PHPCS standard by [@jrfnl] in [#95] - Bug report template: further enhancement by [@jrfnl] in [#99] - Update copyright year. by [@Potherca] in [#101] - Adding linting jobs in github action by [@mjrider] in [#96] - GH Actions: minor tweaks: by [@jrfnl] in [#100] - Travis: disable Xdebug by [@jrfnl] in [#89] - Travis: test against PHP 7.4, not snapshot by [@jrfnl] in [#90] - Travis: use a mix of PHPCS versions in the matrix by [@jrfnl] in [#91] - Update Travis file and fix build by [@Potherca] in [#86] ### Fixed - [#79]: Respect PHP version used by Composer and provide better feedback on failure by [@jrfnl] in [#80] - Bug fix: loadInstalledPaths() very very broken since PHPCS 3.1.0 by [@jrfnl] in [#98] [#79]: https://github.com/PHPCSStandards/composer-installer/issues/79 [#80]: https://github.com/PHPCSStandards/composer-installer/issues/80 [#82]: https://github.com/PHPCSStandards/composer-installer/issues/82 [#85]: https://github.com/PHPCSStandards/composer-installer/pull/85 [#86]: https://github.com/PHPCSStandards/composer-installer/pull/86 [#87]: https://github.com/PHPCSStandards/composer-installer/issues/87 [#88]: https://github.com/PHPCSStandards/composer-installer/pull/88 [#89]: https://github.com/PHPCSStandards/composer-installer/pull/89 [#90]: https://github.com/PHPCSStandards/composer-installer/pull/90 [#91]: https://github.com/PHPCSStandards/composer-installer/pull/91 [#93]: https://github.com/PHPCSStandards/composer-installer/pull/93 [#94]: https://github.com/PHPCSStandards/composer-installer/pull/94 [#95]: https://github.com/PHPCSStandards/composer-installer/pull/95 [#96]: https://github.com/PHPCSStandards/composer-installer/pull/96 [#97]: https://github.com/PHPCSStandards/composer-installer/pull/97 [#98]: https://github.com/PHPCSStandards/composer-installer/issues/98 [#99]: https://github.com/PHPCSStandards/composer-installer/pull/99 [#100]: https://github.com/PHPCSStandards/composer-installer/pull/100 [#101]: https://github.com/PHPCSStandards/composer-installer/pull/101 ## [v0.5.0] - 2018-10-26 ### Closed issues - Scan depth as parameter [#45] - phpcs: Exit Code: 127 (Command not found) on every Composer command [#48] - The composer plugin implementation seems to be breaking the composer lifecycle [#49] - Installation error [#53] - Broke composer commands when used with wp-cli/package-command [#59] - Getting a new stable release [#60] - Support PHP CodeSniffer standards in packages installed outside of the vendor directory [#63] ### Added - Adds the ability to set the max depth from the composer.json file by [@Potherca] in [#46] ### Changed - Build/PHPCS: update PHPCompatibility repo name by [@jrfnl] in [#54] - README: remove VersionEye badge by [@jrfnl] in [#55] - README: replace maintenance badge by [@jrfnl] in [#56] - Execute phpcs and security-checker from vendor/bin by [@gapple] in [#52] - PHPCS: various minor tweaks by [@jrfnl] in [#57] - Travis: various tweaks by [@jrfnl] in [#58] - Use PHPCompatibility 9.0.0 by [@jrfnl] in [#61] - Build/Travis: test builds against PHP 7.3 by [@jrfnl] in [#62] - Updates copyright year by [@frenck] in [#67] - Enforces PSR12 by [@frenck] in [#66] - Updates contact information by [@frenck] in [#68] - Updates README, spelling/grammar, removed Working section by [@frenck] in [#69] - Replaces ProcessBuilder by ProcessExecutor by [@frenck] in [#70] - Refactors relative path logic by [@frenck] in [#71] - Removes suggested packages by [@frenck] in [#72] - Ensures absolute paths during detection phase by [@frenck] in [#73] - Trivial code cleanup by [@frenck] in [#74] - Fixes duplicate declaration of cwd by [@frenck] in [#75] - Removes HHVM from TravisCI by [@frenck] in [#76] - Adds PHP_CodeSniffer version constraints by [@frenck] in [#77] ### Fixed - [#49]: Move loadInstalledPaths from init to onDependenciesChangedEvent by [@gapple] in [#51] [#45]: https://github.com/PHPCSStandards/composer-installer/issues/45 [#46]: https://github.com/PHPCSStandards/composer-installer/pull/46 [#48]: https://github.com/PHPCSStandards/composer-installer/issues/48 [#49]: https://github.com/PHPCSStandards/composer-installer/issues/49 [#51]: https://github.com/PHPCSStandards/composer-installer/pull/51 [#52]: https://github.com/PHPCSStandards/composer-installer/pull/52 [#53]: https://github.com/PHPCSStandards/composer-installer/issues/53 [#54]: https://github.com/PHPCSStandards/composer-installer/pull/54 [#55]: https://github.com/PHPCSStandards/composer-installer/pull/55 [#56]: https://github.com/PHPCSStandards/composer-installer/pull/56 [#57]: https://github.com/PHPCSStandards/composer-installer/pull/57 [#58]: https://github.com/PHPCSStandards/composer-installer/pull/58 [#59]: https://github.com/PHPCSStandards/composer-installer/issues/59 [#60]: https://github.com/PHPCSStandards/composer-installer/issues/60 [#61]: https://github.com/PHPCSStandards/composer-installer/pull/61 [#62]: https://github.com/PHPCSStandards/composer-installer/pull/62 [#63]: https://github.com/PHPCSStandards/composer-installer/issues/63 [#66]: https://github.com/PHPCSStandards/composer-installer/pull/66 [#67]: https://github.com/PHPCSStandards/composer-installer/pull/67 [#68]: https://github.com/PHPCSStandards/composer-installer/pull/68 [#69]: https://github.com/PHPCSStandards/composer-installer/pull/69 [#70]: https://github.com/PHPCSStandards/composer-installer/pull/70 [#71]: https://github.com/PHPCSStandards/composer-installer/pull/71 [#72]: https://github.com/PHPCSStandards/composer-installer/pull/72 [#73]: https://github.com/PHPCSStandards/composer-installer/pull/73 [#74]: https://github.com/PHPCSStandards/composer-installer/pull/74 [#75]: https://github.com/PHPCSStandards/composer-installer/pull/75 [#76]: https://github.com/PHPCSStandards/composer-installer/pull/76 [#77]: https://github.com/PHPCSStandards/composer-installer/pull/77 ## [v0.4.4] - 2017-12-06 ### Closed issues - PHP 7.2 compatibility issue [#43] ### Changed - Update Travis CI svg badge and link URLs [#42] ([@ntwb]) - Add PHP 7.2 to Travis CI [#41] ([@ntwb]) - Docs: Fix link to releases [#40] ([@GaryJones]) [#40]: https://github.com/PHPCSStandards/composer-installer/pull/40 [#41]: https://github.com/PHPCSStandards/composer-installer/pull/41 [#42]: https://github.com/PHPCSStandards/composer-installer/pull/42 [#43]: https://github.com/PHPCSStandards/composer-installer/issues/43 ## [v0.4.3] - 2017-09-18 ### Changed - CS: Add PHP 5.3 compatibility [#39] ([@GaryJones]) - Local PHPCS [#38] ([@GaryJones]) [#38]: https://github.com/PHPCSStandards/composer-installer/pull/38 [#39]: https://github.com/PHPCSStandards/composer-installer/pull/39 ## [v0.4.2] - 2017-08-16 ### Changed - Docs: Rename example script [#35] ([@GaryJones]) - Update README.md [#36] ([@jrfnl]) - Documentation update. [#37] ([@frenck]) [#35]: https://github.com/PHPCSStandards/composer-installer/pull/35 [#36]: https://github.com/PHPCSStandards/composer-installer/pull/36 [#37]: https://github.com/PHPCSStandards/composer-installer/pull/37 ## [v0.4.1] - 2017-08-01 ### Closed issues - Incorrect relative paths for WPCS [#33] ### Fixed - [#33]: Changes the way the installed_paths are set. [#34] ([@frenck]) [#33]: https://github.com/PHPCSStandards/composer-installer/issues/33 [#34]: https://github.com/PHPCSStandards/composer-installer/pull/34 ## [v0.4.0] - 2017-05-11 ### Closed issues - Add support for code standards in root of repository for PHP_CodeSniffer 3.x [#26] - Config codings styles in composer.json from project [#23] - Check the root package for sniffs to install [#20] - Document the ability to execute the main plugin functionality directly [#18] - Add a CHANGELOG.md [#17] - Install sniffs with relative paths in CodeSniffer.conf [#14] ### Added - Support for coding standard in the root repository for PHP_CodeSniffer v3.x [#30] ([@frenck]) - Added support for having coding standards in the root package [#25] ([@frenck]) ### Changed - Local projects uses relative paths to their coding standards [#28] ([@frenck]) - Docs: Updated README. [#31] ([@frenck]) - Docs: Adds reference to calling the script directly in the README. [#29] ([@Potherca]) - Adds Travis-CI configuration file. [#27] ([@Potherca]) [#14]: https://github.com/PHPCSStandards/composer-installer/issues/14 [#17]: https://github.com/PHPCSStandards/composer-installer/issues/17 [#18]: https://github.com/PHPCSStandards/composer-installer/issues/18 [#20]: https://github.com/PHPCSStandards/composer-installer/issues/20 [#23]: https://github.com/PHPCSStandards/composer-installer/issues/23 [#25]: https://github.com/PHPCSStandards/composer-installer/pull/25 [#26]: https://github.com/PHPCSStandards/composer-installer/issues/26 [#27]: https://github.com/PHPCSStandards/composer-installer/pull/27 [#28]: https://github.com/PHPCSStandards/composer-installer/pull/28 [#29]: https://github.com/PHPCSStandards/composer-installer/pull/29 [#31]: https://github.com/PHPCSStandards/composer-installer/pull/31 ## [v0.3.2] - 2017-03-29 ### Closed issues - Coding Standard tries itself to install with installPath when it's the root package [#19] ### Changed - Improvements to the documentation [#22] ([@Potherca]) - Added instanceof check to prevent root package from being installed [#21] ([@bastianschwarz]) ### Fixed - [#13]: Incorrect coding standards search depth [#15] ([@frenck]) [#19]: https://github.com/PHPCSStandards/composer-installer/issues/19 [#21]: https://github.com/PHPCSStandards/composer-installer/pull/21 [#22]: https://github.com/PHPCSStandards/composer-installer/pull/22 ## [v0.3.1] - 2017-02-17 ### Closed issues - Plugin not working correctly when sniffs install depth is equal to "1" [#13] - Create new stable release version to support wider use [#11] ### Fixed - [#13]: Incorrect coding standards search depth [#15] ([@frenck]) [#11]: https://github.com/PHPCSStandards/composer-installer/issues/11 [#13]: https://github.com/PHPCSStandards/composer-installer/issues/13 [#15]: https://github.com/PHPCSStandards/composer-installer/pull/15 ## [v0.3.0] - 2017-02-15 ### Implemented enhancements - Install Plugin provides no feedback [#7] - Installing coding standards when executing Composer with --no-scripts [#4] - Github contribution templates [#10] ([@christopher-hopper]) - Show config actions and a result as Console output [#8] ([@christopher-hopper]) - Adds static function to call the Plugin::onDependenciesChangedEvent() method [#5] ([@Potherca]) ### Added - Support existing standards packages with subfolders [#6] ([@christopher-hopper]) ### Changed - Improved documentation [#12] ([@frenck]) - Removal of lgtm.co [#3] ([@frenck]) [#3]: https://github.com/PHPCSStandards/composer-installer/pull/3 [#4]: https://github.com/PHPCSStandards/composer-installer/issues/4 [#5]: https://github.com/PHPCSStandards/composer-installer/pull/5 [#6]: https://github.com/PHPCSStandards/composer-installer/pull/6 [#7]: https://github.com/PHPCSStandards/composer-installer/issues/7 [#8]: https://github.com/PHPCSStandards/composer-installer/pull/8 [#10]: https://github.com/PHPCSStandards/composer-installer/pull/10 [#12]: https://github.com/PHPCSStandards/composer-installer/pull/12 ## [v0.2.1] - 2016-11-01 Fixes an issue with having this plugin installed globally within composer, but using your global composer installation on a local repository without PHP_CodeSniffer installed. ### Fixed - Bugfix: Plugin fails when PHP_CodeSniffer is not installed [#2] ([@frenck]) [#2]: https://github.com/PHPCSStandards/composer-installer/pull/2 ## [v0.2.0] - 2016-11-01 For this version on, this installer no longer messes with the installation paths of composer libraries, but instead, it configures PHP_CodeSniffer to look into other directories for coding standards. ### Changed - PHPCS Configuration management [#1] ([@frenck]) [#1]: https://github.com/PHPCSStandards/composer-installer/pull/1 ## [v0.1.1] - 2016-10-24 ### Changed - Standard name mapping improvements ## v0.1.0 - 2016-10-23 First useable release. [v1.2.1]: https://github.com/PHPCSStandards/composer-installer/compare/v1.2.0...v1.2.1 [v1.2.0]: https://github.com/PHPCSStandards/composer-installer/compare/v1.1.2...v1.2.0 [v1.1.2]: https://github.com/PHPCSStandards/composer-installer/compare/v1.1.1...v1.1.2 [v1.1.1]: https://github.com/PHPCSStandards/composer-installer/compare/v1.1.0...v1.1.1 [v1.1.0]: https://github.com/PHPCSStandards/composer-installer/compare/v1.0.0...v1.1.0 [v1.0.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.7.2...v1.0.0 [v0.7.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.7.1...v0.7.2 [v0.7.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.7.0...v0.7.1 [v0.7.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.6.2...v0.7.0 [v0.6.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.6.1...v0.6.2 [v0.6.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.6.0...v0.6.1 [v0.6.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.5.0...v0.6.0 [v0.5.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.4...v0.5.0 [v0.4.4]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.3...v0.4.4 [v0.4.3]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.2...v0.4.3 [v0.4.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.1...v0.4.2 [v0.4.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.0...v0.4.1 [v0.4.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.3.2...v0.4.0 [v0.3.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.3.1...v0.3.2 [v0.3.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.3.0...v0.3.1 [v0.3.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.2.1...v0.3.0 [v0.2.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.2.0...v0.2.1 [v0.2.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.1.1...v0.2.0 [v0.1.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.1.0...v0.1.1 [PHP_CodeSniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer [@bastianschwarz]: https://github.com/bastianschwarz [@BrianHenryIE]: https://github.com/BrianHenryIE [@christopher-hopper]: https://github.com/christopher-hopper [@fredden]: https://github.com/fredden [@frenck]: https://github.com/frenck [@gapple]: https://github.com/gapple [@GaryJones]: https://github.com/GaryJones [@GrahamCampbell]: https://github.com/GrahamCampbell [@jrfnl]: https://github.com/jrfnl [@kevinfodness]: https://github.com/kevinfodness [@mjrider]: https://github.com/mjrider [@ntwb]: https://github.com/ntwb [@paras-malhotra]: https://github.com/paras-malhotra [@Potherca]: https://github.com/Potherca [@Seldaek]: https://github.com/Seldaek [@SplotyCode]: https://github.com/SplotyCode [@srebb]: https://github.com/srebb [@TravisCarden]: https://github.com/TravisCarden { "name": "dealerdirect/phpcodesniffer-composer-installer", "description": "PHP_CodeSniffer Standards Composer Installer Plugin", "type": "composer-plugin", "keywords": [ "composer", "installer", "plugin", "phpcs", "phpcbf", "codesniffer", "phpcodesniffer", "php_codesniffer", "standard", "standards", "style guide", "stylecheck", "qa", "quality", "code quality", "tests" ], "license": "MIT", "authors": [ { "name": "Franck Nijhof", "email": "opensource@frenck.dev", "homepage": "https://frenck.dev", "role": "Open source developer" }, { "name" : "Contributors", "homepage" : "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", "source": "https://github.com/PHPCSStandards/composer-installer", "security": "https://github.com/PHPCSStandards/composer-installer/security/policy" }, "require": { "php": ">=5.4", "composer-plugin-api": "^2.2", "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { "ext-json": "*", "ext-zip": "*", "composer/composer": "^2.2", "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "php-parallel-lint/php-parallel-lint": "^1.4.0", "yoast/phpunit-polyfills": "^1.0" }, "minimum-stability": "dev", "prefer-stable": true, "autoload": { "psr-4": { "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "autoload-dev": { "psr-4": { "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Tests\\": "tests/" } }, "config": { "lock": false }, "extra": { "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, "scripts": { "install-codestandards": [ "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" ], "lint": [ "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php --show-deprecated --exclude vendor --exclude .git" ], "test": [ "@php ./vendor/phpunit/phpunit/phpunit --no-coverage" ], "coverage": [ "@php ./vendor/phpunit/phpunit/phpunit" ] } } # PHP_CodeSniffer Standards Composer Installer Plugin ![Last Commit][last-updated-shield] ![Awesome][awesome-shield] [![License][license-shield]](LICENSE.md) [![Tests][ghactionstest-shield]][ghactions] [![Latest Version on Packagist][packagist-version-shield]][packagist-version] [![Packagist][packagist-shield]][packagist] [![Contributor Covenant][code-of-conduct-shield]][code-of-conduct] This composer installer plugin makes installation of [PHP_CodeSniffer][codesniffer] coding standards (rulesets) straight-forward. No more symbolic linking of directories, checking out repositories on specific locations or manually changing the `phpcs` configuration. ## Usage Installation can be done with [Composer][composer], by requiring this package as a development dependency: ```bash composer require --dev dealerdirect/phpcodesniffer-composer-installer:"^1.0" ``` Since Composer 2.2, Composer will [ask for your permission](https://blog.packagist.com/composer-2-2/#more-secure-plugin-execution) to allow this plugin to execute code. For this plugin to be functional, permission needs to be granted. When permission has been granted, the following snippet will automatically be added to your `composer.json` file by Composer: ```json { "config": { "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true } } } ``` You can safely add the permission flag (to avoid Composer needing to ask), by running: ```bash composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true ``` That's it. ### Compatibility This plugin is compatible with: - PHP **5.4+**, **7.x**, and **8.x** (Support for PHP v8 is available since [`v0.7.0`][v0.7]) - [Composer][composer] **2.2+** (Support for Composer v2 is available since [`v0.7.0`][v0.7]; support for Composer < 2.2 was dropped in [`v1.1.0`][v1.1]) - [PHP_CodeSniffer][codesniffer] **3.x** and **4.x**(Support for PHP_CodeSniffer v4 is available since [`v0.7.0`][v0.7], support for PHP_CodeSniffer v2 was dropped in [`v1.2.0`][v1.2]) ### How it works Basically, this plugin executes the following steps: - This plugin searches for [`phpcodesniffer-standard` packages][] in all of your currently installed Composer packages. - Matching packages and the project itself are scanned for PHP_CodeSniffer rulesets. - The plugin will call PHP_CodeSniffer and configure the `installed_paths` option. ### Example project The following is an example Composer project and has included multiple `phpcodesniffer-standard` packages. ```json { "name": "example/project", "description": "Just an example project", "type": "project", "require": {}, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "*", "phpcompatibility/php-compatibility": "*", "wp-coding-standards/wpcs": "*" }, "config": { "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true } } } ``` After running `composer install` PHP_CodeSniffer just works: ```bash $ ./vendor/bin/phpcs -i The installed coding standards are PEAR, PSR1, PSR2, PSR12, Squiz, Zend, PHPCompatibility, Modernize, NormalizedArrays, Universal, PHPCSUtils, WordPress, WordPress-Core, WordPress-Docs and WordPress-Extra ``` ### Calling the plugin directly In some circumstances, it is desirable to call this plugin's functionality directly. For instance, during development or in [CI][definition-ci] environments. As the plugin requires Composer to work, direct calls need to be wired through a project's `composer.json`. This is done by adding a call to the `Plugin::run` function in the `script` section of the `composer.json`: ```json { "scripts": { "install-codestandards": [ "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" ] } } ``` The command can then be called using `composer run-script install-codestandards` or referenced from other script configurations, as follows: ```json { "scripts": { "install-codestandards": [ "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" ], "post-install-cmd": [ "@install-codestandards" ] } } ``` For more details about Composer scripts, please refer to [the section on scripts in the Composer manual][composer-manual-scripts]. ### Changing the Coding Standards search depth By default, this plugin searches up for Coding Standards up to three directories deep. In most cases, this should be sufficient. However, this plugin allows you to customize the search depth setting if needed. ```json { "extra": { "phpcodesniffer-search-depth": 5 } } ``` ### Caveats When this plugin is installed globally, composer will load the _global_ plugin rather than the one from the local repository. Despite [this behavior being documented in the composer manual][using-composer-plugins], it could potentially confuse as another version of the plugin could be run and not the one specified by the project. ## Developing Coding Standards Coding standard can be developed normally, as documented by [PHP_CodeSniffer][codesniffer], in the [Coding Standard Tutorial][tutorial]. Create a composer package of your coding standard by adding a `composer.json` file. ```json { "name" : "acme/phpcodesniffer-our-standards", "description" : "Package contains all coding standards of the Acme company", "require" : { "php" : ">=5.4.0", "squizlabs/php_codesniffer" : "^3.13" }, "type" : "phpcodesniffer-standard" } ``` Requirements: * The repository may contain one or more standards. * Each standard can have a separate directory no deeper than 3 levels from the repository root. * The package `type` must be `phpcodesniffer-standard`. Without this, the plugin will not trigger. ### Requiring the plugin from within your coding standard If your coding standard itself depends on additional external PHPCS standards, this plugin can make life easier on your end-users by taking care of the installation of all standards - yours and your dependencies - for them. This can help reduce the number of support questions about setting the `installed_paths`, as well as simplify your standard's installation instructions. For this to work, make sure your external standard adds this plugin to the `composer.json` config via `require`, **not** `require-dev`. > :warning: Your end-user may already `require-dev` this plugin and/or other external standards used > by your end-users may require this plugin as well. > > To prevent your end-users getting into "_dependency hell_", make sure to make the version requirement > for this plugin flexible. > > Remember that [Composer treats unstable minors as majors][composer-manual-caret] and will not be able to resolve > one config requiring this plugin at version `^0.7`, while another requires it at version `^1.0`. > Either allow multiple minors or use `*` as the version requirement. > > Some examples of flexible requirements which can be used: > ```bash > composer require dealerdirect/phpcodesniffer-composer-installer:"*" > composer require dealerdirect/phpcodesniffer-composer-installer:"^0.4.1 || ^0.5 || ^0.6 || ^0.7 || ^1.0" > ``` ## Contributing This is an active open-source project. We are always open to people who want to use the code or contribute to it. We've set up a separate document for our [contribution guidelines][contributing-guidelines]. Thank you for being involved! :heart_eyes: ## Authors & contributors The original idea and setup of this repository is by [Franck Nijhof][frenck], employee @ Dealerdirect. For a full list of all authors and/or contributors, check [the contributors page][contributors]. ## Funding This project is included in the projects supported via the [PHP_CodeSniffer Open Collective][phpcs-open-collective]. If you use this plugin, financial contributions to the Open Collective are encouraged and appreciated. ## License The MIT License (MIT) Copyright (c) 2016-2022 Dealerdirect B.V. and contributors Copyright (c) 2022- PHPCSStandards and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [awesome-shield]: https://img.shields.io/badge/awesome%3F-yes-brightgreen.svg [code-of-conduct-shield]: https://img.shields.io/badge/Contributor%20Covenant-v2.0-ff69b4.svg [code-of-conduct]: CODE_OF_CONDUCT.md [codesniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer [composer-manual-scripts]: https://getcomposer.org/doc/articles/scripts.md [composer-manual-caret]: https://getcomposer.org/doc/articles/versions.md#caret-version-range- [composer]: https://getcomposer.org/ [contributing-guidelines]: CONTRIBUTING.md [contributors]: https://github.com/PHPCSStandards/composer-installer/graphs/contributors [definition-ci]: https://en.wikipedia.org/wiki/Continuous_integration [frenck]: https://github.com/frenck [last-updated-shield]: https://img.shields.io/github/last-commit/PHPCSStandards/composer-installer.svg [license-shield]: https://img.shields.io/github/license/PHPCSStandards/composer-installer.svg [packagist-shield]: https://img.shields.io/packagist/dt/dealerdirect/phpcodesniffer-composer-installer.svg [packagist-version-shield]: https://img.shields.io/packagist/v/dealerdirect/phpcodesniffer-composer-installer.svg [packagist-version]: https://packagist.org/packages/dealerdirect/phpcodesniffer-composer-installer [packagist]: https://packagist.org/packages/dealerdirect/phpcodesniffer-composer-installer [`phpcodesniffer-standard` packages]: https://packagist.org/explore/?type=phpcodesniffer-standard [phpcs-open-collective]: https://opencollective.com/php_codesniffer [scrutinizer-shield]: https://img.shields.io/scrutinizer/g/dealerdirect/phpcodesniffer-composer-installer.svg [scrutinizer]: https://scrutinizer-ci.com/g/dealerdirect/phpcodesniffer-composer-installer/ [ghactionstest-shield]: https://github.com/PHPCSStandards/composer-installer/actions/workflows/integrationtest.yml/badge.svg [ghactions]: https://github.com/PHPCSStandards/composer-installer/actions/workflows/integrationtest.yml [tutorial]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Coding-Standard-Tutorial [using-composer-plugins]: https://getcomposer.org/doc/articles/plugins.md#using-plugins [v0.7]: https://github.com/PHPCSStandards/composer-installer/releases/tag/v0.7.0 [v1.1]: https://github.com/PHPCSStandards/composer-installer/releases/tag/v1.1.0 [v1.2]: https://github.com/PHPCSStandards/composer-installer/releases/tag/v1.2.0 MIT License Copyright (c) 2016-2022 Dealerdirect B.V. and contributors Copyright (c) 2022 PHPCSStandards and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class Plugin implements PluginInterface, EventSubscriberInterface { const KEY_MAX_DEPTH = 'phpcodesniffer-search-depth'; const MESSAGE_ERROR_WRONG_MAX_DEPTH = 'The value of "%s" (in the composer.json "extra".section) must be an integer larger than %d, %s given.'; const MESSAGE_NOT_INSTALLED = 'PHPCodeSniffer is not installed'; const MESSAGE_NOTHING_TO_INSTALL = 'No PHPCS standards to install or update'; const MESSAGE_PLUGIN_UNINSTALLED = 'PHPCodeSniffer Composer Installer is uninstalled'; const MESSAGE_RUNNING_INSTALLER = 'Running PHPCodeSniffer Composer Installer'; const PACKAGE_NAME = 'squizlabs/php_codesniffer'; const PACKAGE_TYPE = 'phpcodesniffer-standard'; const PHPCS_CONFIG_REGEX = '`%s:[^\r\n]+`'; const PHPCS_CONFIG_KEY = 'installed_paths'; const PLUGIN_NAME = 'dealerdirect/phpcodesniffer-composer-installer'; /** * @var Composer */ private $composer; /** * @var string */ private $cwd; /** * @var Filesystem */ private $filesystem; /** * @var array */ private $installedPaths; /** * @var IOInterface */ private $io; /** * @var ProcessExecutor */ private $processExecutor; /** * Triggers the plugin's main functionality. * * Makes it possible to run the plugin as a custom command. * * @param Event $event * * @throws \InvalidArgumentException * @throws \RuntimeException * @throws LogicException * @throws ProcessFailedException * @throws RuntimeException */ public static function run(Event $event) { $io = $event->getIO(); $composer = $event->getComposer(); $instance = new static(); $instance->io = $io; $instance->composer = $composer; $instance->init(); $instance->onDependenciesChangedEvent(); } /** * {@inheritDoc} * * @throws \RuntimeException * @throws LogicException * @throws ProcessFailedException * @throws RuntimeException */ public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; $this->init(); } /** * {@inheritDoc} */ public function deactivate(Composer $composer, IOInterface $io) { } /** * {@inheritDoc} */ public function uninstall(Composer $composer, IOInterface $io) { } /** * Prepares the plugin so it's main functionality can be run. * * @throws \RuntimeException * @throws LogicException * @throws ProcessFailedException * @throws RuntimeException */ private function init() { $this->cwd = getcwd(); $this->installedPaths = array(); $this->processExecutor = new ProcessExecutor($this->io); $this->filesystem = new Filesystem($this->processExecutor); } /** * {@inheritDoc} */ public static function getSubscribedEvents() { return array( ScriptEvents::POST_INSTALL_CMD => array( array('onDependenciesChangedEvent', 0), ), ScriptEvents::POST_UPDATE_CMD => array( array('onDependenciesChangedEvent', 0), ), ); } /** * Entry point for post install and post update events. * * @throws \InvalidArgumentException * @throws LogicException * @throws ProcessFailedException * @throws RuntimeException */ public function onDependenciesChangedEvent() { $io = $this->io; $isVerbose = $io->isVerbose(); $exitCode = 0; if ($isVerbose) { $io->write(sprintf('%s', self::MESSAGE_RUNNING_INSTALLER)); } if ($this->isPHPCodeSnifferInstalled() === true) { $this->loadInstalledPaths(); $installPathCleaned = $this->cleanInstalledPaths(); $installPathUpdated = $this->updateInstalledPaths(); if ($installPathCleaned === true || $installPathUpdated === true) { $exitCode = $this->saveInstalledPaths(); } elseif ($isVerbose) { $io->write(sprintf('%s', self::MESSAGE_NOTHING_TO_INSTALL)); } } else { $pluginPackage = $this ->composer ->getRepositoryManager() ->getLocalRepository() ->findPackages(self::PLUGIN_NAME) ; $isPluginUninstalled = count($pluginPackage) === 0; if ($isPluginUninstalled) { if ($isVerbose) { $io->write(sprintf('%s', self::MESSAGE_PLUGIN_UNINSTALLED)); } } else { $exitCode = 1; if ($isVerbose) { $io->write(sprintf('%s', self::MESSAGE_NOT_INSTALLED)); } } } return $exitCode; } /** * Load all paths from PHP_CodeSniffer into an array. * * @throws LogicException * @throws ProcessFailedException * @throws RuntimeException */ private function loadInstalledPaths() { if ($this->isPHPCodeSnifferInstalled() === true) { $this->processExecutor->execute( $this->getPhpcsCommand() . ' --config-show', $output, $this->getPHPCodeSnifferInstallPath() ); $regex = sprintf(self::PHPCS_CONFIG_REGEX, self::PHPCS_CONFIG_KEY); if (preg_match($regex, $output, $match) === 1) { $phpcsInstalledPaths = str_replace(self::PHPCS_CONFIG_KEY . ': ', '', $match[0]); $phpcsInstalledPaths = trim($phpcsInstalledPaths); if ($phpcsInstalledPaths !== '') { $this->installedPaths = explode(',', $phpcsInstalledPaths); } } } } /** * Save all coding standard paths back into PHP_CodeSniffer * * @throws LogicException * @throws ProcessFailedException * @throws RuntimeException * * @return int Exit code. 0 for success, 1 or higher for failure. */ private function saveInstalledPaths() { // Check if we found installed paths to set. if (count($this->installedPaths) !== 0) { sort($this->installedPaths); $paths = implode(',', $this->installedPaths); $arguments = array('--config-set', self::PHPCS_CONFIG_KEY, $paths); $configMessage = sprintf( 'PHP CodeSniffer Config %s set to %s', self::PHPCS_CONFIG_KEY, $paths ); } else { // Delete the installed paths if none were found. $arguments = array('--config-delete', self::PHPCS_CONFIG_KEY); $configMessage = sprintf( 'PHP CodeSniffer Config %s delete', self::PHPCS_CONFIG_KEY ); } // Prepare message in case of failure $failMessage = sprintf( 'Failed to set PHP CodeSniffer %s Config', self::PHPCS_CONFIG_KEY ); // Okay, lets rock! $command = vsprintf( '%s %s', array( 'phpcs command' => $this->getPhpcsCommand(), 'arguments' => implode(' ', $arguments), ) ); $exitCode = $this->processExecutor->execute($command, $configResult, $this->getPHPCodeSnifferInstallPath()); if ($exitCode === 0) { $exitCode = $this->verifySaveSuccess(); } if ($exitCode === 0) { $this->io->write($configMessage); } else { $this->io->write($failMessage); } if ($this->io->isVerbose() && !empty($configResult)) { $this->io->write(sprintf('%s', $configResult)); } return $exitCode; } /** * Verify that the paths which were expected to be saved, have been. * * @return int Exit code. 0 for success, 1 for failure. */ private function verifySaveSuccess() { $exitCode = 1; $expectedPaths = $this->installedPaths; // Request the currently set installed paths after the save. $this->loadInstalledPaths(); $registeredPaths = array_intersect($this->installedPaths, $expectedPaths); $registeredCount = count($registeredPaths); $expectedCount = count($expectedPaths); if ($expectedCount === $registeredCount) { $exitCode = 0; } if ($exitCode === 1 && $this->io->isVerbose()) { $verificationMessage = sprintf( "Paths to external standards found by the plugin: %s\n" . 'Actual paths registered with PHPCS: %s', implode(', ', $expectedPaths), implode(', ', $this->installedPaths) ); $this->io->write($verificationMessage); } return $exitCode; } /** * Get the command to call PHPCS. */ protected function getPhpcsCommand() { return vsprintf( '%s %s', array( 'php executable' => $this->getPhpExecCommand(), 'phpcs executable' => './bin/phpcs', ) ); } /** * Get the path to the current PHP version being used. * * Duplicate of the same in the EventDispatcher class in Composer itself. */ protected function getPhpExecCommand() { $finder = new PhpExecutableFinder(); $phpPath = $finder->find(false); if ($phpPath === false) { throw new \RuntimeException('Failed to locate PHP binary to execute ' . $phpPath); } $phpArgs = $finder->findArguments(); $phpArgs = $phpArgs ? ' ' . implode(' ', $phpArgs) : '' ; $command = ProcessExecutor::escape($phpPath) . $phpArgs . ' -d allow_url_fopen=' . ProcessExecutor::escape(ini_get('allow_url_fopen')) . ' -d disable_functions=' . ProcessExecutor::escape(ini_get('disable_functions')) . ' -d memory_limit=' . ProcessExecutor::escape(ini_get('memory_limit')) ; return $command; } /** * Iterate trough all known paths and check if they are still valid. * * If path does not exists, is not an directory or isn't readable, the path * is removed from the list. * * @return bool True if changes where made, false otherwise */ private function cleanInstalledPaths() { $changes = false; foreach ($this->installedPaths as $key => $path) { // Resolve relative paths to absolute using the PHPCS install path as the base // to avoid potential open_basedir warnings from is_dir() on relative paths. if ($this->filesystem->isAbsolutePath($path) === false) { $path = realpath($this->getPHPCodeSnifferInstallPath() . \DIRECTORY_SEPARATOR . $path); } if ($path === false || is_dir($path) === false || is_readable($path) === false) { unset($this->installedPaths[$key]); $changes = true; } } return $changes; } /** * Check all installed packages (including the root package) against * the installed paths from PHP_CodeSniffer and add the missing ones. * * @return bool True if changes where made, false otherwise * * @throws \InvalidArgumentException * @throws \RuntimeException */ private function updateInstalledPaths() { $changes = false; $searchPaths = array(); // Add root package only if it has the expected package type. if ( $this->composer->getPackage() instanceof RootPackageInterface && $this->composer->getPackage()->getType() === self::PACKAGE_TYPE ) { $searchPaths[] = $this->cwd; } $codingStandardPackages = $this->getPHPCodingStandardPackages(); foreach ($codingStandardPackages as $package) { $installPath = $this->composer->getInstallationManager()->getInstallPath($package); if ($this->filesystem->isAbsolutePath($installPath) === false) { $installPath = $this->filesystem->normalizePath( $this->cwd . \DIRECTORY_SEPARATOR . $installPath ); } $searchPaths[] = $installPath; } // Nothing to do. if ($searchPaths === array()) { return false; } $finder = new Finder(); $finder->files() ->depth('<= ' . $this->getMaxDepth()) ->depth('>= ' . $this->getMinDepth()) ->ignoreUnreadableDirs() ->ignoreVCS(true) ->in($searchPaths) ->name('ruleset.xml'); // Process each found possible ruleset. foreach ($finder as $ruleset) { $standardsPath = $ruleset->getPath(); // Pick the directory above the directory containing the standard, unless this is the project root. if ($standardsPath !== $this->cwd) { $standardsPath = dirname($standardsPath); } // Use relative paths for local project repositories. if ($this->isRunningGlobally() === false) { $standardsPath = $this->filesystem->findShortestPath( $this->getPHPCodeSnifferInstallPath(), $standardsPath, true ); } // De-duplicate and add when directory is not configured. if (in_array($standardsPath, $this->installedPaths, true) === false) { $this->installedPaths[] = $standardsPath; $changes = true; } } return $changes; } /** * Iterates through Composers' local repository looking for valid Coding * Standard packages. * * @return array Composer packages containing coding standard(s) */ private function getPHPCodingStandardPackages() { $codingStandardPackages = array_filter( $this->composer->getRepositoryManager()->getLocalRepository()->getPackages(), function (PackageInterface $package) { if ($package instanceof AliasPackage) { return false; } return $package->getType() === Plugin::PACKAGE_TYPE; } ); return $codingStandardPackages; } /** * Searches for the installed PHP_CodeSniffer Composer package * * @param null|string|\Composer\Semver\Constraint\ConstraintInterface $versionConstraint to match against * * @return PackageInterface|null */ private function getPHPCodeSnifferPackage($versionConstraint = null) { $packages = $this ->composer ->getRepositoryManager() ->getLocalRepository() ->findPackages(self::PACKAGE_NAME, $versionConstraint); return array_shift($packages); } /** * Returns the path to the PHP_CodeSniffer package installation location * * {@internal Do NOT try to modernize via the Composer 2.2 API (`InstalledVersions::getInstallPath()`). * Doing so doesn't play nice with other plugins. * {@link https://github.com/PHPCSStandards/composer-installer/issues/239}} * * @return string */ private function getPHPCodeSnifferInstallPath() { return $this->composer->getInstallationManager()->getInstallPath($this->getPHPCodeSnifferPackage()); } /** * Simple check if PHP_CodeSniffer is installed. * * {@internal Do NOT try to modernize via the Composer 2.2 API (`InstalledVersions::isInstalled()`). * Doing so doesn't play nice with integrations calling the Composer EventDispatcher programmatically. * {@link https://github.com/PHPCSStandards/composer-installer/issues/247}} * * @param null|string|\Composer\Semver\Constraint\ConstraintInterface $versionConstraint to match against * * @return bool Whether PHP_CodeSniffer is installed */ private function isPHPCodeSnifferInstalled($versionConstraint = null) { return ($this->getPHPCodeSnifferPackage($versionConstraint) !== null); } /** * Test if composer is running "global" * This check kinda dirty, but it is the "Composer Way" * * @return bool Whether Composer is running "globally" * * @throws \RuntimeException */ private function isRunningGlobally() { return ($this->composer->getConfig()->get('home') === $this->cwd); } /** * Determines the maximum search depth when searching for Coding Standards. * * @return int * * @throws \InvalidArgumentException */ private function getMaxDepth() { $maxDepth = 3; $extra = $this->composer->getPackage()->getExtra(); if (array_key_exists(self::KEY_MAX_DEPTH, $extra)) { $maxDepth = $extra[self::KEY_MAX_DEPTH]; $minDepth = $this->getMinDepth(); if ( (string) (int) $maxDepth !== (string) $maxDepth /* Must be an integer or cleanly castable to one */ || $maxDepth <= $minDepth /* Larger than the minimum */ || is_float($maxDepth) === true /* Within the boundaries of integer */ ) { $message = vsprintf( self::MESSAGE_ERROR_WRONG_MAX_DEPTH, array( 'key' => self::KEY_MAX_DEPTH, 'min' => $minDepth, 'given' => var_export($maxDepth, true), ) ); throw new \InvalidArgumentException($message); } } return (int) $maxDepth; } /** * Returns the minimal search depth for Coding Standard packages. * * Usually this is 0, unless PHP_CodeSniffer >= 3 is used. * * @return int */ private function getMinDepth() { if ($this->isPHPCodeSnifferInstalled('>= 3.0.0') !== true) { return 1; } return 0; } } { "name": "doctrine/inflector", "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", "license": "MIT", "type": "library", "keywords": [ "php", "strings", "words", "manipulation", "inflector", "inflection", "uppercase", "lowercase", "singular", "plural" ], "authors": [ { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, { "name": "Roman Borschel", "email": "roman@code-factory.org" }, { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" } ], "homepage": "https://www.doctrine-project.org/projects/inflector.html", "require": { "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^12.0 || ^13.0", "phpstan/phpstan": "^1.12 || ^2.0", "phpstan/phpstan-phpunit": "^1.4 || ^2.0", "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", "phpunit/phpunit": "^8.5 || ^12.2" }, "autoload": { "psr-4": { "Doctrine\\Inflector\\": "src" } }, "autoload-dev": { "psr-4": { "Doctrine\\Tests\\Inflector\\": "tests" } }, "config": { "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true }, "sort-packages": true } } # Doctrine Inflector Doctrine Inflector is a small library that can perform string manipulations with regard to uppercase/lowercase and singular/plural forms of words. [![Build Status](https://github.com/doctrine/inflector/workflows/Continuous%20Integration/badge.svg)](https://github.com/doctrine/inflector/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A4.0.x) [![Code Coverage](https://codecov.io/gh/doctrine/inflector/branch/2.0.x/graph/badge.svg)](https://codecov.io/gh/doctrine/inflector/branch/2.0.x) getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } from = $from; $this->to = $to; } public function getFrom(): Word { return $this->from; } public function getTo(): Word { return $this->to; } } */ public static function getSingular(): iterable { // Reverse of -sce → -scia (fasce → fascia) yield new Transformation(new Pattern('([aeiou])sce$'), '\\1scia'); // Reverse of -cie → -cia (farmacia → farmacie) yield new Transformation(new Pattern('cie$'), 'cia'); // Reverse of -gie → -gia (bugia → bugie) yield new Transformation(new Pattern('gie$'), 'gia'); // Reverse of -ce → -cia (arance → arancia) yield new Transformation(new Pattern('([^aeiou])ce$'), '\1cia'); // Reverse of -ge → -gia (valige → valigia) yield new Transformation(new Pattern('([^aeiou])ge$'), '\1gia'); // Reverse of -chi → -co (bachi → baco) yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])chi$'), '\1co'); // Reverse of -ghi → -go (laghi → lago) yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])ghi$'), '\1go'); // Reverse of -ci → -co (medici → medico) yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])ci$'), '\1co'); // Reverse of -gi → -go (psicologi → psicologo) yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])gi$'), '\1go'); // Reverse of -i → -io (zii → zio, negozi → negozio) // This is more complex due to Italian's stress patterns, but we'll handle the basic case yield new Transformation(new Pattern('([^aeiou])i$'), '\1io'); // Handle words that end with -i but should go to -co/-go (amici → amico, not amice) yield new Transformation(new Pattern('([^aeiou])ci$'), '\1co'); yield new Transformation(new Pattern('([^aeiou])gi$'), '\1go'); // Reverse of -a → -e yield new Transformation(new Pattern('e$'), 'a'); // Reverse of -e → -i yield new Transformation(new Pattern('i$'), 'e'); // Reverse of -o → -i yield new Transformation(new Pattern('i$'), 'o'); } /** @return iterable */ public static function getPlural(): iterable { // Words ending in -scia without stress on 'i' become -sce (e.g. fascia → fasce) yield new Transformation(new Pattern('([aeiou])scia$'), '\\1sce'); // Words ending in -cia/gia with stress on 'i' keep the 'i' in plural yield new Transformation(new Pattern('cia$'), 'cie'); // e.g. farmacia → farmacie yield new Transformation(new Pattern('gia$'), 'gie'); // e.g. bugia → bugie // Words ending in -cia/gia without stress on 'i' lose the 'i' in plural yield new Transformation(new Pattern('([^aeiou])cia$'), '\\1ce'); // e.g. arancia → arance yield new Transformation(new Pattern('([^aeiou])gia$'), '\\1ge'); // e.g. valigia → valige // Words ending in -co/-go with stress on 'o' become -chi/-ghi yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])co$'), '\\1chi'); // e.g. baco → bachi yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])go$'), '\\1ghi'); // e.g. lago → laghi // Words ending in -co/-go with stress on the penultimate syllable become -ci/-gi yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])co$'), '\\1ci'); // e.g. medico → medici yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])go$'), '\\1gi'); // e.g. psicologo → psicologi // Words ending in -io with stress on 'i' keep the 'i' in plural yield new Transformation(new Pattern('([^aeiou])io$'), '\\1i'); // e.g. zio → zii // Words ending in -io with stress on 'o' lose the 'i' in plural yield new Transformation(new Pattern('([aeiou])io$'), '\\1i'); // e.g. negozio → negozi // Standard ending rules yield new Transformation(new Pattern('a$'), 'e'); // -a → -e yield new Transformation(new Pattern('e$'), 'i'); // -e → -i yield new Transformation(new Pattern('o$'), 'i'); // -o → -i } /** @return iterable */ public static function getIrregular(): iterable { // Irregular substitutions (singular => plural) $irregulars = [ 'ala' => 'ali', 'albergo' => 'alberghi', 'amica' => 'amiche', 'amico' => 'amici', 'ampio' => 'ampi', 'arancia' => 'arance', 'arma' => 'armi', 'asparago' => 'asparagi', 'banca' => 'banche', 'belga' => 'belgi', 'braccio' => 'braccia', 'budello' => 'budella', 'bue' => 'buoi', 'caccia' => 'cacce', 'calcagno' => 'calcagna', 'camicia' => 'camicie', 'cane' => 'cani', 'capitale' => 'capitali', 'carcere' => 'carceri', 'casa' => 'case', 'cavaliere' => 'cavalieri', 'centinaio' => 'centinaia', 'cerchio' => 'cerchia', 'cervello' => 'cervella', 'chiave' => 'chiavi', 'chirurgo' => 'chirurgi', 'ciglio' => 'ciglia', 'città' => 'città', 'corno' => 'corna', 'corpo' => 'corpi', 'crisi' => 'crisi', 'dente' => 'denti', 'dio' => 'dei', 'dito' => 'dita', 'dottore' => 'dottori', 'fiore' => 'fiori', 'fratello' => 'fratelli', 'fuoco' => 'fuochi', 'gamba' => 'gambe', 'ginocchio' => 'ginocchia', 'gioco' => 'giochi', 'giornale' => 'giornali', 'giraffa' => 'giraffe', 'labbro' => 'labbra', 'lenzuolo' => 'lenzuola', 'libro' => 'libri', 'madre' => 'madri', 'maestro' => 'maestri', 'magico' => 'magici', 'mago' => 'maghi', 'maniaco' => 'maniaci', 'manico' => 'manici', 'mano' => 'mani', 'medico' => 'medici', 'membro' => 'membri', 'metropoli' => 'metropoli', 'migliaio' => 'migliaia', 'miglio' => 'miglia', 'mille' => 'mila', 'mio' => 'miei', 'moglie' => 'mogli', 'mosaico' => 'mosaici', 'muro' => 'muri', 'nemico' => 'nemici', 'nome' => 'nomi', 'occhio' => 'occhi', 'orecchio' => 'orecchi', 'osso' => 'ossa', 'paio' => 'paia', 'pane' => 'pani', 'papa' => 'papi', 'pasta' => 'paste', 'penna' => 'penne', 'pesce' => 'pesci', 'piede' => 'piedi', 'pittore' => 'pittori', 'poeta' => 'poeti', 'porco' => 'porci', 'porto' => 'porti', 'problema' => 'problemi', 'ragazzo' => 'ragazzi', 're' => 're', 'rene' => 'reni', 'riso' => 'risa', 'rosa' => 'rosa', 'sale' => 'sali', 'sarto' => 'sarti', 'scuola' => 'scuole', 'serie' => 'serie', 'serramento' => 'serramenta', 'sorella' => 'sorelle', 'specie' => 'specie', 'staio' => 'staia', 'stazione' => 'stazioni', 'strido' => 'strida', 'strillo' => 'strilla', 'studio' => 'studi', 'suo' => 'suoi', 'superficie' => 'superfici', 'tavolo' => 'tavoli', 'tempio' => 'templi', 'treno' => 'treni', 'tuo' => 'tuoi', 'uomo' => 'uomini', 'uovo' => 'uova', 'urlo' => 'urla', 'valigia' => 'valigie', 'vestigio' => 'vestigia', 'vino' => 'vini', 'viola' => 'viola', 'zio' => 'zii', ]; foreach ($irregulars as $singular => $plural) { yield new Substitution(new Word($singular), new Word($plural)); } } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } */ public static function getSingular(): iterable { yield from self::getDefault(); } /** @return iterable */ public static function getPlural(): iterable { yield from self::getDefault(); } /** @return iterable */ private static function getDefault(): iterable { // Invariable words (same form in singular and plural) $invariables = [ 'alpaca', 'auto', 'bar', 'blu', 'boia', 'boomerang', 'brindisi', 'campus', 'computer', 'crisi', 'crocevia', 'dopocena', 'film', 'foto', 'fuchsia', 'gnu', 'gorilla', 'gru', 'iguana', 'kamikaze', 'karaoke', 'koala', 'lama', 'menu', 'metropoli', 'moto', 'opossum', 'panda', 'quiz', 'radio', 're', 'scacciapensieri', 'serie', 'smartphone', 'sosia', 'sottoscala', 'specie', 'sport', 'tablet', 'taxi', 'vaglia', 'virtù', 'virus', 'yogurt', 'foto', 'fuchsia', ]; foreach ($invariables as $word) { yield new Pattern($word); } } } pattern = $pattern; if (isset($this->pattern[0]) && $this->pattern[0] === '/') { $this->regex = $this->pattern; } else { $this->regex = '/' . $this->pattern . '/i'; } } public function getPattern(): string { return $this->pattern; } public function getRegex(): string { return $this->regex; } public function matches(string $word): bool { return preg_match($this->getRegex(), $word) === 1; } } regular = $regular; $this->uninflected = $uninflected; $this->irregular = $irregular; } public function getRegular(): Transformations { return $this->regular; } public function getUninflected(): Patterns { return $this->uninflected; } public function getIrregular(): Substitutions { return $this->irregular; } } pattern = $pattern; $this->replacement = $replacement; } public function getPattern(): Pattern { return $this->pattern; } public function getReplacement(): string { return $this->replacement; } public function inflect(string $word): string { return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word); } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } transformations = $transformations; } public function inflect(string $word): string { foreach ($this->transformations as $transformation) { if ($transformation->getPattern()->matches($word)) { return $transformation->inflect($word); } } return $word; } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } getPattern(); }, $patterns); $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i'; } public function matches(string $word): bool { return preg_match($this->regex, $word, $regs) === 1; } } getFlippedSubstitutions() ); } public static function getPluralRuleset(): Ruleset { return new Ruleset( new Transformations(...Inflectible::getPlural()), new Patterns(...Uninflected::getPlural()), new Substitutions(...Inflectible::getIrregular()) ); } } substitutions[$substitution->getFrom()->getWord()] = $substitution; } } public function getFlippedSubstitutions(): Substitutions { $substitutions = []; foreach ($this->substitutions as $substitution) { $substitutions[] = new Substitution( $substitution->getTo(), $substitution->getFrom() ); } return new Substitutions(...$substitutions); } public function inflect(string $word): string { $lowerWord = strtolower($word); if (isset($this->substitutions[$lowerWord])) { $firstLetterUppercase = $lowerWord[0] !== $word[0]; $toWord = $this->substitutions[$lowerWord]->getTo()->getWord(); if ($firstLetterUppercase) { return strtoupper($toWord[0]) . substr($toWord, 1); } return $toWord; } return $word; } } word = $word; } public function getWord(): string { return $this->word; } } 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'Ae', 'Æ' => 'Ae', 'Å' => 'Aa', 'æ' => 'a', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'Oe', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'Ue', 'Ý' => 'Y', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'ae', 'å' => 'aa', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'oe', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'ue', 'ý' => 'y', 'ÿ' => 'y', 'Ā' => 'A', 'ā' => 'a', 'Ă' => 'A', 'ă' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ć' => 'C', 'ć' => 'c', 'Ĉ' => 'C', 'ĉ' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'Č' => 'C', 'č' => 'c', 'Ď' => 'D', 'ď' => 'd', 'Đ' => 'D', 'đ' => 'd', 'Ē' => 'E', 'ē' => 'e', 'Ĕ' => 'E', 'ĕ' => 'e', 'Ė' => 'E', 'ė' => 'e', 'Ę' => 'E', 'ę' => 'e', 'Ě' => 'E', 'ě' => 'e', 'Ĝ' => 'G', 'ĝ' => 'g', 'Ğ' => 'G', 'ğ' => 'g', 'Ġ' => 'G', 'ġ' => 'g', 'Ģ' => 'G', 'ģ' => 'g', 'Ĥ' => 'H', 'ĥ' => 'h', 'Ħ' => 'H', 'ħ' => 'h', 'Ĩ' => 'I', 'ĩ' => 'i', 'Ī' => 'I', 'ī' => 'i', 'Ĭ' => 'I', 'ĭ' => 'i', 'Į' => 'I', 'į' => 'i', 'İ' => 'I', 'ı' => 'i', 'IJ' => 'IJ', 'ij' => 'ij', 'Ĵ' => 'J', 'ĵ' => 'j', 'Ķ' => 'K', 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'L', 'ĺ' => 'l', 'Ļ' => 'L', 'ļ' => 'l', 'Ľ' => 'L', 'ľ' => 'l', 'Ŀ' => 'L', 'ŀ' => 'l', 'Ł' => 'L', 'ł' => 'l', 'Ń' => 'N', 'ń' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'Ň' => 'N', 'ň' => 'n', 'ʼn' => 'N', 'Ŋ' => 'n', 'ŋ' => 'N', 'Ō' => 'O', 'ō' => 'o', 'Ŏ' => 'O', 'ŏ' => 'o', 'Ő' => 'O', 'ő' => 'o', 'Œ' => 'OE', 'œ' => 'oe', 'Ø' => 'O', 'ø' => 'o', 'Ŕ' => 'R', 'ŕ' => 'r', 'Ŗ' => 'R', 'ŗ' => 'r', 'Ř' => 'R', 'ř' => 'r', 'Ś' => 'S', 'ś' => 's', 'Ŝ' => 'S', 'ŝ' => 's', 'Ş' => 'S', 'ş' => 's', 'Š' => 'S', 'š' => 's', 'Ţ' => 'T', 'ţ' => 't', 'Ť' => 'T', 'ť' => 't', 'Ŧ' => 'T', 'ŧ' => 't', 'Ũ' => 'U', 'ũ' => 'u', 'Ū' => 'U', 'ū' => 'u', 'Ŭ' => 'U', 'ŭ' => 'u', 'Ů' => 'U', 'ů' => 'u', 'Ű' => 'U', 'ű' => 'u', 'Ų' => 'U', 'ų' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ŷ' => 'Y', 'ŷ' => 'y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'ź' => 'z', 'Ż' => 'Z', 'ż' => 'z', 'Ž' => 'Z', 'ž' => 'z', 'ſ' => 's', '€' => 'E', '£' => '', ]; /** @var WordInflector */ private $singularizer; /** @var WordInflector */ private $pluralizer; public function __construct(WordInflector $singularizer, WordInflector $pluralizer) { $this->singularizer = $singularizer; $this->pluralizer = $pluralizer; } /** * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'. */ public function tableize(string $word): string { $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word); if ($tableized === null) { throw new RuntimeException(sprintf( 'preg_replace returned null for value "%s"', $word )); } return mb_strtolower($tableized); } /** * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'. */ public function classify(string $word): string { return str_replace([' ', '_', '-'], '', ucwords($word, ' _-')); } /** * Camelizes a word. This uses the classify() method and turns the first character to lowercase. */ public function camelize(string $word): string { return lcfirst($this->classify($word)); } /** * Uppercases words with configurable delimiters between words. * * Takes a string and capitalizes all of the words, like PHP's built-in * ucwords function. This extends that behavior, however, by allowing the * word delimiters to be configured, rather than only separating on * whitespace. * * Here is an example: * * capitalize($string); * // Top-O-The-Morning To All_of_you! * * echo $inflector->capitalize($string, '-_ '); * // Top-O-The-Morning To All_Of_You! * ?> * * * @param string $string The string to operate on. * @param string $delimiters A list of word separators. * * @return string The string with all delimiter-separated words capitalized. */ public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-"): string { return ucwords($string, $delimiters); } /** * Checks if the given string seems like it has utf8 characters in it. * * @param string $string The string to check for utf8 characters in. */ public function seemsUtf8(string $string): bool { for ($i = 0; $i < strlen($string); $i++) { if (ord($string[$i]) < 0x80) { continue; // 0bbbbbbb } if ((ord($string[$i]) & 0xE0) === 0xC0) { $n = 1; // 110bbbbb } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { $n = 2; // 1110bbbb } elseif ((ord($string[$i]) & 0xF8) === 0xF0) { $n = 3; // 11110bbb } elseif ((ord($string[$i]) & 0xFC) === 0xF8) { $n = 4; // 111110bb } elseif ((ord($string[$i]) & 0xFE) === 0xFC) { $n = 5; // 1111110b } else { return false; // Does not match any model } for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ? if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) { return false; } } } return true; } /** * Remove any illegal characters, accents, etc. * * @param string $string String to unaccent * * @return string Unaccented string */ public function unaccent(string $string): string { if (preg_match('/[\x80-\xff]/', $string) === false) { return $string; } if ($this->seemsUtf8($string)) { $string = strtr($string, self::ACCENTED_CHARACTERS); } else { $characters = []; // Assume ISO-8859-1 if not UTF-8 $characters['in'] = chr(128) . chr(131) . chr(138) . chr(142) . chr(154) . chr(158) . chr(159) . chr(162) . chr(165) . chr(181) . chr(192) . chr(193) . chr(194) . chr(195) . chr(196) . chr(197) . chr(199) . chr(200) . chr(201) . chr(202) . chr(203) . chr(204) . chr(205) . chr(206) . chr(207) . chr(209) . chr(210) . chr(211) . chr(212) . chr(213) . chr(214) . chr(216) . chr(217) . chr(218) . chr(219) . chr(220) . chr(221) . chr(224) . chr(225) . chr(226) . chr(227) . chr(228) . chr(229) . chr(231) . chr(232) . chr(233) . chr(234) . chr(235) . chr(236) . chr(237) . chr(238) . chr(239) . chr(241) . chr(242) . chr(243) . chr(244) . chr(245) . chr(246) . chr(248) . chr(249) . chr(250) . chr(251) . chr(252) . chr(253) . chr(255); $characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'; $string = strtr($string, $characters['in'], $characters['out']); $doubleChars = []; $doubleChars['in'] = [ chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254), ]; $doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th']; $string = str_replace($doubleChars['in'], $doubleChars['out'], $string); } return $string; } /** * Convert any passed string to a url friendly string. * Converts 'My first blog post' to 'my-first-blog-post' * * @param string $string String to urlize. * * @return string Urlized string. */ public function urlize(string $string): string { // Remove all non url friendly characters with the unaccent function $unaccented = $this->unaccent($string); if (function_exists('mb_strtolower')) { $lowered = mb_strtolower($unaccented); } else { $lowered = strtolower($unaccented); } $replacements = [ '/\W/' => ' ', '/([A-Z]+)([A-Z][a-z])/' => '\1_\2', '/([a-z\d])([A-Z])/' => '\1_\2', '/[^A-Z^a-z^0-9^\/]+/' => '-', ]; $urlized = $lowered; foreach ($replacements as $pattern => $replacement) { $replaced = preg_replace($pattern, $replacement, $urlized); if ($replaced === null) { throw new RuntimeException(sprintf( 'preg_replace returned null for value "%s"', $urlized )); } $urlized = $replaced; } return trim($urlized, '-'); } /** * Returns a word in singular form. * * @param string $word The word in plural form. * * @return string The word in singular form. */ public function singularize(string $word): string { return $this->singularizer->inflect($word); } /** * Returns a word in plural form. * * @param string $word The word in singular form. * * @return string The word in plural form. */ public function pluralize(string $word): string { return $this->pluralizer->inflect($word); } } rulesets = array_merge([$ruleset], $rulesets); } public function inflect(string $word): string { if ($word === '') { return ''; } foreach ($this->rulesets as $ruleset) { if ($ruleset->getUninflected()->matches($word)) { return $word; } $inflected = $ruleset->getIrregular()->inflect($word); if ($inflected !== $word) { return $inflected; } $inflected = $ruleset->getRegular()->inflect($word); if ($inflected !== $word) { return $inflected; } } return $word; } } wordInflector = $wordInflector; } public function inflect(string $word): string { return $this->cache[$word] ?? $this->cache[$word] = $this->wordInflector->inflect($word); } } singularRulesets[] = $this->getSingularRuleset(); $this->pluralRulesets[] = $this->getPluralRuleset(); } final public function build(): Inflector { return new Inflector( new CachedWordInflector(new RulesetInflector( ...$this->singularRulesets )), new CachedWordInflector(new RulesetInflector( ...$this->pluralRulesets )) ); } final public function withSingularRules(?Ruleset $singularRules, bool $reset = false): LanguageInflectorFactory { if ($reset) { $this->singularRulesets = []; } if ($singularRules instanceof Ruleset) { array_unshift($this->singularRulesets, $singularRules); } return $this; } final public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): LanguageInflectorFactory { if ($reset) { $this->pluralRulesets = []; } if ($pluralRules instanceof Ruleset) { array_unshift($this->pluralRulesets, $pluralRules); } return $this; } abstract protected function getSingularRuleset(): Ruleset; abstract protected function getPluralRuleset(): Ruleset; } Copyright (c) 2006-2015 Doctrine Project 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. Introduction ============ The Doctrine Inflector has methods for inflecting text. The features include pluralization, singularization, converting between camelCase and under_score and capitalizing words. Installation ============ You can install the Inflector with composer: .. code-block:: console $ composer require doctrine/inflector Usage ===== Using the inflector is easy, you can create a new ``Doctrine\Inflector\Inflector`` instance by using the ``Doctrine\Inflector\InflectorFactory`` class: .. code-block:: php use Doctrine\Inflector\InflectorFactory; $inflector = InflectorFactory::create()->build(); By default it will create an English inflector. If you want to use another language, just pass the language you want to create an inflector for to the ``createForLanguage()`` method: .. code-block:: php use Doctrine\Inflector\InflectorFactory; use Doctrine\Inflector\Language; $inflector = InflectorFactory::createForLanguage(Language::SPANISH)->build(); The supported languages are as follows: - ``Language::ENGLISH`` - ``Language::ESPERANTO`` - ``Language::FRENCH`` - ``Language::NORWEGIAN_BOKMAL`` - ``Language::PORTUGUESE`` - ``Language::SPANISH`` - ``Language::TURKISH`` If you want to manually construct the inflector instead of using a factory, you can do so like this: .. code-block:: php use Doctrine\Inflector\CachedWordInflector; use Doctrine\Inflector\RulesetInflector; use Doctrine\Inflector\Rules\English; $inflector = new Inflector( new CachedWordInflector(new RulesetInflector( English\Rules::getSingularRuleset() )), new CachedWordInflector(new RulesetInflector( English\Rules::getPluralRuleset() )) ); Adding Languages ---------------- If you are interested in adding support for your language, take a look at the other languages defined in the ``Doctrine\Inflector\Rules`` namespace and the tests located in ``Doctrine\Tests\Inflector\Rules``. You can copy one of the languages and update the rules for your language. Once you have done this, send a pull request to the ``doctrine/inflector`` repository with the additions. Custom Setup ============ If you want to setup custom singular and plural rules, you can configure these in the factory: .. code-block:: php use Doctrine\Inflector\InflectorFactory; use Doctrine\Inflector\Rules\Pattern; use Doctrine\Inflector\Rules\Patterns; use Doctrine\Inflector\Rules\Ruleset; use Doctrine\Inflector\Rules\Substitution; use Doctrine\Inflector\Rules\Substitutions; use Doctrine\Inflector\Rules\Transformation; use Doctrine\Inflector\Rules\Transformations; use Doctrine\Inflector\Rules\Word; $inflector = InflectorFactory::create() ->withSingularRules( new Ruleset( new Transformations( new Transformation(new Pattern('/^(bil)er$/i'), '\1'), new Transformation(new Pattern('/^(inflec|contribu)tors$/i'), '\1ta') ), new Patterns(new Pattern('singulars')), new Substitutions(new Substitution(new Word('spins'), new Word('spinor'))) ) ) ->withPluralRules( new Ruleset( new Transformations( new Transformation(new Pattern('^(bil)er$'), '\1'), new Transformation(new Pattern('^(inflec|contribu)tors$'), '\1ta') ), new Patterns(new Pattern('noflect'), new Pattern('abtuse')), new Substitutions( new Substitution(new Word('amaze'), new Word('amazable')), new Substitution(new Word('phone'), new Word('phonezes')) ) ) ) ->build(); No operation inflector ---------------------- The ``Doctrine\Inflector\NoopWordInflector`` may be used to configure an inflector that doesn't perform any operation for pluralization and/or singularization. If will simply return the input as output. This is an implementation of the `Null Object design pattern `_. .. code-block:: php use Doctrine\Inflector\Inflector; use Doctrine\Inflector\NoopWordInflector; $inflector = new Inflector(new NoopWordInflector(), new NoopWordInflector()); Tableize ======== Converts ``ModelName`` to ``model_name``: .. code-block:: php echo $inflector->tableize('ModelName'); // model_name Classify ======== Converts ``model_name`` to ``ModelName``: .. code-block:: php echo $inflector->classify('model_name'); // ModelName Camelize ======== This method uses `Classify`_ and then converts the first character to lowercase: .. code-block:: php echo $inflector->camelize('model_name'); // modelName Capitalize ========== Takes a string and capitalizes all of the words, like PHP's built-in ``ucwords`` function. This extends that behavior, however, by allowing the word delimiters to be configured, rather than only separating on whitespace. Here is an example: .. code-block:: php $string = 'top-o-the-morning to all_of_you!'; echo $inflector->capitalize($string); // Top-O-The-Morning To All_of_you! echo $inflector->capitalize($string, '-_ '); // Top-O-The-Morning To All_Of_You! Pluralize ========= Returns a word in plural form. .. code-block:: php echo $inflector->pluralize('browser'); // browsers Singularize =========== Returns a word in singular form. .. code-block:: php echo $inflector->singularize('browsers'); // browser Urlize ====== Generate a URL friendly string from a string of text: .. code-block:: php echo $inflector->urlize('My first blog post'); // my-first-blog-post Unaccent ======== You can unaccent a string of text using the ``unaccent()`` method: .. code-block:: php echo $inflector->unaccent('año'); // ano Legacy API ========== The API present in Inflector 1.x is still available, but will be deprecated in a future release and dropped for 3.0. Support for languages other than English is available in the 2.0 API only. Acknowledgements ================ The language rules in this library have been adapted from several different sources, including but not limited to: - `Ruby On Rails Inflector `_ - `ICanBoogie Inflector `_ - `CakePHP Inflector `_ # Change Log Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. ## 7.10.0 - 2025-08-23 ### Added - Support for PHP 8.5 ### Changed - Adjusted `guzzlehttp/promises` version constraint to `^2.3` - Adjusted `guzzlehttp/psr7` version constraint to `^2.8` ## 7.9.3 - 2025-03-27 ### Changed - Remove explicit content-length header for GET requests - Improve compatibility with bad servers for boolean cookie values ## 7.9.2 - 2024-07-24 ### Fixed - Adjusted handler selection to use cURL if its version is 7.21.2 or higher, rather than 7.34.0 ## 7.9.1 - 2024-07-19 ### Fixed - Fix TLS 1.3 check for HTTP/2 requests ## 7.9.0 - 2024-07-18 ### Changed - Improve protocol version checks to provide feedback around unsupported protocols - Only select the cURL handler by default if 7.34.0 or higher is linked - Improved `CurlMultiHandler` to avoid busy wait if possible - Dropped support for EOL `guzzlehttp/psr7` v1 - Improved URI user info redaction in errors ## 7.8.2 - 2024-07-18 ### Added - Support for PHP 8.4 ## 7.8.1 - 2023-12-03 ### Changed - Updated links in docs to their canonical versions - Replaced `call_user_func*` with native calls ## 7.8.0 - 2023-08-27 ### Added - Support for PHP 8.3 - Added automatic closing of handles on `CurlFactory` object destruction ## 7.7.1 - 2023-08-27 ### Changed - Remove the need for `AllowDynamicProperties` in `CurlMultiHandler` ## 7.7.0 - 2023-05-21 ### Added - Support `guzzlehttp/promises` v2 ## 7.6.1 - 2023-05-15 ### Fixed - Fix `SetCookie::fromString` MaxAge deprecation warning and skip invalid MaxAge values ## 7.6.0 - 2023-05-14 ### Added - Support for setting the minimum TLS version in a unified way - Apply on request the version set in options parameters ## 7.5.2 - 2023-05-14 ### Fixed - Fixed set cookie constructor validation - Fixed handling of files with `'0'` body ### Changed - Corrected docs and default connect timeout value to 300 seconds ## 7.5.1 - 2023-04-17 ### Fixed - Fixed `NO_PROXY` settings so that setting the `proxy` option to `no` overrides the env variable ### Changed - Adjusted `guzzlehttp/psr7` version constraint to `^1.9.1 || ^2.4.5` ## 7.5.0 - 2022-08-28 ### Added - Support PHP 8.2 - Add request to delay closure params ## 7.4.5 - 2022-06-20 ### Fixed * Fix change in port should be considered a change in origin * Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin ## 7.4.4 - 2022-06-09 ### Fixed * Fix failure to strip Authorization header on HTTP downgrade * Fix failure to strip the Cookie header on change in host or HTTP downgrade ## 7.4.3 - 2022-05-25 ### Fixed * Fix cross-domain cookie leakage ## 7.4.2 - 2022-03-20 ### Fixed - Remove curl auth on cross-domain redirects to align with the Authorization HTTP header - Reject non-HTTP schemes in StreamHandler - Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve` ## 7.4.1 - 2021-12-06 ### Changed - Replaced implicit URI to string coercion [#2946](https://github.com/guzzle/guzzle/pull/2946) - Allow `symfony/deprecation-contracts` version 3 [#2961](https://github.com/guzzle/guzzle/pull/2961) ### Fixed - Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950) ## 7.4.0 - 2021-10-18 ### Added - Support PHP 8.1 [#2929](https://github.com/guzzle/guzzle/pull/2929), [#2939](https://github.com/guzzle/guzzle/pull/2939) - Support `psr/log` version 2 and 3 [#2943](https://github.com/guzzle/guzzle/pull/2943) ### Fixed - Make sure we always call `restore_error_handler()` [#2915](https://github.com/guzzle/guzzle/pull/2915) - Fix progress parameter type compatibility between the cURL and stream handlers [#2936](https://github.com/guzzle/guzzle/pull/2936) - Throw `InvalidArgumentException` when an incorrect `headers` array is provided [#2916](https://github.com/guzzle/guzzle/pull/2916), [#2942](https://github.com/guzzle/guzzle/pull/2942) ### Changed - Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945) ## 7.3.0 - 2021-03-23 ### Added - Support for DER and P12 certificates [#2413](https://github.com/guzzle/guzzle/pull/2413) - Support the cURL (http://) scheme for StreamHandler proxies [#2850](https://github.com/guzzle/guzzle/pull/2850) - Support for `guzzlehttp/psr7:^2.0` [#2878](https://github.com/guzzle/guzzle/pull/2878) ### Fixed - Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872) ## 7.2.0 - 2020-10-10 ### Added - Support for PHP 8 [#2712](https://github.com/guzzle/guzzle/pull/2712), [#2715](https://github.com/guzzle/guzzle/pull/2715), [#2789](https://github.com/guzzle/guzzle/pull/2789) - Support passing a body summarizer to the http errors middleware [#2795](https://github.com/guzzle/guzzle/pull/2795) ### Fixed - Handle exceptions during response creation [#2591](https://github.com/guzzle/guzzle/pull/2591) - Fix CURLOPT_ENCODING not to be overwritten [#2595](https://github.com/guzzle/guzzle/pull/2595) - Make sure the Request always has a body object [#2804](https://github.com/guzzle/guzzle/pull/2804) ### Changed - The `TooManyRedirectsException` has a response [#2660](https://github.com/guzzle/guzzle/pull/2660) - Avoid "functions" from dependencies [#2712](https://github.com/guzzle/guzzle/pull/2712) ### Deprecated - Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786) ## 7.1.1 - 2020-09-30 ### Fixed - Incorrect EOF detection for response body streams on Windows. ### Changed - We dont connect curl `sink` on HEAD requests. - Removed some PHP 5 workarounds ## 7.1.0 - 2020-09-22 ### Added - `GuzzleHttp\MessageFormatterInterface` ### Fixed - Fixed issue that caused cookies with no value not to be stored. - On redirects, we allow all safe methods like GET, HEAD and OPTIONS. - Fixed logging on empty responses. - Make sure MessageFormatter::format returns string ### Deprecated - All functions in `GuzzleHttp` has been deprecated. Use static methods on `Utils` instead. - `ClientInterface::getConfig()` - `Client::getConfig()` - `Client::__call()` - `Utils::defaultCaBundle()` - `CurlFactory::LOW_CURL_VERSION_NUMBER` ## 7.0.1 - 2020-06-27 * Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699) ## 7.0.0 - 2020-06-27 No changes since 7.0.0-rc1. ## 7.0.0-rc1 - 2020-06-15 ### Changed * Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629) * Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675) ## 7.0.0-beta2 - 2020-05-25 ### Added * Using `Utils` class instead of functions in the `GuzzleHttp` namespace. [#2546](https://github.com/guzzle/guzzle/pull/2546) * `ClientInterface::MAJOR_VERSION` [#2583](https://github.com/guzzle/guzzle/pull/2583) ### Changed * Avoid the `getenv` function when unsafe [#2531](https://github.com/guzzle/guzzle/pull/2531) * Added real client methods [#2529](https://github.com/guzzle/guzzle/pull/2529) * Avoid functions due to global install conflicts [#2546](https://github.com/guzzle/guzzle/pull/2546) * Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) * Adding methods for HTTP verbs like `Client::get()`, `Client::head()`, `Client::patch()` etc [#2529](https://github.com/guzzle/guzzle/pull/2529) * `ConnectException` extends `TransferException` [#2541](https://github.com/guzzle/guzzle/pull/2541) * Updated the default User Agent to "GuzzleHttp/7" [#2654](https://github.com/guzzle/guzzle/pull/2654) ### Fixed * Various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) ### Removed * Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528) ## 7.0.0-beta1 - 2019-12-30 The diff might look very big but 95% of Guzzle users will be able to upgrade without modification. Please see [the upgrade document](UPGRADING.md) that describes all BC breaking changes. ### Added * Implement PSR-18 and dropped PHP 5 support [#2421](https://github.com/guzzle/guzzle/pull/2421) [#2474](https://github.com/guzzle/guzzle/pull/2474) * PHP 7 types [#2442](https://github.com/guzzle/guzzle/pull/2442) [#2449](https://github.com/guzzle/guzzle/pull/2449) [#2466](https://github.com/guzzle/guzzle/pull/2466) [#2497](https://github.com/guzzle/guzzle/pull/2497) [#2499](https://github.com/guzzle/guzzle/pull/2499) * IDN support for redirects [2424](https://github.com/guzzle/guzzle/pull/2424) ### Changed * Dont allow passing null as third argument to `BadResponseException::__construct()` [#2427](https://github.com/guzzle/guzzle/pull/2427) * Use SAPI constant instead of method call [#2450](https://github.com/guzzle/guzzle/pull/2450) * Use native function invocation [#2444](https://github.com/guzzle/guzzle/pull/2444) * Better defaults for PHP installations with old ICU lib [2454](https://github.com/guzzle/guzzle/pull/2454) * Added visibility to all constants [#2462](https://github.com/guzzle/guzzle/pull/2462) * Dont allow passing `null` as URI to `Client::request()` and `Client::requestAsync()` [#2461](https://github.com/guzzle/guzzle/pull/2461) * Widen the exception argument to throwable [#2495](https://github.com/guzzle/guzzle/pull/2495) ### Fixed * Logging when Promise rejected with a string [#2311](https://github.com/guzzle/guzzle/pull/2311) ### Removed * Class `SeekException` [#2162](https://github.com/guzzle/guzzle/pull/2162) * `RequestException::getResponseBodySummary()` [#2425](https://github.com/guzzle/guzzle/pull/2425) * `CookieJar::getCookieValue()` [#2433](https://github.com/guzzle/guzzle/pull/2433) * `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440) * Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464) ## 6.5.2 - 2019-12-23 * idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) ## 6.5.1 - 2019-12-21 * Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) * IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) ## 6.5.0 - 2019-12-07 * Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) * Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) * Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) * Fix: `RetryMiddleware` did not do exponential delay between retires due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) * Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) * Deprecated `ClientInterface::VERSION` ## 6.4.1 - 2019-10-23 * No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that * Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` ## 6.4.0 - 2019-10-23 * Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) * Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) * Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) * Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) * Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) * Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) * Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) * Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) * Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) ## 6.3.3 - 2018-04-22 * Fix: Default headers when decode_content is specified ## 6.3.2 - 2018-03-26 * Fix: Release process ## 6.3.1 - 2018-03-26 * Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014) * Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012) * Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999) * Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998) * Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953) * Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915) * Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916) + Minor code cleanups, documentation fixes and clarifications. ## 6.3.0 - 2017-06-22 * Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659) * Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621) * Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580) * Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609) * Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641) * Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611) * Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811) * Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642) * Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569) * Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711) * Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745) * Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721) * Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318) * Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) * Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) + Minor code cleanups, documentation fixes and clarifications. ## 6.2.3 - 2017-02-28 * Fix deprecations with guzzle/psr7 version 1.4 ## 6.2.2 - 2016-10-08 * Allow to pass nullable Response to delay callable * Only add scheme when host is present * Fix drain case where content-length is the literal string zero * Obfuscate in-URL credentials in exceptions ## 6.2.1 - 2016-07-18 * Address HTTP_PROXY security vulnerability, CVE-2016-5385: https://httpoxy.org/ * Fixing timeout bug with StreamHandler: https://github.com/guzzle/guzzle/pull/1488 * Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when a server does not honor `Connection: close`. * Ignore URI fragment when sending requests. ## 6.2.0 - 2016-03-21 * Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. https://github.com/guzzle/guzzle/pull/1389 * Bug fix: Fix sleep calculation when waiting for delayed requests. https://github.com/guzzle/guzzle/pull/1324 * Feature: More flexible history containers. https://github.com/guzzle/guzzle/pull/1373 * Bug fix: defer sink stream opening in StreamHandler. https://github.com/guzzle/guzzle/pull/1377 * Bug fix: do not attempt to escape cookie values. https://github.com/guzzle/guzzle/pull/1406 * Feature: report original content encoding and length on decoded responses. https://github.com/guzzle/guzzle/pull/1409 * Bug fix: rewind seekable request bodies before dispatching to cURL. https://github.com/guzzle/guzzle/pull/1422 * Bug fix: provide an empty string to `http_build_query` for HHVM workaround. https://github.com/guzzle/guzzle/pull/1367 ## 6.1.1 - 2015-11-22 * Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4 * Feature: HandlerStack is now more generic. https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e * Bug fix: setting verify to false in the StreamHandler now disables peer verification. https://github.com/guzzle/guzzle/issues/1256 * Feature: Middleware now uses an exception factory, including more error context. https://github.com/guzzle/guzzle/pull/1282 * Feature: better support for disabled functions. https://github.com/guzzle/guzzle/pull/1287 * Bug fix: fixed regression where MockHandler was not using `sink`. https://github.com/guzzle/guzzle/pull/1292 ## 6.1.0 - 2015-09-08 * Feature: Added the `on_stats` request option to provide access to transfer statistics for requests. https://github.com/guzzle/guzzle/pull/1202 * Feature: Added the ability to persist session cookies in CookieJars. https://github.com/guzzle/guzzle/pull/1195 * Feature: Some compatibility updates for Google APP Engine https://github.com/guzzle/guzzle/pull/1216 * Feature: Added support for NO_PROXY to prevent the use of a proxy based on a simple set of rules. https://github.com/guzzle/guzzle/pull/1197 * Feature: Cookies can now contain square brackets. https://github.com/guzzle/guzzle/pull/1237 * Bug fix: Now correctly parsing `=` inside of quotes in Cookies. https://github.com/guzzle/guzzle/pull/1232 * Bug fix: Cusotm cURL options now correctly override curl options of the same name. https://github.com/guzzle/guzzle/pull/1221 * Bug fix: Content-Type header is now added when using an explicitly provided multipart body. https://github.com/guzzle/guzzle/pull/1218 * Bug fix: Now ignoring Set-Cookie headers that have no name. * Bug fix: Reason phrase is no longer cast to an int in some cases in the cURL handler. https://github.com/guzzle/guzzle/pull/1187 * Bug fix: Remove the Authorization header when redirecting if the Host header changes. https://github.com/guzzle/guzzle/pull/1207 * Bug fix: Cookie path matching fixes https://github.com/guzzle/guzzle/issues/1129 * Bug fix: Fixing the cURL `body_as_string` setting https://github.com/guzzle/guzzle/pull/1201 * Bug fix: quotes are no longer stripped when parsing cookies. https://github.com/guzzle/guzzle/issues/1172 * Bug fix: `form_params` and `query` now always uses the `&` separator. https://github.com/guzzle/guzzle/pull/1163 * Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. https://github.com/guzzle/guzzle/pull/1189 ## 6.0.2 - 2015-07-04 * Fixed a memory leak in the curl handlers in which references to callbacks were not being removed by `curl_reset`. * Cookies are now extracted properly before redirects. * Cookies now allow more character ranges. * Decoded Content-Encoding responses are now modified to correctly reflect their state if the encoding was automatically removed by a handler. This means that the `Content-Encoding` header may be removed an the `Content-Length` modified to reflect the message size after removing the encoding. * Added a more explicit error message when trying to use `form_params` and `multipart` in the same request. * Several fixes for HHVM support. * Functions are now conditionally required using an additional level of indirection to help with global Composer installations. ## 6.0.1 - 2015-05-27 * Fixed a bug with serializing the `query` request option where the `&` separator was missing. * Added a better error message for when `body` is provided as an array. Please use `form_params` or `multipart` instead. * Various doc fixes. ## 6.0.0 - 2015-05-26 * See the UPGRADING.md document for more information. * Added `multipart` and `form_params` request options. * Added `synchronous` request option. * Added the `on_headers` request option. * Fixed `expect` handling. * No longer adding default middlewares in the client ctor. These need to be present on the provided handler in order to work. * Requests are no longer initiated when sending async requests with the CurlMultiHandler. This prevents unexpected recursion from requests completing while ticking the cURL loop. * Removed the semantics of setting `default` to `true`. This is no longer required now that the cURL loop is not ticked for async requests. * Added request and response logging middleware. * No longer allowing self signed certificates when using the StreamHandler. * Ensuring that `sink` is valid if saving to a file. * Request exceptions now include a "handler context" which provides handler specific contextual information. * Added `GuzzleHttp\RequestOptions` to allow request options to be applied using constants. * `$maxHandles` has been removed from CurlMultiHandler. * `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. ## 5.3.0 - 2015-05-19 * Mock now supports `save_to` * Marked `AbstractRequestEvent::getTransaction()` as public. * Fixed a bug in which multiple headers using different casing would overwrite previous headers in the associative array. * Added `Utils::getDefaultHandler()` * Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. * URL scheme is now always lowercased. ## 6.0.0-beta.1 * Requires PHP >= 5.5 * Updated to use PSR-7 * Requires immutable messages, which basically means an event based system owned by a request instance is no longer possible. * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7). * Removed the dependency on `guzzlehttp/streams`. These stream abstractions are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7` namespace. * Added middleware and handler system * Replaced the Guzzle event and subscriber system with a middleware system. * No longer depends on RingPHP, but rather places the HTTP handlers directly in Guzzle, operating on PSR-7 messages. * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which means the `guzzlehttp/retry-subscriber` is now obsolete. * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`. * Asynchronous responses * No longer supports the `future` request option to send an async request. Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`, `getAsync`, etc.). * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid recursion required by chaining and forwarding react promises. See https://github.com/guzzle/promises * Added `requestAsync` and `sendAsync` to send request asynchronously. * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests asynchronously. * Request options * POST and form updates * Added the `form_fields` and `form_files` request options. * Removed the `GuzzleHttp\Post` namespace. * The `body` request option no longer accepts an array for POST requests. * The `exceptions` request option has been deprecated in favor of the `http_errors` request options. * The `save_to` request option has been deprecated in favor of `sink` request option. * Clients no longer accept an array of URI template string and variables for URI variables. You will need to expand URI templates before passing them into a client constructor or request method. * Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are now magic methods that will send synchronous requests. * Replaced `Utils.php` with plain functions in `functions.php`. * Removed `GuzzleHttp\Collection`. * Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as an array. * Removed `GuzzleHttp\Query`. Query string handling is now handled using an associative array passed into the `query` request option. The query string is serialized using PHP's `http_build_query`. If you need more control, you can pass the query string in as a string. * `GuzzleHttp\QueryParser` has been replaced with the `GuzzleHttp\Psr7\parse_query`. ## 5.2.0 - 2015-01-27 * Added `AppliesHeadersInterface` to make applying headers to a request based on the body more generic and not specific to `PostBodyInterface`. * Reduced the number of stack frames needed to send requests. * Nested futures are now resolved in the client rather than the RequestFsm * Finishing state transitions is now handled in the RequestFsm rather than the RingBridge. * Added a guard in the Pool class to not use recursion for request retries. ## 5.1.0 - 2014-12-19 * Pool class no longer uses recursion when a request is intercepted. * The size of a Pool can now be dynamically adjusted using a callback. See https://github.com/guzzle/guzzle/pull/943. * Setting a request option to `null` when creating a request with a client will ensure that the option is not set. This allows you to overwrite default request options on a per-request basis. See https://github.com/guzzle/guzzle/pull/937. * Added the ability to limit which protocols are allowed for redirects by specifying a `protocols` array in the `allow_redirects` request option. * Nested futures due to retries are now resolved when waiting for synchronous responses. See https://github.com/guzzle/guzzle/pull/947. * `"0"` is now an allowed URI path. See https://github.com/guzzle/guzzle/pull/935. * `Query` no longer typehints on the `$query` argument in the constructor, allowing for strings and arrays. * Exceptions thrown in the `end` event are now correctly wrapped with Guzzle specific exceptions if necessary. ## 5.0.3 - 2014-11-03 This change updates query strings so that they are treated as un-encoded values by default where the value represents an un-encoded value to send over the wire. A Query object then encodes the value before sending over the wire. This means that even value query string values (e.g., ":") are url encoded. This makes the Query class match PHP's http_build_query function. However, if you want to send requests over the wire using valid query string characters that do not need to be encoded, then you can provide a string to Url::setQuery() and pass true as the second argument to specify that the query string is a raw string that should not be parsed or encoded (unless a call to getQuery() is subsequently made, forcing the query-string to be converted into a Query object). ## 5.0.2 - 2014-10-30 * Added a trailing `\r\n` to multipart/form-data payloads. See https://github.com/guzzle/guzzle/pull/871 * Added a `GuzzleHttp\Pool::send()` convenience method to match the docs. * Status codes are now returned as integers. See https://github.com/guzzle/guzzle/issues/881 * No longer overwriting an existing `application/x-www-form-urlencoded` header when sending POST requests, allowing for customized headers. See https://github.com/guzzle/guzzle/issues/877 * Improved path URL serialization. * No longer double percent-encoding characters in the path or query string if they are already encoded. * Now properly encoding the supplied path to a URL object, instead of only encoding ' ' and '?'. * Note: This has been changed in 5.0.3 to now encode query string values by default unless the `rawString` argument is provided when setting the query string on a URL: Now allowing many more characters to be present in the query string without being percent encoded. See https://datatracker.ietf.org/doc/html/rfc3986#appendix-A ## 5.0.1 - 2014-10-16 Bugfix release. * Fixed an issue where connection errors still returned response object in error and end events event though the response is unusable. This has been corrected so that a response is not returned in the `getResponse` method of these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867 * Fixed an issue where transfer statistics were not being populated in the RingBridge. https://github.com/guzzle/guzzle/issues/866 ## 5.0.0 - 2014-10-12 Adding support for non-blocking responses and some minor API cleanup. ### New Features * Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`. * Added a public API for creating a default HTTP adapter. * Updated the redirect plugin to be non-blocking so that redirects are sent concurrently. Other plugins like this can now be updated to be non-blocking. * Added a "progress" event so that you can get upload and download progress events. * Added `GuzzleHttp\Pool` which implements FutureInterface and transfers requests concurrently using a capped pool size as efficiently as possible. * Added `hasListeners()` to EmitterInterface. * Removed `GuzzleHttp\ClientInterface::sendAll` and marked `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the recommended way). ### Breaking changes The breaking changes in this release are relatively minor. The biggest thing to look out for is that request and response objects no longer implement fluent interfaces. * Removed the fluent interfaces (i.e., `return $this`) from requests, responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of why I did this: https://ocramius.github.io/blog/fluent-interfaces-are-evil/. This also makes the Guzzle message interfaces compatible with the current PSR-7 message proposal. * Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except for the HTTP request functions from function.php, these functions are now implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode` moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php caused problems for many users: they aren't PSR-4 compliant, require an explicit include, and needed an if-guard to ensure that the functions are not declared multiple times. * Rewrote adapter layer. * Removing all classes from `GuzzleHttp\Adapter`, these are now implemented as callables that are stored in `GuzzleHttp\Ring\Client`. * Removed the concept of "parallel adapters". Sending requests serially or concurrently is now handled using a single adapter. * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The Transaction object now exposes the request, response, and client as public properties. The getters and setters have been removed. * Removed the "headers" event. This event was only useful for changing the body a response once the headers of the response were known. You can implement a similar behavior in a number of ways. One example might be to use a FnStream that has access to the transaction being sent. For example, when the first byte is written, you could check if the response headers match your expectations, and if so, change the actual stream body that is being written to. * Removed the `asArray` parameter from `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header value as an array, then use the newly added `getHeaderAsArray()` method of `MessageInterface`. This change makes the Guzzle interfaces compatible with the PSR-7 interfaces. * `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add custom request options using double-dispatch (this was an implementation detail). Instead, you should now provide an associative array to the constructor which is a mapping of the request option name mapping to a function that applies the option value to a request. * Removed the concept of "throwImmediately" from exceptions and error events. This control mechanism was used to stop a transfer of concurrent requests from completing. This can now be handled by throwing the exception or by cancelling a pool of requests or each outstanding future request individually. * Updated to "GuzzleHttp\Streams" 3.0. * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a `maxLen` parameter. This update makes the Guzzle streams project compatible with the current PSR-7 proposal. * `GuzzleHttp\Stream\Stream::__construct`, `GuzzleHttp\Stream\Stream::factory`, and `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second argument. They now accept an associative array of options, including the "size" key and "metadata" key which can be used to provide custom metadata. ## 4.2.2 - 2014-09-08 * Fixed a memory leak in the CurlAdapter when reusing cURL handles. * No longer using `request_fulluri` in stream adapter proxies. * Relative redirects are now based on the last response, not the first response. ## 4.2.1 - 2014-08-19 * Ensuring that the StreamAdapter does not always add a Content-Type header * Adding automated github releases with a phar and zip ## 4.2.0 - 2014-08-17 * Now merging in default options using a case-insensitive comparison. Closes https://github.com/guzzle/guzzle/issues/767 * Added the ability to automatically decode `Content-Encoding` response bodies using the `decode_content` request option. This is set to `true` by default to decode the response body if it comes over the wire with a `Content-Encoding`. Set this value to `false` to disable decoding the response content, and pass a string to provide a request `Accept-Encoding` header and turn on automatic response decoding. This feature now allows you to pass an `Accept-Encoding` header in the headers of a request but still disable automatic response decoding. Closes https://github.com/guzzle/guzzle/issues/764 * Added the ability to throw an exception immediately when transferring requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760 * Updating guzzlehttp/streams dependency to ~2.1 * No longer utilizing the now deprecated namespaced methods from the stream package. ## 4.1.8 - 2014-08-14 * Fixed an issue in the CurlFactory that caused setting the `stream=false` request option to throw an exception. See: https://github.com/guzzle/guzzle/issues/769 * TransactionIterator now calls rewind on the inner iterator. See: https://github.com/guzzle/guzzle/pull/765 * You can now set the `Content-Type` header to `multipart/form-data` when creating POST requests to force multipart bodies. See https://github.com/guzzle/guzzle/issues/768 ## 4.1.7 - 2014-08-07 * Fixed an error in the HistoryPlugin that caused the same request and response to be logged multiple times when an HTTP protocol error occurs. * Ensuring that cURL does not add a default Content-Type when no Content-Type has been supplied by the user. This prevents the adapter layer from modifying the request that is sent over the wire after any listeners may have already put the request in a desired state (e.g., signed the request). * Throwing an exception when you attempt to send requests that have the "stream" set to true in parallel using the MultiAdapter. * Only calling curl_multi_select when there are active cURL handles. This was previously changed and caused performance problems on some systems due to PHP always selecting until the maximum select timeout. * Fixed a bug where multipart/form-data POST fields were not correctly aggregated (e.g., values with "&"). ## 4.1.6 - 2014-08-03 * Added helper methods to make it easier to represent messages as strings, including getting the start line and getting headers as a string. ## 4.1.5 - 2014-08-02 * Automatically retrying cURL "Connection died, retrying a fresh connect" errors when possible. * cURL implementation cleanup * Allowing multiple event subscriber listeners to be registered per event by passing an array of arrays of listener configuration. ## 4.1.4 - 2014-07-22 * Fixed a bug that caused multi-part POST requests with more than one field to serialize incorrectly. * Paths can now be set to "0" * `ResponseInterface::xml` now accepts a `libxml_options` option and added a missing default argument that was required when parsing XML response bodies. * A `save_to` stream is now created lazily, which means that files are not created on disk unless a request succeeds. ## 4.1.3 - 2014-07-15 * Various fixes to multipart/form-data POST uploads * Wrapping function.php in an if-statement to ensure Guzzle can be used globally and in a Composer install * Fixed an issue with generating and merging in events to an event array * POST headers are only applied before sending a request to allow you to change the query aggregator used before uploading * Added much more robust query string parsing * Fixed various parsing and normalization issues with URLs * Fixing an issue where multi-valued headers were not being utilized correctly in the StreamAdapter ## 4.1.2 - 2014-06-18 * Added support for sending payloads with GET requests ## 4.1.1 - 2014-06-08 * Fixed an issue related to using custom message factory options in subclasses * Fixed an issue with nested form fields in a multi-part POST * Fixed an issue with using the `json` request option for POST requests * Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar` ## 4.1.0 - 2014-05-27 * Added a `json` request option to easily serialize JSON payloads. * Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON. * Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`. * Added the ability to provide an emitter to a client in the client constructor. * Added the ability to persist a cookie session using $_SESSION. * Added a trait that can be used to add event listeners to an iterator. * Removed request method constants from RequestInterface. * Fixed warning when invalid request start-lines are received. * Updated MessageFactory to work with custom request option methods. * Updated cacert bundle to latest build. 4.0.2 (2014-04-16) ------------------ * Proxy requests using the StreamAdapter now properly use request_fulluri (#632) * Added the ability to set scalars as POST fields (#628) ## 4.0.1 - 2014-04-04 * The HTTP status code of a response is now set as the exception code of RequestException objects. * 303 redirects will now correctly switch from POST to GET requests. * The default parallel adapter of a client now correctly uses the MultiAdapter. * HasDataTrait now initializes the internal data array as an empty array so that the toArray() method always returns an array. ## 4.0.0 - 2014-03-29 * For information on changes and upgrading, see: https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 * Added `GuzzleHttp\batch()` as a convenience function for sending requests in parallel without needing to write asynchronous code. * Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`. You can now pass a callable or an array of associative arrays where each associative array contains the "fn", "priority", and "once" keys. ## 4.0.0.rc-2 - 2014-03-25 * Removed `getConfig()` and `setConfig()` from clients to avoid confusion around whether things like base_url, message_factory, etc. should be able to be retrieved or modified. * Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface * functions.php functions were renamed using snake_case to match PHP idioms * Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and `GUZZLE_CURL_SELECT_TIMEOUT` environment variables * Added the ability to specify custom `sendAll()` event priorities * Added the ability to specify custom stream context options to the stream adapter. * Added a functions.php function for `get_path()` and `set_path()` * CurlAdapter and MultiAdapter now use a callable to generate curl resources * MockAdapter now properly reads a body and emits a `headers` event * Updated Url class to check if a scheme and host are set before adding ":" and "//". This allows empty Url (e.g., "") to be serialized as "". * Parsing invalid XML no longer emits warnings * Curl classes now properly throw AdapterExceptions * Various performance optimizations * Streams are created with the faster `Stream\create()` function * Marked deprecation_proxy() as internal * Test server is now a collection of static methods on a class ## 4.0.0-rc.1 - 2014-03-15 * See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 ## 3.8.1 - 2014-01-28 * Bug: Always using GET requests when redirecting from a 303 response * Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in `Guzzle\Http\ClientInterface::setSslVerification()` * Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL * Bug: The body of a request can now be set to `"0"` * Sending PHP stream requests no longer forces `HTTP/1.0` * Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of each sub-exception * Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than clobbering everything). * Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) * Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. * Now properly escaping the regular expression delimiter when matching Cookie domains. * Network access is now disabled when loading XML documents ## 3.8.0 - 2013-12-05 * Added the ability to define a POST name for a file * JSON response parsing now properly walks additionalProperties * cURL error code 18 is now retried automatically in the BackoffPlugin * Fixed a cURL error when URLs contain fragments * Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were CurlExceptions * CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) * Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` * Fixed a bug that was encountered when parsing empty header parameters * UriTemplate now has a `setRegex()` method to match the docs * The `debug` request parameter now checks if it is truthy rather than if it exists * Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin * Added the ability to combine URLs using strict RFC 3986 compliance * Command objects can now return the validation errors encountered by the command * Various fixes to cache revalidation (#437 and 29797e5) * Various fixes to the AsyncPlugin * Cleaned up build scripts ## 3.7.4 - 2013-10-02 * Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) * Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp (see https://github.com/aws/aws-sdk-php/issues/147) * Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots * Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) * Updated the bundled cacert.pem (#419) * OauthPlugin now supports adding authentication to headers or query string (#425) ## 3.7.3 - 2013-09-08 * Added the ability to get the exception associated with a request/command when using `MultiTransferException` and `CommandTransferException`. * Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description * Schemas are only injected into response models when explicitly configured. * No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of an EntityBody. * Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. * Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. * Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() * Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin * Bug fix: Visiting XML attributes first before visiting XML children when serializing requests * Bug fix: Properly parsing headers that contain commas contained in quotes * Bug fix: mimetype guessing based on a filename is now case-insensitive ## 3.7.2 - 2013-08-02 * Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander See https://github.com/guzzle/guzzle/issues/371 * Bug fix: Cookie domains are now matched correctly according to RFC 6265 See https://github.com/guzzle/guzzle/issues/377 * Bug fix: GET parameters are now used when calculating an OAuth signature * Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted * `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched * `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. See https://github.com/guzzle/guzzle/issues/379 * Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See https://github.com/guzzle/guzzle/pull/380 * cURL multi cleanup and optimizations ## 3.7.1 - 2013-07-05 * Bug fix: Setting default options on a client now works * Bug fix: Setting options on HEAD requests now works. See #352 * Bug fix: Moving stream factory before send event to before building the stream. See #353 * Bug fix: Cookies no longer match on IP addresses per RFC 6265 * Bug fix: Correctly parsing header parameters that are in `<>` and quotes * Added `cert` and `ssl_key` as request options * `Host` header can now diverge from the host part of a URL if the header is set manually * `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter * OAuth parameters are only added via the plugin if they aren't already set * Exceptions are now thrown when a URL cannot be parsed * Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails * Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin ## 3.7.0 - 2013-06-10 * See UPGRADING.md for more information on how to upgrade. * Requests now support the ability to specify an array of $options when creating a request to more easily modify a request. You can pass a 'request.options' configuration setting to a client to apply default request options to every request created by a client (e.g. default query string variables, headers, curl options, etc.). * Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. See `Guzzle\Http\StaticClient::mount`. * Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests created by a command (e.g. custom headers, query string variables, timeout settings, etc.). * Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the headers of a response * Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) * ServiceBuilders now support storing and retrieving arbitrary data * CachePlugin can now purge all resources for a given URI * CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource * CachePlugin now uses the Vary header to determine if a resource is a cache hit * `Guzzle\Http\Message\Response` now implements `\Serializable` * Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters * `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable * Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` * Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size * `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message * Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older Symfony users can still use the old version of Monolog. * Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. * Several performance improvements to `Guzzle\Common\Collection` * Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: createRequest, head, delete, put, patch, post, options, prepareRequest * Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` * Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` * Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a resource, string, or EntityBody into the $options parameter to specify the download location of the response. * Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a default `array()` * Added `Guzzle\Stream\StreamInterface::isRepeatable` * Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. * Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. * Removed `Guzzle\Http\ClientInterface::expandTemplate()` * Removed `Guzzle\Http\ClientInterface::setRequestFactory()` * Removed `Guzzle\Http\ClientInterface::getCurlMulti()` * Removed `Guzzle\Http\Message\RequestInterface::canCache` * Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` * Removed `Guzzle\Http\Message\RequestInterface::isRedirect` * Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. * You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting `Guzzle\Common\Version::$emitWarnings` to true. * Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. * Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. * Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. * Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. * Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. * Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated * Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 * Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. * Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. * Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. * Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. * Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. * Marked `Guzzle\Common\Collection::inject()` as deprecated. * Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` * CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a CacheStorageInterface. These two objects and interface will be removed in a future version. * Always setting X-cache headers on cached responses * Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin * `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface $request, Response $response);` * `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` * `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` * Added `CacheStorageInterface::purge($url)` * `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, CanCacheStrategyInterface $canCache = null)` * Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` ## 3.6.0 - 2013-05-29 * ServiceDescription now implements ToArrayInterface * Added command.hidden_params to blacklist certain headers from being treated as additionalParameters * Guzzle can now correctly parse incomplete URLs * Mixed casing of headers are now forced to be a single consistent casing across all values for that header. * Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution * Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). * Specific header implementations can be created for complex headers. When a message creates a header, it uses a HeaderFactory which can map specific headers to specific header classes. There is now a Link header and CacheControl header implementation. * Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate * Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() * Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in Guzzle\Http\Curl\RequestMediator * Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. * Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface * Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() * Removed Guzzle\Parser\ParserRegister::get(). Use getParser() * Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). * All response header helper functions return a string rather than mixing Header objects and strings inconsistently * Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle directly via interfaces * Removed the injecting of a request object onto a response object. The methods to get and set a request still exist but are a no-op until removed. * Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a `Guzzle\Service\Command\ArrayCommandInterface`. * Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response on a request while the request is still being transferred * The ability to case-insensitively search for header values * Guzzle\Http\Message\Header::hasExactHeader * Guzzle\Http\Message\Header::raw. Use getAll() * Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object instead. * `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess * Added the ability to cast Model objects to a string to view debug information. ## 3.5.0 - 2013-05-13 * Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times * Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove itself from the EventDispatcher) * Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values * Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too * Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a non-existent key * Bug: All __call() method arguments are now required (helps with mocking frameworks) * Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference to help with refcount based garbage collection of resources created by sending a request * Deprecating ZF1 cache and log adapters. These will be removed in the next major version. * Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the HistoryPlugin for a history. * Added a `responseBody` alias for the `response_body` location * Refactored internals to no longer rely on Response::getRequest() * HistoryPlugin can now be cast to a string * HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests and responses that are sent over the wire * Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects ## 3.4.3 - 2013-04-30 * Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response * Added a check to re-extract the temp cacert bundle from the phar before sending each request ## 3.4.2 - 2013-04-29 * Bug fix: Stream objects now work correctly with "a" and "a+" modes * Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present * Bug fix: AsyncPlugin no longer forces HEAD requests * Bug fix: DateTime timezones are now properly handled when using the service description schema formatter * Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails * Setting a response on a request will write to the custom request body from the response body if one is specified * LogPlugin now writes to php://output when STDERR is undefined * Added the ability to set multiple POST files for the same key in a single call * application/x-www-form-urlencoded POSTs now use the utf-8 charset by default * Added the ability to queue CurlExceptions to the MockPlugin * Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) * Configuration loading now allows remote files ## 3.4.1 - 2013-04-16 * Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. * Exceptions are now properly grouped when sending requests in parallel * Redirects are now properly aggregated when a multi transaction fails * Redirects now set the response on the original object even in the event of a failure * Bug fix: Model names are now properly set even when using $refs * Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax * Added support for oauth_callback in OAuth signatures * Added support for oauth_verifier in OAuth signatures * Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection ## 3.4.0 - 2013-04-11 * Bug fix: URLs are now resolved correctly based on https://datatracker.ietf.org/doc/html/rfc3986#section-5.2. #289 * Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 * Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 * Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. * Bug fix: Added `number` type to service descriptions. * Bug fix: empty parameters are removed from an OAuth signature * Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header * Bug fix: Fixed "array to string" error when validating a union of types in a service description * Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream * Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. * Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. * The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. * Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if the Content-Type can be determined based on the entity body or the path of the request. * Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. * Added support for a PSR-3 LogAdapter. * Added a `command.after_prepare` event * Added `oauth_callback` parameter to the OauthPlugin * Added the ability to create a custom stream class when using a stream factory * Added a CachingEntityBody decorator * Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. * The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. * You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies * POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use POST fields or files (the latter is only used when emulating a form POST in the browser). * Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest ## 3.3.1 - 2013-03-10 * Added the ability to create PHP streaming responses from HTTP requests * Bug fix: Running any filters when parsing response headers with service descriptions * Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing * Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across response location visitors. * Bug fix: Removed the possibility of creating configuration files with circular dependencies * RequestFactory::create() now uses the key of a POST file when setting the POST file name * Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set ## 3.3.0 - 2013-03-03 * A large number of performance optimizations have been made * Bug fix: Added 'wb' as a valid write mode for streams * Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned * Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` * BC: Removed `Guzzle\Http\Utils` class * BC: Setting a service description on a client will no longer modify the client's command factories. * BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' * BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to lowercase * Operation parameter objects are now lazy loaded internally * Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses * Added support for instantiating responseType=class responseClass classes. Classes must implement `Guzzle\Service\Command\ResponseClassInterface` * Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These additional properties also support locations and can be used to parse JSON responses where the outermost part of the JSON is an array * Added support for nested renaming of JSON models (rename sentAs to name) * CachePlugin * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error * Debug headers can now added to cached response in the CachePlugin ## 3.2.0 - 2013-02-14 * CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. * URLs with no path no longer contain a "/" by default * Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. * BadResponseException no longer includes the full request and response message * Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface * Adding getResponseBody() to Guzzle\Http\Message\RequestInterface * Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription * Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list * xmlEncoding can now be customized for the XML declaration of a XML service description operation * Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value aggregation and no longer uses callbacks * The URL encoding implementation of Guzzle\Http\QueryString can now be customized * Bug fix: Filters were not always invoked for array service description parameters * Bug fix: Redirects now use a target response body rather than a temporary response body * Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded * Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives ## 3.1.2 - 2013-01-27 * Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. * Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent * CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) * Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() * Setting default headers on a client after setting the user-agent will not erase the user-agent setting ## 3.1.1 - 2013-01-20 * Adding wildcard support to Guzzle\Common\Collection::getPath() * Adding alias support to ServiceBuilder configs * Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface ## 3.1.0 - 2013-01-12 * BC: CurlException now extends from RequestException rather than BadResponseException * BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() * Added getData to ServiceDescriptionInterface * Added context array to RequestInterface::setState() * Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http * Bug: Adding required content-type when JSON request visitor adds JSON to a command * Bug: Fixing the serialization of a service description with custom data * Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing an array of successful and failed responses * Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection * Added Guzzle\Http\IoEmittingEntityBody * Moved command filtration from validators to location visitors * Added `extends` attributes to service description parameters * Added getModels to ServiceDescriptionInterface ## 3.0.7 - 2012-12-19 * Fixing phar detection when forcing a cacert to system if null or true * Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` * Cleaning up `Guzzle\Common\Collection::inject` method * Adding a response_body location to service descriptions ## 3.0.6 - 2012-12-09 * CurlMulti performance improvements * Adding setErrorResponses() to Operation * composer.json tweaks ## 3.0.5 - 2012-11-18 * Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin * Bug: Response body can now be a string containing "0" * Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert * Bug: QueryString::fromString now properly parses query string parameters that contain equal signs * Added support for XML attributes in service description responses * DefaultRequestSerializer now supports array URI parameter values for URI template expansion * Added better mimetype guessing to requests and post files ## 3.0.4 - 2012-11-11 * Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value * Bug: Cookies can now be added that have a name, domain, or value set to "0" * Bug: Using the system cacert bundle when using the Phar * Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures * Enhanced cookie jar de-duplication * Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added * Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies * Added the ability to create any sort of hash for a stream rather than just an MD5 hash ## 3.0.3 - 2012-11-04 * Implementing redirects in PHP rather than cURL * Added PECL URI template extension and using as default parser if available * Bug: Fixed Content-Length parsing of Response factory * Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. * Adding ToArrayInterface throughout library * Fixing OauthPlugin to create unique nonce values per request ## 3.0.2 - 2012-10-25 * Magic methods are enabled by default on clients * Magic methods return the result of a command * Service clients no longer require a base_url option in the factory * Bug: Fixed an issue with URI templates where null template variables were being expanded ## 3.0.1 - 2012-10-22 * Models can now be used like regular collection objects by calling filter, map, etc. * Models no longer require a Parameter structure or initial data in the constructor * Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` ## 3.0.0 - 2012-10-15 * Rewrote service description format to be based on Swagger * Now based on JSON schema * Added nested input structures and nested response models * Support for JSON and XML input and output models * Renamed `commands` to `operations` * Removed dot class notation * Removed custom types * Broke the project into smaller top-level namespaces to be more component friendly * Removed support for XML configs and descriptions. Use arrays or JSON files. * Removed the Validation component and Inspector * Moved all cookie code to Guzzle\Plugin\Cookie * Magic methods on a Guzzle\Service\Client now return the command un-executed. * Calling getResult() or getResponse() on a command will lazily execute the command if needed. * Now shipping with cURL's CA certs and using it by default * Added previousResponse() method to response objects * No longer sending Accept and Accept-Encoding headers on every request * Only sending an Expect header by default when a payload is greater than 1MB * Added/moved client options: * curl.blacklist to curl.option.blacklist * Added ssl.certificate_authority * Added a Guzzle\Iterator component * Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin * Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) * Added a more robust caching plugin * Added setBody to response objects * Updating LogPlugin to use a more flexible MessageFormatter * Added a completely revamped build process * Cleaning up Collection class and removing default values from the get method * Fixed ZF2 cache adapters ## 2.8.8 - 2012-10-15 * Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did ## 2.8.7 - 2012-09-30 * Bug: Fixed config file aliases for JSON includes * Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests * Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload * Bug: Hardening request and response parsing to account for missing parts * Bug: Fixed PEAR packaging * Bug: Fixed Request::getInfo * Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail * Adding the ability for the namespace Iterator factory to look in multiple directories * Added more getters/setters/removers from service descriptions * Added the ability to remove POST fields from OAuth signatures * OAuth plugin now supports 2-legged OAuth ## 2.8.6 - 2012-09-05 * Added the ability to modify and build service descriptions * Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command * Added a `json` parameter location * Now allowing dot notation for classes in the CacheAdapterFactory * Using the union of two arrays rather than an array_merge when extending service builder services and service params * Ensuring that a service is a string before doing strpos() checks on it when substituting services for references in service builder config files. * Services defined in two different config files that include one another will by default replace the previously defined service, but you can now create services that extend themselves and merge their settings over the previous * The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like '_default' with a default JSON configuration file. ## 2.8.5 - 2012-08-29 * Bug: Suppressed empty arrays from URI templates * Bug: Added the missing $options argument from ServiceDescription::factory to enable caching * Added support for HTTP responses that do not contain a reason phrase in the start-line * AbstractCommand commands are now invokable * Added a way to get the data used when signing an Oauth request before a request is sent ## 2.8.4 - 2012-08-15 * Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin * Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. * Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream * Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream * Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) * Added additional response status codes * Removed SSL information from the default User-Agent header * DELETE requests can now send an entity body * Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries * Added the ability of the MockPlugin to consume mocked request bodies * LogPlugin now exposes request and response objects in the extras array ## 2.8.3 - 2012-07-30 * Bug: Fixed a case where empty POST requests were sent as GET requests * Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body * Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new * Added multiple inheritance to service description commands * Added an ApiCommandInterface and added `getParamNames()` and `hasParam()` * Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything * Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles ## 2.8.2 - 2012-07-24 * Bug: Query string values set to 0 are no longer dropped from the query string * Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()` * Bug: `+` is now treated as an encoded space when parsing query strings * QueryString and Collection performance improvements * Allowing dot notation for class paths in filters attribute of a service descriptions ## 2.8.1 - 2012-07-16 * Loosening Event Dispatcher dependency * POST redirects can now be customized using CURLOPT_POSTREDIR ## 2.8.0 - 2012-07-15 * BC: Guzzle\Http\Query * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) * Changed the aggregation functions of QueryString to be static methods * Can now use fromString() with querystrings that have a leading ? * cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters * Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body * Cookies are no longer URL decoded by default * Bug: URI template variables set to null are no longer expanded ## 2.7.2 - 2012-07-02 * BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. * BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() * CachePlugin now allows for a custom request parameter function to check if a request can be cached * Bug fix: CachePlugin now only caches GET and HEAD requests by default * Bug fix: Using header glue when transferring headers over the wire * Allowing deeply nested arrays for composite variables in URI templates * Batch divisors can now return iterators or arrays ## 2.7.1 - 2012-06-26 * Minor patch to update version number in UA string * Updating build process ## 2.7.0 - 2012-06-25 * BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. * BC: Removed magic setX methods from commands * BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method * Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. * Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) * Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace * Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin * Added the ability to set POST fields and files in a service description * Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method * Adding a command.before_prepare event to clients * Added BatchClosureTransfer and BatchClosureDivisor * BatchTransferException now includes references to the batch divisor and transfer strategies * Fixed some tests so that they pass more reliably * Added Guzzle\Common\Log\ArrayLogAdapter ## 2.6.6 - 2012-06-10 * BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin * BC: Removing Guzzle\Service\Command\CommandSet * Adding generic batching system (replaces the batch queue plugin and command set) * Updating ZF cache and log adapters and now using ZF's composer repository * Bug: Setting the name of each ApiParam when creating through an ApiCommand * Adding result_type, result_doc, deprecated, and doc_url to service descriptions * Bug: Changed the default cookie header casing back to 'Cookie' ## 2.6.5 - 2012-06-03 * BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() * BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from * BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data * BC: Renaming methods in the CookieJarInterface * Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations * Making the default glue for HTTP headers ';' instead of ',' * Adding a removeValue to Guzzle\Http\Message\Header * Adding getCookies() to request interface. * Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() ## 2.6.4 - 2012-05-30 * BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. * BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand * Bug: Fixing magic method command calls on clients * Bug: Email constraint only validates strings * Bug: Aggregate POST fields when POST files are present in curl handle * Bug: Fixing default User-Agent header * Bug: Only appending or prepending parameters in commands if they are specified * Bug: Not requiring response reason phrases or status codes to match a predefined list of codes * Allowing the use of dot notation for class namespaces when using instance_of constraint * Added any_match validation constraint * Added an AsyncPlugin * Passing request object to the calculateWait method of the ExponentialBackoffPlugin * Allowing the result of a command object to be changed * Parsing location and type sub values when instantiating a service description rather than over and over at runtime ## 2.6.3 - 2012-05-23 * [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. * [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. * You can now use an array of data when creating PUT request bodies in the request factory. * Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. * [Http] Adding support for Content-Type in multipart POST uploads per upload * [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) * Adding more POST data operations for easier manipulation of POST data. * You can now set empty POST fields. * The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. * Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. * CS updates ## 2.6.2 - 2012-05-19 * [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. ## 2.6.1 - 2012-05-19 * [BC] Removing 'path' support in service descriptions. Use 'uri'. * [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. * [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. * [BC] Removing Guzzle\Common\XmlElement. * All commands, both dynamic and concrete, have ApiCommand objects. * Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. * Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. * Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. ## 2.6.0 - 2012-05-15 * [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder * [BC] Executing a Command returns the result of the command rather than the command * [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. * [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. * [BC] Moving ResourceIterator* to Guzzle\Service\Resource * [BC] Completely refactored ResourceIterators to iterate over a cloned command object * [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate * [BC] Guzzle\Guzzle is now deprecated * Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject * Adding Guzzle\Version class to give version information about Guzzle * Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() * Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data * ServiceDescription and ServiceBuilder are now cacheable using similar configs * Changing the format of XML and JSON service builder configs. Backwards compatible. * Cleaned up Cookie parsing * Trimming the default Guzzle User-Agent header * Adding a setOnComplete() method to Commands that is called when a command completes * Keeping track of requests that were mocked in the MockPlugin * Fixed a caching bug in the CacheAdapterFactory * Inspector objects can be injected into a Command object * Refactoring a lot of code and tests to be case insensitive when dealing with headers * Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL * Adding the ability to set global option overrides to service builder configs * Adding the ability to include other service builder config files from within XML and JSON files * Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. ## 2.5.0 - 2012-05-08 * Major performance improvements * [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. * [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. * [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" * Added the ability to passed parameters to all requests created by a client * Added callback functionality to the ExponentialBackoffPlugin * Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. * Rewinding request stream bodies when retrying requests * Exception is thrown when JSON response body cannot be decoded * Added configurable magic method calls to clients and commands. This is off by default. * Fixed a defect that added a hash to every parsed URL part * Fixed duplicate none generation for OauthPlugin. * Emitting an event each time a client is generated by a ServiceBuilder * Using an ApiParams object instead of a Collection for parameters of an ApiCommand * cache.* request parameters should be renamed to params.cache.* * Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle. * Added the ability to disable type validation of service descriptions * ServiceDescriptions and ServiceBuilders are now Serializable { "name": "guzzlehttp/guzzle", "description": "Guzzle is a PHP HTTP client library", "keywords": [ "framework", "http", "rest", "web service", "curl", "client", "HTTP client", "PSR-7", "PSR-18" ], "license": "MIT", "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Jeremy Lindblom", "email": "jeremeamia@gmail.com", "homepage": "https://github.com/jeremeamia" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], "repositories": [ { "type": "package", "package": { "name": "guzzle/client-integration-tests", "version": "v3.0.2", "dist": { "url": "https://codeload.github.com/guzzle/client-integration-tests/zip/2c025848417c1135031fdf9c728ee53d0a7ceaee", "type": "zip" }, "require": { "php": "^7.2.5 || ^8.0", "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.11", "php-http/message": "^1.0 || ^2.0", "guzzlehttp/psr7": "^1.7 || ^2.0", "th3n3rd/cartesian-product": "^0.3" }, "autoload": { "psr-4": { "Http\\Client\\Tests\\": "src/" } }, "bin": [ "bin/http_test_server" ] } } ], "require": { "php": "^7.2.5 || ^8.0", "ext-json": "*", "guzzlehttp/promises": "^2.3", "guzzlehttp/psr7": "^2.8", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { "ext-curl": "*", "bamarni/composer-bin-plugin": "^1.8.2", "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "config": { "allow-plugins": { "bamarni/composer-bin-plugin": true }, "preferred-install": "dist", "sort-packages": true }, "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\": "src/" }, "files": [ "src/functions_include.php" ] }, "autoload-dev": { "psr-4": { "GuzzleHttp\\Tests\\": "tests/" } } } ![Guzzle](.github/logo.png?raw=true) # Guzzle, PHP HTTP client [![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases) [![Build Status](https://img.shields.io/github/actions/workflow/status/guzzle/guzzle/ci.yml?label=ci%20build&style=flat-square)](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI) [![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle) Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services. - Simple interface for building query strings, POST requests, streaming large uploads, streaming large downloads, using HTTP cookies, uploading JSON data, etc... - Can send both synchronous and asynchronous requests using the same interface. - Uses PSR-7 interfaces for requests, responses, and streams. This allows you to utilize other PSR-7 compatible libraries with Guzzle. - Supports PSR-18 allowing interoperability between other PSR-18 HTTP Clients. - Abstracts away the underlying HTTP transport, allowing you to write environment and transport agnostic code; i.e., no hard dependency on cURL, PHP streams, sockets, or non-blocking event loops. - Middleware system allows you to augment and compose client behavior. ```php $client = new \GuzzleHttp\Client(); $response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); echo $response->getStatusCode(); // 200 echo $response->getHeaderLine('content-type'); // 'application/json; charset=utf8' echo $response->getBody(); // '{"id": 1420053, "name": "guzzle", ...}' // Send an asynchronous request. $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); $promise = $client->sendAsync($request)->then(function ($response) { echo 'I completed! ' . $response->getBody(); }); $promise->wait(); ``` ## Help and docs We use GitHub issues only to discuss bugs and new features. For support please refer to: - [Documentation](https://docs.guzzlephp.org) - [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle) - [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/) - [Gitter](https://gitter.im/guzzle/guzzle) ## Installing Guzzle The recommended way to install Guzzle is through [Composer](https://getcomposer.org/). ```bash composer require guzzlehttp/guzzle ``` ## Version Guidance | Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | |---------|---------------------|---------------------|--------------|---------------------|---------------------|-------|--------------| | 3.x | EOL (2016-10-31) | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 | | 4.x | EOL (2016-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 | | 5.x | EOL (2019-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 | | 6.x | EOL (2023-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 | | 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.5 | [guzzle-3-repo]: https://github.com/guzzle/guzzle3 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 [guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5 [guzzle-7-repo]: https://github.com/guzzle/guzzle [guzzle-3-docs]: https://guzzle3.readthedocs.io/ [guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/ [guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/ [guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/ ## Security If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/guzzle/security/policy) for more information. ## License Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. ## For Enterprise Available as part of the Tidelift Subscription The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-guzzle?utm_source=packagist-guzzlehttp-guzzle&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) { "name": "guzzle", "lockfileVersion": 3, "requires": true, "packages": {} } Guzzle Upgrade Guide ==================== 6.0 to 7.0 ---------- In order to take advantage of the new features of PHP, Guzzle dropped the support of PHP 5. The minimum supported PHP version is now PHP 7.2. Type hints and return types for functions and methods have been added wherever possible. Please make sure: - You are calling a function or a method with the correct type. - If you extend a class of Guzzle; update all signatures on methods you override. #### Other backwards compatibility breaking changes - Class `GuzzleHttp\UriTemplate` is removed. - Class `GuzzleHttp\Exception\SeekException` is removed. - Classes `GuzzleHttp\Exception\BadResponseException`, `GuzzleHttp\Exception\ClientException`, `GuzzleHttp\Exception\ServerException` can no longer be initialized with an empty Response as argument. - Class `GuzzleHttp\Exception\ConnectException` now extends `GuzzleHttp\Exception\TransferException` instead of `GuzzleHttp\Exception\RequestException`. - Function `GuzzleHttp\Exception\ConnectException::getResponse()` is removed. - Function `GuzzleHttp\Exception\ConnectException::hasResponse()` is removed. - Constant `GuzzleHttp\ClientInterface::VERSION` is removed. Added `GuzzleHttp\ClientInterface::MAJOR_VERSION` instead. - Function `GuzzleHttp\Exception\RequestException::getResponseBodySummary` is removed. Use `\GuzzleHttp\Psr7\get_message_body_summary` as an alternative. - Function `GuzzleHttp\Cookie\CookieJar::getCookieValue` is removed. - Request option `exceptions` is removed. Please use `http_errors`. - Request option `save_to` is removed. Please use `sink`. - Pool option `pool_size` is removed. Please use `concurrency`. - We now look for environment variables in the `$_SERVER` super global, due to thread safety issues with `getenv`. We continue to fallback to `getenv` in CLI environments, for maximum compatibility. - The `get`, `head`, `put`, `post`, `patch`, `delete`, `getAsync`, `headAsync`, `putAsync`, `postAsync`, `patchAsync`, and `deleteAsync` methods are now implemented as genuine methods on `GuzzleHttp\Client`, with strong typing. The original `__call` implementation remains unchanged for now, for maximum backwards compatibility, but won't be invoked under normal operation. - The `log` middleware will log the errors with level `error` instead of `notice` - Support for international domain names (IDN) is now disabled by default, and enabling it requires installing ext-intl, linked against a modern version of the C library (ICU 4.6 or higher). #### Native functions calls All internal native functions calls of Guzzle are now prefixed with a slash. This change makes it impossible for method overloading by other libraries or applications. Example: ```php // Before: curl_version(); // After: \curl_version(); ``` For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..master). 5.0 to 6.0 ---------- Guzzle now uses [PSR-7](https://www.php-fig.org/psr/psr-7/) for HTTP messages. Due to the fact that these messages are immutable, this prompted a refactoring of Guzzle to use a middleware based system rather than an event system. Any HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be updated to work with the new immutable PSR-7 request and response objects. Any event listeners or subscribers need to be updated to become middleware functions that wrap handlers (or are injected into a `GuzzleHttp\HandlerStack`). - Removed `GuzzleHttp\BatchResults` - Removed `GuzzleHttp\Collection` - Removed `GuzzleHttp\HasDataTrait` - Removed `GuzzleHttp\ToArrayInterface` - The `guzzlehttp/streams` dependency has been removed. Stream functionality is now present in the `GuzzleHttp\Psr7` namespace provided by the `guzzlehttp/psr7` package. - Guzzle no longer uses ReactPHP promises and now uses the `guzzlehttp/promises` library. We use a custom promise library for three significant reasons: 1. React promises (at the time of writing this) are recursive. Promise chaining and promise resolution will eventually blow the stack. Guzzle promises are not recursive as they use a sort of trampolining technique. Note: there has been movement in the React project to modify promises to no longer utilize recursion. 2. Guzzle needs to have the ability to synchronously block on a promise to wait for a result. Guzzle promises allows this functionality (and does not require the use of recursion). 3. Because we need to be able to wait on a result, doing so using React promises requires wrapping react promises with RingPHP futures. This overhead is no longer needed, reducing stack sizes, reducing complexity, and improving performance. - `GuzzleHttp\Mimetypes` has been moved to a function in `GuzzleHttp\Psr7\mimetype_from_extension` and `GuzzleHttp\Psr7\mimetype_from_filename`. - `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query strings must now be passed into request objects as strings, or provided to the `query` request option when creating requests with clients. The `query` option uses PHP's `http_build_query` to convert an array to a string. If you need a different serialization technique, you will need to pass the query string in as a string. There are a couple helper functions that will make working with query strings easier: `GuzzleHttp\Psr7\parse_query` and `GuzzleHttp\Psr7\build_query`. - Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware system based on PSR-7, using RingPHP and it's middleware system as well adds more complexity than the benefits it provides. All HTTP handlers that were present in RingPHP have been modified to work directly with PSR-7 messages and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces complexity in Guzzle, removes a dependency, and improves performance. RingPHP will be maintained for Guzzle 5 support, but will no longer be a part of Guzzle 6. - As Guzzle now uses a middleware based systems the event system and RingPHP integration has been removed. Note: while the event system has been removed, it is possible to add your own type of event system that is powered by the middleware system. - Removed the `Event` namespace. - Removed the `Subscriber` namespace. - Removed `Transaction` class - Removed `RequestFsm` - Removed `RingBridge` - `GuzzleHttp\Subscriber\Cookie` is now provided by `GuzzleHttp\Middleware::cookies` - `GuzzleHttp\Subscriber\HttpError` is now provided by `GuzzleHttp\Middleware::httpError` - `GuzzleHttp\Subscriber\History` is now provided by `GuzzleHttp\Middleware::history` - `GuzzleHttp\Subscriber\Mock` is now provided by `GuzzleHttp\Handler\MockHandler` - `GuzzleHttp\Subscriber\Prepare` is now provided by `GuzzleHttp\PrepareBodyMiddleware` - `GuzzleHttp\Subscriber\Redirect` is now provided by `GuzzleHttp\RedirectMiddleware` - Guzzle now uses `Psr\Http\Message\UriInterface` (implements in `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone. - Static functions in `GuzzleHttp\Utils` have been moved to namespaced functions under the `GuzzleHttp` namespace. This requires either a Composer based autoloader or you to include functions.php. - `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to `GuzzleHttp\ClientInterface::getConfig`. - `GuzzleHttp\ClientInterface::setDefaultOption` has been removed. - The `json` and `xml` methods of response objects has been removed. With the migration to strictly adhering to PSR-7 as the interface for Guzzle messages, adding methods to message interfaces would actually require Guzzle messages to extend from PSR-7 messages rather then work with them directly. ## Migrating to middleware The change to PSR-7 unfortunately required significant refactoring to Guzzle due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event system from plugins. The event system relied on mutability of HTTP messages and side effects in order to work. With immutable messages, you have to change your workflow to become more about either returning a value (e.g., functional middlewares) or setting a value on an object. Guzzle v6 has chosen the functional middleware approach. Instead of using the event system to listen for things like the `before` event, you now create a stack based middleware function that intercepts a request on the way in and the promise of the response on the way out. This is a much simpler and more predictable approach than the event system and works nicely with PSR-7 middleware. Due to the use of promises, the middleware system is also asynchronous. v5: ```php use GuzzleHttp\Event\BeforeEvent; $client = new GuzzleHttp\Client(); // Get the emitter and listen to the before event. $client->getEmitter()->on('before', function (BeforeEvent $e) { // Guzzle v5 events relied on mutation $e->getRequest()->setHeader('X-Foo', 'Bar'); }); ``` v6: In v6, you can modify the request before it is sent using the `mapRequest` middleware. The idiomatic way in v6 to modify the request/response lifecycle is to setup a handler middleware stack up front and inject the handler into a client. ```php use GuzzleHttp\Middleware; // Create a handler stack that has all of the default middlewares attached $handler = GuzzleHttp\HandlerStack::create(); // Push the handler onto the handler stack $handler->push(Middleware::mapRequest(function (RequestInterface $request) { // Notice that we have to return a request object return $request->withHeader('X-Foo', 'Bar'); })); // Inject the handler into the client $client = new GuzzleHttp\Client(['handler' => $handler]); ``` ## POST Requests This version added the [`form_params`](https://docs.guzzlephp.org/en/latest/request-options.html#form_params) and `multipart` request options. `form_params` is an associative array of strings or array of strings and is used to serialize an `application/x-www-form-urlencoded` POST request. The [`multipart`](https://docs.guzzlephp.org/en/latest/request-options.html#multipart) option is now used to send a multipart/form-data POST request. `GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add POST files to a multipart/form-data request. The `body` option no longer accepts an array to send POST requests. Please use `multipart` or `form_params` instead. The `base_url` option has been renamed to `base_uri`. 4.x to 5.0 ---------- ## Rewritten Adapter Layer Guzzle now uses [RingPHP](https://ringphp.readthedocs.org/en/latest) to send HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor is still supported, but it has now been renamed to `handler`. Instead of passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP `callable` that follows the RingPHP specification. ## Removed Fluent Interfaces [Fluent interfaces were removed](https://ocramius.github.io/blog/fluent-interfaces-are-evil/) from the following classes: - `GuzzleHttp\Collection` - `GuzzleHttp\Url` - `GuzzleHttp\Query` - `GuzzleHttp\Post\PostBody` - `GuzzleHttp\Cookie\SetCookie` ## Removed functions.php Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following functions can be used as replacements. - `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode` - `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath` - `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path` - `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however, deprecated in favor of using `GuzzleHttp\Pool::batch()`. The "procedural" global client has been removed with no replacement (e.g., `GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client` object as a replacement. ## `throwImmediately` has been removed The concept of "throwImmediately" has been removed from exceptions and error events. This control mechanism was used to stop a transfer of concurrent requests from completing. This can now be handled by throwing the exception or by cancelling a pool of requests or each outstanding future request individually. ## headers event has been removed Removed the "headers" event. This event was only useful for changing the body a response once the headers of the response were known. You can implement a similar behavior in a number of ways. One example might be to use a FnStream that has access to the transaction being sent. For example, when the first byte is written, you could check if the response headers match your expectations, and if so, change the actual stream body that is being written to. ## Updates to HTTP Messages Removed the `asArray` parameter from `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header value as an array, then use the newly added `getHeaderAsArray()` method of `MessageInterface`. This change makes the Guzzle interfaces compatible with the PSR-7 interfaces. 3.x to 4.0 ---------- ## Overarching changes: - Now requires PHP 5.4 or greater. - No longer requires cURL to send requests. - Guzzle no longer wraps every exception it throws. Only exceptions that are recoverable are now wrapped by Guzzle. - Various namespaces have been removed or renamed. - No longer requiring the Symfony EventDispatcher. A custom event dispatcher based on the Symfony EventDispatcher is now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant speed and functionality improvements). Changes per Guzzle 3.x namespace are described below. ## Batch The `Guzzle\Batch` namespace has been removed. This is best left to third-parties to implement on top of Guzzle's core HTTP library. ## Cache The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement has been implemented yet, but hoping to utilize a PSR cache interface). ## Common - Removed all of the wrapped exceptions. It's better to use the standard PHP library for unrecoverable exceptions. - `FromConfigInterface` has been removed. - `Guzzle\Common\Version` has been removed. The VERSION constant can be found at `GuzzleHttp\ClientInterface::VERSION`. ### Collection - `getAll` has been removed. Use `toArray` to convert a collection to an array. - `inject` has been removed. - `keySearch` has been removed. - `getPath` no longer supports wildcard expressions. Use something better like JMESPath for this. - `setPath` now supports appending to an existing array via the `[]` notation. ### Events Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses `GuzzleHttp\Event\Emitter`. - `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by `GuzzleHttp\Event\EmitterInterface`. - `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by `GuzzleHttp\Event\Emitter`. - `Symfony\Component\EventDispatcher\Event` is replaced by `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in `GuzzleHttp\Event\EventInterface`. - `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the event emitter of a request, client, etc. now uses the `getEmitter` method rather than the `getDispatcher` method. #### Emitter - Use the `once()` method to add a listener that automatically removes itself the first time it is invoked. - Use the `listeners()` method to retrieve a list of event listeners rather than the `getListeners()` method. - Use `emit()` instead of `dispatch()` to emit an event from an emitter. - Use `attach()` instead of `addSubscriber()` and `detach()` instead of `removeSubscriber()`. ```php $mock = new Mock(); // 3.x $request->getEventDispatcher()->addSubscriber($mock); $request->getEventDispatcher()->removeSubscriber($mock); // 4.x $request->getEmitter()->attach($mock); $request->getEmitter()->detach($mock); ``` Use the `on()` method to add a listener rather than the `addListener()` method. ```php // 3.x $request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } ); // 4.x $request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } ); ``` ## Http ### General changes - The cacert.pem certificate has been moved to `src/cacert.pem`. - Added the concept of adapters that are used to transfer requests over the wire. - Simplified the event system. - Sending requests in parallel is still possible, but batching is no longer a concept of the HTTP layer. Instead, you must use the `complete` and `error` events to asynchronously manage parallel request transfers. - `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`. - `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`. - QueryAggregators have been rewritten so that they are simply callable functions. - `GuzzleHttp\StaticClient` has been removed. Use the functions provided in `functions.php` for an easy to use static client instance. - Exceptions in `GuzzleHttp\Exception` have been updated to all extend from `GuzzleHttp\Exception\TransferException`. ### Client Calling methods like `get()`, `post()`, `head()`, etc. no longer create and return a request, but rather creates a request, sends the request, and returns the response. ```php // 3.0 $request = $client->get('/'); $response = $request->send(); // 4.0 $response = $client->get('/'); // or, to mirror the previous behavior $request = $client->createRequest('GET', '/'); $response = $client->send($request); ``` `GuzzleHttp\ClientInterface` has changed. - The `send` method no longer accepts more than one request. Use `sendAll` to send multiple requests in parallel. - `setUserAgent()` has been removed. Use a default request option instead. You could, for example, do something like: `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`. - `setSslVerification()` has been removed. Use default request options instead, like `$client->setConfig('defaults/verify', true)`. `GuzzleHttp\Client` has changed. - The constructor now accepts only an associative array. You can include a `base_url` string or array to use a URI template as the base URL of a client. You can also specify a `defaults` key that is an associative array of default request options. You can pass an `adapter` to use a custom adapter, `batch_adapter` to use a custom adapter for sending requests in parallel, or a `message_factory` to change the factory used to create HTTP requests and responses. - The client no longer emits a `client.create_request` event. - Creating requests with a client no longer automatically utilize a URI template. You must pass an array into a creational method (e.g., `createRequest`, `get`, `put`, etc.) in order to expand a URI template. ### Messages Messages no longer have references to their counterparts (i.e., a request no longer has a reference to it's response, and a response no loger has a reference to its request). This association is now managed through a `GuzzleHttp\Adapter\TransactionInterface` object. You can get references to these transaction objects using request events that are emitted over the lifecycle of a request. #### Requests with a body - `GuzzleHttp\Message\EntityEnclosingRequest` and `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The separation between requests that contain a body and requests that do not contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface` handles both use cases. - Any method that previously accepts a `GuzzleHttp\Response` object now accept a `GuzzleHttp\Message\ResponseInterface`. - `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create both requests and responses and is implemented in `GuzzleHttp\Message\MessageFactory`. - POST field and file methods have been removed from the request object. You must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface` to control the format of a POST body. Requests that are created using a standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if the method is POST and no body is provided. ```php $request = $client->createRequest('POST', '/'); $request->getBody()->setField('foo', 'bar'); $request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r'))); ``` #### Headers - `GuzzleHttp\Message\Header` has been removed. Header values are now simply represented by an array of values or as a string. Header values are returned as a string by default when retrieving a header value from a message. You can pass an optional argument of `true` to retrieve a header value as an array of strings instead of a single concatenated string. - `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to `GuzzleHttp\Post`. This interface has been simplified and now allows the addition of arbitrary headers. - Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most of the custom headers are now handled separately in specific subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has been updated to properly handle headers that contain parameters (like the `Link` header). #### Responses - `GuzzleHttp\Message\Response::getInfo()` and `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event system to retrieve this type of information. - `GuzzleHttp\Message\Response::getRawHeaders()` has been removed. - `GuzzleHttp\Message\Response::getMessage()` has been removed. - `GuzzleHttp\Message\Response::calculateAge()` and other cache specific methods have moved to the CacheSubscriber. - Header specific helper functions like `getContentMd5()` have been removed. Just use `getHeader('Content-MD5')` instead. - `GuzzleHttp\Message\Response::setRequest()` and `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event system to work with request and response objects as a transaction. - `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the Redirect subscriber instead. - `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have been removed. Use `getStatusCode()` instead. #### Streaming responses Streaming requests can now be created by a client directly, returning a `GuzzleHttp\Message\ResponseInterface` object that contains a body stream referencing an open PHP HTTP stream. ```php // 3.0 use Guzzle\Stream\PhpStreamRequestFactory; $request = $client->get('/'); $factory = new PhpStreamRequestFactory(); $stream = $factory->fromRequest($request); $data = $stream->read(1024); // 4.0 $response = $client->get('/', ['stream' => true]); // Read some data off of the stream in the response body $data = $response->getBody()->read(1024); ``` #### Redirects The `configureRedirects()` method has been removed in favor of a `allow_redirects` request option. ```php // Standard redirects with a default of a max of 5 redirects $request = $client->createRequest('GET', '/', ['allow_redirects' => true]); // Strict redirects with a custom number of redirects $request = $client->createRequest('GET', '/', [ 'allow_redirects' => ['max' => 5, 'strict' => true] ]); ``` #### EntityBody EntityBody interfaces and classes have been removed or moved to `GuzzleHttp\Stream`. All classes and interfaces that once required `GuzzleHttp\EntityBodyInterface` now require `GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no longer uses `GuzzleHttp\EntityBody::factory` but now uses `GuzzleHttp\Stream\Stream::factory` or even better: `GuzzleHttp\Stream\create()`. - `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface` - `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream` - `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream` - `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream` - `Guzzle\Http\IoEmittyinEntityBody` has been removed. #### Request lifecycle events Requests previously submitted a large number of requests. The number of events emitted over the lifecycle of a request has been significantly reduced to make it easier to understand how to extend the behavior of a request. All events emitted during the lifecycle of a request now emit a custom `GuzzleHttp\Event\EventInterface` object that contains context providing methods and a way in which to modify the transaction at that specific point in time (e.g., intercept the request and set a response on the transaction). - `request.before_send` has been renamed to `before` and now emits a `GuzzleHttp\Event\BeforeEvent` - `request.complete` has been renamed to `complete` and now emits a `GuzzleHttp\Event\CompleteEvent`. - `request.sent` has been removed. Use `complete`. - `request.success` has been removed. Use `complete`. - `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`. - `request.exception` has been removed. Use `error`. - `request.receive.status_line` has been removed. - `curl.callback.progress` has been removed. Use a custom `StreamInterface` to maintain a status update. - `curl.callback.write` has been removed. Use a custom `StreamInterface` to intercept writes. - `curl.callback.read` has been removed. Use a custom `StreamInterface` to intercept reads. `headers` is a new event that is emitted after the response headers of a request have been received before the body of the response is downloaded. This event emits a `GuzzleHttp\Event\HeadersEvent`. You can intercept a request and inject a response using the `intercept()` event of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and `GuzzleHttp\Event\ErrorEvent` event. See: https://docs.guzzlephp.org/en/latest/events.html ## Inflection The `Guzzle\Inflection` namespace has been removed. This is not a core concern of Guzzle. ## Iterator The `Guzzle\Iterator` namespace has been removed. - `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of Guzzle itself. - `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent class is shipped with PHP 5.4. - `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because it's easier to just wrap an iterator in a generator that maps values. For a replacement of these iterators, see https://github.com/nikic/iter ## Log The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The `Guzzle\Log` namespace has been removed. Guzzle now relies on `Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been moved to `GuzzleHttp\Subscriber\Log\Formatter`. ## Parser The `Guzzle\Parser` namespace has been removed. This was previously used to make it possible to plug in custom parsers for cookies, messages, URI templates, and URLs; however, this level of complexity is not needed in Guzzle so it has been removed. - Cookie: Cookie parsing logic has been moved to `GuzzleHttp\Cookie\SetCookie::fromString`. - Message: Message parsing logic for both requests and responses has been moved to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only used in debugging or deserializing messages, so it doesn't make sense for Guzzle as a library to add this level of complexity to parsing messages. - UriTemplate: URI template parsing has been moved to `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL URI template library if it is installed. - Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary, then developers are free to subclass `GuzzleHttp\Url`. ## Plugin The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`. Several plugins are shipping with the core Guzzle library under this namespace. - `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar code has moved to `GuzzleHttp\Cookie`. - `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin. - `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is received. - `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin. - `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before sending. This subscriber is attached to all requests by default. - `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin. The following plugins have been removed (third-parties are free to re-implement these if needed): - `GuzzleHttp\Plugin\Async` has been removed. - `GuzzleHttp\Plugin\CurlAuth` has been removed. - `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This functionality should instead be implemented with event listeners that occur after normal response parsing occurs in the guzzle/command package. The following plugins are not part of the core Guzzle package, but are provided in separate repositories: - `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler to build custom retry policies using simple functions rather than various chained classes. See: https://github.com/guzzle/retry-subscriber - `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to https://github.com/guzzle/cache-subscriber - `Guzzle\Http\Plugin\Log\LogPlugin` has moved to https://github.com/guzzle/log-subscriber - `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to https://github.com/guzzle/message-integrity-subscriber - `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to `GuzzleHttp\Subscriber\MockSubscriber`. - `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to https://github.com/guzzle/oauth-subscriber ## Service The service description layer of Guzzle has moved into two separate packages: - https://github.com/guzzle/command Provides a high level abstraction over web services by representing web service operations using commands. - https://github.com/guzzle/guzzle-services Provides an implementation of guzzle/command that provides request serialization and response parsing using Guzzle service descriptions. ## Stream Stream have moved to a separate package available at https://github.com/guzzle/streams. `Guzzle\Stream\StreamInterface` has been given a large update to cleanly take on the responsibilities of `Guzzle\Http\EntityBody` and `Guzzle\Http\EntityBodyInterface` now that they have been removed. The number of methods implemented by the `StreamInterface` has been drastically reduced to allow developers to more easily extend and decorate stream behavior. ## Removed methods from StreamInterface - `getStream` and `setStream` have been removed to better encapsulate streams. - `getMetadata` and `setMetadata` have been removed in favor of `GuzzleHttp\Stream\MetadataStreamInterface`. - `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been removed. This data is accessible when using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`. - `rewind` has been removed. Use `seek(0)` for a similar behavior. ## Renamed methods - `detachStream` has been renamed to `detach`. - `feof` has been renamed to `eof`. - `ftell` has been renamed to `tell`. - `readLine` has moved from an instance method to a static class method of `GuzzleHttp\Stream\Stream`. ## Metadata streams `GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams that contain additional metadata accessible via `getMetadata()`. `GuzzleHttp\Stream\StreamInterface::getMetadata` and `GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed. ## StreamRequestFactory The entire concept of the StreamRequestFactory has been removed. The way this was used in Guzzle 3 broke the actual interface of sending streaming requests (instead of getting back a Response, you got a StreamInterface). Streaming PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`. 3.6 to 3.7 ---------- ### Deprecations - You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: ```php \Guzzle\Common\Version::$emitWarnings = true; ``` The following APIs and options have been marked as deprecated: - Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. - Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. - Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. - Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. - Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. - Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated - Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. - Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. - Marked `Guzzle\Common\Collection::inject()` as deprecated. - Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` 3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational request methods. When paired with a client's configuration settings, these options allow you to specify default settings for various aspects of a request. Because these options make other previous configuration options redundant, several configuration options and methods of a client and AbstractCommand have been deprecated. - Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. - Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. - Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` - Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 $command = $client->getCommand('foo', array( 'command.headers' => array('Test' => '123'), 'command.response_body' => '/path/to/file' )); // Should be changed to: $command = $client->getCommand('foo', array( 'command.request_options' => array( 'headers' => array('Test' => '123'), 'save_as' => '/path/to/file' ) )); ### Interface changes Additions and changes (you will need to update any implementations or subclasses you may have created): - Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: createRequest, head, delete, put, patch, post, options, prepareRequest - Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` - Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` - Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a resource, string, or EntityBody into the $options parameter to specify the download location of the response. - Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a default `array()` - Added `Guzzle\Stream\StreamInterface::isRepeatable` - Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. The following methods were removed from interfaces. All of these methods are still available in the concrete classes that implement them, but you should update your code to use alternative methods: - Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or `$client->setDefaultOption('headers/{header_name}', 'value')`. or `$client->setDefaultOption('headers', array('header_name' => 'value'))`. - Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. - Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. - Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. - Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. - Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. - Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. - Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. ### Cache plugin breaking changes - CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a CacheStorageInterface. These two objects and interface will be removed in a future version. - Always setting X-cache headers on cached responses - Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin - `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface $request, Response $response);` - `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` - `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` - Added `CacheStorageInterface::purge($url)` - `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, CanCacheStrategyInterface $canCache = null)` - Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` 3.5 to 3.6 ---------- * Mixed casing of headers are now forced to be a single consistent casing across all values for that header. * Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution * Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. * Specific header implementations can be created for complex headers. When a message creates a header, it uses a HeaderFactory which can map specific headers to specific header classes. There is now a Link header and CacheControl header implementation. * Moved getLinks() from Response to just be used on a Link header object. If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the HeaderInterface (e.g. toArray(), getAll(), etc.). ### Interface changes * Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate * Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() * Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in Guzzle\Http\Curl\RequestMediator * Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. * Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface * Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() ### Removed deprecated functions * Removed Guzzle\Parser\ParserRegister::get(). Use getParser() * Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). ### Deprecations * The ability to case-insensitively search for header values * Guzzle\Http\Message\Header::hasExactHeader * Guzzle\Http\Message\Header::raw. Use getAll() * Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object instead. ### Other changes * All response header helper functions return a string rather than mixing Header objects and strings inconsistently * Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle directly via interfaces * Removed the injecting of a request object onto a response object. The methods to get and set a request still exist but are a no-op until removed. * Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a `Guzzle\Service\Command\ArrayCommandInterface`. * Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response on a request while the request is still being transferred * `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess 3.3 to 3.4 ---------- Base URLs of a client now follow the rules of https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.2 when merging URLs. 3.2 to 3.3 ---------- ### Response::getEtag() quote stripping removed `Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header ### Removed `Guzzle\Http\Utils` The `Guzzle\Http\Utils` class was removed. This class was only used for testing. ### Stream wrapper and type `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase. ### curl.emit_io became emit_io Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' 3.1 to 3.2 ---------- ### CurlMulti is no longer reused globally Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added to a single client can pollute requests dispatched from other clients. If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is created. ```php $multi = new Guzzle\Http\Curl\CurlMulti(); $builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); $builder->addListener('service_builder.create_client', function ($event) use ($multi) { $event['client']->setCurlMulti($multi); } }); ``` ### No default path URLs no longer have a default path value of '/' if no path was specified. Before: ```php $request = $client->get('http://www.foo.com'); echo $request->getUrl(); // >> http://www.foo.com/ ``` After: ```php $request = $client->get('http://www.foo.com'); echo $request->getUrl(); // >> http://www.foo.com ``` ### Less verbose BadResponseException The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and response information. You can, however, get access to the request and response object by calling `getRequest()` or `getResponse()` on the exception object. ### Query parameter aggregation Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is responsible for handling the aggregation of multi-valued query string variables into a flattened hash. 2.8 to 3.x ---------- ### Guzzle\Service\Inspector Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` **Before** ```php use Guzzle\Service\Inspector; class YourClient extends \Guzzle\Service\Client { public static function factory($config = array()) { $default = array(); $required = array('base_url', 'username', 'api_key'); $config = Inspector::fromConfig($config, $default, $required); $client = new self( $config->get('base_url'), $config->get('username'), $config->get('api_key') ); $client->setConfig($config); $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); return $client; } ``` **After** ```php use Guzzle\Common\Collection; class YourClient extends \Guzzle\Service\Client { public static function factory($config = array()) { $default = array(); $required = array('base_url', 'username', 'api_key'); $config = Collection::fromConfig($config, $default, $required); $client = new self( $config->get('base_url'), $config->get('username'), $config->get('api_key') ); $client->setConfig($config); $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); return $client; } ``` ### Convert XML Service Descriptions to JSON **Before** ```xml Get a list of groups Uses a search query to get a list of groups Create a group Delete a group by ID Update a group ``` **After** ```json { "name": "Zendesk REST API v2", "apiVersion": "2012-12-31", "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", "operations": { "list_groups": { "httpMethod":"GET", "uri": "groups.json", "summary": "Get a list of groups" }, "search_groups":{ "httpMethod":"GET", "uri": "search.json?query=\"{query} type:group\"", "summary": "Uses a search query to get a list of groups", "parameters":{ "query":{ "location": "uri", "description":"Zendesk Search Query", "type": "string", "required": true } } }, "create_group": { "httpMethod":"POST", "uri": "groups.json", "summary": "Create a group", "parameters":{ "data": { "type": "array", "location": "body", "description":"Group JSON", "filters": "json_encode", "required": true }, "Content-Type":{ "type": "string", "location":"header", "static": "application/json" } } }, "delete_group": { "httpMethod":"DELETE", "uri": "groups/{id}.json", "summary": "Delete a group", "parameters":{ "id":{ "location": "uri", "description":"Group to delete by ID", "type": "integer", "required": true } } }, "get_group": { "httpMethod":"GET", "uri": "groups/{id}.json", "summary": "Get a ticket", "parameters":{ "id":{ "location": "uri", "description":"Group to get by ID", "type": "integer", "required": true } } }, "update_group": { "httpMethod":"PUT", "uri": "groups/{id}.json", "summary": "Update a group", "parameters":{ "id": { "location": "uri", "description":"Group to update by ID", "type": "integer", "required": true }, "data": { "type": "array", "location": "body", "description":"Group JSON", "filters": "json_encode", "required": true }, "Content-Type":{ "type": "string", "location":"header", "static": "application/json" } } } } ``` ### Guzzle\Service\Description\ServiceDescription Commands are now called Operations **Before** ```php use Guzzle\Service\Description\ServiceDescription; $sd = new ServiceDescription(); $sd->getCommands(); // @returns ApiCommandInterface[] $sd->hasCommand($name); $sd->getCommand($name); // @returns ApiCommandInterface|null $sd->addCommand($command); // @param ApiCommandInterface $command ``` **After** ```php use Guzzle\Service\Description\ServiceDescription; $sd = new ServiceDescription(); $sd->getOperations(); // @returns OperationInterface[] $sd->hasOperation($name); $sd->getOperation($name); // @returns OperationInterface|null $sd->addOperation($operation); // @param OperationInterface $operation ``` ### Guzzle\Common\Inflection\Inflector Namespace is now `Guzzle\Inflection\Inflector` ### Guzzle\Http\Plugin Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. ### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. **Before** ```php use Guzzle\Common\Log\ClosureLogAdapter; use Guzzle\Http\Plugin\LogPlugin; /** @var \Guzzle\Http\Client */ $client; // $verbosity is an integer indicating desired message verbosity level $client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); ``` **After** ```php use Guzzle\Log\ClosureLogAdapter; use Guzzle\Log\MessageFormatter; use Guzzle\Plugin\Log\LogPlugin; /** @var \Guzzle\Http\Client */ $client; // $format is a string indicating desired message format -- @see MessageFormatter $client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); ``` ### Guzzle\Http\Plugin\CurlAuthPlugin Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. ### Guzzle\Http\Plugin\ExponentialBackoffPlugin Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. **Before** ```php use Guzzle\Http\Plugin\ExponentialBackoffPlugin; $backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) )); $client->addSubscriber($backoffPlugin); ``` **After** ```php use Guzzle\Plugin\Backoff\BackoffPlugin; use Guzzle\Plugin\Backoff\HttpBackoffStrategy; // Use convenient factory method instead -- see implementation for ideas of what // you can do with chaining backoff strategies $backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( HttpBackoffStrategy::getDefaultFailureCodes(), array(429) )); $client->addSubscriber($backoffPlugin); ``` ### Known Issues #### [BUG] Accept-Encoding header behavior changed unintentionally. (See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. See issue #217 for a workaround, or use a version containing the fix. >>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; /** * @var string Template used to format log messages */ private $template; /** * @param string $template Log message template */ public function __construct(?string $template = self::CLF) { $this->template = $template ?: self::CLF; } /** * Returns a formatted message string. * * @param RequestInterface $request Request that was sent * @param ResponseInterface|null $response Response that was received * @param \Throwable|null $error Exception that was received */ public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string { $cache = []; /** @var string */ return \preg_replace_callback( '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', function (array $matches) use ($request, $response, $error, &$cache) { if (isset($cache[$matches[1]])) { return $cache[$matches[1]]; } $result = ''; switch ($matches[1]) { case 'request': $result = Psr7\Message::toString($request); break; case 'response': $result = $response ? Psr7\Message::toString($response) : ''; break; case 'req_headers': $result = \trim($request->getMethod() .' '.$request->getRequestTarget()) .' HTTP/'.$request->getProtocolVersion()."\r\n" .$this->headers($request); break; case 'res_headers': $result = $response ? \sprintf( 'HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase() )."\r\n".$this->headers($response) : 'NULL'; break; case 'req_body': $result = $request->getBody()->__toString(); break; case 'res_body': if (!$response instanceof ResponseInterface) { $result = 'NULL'; break; } $body = $response->getBody(); if (!$body->isSeekable()) { $result = 'RESPONSE_NOT_LOGGEABLE'; break; } $result = $response->getBody()->__toString(); break; case 'ts': case 'date_iso_8601': $result = \gmdate('c'); break; case 'date_common_log': $result = \date('d/M/Y:H:i:s O'); break; case 'method': $result = $request->getMethod(); break; case 'version': $result = $request->getProtocolVersion(); break; case 'uri': case 'url': $result = $request->getUri()->__toString(); break; case 'target': $result = $request->getRequestTarget(); break; case 'req_version': $result = $request->getProtocolVersion(); break; case 'res_version': $result = $response ? $response->getProtocolVersion() : 'NULL'; break; case 'host': $result = $request->getHeaderLine('Host'); break; case 'hostname': $result = \gethostname(); break; case 'code': $result = $response ? $response->getStatusCode() : 'NULL'; break; case 'phrase': $result = $response ? $response->getReasonPhrase() : 'NULL'; break; case 'error': $result = $error ? $error->getMessage() : 'NULL'; break; default: // handle prefixed dynamic headers if (\strpos($matches[1], 'req_header_') === 0) { $result = $request->getHeaderLine(\substr($matches[1], 11)); } elseif (\strpos($matches[1], 'res_header_') === 0) { $result = $response ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL'; } } $cache[$matches[1]] = $result; return $result; }, $this->template ); } /** * Get headers from message as string */ private function headers(MessageInterface $message): string { $result = ''; foreach ($message->getHeaders() as $name => $values) { $result .= $name.': '.\implode(', ', $values)."\r\n"; } return \trim($result); } } withCookieHeader($request); return $handler($request, $options) ->then( static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface { $cookieJar->extractCookies($request, $response); return $response; } ); }; }; } /** * Middleware that throws exceptions for 4xx or 5xx responses when the * "http_errors" request option is set to true. * * @param BodySummarizerInterface|null $bodySummarizer The body summarizer to use in exception messages. * * @return callable(callable): callable Returns a function that accepts the next handler. */ public static function httpErrors(?BodySummarizerInterface $bodySummarizer = null): callable { return static function (callable $handler) use ($bodySummarizer): callable { return static function ($request, array $options) use ($handler, $bodySummarizer) { if (empty($options['http_errors'])) { return $handler($request, $options); } return $handler($request, $options)->then( static function (ResponseInterface $response) use ($request, $bodySummarizer) { $code = $response->getStatusCode(); if ($code < 400) { return $response; } throw RequestException::create($request, $response, null, [], $bodySummarizer); } ); }; }; } /** * Middleware that pushes history data to an ArrayAccess container. * * @param array|\ArrayAccess $container Container to hold the history (by reference). * * @return callable(callable): callable Returns a function that accepts the next handler. * * @throws \InvalidArgumentException if container is not an array or ArrayAccess. */ public static function history(&$container): callable { if (!\is_array($container) && !$container instanceof \ArrayAccess) { throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); } return static function (callable $handler) use (&$container): callable { return static function (RequestInterface $request, array $options) use ($handler, &$container) { return $handler($request, $options)->then( static function ($value) use ($request, &$container, $options) { $container[] = [ 'request' => $request, 'response' => $value, 'error' => null, 'options' => $options, ]; return $value; }, static function ($reason) use ($request, &$container, $options) { $container[] = [ 'request' => $request, 'response' => null, 'error' => $reason, 'options' => $options, ]; return P\Create::rejectionFor($reason); } ); }; }; } /** * Middleware that invokes a callback before and after sending a request. * * The provided listener cannot modify or alter the response. It simply * "taps" into the chain to be notified before returning the promise. The * before listener accepts a request and options array, and the after * listener accepts a request, options array, and response promise. * * @param callable $before Function to invoke before forwarding the request. * @param callable $after Function invoked after forwarding. * * @return callable Returns a function that accepts the next handler. */ public static function tap(?callable $before = null, ?callable $after = null): callable { return static function (callable $handler) use ($before, $after): callable { return static function (RequestInterface $request, array $options) use ($handler, $before, $after) { if ($before) { $before($request, $options); } $response = $handler($request, $options); if ($after) { $after($request, $options, $response); } return $response; }; }; } /** * Middleware that handles request redirects. * * @return callable Returns a function that accepts the next handler. */ public static function redirect(): callable { return static function (callable $handler): RedirectMiddleware { return new RedirectMiddleware($handler); }; } /** * Middleware that retries requests based on the boolean result of * invoking the provided "decider" function. * * If no delay function is provided, a simple implementation of exponential * backoff will be utilized. * * @param callable $decider Function that accepts the number of retries, * a request, [response], and [exception] and * returns true if the request is to be retried. * @param callable $delay Function that accepts the number of retries and * returns the number of milliseconds to delay. * * @return callable Returns a function that accepts the next handler. */ public static function retry(callable $decider, ?callable $delay = null): callable { return static function (callable $handler) use ($decider, $delay): RetryMiddleware { return new RetryMiddleware($decider, $handler, $delay); }; } /** * Middleware that logs requests, responses, and errors using a message * formatter. * * @param LoggerInterface $logger Logs messages. * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * * @phpstan-param \Psr\Log\LogLevel::* $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info'): callable { // To be compatible with Guzzle 7.1.x we need to allow users to pass a MessageFormatter if (!$formatter instanceof MessageFormatter && !$formatter instanceof MessageFormatterInterface) { throw new \LogicException(sprintf('Argument 2 to %s::log() must be of type %s', self::class, MessageFormatterInterface::class)); } return static function (callable $handler) use ($logger, $formatter, $logLevel): callable { return static function (RequestInterface $request, array $options = []) use ($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then( static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, static function ($reason) use ($logger, $request, $formatter): PromiseInterface { $response = $reason instanceof RequestException ? $reason->getResponse() : null; $message = $formatter->format($request, $response, P\Create::exceptionFor($reason)); $logger->error($message); return P\Create::rejectionFor($reason); } ); }; }; } /** * This middleware adds a default content-type if possible, a default * content-length or transfer-encoding header, and the expect header. */ public static function prepareBody(): callable { return static function (callable $handler): PrepareBodyMiddleware { return new PrepareBodyMiddleware($handler); }; } /** * Middleware that applies a map function to the request before passing to * the next handler. * * @param callable $fn Function that accepts a RequestInterface and returns * a RequestInterface. */ public static function mapRequest(callable $fn): callable { return static function (callable $handler) use ($fn): callable { return static function (RequestInterface $request, array $options) use ($handler, $fn) { return $handler($fn($request), $options); }; }; } /** * Middleware that applies a map function to the resolved promise's * response. * * @param callable $fn Function that accepts a ResponseInterface and * returns a ResponseInterface. */ public static function mapResponse(callable $fn): callable { return static function (callable $handler) use ($fn): callable { return static function (RequestInterface $request, array $options) use ($handler, $fn) { return $handler($request, $options)->then($fn); }; }; } } $rfn) { if ($rfn instanceof RequestInterface) { yield $key => $client->sendAsync($rfn, $opts); } elseif (\is_callable($rfn)) { yield $key => $rfn($opts); } else { throw new \InvalidArgumentException('Each value yielded by the iterator must be a Psr7\Http\Message\RequestInterface or a callable that returns a promise that fulfills with a Psr7\Message\Http\ResponseInterface object.'); } } }; $this->each = new EachPromise($requests(), $config); } /** * Get promise */ public function promise(): PromiseInterface { return $this->each->promise(); } /** * Sends multiple requests concurrently and returns an array of responses * and exceptions that uses the same ordering as the provided requests. * * IMPORTANT: This method keeps every request and response in memory, and * as such, is NOT recommended when sending a large number or an * indeterminate number of requests concurrently. * * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in * {@see Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. * * @throws \InvalidArgumentException if the event format is incorrect. */ public static function batch(ClientInterface $client, $requests, array $options = []): array { $res = []; self::cmpCallback($options, 'fulfilled', $res); self::cmpCallback($options, 'rejected', $res); $pool = new static($client, $requests, $options); $pool->promise()->wait(); \ksort($res); return $res; } /** * Execute callback(s) */ private static function cmpCallback(array &$options, string $name, array &$results): void { if (!isset($options[$name])) { $options[$name] = static function ($v, $k) use (&$results) { $results[$k] = $v; }; } else { $currentFn = $options[$name]; $options[$name] = static function ($v, $k) use (&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; } } } factory = $options['handle_factory'] ?? new CurlFactory(3); } public function __invoke(RequestInterface $request, array $options): PromiseInterface { if (isset($options['delay'])) { \usleep($options['delay'] * 1000); } $easy = $this->factory->create($request, $options); \curl_exec($easy->handle); $easy->errno = \curl_errno($easy->handle); return CurlFactory::finish($this, $easy, $this->factory); } } An array of delay times, indexed by handle id in `addRequest`. * * @see CurlMultiHandler::addRequest */ private $delays = []; /** * @var array An associative array of CURLMOPT_* options and corresponding values for curl_multi_setopt() */ private $options = []; /** @var resource|\CurlMultiHandle */ private $_mh; /** * This handler accepts the following options: * * - handle_factory: An optional factory used to create curl handles * - select_timeout: Optional timeout (in seconds) to block before timing * out while selecting curl handles. Defaults to 1 second. * - options: An associative array of CURLMOPT_* options and * corresponding values for curl_multi_setopt() */ public function __construct(array $options = []) { $this->factory = $options['handle_factory'] ?? new CurlFactory(50); if (isset($options['select_timeout'])) { $this->selectTimeout = $options['select_timeout']; } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { @trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED); $this->selectTimeout = (int) $selectTimeout; } else { $this->selectTimeout = 1; } $this->options = $options['options'] ?? []; // unsetting the property forces the first access to go through // __get(). unset($this->_mh); } /** * @param string $name * * @return resource|\CurlMultiHandle * * @throws \BadMethodCallException when another field as `_mh` will be gotten * @throws \RuntimeException when curl can not initialize a multi handle */ public function __get($name) { if ($name !== '_mh') { throw new \BadMethodCallException("Can not get other property as '_mh'."); } $multiHandle = \curl_multi_init(); if (false === $multiHandle) { throw new \RuntimeException('Can not initialize curl multi handle.'); } $this->_mh = $multiHandle; foreach ($this->options as $option => $value) { // A warning is raised in case of a wrong option. curl_multi_setopt($this->_mh, $option, $value); } return $this->_mh; } public function __destruct() { if (isset($this->_mh)) { \curl_multi_close($this->_mh); unset($this->_mh); } } public function __invoke(RequestInterface $request, array $options): PromiseInterface { $easy = $this->factory->create($request, $options); $id = (int) $easy->handle; $promise = new Promise( [$this, 'execute'], function () use ($id) { return $this->cancel($id); } ); $this->addRequest(['easy' => $easy, 'deferred' => $promise]); return $promise; } /** * Ticks the curl event loop. */ public function tick(): void { // Add any delayed handles if needed. if ($this->delays) { $currentTime = Utils::currentTime(); foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); \curl_multi_add_handle( $this->_mh, $this->handles[$id]['easy']->handle ); } } } // Run curl_multi_exec in the queue to enable other async tasks to run P\Utils::queue()->add(Closure::fromCallable([$this, 'tickInQueue'])); // Step through the task queue which may add additional requests. P\Utils::queue()->run(); if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { // Perform a usleep if a select returns -1. // See: https://bugs.php.net/bug.php?id=61141 \usleep(250); } while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { // Prevent busy looping for slow HTTP requests. \curl_multi_select($this->_mh, $this->selectTimeout); } $this->processMessages(); } /** * Runs \curl_multi_exec() inside the event loop, to prevent busy looping */ private function tickInQueue(): void { if (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { \curl_multi_select($this->_mh, 0); P\Utils::queue()->add(Closure::fromCallable([$this, 'tickInQueue'])); } } /** * Runs until all outstanding connections have completed. */ public function execute(): void { $queue = P\Utils::queue(); while ($this->handles || !$queue->isEmpty()) { // If there are no transfers, then sleep for the next delay if (!$this->active && $this->delays) { \usleep($this->timeToNext()); } $this->tick(); } } private function addRequest(array $entry): void { $easy = $entry['easy']; $id = (int) $easy->handle; $this->handles[$id] = $entry; if (empty($easy->options['delay'])) { \curl_multi_add_handle($this->_mh, $easy->handle); } else { $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000); } } /** * Cancels a handle from sending and removes references to it. * * @param int $id Handle ID to cancel and remove. * * @return bool True on success, false on failure. */ private function cancel($id): bool { if (!is_int($id)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } // Cannot cancel if it has been processed. if (!isset($this->handles[$id])) { return false; } $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); \curl_multi_remove_handle($this->_mh, $handle); if (PHP_VERSION_ID < 80000) { \curl_close($handle); } return true; } private function processMessages(): void { while ($done = \curl_multi_info_read($this->_mh)) { if ($done['msg'] !== \CURLMSG_DONE) { // if it's not done, then it would be premature to remove the handle. ref https://github.com/guzzle/guzzle/pull/2892#issuecomment-945150216 continue; } $id = (int) $done['handle']; \curl_multi_remove_handle($this->_mh, $done['handle']); if (!isset($this->handles[$id])) { // Probably was cancelled. continue; } $entry = $this->handles[$id]; unset($this->handles[$id], $this->delays[$id]); $entry['easy']->errno = $done['result']; $entry['deferred']->resolve( CurlFactory::finish($this, $entry['easy'], $this->factory) ); } } private function timeToNext(): int { $currentTime = Utils::currentTime(); $nextTime = \PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { $nextTime = $time; } } return ((int) \max(0, $nextTime - $currentTime)) * 1000000; } } getProtocolVersion(); if ('1.0' !== $protocolVersion && '1.1' !== $protocolVersion) { throw new ConnectException(sprintf('HTTP/%s is not supported by the stream handler.', $protocolVersion), $request); } $startTime = isset($options['on_stats']) ? Utils::currentTime() : null; try { // Does not support the expect header. $request = $request->withoutHeader('Expect'); // Append a content-length header if body size is zero to match // the behavior of `CurlHandler` if ( ( 0 === \strcasecmp('PUT', $request->getMethod()) || 0 === \strcasecmp('POST', $request->getMethod()) ) && 0 === $request->getBody()->getSize() ) { $request = $request->withHeader('Content-Length', '0'); } return $this->createResponse( $request, $options, $this->createStream($request, $options), $startTime ); } catch (\InvalidArgumentException $e) { throw $e; } catch (\Exception $e) { // Determine if the error was a networking error. $message = $e->getMessage(); // This list can probably get more comprehensive. if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed || false !== \strpos($message, 'Connection refused') || false !== \strpos($message, "couldn't connect to host") // error on HHVM || false !== \strpos($message, 'connection attempt failed') ) { $e = new ConnectException($e->getMessage(), $request, $e); } else { $e = RequestException::wrapException($request, $e); } $this->invokeStats($options, $request, $startTime, null, $e); return P\Create::rejectionFor($e); } } private function invokeStats( array $options, RequestInterface $request, ?float $startTime, ?ResponseInterface $response = null, ?\Throwable $error = null ): void { if (isset($options['on_stats'])) { $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); ($options['on_stats'])($stats); } } /** * @param resource $stream */ private function createResponse(RequestInterface $request, array $options, $stream, ?float $startTime): PromiseInterface { $hdrs = $this->lastHeaders; $this->lastHeaders = []; try { [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs); } catch (\Exception $e) { return P\Create::rejectionFor( new RequestException('An error was encountered while creating the response', $request, null, $e) ); } [$stream, $headers] = $this->checkDecode($options, $headers, $stream); $stream = Psr7\Utils::streamFor($stream); $sink = $stream; if (\strcasecmp('HEAD', $request->getMethod())) { $sink = $this->createSink($stream, $options); } try { $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); } catch (\Exception $e) { return P\Create::rejectionFor( new RequestException('An error was encountered while creating the response', $request, null, $e) ); } if (isset($options['on_headers'])) { try { $options['on_headers']($response); } catch (\Exception $e) { return P\Create::rejectionFor( new RequestException('An error was encountered during the on_headers event', $request, $response, $e) ); } } // Do not drain when the request is a HEAD request because they have // no body. if ($sink !== $stream) { $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); } $this->invokeStats($options, $request, $startTime, $response, null); return new FulfilledPromise($response); } private function createSink(StreamInterface $stream, array $options): StreamInterface { if (!empty($options['stream'])) { return $stream; } $sink = $options['sink'] ?? Psr7\Utils::tryFopen('php://temp', 'r+'); return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\Utils::streamFor($sink); } /** * @param resource $stream */ private function checkDecode(array $options, array $headers, $stream): array { // Automatically decode responses when instructed. if (!empty($options['decode_content'])) { $normalizedKeys = Utils::normalizeHeaderKeys($headers); if (isset($normalizedKeys['content-encoding'])) { $encoding = $headers[$normalizedKeys['content-encoding']]; if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { $stream = new Psr7\InflateStream(Psr7\Utils::streamFor($stream)); $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; // Remove content-encoding header unset($headers[$normalizedKeys['content-encoding']]); // Fix content-length header if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $length = (int) $stream->getSize(); if ($length === 0) { unset($headers[$normalizedKeys['content-length']]); } else { $headers[$normalizedKeys['content-length']] = [$length]; } } } } } return [$stream, $headers]; } /** * Drains the source stream into the "sink" client option. * * @param string $contentLength Header specifying the amount of * data to read. * * @throws \RuntimeException when the sink option is invalid. */ private function drain(StreamInterface $source, StreamInterface $sink, string $contentLength): StreamInterface { // If a content-length header is provided, then stop reading once // that number of bytes has been read. This can prevent infinitely // reading from a stream when dealing with servers that do not honor // Connection: Close headers. Psr7\Utils::copyToStream( $source, $sink, (\strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 ); $sink->seek(0); $source->close(); return $sink; } /** * Create a resource and check to ensure it was created successfully * * @param callable $callback Callable that returns stream resource * * @return resource * * @throws \RuntimeException on error */ private function createResource(callable $callback) { $errors = []; \set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool { $errors[] = [ 'message' => $msg, 'file' => $file, 'line' => $line, ]; return true; }); try { $resource = $callback(); } finally { \restore_error_handler(); } if (!$resource) { $message = 'Error creating resource: '; foreach ($errors as $err) { foreach ($err as $key => $value) { $message .= "[$key] $value".\PHP_EOL; } } throw new \RuntimeException(\trim($message)); } return $resource; } /** * @return resource */ private function createStream(RequestInterface $request, array $options) { static $methods; if (!$methods) { $methods = \array_flip(\get_class_methods(__CLASS__)); } if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) { throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request); } // HTTP/1.1 streams using the PHP stream wrapper require a // Connection: close header if ($request->getProtocolVersion() === '1.1' && !$request->hasHeader('Connection') ) { $request = $request->withHeader('Connection', 'close'); } // Ensure SSL is verified by default if (!isset($options['verify'])) { $options['verify'] = true; } $params = []; $context = $this->getDefaultContext($request); if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } if (!empty($options)) { foreach ($options as $key => $value) { $method = "add_{$key}"; if (isset($methods[$method])) { $this->{$method}($request, $context, $value, $params); } } } if (isset($options['stream_context'])) { if (!\is_array($options['stream_context'])) { throw new \InvalidArgumentException('stream_context must be an array'); } $context = \array_replace_recursive($context, $options['stream_context']); } // Microsoft NTLM authentication only supported with curl handler if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) { throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); } $uri = $this->resolveHost($request, $options); $contextResource = $this->createResource( static function () use ($context, $params) { return \stream_context_create($context, $params); } ); return $this->createResource( function () use ($uri, $contextResource, $context, $options, $request) { $resource = @\fopen((string) $uri, 'r', false, $contextResource); // See https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_the_http_response_header_predefined_variable if (function_exists('http_get_last_response_headers')) { /** @var array|null */ $http_response_header = \http_get_last_response_headers(); } $this->lastHeaders = $http_response_header ?? []; if (false === $resource) { throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context); } if (isset($options['read_timeout'])) { $readTimeout = $options['read_timeout']; $sec = (int) $readTimeout; $usec = ($readTimeout - $sec) * 100000; \stream_set_timeout($resource, $sec, $usec); } return $resource; } ); } private function resolveHost(RequestInterface $request, array $options): UriInterface { $uri = $request->getUri(); if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { if ('v4' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_A); if (false === $records || !isset($records[0]['ip'])) { throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); } return $uri->withHost($records[0]['ip']); } if ('v6' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_AAAA); if (false === $records || !isset($records[0]['ipv6'])) { throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); } return $uri->withHost('['.$records[0]['ipv6'].']'); } } return $uri; } private function getDefaultContext(RequestInterface $request): array { $headers = ''; foreach ($request->getHeaders() as $name => $value) { foreach ($value as $val) { $headers .= "$name: $val\r\n"; } } $context = [ 'http' => [ 'method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => true, 'follow_location' => 0, ], 'ssl' => [ 'peer_name' => $request->getUri()->getHost(), ], ]; $body = (string) $request->getBody(); if ('' !== $body) { $context['http']['content'] = $body; // Prevent the HTTP handler from adding a Content-Type header. if (!$request->hasHeader('Content-Type')) { $context['http']['header'] .= "Content-Type:\r\n"; } } $context['http']['header'] = \rtrim($context['http']['header']); return $context; } /** * @param mixed $value as passed via Request transfer options. */ private function add_proxy(RequestInterface $request, array &$options, $value, array &$params): void { $uri = null; if (!\is_array($value)) { $uri = $value; } else { $scheme = $request->getUri()->getScheme(); if (isset($value[$scheme])) { if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) { $uri = $value[$scheme]; } } } if (!$uri) { return; } $parsed = $this->parse_proxy($uri); $options['http']['proxy'] = $parsed['proxy']; if ($parsed['auth']) { if (!isset($options['http']['header'])) { $options['http']['header'] = []; } $options['http']['header'] .= "\r\nProxy-Authorization: {$parsed['auth']}"; } } /** * Parses the given proxy URL to make it compatible with the format PHP's stream context expects. */ private function parse_proxy(string $url): array { $parsed = \parse_url($url); if ($parsed !== false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') { if (isset($parsed['host']) && isset($parsed['port'])) { $auth = null; if (isset($parsed['user']) && isset($parsed['pass'])) { $auth = \base64_encode("{$parsed['user']}:{$parsed['pass']}"); } return [ 'proxy' => "tcp://{$parsed['host']}:{$parsed['port']}", 'auth' => $auth ? "Basic {$auth}" : null, ]; } } // Return proxy as-is. return [ 'proxy' => $url, 'auth' => null, ]; } /** * @param mixed $value as passed via Request transfer options. */ private function add_timeout(RequestInterface $request, array &$options, $value, array &$params): void { if ($value > 0) { $options['http']['timeout'] = $value; } } /** * @param mixed $value as passed via Request transfer options. */ private function add_crypto_method(RequestInterface $request, array &$options, $value, array &$params): void { if ( $value === \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT || $value === \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT || $value === \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT || (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT) ) { $options['http']['crypto_method'] = $value; return; } throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided'); } /** * @param mixed $value as passed via Request transfer options. */ private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void { if ($value === false) { $options['ssl']['verify_peer'] = false; $options['ssl']['verify_peer_name'] = false; return; } if (\is_string($value)) { $options['ssl']['cafile'] = $value; if (!\file_exists($value)) { throw new \RuntimeException("SSL CA bundle not found: $value"); } } elseif ($value !== true) { throw new \InvalidArgumentException('Invalid verify request option'); } $options['ssl']['verify_peer'] = true; $options['ssl']['verify_peer_name'] = true; $options['ssl']['allow_self_signed'] = false; } /** * @param mixed $value as passed via Request transfer options. */ private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void { if (\is_array($value)) { $options['ssl']['passphrase'] = $value[1]; $value = $value[0]; } if (!\file_exists($value)) { throw new \RuntimeException("SSL certificate not found: {$value}"); } $options['ssl']['local_cert'] = $value; } /** * @param mixed $value as passed via Request transfer options. */ private function add_progress(RequestInterface $request, array &$options, $value, array &$params): void { self::addNotification( $params, static function ($code, $a, $b, $c, $transferred, $total) use ($value) { if ($code == \STREAM_NOTIFY_PROGRESS) { // The upload progress cannot be determined. Use 0 for cURL compatibility: // https://curl.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html $value($total, $transferred, 0, 0); } } ); } /** * @param mixed $value as passed via Request transfer options. */ private function add_debug(RequestInterface $request, array &$options, $value, array &$params): void { if ($value === false) { return; } static $map = [ \STREAM_NOTIFY_CONNECT => 'CONNECT', \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', \STREAM_NOTIFY_PROGRESS => 'PROGRESS', \STREAM_NOTIFY_FAILURE => 'FAILURE', \STREAM_NOTIFY_COMPLETED => 'COMPLETED', \STREAM_NOTIFY_RESOLVE => 'RESOLVE', ]; static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; $value = Utils::debugResource($value); $ident = $request->getMethod().' '.$request->getUri()->withFragment(''); self::addNotification( $params, static function (int $code, ...$passed) use ($ident, $value, $map, $args): void { \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); foreach (\array_filter($passed) as $i => $v) { \fwrite($value, $args[$i].': "'.$v.'" '); } \fwrite($value, "\n"); } ); } private static function addNotification(array &$params, callable $notify): void { // Wrap the existing function if needed. if (!isset($params['notification'])) { $params['notification'] = $notify; } else { $params['notification'] = self::callArray([ $params['notification'], $notify, ]); } } private static function callArray(array $functions): callable { return static function (...$args) use ($functions) { foreach ($functions as $fn) { $fn(...$args); } }; } } headers); $normalizedKeys = Utils::normalizeHeaderKeys($headers); if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { $headers[$normalizedKeys['content-length']] = $bodyLength; } else { unset($headers[$normalizedKeys['content-length']]); } } } // Attach a response to the easy handle with the parsed headers. $this->response = new Response( $status, $headers, $this->sink, $ver, $reason ); } /** * @param string $name * * @return void * * @throws \BadMethodCallException */ public function __get($name) { $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: '.$name; throw new \BadMethodCallException($msg); } } maxHandles = $maxHandles; } public function create(RequestInterface $request, array $options): EasyHandle { $protocolVersion = $request->getProtocolVersion(); if ('2' === $protocolVersion || '2.0' === $protocolVersion) { if (!self::supportsHttp2()) { throw new ConnectException('HTTP/2 is supported by the cURL handler, however libcurl is built without HTTP/2 support.', $request); } } elseif ('1.0' !== $protocolVersion && '1.1' !== $protocolVersion) { throw new ConnectException(sprintf('HTTP/%s is not supported by the cURL handler.', $protocolVersion), $request); } if (isset($options['curl']['body_as_string'])) { $options['_body_as_string'] = $options['curl']['body_as_string']; unset($options['curl']['body_as_string']); } $easy = new EasyHandle(); $easy->request = $request; $easy->options = $options; $conf = $this->getDefaultConf($easy); $this->applyMethod($easy, $conf); $this->applyHandlerOptions($easy, $conf); $this->applyHeaders($easy, $conf); unset($conf['_headers']); // Add handler options from the request configuration options if (isset($options['curl'])) { $conf = \array_replace($conf, $options['curl']); } $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); curl_setopt_array($easy->handle, $conf); return $easy; } private static function supportsHttp2(): bool { static $supportsHttp2 = null; if (null === $supportsHttp2) { $supportsHttp2 = self::supportsTls12() && defined('CURL_VERSION_HTTP2') && (\CURL_VERSION_HTTP2 & \curl_version()['features']); } return $supportsHttp2; } private static function supportsTls12(): bool { static $supportsTls12 = null; if (null === $supportsTls12) { $supportsTls12 = \CURL_SSLVERSION_TLSv1_2 & \curl_version()['features']; } return $supportsTls12; } private static function supportsTls13(): bool { static $supportsTls13 = null; if (null === $supportsTls13) { $supportsTls13 = defined('CURL_SSLVERSION_TLSv1_3') && (\CURL_SSLVERSION_TLSv1_3 & \curl_version()['features']); } return $supportsTls13; } public function release(EasyHandle $easy): void { $resource = $easy->handle; unset($easy->handle); if (\count($this->handles) >= $this->maxHandles) { if (PHP_VERSION_ID < 80000) { \curl_close($resource); } } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array // does not work for some reason, so removing each one // individually. \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); \curl_setopt($resource, \CURLOPT_READFUNCTION, null); \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); \curl_reset($resource); $this->handles[] = $resource; } } /** * Completes a cURL transaction, either returning a response promise or a * rejected promise. * * @param callable(RequestInterface, array): PromiseInterface $handler * @param CurlFactoryInterface $factory Dictates how the handle is released */ public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface { if (isset($easy->options['on_stats'])) { self::invokeStats($easy); } if (!$easy->response || $easy->errno) { return self::finishError($handler, $easy, $factory); } // Return the response if it is present and there is no error. $factory->release($easy); // Rewind the body of the response if possible. $body = $easy->response->getBody(); if ($body->isSeekable()) { $body->rewind(); } return new FulfilledPromise($easy->response); } private static function invokeStats(EasyHandle $easy): void { $curlStats = \curl_getinfo($easy->handle); $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); $stats = new TransferStats( $easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats ); ($easy->options['on_stats'])($stats); } /** * @param callable(RequestInterface, array): PromiseInterface $handler */ private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface { // Get error information and release the handle to the factory. $ctx = [ 'errno' => $easy->errno, 'error' => \curl_error($easy->handle), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME), ] + \curl_getinfo($easy->handle); $ctx[self::CURL_VERSION_STR] = self::getCurlVersion(); $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { return self::retryFailedRewind($handler, $easy, $ctx); } return self::createRejection($easy, $ctx); } private static function getCurlVersion(): string { static $curlVersion = null; if (null === $curlVersion) { $curlVersion = \curl_version()['version']; } return $curlVersion; } private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface { static $connectionErrors = [ \CURLE_OPERATION_TIMEOUTED => true, \CURLE_COULDNT_RESOLVE_HOST => true, \CURLE_COULDNT_CONNECT => true, \CURLE_SSL_CONNECT_ERROR => true, \CURLE_GOT_NOTHING => true, ]; if ($easy->createResponseException) { return P\Create::rejectionFor( new RequestException( 'An error was encountered while creating the response', $easy->request, $easy->response, $easy->createResponseException, $ctx ) ); } // If an exception was encountered during the onHeaders event, then // return a rejected promise that wraps that exception. if ($easy->onHeadersException) { return P\Create::rejectionFor( new RequestException( 'An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx ) ); } $uri = $easy->request->getUri(); $sanitizedError = self::sanitizeCurlError($ctx['error'] ?? '', $uri); $message = \sprintf( 'cURL error %s: %s (%s)', $ctx['errno'], $sanitizedError, 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' ); if ('' !== $sanitizedError) { $redactedUriString = \GuzzleHttp\Psr7\Utils::redactUserInfo($uri)->__toString(); if ($redactedUriString !== '' && false === \strpos($sanitizedError, $redactedUriString)) { $message .= \sprintf(' for %s', $redactedUriString); } } // Create a connection exception if it was a specific error code. $error = isset($connectionErrors[$easy->errno]) ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); return P\Create::rejectionFor($error); } private static function sanitizeCurlError(string $error, UriInterface $uri): string { if ('' === $error) { return $error; } $baseUri = $uri->withQuery('')->withFragment(''); $baseUriString = $baseUri->__toString(); if ('' === $baseUriString) { return $error; } $redactedUriString = \GuzzleHttp\Psr7\Utils::redactUserInfo($baseUri)->__toString(); return str_replace($baseUriString, $redactedUriString, $error); } /** * @return array */ private function getDefaultConf(EasyHandle $easy): array { $conf = [ '_headers' => $easy->request->getHeaders(), \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), \CURLOPT_RETURNTRANSFER => false, \CURLOPT_HEADER => false, \CURLOPT_CONNECTTIMEOUT => 300, ]; if (\defined('CURLOPT_PROTOCOLS')) { $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; } $version = $easy->request->getProtocolVersion(); if ('2' === $version || '2.0' === $version) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; } elseif ('1.1' === $version) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; } else { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; } return $conf; } private function applyMethod(EasyHandle $easy, array &$conf): void { $body = $easy->request->getBody(); $size = $body->getSize(); if ($size === null || $size > 0) { $this->applyBody($easy->request, $easy->options, $conf); return; } $method = $easy->request->getMethod(); if ($method === 'PUT' || $method === 'POST') { // See https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2 if (!$easy->request->hasHeader('Content-Length')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } } elseif ($method === 'HEAD') { $conf[\CURLOPT_NOBODY] = true; unset( $conf[\CURLOPT_WRITEFUNCTION], $conf[\CURLOPT_READFUNCTION], $conf[\CURLOPT_FILE], $conf[\CURLOPT_INFILE] ); } } private function applyBody(RequestInterface $request, array $options, array &$conf): void { $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null; // Send the body as a string if the size is less than 1MB OR if the // [curl][body_as_string] request value is set. if (($size !== null && $size < 1000000) || !empty($options['_body_as_string'])) { $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); // Don't duplicate the Content-Length header $this->removeHeader('Content-Length', $conf); $this->removeHeader('Transfer-Encoding', $conf); } else { $conf[\CURLOPT_UPLOAD] = true; if ($size !== null) { $conf[\CURLOPT_INFILESIZE] = $size; $this->removeHeader('Content-Length', $conf); } $body = $request->getBody(); if ($body->isSeekable()) { $body->rewind(); } $conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use ($body) { return $body->read($length); }; } // If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader('Expect')) { $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; } // cURL sometimes adds a content-type by default. Prevent this. if (!$request->hasHeader('Content-Type')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; } } private function applyHeaders(EasyHandle $easy, array &$conf): void { foreach ($conf['_headers'] as $name => $values) { foreach ($values as $value) { $value = (string) $value; if ($value === '') { // cURL requires a special format for empty headers. // See https://github.com/guzzle/guzzle/issues/1882 for more details. $conf[\CURLOPT_HTTPHEADER][] = "$name;"; } else { $conf[\CURLOPT_HTTPHEADER][] = "$name: $value"; } } } // Remove the Accept header if one was not set if (!$easy->request->hasHeader('Accept')) { $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; } } /** * Remove a header from the options array. * * @param string $name Case-insensitive header to remove * @param array $options Array of options to modify */ private function removeHeader(string $name, array &$options): void { foreach (\array_keys($options['_headers']) as $key) { if (!\strcasecmp($key, $name)) { unset($options['_headers'][$key]); return; } } } private function applyHandlerOptions(EasyHandle $easy, array &$conf): void { $options = $easy->options; if (isset($options['verify'])) { if ($options['verify'] === false) { unset($conf[\CURLOPT_CAINFO]); $conf[\CURLOPT_SSL_VERIFYHOST] = 0; $conf[\CURLOPT_SSL_VERIFYPEER] = false; } else { $conf[\CURLOPT_SSL_VERIFYHOST] = 2; $conf[\CURLOPT_SSL_VERIFYPEER] = true; if (\is_string($options['verify'])) { // Throw an error if the file/folder/link path is not valid or doesn't exist. if (!\file_exists($options['verify'])) { throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); } // If it's a directory or a link to a directory use CURLOPT_CAPATH. // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. if ( \is_dir($options['verify']) || ( \is_link($options['verify']) === true && ($verifyLink = \readlink($options['verify'])) !== false && \is_dir($verifyLink) ) ) { $conf[\CURLOPT_CAPATH] = $options['verify']; } else { $conf[\CURLOPT_CAINFO] = $options['verify']; } } } } if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) { $accept = $easy->request->getHeaderLine('Accept-Encoding'); if ($accept) { $conf[\CURLOPT_ENCODING] = $accept; } else { // The empty string enables all available decoders and implicitly // sets a matching 'Accept-Encoding' header. $conf[\CURLOPT_ENCODING] = ''; // But as the user did not specify any encoding preference, // let's leave it up to server by preventing curl from sending // the header, which will be interpreted as 'Accept-Encoding: *'. // https://www.rfc-editor.org/rfc/rfc9110#field.accept-encoding $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; } } if (!isset($options['sink'])) { // Use a default temp stream if no sink was set. $options['sink'] = \GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+'); } $sink = $options['sink']; if (!\is_string($sink)) { $sink = \GuzzleHttp\Psr7\Utils::streamFor($sink); } elseif (!\is_dir(\dirname($sink))) { // Ensure that the directory exists before failing in curl. throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); } else { $sink = new LazyOpenStream($sink, 'w+'); } $easy->sink = $sink; $conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use ($sink): int { return $sink->write($write); }; $timeoutRequiresNoSignal = false; if (isset($options['timeout'])) { $timeoutRequiresNoSignal |= $options['timeout'] < 1; $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; } // CURL default value is CURL_IPRESOLVE_WHATEVER if (isset($options['force_ip_resolve'])) { if ('v4' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; } elseif ('v6' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; } } if (isset($options['connect_timeout'])) { $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; } if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { $conf[\CURLOPT_NOSIGNAL] = true; } if (isset($options['proxy'])) { if (!\is_array($options['proxy'])) { $conf[\CURLOPT_PROXY] = $options['proxy']; } else { $scheme = $easy->request->getUri()->getScheme(); if (isset($options['proxy'][$scheme])) { $host = $easy->request->getUri()->getHost(); if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) { unset($conf[\CURLOPT_PROXY]); } else { $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; } } } } if (isset($options['crypto_method'])) { $protocolVersion = $easy->request->getProtocolVersion(); // If HTTP/2, upgrade TLS 1.0 and 1.1 to 1.2 if ('2' === $protocolVersion || '2.0' === $protocolVersion) { if ( \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method'] || \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method'] || \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method'] ) { $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2; } elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) { if (!self::supportsTls13()) { throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL'); } $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3; } else { throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided'); } } elseif (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) { $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0; } elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) { $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1; } elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) { if (!self::supportsTls12()) { throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL'); } $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2; } elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) { if (!self::supportsTls13()) { throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL'); } $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3; } else { throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided'); } } if (isset($options['cert'])) { $cert = $options['cert']; if (\is_array($cert)) { $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; $cert = $cert[0]; } if (!\file_exists($cert)) { throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); } // OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files. // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html $ext = pathinfo($cert, \PATHINFO_EXTENSION); if (preg_match('#^(der|p12)$#i', $ext)) { $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext); } $conf[\CURLOPT_SSLCERT] = $cert; } if (isset($options['ssl_key'])) { if (\is_array($options['ssl_key'])) { if (\count($options['ssl_key']) === 2) { [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key']; } else { [$sslKey] = $options['ssl_key']; } } $sslKey = $sslKey ?? $options['ssl_key']; if (!\file_exists($sslKey)) { throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); } $conf[\CURLOPT_SSLKEY] = $sslKey; } if (isset($options['progress'])) { $progress = $options['progress']; if (!\is_callable($progress)) { throw new \InvalidArgumentException('progress client option must be callable'); } $conf[\CURLOPT_NOPROGRESS] = false; $conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use ($progress) { $progress($downloadSize, $downloaded, $uploadSize, $uploaded); }; } if (!empty($options['debug'])) { $conf[\CURLOPT_STDERR] = Utils::debugResource($options['debug']); $conf[\CURLOPT_VERBOSE] = true; } } /** * This function ensures that a response was set on a transaction. If one * was not set, then the request is retried if possible. This error * typically means you are sending a payload, curl encountered a * "Connection died, retrying a fresh connect" error, tried to rewind the * stream, and then encountered a "necessary data rewind wasn't possible" * error, causing the request to be sent through curl_multi_info_read() * without an error status. * * @param callable(RequestInterface, array): PromiseInterface $handler */ private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx): PromiseInterface { try { // Only rewind if the body has been read from. $body = $easy->request->getBody(); if ($body->tell() > 0) { $body->rewind(); } } catch (\RuntimeException $e) { $ctx['error'] = 'The connection unexpectedly failed without ' .'providing an error. The request would have been retried, ' .'but attempting to rewind the request body failed. ' .'Exception: '.$e; return self::createRejection($easy, $ctx); } // Retry no more than 3 times before giving up. if (!isset($easy->options['_curl_retries'])) { $easy->options['_curl_retries'] = 1; } elseif ($easy->options['_curl_retries'] == 2) { $ctx['error'] = 'The cURL request was retried 3 times ' .'and did not succeed. The most likely reason for the failure ' .'is that cURL was unable to rewind the body of the request ' .'and subsequent retries resulted in the same error. Turn on ' .'the debug option to see what went wrong. See ' .'https://bugs.php.net/bug.php?id=47204 for more information.'; return self::createRejection($easy, $ctx); } else { ++$easy->options['_curl_retries']; } return $handler($easy->request, $easy->options); } private function createHeaderFn(EasyHandle $easy): callable { if (isset($easy->options['on_headers'])) { $onHeaders = $easy->options['on_headers']; if (!\is_callable($onHeaders)) { throw new \InvalidArgumentException('on_headers must be callable'); } } else { $onHeaders = null; } return static function ($ch, $h) use ( $onHeaders, $easy, &$startingResponse ) { $value = \trim($h); if ($value === '') { $startingResponse = true; try { $easy->createResponse(); } catch (\Exception $e) { $easy->createResponseException = $e; return -1; } if ($onHeaders !== null) { try { $onHeaders($easy->response); } catch (\Exception $e) { // Associate the exception with the handle and trigger // a curl header write error by returning 0. $easy->onHeadersException = $e; return -1; } } } elseif ($startingResponse) { $startingResponse = false; $easy->headers = [$value]; } else { $easy->headers[] = $value; } return \strlen($h); }; } public function __destruct() { foreach ($this->handles as $id => $handle) { if (PHP_VERSION_ID < 80000) { \curl_close($handle); } unset($this->handles[$id]); } } } |null $queue The parameters to be passed to the append function, as an indexed array. * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. * @param callable|null $onRejected Callback to invoke when the return value is rejected. */ public function __construct(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null) { $this->onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($queue) { // array_values included for BC $this->append(...array_values($queue)); } } public function __invoke(RequestInterface $request, array $options): PromiseInterface { if (!$this->queue) { throw new \OutOfBoundsException('Mock queue is empty'); } if (isset($options['delay']) && \is_numeric($options['delay'])) { \usleep((int) $options['delay'] * 1000); } $this->lastRequest = $request; $this->lastOptions = $options; $response = \array_shift($this->queue); if (isset($options['on_headers'])) { if (!\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $response = new RequestException($msg, $request, $response, $e); } } if (\is_callable($response)) { $response = $response($request, $options); } $response = $response instanceof \Throwable ? P\Create::rejectionFor($response) : P\Create::promiseFor($response); return $response->then( function (?ResponseInterface $value) use ($request, $options) { $this->invokeStats($request, $options, $value); if ($this->onFulfilled) { ($this->onFulfilled)($value); } if ($value !== null && isset($options['sink'])) { $contents = (string) $value->getBody(); $sink = $options['sink']; if (\is_resource($sink)) { \fwrite($sink, $contents); } elseif (\is_string($sink)) { \file_put_contents($sink, $contents); } elseif ($sink instanceof StreamInterface) { $sink->write($contents); } } return $value; }, function ($reason) use ($request, $options) { $this->invokeStats($request, $options, null, $reason); if ($this->onRejected) { ($this->onRejected)($reason); } return P\Create::rejectionFor($reason); } ); } /** * Adds one or more variadic requests, exceptions, callables, or promises * to the queue. * * @param mixed ...$values */ public function append(...$values): void { foreach ($values as $value) { if ($value instanceof ResponseInterface || $value instanceof \Throwable || $value instanceof PromiseInterface || \is_callable($value) ) { $this->queue[] = $value; } else { throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found '.Utils::describeType($value)); } } } /** * Get the last received request. */ public function getLastRequest(): ?RequestInterface { return $this->lastRequest; } /** * Get the last received request options. */ public function getLastOptions(): array { return $this->lastOptions; } /** * Returns the number of remaining items in the queue. */ public function count(): int { return \count($this->queue); } public function reset(): void { $this->queue = []; } /** * @param mixed $reason Promise or reason. */ private function invokeStats( RequestInterface $request, array $options, ?ResponseInterface $response = null, $reason = null ): void { if (isset($options['on_stats'])) { $transferTime = $options['transfer_time'] ?? 0; $stats = new TransferStats($request, $response, $transferTime, $reason); ($options['on_stats'])($stats); } } } filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; if (\file_exists($cookieFile)) { $this->load($cookieFile); } } /** * Saves the file when shutting down */ public function __destruct() { $this->save($this->filename); } /** * Saves the cookies to a file. * * @param string $filename File to save * * @throws \RuntimeException if the file cannot be found or created */ public function save(string $filename): void { $json = []; /** @var SetCookie $cookie */ foreach ($this as $cookie) { if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $jsonStr = Utils::jsonEncode($json); if (false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } /** * Load cookies from a JSON formatted file. * * Old cookies are kept unless overwritten by newly loaded ones. * * @param string $filename Cookie file to load. * * @throws \RuntimeException if the file cannot be loaded. */ public function load(string $filename): void { $json = \file_get_contents($filename); if (false === $json) { throw new \RuntimeException("Unable to load file {$filename}"); } if ($json === '') { return; } $data = Utils::jsonDecode($json, true); if (\is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\is_scalar($data) && !empty($data)) { throw new \RuntimeException("Invalid cookie file: {$filename}"); } } } sessionKey = $sessionKey; $this->storeSessionCookies = $storeSessionCookies; $this->load(); } /** * Saves cookies to session when shutting down */ public function __destruct() { $this->save(); } /** * Save cookies to the client session */ public function save(): void { $json = []; /** @var SetCookie $cookie */ foreach ($this as $cookie) { if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $_SESSION[$this->sessionKey] = \json_encode($json); } /** * Load the contents of the client session into the data array */ protected function load(): void { if (!isset($_SESSION[$this->sessionKey])) { return; } $data = \json_decode($_SESSION[$this->sessionKey], true); if (\is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException('Invalid cookie data'); } } } null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => false, 'Discard' => false, 'HttpOnly' => false, ]; /** * @var array Cookie data */ private $data; /** * Create a new SetCookie object from a string. * * @param string $cookie Set-Cookie header string */ public static function fromString(string $cookie): self { // Create the default return array $data = self::$defaults; // Explode the cookie string using a series of semicolons $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); // The name of the cookie (first kvp) must exist and include an equal sign. if (!isset($pieces[0]) || \strpos($pieces[0], '=') === false) { return new self($data); } // Add the cookie pieces into the parsed data array foreach ($pieces as $part) { $cookieParts = \explode('=', $part, 2); $key = \trim($cookieParts[0]); $value = isset($cookieParts[1]) ? \trim($cookieParts[1], " \n\r\t\0\x0B") : true; // Only check for non-cookies when cookies have been found if (!isset($data['Name'])) { $data['Name'] = $key; $data['Value'] = $value; } else { foreach (\array_keys(self::$defaults) as $search) { if (!\strcasecmp($search, $key)) { if ($search === 'Max-Age') { if (is_numeric($value)) { $data[$search] = (int) $value; } } elseif ($search === 'Secure' || $search === 'Discard' || $search === 'HttpOnly') { if ($value) { $data[$search] = true; } } else { $data[$search] = $value; } continue 2; } } $data[$key] = $value; } } return new self($data); } /** * @param array $data Array of cookie data provided by a Cookie parser */ public function __construct(array $data = []) { $this->data = self::$defaults; if (isset($data['Name'])) { $this->setName($data['Name']); } if (isset($data['Value'])) { $this->setValue($data['Value']); } if (isset($data['Domain'])) { $this->setDomain($data['Domain']); } if (isset($data['Path'])) { $this->setPath($data['Path']); } if (isset($data['Max-Age'])) { $this->setMaxAge($data['Max-Age']); } if (isset($data['Expires'])) { $this->setExpires($data['Expires']); } if (isset($data['Secure'])) { $this->setSecure($data['Secure']); } if (isset($data['Discard'])) { $this->setDiscard($data['Discard']); } if (isset($data['HttpOnly'])) { $this->setHttpOnly($data['HttpOnly']); } // Set the remaining values that don't have extra validation logic foreach (array_diff(array_keys($data), array_keys(self::$defaults)) as $key) { $this->data[$key] = $data[$key]; } // Extract the Expires value and turn it into a UNIX timestamp if needed if (!$this->getExpires() && $this->getMaxAge()) { // Calculate the Expires date $this->setExpires(\time() + $this->getMaxAge()); } elseif (null !== ($expires = $this->getExpires()) && !\is_numeric($expires)) { $this->setExpires($expires); } } public function __toString() { $str = $this->data['Name'].'='.($this->data['Value'] ?? '').'; '; foreach ($this->data as $k => $v) { if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { if ($k === 'Expires') { $str .= 'Expires='.\gmdate('D, d M Y H:i:s \G\M\T', $v).'; '; } else { $str .= ($v === true ? $k : "{$k}={$v}").'; '; } } } return \rtrim($str, '; '); } public function toArray(): array { return $this->data; } /** * Get the cookie name. * * @return string */ public function getName() { return $this->data['Name']; } /** * Set the cookie name. * * @param string $name Cookie name */ public function setName($name): void { if (!is_string($name)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Name'] = (string) $name; } /** * Get the cookie value. * * @return string|null */ public function getValue() { return $this->data['Value']; } /** * Set the cookie value. * * @param string $value Cookie value */ public function setValue($value): void { if (!is_string($value)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Value'] = (string) $value; } /** * Get the domain. * * @return string|null */ public function getDomain() { return $this->data['Domain']; } /** * Set the domain of the cookie. * * @param string|null $domain */ public function setDomain($domain): void { if (!is_string($domain) && null !== $domain) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Domain'] = null === $domain ? null : (string) $domain; } /** * Get the path. * * @return string */ public function getPath() { return $this->data['Path']; } /** * Set the path of the cookie. * * @param string $path Path of the cookie */ public function setPath($path): void { if (!is_string($path)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Path'] = (string) $path; } /** * Maximum lifetime of the cookie in seconds. * * @return int|null */ public function getMaxAge() { return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age']; } /** * Set the max-age of the cookie. * * @param int|null $maxAge Max age of the cookie in seconds */ public function setMaxAge($maxAge): void { if (!is_int($maxAge) && null !== $maxAge) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge; } /** * The UNIX timestamp when the cookie Expires. * * @return string|int|null */ public function getExpires() { return $this->data['Expires']; } /** * Set the unix timestamp for which the cookie will expire. * * @param int|string|null $timestamp Unix timestamp or any English textual datetime description. */ public function setExpires($timestamp): void { if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Expires'] = null === $timestamp ? null : (\is_numeric($timestamp) ? (int) $timestamp : \strtotime((string) $timestamp)); } /** * Get whether or not this is a secure cookie. * * @return bool */ public function getSecure() { return $this->data['Secure']; } /** * Set whether or not the cookie is secure. * * @param bool $secure Set to true or false if secure */ public function setSecure($secure): void { if (!is_bool($secure)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Secure'] = (bool) $secure; } /** * Get whether or not this is a session cookie. * * @return bool|null */ public function getDiscard() { return $this->data['Discard']; } /** * Set whether or not this is a session cookie. * * @param bool $discard Set to true or false if this is a session cookie */ public function setDiscard($discard): void { if (!is_bool($discard)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['Discard'] = (bool) $discard; } /** * Get whether or not this is an HTTP only cookie. * * @return bool */ public function getHttpOnly() { return $this->data['HttpOnly']; } /** * Set whether or not this is an HTTP only cookie. * * @param bool $httpOnly Set to true or false if this is HTTP only */ public function setHttpOnly($httpOnly): void { if (!is_bool($httpOnly)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->data['HttpOnly'] = (bool) $httpOnly; } /** * Check if the cookie matches a path value. * * A request-path path-matches a given cookie-path if at least one of * the following conditions holds: * * - The cookie-path and the request-path are identical. * - The cookie-path is a prefix of the request-path, and the last * character of the cookie-path is %x2F ("/"). * - The cookie-path is a prefix of the request-path, and the first * character of the request-path that is not included in the cookie- * path is a %x2F ("/") character. * * @param string $requestPath Path to check against */ public function matchesPath(string $requestPath): bool { $cookiePath = $this->getPath(); // Match on exact matches or when path is the default empty "/" if ($cookiePath === '/' || $cookiePath == $requestPath) { return true; } // Ensure that the cookie-path is a prefix of the request path. if (0 !== \strpos($requestPath, $cookiePath)) { return false; } // Match if the last character of the cookie-path is "/" if (\substr($cookiePath, -1, 1) === '/') { return true; } // Match if the first character not included in cookie path is "/" return \substr($requestPath, \strlen($cookiePath), 1) === '/'; } /** * Check if the cookie matches a domain value. * * @param string $domain Domain to check against */ public function matchesDomain(string $domain): bool { $cookieDomain = $this->getDomain(); if (null === $cookieDomain) { return true; } // Remove the leading '.' as per spec in RFC 6265. // https://datatracker.ietf.org/doc/html/rfc6265#section-5.2.3 $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); $domain = \strtolower($domain); // Domain not set or exact match. if ('' === $cookieDomain || $domain === $cookieDomain) { return true; } // Matching the subdomain according to RFC 6265. // https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3 if (\filter_var($domain, \FILTER_VALIDATE_IP)) { return false; } return (bool) \preg_match('/\.'.\preg_quote($cookieDomain, '/').'$/', $domain); } /** * Check if the cookie is expired. */ public function isExpired(): bool { return $this->getExpires() !== null && \time() > $this->getExpires(); } /** * Check if the cookie is valid according to RFC 6265. * * @return bool|string Returns true if valid or an error message if invalid */ public function validate() { $name = $this->getName(); if ($name === '') { return 'The cookie name must not be empty'; } // Check if any of the invalid characters are present in the cookie name if (\preg_match( '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', $name )) { return 'Cookie name must not contain invalid characters: ASCII ' .'Control characters (0-31;127), space, tab and the ' .'following characters: ()<>@,;:\"/?={}'; } // Value must not be null. 0 and empty string are valid. Empty strings // are technically against RFC 6265, but known to happen in the wild. $value = $this->getValue(); if ($value === null) { return 'The cookie value must not be empty'; } // Domains must not be empty, but can be 0. "0" is not a valid internet // domain, but may be used as server name in a private network. $domain = $this->getDomain(); if ($domain === null || $domain === '') { return 'The cookie domain must not be empty'; } return true; } } strictMode = $strictMode; foreach ($cookieArray as $cookie) { if (!($cookie instanceof SetCookie)) { $cookie = new SetCookie($cookie); } $this->setCookie($cookie); } } /** * Create a new Cookie jar from an associative array and domain. * * @param array $cookies Cookies to create the jar from * @param string $domain Domain to set the cookies to */ public static function fromArray(array $cookies, string $domain): self { $cookieJar = new self(); foreach ($cookies as $name => $value) { $cookieJar->setCookie(new SetCookie([ 'Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => true, ])); } return $cookieJar; } /** * Evaluate if this cookie should be persisted to storage * that survives between requests. * * @param SetCookie $cookie Being evaluated. * @param bool $allowSessionCookies If we should persist session cookies */ public static function shouldPersist(SetCookie $cookie, bool $allowSessionCookies = false): bool { if ($cookie->getExpires() || $allowSessionCookies) { if (!$cookie->getDiscard()) { return true; } } return false; } /** * Finds and returns the cookie based on the name * * @param string $name cookie name to search for * * @return SetCookie|null cookie that was found or null if not found */ public function getCookieByName(string $name): ?SetCookie { foreach ($this->cookies as $cookie) { if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { return $cookie; } } return null; } public function toArray(): array { return \array_map(static function (SetCookie $cookie): array { return $cookie->toArray(); }, $this->getIterator()->getArrayCopy()); } public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void { if (!$domain) { $this->cookies = []; return; } elseif (!$path) { $this->cookies = \array_filter( $this->cookies, static function (SetCookie $cookie) use ($domain): bool { return !$cookie->matchesDomain($domain); } ); } elseif (!$name) { $this->cookies = \array_filter( $this->cookies, static function (SetCookie $cookie) use ($path, $domain): bool { return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); } ); } else { $this->cookies = \array_filter( $this->cookies, static function (SetCookie $cookie) use ($path, $domain, $name) { return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); } ); } } public function clearSessionCookies(): void { $this->cookies = \array_filter( $this->cookies, static function (SetCookie $cookie): bool { return !$cookie->getDiscard() && $cookie->getExpires(); } ); } public function setCookie(SetCookie $cookie): bool { // If the name string is empty (but not 0), ignore the set-cookie // string entirely. $name = $cookie->getName(); if (!$name && $name !== '0') { return false; } // Only allow cookies with set and valid domain, name, value $result = $cookie->validate(); if ($result !== true) { if ($this->strictMode) { throw new \RuntimeException('Invalid cookie: '.$result); } $this->removeCookieIfEmpty($cookie); return false; } // Resolve conflicts with previously set cookies foreach ($this->cookies as $i => $c) { // Two cookies are identical, when their path, and domain are // identical. if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName() ) { continue; } // The previously set cookie is a discard cookie and this one is // not so allow the new cookie to be set if (!$cookie->getDiscard() && $c->getDiscard()) { unset($this->cookies[$i]); continue; } // If the new cookie's expiration is further into the future, then // replace the old cookie if ($cookie->getExpires() > $c->getExpires()) { unset($this->cookies[$i]); continue; } // If the value has changed, we better change it if ($cookie->getValue() !== $c->getValue()) { unset($this->cookies[$i]); continue; } // The cookie exists, so no need to continue return false; } $this->cookies[] = $cookie; return true; } public function count(): int { return \count($this->cookies); } /** * @return \ArrayIterator */ public function getIterator(): \ArrayIterator { return new \ArrayIterator(\array_values($this->cookies)); } public function extractCookies(RequestInterface $request, ResponseInterface $response): void { if ($cookieHeader = $response->getHeader('Set-Cookie')) { foreach ($cookieHeader as $cookie) { $sc = SetCookie::fromString($cookie); if (!$sc->getDomain()) { $sc->setDomain($request->getUri()->getHost()); } if (0 !== \strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } if (!$sc->matchesDomain($request->getUri()->getHost())) { continue; } // Note: At this point `$sc->getDomain()` being a public suffix should // be rejected, but we don't want to pull in the full PSL dependency. $this->setCookie($sc); } } } /** * Computes cookie path following RFC 6265 section 5.1.4 * * @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.4 */ private function getCookiePathFromRequest(RequestInterface $request): string { $uriPath = $request->getUri()->getPath(); if ('' === $uriPath) { return '/'; } if (0 !== \strpos($uriPath, '/')) { return '/'; } if ('/' === $uriPath) { return '/'; } $lastSlashPos = \strrpos($uriPath, '/'); if (0 === $lastSlashPos || false === $lastSlashPos) { return '/'; } return \substr($uriPath, 0, $lastSlashPos); } public function withCookieHeader(RequestInterface $request): RequestInterface { $values = []; $uri = $request->getUri(); $scheme = $uri->getScheme(); $host = $uri->getHost(); $path = $uri->getPath() ?: '/'; foreach ($this->cookies as $cookie) { if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https') ) { $values[] = $cookie->getName().'=' .$cookie->getValue(); } } return $values ? $request->withHeader('Cookie', \implode('; ', $values)) : $request; } /** * If a cookie already exists and the server asks to set it again with a * null value, the cookie must be deleted. */ private function removeCookieIfEmpty(SetCookie $cookie): void { $cookieValue = $cookie->getValue(); if ($cookieValue === null || $cookieValue === '') { $this->clear( $cookie->getDomain(), $cookie->getPath(), $cookie->getName() ); } } } */ interface CookieJarInterface extends \Countable, \IteratorAggregate { /** * Create a request with added cookie headers. * * If no matching cookies are found in the cookie jar, then no Cookie * header is added to the request and the same request is returned. * * @param RequestInterface $request Request object to modify. * * @return RequestInterface returns the modified request. */ public function withCookieHeader(RequestInterface $request): RequestInterface; /** * Extract cookies from an HTTP response and store them in the CookieJar. * * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received */ public function extractCookies(RequestInterface $request, ResponseInterface $response): void; /** * Sets a cookie in the cookie jar. * * @param SetCookie $cookie Cookie to set. * * @return bool Returns true on success or false on failure */ public function setCookie(SetCookie $cookie): bool; /** * Remove cookies currently held in the cookie jar. * * Invoking this method without arguments will empty the whole cookie jar. * If given a $domain argument only cookies belonging to that domain will * be removed. If given a $domain and $path argument, cookies belonging to * the specified path within that domain are removed. If given all three * arguments, then the cookie with the specified name, path and domain is * removed. * * @param string|null $domain Clears cookies matching a domain * @param string|null $path Clears cookies matching a domain and path * @param string|null $name Clears cookies matching a domain, path, and name */ public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void; /** * Discard all sessions cookies. * * Removes cookies that don't have an expire field or a have a discard * field set to true. To be called when the user agent shuts down according * to RFC 2965. */ public function clearSessionCookies(): void; /** * Converts the cookie jar to an array. */ public function toArray(): array; } request = $request; $this->response = $response; $this->transferTime = $transferTime; $this->handlerErrorData = $handlerErrorData; $this->handlerStats = $handlerStats; } public function getRequest(): RequestInterface { return $this->request; } /** * Returns the response that was received (if any). */ public function getResponse(): ?ResponseInterface { return $this->response; } /** * Returns true if a response was received. */ public function hasResponse(): bool { return $this->response !== null; } /** * Gets handler specific error data. * * This might be an exception, a integer representing an error code, or * anything else. Relying on this value assumes that you know what handler * you are using. * * @return mixed */ public function getHandlerErrorData() { return $this->handlerErrorData; } /** * Get the effective URI the request was sent to. */ public function getEffectiveUri(): UriInterface { return $this->request->getUri(); } /** * Get the estimated time the request was being transferred by the handler. * * @return float|null Time in seconds. */ public function getTransferTime(): ?float { return $this->transferTime; } /** * Gets an array of all of the handler specific transfer data. */ public function getHandlerStats(): array { return $this->handlerStats; } /** * Get a specific handler statistic from the handler by name. * * @param string $stat Handler specific transfer stat to retrieve. * * @return mixed|null */ public function getHandlerStat(string $stat) { return $this->handlerStats[$stat] ?? null; } } nextHandler = $nextHandler; } public function __invoke(RequestInterface $request, array $options): PromiseInterface { $fn = $this->nextHandler; // Don't do anything if the request has no body. if ($request->getBody()->getSize() === 0) { return $fn($request, $options); } $modify = []; // Add a default content-type if possible. if (!$request->hasHeader('Content-Type')) { if ($uri = $request->getBody()->getMetadata('uri')) { if (is_string($uri) && $type = Psr7\MimeType::fromFilename($uri)) { $modify['set_headers']['Content-Type'] = $type; } } } // Add a default content-length or transfer-encoding header. if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding') ) { $size = $request->getBody()->getSize(); if ($size !== null) { $modify['set_headers']['Content-Length'] = $size; } else { $modify['set_headers']['Transfer-Encoding'] = 'chunked'; } } // Add the expect header if needed. $this->addExpectHeader($request, $options, $modify); return $fn(Psr7\Utils::modifyRequest($request, $modify), $options); } /** * Add expect header */ private function addExpectHeader(RequestInterface $request, array $options, array &$modify): void { // Determine if the Expect header should be used if ($request->hasHeader('Expect')) { return; } $expect = $options['expect'] ?? null; // Return if disabled or using HTTP/1.0 if ($expect === false || $request->getProtocolVersion() === '1.0') { return; } // The expect header is unconditionally enabled if ($expect === true) { $modify['set_headers']['Expect'] = '100-Continue'; return; } // By default, send the expect header when the payload is > 1mb if ($expect === null) { $expect = 1048576; } // Always add if the body cannot be rewound, the size cannot be // determined, or the size is greater than the cutoff threshold $body = $request->getBody(); $size = $body->getSize(); if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { $modify['set_headers']['Expect'] = '100-Continue'; } } } request = $request; $this->handlerContext = $handlerContext; } /** * Get the request that caused the exception */ public function getRequest(): RequestInterface { return $this->request; } /** * Get contextual information about the error from the underlying handler. * * The contents of this array will vary depending on which handler you are * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. */ public function getHandlerContext(): array { return $this->handlerContext; } } getStatusCode() : 0; parent::__construct($message, $code, $previous); $this->request = $request; $this->response = $response; $this->handlerContext = $handlerContext; } /** * Wrap non-RequestExceptions with a RequestException */ public static function wrapException(RequestInterface $request, \Throwable $e): RequestException { return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); } /** * Factory method to create a new exception with a normalized error message * * @param RequestInterface $request Request sent * @param ResponseInterface $response Response received * @param \Throwable|null $previous Previous exception * @param array $handlerContext Optional handler context * @param BodySummarizerInterface|null $bodySummarizer Optional body summarizer */ public static function create( RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $previous = null, array $handlerContext = [], ?BodySummarizerInterface $bodySummarizer = null ): self { if (!$response) { return new self( 'Error completing request', $request, null, $previous, $handlerContext ); } $level = (int) \floor($response->getStatusCode() / 100); if ($level === 4) { $label = 'Client error'; $className = ClientException::class; } elseif ($level === 5) { $label = 'Server error'; $className = ServerException::class; } else { $label = 'Unsuccessful request'; $className = __CLASS__; } $uri = \GuzzleHttp\Psr7\Utils::redactUserInfo($request->getUri()); // Client Error: `GET /` resulted in a `404 Not Found` response: // ... (truncated) $message = \sprintf( '%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri->__toString(), $response->getStatusCode(), $response->getReasonPhrase() ); $summary = ($bodySummarizer ?? new BodySummarizer())->summarize($response); if ($summary !== null) { $message .= ":\n{$summary}\n"; } return new $className($message, $request, $response, $previous, $handlerContext); } /** * Get the request that caused the exception */ public function getRequest(): RequestInterface { return $this->request; } /** * Get the associated response */ public function getResponse(): ?ResponseInterface { return $this->response; } /** * Check if a response was received */ public function hasResponse(): bool { return $this->response !== null; } /** * Get contextual information about the error from the underlying handler. * * The contents of this array will vary depending on which handler you are * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. */ public function getHandlerContext(): array { return $this->handlerContext; } } = 0) { if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); } elseif (\function_exists('curl_exec')) { $handler = new CurlHandler(); } elseif (\function_exists('curl_multi_exec')) { $handler = new CurlMultiHandler(); } } if (\ini_get('allow_url_fopen')) { $handler = $handler ? Proxy::wrapStreaming($handler, new StreamHandler()) : new StreamHandler(); } elseif (!$handler) { throw new \RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.'); } return $handler; } /** * Get the default User-Agent string to use with Guzzle. */ public static function defaultUserAgent(): string { return sprintf('GuzzleHttp/%d', ClientInterface::MAJOR_VERSION); } /** * Returns the default cacert bundle for the current system. * * First, the openssl.cafile and curl.cainfo php.ini settings are checked. * If those settings are not configured, then the common locations for * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X * and Windows are checked. If any of these file locations are found on * disk, they will be utilized. * * Note: the result of this function is cached for subsequent calls. * * @throws \RuntimeException if no bundle can be found. * * @deprecated Utils::defaultCaBundle will be removed in guzzlehttp/guzzle:8.0. This method is not needed in PHP 5.6+. */ public static function defaultCaBundle(): string { static $cached = null; static $cafiles = [ // Red Hat, CentOS, Fedora (provided by the ca-certificates package) '/etc/pki/tls/certs/ca-bundle.crt', // Ubuntu, Debian (provided by the ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // FreeBSD (provided by the ca_root_nss package) '/usr/local/share/certs/ca-root-nss.crt', // SLES 12 (provided by the ca-certificates package) '/var/lib/ca-certificates/ca-bundle.pem', // OS X provided by homebrew (using the default path) '/usr/local/etc/openssl/cert.pem', // Google app engine '/etc/ca-certificates.crt', // Windows? 'C:\\windows\\system32\\curl-ca-bundle.crt', 'C:\\windows\\curl-ca-bundle.crt', ]; if ($cached) { return $cached; } if ($ca = \ini_get('openssl.cafile')) { return $cached = $ca; } if ($ca = \ini_get('curl.cainfo')) { return $cached = $ca; } foreach ($cafiles as $filename) { if (\file_exists($filename)) { return $cached = $filename; } } throw new \RuntimeException( <<< EOT No system CA bundle could be found in any of the the common system locations. PHP versions earlier than 5.6 are not properly configured to use the system's CA bundle by default. In order to verify peer certificates, you will need to supply the path on disk to a certificate bundle to the 'verify' request option: https://docs.guzzlephp.org/en/latest/request-options.html#verify. If you do not need a specific certificate bundle, then Mozilla provides a commonly used CA bundle which can be downloaded here (provided by the maintainer of cURL): https://curl.haxx.se/ca/cacert.pem. Once you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP ini setting to point to the path to the file, allowing you to omit the 'verify' request option. See https://curl.haxx.se/docs/sslcerts.html for more information. EOT ); } /** * Creates an associative array of lowercase header names to the actual * header casing. */ public static function normalizeHeaderKeys(array $headers): array { $result = []; foreach (\array_keys($headers) as $key) { $result[\strtolower($key)] = $key; } return $result; } /** * Returns true if the provided host matches any of the no proxy areas. * * This method will strip a port from the host if it is present. Each pattern * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == * "baz.foo.com", but ".foo.com" != "foo.com"). * * Areas are matched in the following cases: * 1. "*" (without quotes) always matches any hosts. * 2. An exact match. * 3. The area starts with "." and the area is the last part of the host. e.g. * '.mit.edu' will match any host that ends with '.mit.edu'. * * @param string $host Host to check against the patterns. * @param string[] $noProxyArray An array of host patterns. * * @throws InvalidArgumentException */ public static function isHostInNoProxy(string $host, array $noProxyArray): bool { if (\strlen($host) === 0) { throw new InvalidArgumentException('Empty host provided'); } // Strip port if present. [$host] = \explode(':', $host, 2); foreach ($noProxyArray as $area) { // Always match on wildcards. if ($area === '*') { return true; } if (empty($area)) { // Don't match on empty values. continue; } if ($area === $host) { // Exact matches. return true; } // Special match if the area when prefixed with ".". Remove any // existing leading "." and add a new leading ".". $area = '.'.\ltrim($area, '.'); if (\substr($host, -\strlen($area)) === $area) { return true; } } return false; } /** * Wrapper for json_decode that throws when an error occurs. * * @param string $json JSON data to parse * @param bool $assoc When true, returned objects will be converted * into associative arrays. * @param int $depth User specified recursion depth. * @param int $options Bitmask of JSON decode options. * * @return object|array|string|int|float|bool|null * * @throws InvalidArgumentException if the JSON cannot be decoded. * * @see https://www.php.net/manual/en/function.json-decode.php */ public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0) { $data = \json_decode($json, $assoc, $depth, $options); if (\JSON_ERROR_NONE !== \json_last_error()) { throw new InvalidArgumentException('json_decode error: '.\json_last_error_msg()); } return $data; } /** * Wrapper for JSON encoding that throws when an error occurs. * * @param mixed $value The value being encoded * @param int $options JSON encode option bitmask * @param int $depth Set the maximum depth. Must be greater than zero. * * @throws InvalidArgumentException if the JSON cannot be encoded. * * @see https://www.php.net/manual/en/function.json-encode.php */ public static function jsonEncode($value, int $options = 0, int $depth = 512): string { $json = \json_encode($value, $options, $depth); if (\JSON_ERROR_NONE !== \json_last_error()) { throw new InvalidArgumentException('json_encode error: '.\json_last_error_msg()); } /** @var string */ return $json; } /** * Wrapper for the hrtime() or microtime() functions * (depending on the PHP version, one of the two is used) * * @return float UNIX timestamp * * @internal */ public static function currentTime(): float { return (float) \function_exists('hrtime') ? \hrtime(true) / 1e9 : \microtime(true); } /** * @throws InvalidArgumentException * * @internal */ public static function idnUriConvert(UriInterface $uri, int $options = 0): UriInterface { if ($uri->getHost()) { $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); if ($asciiHost === false) { $errorBitSet = $info['errors'] ?? 0; $errorConstants = array_filter(array_keys(get_defined_constants()), static function (string $name): bool { return substr($name, 0, 11) === 'IDNA_ERROR_'; }); $errors = []; foreach ($errorConstants as $errorConstant) { if ($errorBitSet & constant($errorConstant)) { $errors[] = $errorConstant; } } $errorMessage = 'IDN conversion failed'; if ($errors) { $errorMessage .= ' (errors: '.implode(', ', $errors).')'; } throw new InvalidArgumentException($errorMessage); } if ($uri->getHost() !== $asciiHost) { // Replace URI only if the ASCII version is different $uri = $uri->withHost($asciiHost); } } return $uri; } /** * @internal */ public static function getenv(string $name): ?string { if (isset($_SERVER[$name])) { return (string) $_SERVER[$name]; } if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== false && $value !== null) { return (string) $value; } return null; } /** * @return string|false */ private static function idnToAsci(string $domain, int $options, ?array &$info = []) { if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) { return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); } throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old'); } } 5, 'protocols' => ['http', 'https'], 'strict' => false, 'referer' => false, 'track_redirects' => false, ]; /** * @var callable(RequestInterface, array): PromiseInterface */ private $nextHandler; /** * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. */ public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } public function __invoke(RequestInterface $request, array $options): PromiseInterface { $fn = $this->nextHandler; if (empty($options['allow_redirects'])) { return $fn($request, $options); } if ($options['allow_redirects'] === true) { $options['allow_redirects'] = self::$defaultSettings; } elseif (!\is_array($options['allow_redirects'])) { throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); } else { // Merge the default settings with the provided settings $options['allow_redirects'] += self::$defaultSettings; } if (empty($options['allow_redirects']['max'])) { return $fn($request, $options); } return $fn($request, $options) ->then(function (ResponseInterface $response) use ($request, $options) { return $this->checkRedirect($request, $options, $response); }); } /** * @return ResponseInterface|PromiseInterface */ public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) { if (\strpos((string) $response->getStatusCode(), '3') !== 0 || !$response->hasHeader('Location') ) { return $response; } $this->guardMax($request, $response, $options); $nextRequest = $this->modifyRequest($request, $options, $response); // If authorization is handled by curl, unset it if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) { unset( $options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD] ); } if (isset($options['allow_redirects']['on_redirect'])) { ($options['allow_redirects']['on_redirect'])( $request, $response, $nextRequest->getUri() ); } $promise = $this($nextRequest, $options); // Add headers to be able to track history of redirects. if (!empty($options['allow_redirects']['track_redirects'])) { return $this->withTracking( $promise, (string) $nextRequest->getUri(), $response->getStatusCode() ); } return $promise; } /** * Enable tracking on promise. */ private function withTracking(PromiseInterface $promise, string $uri, int $statusCode): PromiseInterface { return $promise->then( static function (ResponseInterface $response) use ($uri, $statusCode) { // Note that we are pushing to the front of the list as this // would be an earlier response than what is currently present // in the history header. $historyHeader = $response->getHeader(self::HISTORY_HEADER); $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); \array_unshift($historyHeader, $uri); \array_unshift($statusHeader, (string) $statusCode); return $response->withHeader(self::HISTORY_HEADER, $historyHeader) ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); } ); } /** * Check for too many redirects. * * @throws TooManyRedirectsException Too many redirects. */ private function guardMax(RequestInterface $request, ResponseInterface $response, array &$options): void { $current = $options['__redirect_count'] ?? 0; $options['__redirect_count'] = $current + 1; $max = $options['allow_redirects']['max']; if ($options['__redirect_count'] > $max) { throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request, $response); } } public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response): RequestInterface { // Request modifications to apply. $modify = []; $protocols = $options['allow_redirects']['protocols']; // Use a GET request if this is an entity enclosing request and we are // not forcing RFC compliance, but rather emulating what all browsers // would do. $statusCode = $response->getStatusCode(); if ($statusCode == 303 || ($statusCode <= 302 && !$options['allow_redirects']['strict']) ) { $safeMethods = ['GET', 'HEAD', 'OPTIONS']; $requestMethod = $request->getMethod(); $modify['method'] = in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET'; $modify['body'] = ''; } $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } $modify['uri'] = $uri; Psr7\Message::rewindBody($request); // Add the Referer header if it is told to do so and only // add the header if we are not redirecting from https to http. if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme() ) { $uri = $request->getUri()->withUserInfo(''); $modify['set_headers']['Referer'] = (string) $uri; } else { $modify['remove_headers'][] = 'Referer'; } // Remove Authorization and Cookie headers if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { $modify['remove_headers'][] = 'Authorization'; $modify['remove_headers'][] = 'Cookie'; } return Psr7\Utils::modifyRequest($request, $modify); } /** * Set the appropriate URL on the request based on the location header. */ private static function redirectUri( RequestInterface $request, ResponseInterface $response, array $protocols ): UriInterface { $location = Psr7\UriResolver::resolve( $request->getUri(), new Psr7\Uri($response->getHeaderLine('Location')) ); // Ensure that the redirect URI is allowed based on the protocols. if (!\in_array($location->getScheme(), $protocols)) { throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); } return $location; } } request('GET', $uri, $options); } /** * Create and send an HTTP HEAD request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. * * @throws GuzzleException */ public function head($uri, array $options = []): ResponseInterface { return $this->request('HEAD', $uri, $options); } /** * Create and send an HTTP PUT request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. * * @throws GuzzleException */ public function put($uri, array $options = []): ResponseInterface { return $this->request('PUT', $uri, $options); } /** * Create and send an HTTP POST request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. * * @throws GuzzleException */ public function post($uri, array $options = []): ResponseInterface { return $this->request('POST', $uri, $options); } /** * Create and send an HTTP PATCH request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. * * @throws GuzzleException */ public function patch($uri, array $options = []): ResponseInterface { return $this->request('PATCH', $uri, $options); } /** * Create and send an HTTP DELETE request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. * * @throws GuzzleException */ public function delete($uri, array $options = []): ResponseInterface { return $this->request('DELETE', $uri, $options); } /** * Create and send an asynchronous HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ abstract public function requestAsync(string $method, $uri, array $options = []): PromiseInterface; /** * Create and send an asynchronous HTTP GET request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ public function getAsync($uri, array $options = []): PromiseInterface { return $this->requestAsync('GET', $uri, $options); } /** * Create and send an asynchronous HTTP HEAD request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ public function headAsync($uri, array $options = []): PromiseInterface { return $this->requestAsync('HEAD', $uri, $options); } /** * Create and send an asynchronous HTTP PUT request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ public function putAsync($uri, array $options = []): PromiseInterface { return $this->requestAsync('PUT', $uri, $options); } /** * Create and send an asynchronous HTTP POST request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ public function postAsync($uri, array $options = []): PromiseInterface { return $this->requestAsync('POST', $uri, $options); } /** * Create and send an asynchronous HTTP PATCH request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ public function patchAsync($uri, array $options = []): PromiseInterface { return $this->requestAsync('PATCH', $uri, $options); } /** * Create and send an asynchronous HTTP DELETE request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. */ public function deleteAsync($uri, array $options = []): PromiseInterface { return $this->requestAsync('DELETE', $uri, $options); } } push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::redirect(), 'allow_redirects'); $stack->push(Middleware::cookies(), 'cookies'); $stack->push(Middleware::prepareBody(), 'prepare_body'); return $stack; } /** * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler. */ public function __construct(?callable $handler = null) { $this->handler = $handler; } /** * Invokes the handler stack as a composed handler * * @return ResponseInterface|PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $handler = $this->resolve(); return $handler($request, $options); } /** * Dumps a string representation of the stack. * * @return string */ public function __toString() { $depth = 0; $stack = []; if ($this->handler !== null) { $stack[] = '0) Handler: '.$this->debugCallable($this->handler); } $result = ''; foreach (\array_reverse($this->stack) as $tuple) { ++$depth; $str = "{$depth}) Name: '{$tuple[1]}', "; $str .= 'Function: '.$this->debugCallable($tuple[0]); $result = "> {$str}\n{$result}"; $stack[] = $str; } foreach (\array_keys($stack) as $k) { $result .= "< {$stack[$k]}\n"; } return $result; } /** * Set the HTTP handler that actually returns a promise. * * @param callable(RequestInterface, array): PromiseInterface $handler Accepts a request and array of options and * returns a Promise. */ public function setHandler(callable $handler): void { $this->handler = $handler; $this->cached = null; } /** * Returns true if the builder has a handler. */ public function hasHandler(): bool { return $this->handler !== null; } /** * Unshift a middleware to the bottom of the stack. * * @param callable(callable): callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function unshift(callable $middleware, ?string $name = null): void { \array_unshift($this->stack, [$middleware, $name]); $this->cached = null; } /** * Push a middleware to the top of the stack. * * @param callable(callable): callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function push(callable $middleware, string $name = ''): void { $this->stack[] = [$middleware, $name]; $this->cached = null; } /** * Add a middleware before another middleware by name. * * @param string $findName Middleware to find * @param callable(callable): callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function before(string $findName, callable $middleware, string $withName = ''): void { $this->splice($findName, $withName, $middleware, true); } /** * Add a middleware after another middleware by name. * * @param string $findName Middleware to find * @param callable(callable): callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function after(string $findName, callable $middleware, string $withName = ''): void { $this->splice($findName, $withName, $middleware, false); } /** * Remove a middleware by instance or name from the stack. * * @param callable|string $remove Middleware to remove by instance or name. */ public function remove($remove): void { if (!is_string($remove) && !is_callable($remove)) { trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); } $this->cached = null; $idx = \is_callable($remove) ? 0 : 1; $this->stack = \array_values(\array_filter( $this->stack, static function ($tuple) use ($idx, $remove) { return $tuple[$idx] !== $remove; } )); } /** * Compose the middleware and handler into a single callable function. * * @return callable(RequestInterface, array): PromiseInterface */ public function resolve(): callable { if ($this->cached === null) { if (($prev = $this->handler) === null) { throw new \LogicException('No handler has been specified'); } foreach (\array_reverse($this->stack) as $fn) { /** @var callable(RequestInterface, array): PromiseInterface $prev */ $prev = $fn[0]($prev); } $this->cached = $prev; } return $this->cached; } private function findByName(string $name): int { foreach ($this->stack as $k => $v) { if ($v[1] === $name) { return $k; } } throw new \InvalidArgumentException("Middleware not found: $name"); } /** * Splices a function into the middleware list at a specific position. */ private function splice(string $findName, string $withName, callable $middleware, bool $before): void { $this->cached = null; $idx = $this->findByName($findName); $tuple = [$middleware, $withName]; if ($before) { if ($idx === 0) { \array_unshift($this->stack, $tuple); } else { $replacement = [$tuple, $this->stack[$idx]]; \array_splice($this->stack, $idx, 1, $replacement); } } elseif ($idx === \count($this->stack) - 1) { $this->stack[] = $tuple; } else { $replacement = [$this->stack[$idx], $tuple]; \array_splice($this->stack, $idx, 1, $replacement); } } /** * Provides a debug string for a given callable. * * @param callable|string $fn Function to write as a string. */ private function debugCallable($fn): string { if (\is_string($fn)) { return "callable({$fn})"; } if (\is_array($fn)) { return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['".\get_class($fn[0])."', '{$fn[1]}'])"; } /** @var object $fn */ return 'callable('.\spl_object_hash($fn).')'; } } truncateAt = $truncateAt; } /** * Returns a summarized message body. */ public function summarize(MessageInterface $message): ?string { return $this->truncateAt === null ? Psr7\Message::bodySummary($message) : Psr7\Message::bodySummary($message, $this->truncateAt); } } 'http://www.foo.com/1.0/', * 'timeout' => 0, * 'allow_redirects' => false, * 'proxy' => '192.168.16.1:10' * ]); * * Client configuration settings include the following options: * * - handler: (callable) Function that transfers HTTP requests over the * wire. The function is called with a Psr7\Http\Message\RequestInterface * and array of transfer options, and must return a * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a * Psr7\Http\Message\ResponseInterface on success. * If no handler is provided, a default handler will be created * that enables all of the request options below by attaching all of the * default middleware to the handler. * - base_uri: (string|UriInterface) Base URI of the client that is merged * into relative URIs. Can be a string or instance of UriInterface. * - **: any request option * * @param array $config Client configuration settings. * * @see RequestOptions for a list of available request options. */ public function __construct(array $config = []) { if (!isset($config['handler'])) { $config['handler'] = HandlerStack::create(); } elseif (!\is_callable($config['handler'])) { throw new InvalidArgumentException('handler must be a callable'); } // Convert the base_uri to a UriInterface if (isset($config['base_uri'])) { $config['base_uri'] = Psr7\Utils::uriFor($config['base_uri']); } $this->configureDefaults($config); } /** * @param string $method * @param array $args * * @return PromiseInterface|ResponseInterface * * @deprecated Client::__call will be removed in guzzlehttp/guzzle:8.0. */ public function __call($method, $args) { if (\count($args) < 1) { throw new InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; $opts = $args[1] ?? []; return \substr($method, -5) === 'Async' ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); } /** * Asynchronously send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. */ public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface { // Merge the base URI into the request URI if needed. $options = $this->prepareDefaults($options); return $this->transfer( $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options ); } /** * Send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @throws GuzzleException */ public function send(RequestInterface $request, array $options = []): ResponseInterface { $options[RequestOptions::SYNCHRONOUS] = true; return $this->sendAsync($request, $options)->wait(); } /** * The HttpClient PSR (PSR-18) specify this method. * * {@inheritDoc} */ public function sendRequest(RequestInterface $request): ResponseInterface { $options[RequestOptions::SYNCHRONOUS] = true; $options[RequestOptions::ALLOW_REDIRECTS] = false; $options[RequestOptions::HTTP_ERRORS] = false; return $this->sendAsync($request, $options)->wait(); } /** * Create and send an asynchronous HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. */ public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface { $options = $this->prepareDefaults($options); // Remove request modifying parameter because it can be done up-front. $headers = $options['headers'] ?? []; $body = $options['body'] ?? null; $version = $options['version'] ?? '1.1'; // Merge the URI into the base URI. $uri = $this->buildUri(Psr7\Utils::uriFor($uri), $options); if (\is_array($body)) { throw $this->invalidBody(); } $request = new Psr7\Request($method, $uri, $headers, $body, $version); // Remove the option so that they are not doubly-applied. unset($options['headers'], $options['body'], $options['version']); return $this->transfer($request, $options); } /** * Create and send an HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string $method HTTP method. * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @throws GuzzleException */ public function request(string $method, $uri = '', array $options = []): ResponseInterface { $options[RequestOptions::SYNCHRONOUS] = true; return $this->requestAsync($method, $uri, $options)->wait(); } /** * Get a client configuration option. * * These options include default request options of the client, a "handler" * (if utilized by the concrete client), and a "base_uri" if utilized by * the concrete client. * * @param string|null $option The config option to retrieve. * * @return mixed * * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0. */ public function getConfig(?string $option = null) { return $option === null ? $this->config : ($this->config[$option] ?? null); } private function buildUri(UriInterface $uri, array $config): UriInterface { if (isset($config['base_uri'])) { $uri = Psr7\UriResolver::resolve(Psr7\Utils::uriFor($config['base_uri']), $uri); } if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) { $idnOptions = ($config['idn_conversion'] === true) ? \IDNA_DEFAULT : $config['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; } /** * Configures the default options for a client. */ private function configureDefaults(array $config): void { $defaults = [ 'allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => true, 'decode_content' => true, 'verify' => true, 'cookies' => false, 'idn_conversion' => false, ]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". if (\PHP_SAPI === 'cli' && ($proxy = Utils::getenv('HTTP_PROXY'))) { $defaults['proxy']['http'] = $proxy; } if ($proxy = Utils::getenv('HTTPS_PROXY')) { $defaults['proxy']['https'] = $proxy; } if ($noProxy = Utils::getenv('NO_PROXY')) { $cleanedNoProxy = \str_replace(' ', '', $noProxy); $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); } $this->config = $config + $defaults; if (!empty($config['cookies']) && $config['cookies'] === true) { $this->config['cookies'] = new CookieJar(); } // Add the default user-agent header. if (!isset($this->config['headers'])) { $this->config['headers'] = ['User-Agent' => Utils::defaultUserAgent()]; } else { // Add the User-Agent header if one was not already set. foreach (\array_keys($this->config['headers']) as $name) { if (\strtolower($name) === 'user-agent') { return; } } $this->config['headers']['User-Agent'] = Utils::defaultUserAgent(); } } /** * Merges default options into the array. * * @param array $options Options to modify by reference */ private function prepareDefaults(array $options): array { $defaults = $this->config; if (!empty($defaults['headers'])) { // Default headers are only added if they are not present. $defaults['_conditional'] = $defaults['headers']; unset($defaults['headers']); } // Special handling for headers is required as they are added as // conditional headers and as headers passed to a request ctor. if (\array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { $defaults['_conditional'] = []; unset($options['headers']); } elseif (!\is_array($options['headers'])) { throw new InvalidArgumentException('headers must be an array'); } } // Shallow merge defaults underneath options. $result = $options + $defaults; // Remove null values. foreach ($result as $k => $v) { if ($v === null) { unset($result[$k]); } } return $result; } /** * Transfers the given request and applies request options. * * The URI of the request is not modified and the request options are used * as-is without merging in default options. * * @param array $options See \GuzzleHttp\RequestOptions. */ private function transfer(RequestInterface $request, array $options): PromiseInterface { $request = $this->applyOptions($request, $options); /** @var HandlerStack $handler */ $handler = $options['handler']; try { return P\Create::promiseFor($handler($request, $options)); } catch (\Exception $e) { return P\Create::rejectionFor($e); } } /** * Applies the array of request options to a request. */ private function applyOptions(RequestInterface $request, array &$options): RequestInterface { $modify = [ 'set_headers' => [], ]; if (isset($options['headers'])) { if (array_keys($options['headers']) === range(0, count($options['headers']) - 1)) { throw new InvalidArgumentException('The headers array must have header name as keys.'); } $modify['set_headers'] = $options['headers']; unset($options['headers']); } if (isset($options['form_params'])) { if (isset($options['multipart'])) { throw new InvalidArgumentException('You cannot use ' .'form_params and multipart at the same time. Use the ' .'form_params option if you want to send application/' .'x-www-form-urlencoded requests, and the multipart ' .'option to send multipart/form-data requests.'); } $options['body'] = \http_build_query($options['form_params'], '', '&'); unset($options['form_params']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; } if (isset($options['multipart'])) { $options['body'] = new Psr7\MultipartStream($options['multipart']); unset($options['multipart']); } if (isset($options['json'])) { $options['body'] = Utils::jsonEncode($options['json']); unset($options['json']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/json'; } if (!empty($options['decode_content']) && $options['decode_content'] !== true ) { // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } if (isset($options['body'])) { if (\is_array($options['body'])) { throw $this->invalidBody(); } $modify['body'] = Psr7\Utils::streamFor($options['body']); unset($options['body']); } if (!empty($options['auth']) && \is_array($options['auth'])) { $value = $options['auth']; $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; switch ($type) { case 'basic': // Ensure that we don't have the header in different case and set the new value. $modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']); $modify['set_headers']['Authorization'] = 'Basic ' .\base64_encode("$value[0]:$value[1]"); break; case 'digest': // @todo: Do not rely on curl $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; $options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]"; break; case 'ntlm': $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; $options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]"; break; } } if (isset($options['query'])) { $value = $options['query']; if (\is_array($value)) { $value = \http_build_query($value, '', '&', \PHP_QUERY_RFC3986); } if (!\is_string($value)) { throw new InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); } // Ensure that sink is not an invalid value. if (isset($options['sink'])) { // TODO: Add more sink validation? if (\is_bool($options['sink'])) { throw new InvalidArgumentException('sink must not be a boolean'); } } if (isset($options['version'])) { $modify['version'] = $options['version']; } $request = Psr7\Utils::modifyRequest($request, $modify); if ($request->getBody() instanceof Psr7\MultipartStream) { // Use a multipart/form-data POST if a Content-Type is not set. // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' .$request->getBody()->getBoundary(); } // Merge in conditional headers if they are not present. if (isset($options['_conditional'])) { // Build up the changes so it's in a single clone of the message. $modify = []; foreach ($options['_conditional'] as $k => $v) { if (!$request->hasHeader($k)) { $modify['set_headers'][$k] = $v; } } $request = Psr7\Utils::modifyRequest($request, $modify); // Don't pass this internal value along to middleware/handlers. unset($options['_conditional']); } return $request; } /** * Return an InvalidArgumentException with pre-set message. */ private function invalidBody(): InvalidArgumentException { return new InvalidArgumentException('Passing in the "body" request ' .'option as an array to send a request is not supported. ' .'Please use the "form_params" request option to send a ' .'application/x-www-form-urlencoded request, or the "multipart" ' .'request option to send a multipart/form-data request.'); } } decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__.'::exponentialDelay'; } /** * Default exponential backoff delay function. * * @return int milliseconds. */ public static function exponentialDelay(int $retries): int { return (int) 2 ** ($retries - 1) * 1000; } public function __invoke(RequestInterface $request, array $options): PromiseInterface { if (!isset($options['retries'])) { $options['retries'] = 0; } $fn = $this->nextHandler; return $fn($request, $options) ->then( $this->onFulfilled($request, $options), $this->onRejected($request, $options) ); } /** * Execute fulfilled closure */ private function onFulfilled(RequestInterface $request, array $options): callable { return function ($value) use ($request, $options) { if (!($this->decider)( $options['retries'], $request, $value, null )) { return $value; } return $this->doRetry($request, $options, $value); }; } /** * Execute rejected closure */ private function onRejected(RequestInterface $req, array $options): callable { return function ($reason) use ($req, $options) { if (!($this->decider)( $options['retries'], $req, null, $reason )) { return P\Create::rejectionFor($reason); } return $this->doRetry($req, $options); }; } private function doRetry(RequestInterface $request, array $options, ?ResponseInterface $response = null): PromiseInterface { $options['delay'] = ($this->delay)(++$options['retries'], $response, $request); return $this($request, $options); } } Copyright (c) 2012 Jeremy Lindblom Copyright (c) 2014 Graham Campbell Copyright (c) 2015 Márk Sági-Kazár Copyright (c) 2015 Tobias Schultze Copyright (c) 2016 Tobias Nyholm Copyright (c) 2016 George Mponos 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. # CHANGELOG ## 2.3.0 - 2025-08-22 ### Added - PHP 8.5 support ## 2.2.0 - 2025-03-27 ### Fixed - Revert "Allow an empty EachPromise to be resolved by running the queue" ## 2.1.0 - 2025-03-27 ### Added - Allow an empty EachPromise to be resolved by running the queue ## 2.0.4 - 2024-10-17 ### Fixed - Once settled, don't allow further rejection of additional promises ## 2.0.3 - 2024-07-18 ### Changed - PHP 8.4 support ## 2.0.2 - 2023-12-03 ### Changed - Replaced `call_user_func*` with native calls ## 2.0.1 - 2023-08-03 ### Changed - PHP 8.3 support ## 2.0.0 - 2023-05-21 ### Added - Added PHP 7 type hints ### Changed - All previously non-final non-exception classes have been marked as soft-final ### Removed - Dropped PHP < 7.2 support - All functions in the `GuzzleHttp\Promise` namespace ## 1.5.3 - 2023-05-21 ### Changed - Removed remaining usage of deprecated functions ## 1.5.2 - 2022-08-07 ### Changed - Officially support PHP 8.2 ## 1.5.1 - 2021-10-22 ### Fixed - Revert "Call handler when waiting on fulfilled/rejected Promise" - Fix pool memory leak when empty array of promises provided ## 1.5.0 - 2021-10-07 ### Changed - Call handler when waiting on fulfilled/rejected Promise - Officially support PHP 8.1 ### Fixed - Fix manually settle promises generated with `Utils::task` ## 1.4.1 - 2021-02-18 ### Fixed - Fixed `each_limit` skipping promises and failing ## 1.4.0 - 2020-09-30 ### Added - Support for PHP 8 - Optional `$recursive` flag to `all` - Replaced functions by static methods ### Fixed - Fix empty `each` processing - Fix promise handling for Iterators of non-unique keys - Fixed `method_exists` crashes on PHP 8 - Memory leak on exceptions ## 1.3.1 - 2016-12-20 ### Fixed - `wait()` foreign promise compatibility ## 1.3.0 - 2016-11-18 ### Added - Adds support for custom task queues. ### Fixed - Fixed coroutine promise memory leak. ## 1.2.0 - 2016-05-18 ### Changed - Update to now catch `\Throwable` on PHP 7+ ## 1.1.0 - 2016-03-07 ### Changed - Update EachPromise to prevent recurring on a iterator when advancing, as this could trigger fatal generator errors. - Update Promise to allow recursive waiting without unwrapping exceptions. ## 1.0.3 - 2015-10-15 ### Changed - Update EachPromise to immediately resolve when the underlying promise iterator is empty. Previously, such a promise would throw an exception when its `wait` function was called. ## 1.0.2 - 2015-05-15 ### Changed - Conditionally require functions.php. ## 1.0.1 - 2015-06-24 ### Changed - Updating EachPromise to call next on the underlying promise iterator as late as possible to ensure that generators that generate new requests based on callbacks are not iterated until after callbacks are invoked. ## 1.0.0 - 2015-05-12 - Initial release { "name": "guzzlehttp/promises", "description": "Guzzle promises library", "keywords": ["promise"], "license": "MIT", "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" } }, "autoload-dev": { "psr-4": { "GuzzleHttp\\Promise\\Tests\\": "tests/" } }, "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "config": { "allow-plugins": { "bamarni/composer-bin-plugin": true }, "preferred-install": "dist", "sort-packages": true } } # Guzzle Promises [Promises/A+](https://promisesaplus.com/) implementation that handles promise chaining and resolution iteratively, allowing for "infinite" promise chaining while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/) for a general introduction to promises. - [Features](#features) - [Quick start](#quick-start) - [Synchronous wait](#synchronous-wait) - [Cancellation](#cancellation) - [API](#api) - [Promise](#promise) - [FulfilledPromise](#fulfilledpromise) - [RejectedPromise](#rejectedpromise) - [Promise interop](#promise-interop) - [Implementation notes](#implementation-notes) ## Features - [Promises/A+](https://promisesaplus.com/) implementation. - Promise resolution and chaining is handled iteratively, allowing for "infinite" promise chaining. - Promises have a synchronous `wait` method. - Promises can be cancelled. - Works with any object that has a `then` function. - C# style async/await coroutine promises using `GuzzleHttp\Promise\Coroutine::of()`. ## Installation ```shell composer require guzzlehttp/promises ``` ## Version Guidance | Version | Status | PHP Version | |---------|---------------------|--------------| | 1.x | Security fixes only | >=5.5,<8.3 | | 2.x | Latest | >=7.2.5,<8.6 | ## Quick Start A *promise* represents the eventual result of an asynchronous operation. The primary way of interacting with a promise is through its `then` method, which registers callbacks to receive either a promise's eventual value or the reason why the promise cannot be fulfilled. ### Callbacks Callbacks are registered with the `then` method by providing an optional `$onFulfilled` followed by an optional `$onRejected` function. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then( // $onFulfilled function ($value) { echo 'The promise was fulfilled.'; }, // $onRejected function ($reason) { echo 'The promise was rejected.'; } ); ``` *Resolving* a promise means that you either fulfill a promise with a *value* or reject a promise with a *reason*. Resolving a promise triggers callbacks registered with the promise's `then` method. These callbacks are triggered only once and in the order in which they were added. ### Resolving a Promise Promises are fulfilled using the `resolve($value)` method. Resolving a promise with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger all of the onFulfilled callbacks (resolving a promise with a rejected promise will reject the promise and trigger the `$onRejected` callbacks). ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise ->then(function ($value) { // Return a value and don't break the chain return "Hello, " . $value; }) // This then is executed after the first then and receives the value // returned from the first then. ->then(function ($value) { echo $value; }); // Resolving the promise triggers the $onFulfilled callbacks and outputs // "Hello, reader." $promise->resolve('reader.'); ``` ### Promise Forwarding Promises can be chained one after the other. Each then in the chain is a new promise. The return value of a promise is what's forwarded to the next promise in the chain. Returning a promise in a `then` callback will cause the subsequent promises in the chain to only be fulfilled when the returned promise has been fulfilled. The next promise in the chain will be invoked with the resolved value of the promise. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $nextPromise = new Promise(); $promise ->then(function ($value) use ($nextPromise) { echo $value; return $nextPromise; }) ->then(function ($value) { echo $value; }); // Triggers the first callback and outputs "A" $promise->resolve('A'); // Triggers the second callback and outputs "B" $nextPromise->resolve('B'); ``` ### Promise Rejection When a promise is rejected, the `$onRejected` callbacks are invoked with the rejection reason. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then(null, function ($reason) { echo $reason; }); $promise->reject('Error!'); // Outputs "Error!" ``` ### Rejection Forwarding If an exception is thrown in an `$onRejected` callback, subsequent `$onRejected` callbacks are invoked with the thrown exception as the reason. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then(null, function ($reason) { throw new Exception($reason); })->then(null, function ($reason) { assert($reason->getMessage() === 'Error!'); }); $promise->reject('Error!'); ``` You can also forward a rejection down the promise chain by returning a `GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or `$onRejected` callback. ```php use GuzzleHttp\Promise\Promise; use GuzzleHttp\Promise\RejectedPromise; $promise = new Promise(); $promise->then(null, function ($reason) { return new RejectedPromise($reason); })->then(null, function ($reason) { assert($reason === 'Error!'); }); $promise->reject('Error!'); ``` If an exception is not thrown in a `$onRejected` callback and the callback does not return a rejected promise, downstream `$onFulfilled` callbacks are invoked using the value returned from the `$onRejected` callback. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise ->then(null, function ($reason) { return "It's ok"; }) ->then(function ($value) { assert($value === "It's ok"); }); $promise->reject('Error!'); ``` ## Synchronous Wait You can synchronously force promises to complete using a promise's `wait` method. When creating a promise, you can provide a wait function that is used to synchronously force a promise to complete. When a wait function is invoked it is expected to deliver a value to the promise or reject the promise. If the wait function does not deliver a value, then an exception is thrown. The wait function provided to a promise constructor is invoked when the `wait` function of the promise is called. ```php $promise = new Promise(function () use (&$promise) { $promise->resolve('foo'); }); // Calling wait will return the value of the promise. echo $promise->wait(); // outputs "foo" ``` If an exception is encountered while invoking the wait function of a promise, the promise is rejected with the exception and the exception is thrown. ```php $promise = new Promise(function () use (&$promise) { throw new Exception('foo'); }); $promise->wait(); // throws the exception. ``` Calling `wait` on a promise that has been fulfilled will not trigger the wait function. It will simply return the previously resolved value. ```php $promise = new Promise(function () { die('this is not called!'); }); $promise->resolve('foo'); echo $promise->wait(); // outputs "foo" ``` Calling `wait` on a promise that has been rejected will throw an exception. If the rejection reason is an instance of `\Exception` the reason is thrown. Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason can be obtained by calling the `getReason` method of the exception. ```php $promise = new Promise(); $promise->reject('foo'); $promise->wait(); ``` > PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo' ### Unwrapping a Promise When synchronously waiting on a promise, you are joining the state of the promise into the current state of execution (i.e., return the value of the promise if it was fulfilled or throw an exception if it was rejected). This is called "unwrapping" the promise. Waiting on a promise will by default unwrap the promise state. You can force a promise to resolve and *not* unwrap the state of the promise by passing `false` to the first argument of the `wait` function: ```php $promise = new Promise(); $promise->reject('foo'); // This will not throw an exception. It simply ensures the promise has // been resolved. $promise->wait(false); ``` When unwrapping a promise, the resolved value of the promise will be waited upon until the unwrapped value is not a promise. This means that if you resolve promise A with a promise B and unwrap promise A, the value returned by the wait function will be the value delivered to promise B. **Note**: when you do not unwrap the promise, no value is returned. ## Cancellation You can cancel a promise that has not yet been fulfilled using the `cancel()` method of a promise. When creating a promise you can provide an optional cancel function that when invoked cancels the action of computing a resolution of the promise. ## API ### Promise When creating a promise object, you can provide an optional `$waitFn` and `$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is expected to resolve the promise. `$cancelFn` is a function with no arguments that is expected to cancel the computation of a promise. It is invoked when the `cancel()` method of a promise is called. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise( function () use (&$promise) { $promise->resolve('waited'); }, function () { // do something that will cancel the promise computation (e.g., close // a socket, cancel a database query, etc...) } ); assert('waited' === $promise->wait()); ``` A promise has the following methods: - `then(callable $onFulfilled, callable $onRejected) : PromiseInterface` Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler. - `otherwise(callable $onRejected) : PromiseInterface` Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled. - `wait($unwrap = true) : mixed` Synchronously waits on the promise to complete. `$unwrap` controls whether or not the value of the promise is returned for a fulfilled promise or if an exception is thrown if the promise is rejected. This is set to `true` by default. - `cancel()` Attempts to cancel the promise if possible. The promise being cancelled and the parent most ancestor that has not yet been resolved will also be cancelled. Any promises waiting on the cancelled promise to resolve will also be cancelled. - `getState() : string` Returns the state of the promise. One of `pending`, `fulfilled`, or `rejected`. - `resolve($value)` Fulfills the promise with the given `$value`. - `reject($reason)` Rejects the promise with the given `$reason`. ### FulfilledPromise A fulfilled promise can be created to represent a promise that has been fulfilled. ```php use GuzzleHttp\Promise\FulfilledPromise; $promise = new FulfilledPromise('value'); // Fulfilled callbacks are immediately invoked. $promise->then(function ($value) { echo $value; }); ``` ### RejectedPromise A rejected promise can be created to represent a promise that has been rejected. ```php use GuzzleHttp\Promise\RejectedPromise; $promise = new RejectedPromise('Error'); // Rejected callbacks are immediately invoked. $promise->then(null, function ($reason) { echo $reason; }); ``` ## Promise Interoperability This library works with foreign promises that have a `then` method. This means you can use Guzzle promises with [React promises](https://github.com/reactphp/promise) for example. When a foreign promise is returned inside of a then method callback, promise resolution will occur recursively. ```php // Create a React promise $deferred = new React\Promise\Deferred(); $reactPromise = $deferred->promise(); // Create a Guzzle promise that is fulfilled with a React promise. $guzzlePromise = new GuzzleHttp\Promise\Promise(); $guzzlePromise->then(function ($value) use ($reactPromise) { // Do something something with the value... // Return the React promise return $reactPromise; }); ``` Please note that wait and cancel chaining is no longer possible when forwarding a foreign promise. You will need to wrap a third-party promise with a Guzzle promise in order to utilize wait and cancel functions with foreign promises. ### Event Loop Integration In order to keep the stack size constant, Guzzle promises are resolved asynchronously using a task queue. When waiting on promises synchronously, the task queue will be automatically run to ensure that the blocking promise and any forwarded promises are resolved. When using promises asynchronously in an event loop, you will need to run the task queue on each tick of the loop. If you do not run the task queue, then promises will not be resolved. You can run the task queue using the `run()` method of the global task queue instance. ```php // Get the global task queue $queue = GuzzleHttp\Promise\Utils::queue(); $queue->run(); ``` For example, you could use Guzzle promises with React using a periodic timer: ```php $loop = React\EventLoop\Factory::create(); $loop->addPeriodicTimer(0, [$queue, 'run']); ``` ## Implementation Notes ### Promise Resolution and Chaining is Handled Iteratively By shuffling pending handlers from one owner to another, promises are resolved iteratively, allowing for "infinite" then chaining. ```php then(function ($v) { // The stack size remains constant (a good thing) echo xdebug_get_stack_depth() . ', '; return $v + 1; }); } $parent->resolve(0); var_dump($p->wait()); // int(1000) ``` When a promise is fulfilled or rejected with a non-promise value, the promise then takes ownership of the handlers of each child promise and delivers values down the chain without using recursion. When a promise is resolved with another promise, the original promise transfers all of its pending handlers to the new promise. When the new promise is eventually resolved, all of the pending handlers are delivered the forwarded value. ### A Promise is the Deferred Some promise libraries implement promises using a deferred object to represent a computation and a promise object to represent the delivery of the result of the computation. This is a nice separation of computation and delivery because consumers of the promise cannot modify the value that will be eventually delivered. One side effect of being able to implement promise resolution and chaining iteratively is that you need to be able for one promise to reach into the state of another promise to shuffle around ownership of handlers. In order to achieve this without making the handlers of a promise publicly mutable, a promise is also the deferred value, allowing promises of the same parent class to reach into and modify the private properties of promises of the same type. While this does allow consumers of the value to modify the resolution or rejection of the deferred, it is a small price to pay for keeping the stack size constant. ```php $promise = new Promise(); $promise->then(function ($value) { echo $value; }); // The promise is the deferred value, so you can deliver a value to it. $promise->resolve('foo'); // prints "foo" ``` ## Upgrading from Function API A static API was first introduced in 1.4.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API was removed in 2.0.0. A migration table has been provided here for your convenience: | Original Function | Replacement Method | |----------------|----------------| | `queue` | `Utils::queue` | | `task` | `Utils::task` | | `promise_for` | `Create::promiseFor` | | `rejection_for` | `Create::rejectionFor` | | `exception_for` | `Create::exceptionFor` | | `iter_for` | `Create::iterFor` | | `inspect` | `Utils::inspect` | | `inspect_all` | `Utils::inspectAll` | | `unwrap` | `Utils::unwrap` | | `all` | `Utils::all` | | `some` | `Utils::some` | | `any` | `Utils::any` | | `settle` | `Utils::settle` | | `each` | `Each::of` | | `each_limit` | `Each::ofLimit` | | `each_limit_all` | `Each::ofLimitAll` | | `!is_fulfilled` | `Is::pending` | | `is_fulfilled` | `Is::fulfilled` | | `is_rejected` | `Is::rejected` | | `is_settled` | `Is::settled` | | `coroutine` | `Coroutine::of` | ## Security If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/promises/security/policy) for more information. ## License Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. ## For Enterprise Available as part of the Tidelift Subscription The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-promises?utm_source=packagist-guzzlehttp-promises&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) iterable = Create::iterFor($iterable); if (isset($config['concurrency'])) { $this->concurrency = $config['concurrency']; } if (isset($config['fulfilled'])) { $this->onFulfilled = $config['fulfilled']; } if (isset($config['rejected'])) { $this->onRejected = $config['rejected']; } } /** @psalm-suppress InvalidNullableReturnType */ public function promise(): PromiseInterface { if ($this->aggregate) { return $this->aggregate; } try { $this->createPromise(); /** @psalm-assert Promise $this->aggregate */ $this->iterable->rewind(); $this->refillPending(); } catch (\Throwable $e) { $this->aggregate->reject($e); } /** * @psalm-suppress NullableReturnStatement */ return $this->aggregate; } private function createPromise(): void { $this->mutex = false; $this->aggregate = new Promise(function (): void { if ($this->checkIfFinished()) { return; } reset($this->pending); // Consume a potentially fluctuating list of promises while // ensuring that indexes are maintained (precluding array_shift). while ($promise = current($this->pending)) { next($this->pending); $promise->wait(); if (Is::settled($this->aggregate)) { return; } } }); // Clear the references when the promise is resolved. $clearFn = function (): void { $this->iterable = $this->concurrency = $this->pending = null; $this->onFulfilled = $this->onRejected = null; $this->nextPendingIndex = 0; }; $this->aggregate->then($clearFn, $clearFn); } private function refillPending(): void { if (!$this->concurrency) { // Add all pending promises. while ($this->addPending() && $this->advanceIterator()) { } return; } // Add only up to N pending promises. $concurrency = is_callable($this->concurrency) ? ($this->concurrency)(count($this->pending)) : $this->concurrency; $concurrency = max($concurrency - count($this->pending), 0); // Concurrency may be set to 0 to disallow new promises. if (!$concurrency) { return; } // Add the first pending promise. $this->addPending(); // Note this is special handling for concurrency=1 so that we do // not advance the iterator after adding the first promise. This // helps work around issues with generators that might not have the // next value to yield until promise callbacks are called. while (--$concurrency && $this->advanceIterator() && $this->addPending()) { } } private function addPending(): bool { if (!$this->iterable || !$this->iterable->valid()) { return false; } $promise = Create::promiseFor($this->iterable->current()); $key = $this->iterable->key(); // Iterable keys may not be unique, so we use a counter to // guarantee uniqueness $idx = $this->nextPendingIndex++; $this->pending[$idx] = $promise->then( function ($value) use ($idx, $key): void { if ($this->onFulfilled) { ($this->onFulfilled)( $value, $key, $this->aggregate ); } $this->step($idx); }, function ($reason) use ($idx, $key): void { if ($this->onRejected) { ($this->onRejected)( $reason, $key, $this->aggregate ); } $this->step($idx); } ); return true; } private function advanceIterator(): bool { // Place a lock on the iterator so that we ensure to not recurse, // preventing fatal generator errors. if ($this->mutex) { return false; } $this->mutex = true; try { $this->iterable->next(); $this->mutex = false; return true; } catch (\Throwable $e) { $this->aggregate->reject($e); $this->mutex = false; return false; } } private function step(int $idx): void { // If the promise was already resolved, then ignore this step. if (Is::settled($this->aggregate)) { return; } unset($this->pending[$idx]); // Only refill pending promises if we are not locked, preventing the // EachPromise to recursively invoke the provided iterator, which // cause a fatal error: "Cannot resume an already running generator" if ($this->advanceIterator() && !$this->checkIfFinished()) { // Add more pending promises if possible. $this->refillPending(); } } private function checkIfFinished(): bool { if (!$this->pending && !$this->iterable->valid()) { // Resolve the promise if there's nothing left to do. $this->aggregate->resolve(null); return true; } return false; } } waitFn = $waitFn; $this->cancelFn = $cancelFn; } public function then( ?callable $onFulfilled = null, ?callable $onRejected = null ): PromiseInterface { if ($this->state === self::PENDING) { $p = new Promise(null, [$this, 'cancel']); $this->handlers[] = [$p, $onFulfilled, $onRejected]; $p->waitList = $this->waitList; $p->waitList[] = $this; return $p; } // Return a fulfilled promise and immediately invoke any callbacks. if ($this->state === self::FULFILLED) { $promise = Create::promiseFor($this->result); return $onFulfilled ? $promise->then($onFulfilled) : $promise; } // It's either cancelled or rejected, so return a rejected promise // and immediately invoke any callbacks. $rejection = Create::rejectionFor($this->result); return $onRejected ? $rejection->then(null, $onRejected) : $rejection; } public function otherwise(callable $onRejected): PromiseInterface { return $this->then(null, $onRejected); } public function wait(bool $unwrap = true) { $this->waitIfPending(); if ($this->result instanceof PromiseInterface) { return $this->result->wait($unwrap); } if ($unwrap) { if ($this->state === self::FULFILLED) { return $this->result; } // It's rejected so "unwrap" and throw an exception. throw Create::exceptionFor($this->result); } } public function getState(): string { return $this->state; } public function cancel(): void { if ($this->state !== self::PENDING) { return; } $this->waitFn = $this->waitList = null; if ($this->cancelFn) { $fn = $this->cancelFn; $this->cancelFn = null; try { $fn(); } catch (\Throwable $e) { $this->reject($e); } } // Reject the promise only if it wasn't rejected in a then callback. /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject(new CancellationException('Promise has been cancelled')); } } public function resolve($value): void { $this->settle(self::FULFILLED, $value); } public function reject($reason): void { $this->settle(self::REJECTED, $reason); } private function settle(string $state, $value): void { if ($this->state !== self::PENDING) { // Ignore calls with the same resolution. if ($state === $this->state && $value === $this->result) { return; } throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}"); } if ($value === $this) { throw new \LogicException('Cannot fulfill or reject a promise with itself'); } // Clear out the state of the promise but stash the handlers. $this->state = $state; $this->result = $value; $handlers = $this->handlers; $this->handlers = null; $this->waitList = $this->waitFn = null; $this->cancelFn = null; if (!$handlers) { return; } // If the value was not a settled promise or a thenable, then resolve // it in the task queue using the correct ID. if (!is_object($value) || !method_exists($value, 'then')) { $id = $state === self::FULFILLED ? 1 : 2; // It's a success, so resolve the handlers in the queue. Utils::queue()->add(static function () use ($id, $value, $handlers): void { foreach ($handlers as $handler) { self::callHandler($id, $value, $handler); } }); } elseif ($value instanceof Promise && Is::pending($value)) { // We can just merge our handlers onto the next promise. $value->handlers = array_merge($value->handlers, $handlers); } else { // Resolve the handlers when the forwarded promise is resolved. $value->then( static function ($value) use ($handlers): void { foreach ($handlers as $handler) { self::callHandler(1, $value, $handler); } }, static function ($reason) use ($handlers): void { foreach ($handlers as $handler) { self::callHandler(2, $reason, $handler); } } ); } } /** * Call a stack of handlers using a specific callback index and value. * * @param int $index 1 (resolve) or 2 (reject). * @param mixed $value Value to pass to the callback. * @param array $handler Array of handler data (promise and callbacks). */ private static function callHandler(int $index, $value, array $handler): void { /** @var PromiseInterface $promise */ $promise = $handler[0]; // The promise may have been cancelled or resolved before placing // this thunk in the queue. if (Is::settled($promise)) { return; } try { if (isset($handler[$index])) { /* * If $f throws an exception, then $handler will be in the exception * stack trace. Since $handler contains a reference to the callable * itself we get a circular reference. We clear the $handler * here to avoid that memory leak. */ $f = $handler[$index]; unset($handler); $promise->resolve($f($value)); } elseif ($index === 1) { // Forward resolution values as-is. $promise->resolve($value); } else { // Forward rejections down the chain. $promise->reject($value); } } catch (\Throwable $reason) { $promise->reject($reason); } } private function waitIfPending(): void { if ($this->state !== self::PENDING) { return; } elseif ($this->waitFn) { $this->invokeWaitFn(); } elseif ($this->waitList) { $this->invokeWaitList(); } else { // If there's no wait function, then reject the promise. $this->reject('Cannot wait on a promise that has ' .'no internal wait function. You must provide a wait ' .'function when constructing the promise to be able to ' .'wait on a promise.'); } Utils::queue()->run(); /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject('Invoking the wait callback did not resolve the promise'); } } private function invokeWaitFn(): void { try { $wfn = $this->waitFn; $this->waitFn = null; $wfn(true); } catch (\Throwable $reason) { if ($this->state === self::PENDING) { // The promise has not been resolved yet, so reject the promise // with the exception. $this->reject($reason); } else { // The promise was already resolved, so there's a problem in // the application. throw $reason; } } } private function invokeWaitList(): void { $waitList = $this->waitList; $this->waitList = null; foreach ($waitList as $result) { do { $result->waitIfPending(); $result = $result->result; } while ($result instanceof Promise); if ($result instanceof PromiseInterface) { $result->wait(false); } } } } then([$promise, 'resolve'], [$promise, 'reject']); return $promise; } return new FulfilledPromise($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. * If the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. */ public static function rejectionFor($reason): PromiseInterface { if ($reason instanceof PromiseInterface) { return $reason; } return new RejectedPromise($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason */ public static function exceptionFor($reason): \Throwable { if ($reason instanceof \Throwable) { return $reason; } return new RejectionException($reason); } /** * Returns an iterator for the given value. * * @param mixed $value */ public static function iterFor($value): \Iterator { if ($value instanceof \Iterator) { return $value; } if (is_array($value)) { return new \ArrayIterator($value); } return new \ArrayIterator([$value]); } } run(); * * @final */ class TaskQueue implements TaskQueueInterface { private $enableShutdown = true; private $queue = []; public function __construct(bool $withShutdown = true) { if ($withShutdown) { register_shutdown_function(function (): void { if ($this->enableShutdown) { // Only run the tasks if an E_ERROR didn't occur. $err = error_get_last(); if (!$err || ($err['type'] ^ E_ERROR)) { $this->run(); } } }); } } public function isEmpty(): bool { return !$this->queue; } public function add(callable $task): void { $this->queue[] = $task; } public function run(): void { while ($task = array_shift($this->queue)) { /** @var callable $task */ $task(); } } /** * The task queue will be run and exhausted by default when the process * exits IFF the exit is not the result of a PHP E_ERROR error. * * You can disable running the automatic shutdown of the queue by calling * this function. If you disable the task queue shutdown process, then you * MUST either run the task queue (as a result of running your event loop * or manually using the run() method) or wait on each outstanding promise. * * Note: This shutdown will occur before any destructors are triggered. */ public function disableShutdown(): void { $this->enableShutdown = false; } } * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\Utils::queue()->run(); * } * * * @param TaskQueueInterface|null $assign Optionally specify a new queue instance. */ public static function queue(?TaskQueueInterface $assign = null): TaskQueueInterface { static $queue; if ($assign) { $queue = $assign; } elseif (!$queue) { $queue = new TaskQueue(); } return $queue; } /** * Adds a function to run in the task queue when it is next `run()` and * returns a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. */ public static function task(callable $task): PromiseInterface { $queue = self::queue(); $promise = new Promise([$queue, 'run']); $queue->add(function () use ($task, $promise): void { try { if (Is::pending($promise)) { $promise->resolve($task()); } } catch (\Throwable $e) { $promise->reject($e); } }); return $promise; } /** * Synchronously waits on a promise to resolve and returns an inspection * state array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the * array will contain a "value" key mapping to the fulfilled value of the * promise. If the promise is rejected, the array will contain a "reason" * key mapping to the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. */ public static function inspect(PromiseInterface $promise): array { try { return [ 'state' => PromiseInterface::FULFILLED, 'value' => $promise->wait(), ]; } catch (RejectionException $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; } catch (\Throwable $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } } /** * Waits on all of the provided promises, but does not unwrap rejected * promises as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. */ public static function inspectAll($promises): array { $results = []; foreach ($promises as $key => $promise) { $results[$key] = self::inspect($promise); } return $results; } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same * order the promises were provided). An exception is thrown if any of the * promises are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @throws \Throwable on error */ public static function unwrap($promises): array { $results = []; foreach ($promises as $key => $promise) { $results[$key] = $promise->wait(); } return $results; } /** * Given an array of promises, return a promise that is fulfilled when all * the items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. */ public static function all($promises, bool $recursive = false): PromiseInterface { $results = []; $promise = Each::of( $promises, function ($value, $idx) use (&$results): void { $results[$idx] = $value; }, function ($reason, $idx, Promise $aggregate): void { if (Is::pending($aggregate)) { $aggregate->reject($reason); } } )->then(function () use (&$results) { ksort($results); return $results; }); if (true === $recursive) { $promise = $promise->then(function ($results) use ($recursive, &$promises) { foreach ($promises as $promise) { if (Is::pending($promise)) { return self::all($promises, $recursive); } } return $results; }); } return $promise; } /** * Initiate a competitive race between multiple promises or values (values * will become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise * is fulfilled with an array that contains the fulfillment values of the * winners in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number * of fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. */ public static function some(int $count, $promises): PromiseInterface { $results = []; $rejections = []; return Each::of( $promises, function ($value, $idx, PromiseInterface $p) use (&$results, $count): void { if (Is::settled($p)) { return; } $results[$idx] = $value; if (count($results) >= $count) { $p->resolve(null); } }, function ($reason) use (&$rejections): void { $rejections[] = $reason; } )->then( function () use (&$results, &$rejections, $count) { if (count($results) !== $count) { throw new AggregateException( 'Not enough promises to fulfill count', $rejections ); } ksort($results); return array_values($results); } ); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. */ public static function any($promises): PromiseInterface { return self::some(1, $promises)->then(function ($values) { return $values[0]; }); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. */ public static function settle($promises): PromiseInterface { $results = []; return Each::of( $promises, function ($value, $idx) use (&$results): void { $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; }, function ($reason, $idx) use (&$results): void { $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; } )->then(function () use (&$results) { ksort($results); return $results; }); } } reason = $reason; $message = 'The promise was rejected'; if ($description) { $message .= ' with reason: '.$description; } elseif (is_string($reason) || (is_object($reason) && method_exists($reason, '__toString')) ) { $message .= ' with reason: '.$this->reason; } elseif ($reason instanceof \JsonSerializable) { $message .= ' with reason: '.json_encode($this->reason, JSON_PRETTY_PRINT); } parent::__construct($message); } /** * Returns the rejection reason. * * @return mixed */ public function getReason() { return $this->reason; } } reason = $reason; } public function then( ?callable $onFulfilled = null, ?callable $onRejected = null ): PromiseInterface { // If there's no onRejected callback then just return self. if (!$onRejected) { return $this; } $queue = Utils::queue(); $reason = $this->reason; $p = new Promise([$queue, 'run']); $queue->add(static function () use ($p, $reason, $onRejected): void { if (Is::pending($p)) { try { // Return a resolved promise if onRejected does not throw. $p->resolve($onRejected($reason)); } catch (\Throwable $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected): PromiseInterface { return $this->then(null, $onRejected); } public function wait(bool $unwrap = true) { if ($unwrap) { throw Create::exceptionFor($this->reason); } return null; } public function getState(): string { return self::REJECTED; } public function resolve($value): void { throw new \LogicException('Cannot resolve a rejected promise'); } public function reject($reason): void { if ($reason !== $this->reason) { throw new \LogicException('Cannot reject a rejected promise'); } } public function cancel(): void { // pass } } getState() === PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled or rejected. */ public static function settled(PromiseInterface $promise): bool { return $promise->getState() !== PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled. */ public static function fulfilled(PromiseInterface $promise): bool { return $promise->getState() === PromiseInterface::FULFILLED; } /** * Returns true if a promise is rejected. */ public static function rejected(PromiseInterface $promise): bool { return $promise->getState() === PromiseInterface::REJECTED; } } then(function ($v) { echo $v; }); * * @param callable $generatorFn Generator function to wrap into a promise. * * @return Promise * * @see https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration */ final class Coroutine implements PromiseInterface { /** * @var PromiseInterface|null */ private $currentPromise; /** * @var Generator */ private $generator; /** * @var Promise */ private $result; public function __construct(callable $generatorFn) { $this->generator = $generatorFn(); $this->result = new Promise(function (): void { while (isset($this->currentPromise)) { $this->currentPromise->wait(); } }); try { $this->nextCoroutine($this->generator->current()); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * Create a new coroutine. */ public static function of(callable $generatorFn): self { return new self($generatorFn); } public function then( ?callable $onFulfilled = null, ?callable $onRejected = null ): PromiseInterface { return $this->result->then($onFulfilled, $onRejected); } public function otherwise(callable $onRejected): PromiseInterface { return $this->result->otherwise($onRejected); } public function wait(bool $unwrap = true) { return $this->result->wait($unwrap); } public function getState(): string { return $this->result->getState(); } public function resolve($value): void { $this->result->resolve($value); } public function reject($reason): void { $this->result->reject($reason); } public function cancel(): void { $this->currentPromise->cancel(); $this->result->cancel(); } private function nextCoroutine($yielded): void { $this->currentPromise = Create::promiseFor($yielded) ->then([$this, '_handleSuccess'], [$this, '_handleFailure']); } /** * @internal */ public function _handleSuccess($value): void { unset($this->currentPromise); try { $next = $this->generator->send($value); if ($this->generator->valid()) { $this->nextCoroutine($next); } else { $this->result->resolve($value); } } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * @internal */ public function _handleFailure($reason): void { unset($this->currentPromise); try { $nextYield = $this->generator->throw(Create::exceptionFor($reason)); // The throw was caught, so keep iterating on the coroutine $this->nextCoroutine($nextYield); } catch (Throwable $throwable) { $this->result->reject($throwable); } } } value = $value; } public function then( ?callable $onFulfilled = null, ?callable $onRejected = null ): PromiseInterface { // Return itself if there is no onFulfilled function. if (!$onFulfilled) { return $this; } $queue = Utils::queue(); $p = new Promise([$queue, 'run']); $value = $this->value; $queue->add(static function () use ($p, $value, $onFulfilled): void { if (Is::pending($p)) { try { $p->resolve($onFulfilled($value)); } catch (\Throwable $e) { $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected): PromiseInterface { return $this->then(null, $onRejected); } public function wait(bool $unwrap = true) { return $unwrap ? $this->value : null; } public function getState(): string { return self::FULFILLED; } public function resolve($value): void { if ($value !== $this->value) { throw new \LogicException('Cannot resolve a fulfilled promise'); } } public function reject($reason): void { throw new \LogicException('Cannot reject a fulfilled promise'); } public function cancel(): void { // pass } } $onFulfilled, 'rejected' => $onRejected, ]))->promise(); } /** * Like of, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow * for dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency */ public static function ofLimit( $iterable, $concurrency, ?callable $onFulfilled = null, ?callable $onRejected = null ): PromiseInterface { return (new EachPromise($iterable, [ 'fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency, ]))->promise(); } /** * Like limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency */ public static function ofLimitAll( $iterable, $concurrency, ?callable $onFulfilled = null ): PromiseInterface { return self::ofLimit( $iterable, $concurrency, $onFulfilled, function ($reason, $idx, PromiseInterface $aggregate): void { $aggregate->reject($reason); } ); } } The MIT License (MIT) Copyright (c) 2015 Michael Dowling Copyright (c) 2015 Graham Campbell Copyright (c) 2017 Tobias Schultze Copyright (c) 2020 Tobias Nyholm 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. # Change Log All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## 2.9.0 - 2026-03-10 ### Added - Added nested array expansion support to `MultipartStream` - Added `@return static` to `MessageTrait` methods ### Changed - Updated MIME type mappings ## 2.8.1 - 2026-03-10 ### Fixed - Encode `+` signs in `Uri::withQueryValue()` and `Uri::withQueryValues()` to prevent them being interpreted as spaces ## 2.8.0 - 2025-08-23 ### Added - Allow empty lists as header values ### Changed - PHP 8.5 support ## 2.7.1 - 2025-03-27 ### Fixed - Fixed uppercase IPv6 addresses in URI ### Changed - Improve uploaded file error message ## 2.7.0 - 2024-07-18 ### Added - Add `Utils::redactUserInfo()` method - Add ability to encode bools as ints in `Query::build` ## 2.6.3 - 2024-07-18 ### Fixed - Make `StreamWrapper::stream_stat()` return `false` if inner stream's size is `null` ### Changed - PHP 8.4 support ## 2.6.2 - 2023-12-03 ### Fixed - Fixed another issue with the fact that PHP transforms numeric strings in array keys to ints ### Changed - Updated links in docs to their canonical versions - Replaced `call_user_func*` with native calls ## 2.6.1 - 2023-08-27 ### Fixed - Properly handle the fact that PHP transforms numeric strings in array keys to ints ## 2.6.0 - 2023-08-03 ### Changed - Updated the mime type map to add some new entries, fix a couple of invalid entries, and remove an invalid entry - Fallback to `application/octet-stream` if we are unable to guess the content type for a multipart file upload ## 2.5.1 - 2023-08-03 ### Fixed - Corrected mime type for `.acc` files to `audio/aac` ### Changed - PHP 8.3 support ## 2.5.0 - 2023-04-17 ### Changed - Adjusted `psr/http-message` version constraint to `^1.1 || ^2.0` ## 2.4.5 - 2023-04-17 ### Fixed - Prevent possible warnings on unset variables in `ServerRequest::normalizeNestedFileSpec` - Fixed `Message::bodySummary` when `preg_match` fails - Fixed header validation issue ## 2.4.4 - 2023-03-09 ### Changed - Removed the need for `AllowDynamicProperties` in `LazyOpenStream` ## 2.4.3 - 2022-10-26 ### Changed - Replaced `sha1(uniqid())` by `bin2hex(random_bytes(20))` ## 2.4.2 - 2022-10-25 ### Fixed - Fixed erroneous behaviour when combining host and relative path ## 2.4.1 - 2022-08-28 ### Fixed - Rewind body before reading in `Message::bodySummary` ## 2.4.0 - 2022-06-20 ### Added - Added provisional PHP 8.2 support - Added `UriComparator::isCrossOrigin` method ## 2.3.0 - 2022-06-09 ### Fixed - Added `Header::splitList` method - Added `Utils::tryGetContents` method - Improved `Stream::getContents` method - Updated mimetype mappings ## 2.2.2 - 2022-06-08 ### Fixed - Fix `Message::parseRequestUri` for numeric headers - Re-wrap exceptions thrown in `fread` into runtime exceptions - Throw an exception when multipart options is misformatted ## 2.2.1 - 2022-03-20 ### Fixed - Correct header value validation ## 2.2.0 - 2022-03-20 ### Added - A more compressive list of mime types - Add JsonSerializable to Uri - Missing return types ### Fixed - Bug MultipartStream no `uri` metadata - Bug MultipartStream with filename for `data://` streams - Fixed new line handling in MultipartStream - Reduced RAM usage when copying streams - Updated parsing in `Header::normalize()` ## 2.1.1 - 2022-03-20 ### Fixed - Validate header values properly ## 2.1.0 - 2021-10-06 ### Changed - Attempting to create a `Uri` object from a malformed URI will no longer throw a generic `InvalidArgumentException`, but rather a `MalformedUriException`, which inherits from the former for backwards compatibility. Callers relying on the exception being thrown to detect invalid URIs should catch the new exception. ### Fixed - Return `null` in caching stream size if remote size is `null` ## 2.0.0 - 2021-06-30 Identical to the RC release. ## 2.0.0@RC-1 - 2021-04-29 ### Fixed - Handle possibly unset `url` in `stream_get_meta_data` ## 2.0.0@beta-1 - 2021-03-21 ### Added - PSR-17 factories - Made classes final - PHP7 type hints ### Changed - When building a query string, booleans are represented as 1 and 0. ### Removed - PHP < 7.2 support - All functions in the `GuzzleHttp\Psr7` namespace ## 1.8.1 - 2021-03-21 ### Fixed - Issue parsing IPv6 URLs - Issue modifying ServerRequest lost all its attributes ## 1.8.0 - 2021-03-21 ### Added - Locale independent URL parsing - Most classes got a `@final` annotation to prepare for 2.0 ### Fixed - Issue when creating stream from `php://input` and curl-ext is not installed - Broken `Utils::tryFopen()` on PHP 8 ## 1.7.0 - 2020-09-30 ### Added - Replaced functions by static methods ### Fixed - Converting a non-seekable stream to a string - Handle multiple Set-Cookie correctly - Ignore array keys in header values when merging - Allow multibyte characters to be parsed in `Message:bodySummary()` ### Changed - Restored partial HHVM 3 support ## [1.6.1] - 2019-07-02 ### Fixed - Accept null and bool header values again ## [1.6.0] - 2019-06-30 ### Added - Allowed version `^3.0` of `ralouphie/getallheaders` dependency (#244) - Added MIME type for WEBP image format (#246) - Added more validation of values according to PSR-7 and RFC standards, e.g. status code range (#250, #272) ### Changed - Tests don't pass with HHVM 4.0, so HHVM support got dropped. Other libraries like composer have done the same. (#262) - Accept port number 0 to be valid (#270) ### Fixed - Fixed subsequent reads from `php://input` in ServerRequest (#247) - Fixed readable/writable detection for certain stream modes (#248) - Fixed encoding of special characters in the `userInfo` component of an URI (#253) ## [1.5.2] - 2018-12-04 ### Fixed - Check body size when getting the message summary ## [1.5.1] - 2018-12-04 ### Fixed - Get the summary of a body only if it is readable ## [1.5.0] - 2018-12-03 ### Added - Response first-line to response string exception (fixes #145) - A test for #129 behavior - `get_message_body_summary` function in order to get the message summary - `3gp` and `mkv` mime types ### Changed - Clarify exception message when stream is detached ### Deprecated - Deprecated parsing folded header lines as per RFC 7230 ### Fixed - Fix `AppendStream::detach` to not close streams - `InflateStream` preserves `isSeekable` attribute of the underlying stream - `ServerRequest::getUriFromGlobals` to support URLs in query parameters Several other fixes and improvements. ## [1.4.2] - 2017-03-20 ### Fixed - Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing calls to `trigger_error` when deprecated methods are invoked. ## [1.4.1] - 2017-02-27 ### Added - Rriggering of silenced deprecation warnings. ### Fixed - Reverted BC break by reintroducing behavior to automagically fix a URI with a relative path and an authority by adding a leading slash to the path. It's only deprecated now. ## [1.4.0] - 2017-02-21 ### Added - Added common URI utility methods based on RFC 3986 (see documentation in the readme): - `Uri::isDefaultPort` - `Uri::isAbsolute` - `Uri::isNetworkPathReference` - `Uri::isAbsolutePathReference` - `Uri::isRelativePathReference` - `Uri::isSameDocumentReference` - `Uri::composeComponents` - `UriNormalizer::normalize` - `UriNormalizer::isEquivalent` - `UriResolver::relativize` ### Changed - Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. - Allow `parse_response` to parse a response without delimiting space and reason. - Ensure each URI modification results in a valid URI according to PSR-7 discussions. Invalid modifications will throw an exception instead of returning a wrong URI or doing some magic. - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception because the path of a URI with an authority must start with a slash "/" or be empty - `(new Uri())->withScheme('http')` will return `'http://localhost'` ### Deprecated - `Uri::resolve` in favor of `UriResolver::resolve` - `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` ### Fixed - `Stream::read` when length parameter <= 0. - `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. - `ServerRequest::getUriFromGlobals` when `Host` header contains port. - Compatibility of URIs with `file` scheme and empty host. ## [1.3.1] - 2016-06-25 ### Fixed - `Uri::__toString` for network path references, e.g. `//example.org`. - Missing lowercase normalization for host. - Handling of URI components in case they are `'0'` in a lot of places, e.g. as a user info password. - `Uri::withAddedHeader` to correctly merge headers with different case. - Trimming of header values in `Uri::withAddedHeader`. Header values may be surrounded by whitespace which should be ignored according to RFC 7230 Section 3.2.4. This does not apply to header names. - `Uri::withAddedHeader` with an array of header values. - `Uri::resolve` when base path has no slash and handling of fragment. - Handling of encoding in `Uri::with(out)QueryValue` so one can pass the key/value both in encoded as well as decoded form to those methods. This is consistent with withPath, withQuery etc. - `ServerRequest::withoutAttribute` when attribute value is null. ## [1.3.0] - 2016-04-13 ### Added - Remaining interfaces needed for full PSR7 compatibility (ServerRequestInterface, UploadedFileInterface, etc.). - Support for stream_for from scalars. ### Changed - Can now extend Uri. ### Fixed - A bug in validating request methods by making it more permissive. ## [1.2.3] - 2016-02-18 ### Fixed - Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote streams, which can sometimes return fewer bytes than requested with `fread`. - Handling of gzipped responses with FNAME headers. ## [1.2.2] - 2016-01-22 ### Added - Support for URIs without any authority. - Support for HTTP 451 'Unavailable For Legal Reasons.' - Support for using '0' as a filename. - Support for including non-standard ports in Host headers. ## [1.2.1] - 2015-11-02 ### Changes - Now supporting negative offsets when seeking to SEEK_END. ## [1.2.0] - 2015-08-15 ### Changed - Body as `"0"` is now properly added to a response. - Now allowing forward seeking in CachingStream. - Now properly parsing HTTP requests that contain proxy targets in `parse_request`. - functions.php is now conditionally required. - user-info is no longer dropped when resolving URIs. ## [1.1.0] - 2015-06-24 ### Changed - URIs can now be relative. - `multipart/form-data` headers are now overridden case-insensitively. - URI paths no longer encode the following characters because they are allowed in URIs: "(", ")", "*", "!", "'" - A port is no longer added to a URI when the scheme is missing and no port is present. ## 1.0.0 - 2015-05-19 Initial release. Currently unsupported: - `Psr\Http\Message\ServerRequestInterface` - `Psr\Http\Message\UploadedFileInterface` [1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 [1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 [1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 [1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 [1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 [1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 [1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 { "name": "guzzlehttp/psr7", "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ "request", "response", "message", "stream", "http", "uri", "url", "psr-7" ], "license": "MIT", "authors": [ { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "George Mponos", "email": "gmponos@gmail.com", "homepage": "https://github.com/gmponos" }, { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", "homepage": "https://github.com/Nyholm" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://github.com/sagikazarmark" }, { "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", "homepage": "https://sagikazarmark.hu" } ], "repositories": [ { "type": "package", "package": { "name": "jshttp/mime-db", "version": "1.54.0.1", "dist": { "url": "https://codeload.github.com/jshttp/mime-db/zip/0a9fd0bfbc87a725ff638495839114e7807b7177", "type": "zip" } } } ], "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } }, "autoload-dev": { "psr-4": { "GuzzleHttp\\Tests\\Psr7\\": "tests/" } }, "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false } }, "config": { "allow-plugins": { "bamarni/composer-bin-plugin": true }, "preferred-install": "dist", "sort-packages": true } } # PSR-7 Message Implementation This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/) message implementation, several stream decorators, and some helpful functionality like query string parsing. ![CI](https://github.com/guzzle/psr7/workflows/CI/badge.svg) ![Static analysis](https://github.com/guzzle/psr7/workflows/Static%20analysis/badge.svg) ## Features This package comes with a number of stream implementations and stream decorators. ## Installation ```shell composer require guzzlehttp/psr7 ``` ## Version Guidance | Version | Status | PHP Version | |---------|---------------------|--------------| | 1.x | EOL (2024-06-30) | >=5.4,<8.2 | | 2.x | Latest | >=7.2.5,<8.6 | ## AppendStream `GuzzleHttp\Psr7\AppendStream` Reads from multiple streams, one after the other. ```php use GuzzleHttp\Psr7; $a = Psr7\Utils::streamFor('abc, '); $b = Psr7\Utils::streamFor('123.'); $composed = new Psr7\AppendStream([$a, $b]); $composed->addStream(Psr7\Utils::streamFor(' Above all listen to me')); echo $composed; // abc, 123. Above all listen to me. ``` ## BufferStream `GuzzleHttp\Psr7\BufferStream` Provides a buffer stream that can be written to fill a buffer, and read from to remove bytes from the buffer. This stream returns a "hwm" metadata value that tells upstream consumers what the configured high water mark of the stream is, or the maximum preferred size of the buffer. ```php use GuzzleHttp\Psr7; // When more than 1024 bytes are in the buffer, it will begin returning // false to writes. This is an indication that writers should slow down. $buffer = new Psr7\BufferStream(1024); ``` ## CachingStream The CachingStream is used to allow seeking over previously read bytes on non-seekable streams. This can be useful when transferring a non-seekable entity body fails due to needing to rewind the stream (for example, resulting from a redirect). Data that is read from the remote stream will be buffered in a PHP temp stream so that previously read bytes are cached first in memory, then on disk. ```php use GuzzleHttp\Psr7; $original = Psr7\Utils::streamFor(fopen('http://www.google.com', 'r')); $stream = new Psr7\CachingStream($original); $stream->read(1024); echo $stream->tell(); // 1024 $stream->seek(0); echo $stream->tell(); // 0 ``` ## DroppingStream `GuzzleHttp\Psr7\DroppingStream` Stream decorator that begins dropping data once the size of the underlying stream becomes too full. ```php use GuzzleHttp\Psr7; // Create an empty stream $stream = Psr7\Utils::streamFor(); // Start dropping data when the stream has more than 10 bytes $dropping = new Psr7\DroppingStream($stream, 10); $dropping->write('01234567890123456789'); echo $stream; // 0123456789 ``` ## FnStream `GuzzleHttp\Psr7\FnStream` Compose stream implementations based on a hash of functions. Allows for easy testing and extension of a provided stream without needing to create a concrete class for a simple extension point. ```php use GuzzleHttp\Psr7; $stream = Psr7\Utils::streamFor('hi'); $fnStream = Psr7\FnStream::decorate($stream, [ 'rewind' => function () use ($stream) { echo 'About to rewind - '; $stream->rewind(); echo 'rewound!'; } ]); $fnStream->rewind(); // Outputs: About to rewind - rewound! ``` ## InflateStream `GuzzleHttp\Psr7\InflateStream` Uses PHP's zlib.inflate filter to inflate zlib (HTTP deflate, RFC1950) or gzipped (RFC1952) content. This stream decorator converts the provided stream to a PHP stream resource, then appends the zlib.inflate filter. The stream is then converted back to a Guzzle stream resource to be used as a Guzzle stream. ## LazyOpenStream `GuzzleHttp\Psr7\LazyOpenStream` Lazily reads or writes to a file that is opened only after an IO operation take place on the stream. ```php use GuzzleHttp\Psr7; $stream = new Psr7\LazyOpenStream('/path/to/file', 'r'); // The file has not yet been opened... echo $stream->read(10); // The file is opened and read from only when needed. ``` ## LimitStream `GuzzleHttp\Psr7\LimitStream` LimitStream can be used to read a subset or slice of an existing stream object. This can be useful for breaking a large file into smaller pieces to be sent in chunks (e.g. Amazon S3's multipart upload API). ```php use GuzzleHttp\Psr7; $original = Psr7\Utils::streamFor(fopen('/tmp/test.txt', 'r+')); echo $original->getSize(); // >>> 1048576 // Limit the size of the body to 1024 bytes and start reading from byte 2048 $stream = new Psr7\LimitStream($original, 1024, 2048); echo $stream->getSize(); // >>> 1024 echo $stream->tell(); // >>> 0 ``` ## MultipartStream `GuzzleHttp\Psr7\MultipartStream` Stream that when read returns bytes for a streaming multipart or multipart/form-data stream. ## NoSeekStream `GuzzleHttp\Psr7\NoSeekStream` NoSeekStream wraps a stream and does not allow seeking. ```php use GuzzleHttp\Psr7; $original = Psr7\Utils::streamFor('foo'); $noSeek = new Psr7\NoSeekStream($original); echo $noSeek->read(3); // foo var_export($noSeek->isSeekable()); // false $noSeek->seek(0); var_export($noSeek->read(3)); // NULL ``` ## PumpStream `GuzzleHttp\Psr7\PumpStream` Provides a read only stream that pumps data from a PHP callable. When invoking the provided callable, the PumpStream will pass the amount of data requested to read to the callable. The callable can choose to ignore this value and return fewer or more bytes than requested. Any extra data returned by the provided callable is buffered internally until drained using the read() function of the PumpStream. The provided callable MUST return false when there is no more data to read. ## Implementing stream decorators Creating a stream decorator is very easy thanks to the `GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that implement `Psr\Http\Message\StreamInterface` by proxying to an underlying stream. Just `use` the `StreamDecoratorTrait` and implement your custom methods. For example, let's say we wanted to call a specific function each time the last byte is read from a stream. This could be implemented by overriding the `read()` method. ```php use Psr\Http\Message\StreamInterface; use GuzzleHttp\Psr7\StreamDecoratorTrait; class EofCallbackStream implements StreamInterface { use StreamDecoratorTrait; private $callback; private $stream; public function __construct(StreamInterface $stream, callable $cb) { $this->stream = $stream; $this->callback = $cb; } public function read($length) { $result = $this->stream->read($length); // Invoke the callback when EOF is hit. if ($this->eof()) { ($this->callback)(); } return $result; } } ``` This decorator could be added to any existing stream and used like so: ```php use GuzzleHttp\Psr7; $original = Psr7\Utils::streamFor('foo'); $eofStream = new EofCallbackStream($original, function () { echo 'EOF!'; }); $eofStream->read(2); $eofStream->read(1); // echoes "EOF!" $eofStream->seek(0); $eofStream->read(3); // echoes "EOF!" ``` ## PHP StreamWrapper You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a PSR-7 stream as a PHP stream resource. Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP stream from a PSR-7 stream. ```php use GuzzleHttp\Psr7\StreamWrapper; $stream = GuzzleHttp\Psr7\Utils::streamFor('hello!'); $resource = StreamWrapper::getResource($stream); echo fread($resource, 6); // outputs hello! ``` # Static API There are various static methods available under the `GuzzleHttp\Psr7` namespace. ## `GuzzleHttp\Psr7\Message::toString` `public static function toString(MessageInterface $message): string` Returns the string representation of an HTTP message. ```php $request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); echo GuzzleHttp\Psr7\Message::toString($request); ``` ## `GuzzleHttp\Psr7\Message::bodySummary` `public static function bodySummary(MessageInterface $message, int $truncateAt = 120): string|null` Get a short summary of the message body. Will return `null` if the response is not printable. ## `GuzzleHttp\Psr7\Message::rewindBody` `public static function rewindBody(MessageInterface $message): void` Attempts to rewind a message body and throws an exception on failure. The body of the message will only be rewound if a call to `tell()` returns a value other than `0`. ## `GuzzleHttp\Psr7\Message::parseMessage` `public static function parseMessage(string $message): array` Parses an HTTP message into an associative array. The array contains the "start-line" key containing the start line of the message, "headers" key containing an associative array of header array values, and a "body" key containing the body of the message. ## `GuzzleHttp\Psr7\Message::parseRequestUri` `public static function parseRequestUri(string $path, array $headers): string` Constructs a URI for an HTTP request message. ## `GuzzleHttp\Psr7\Message::parseRequest` `public static function parseRequest(string $message): Request` Parses a request message string into a request object. ## `GuzzleHttp\Psr7\Message::parseResponse` `public static function parseResponse(string $message): Response` Parses a response message string into a response object. ## `GuzzleHttp\Psr7\Header::parse` `public static function parse(string|array $header): array` Parse an array of header values containing ";" separated data into an array of associative arrays representing the header key value pair data of the header. When a parameter does not contain a value, but just contains a key, this function will inject a key with a '' string value. ## `GuzzleHttp\Psr7\Header::splitList` `public static function splitList(string|string[] $header): string[]` Splits a HTTP header defined to contain a comma-separated list into each individual value: ``` $knownEtags = Header::splitList($request->getHeader('if-none-match')); ``` Example headers include `accept`, `cache-control` and `if-none-match`. ## `GuzzleHttp\Psr7\Header::normalize` (deprecated) `public static function normalize(string|array $header): array` `Header::normalize()` is deprecated in favor of [`Header::splitList()`](README.md#guzzlehttppsr7headersplitlist) which performs the same operation with a cleaned up API and improved documentation. Converts an array of header values that may contain comma separated headers into an array of headers with no comma separated values. ## `GuzzleHttp\Psr7\Query::parse` `public static function parse(string $str, int|bool $urlEncoding = true): array` Parse a query string into an associative array. If multiple values are found for the same key, the value of that key value pair will become an array. This function does not parse nested PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`. ## `GuzzleHttp\Psr7\Query::build` `public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string` Build a query string from an array of key value pairs. This function can use the return value of `parse()` to build a query string. This function does not modify the provided keys when an array is encountered (like `http_build_query()` would). ## `GuzzleHttp\Psr7\Utils::caselessRemove` `public static function caselessRemove(iterable $keys, $keys, array $data): array` Remove the items given by the keys, case insensitively from the data. ## `GuzzleHttp\Psr7\Utils::copyToStream` `public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void` Copy the contents of a stream into another stream until the given number of bytes have been read. ## `GuzzleHttp\Psr7\Utils::copyToString` `public static function copyToString(StreamInterface $stream, int $maxLen = -1): string` Copy the contents of a stream into a string until the given number of bytes have been read. ## `GuzzleHttp\Psr7\Utils::hash` `public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string` Calculate a hash of a stream. This method reads the entire stream to calculate a rolling hash, based on PHP's `hash_init` functions. ## `GuzzleHttp\Psr7\Utils::modifyRequest` `public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface` Clone and modify a request with the given changes. This method is useful for reducing the number of clones needed to mutate a message. - method: (string) Changes the HTTP method. - set_headers: (array) Sets the given headers. - remove_headers: (array) Remove the given headers. - body: (mixed) Sets the given body. - uri: (UriInterface) Set the URI. - query: (string) Set the query string value of the URI. - version: (string) Set the protocol version. ## `GuzzleHttp\Psr7\Utils::readLine` `public static function readLine(StreamInterface $stream, ?int $maxLength = null): string` Read a line from the stream up to the maximum allowed buffer length. ## `GuzzleHttp\Psr7\Utils::redactUserInfo` `public static function redactUserInfo(UriInterface $uri): UriInterface` Redact the password in the user info part of a URI. ## `GuzzleHttp\Psr7\Utils::streamFor` `public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource = '', array $options = []): StreamInterface` Create a new stream based on the input type. Options is an associative array that can contain the following keys: - metadata: Array of custom metadata. - size: Size of the stream. This method accepts the following `$resource` types: - `Psr\Http\Message\StreamInterface`: Returns the value as-is. - `string`: Creates a stream object that uses the given string as the contents. - `resource`: Creates a stream object that wraps the given PHP stream resource. - `Iterator`: If the provided value implements `Iterator`, then a read-only stream object will be created that wraps the given iterable. Each time the stream is read from, data from the iterator will fill a buffer and will be continuously called until the buffer is equal to the requested read size. Subsequent read calls will first read from the buffer and then call `next` on the underlying iterator until it is exhausted. - `object` with `__toString()`: If the object has the `__toString()` method, the object will be cast to a string and then a stream will be returned that uses the string value. - `NULL`: When `null` is passed, an empty stream object is returned. - `callable` When a callable is passed, a read-only stream object will be created that invokes the given callable. The callable is invoked with the number of suggested bytes to read. The callable can return any number of bytes, but MUST return `false` when there is no more data to return. The stream object that wraps the callable will invoke the callable until the number of requested bytes are available. Any additional bytes will be buffered and used in subsequent reads. ```php $stream = GuzzleHttp\Psr7\Utils::streamFor('foo'); $stream = GuzzleHttp\Psr7\Utils::streamFor(fopen('/path/to/file', 'r')); $generator = function ($bytes) { for ($i = 0; $i < $bytes; $i++) { yield ' '; } } $stream = GuzzleHttp\Psr7\Utils::streamFor($generator(100)); ``` ## `GuzzleHttp\Psr7\Utils::tryFopen` `public static function tryFopen(string $filename, string $mode): resource` Safely opens a PHP stream resource using a filename. When fopen fails, PHP normally raises a warning. This function adds an error handler that checks for errors and throws an exception instead. ## `GuzzleHttp\Psr7\Utils::tryGetContents` `public static function tryGetContents(resource $stream): string` Safely gets the contents of a given stream. When stream_get_contents fails, PHP normally raises a warning. This function adds an error handler that checks for errors and throws an exception instead. ## `GuzzleHttp\Psr7\Utils::uriFor` `public static function uriFor(string|UriInterface $uri): UriInterface` Returns a UriInterface for the given value. This function accepts a string or UriInterface and returns a UriInterface for the given value. If the value is already a UriInterface, it is returned as-is. ## `GuzzleHttp\Psr7\MimeType::fromFilename` `public static function fromFilename(string $filename): string|null` Determines the mimetype of a file by looking at its extension. ## `GuzzleHttp\Psr7\MimeType::fromExtension` `public static function fromExtension(string $extension): string|null` Maps a file extensions to a mimetype. ## Upgrading from Function API The static API was first introduced in 1.7.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API was removed in 2.0.0. A migration table has been provided here for your convenience: | Original Function | Replacement Method | |----------------|----------------| | `str` | `Message::toString` | | `uri_for` | `Utils::uriFor` | | `stream_for` | `Utils::streamFor` | | `parse_header` | `Header::parse` | | `normalize_header` | `Header::normalize` | | `modify_request` | `Utils::modifyRequest` | | `rewind_body` | `Message::rewindBody` | | `try_fopen` | `Utils::tryFopen` | | `copy_to_string` | `Utils::copyToString` | | `copy_to_stream` | `Utils::copyToStream` | | `hash` | `Utils::hash` | | `readline` | `Utils::readLine` | | `parse_request` | `Message::parseRequest` | | `parse_response` | `Message::parseResponse` | | `parse_query` | `Query::parse` | | `build_query` | `Query::build` | | `mimetype_from_filename` | `MimeType::fromFilename` | | `mimetype_from_extension` | `MimeType::fromExtension` | | `_parse_message` | `Message::parseMessage` | | `_parse_request_uri` | `Message::parseRequestUri` | | `get_message_body_summary` | `Message::bodySummary` | | `_caseless_remove` | `Utils::caselessRemove` | # Additional URI Methods Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, this library also provides additional functionality when working with URIs as static methods. ## URI Types An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference. An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI, the base URI. Relative references can be divided into several forms according to [RFC 3986 Section 4.2](https://datatracker.ietf.org/doc/html/rfc3986#section-4.2): - network-path references, e.g. `//example.com/path` - absolute-path references, e.g. `/path` - relative-path references, e.g. `subpath` The following methods can be used to identify the type of the URI. ### `GuzzleHttp\Psr7\Uri::isAbsolute` `public static function isAbsolute(UriInterface $uri): bool` Whether the URI is absolute, i.e. it has a scheme. ### `GuzzleHttp\Psr7\Uri::isNetworkPathReference` `public static function isNetworkPathReference(UriInterface $uri): bool` Whether the URI is a network-path reference. A relative reference that begins with two slash characters is termed an network-path reference. ### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference` `public static function isAbsolutePathReference(UriInterface $uri): bool` Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is termed an absolute-path reference. ### `GuzzleHttp\Psr7\Uri::isRelativePathReference` `public static function isRelativePathReference(UriInterface $uri): bool` Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is termed a relative-path reference. ### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` `public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool` Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its fragment component, identical to the base URI. When no base URI is given, only an empty URI reference (apart from its fragment) is considered a same-document reference. ## URI Components Additional methods to work with URI components. ### `GuzzleHttp\Psr7\Uri::isDefaultPort` `public static function isDefaultPort(UriInterface $uri): bool` Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used independently of the implementation. ### `GuzzleHttp\Psr7\Uri::composeComponents` `public static function composeComponents($scheme, $authority, $path, $query, $fragment): string` Composes a URI reference string from its various components according to [RFC 3986 Section 5.3](https://datatracker.ietf.org/doc/html/rfc3986#section-5.3). Usually this method does not need to be called manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`. ### `GuzzleHttp\Psr7\Uri::fromParts` `public static function fromParts(array $parts): UriInterface` Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components. ### `GuzzleHttp\Psr7\Uri::withQueryValue` `public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface` Creates a new URI with a specific query string value. Any existing query string values that exactly match the provided key are removed and replaced with the given key value pair. A value of null will set the query string key without a value, e.g. "key" instead of "key=value". ### `GuzzleHttp\Psr7\Uri::withQueryValues` `public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an associative array of key => value. ### `GuzzleHttp\Psr7\Uri::withoutQueryValue` `public static function withoutQueryValue(UriInterface $uri, $key): UriInterface` Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the provided key are removed. ## Cross-Origin Detection `GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin. ### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin` `public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool` Determines if a modified URL should be considered cross-origin with respect to an original URL. ## Reference Resolution `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according to [RFC 3986 Section 5](https://datatracker.ietf.org/doc/html/rfc3986#section-5). This is for example also what web browsers do when resolving a link in a website based on the current request URI. ### `GuzzleHttp\Psr7\UriResolver::resolve` `public static function resolve(UriInterface $base, UriInterface $rel): UriInterface` Converts the relative URI into a new URI that is resolved against the base URI. ### `GuzzleHttp\Psr7\UriResolver::removeDotSegments` `public static function removeDotSegments(string $path): string` Removes dot segments from a path and returns the new path according to [RFC 3986 Section 5.2.4](https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4). ### `GuzzleHttp\Psr7\UriResolver::relativize` `public static function relativize(UriInterface $base, UriInterface $target): UriInterface` Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve(): ```php (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) ``` One use-case is to use the current request URI as base URI and then generate relative links in your documents to reduce the document size or offer self-contained downloadable document archives. ```php $base = new Uri('http://example.com/a/b/'); echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. ``` ## Normalization and Comparison `GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to [RFC 3986 Section 6](https://datatracker.ietf.org/doc/html/rfc3986#section-6). ### `GuzzleHttp\Psr7\UriNormalizer::normalize` `public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface` Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask of normalizations to apply. The following normalizations are available: - `UriNormalizer::PRESERVING_NORMALIZATIONS` Default normalizations which only include the ones that preserve semantics. - `UriNormalizer::CAPITALIZE_PERCENT_ENCODING` All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b` - `UriNormalizer::DECODE_UNRESERVED_CHARACTERS` Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers. Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/` - `UriNormalizer::CONVERT_EMPTY_PATH` Converts the empty path to "/" for http and https URIs. Example: `http://example.org` → `http://example.org/` - `UriNormalizer::REMOVE_DEFAULT_HOST` Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to RFC 3986. Example: `file://localhost/myfile` → `file:///myfile` - `UriNormalizer::REMOVE_DEFAULT_PORT` Removes the default port of the given URI scheme from the URI. Example: `http://example.org:80/` → `http://example.org/` - `UriNormalizer::REMOVE_DOT_SEGMENTS` Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would change the semantics of the URI reference. Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html` - `UriNormalizer::REMOVE_DUPLICATE_SLASHES` Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization may change the semantics. Encoded slashes (%2F) are not removed. Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html` - `UriNormalizer::SORT_QUERY_PARAMETERS` Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be significant (this is not defined by the standard). So this normalization is not safe and may change the semantics of the URI. Example: `?lang=en&article=fred` → `?article=fred&lang=en` ### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent` `public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool` Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given `$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent. This of course assumes they will be resolved against the same base URI. If this is not the case, determination of equivalence or difference of relative references does not mean anything. ## Security If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information. ## License Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. ## For Enterprise Available as part of the Tidelift Subscription The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-psr7?utm_source=packagist-guzzlehttp-psr7&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) 15 + 32]); $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } } getScheme() != '') { return $rel->withPath(self::removeDotSegments($rel->getPath())); } if ($rel->getAuthority() != '') { $targetAuthority = $rel->getAuthority(); $targetPath = self::removeDotSegments($rel->getPath()); $targetQuery = $rel->getQuery(); } else { $targetAuthority = $base->getAuthority(); if ($rel->getPath() === '') { $targetPath = $base->getPath(); $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); } else { if ($rel->getPath()[0] === '/') { $targetPath = $rel->getPath(); } else { if ($targetAuthority != '' && $base->getPath() === '') { $targetPath = '/'.$rel->getPath(); } else { $lastSlashPos = strrpos($base->getPath(), '/'); if ($lastSlashPos === false) { $targetPath = $rel->getPath(); } else { $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1).$rel->getPath(); } } } $targetPath = self::removeDotSegments($targetPath); $targetQuery = $rel->getQuery(); } } return new Uri(Uri::composeComponents( $base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment() )); } /** * Returns the target URI as a relative reference from the base URI. * * This method is the counterpart to resolve(): * * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) * * One use-case is to use the current request URI as base URI and then generate relative links in your documents * to reduce the document size or offer self-contained downloadable document archives. * * $base = new Uri('http://example.com/a/b/'); * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. * * This method also accepts a target that is already relative and will try to relativize it further. Only a * relative-path reference will be returned as-is. * * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well */ public static function relativize(UriInterface $base, UriInterface $target): UriInterface { if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '') ) { return $target; } if (Uri::isRelativePathReference($target)) { // As the target is already highly relative we return it as-is. It would be possible to resolve // the target with `$target = self::resolve($base, $target);` and then try make it more relative // by removing a duplicate query. But let's not do that automatically. return $target; } if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { return $target->withScheme(''); } // We must remove the path before removing the authority because if the path starts with two slashes, the URI // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also // invalid. $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); if ($base->getPath() !== $target->getPath()) { return $emptyPathUri->withPath(self::getRelativePath($base, $target)); } if ($base->getQuery() === $target->getQuery()) { // Only the target fragment is left. And it must be returned even if base and target fragment are the same. return $emptyPathUri->withQuery(''); } // If the base URI has a query but the target has none, we cannot return an empty path reference as it would // inherit the base query component when resolving. if ($target->getQuery() === '') { $segments = explode('/', $target->getPath()); /** @var string $lastSegment */ $lastSegment = end($segments); return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); } return $emptyPathUri; } private static function getRelativePath(UriInterface $base, UriInterface $target): string { $sourceSegments = explode('/', $base->getPath()); $targetSegments = explode('/', $target->getPath()); array_pop($sourceSegments); $targetLastSegment = array_pop($targetSegments); foreach ($sourceSegments as $i => $segment) { if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { unset($sourceSegments[$i], $targetSegments[$i]); } else { break; } } $targetSegments[] = $targetLastSegment; $relativePath = str_repeat('../', count($sourceSegments)).implode('/', $targetSegments); // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) { $relativePath = "./$relativePath"; } elseif ('/' === $relativePath[0]) { if ($base->getAuthority() != '' && $base->getPath() === '') { // In this case an extra slash is added by resolve() automatically. So we must not add one here. $relativePath = ".$relativePath"; } else { $relativePath = "./$relativePath"; } } return $relativePath; } private function __construct() { // cannot be instantiated } } */ private $methods; /** * @param array $methods Hash of method name to a callable. */ public function __construct(array $methods) { $this->methods = $methods; // Create the functions on the class foreach ($methods as $name => $fn) { $this->{'_fn_'.$name} = $fn; } } /** * Lazily determine which methods are not implemented. * * @throws \BadMethodCallException */ public function __get(string $name): void { throw new \BadMethodCallException(str_replace('_fn_', '', $name) .'() is not implemented in the FnStream'); } /** * The close method is called on the underlying stream only if possible. */ public function __destruct() { if (isset($this->_fn_close)) { ($this->_fn_close)(); } } /** * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. * * @throws \LogicException */ public function __wakeup(): void { throw new \LogicException('FnStream should never be unserialized'); } /** * Adds custom functionality to an underlying stream by intercepting * specific method calls. * * @param StreamInterface $stream Stream to decorate * @param array $methods Hash of method name to a closure * * @return FnStream */ public static function decorate(StreamInterface $stream, array $methods) { // If any of the required methods were not provided, then simply // proxy to the decorated stream. foreach (array_diff(self::SLOTS, array_keys($methods)) as $diff) { /** @var callable $callable */ $callable = [$stream, $diff]; $methods[$diff] = $callable; } return new self($methods); } public function __toString(): string { try { /** @var string */ return ($this->_fn___toString)(); } catch (\Throwable $e) { if (\PHP_VERSION_ID >= 70400) { throw $e; } trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); return ''; } } public function close(): void { ($this->_fn_close)(); } public function detach() { return ($this->_fn_detach)(); } public function getSize(): ?int { return ($this->_fn_getSize)(); } public function tell(): int { return ($this->_fn_tell)(); } public function eof(): bool { return ($this->_fn_eof)(); } public function isSeekable(): bool { return ($this->_fn_isSeekable)(); } public function rewind(): void { ($this->_fn_rewind)(); } public function seek($offset, $whence = SEEK_SET): void { ($this->_fn_seek)($offset, $whence); } public function isWritable(): bool { return ($this->_fn_isWritable)(); } public function write($string): int { return ($this->_fn_write)($string); } public function isReadable(): bool { return ($this->_fn_isReadable)(); } public function read($length): string { return ($this->_fn_read)($length); } public function getContents(): string { return ($this->_fn_getContents)(); } /** * @return mixed */ public function getMetadata($key = null) { return ($this->_fn_getMetadata)($key); } } remoteStream = $stream; $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); } public function getSize(): ?int { $remoteSize = $this->remoteStream->getSize(); if (null === $remoteSize) { return null; } return max($this->stream->getSize(), $remoteSize); } public function rewind(): void { $this->seek(0); } public function seek($offset, $whence = SEEK_SET): void { if ($whence === SEEK_SET) { $byte = $offset; } elseif ($whence === SEEK_CUR) { $byte = $offset + $this->tell(); } elseif ($whence === SEEK_END) { $size = $this->remoteStream->getSize(); if ($size === null) { $size = $this->cacheEntireStream(); } $byte = $size + $offset; } else { throw new \InvalidArgumentException('Invalid whence'); } $diff = $byte - $this->stream->getSize(); if ($diff > 0) { // Read the remoteStream until we have read in at least the amount // of bytes requested, or we reach the end of the file. while ($diff > 0 && !$this->remoteStream->eof()) { $this->read($diff); $diff = $byte - $this->stream->getSize(); } } else { // We can just do a normal seek since we've already seen this byte. $this->stream->seek($byte); } } public function read($length): string { // Perform a regular read on any previously read data from the buffer $data = $this->stream->read($length); $remaining = $length - strlen($data); // More data was requested so read from the remote stream if ($remaining) { // If data was written to the buffer in a position that would have // been filled from the remote stream, then we must skip bytes on // the remote stream to emulate overwriting bytes from that // position. This mimics the behavior of other PHP stream wrappers. $remoteData = $this->remoteStream->read( $remaining + $this->skipReadBytes ); if ($this->skipReadBytes) { $len = strlen($remoteData); $remoteData = substr($remoteData, $this->skipReadBytes); $this->skipReadBytes = max(0, $this->skipReadBytes - $len); } $data .= $remoteData; $this->stream->write($remoteData); } return $data; } public function write($string): int { // When appending to the end of the currently read stream, you'll want // to skip bytes from being read from the remote stream to emulate // other stream wrappers. Basically replacing bytes of data of a fixed // length. $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell(); if ($overflow > 0) { $this->skipReadBytes += $overflow; } return $this->stream->write($string); } public function eof(): bool { return $this->stream->eof() && $this->remoteStream->eof(); } /** * Close both the remote stream and buffer stream */ public function close(): void { $this->remoteStream->close(); $this->stream->close(); } private function cacheEntireStream(): int { $target = new FnStream(['write' => 'strlen']); Utils::copyToStream($this, $target); return $this->tell(); } } serverParams = $serverParams; parent::__construct($method, $uri, $headers, $body, $version); } /** * Return an UploadedFile instance array. * * @param array $files An array which respect $_FILES structure * * @throws InvalidArgumentException for unrecognized values */ public static function normalizeFiles(array $files): array { $normalized = []; foreach ($files as $key => $value) { if ($value instanceof UploadedFileInterface) { $normalized[$key] = $value; } elseif (is_array($value) && isset($value['tmp_name'])) { $normalized[$key] = self::createUploadedFileFromSpec($value); } elseif (is_array($value)) { $normalized[$key] = self::normalizeFiles($value); continue; } else { throw new InvalidArgumentException('Invalid value in files specification'); } } return $normalized; } /** * Create and return an UploadedFile instance from a $_FILES specification. * * If the specification represents an array of values, this method will * delegate to normalizeNestedFileSpec() and return that return value. * * @param array $value $_FILES struct * * @return UploadedFileInterface|UploadedFileInterface[] */ private static function createUploadedFileFromSpec(array $value) { if (is_array($value['tmp_name'])) { return self::normalizeNestedFileSpec($value); } return new UploadedFile( $value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type'] ); } /** * Normalize an array of file specifications. * * Loops through all nested files and returns a normalized array of * UploadedFileInterface instances. * * @return UploadedFileInterface[] */ private static function normalizeNestedFileSpec(array $files = []): array { $normalizedFiles = []; foreach (array_keys($files['tmp_name']) as $key) { $spec = [ 'tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key] ?? null, 'error' => $files['error'][$key] ?? null, 'name' => $files['name'][$key] ?? null, 'type' => $files['type'][$key] ?? null, ]; $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); } return $normalizedFiles; } /** * Return a ServerRequest populated with superglobals: * $_GET * $_POST * $_COOKIE * $_FILES * $_SERVER */ public static function fromGlobals(): ServerRequestInterface { $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; $headers = getallheaders(); $uri = self::getUriFromGlobals(); $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); return $serverRequest ->withCookieParams($_COOKIE) ->withQueryParams($_GET) ->withParsedBody($_POST) ->withUploadedFiles(self::normalizeFiles($_FILES)); } private static function extractHostAndPortFromAuthority(string $authority): array { $uri = 'http://'.$authority; $parts = parse_url($uri); if (false === $parts) { return [null, null]; } $host = $parts['host'] ?? null; $port = $parts['port'] ?? null; return [$host, $port]; } /** * Get a Uri populated with values from $_SERVER. */ public static function getUriFromGlobals(): UriInterface { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = false; if (isset($_SERVER['HTTP_HOST'])) { [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); if ($host !== null) { $uri = $uri->withHost($host); } if ($port !== null) { $hasPort = true; $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); } elseif (isset($_SERVER['SERVER_ADDR'])) { $uri = $uri->withHost($_SERVER['SERVER_ADDR']); } if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { $uri = $uri->withPort($_SERVER['SERVER_PORT']); } $hasQuery = false; if (isset($_SERVER['REQUEST_URI'])) { $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = true; $uri = $uri->withQuery($requestUriParts[1]); } } if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { $uri = $uri->withQuery($_SERVER['QUERY_STRING']); } return $uri; } public function getServerParams(): array { return $this->serverParams; } public function getUploadedFiles(): array { return $this->uploadedFiles; } public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface { $new = clone $this; $new->uploadedFiles = $uploadedFiles; return $new; } public function getCookieParams(): array { return $this->cookieParams; } public function withCookieParams(array $cookies): ServerRequestInterface { $new = clone $this; $new->cookieParams = $cookies; return $new; } public function getQueryParams(): array { return $this->queryParams; } public function withQueryParams(array $query): ServerRequestInterface { $new = clone $this; $new->queryParams = $query; return $new; } /** * @return array|object|null */ public function getParsedBody() { return $this->parsedBody; } public function withParsedBody($data): ServerRequestInterface { $new = clone $this; $new->parsedBody = $data; return $new; } public function getAttributes(): array { return $this->attributes; } /** * @return mixed */ public function getAttribute($attribute, $default = null) { if (false === array_key_exists($attribute, $this->attributes)) { return $default; } return $this->attributes[$attribute]; } public function withAttribute($attribute, $value): ServerRequestInterface { $new = clone $this; $new->attributes[$attribute] = $value; return $new; } public function withoutAttribute($attribute): ServerRequestInterface { if (false === array_key_exists($attribute, $this->attributes)) { return $this; } $new = clone $this; unset($new->attributes[$attribute]); return $new; } } filename = $filename; $this->mode = $mode; // unsetting the property forces the first access to go through // __get(). unset($this->stream); } /** * Creates the underlying stream lazily when required. */ protected function createStream(): StreamInterface { return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); } } array of values */ private $headers = []; /** @var string[] Map of lowercase header name => original name at registration */ private $headerNames = []; /** @var string */ private $protocol = '1.1'; /** @var StreamInterface|null */ private $stream; public function getProtocolVersion(): string { return $this->protocol; } /** * @return static */ public function withProtocolVersion($version): MessageInterface { if ($this->protocol === $version) { return $this; } $new = clone $this; $new->protocol = $version; return $new; } public function getHeaders(): array { return $this->headers; } public function hasHeader($header): bool { return isset($this->headerNames[strtolower($header)]); } public function getHeader($header): array { $header = strtolower($header); if (!isset($this->headerNames[$header])) { return []; } $header = $this->headerNames[$header]; return $this->headers[$header]; } public function getHeaderLine($header): string { return implode(', ', $this->getHeader($header)); } /** * @return static */ public function withHeader($header, $value): MessageInterface { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { unset($new->headers[$new->headerNames[$normalized]]); } $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; return $new; } /** * @return static */ public function withAddedHeader($header, $value): MessageInterface { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $new->headers[$header] = array_merge($this->headers[$header], $value); } else { $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; } return $new; } /** * @return static */ public function withoutHeader($header): MessageInterface { $normalized = strtolower($header); if (!isset($this->headerNames[$normalized])) { return $this; } $header = $this->headerNames[$normalized]; $new = clone $this; unset($new->headers[$header], $new->headerNames[$normalized]); return $new; } public function getBody(): StreamInterface { if (!$this->stream) { $this->stream = Utils::streamFor(''); } return $this->stream; } /** * @return static */ public function withBody(StreamInterface $body): MessageInterface { if ($body === $this->stream) { return $this; } $new = clone $this; $new->stream = $body; return $new; } /** * @param (string|string[])[] $headers */ private function setHeaders(array $headers): void { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { // Numeric array keys are converted to int by PHP. $header = (string) $header; $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $this->headers[$header] = array_merge($this->headers[$header], $value); } else { $this->headerNames[$normalized] = $header; $this->headers[$header] = $value; } } } /** * @param mixed $value * * @return string[] */ private function normalizeHeaderValue($value): array { if (!is_array($value)) { return $this->trimAndValidateHeaderValues([$value]); } return $this->trimAndValidateHeaderValues($value); } /** * Trims whitespace from the header values. * * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. * * header-field = field-name ":" OWS field-value OWS * OWS = *( SP / HTAB ) * * @param mixed[] $values Header values * * @return string[] Trimmed header values * * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4 */ private function trimAndValidateHeaderValues(array $values): array { return array_map(function ($value) { if (!is_scalar($value) && null !== $value) { throw new \InvalidArgumentException(sprintf( 'Header value must be scalar or null but %s provided.', is_object($value) ? get_class($value) : gettype($value) )); } $trimmed = trim((string) $value, " \t"); $this->assertValue($trimmed); return $trimmed; }, array_values($values)); } /** * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 * * @param mixed $header */ private function assertHeader($header): void { if (!is_string($header)) { throw new \InvalidArgumentException(sprintf( 'Header name must be a string but %s provided.', is_object($header) ? get_class($header) : gettype($header) )); } if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) { throw new \InvalidArgumentException( sprintf('"%s" is not valid header name.', $header) ); } } /** * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 * * field-value = *( field-content / obs-fold ) * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] * field-vchar = VCHAR / obs-text * VCHAR = %x21-7E * obs-text = %x80-FF * obs-fold = CRLF 1*( SP / HTAB ) */ private function assertValue(string $value): void { // The regular expression intentionally does not support the obs-fold production, because as // per RFC 7230#3.2.4: // // A sender MUST NOT generate a message that includes // line folding (i.e., that has any field-value that contains a match to // the obs-fold rule) unless the message is intended for packaging // within the message/http media type. // // Clients must not send a request with line folding and a server sending folded headers is // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting // folding is not likely to break any legitimate use case. if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) { throw new \InvalidArgumentException( sprintf('"%s" is not valid header value.', $value) ); } } } isReadable()) { $mode = $stream->isWritable() ? 'r+' : 'r'; } elseif ($stream->isWritable()) { $mode = 'w'; } else { throw new \InvalidArgumentException('The stream must be readable, ' .'writable, or both.'); } return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream)); } /** * Creates a stream context that can be used to open a stream as a php stream resource. * * @return resource */ public static function createStreamContext(StreamInterface $stream) { return stream_context_create([ 'guzzle' => ['stream' => $stream], ]); } /** * Registers the stream wrapper if needed */ public static function register(): void { if (!in_array('guzzle', stream_get_wrappers())) { stream_wrapper_register('guzzle', __CLASS__); } } public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null): bool { $options = stream_context_get_options($this->context); if (!isset($options['guzzle']['stream'])) { return false; } $this->mode = $mode; $this->stream = $options['guzzle']['stream']; return true; } public function stream_read(int $count): string { return $this->stream->read($count); } public function stream_write(string $data): int { return $this->stream->write($data); } public function stream_tell(): int { return $this->stream->tell(); } public function stream_eof(): bool { return $this->stream->eof(); } public function stream_seek(int $offset, int $whence): bool { $this->stream->seek($offset, $whence); return true; } /** * @return resource|false */ public function stream_cast(int $cast_as) { $stream = clone $this->stream; $resource = $stream->detach(); return $resource ?? false; } /** * @return array{ * dev: int, * ino: int, * mode: int, * nlink: int, * uid: int, * gid: int, * rdev: int, * size: int, * atime: int, * mtime: int, * ctime: int, * blksize: int, * blocks: int * }|false */ public function stream_stat() { if ($this->stream->getSize() === null) { return false; } static $modeMap = [ 'r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188, ]; return [ 'dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0, ]; } /** * @return array{ * dev: int, * ino: int, * mode: int, * nlink: int, * uid: int, * gid: int, * rdev: int, * size: int, * atime: int, * mtime: int, * ctime: int, * blksize: int, * blocks: int * } */ public function url_stat(string $path, int $flags): array { return [ 'dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0, ]; } } getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https') ) { $uri = $uri->withPath('/'); } if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { $uri = $uri->withHost(''); } if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { $uri = $uri->withPort(null); } if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); } if ($flags & self::REMOVE_DUPLICATE_SLASHES) { $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath())); } if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { $queryKeyValues = explode('&', $uri->getQuery()); sort($queryKeyValues); $uri = $uri->withQuery(implode('&', $queryKeyValues)); } return $uri; } /** * Whether two URIs can be considered equivalent. * * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be * resolved against the same base URI. If this is not the case, determination of equivalence or difference of * relative references does not mean anything. * * @param UriInterface $uri1 An URI to compare * @param UriInterface $uri2 An URI to compare * @param int $normalizations A bitmask of normalizations to apply, see constants * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.1 */ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS): bool { return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); } private static function capitalizePercentEncoding(UriInterface $uri): UriInterface { $regex = '/(?:%[A-Fa-f0-9]{2})++/'; $callback = function (array $match): string { return strtoupper($match[0]); }; return $uri->withPath( preg_replace_callback($regex, $callback, $uri->getPath()) )->withQuery( preg_replace_callback($regex, $callback, $uri->getQuery()) ); } private static function decodeUnreservedCharacters(UriInterface $uri): UriInterface { $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; $callback = function (array $match): string { return rawurldecode($match[0]); }; return $uri->withPath( preg_replace_callback($regex, $callback, $uri->getPath()) )->withQuery( preg_replace_callback($regex, $callback, $uri->getQuery()) ); } private function __construct() { // cannot be instantiated } } getSize(); } return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); } public function createStream(string $content = ''): StreamInterface { return Utils::streamFor($content); } public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface { try { $resource = Utils::tryFopen($file, $mode); } catch (\RuntimeException $e) { if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) { throw new \InvalidArgumentException(sprintf('Invalid file opening mode "%s"', $mode), 0, $e); } throw $e; } return Utils::streamFor($resource); } public function createStreamFromResource($resource): StreamInterface { return Utils::streamFor($resource); } public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface { if (empty($method)) { if (!empty($serverParams['REQUEST_METHOD'])) { $method = $serverParams['REQUEST_METHOD']; } else { throw new \InvalidArgumentException('Cannot determine HTTP method'); } } return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); } public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface { return new Response($code, [], null, '1.1', $reasonPhrase); } public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); } public function createUri(string $uri = ''): UriInterface { return new Uri($uri); } } addStream($stream); } } public function __toString(): string { try { $this->rewind(); return $this->getContents(); } catch (\Throwable $e) { if (\PHP_VERSION_ID >= 70400) { throw $e; } trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); return ''; } } /** * Add a stream to the AppendStream * * @param StreamInterface $stream Stream to append. Must be readable. * * @throws \InvalidArgumentException if the stream is not readable */ public function addStream(StreamInterface $stream): void { if (!$stream->isReadable()) { throw new \InvalidArgumentException('Each stream must be readable'); } // The stream is only seekable if all streams are seekable if (!$stream->isSeekable()) { $this->seekable = false; } $this->streams[] = $stream; } public function getContents(): string { return Utils::copyToString($this); } /** * Closes each attached stream. */ public function close(): void { $this->pos = $this->current = 0; $this->seekable = true; foreach ($this->streams as $stream) { $stream->close(); } $this->streams = []; } /** * Detaches each attached stream. * * Returns null as it's not clear which underlying stream resource to return. */ public function detach() { $this->pos = $this->current = 0; $this->seekable = true; foreach ($this->streams as $stream) { $stream->detach(); } $this->streams = []; return null; } public function tell(): int { return $this->pos; } /** * Tries to calculate the size by adding the size of each stream. * * If any of the streams do not return a valid number, then the size of the * append stream cannot be determined and null is returned. */ public function getSize(): ?int { $size = 0; foreach ($this->streams as $stream) { $s = $stream->getSize(); if ($s === null) { return null; } $size += $s; } return $size; } public function eof(): bool { return !$this->streams || ($this->current >= count($this->streams) - 1 && $this->streams[$this->current]->eof()); } public function rewind(): void { $this->seek(0); } /** * Attempts to seek to the given position. Only supports SEEK_SET. */ public function seek($offset, $whence = SEEK_SET): void { if (!$this->seekable) { throw new \RuntimeException('This AppendStream is not seekable'); } elseif ($whence !== SEEK_SET) { throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); } $this->pos = $this->current = 0; // Rewind each stream foreach ($this->streams as $i => $stream) { try { $stream->rewind(); } catch (\Exception $e) { throw new \RuntimeException('Unable to seek stream ' .$i.' of the AppendStream', 0, $e); } } // Seek to the actual position by reading from each stream while ($this->pos < $offset && !$this->eof()) { $result = $this->read(min(8096, $offset - $this->pos)); if ($result === '') { break; } } } /** * Reads from all of the appended streams until the length is met or EOF. */ public function read($length): string { $buffer = ''; $total = count($this->streams) - 1; $remaining = $length; $progressToNext = false; while ($remaining > 0) { // Progress to the next stream if needed. if ($progressToNext || $this->streams[$this->current]->eof()) { $progressToNext = false; if ($this->current === $total) { break; } ++$this->current; } $result = $this->streams[$this->current]->read($remaining); if ($result === '') { $progressToNext = true; continue; } $buffer .= $result; $remaining = $length - strlen($buffer); } $this->pos += strlen($buffer); return $buffer; } public function isReadable(): bool { return true; } public function isWritable(): bool { return false; } public function isSeekable(): bool { return $this->seekable; } public function write($string): int { throw new \RuntimeException('Cannot write to an AppendStream'); } /** * @return mixed */ public function getMetadata($key = null) { return $key ? null : []; } } getHost(), $modified->getHost()) !== 0) { return true; } if ($original->getScheme() !== $modified->getScheme()) { return true; } if (self::computePort($original) !== self::computePort($modified)) { return true; } return false; } private static function computePort(UriInterface $uri): int { $port = $uri->getPort(); if (null !== $port) { return $port; } return 'https' === $uri->getScheme() ? 443 : 80; } private function __construct() { // cannot be instantiated } } ]+>|[^=]+/', $kvp, $matches)) { $m = $matches[0]; if (isset($m[1])) { $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); } else { $part[] = trim($m[0], $trimmed); } } } if ($part) { $params[] = $part; } } } return $params; } /** * Converts an array of header values that may contain comma separated * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. * * @deprecated Use self::splitList() instead. */ public static function normalize($header): array { $result = []; foreach ((array) $header as $value) { foreach (self::splitList($value) as $parsed) { $result[] = $parsed; } } return $result; } /** * Splits a HTTP header defined to contain a comma-separated list into * each individual value. Empty values will be removed. * * Example headers include 'accept', 'cache-control' and 'if-none-match'. * * This method must not be used to parse headers that are not defined as * a list, such as 'user-agent' or 'set-cookie'. * * @param string|string[] $values Header value as returned by MessageInterface::getHeader() * * @return string[] */ public static function splitList($values): array { if (!\is_array($values)) { $values = [$values]; } $result = []; foreach ($values as $value) { if (!\is_string($value)) { throw new \TypeError('$header must either be a string or an array containing strings.'); } $v = ''; $isQuoted = false; $isEscaped = false; for ($i = 0, $max = \strlen($value); $i < $max; ++$i) { if ($isEscaped) { $v .= $value[$i]; $isEscaped = false; continue; } if (!$isQuoted && $value[$i] === ',') { $v = \trim($v); if ($v !== '') { $result[] = $v; } $v = ''; continue; } if ($isQuoted && $value[$i] === '\\') { $isEscaped = true; $v .= $value[$i]; continue; } if ($value[$i] === '"') { $isQuoted = !$isQuoted; $v .= $value[$i]; continue; } $v .= $value[$i]; } $v = \trim($v); if ($v !== '') { $result[] = $v; } } return $result; } } getMethod().' ' .$message->getRequestTarget()) .' HTTP/'.$message->getProtocolVersion(); if (!$message->hasHeader('host')) { $msg .= "\r\nHost: ".$message->getUri()->getHost(); } } elseif ($message instanceof ResponseInterface) { $msg = 'HTTP/'.$message->getProtocolVersion().' ' .$message->getStatusCode().' ' .$message->getReasonPhrase(); } else { throw new \InvalidArgumentException('Unknown message type'); } foreach ($message->getHeaders() as $name => $values) { if (is_string($name) && strtolower($name) === 'set-cookie') { foreach ($values as $value) { $msg .= "\r\n{$name}: ".$value; } } else { $msg .= "\r\n{$name}: ".implode(', ', $values); } } return "{$msg}\r\n\r\n".$message->getBody(); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary */ public static function bodySummary(MessageInterface $message, int $truncateAt = 120): ?string { $body = $message->getBody(); if (!$body->isSeekable() || !$body->isReadable()) { return null; } $size = $body->getSize(); if ($size === 0) { return null; } $body->rewind(); $summary = $body->read($truncateAt); $body->rewind(); if ($size > $truncateAt) { $summary .= ' (truncated...)'; } // Matches any printable character, including unicode characters: // letters, marks, numbers, punctuation, spacing, and separators. if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/u', $summary) !== 0) { return null; } return $summary; } /** * Attempts to rewind a message body and throws an exception on failure. * * The body of the message will only be rewound if a call to `tell()` * returns a value other than `0`. * * @param MessageInterface $message Message to rewind * * @throws \RuntimeException */ public static function rewindBody(MessageInterface $message): void { $body = $message->getBody(); if ($body->tell()) { $body->rewind(); } } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. */ public static function parseMessage(string $message): array { if (!$message) { throw new \InvalidArgumentException('Invalid message'); } $message = ltrim($message, "\r\n"); $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); if ($messageParts === false || count($messageParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); } [$rawHeaders, $body] = $messageParts; $rawHeaders .= "\r\n"; // Put back the delimiter we split previously $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); if ($headerParts === false || count($headerParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing status line'); } [$startLine, $rawHeaders] = $headerParts; if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); } /** @var array[] $headerLines */ $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); // If these aren't the same, then one line didn't match and there's an invalid header. if ($count !== substr_count($rawHeaders, "\n")) { // Folding is deprecated, see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4 if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); } throw new \InvalidArgumentException('Invalid header syntax'); } $headers = []; foreach ($headerLines as $headerLine) { $headers[$headerLine[1]][] = $headerLine[2]; } return [ 'start-line' => $startLine, 'headers' => $headers, 'body' => $body, ]; } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). */ public static function parseRequestUri(string $path, array $headers): string { $hostKey = array_filter(array_keys($headers), function ($k) { // Numeric array keys are converted to int by PHP. $k = (string) $k; return strtolower($k) === 'host'; }); // If no host is found, then a full URI cannot be constructed. if (!$hostKey) { return $path; } $host = $headers[reset($hostKey)][0]; $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; return $scheme.'://'.$host.'/'.ltrim($path, '/'); } /** * Parses a request message string into a request object. * * @param string $message Request message string. */ public static function parseRequest(string $message): RequestInterface { $data = self::parseMessage($message); $matches = []; if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { throw new \InvalidArgumentException('Invalid request string'); } $parts = explode(' ', $data['start-line'], 3); $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; $request = new Request( $parts[0], $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version ); return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); } /** * Parses a response message string into a response object. * * @param string $message Response message string. */ public static function parseResponse(string $message): ResponseInterface { $data = self::parseMessage($message); // According to https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2 // the space between status-code and reason-phrase is required. But // browsers accept responses without space and reason as well. if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { throw new \InvalidArgumentException('Invalid response string: '.$data['start-line']); } $parts = explode(' ', $data['start-line'], 3); return new Response( (int) $parts[1], $data['headers'], $data['body'], explode('/', $parts[0])[1], $parts[2] ?? null ); } } $v) { if (!in_array(strtolower((string) $k), $keys)) { $result[$k] = $v; } } return $result; } /** * Copy the contents of a stream into another stream until the given number * of bytes have been read. * * @param StreamInterface $source Stream to read from * @param StreamInterface $dest Stream to write to * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. */ public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void { $bufferSize = 8192; if ($maxLen === -1) { while (!$source->eof()) { if (!$dest->write($source->read($bufferSize))) { break; } } } else { $remaining = $maxLen; while ($remaining > 0 && !$source->eof()) { $buf = $source->read(min($bufferSize, $remaining)); $len = strlen($buf); if (!$len) { break; } $remaining -= $len; $dest->write($buf); } } } /** * Copy the contents of a stream into a string until the given number of * bytes have been read. * * @param StreamInterface $stream Stream to read * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. */ public static function copyToString(StreamInterface $stream, int $maxLen = -1): string { $buffer = ''; if ($maxLen === -1) { while (!$stream->eof()) { $buf = $stream->read(1048576); if ($buf === '') { break; } $buffer .= $buf; } return $buffer; } $len = 0; while (!$stream->eof() && $len < $maxLen) { $buf = $stream->read($maxLen - $len); if ($buf === '') { break; } $buffer .= $buf; $len = strlen($buffer); } return $buffer; } /** * Calculate a hash of a stream. * * This method reads the entire stream to calculate a rolling hash, based * on PHP's `hash_init` functions. * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @throws \RuntimeException on error. */ public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string { $pos = $stream->tell(); if ($pos > 0) { $stream->rewind(); } $ctx = hash_init($algo); while (!$stream->eof()) { hash_update($ctx, $stream->read(1048576)); } $out = hash_final($ctx, $rawOutput); $stream->seek($pos); return $out; } /** * Clone and modify a request with the given changes. * * This method is useful for reducing the number of clones needed to mutate * a message. * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. * - remove_headers: (array) Remove the given headers. * - body: (mixed) Sets the given body. * - uri: (UriInterface) Set the URI. * - query: (string) Set the query string value of the URI. * - version: (string) Set the protocol version. * * @param RequestInterface $request Request to clone and modify. * @param array $changes Changes to apply. */ public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface { if (!$changes) { return $request; } $headers = $request->getHeaders(); if (!isset($changes['uri'])) { $uri = $request->getUri(); } else { // Remove the host header if one is on the URI if ($host = $changes['uri']->getHost()) { $changes['set_headers']['Host'] = $host; if ($port = $changes['uri']->getPort()) { $standardPorts = ['http' => 80, 'https' => 443]; $scheme = $changes['uri']->getScheme(); if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { $changes['set_headers']['Host'] .= ':'.$port; } } } $uri = $changes['uri']; } if (!empty($changes['remove_headers'])) { $headers = self::caselessRemove($changes['remove_headers'], $headers); } if (!empty($changes['set_headers'])) { $headers = self::caselessRemove(array_keys($changes['set_headers']), $headers); $headers = $changes['set_headers'] + $headers; } if (isset($changes['query'])) { $uri = $uri->withQuery($changes['query']); } if ($request instanceof ServerRequestInterface) { $new = (new ServerRequest( $changes['method'] ?? $request->getMethod(), $uri, $headers, $changes['body'] ?? $request->getBody(), $changes['version'] ?? $request->getProtocolVersion(), $request->getServerParams() )) ->withParsedBody($request->getParsedBody()) ->withQueryParams($request->getQueryParams()) ->withCookieParams($request->getCookieParams()) ->withUploadedFiles($request->getUploadedFiles()); foreach ($request->getAttributes() as $key => $value) { $new = $new->withAttribute($key, $value); } return $new; } return new Request( $changes['method'] ?? $request->getMethod(), $uri, $headers, $changes['body'] ?? $request->getBody(), $changes['version'] ?? $request->getProtocolVersion() ); } /** * Read a line from the stream up to the maximum allowed buffer length. * * @param StreamInterface $stream Stream to read from * @param int|null $maxLength Maximum buffer length */ public static function readLine(StreamInterface $stream, ?int $maxLength = null): string { $buffer = ''; $size = 0; while (!$stream->eof()) { if ('' === ($byte = $stream->read(1))) { return $buffer; } $buffer .= $byte; // Break when a new line is found or the max length - 1 is reached if ($byte === "\n" || ++$size === $maxLength - 1) { break; } } return $buffer; } /** * Redact the password in the user info part of a URI. */ public static function redactUserInfo(UriInterface $uri): UriInterface { $userInfo = $uri->getUserInfo(); if (false !== ($pos = \strpos($userInfo, ':'))) { return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); } return $uri; } /** * Create a new stream based on the input type. * * Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. * * This method accepts the following `$resource` types: * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. * - `string`: Creates a stream object that uses the given string as the contents. * - `resource`: Creates a stream object that wraps the given PHP stream resource. * - `Iterator`: If the provided value implements `Iterator`, then a read-only * stream object will be created that wraps the given iterable. Each time the * stream is read from, data from the iterator will fill a buffer and will be * continuously called until the buffer is equal to the requested read size. * Subsequent read calls will first read from the buffer and then call `next` * on the underlying iterator until it is exhausted. * - `object` with `__toString()`: If the object has the `__toString()` method, * the object will be cast to a string and then a stream will be returned that * uses the string value. * - `NULL`: When `null` is passed, an empty stream object is returned. * - `callable` When a callable is passed, a read-only stream object will be * created that invokes the given callable. The callable is invoked with the * number of suggested bytes to read. The callable can return any number of * bytes, but MUST return `false` when there is no more data to return. The * stream object that wraps the callable will invoke the callable until the * number of requested bytes are available. Any additional bytes will be * buffered and used in subsequent reads. * * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data * @param array{size?: int, metadata?: array} $options Additional options * * @throws \InvalidArgumentException if the $resource arg is not valid. */ public static function streamFor($resource = '', array $options = []): StreamInterface { if (is_scalar($resource)) { $stream = self::tryFopen('php://temp', 'r+'); if ($resource !== '') { fwrite($stream, (string) $resource); fseek($stream, 0); } return new Stream($stream, $options); } switch (gettype($resource)) { case 'resource': /* * The 'php://input' is a special stream with quirks and inconsistencies. * We avoid using that stream by reading it into php://temp */ /** @var resource $resource */ if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') { $stream = self::tryFopen('php://temp', 'w+'); stream_copy_to_stream($resource, $stream); fseek($stream, 0); $resource = $stream; } return new Stream($resource, $options); case 'object': /** @var object $resource */ if ($resource instanceof StreamInterface) { return $resource; } elseif ($resource instanceof \Iterator) { return new PumpStream(function () use ($resource) { if (!$resource->valid()) { return false; } $result = $resource->current(); $resource->next(); return $result; }, $options); } elseif (method_exists($resource, '__toString')) { return self::streamFor((string) $resource, $options); } break; case 'NULL': return new Stream(self::tryFopen('php://temp', 'r+'), $options); } if (is_callable($resource)) { return new PumpStream($resource, $options); } throw new \InvalidArgumentException('Invalid resource type: '.gettype($resource)); } /** * Safely opens a PHP stream resource using a filename. * * When fopen fails, PHP normally raises a warning. This function adds an * error handler that checks for errors and throws an exception instead. * * @param string $filename File to open * @param string $mode Mode used to open the file * * @return resource * * @throws \RuntimeException if the file cannot be opened */ public static function tryFopen(string $filename, string $mode) { $ex = null; set_error_handler(static function (int $errno, string $errstr) use ($filename, $mode, &$ex): bool { $ex = new \RuntimeException(sprintf( 'Unable to open "%s" using mode "%s": %s', $filename, $mode, $errstr )); return true; }); try { /** @var resource $handle */ $handle = fopen($filename, $mode); } catch (\Throwable $e) { $ex = new \RuntimeException(sprintf( 'Unable to open "%s" using mode "%s": %s', $filename, $mode, $e->getMessage() ), 0, $e); } restore_error_handler(); if ($ex) { /** @var \RuntimeException $ex */ throw $ex; } return $handle; } /** * Safely gets the contents of a given stream. * * When stream_get_contents fails, PHP normally raises a warning. This * function adds an error handler that checks for errors and throws an * exception instead. * * @param resource $stream * * @throws \RuntimeException if the stream cannot be read */ public static function tryGetContents($stream): string { $ex = null; set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool { $ex = new \RuntimeException(sprintf( 'Unable to read stream contents: %s', $errstr )); return true; }); try { /** @var string|false $contents */ $contents = stream_get_contents($stream); if ($contents === false) { $ex = new \RuntimeException('Unable to read stream contents'); } } catch (\Throwable $e) { $ex = new \RuntimeException(sprintf( 'Unable to read stream contents: %s', $e->getMessage() ), 0, $e); } restore_error_handler(); if ($ex) { /** @var \RuntimeException $ex */ throw $ex; } return $contents; } /** * Returns a UriInterface for the given value. * * This function accepts a string or UriInterface and returns a * UriInterface for the given value. If the value is already a * UriInterface, it is returned as-is. * * @param string|UriInterface $uri * * @throws \InvalidArgumentException */ public static function uriFor($uri): UriInterface { if ($uri instanceof UriInterface) { return $uri; } if (is_string($uri)) { return new Uri($uri); } throw new \InvalidArgumentException('URI must be a string or UriInterface'); } } size = $options['size']; } $this->customMetadata = $options['metadata'] ?? []; $this->stream = $stream; $meta = stream_get_meta_data($this->stream); $this->seekable = $meta['seekable']; $this->readable = (bool) preg_match(self::READABLE_MODES, $meta['mode']); $this->writable = (bool) preg_match(self::WRITABLE_MODES, $meta['mode']); $this->uri = $this->getMetadata('uri'); } /** * Closes the stream when the destructed */ public function __destruct() { $this->close(); } public function __toString(): string { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Throwable $e) { if (\PHP_VERSION_ID >= 70400) { throw $e; } trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); return ''; } } public function getContents(): string { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } return Utils::tryGetContents($this->stream); } public function close(): void { if (isset($this->stream)) { if (is_resource($this->stream)) { fclose($this->stream); } $this->detach(); } } public function detach() { if (!isset($this->stream)) { return null; } $result = $this->stream; unset($this->stream); $this->size = $this->uri = null; $this->readable = $this->writable = $this->seekable = false; return $result; } public function getSize(): ?int { if ($this->size !== null) { return $this->size; } if (!isset($this->stream)) { return null; } // Clear the stat cache if the stream has a URI if ($this->uri) { clearstatcache(true, $this->uri); } $stats = fstat($this->stream); if (is_array($stats) && isset($stats['size'])) { $this->size = $stats['size']; return $this->size; } return null; } public function isReadable(): bool { return $this->readable; } public function isWritable(): bool { return $this->writable; } public function isSeekable(): bool { return $this->seekable; } public function eof(): bool { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } return feof($this->stream); } public function tell(): int { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $result = ftell($this->stream); if ($result === false) { throw new \RuntimeException('Unable to determine stream position'); } return $result; } public function rewind(): void { $this->seek(0); } public function seek($offset, $whence = SEEK_SET): void { $whence = (int) $whence; if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); } if (fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' .$offset.' with whence '.var_export($whence, true)); } } public function read($length): string { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } if ($length < 0) { throw new \RuntimeException('Length parameter cannot be negative'); } if (0 === $length) { return ''; } try { $string = fread($this->stream, $length); } catch (\Exception $e) { throw new \RuntimeException('Unable to read from stream', 0, $e); } if (false === $string) { throw new \RuntimeException('Unable to read from stream'); } return $string; } public function write($string): int { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } // We can't know the size after writing anything $this->size = null; $result = fwrite($this->stream, $string); if ($result === false) { throw new \RuntimeException('Unable to write to stream'); } return $result; } /** * @return mixed */ public function getMetadata($key = null) { if (!isset($this->stream)) { return $key ? null : []; } elseif (!$key) { return $this->customMetadata + stream_get_meta_data($this->stream); } elseif (isset($this->customMetadata[$key])) { return $this->customMetadata[$key]; } $meta = stream_get_meta_data($this->stream); return $meta[$key] ?? null; } } '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded */ public static function parse(string $str, $urlEncoding = true): array { $result = []; if ($str === '') { return $result; } if ($urlEncoding === true) { $decoder = function ($value) { return rawurldecode(str_replace('+', ' ', (string) $value)); }; } elseif ($urlEncoding === PHP_QUERY_RFC3986) { $decoder = 'rawurldecode'; } elseif ($urlEncoding === PHP_QUERY_RFC1738) { $decoder = 'urldecode'; } else { $decoder = function ($str) { return $str; }; } foreach (explode('&', $str) as $kvp) { $parts = explode('=', $kvp, 2); $key = $decoder($parts[0]); $value = isset($parts[1]) ? $decoder($parts[1]) : null; if (!array_key_exists($key, $result)) { $result[$key] = $value; } else { if (!is_array($result[$key])) { $result[$key] = [$result[$key]]; } $result[$key][] = $value; } } return $result; } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, * PHP_QUERY_RFC3986 to encode using * RFC3986, or PHP_QUERY_RFC1738 to * encode using RFC1738. * @param bool $treatBoolsAsInts Set to true to encode as 0/1, and * false as false/true. */ public static function build(array $params, $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string { if (!$params) { return ''; } if ($encoding === false) { $encoder = function (string $str): string { return $str; }; } elseif ($encoding === PHP_QUERY_RFC3986) { $encoder = 'rawurlencode'; } elseif ($encoding === PHP_QUERY_RFC1738) { $encoder = 'urlencode'; } else { throw new \InvalidArgumentException('Invalid type'); } $castBool = $treatBoolsAsInts ? static function ($v) { return (int) $v; } : static function ($v) { return $v ? 'true' : 'false'; }; $qs = ''; foreach ($params as $k => $v) { $k = $encoder((string) $k); if (!is_array($v)) { $qs .= $k; $v = is_bool($v) ? $castBool($v) : $v; if ($v !== null) { $qs .= '='.$encoder((string) $v); } $qs .= '&'; } else { foreach ($v as $vv) { $qs .= $k; $vv = is_bool($vv) ? $castBool($vv) : $vv; if ($vv !== null) { $qs .= '='.$encoder((string) $vv); } $qs .= '&'; } } } return $qs ? (string) substr($qs, 0, -1) : ''; } } 'application/vnd.lotus-1-2-3', '1km' => 'application/vnd.1000minds.decision-model+xml', '210' => 'model/step', '3dml' => 'text/vnd.in3d.3dml', '3ds' => 'image/x-3ds', '3g2' => 'video/3gpp2', '3gp' => 'video/3gpp', '3gpp' => 'video/3gpp', '3mf' => 'model/3mf', '7z' => 'application/x-7z-compressed', '7zip' => 'application/x-7z-compressed', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/pkix-attr-cert', 'ac3' => 'audio/ac3', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'adts' => 'audio/aac', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'age' => 'application/vnd.age', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'aml' => 'application/automationml-aml+xml', 'amlx' => 'application/automationml-amlx+zip', 'amr' => 'audio/amr', 'apk' => 'application/vnd.android.package-archive', 'apng' => 'image/apng', 'appcache' => 'text/cache-manifest', 'appinstaller' => 'application/appinstaller', 'application' => 'application/x-ms-application', 'appx' => 'application/appx', 'appxbundle' => 'application/appxbundle', 'apr' => 'application/vnd.lotus-approach', 'arc' => 'application/x-freearc', 'arj' => 'application/x-arj', 'asc' => 'application/pgp-keys', 'asf' => 'video/x-ms-asf', 'asm' => 'text/x-asm', 'aso' => 'application/vnd.accpac.simply.aso', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomdeleted' => 'application/atomdeleted+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/basic', 'avci' => 'image/avci', 'avcs' => 'image/avcs', 'avi' => 'video/x-msvideo', 'avif' => 'image/avif', 'aw' => 'application/applixware', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azv' => 'image/vnd.airzip.accelerator.azv', 'azw' => 'application/vnd.amazon.ebook', 'b16' => 'image/vnd.pco.b16', 'bary' => 'model/vnd.bary', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bdo' => 'application/vnd.nato.bindingdataobject+xml', 'bdoc' => 'application/bdoc', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'blb' => 'application/x-blorb', 'blend' => 'application/x-blender', 'blorb' => 'application/x-blorb', 'bmi' => 'application/vnd.bmi', 'bmml' => 'application/vnd.balsamiq.bmml+xml', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'bpmn' => 'application/octet-stream', 'brush' => 'application/vnd.procreate.brush', 'brushset' => 'application/vnd.procreate.brushset', 'bsp' => 'model/vnd.valve.source.compiled-map', 'btf' => 'image/prs.btif', 'btif' => 'image/prs.btif', 'buffer' => 'application/octet-stream', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'cab' => 'application/vnd.ms-cab-compressed', 'caf' => 'audio/x-caf', 'cap' => 'application/vnd.tcpdump.pcap', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cb7' => 'application/x-cbr', 'cba' => 'application/x-cbr', 'cbr' => 'application/x-cbr', 'cbt' => 'application/x-cbr', 'cbz' => 'application/x-cbr', 'cc' => 'text/x-c', 'cco' => 'application/x-cocoa', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdfx' => 'application/cdfx+xml', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfs' => 'application/x-cfs-compressed', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cjs' => 'application/node', 'cla' => 'application/vnd.claymore', 'class' => 'application/java-vm', 'cld' => 'model/vnd.cld', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'coffee' => 'text/coffeescript', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpl' => 'application/cpl+xml', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'crx' => 'application/x-chrome-extension', 'cryptonote' => 'application/vnd.rig.cryptonote', 'csh' => 'application/x-csh', 'csl' => 'application/vnd.citationstyles.style+xml', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'csr' => 'application/octet-stream', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cwl' => 'application/cwl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dart' => 'application/vnd.dart', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dbf' => 'application/vnd.dbf', 'dbk' => 'application/docbook+xml', 'dcm' => 'application/dicom', 'dcmp' => 'application/vnd.dcmp+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'ddf' => 'application/vnd.syncml.dmddf+xml', 'dds' => 'image/vnd.ms-dds', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dgc' => 'application/x-dgc-compressed', 'dib' => 'image/bmp', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'disposition-notification' => 'message/disposition-notification', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/octet-stream', 'dmg' => 'application/x-apple-diskimage', 'dmn' => 'application/octet-stream', 'dmp' => 'application/vnd.tcpdump.pcap', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'dng' => 'image/x-adobe-dng', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.document.macroenabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dpx' => 'image/dpx', 'dra' => 'audio/vnd.dra', 'drle' => 'image/dicom-rle', 'drm' => 'application/vnd.procreate.dream', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dst' => 'application/octet-stream', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvb' => 'video/vnd.dvb.file', 'dvi' => 'application/x-dvi', 'dwd' => 'application/atsc-dwd+xml', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ear' => 'application/java-archive', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'emf' => 'image/emf', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'emotionml' => 'application/emotionml+xml', 'emz' => 'application/x-msmetafile', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esa' => 'application/vnd.osgi.subsystem', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'eva' => 'application/x-eva', 'evy' => 'application/x-envoy', 'exe' => 'application/octet-stream', 'exi' => 'application/exi', 'exp' => 'application/express', 'exr' => 'image/aces', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/mp4', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'facti' => 'image/vnd.blockfact.facti', 'fbs' => 'image/vnd.fastbidsheet', 'fbx' => 'application/vnd.autodesk.fbx', 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/fdf', 'fdt' => 'application/fdt+xml', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fits' => 'image/fits', 'flac' => 'audio/x-flac', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'fo' => 'application/vnd.software602.filler.form+xml', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gam' => 'application/x-tads', 'gbr' => 'application/rpki-ghostbusters', 'gca' => 'application/x-gca-compressed', 'gdl' => 'model/vnd.gdl', 'gdoc' => 'application/vnd.google-apps.document', 'gdraw' => 'application/vnd.google-apps.drawing', 'ged' => 'text/vnd.familysearch.gedcom', 'geo' => 'application/vnd.dynageo', 'geojson' => 'application/geo+json', 'gex' => 'application/vnd.geometry-explorer', 'gform' => 'application/vnd.google-apps.form', 'ggb' => 'application/vnd.geogebra.file', 'ggs' => 'application/vnd.geogebra.slides', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'gjam' => 'application/vnd.google-apps.jam', 'glb' => 'model/gltf-binary', 'gltf' => 'model/gltf+json', 'gmap' => 'application/vnd.google-apps.map', 'gml' => 'application/gml+xml', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gph' => 'application/vnd.flographit', 'gpx' => 'application/gpx+xml', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gramps' => 'application/x-gramps-xml', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gscript' => 'application/vnd.google-apps.script', 'gsf' => 'application/x-font-ghostscript', 'gsheet' => 'application/vnd.google-apps.spreadsheet', 'gsite' => 'application/vnd.google-apps.site', 'gslides' => 'application/vnd.google-apps.presentation', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxf' => 'application/gxf', 'gxt' => 'application/vnd.geonext', 'gz' => 'application/gzip', 'gzip' => 'application/gzip', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hbs' => 'text/x-handlebars-template', 'hdd' => 'application/x-virtualbox-hdd', 'hdf' => 'application/x-hdf', 'heic' => 'image/heic', 'heics' => 'image/heic-sequence', 'heif' => 'image/heif', 'heifs' => 'image/heif-sequence', 'hej2' => 'image/hej2k', 'held' => 'application/atsc-held+xml', 'hh' => 'text/x-c', 'hjson' => 'application/hjson', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'htc' => 'text/x-component', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/vnd.microsoft.icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'img' => 'application/octet-stream', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'indd' => 'application/x-indesign', 'ini' => 'text/plain', 'ink' => 'application/inkml+xml', 'inkml' => 'application/inkml+xml', 'install' => 'application/x-install-instructions', 'iota' => 'application/vnd.astraea-software.iota', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'ipynb' => 'application/x-ipynb+json', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/x-iso9660-image', 'itp' => 'application/vnd.shana.informed.formtemplate', 'its' => 'application/its+xml', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jade' => 'text/jade', 'jaii' => 'image/jaii', 'jais' => 'image/jais', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'jardiff' => 'application/x-java-archive-diff', 'java' => 'text/x-java-source', 'jfif' => 'image/jpeg', 'jhc' => 'image/jphc', 'jisp' => 'application/vnd.jisp', 'jls' => 'image/jls', 'jlt' => 'application/vnd.hp-jlyt', 'jng' => 'image/x-jng', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jp2' => 'image/jp2', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpf' => 'image/jpx', 'jpg' => 'image/jpeg', 'jpg2' => 'image/jp2', 'jpgm' => 'image/jpm', 'jpgv' => 'video/jpeg', 'jph' => 'image/jph', 'jpm' => 'image/jpm', 'jpx' => 'image/jpx', 'js' => 'text/javascript', 'json' => 'application/json', 'json5' => 'application/json5', 'jsonld' => 'application/ld+json', 'jsonml' => 'application/jsonml+json', 'jsx' => 'text/jsx', 'jt' => 'model/jt', 'jxl' => 'image/jxl', 'jxr' => 'image/jxr', 'jxra' => 'image/jxra', 'jxrs' => 'image/jxrs', 'jxs' => 'image/jxs', 'jxsc' => 'image/jxsc', 'jxsi' => 'image/jxsi', 'jxss' => 'image/jxss', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kbl' => 'application/kbl+xml', 'kdb' => 'application/octet-stream', 'kdbx' => 'application/x-keepass2', 'key' => 'application/vnd.apple.keynote', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'kpxx' => 'application/vnd.ds-keypoint', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktx2' => 'image/ktx2', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'less' => 'text/less', 'lgr' => 'application/lgr+xml', 'lha' => 'application/x-lzh-compressed', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'litcoffee' => 'text/coffeescript', 'lnk' => 'application/x-ms-shortcut', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lottie' => 'application/zip+dotlottie', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lua' => 'text/x-lua', 'luac' => 'application/x-lua-bytecode', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/x-lzh-compressed', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm1v' => 'video/mpeg', 'm21' => 'application/mp21', 'm2a' => 'audio/mpeg', 'm2t' => 'video/mp2t', 'm2ts' => 'video/mp2t', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'audio/x-mpegurl', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/mp4', 'm4b' => 'audio/mp4', 'm4p' => 'application/mp4', 'm4s' => 'video/iso.segment', 'm4u' => 'video/vnd.mpegurl', 'm4v' => 'video/x-m4v', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'maei' => 'application/mmt-aei+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'manifest' => 'text/cache-manifest', 'map' => 'application/json', 'mar' => 'application/octet-stream', 'markdown' => 'text/markdown', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'md' => 'text/markdown', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'mdx' => 'text/mdx', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'metalink' => 'application/metalink+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mft' => 'application/rpki-manifest', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mht' => 'message/rfc822', 'mhtml' => 'message/rfc822', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mie' => 'application/x-mie', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mjs' => 'text/javascript', 'mk3d' => 'video/matroska-3d', 'mka' => 'audio/matroska', 'mkd' => 'text/x-markdown', 'mks' => 'video/x-matroska', 'mkv' => 'video/matroska', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mml' => 'text/mathml', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mng' => 'video/x-mng', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp21' => 'application/mp21', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mpc' => 'application/vnd.mophun.certificate', 'mpd' => 'application/dash+xml', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpf' => 'application/media-policy-dataset+xml', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msg' => 'application/vnd.ms-outlook', 'msh' => 'model/mesh', 'msi' => 'application/octet-stream', 'msix' => 'application/msix', 'msixbundle' => 'application/msixbundle', 'msl' => 'application/vnd.mobius.msl', 'msm' => 'application/octet-stream', 'msp' => 'application/octet-stream', 'msty' => 'application/vnd.muvee.style', 'mtl' => 'model/mtl', 'mts' => 'video/mp2t', 'mus' => 'application/vnd.musician', 'musd' => 'application/mmt-usd+xml', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mvt' => 'application/vnd.mapbox-vector-tile', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxmf' => 'audio/mobile-xmf', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'ndjson' => 'application/x-ndjson', 'nfo' => 'text/x-nfo', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nitf' => 'application/vnd.nitf', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nq' => 'application/n-quads', 'nsc' => 'application/x-conference', 'nsf' => 'application/vnd.lotus-notes', 'nt' => 'application/n-triples', 'ntf' => 'application/vnd.nitf', 'numbers' => 'application/vnd.apple.numbers', 'nzb' => 'application/x-nzb', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'obgx' => 'application/vnd.openblox.game+xml', 'obj' => 'model/obj', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogex' => 'model/vnd.opengex', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'omdoc' => 'application/omdoc+xml', 'one' => 'application/onenote', 'onea' => 'application/onenote', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'opml' => 'text/x-opml', 'oprc' => 'application/vnd.palm', 'opus' => 'audio/ogg', 'org' => 'application/vnd.lotus-organizer', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osm' => 'application/vnd.openstreetmap.data+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'font/otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'ova' => 'application/x-virtualbox-ova', 'ovf' => 'application/x-virtualbox-ovf', 'owl' => 'application/rdf+xml', 'oxps' => 'application/oxps', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p10' => 'application/pkcs10', 'p12' => 'application/x-pkcs12', 'p21' => 'model/step', 'p7a' => 'application/x-pkcs7-signature', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7e' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'pac' => 'application/x-ns-proxy-autoconfig', 'pages' => 'application/vnd.apple.pages', 'parquet' => 'application/vnd.apache.parquet', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcap' => 'application/vnd.tcpdump.pcap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/vnd.zbrush.pcx', 'pdb' => 'application/vnd.palm', 'pde' => 'text/x-processing', 'pdf' => 'application/pdf', 'pem' => 'application/x-x509-user-cert', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp-encrypted', 'phar' => 'application/octet-stream', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'phps' => 'application/x-httpd-php-source', 'phtml' => 'application/x-httpd-php', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'pkpass' => 'application/vnd.apple.pkpass', 'pl' => 'application/x-perl', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pm' => 'application/x-perl', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppa' => 'application/vnd.ms-powerpoint', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/vnd.ms-powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'model/prc', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'provx' => 'application/provenance+xml', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'image/vnd.adobe.photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'pti' => 'image/prs.pti', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pv' => 'application/octet-stream', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pxf' => 'application/octet-stream', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyo' => 'model/vnd.pytha.pyox', 'pyox' => 'model/vnd.pytha.pyox', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-realaudio', 'ram' => 'audio/x-pn-realaudio', 'raml' => 'application/raml+yaml', 'rapd' => 'application/route-apd+xml', 'rar' => 'application/vnd.rar', 'ras' => 'image/x-cmu-raster', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'relo' => 'application/p2p-overlay+xml', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'ris' => 'application/x-research-info-systems', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'application/vnd.rn-realmedia', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rmvb' => 'application/vnd.rn-realmedia-vbr', 'rnc' => 'application/relax-ng-compact-syntax', 'rng' => 'application/xml', 'roa' => 'application/rpki-roa', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpm' => 'application/x-redhat-package-manager', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsa' => 'application/x-pkcs7', 'rsat' => 'application/atsc-rsat+xml', 'rsd' => 'application/rsd+xml', 'rsheet' => 'application/urc-ressheet+xml', 'rss' => 'application/rss+xml', 'rtf' => 'text/rtf', 'rtx' => 'text/richtext', 'run' => 'application/x-makeself', 'rusd' => 'application/route-usd+xml', 'rv' => 'video/vnd.rn-realvideo', 's' => 'text/x-asm', 's3m' => 'audio/s3m', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sass' => 'text/x-sass', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scss' => 'text/x-scss', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'sea' => 'application/x-sea', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'senmlx' => 'application/senml+xml', 'sensmlx' => 'application/sensml+xml', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sfv' => 'text/x-sfv', 'sgi' => 'image/sgi', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shex' => 'text/shex', 'shf' => 'application/shf+xml', 'shtml' => 'text/html', 'sid' => 'image/x-mrsid-image', 'sieve' => 'application/sieve', 'sig' => 'application/pgp-signature', 'sil' => 'audio/silk', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'siv' => 'application/sieve', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slim' => 'text/slim', 'slm' => 'text/slim', 'sls' => 'application/route-s-tsid+xml', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil+xml', 'smil' => 'application/smil+xml', 'smv' => 'video/x-smv', 'smzip' => 'application/vnd.stepmania.package', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spdx' => 'text/spdx', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'sql' => 'application/sql', 'sqlite' => 'application/vnd.sqlite3', 'sqlite3' => 'application/vnd.sqlite3', 'src' => 'application/x-wais-source', 'srt' => 'application/x-subrip', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'ssdl' => 'application/ssdl+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'sst' => 'application/octet-stream', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'step' => 'model/step', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'model/stl', 'stp' => 'model/step', 'stpnc' => 'model/step', 'stpx' => 'model/step+xml', 'stpxz' => 'model/step-xml+zip', 'stpz' => 'model/step+zip', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'styl' => 'text/stylus', 'stylus' => 'text/stylus', 'sub' => 'image/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'swidtag' => 'application/swid+xml', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 'systemverify' => 'application/vnd.pp.systemverify+xml', 't' => 'text/troff', 't3' => 'application/x-t3vm-image', 't38' => 'image/t38', 'taglet' => 'application/vnd.mynfc', 'tao' => 'application/vnd.tao.intent-module-archive', 'tap' => 'image/vnd.tencent.tap', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'td' => 'application/urc-targetdesc+xml', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'tfx' => 'image/tiff-fx', 'tga' => 'image/x-tga', 'tgz' => 'application/gzip', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tk' => 'application/x-tcl', 'tmo' => 'application/vnd.tmobile-livetv', 'toml' => 'application/toml', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trig' => 'application/trig', 'trm' => 'application/x-msterminal', 'ts' => 'video/mp2t', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'font/collection', 'ttf' => 'font/ttf', 'ttl' => 'text/turtle', 'ttml' => 'application/ttml+xml', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u32' => 'application/x-authorware-bin', 'u3d' => 'model/u3d', 'u8dsn' => 'message/global-delivery-status', 'u8hdr' => 'message/global-headers', 'u8mdn' => 'message/global-disposition-notification', 'u8msg' => 'message/global', 'ubj' => 'application/ubjson', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'ulx' => 'application/x-glulx', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uo' => 'application/vnd.uoml+xml', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'usda' => 'model/vnd.usda', 'usdz' => 'model/vnd.usdz+zip', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvvz' => 'application/vnd.dece.zip', 'uvx' => 'application/vnd.dece.unspecified', 'uvz' => 'application/vnd.dece.zip', 'vbox' => 'application/x-virtualbox-vbox', 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', 'vcard' => 'text/vcard', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vdi' => 'application/x-virtualbox-vdi', 'vds' => 'model/vnd.sap.vds', 'vdx' => 'application/vnd.ms-visio.viewer', 'vec' => 'application/vec+xml', 'vhd' => 'application/x-virtualbox-vhd', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vmdk' => 'application/x-virtualbox-vmdk', 'vob' => 'video/x-ms-vob', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsdx' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtf' => 'image/vnd.valve.source.texture', 'vtt' => 'text/vtt', 'vtu' => 'model/vnd.vtu', 'vtx' => 'application/vnd.visio', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wadl' => 'application/vnd.sun.wadl+xml', 'war' => 'application/java-archive', 'wasm' => 'application/wasm', 'wav' => 'audio/wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/vnd.wap.wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'wdp' => 'image/vnd.ms-photo', 'weba' => 'audio/webm', 'webapp' => 'application/x-web-app-manifest+json', 'webm' => 'video/webm', 'webmanifest' => 'application/manifest+json', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgsl' => 'text/wgsl', 'wgt' => 'application/widget', 'wif' => 'application/watcherinfo+xml', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'image/wmf', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-ms-wmz', 'woff' => 'font/woff', 'woff2' => 'font/woff2', 'word' => 'application/msword', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsc' => 'message/vnd.wfa.wsc', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x32' => 'application/x-authorware-bin', 'x3d' => 'model/x3d+xml', 'x3db' => 'model/x3d+fastinfoset', 'x3dbz' => 'model/x3d+binary', 'x3dv' => 'model/x3d-vrml', 'x3dvz' => 'model/x3d+vrml', 'x3dz' => 'model/x3d+xml', 'x_b' => 'model/vnd.parasolid.transmit.binary', 'x_t' => 'model/vnd.parasolid.transmit.text', 'xaml' => 'application/xaml+xml', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xav' => 'application/xcap-att+xml', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xca' => 'application/xcap-caps+xml', 'xcs' => 'application/calendar+xml', 'xdcf' => 'application/vnd.gov.sk.xmldatacontainer+xml', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xel' => 'application/xcap-el+xml', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtm' => 'application/vnd.pwg-xhtml-print+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xl' => 'application/vnd.ms-excel', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlf' => 'application/xliff+xml', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xm' => 'audio/xm', 'xml' => 'application/xml', 'xns' => 'application/xcap-ns+xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpl' => 'application/xproc+xml', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsd' => 'application/xml', 'xsf' => 'application/prs.xsf+xml', 'xsl' => 'application/xslt+xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'xz' => 'application/x-xz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'ymp' => 'text/x-suse-ymp', 'z' => 'application/x-compress', 'z1' => 'application/x-zmachine', 'z2' => 'application/x-zmachine', 'z3' => 'application/x-zmachine', 'z4' => 'application/x-zmachine', 'z5' => 'application/x-zmachine', 'z6' => 'application/x-zmachine', 'z7' => 'application/x-zmachine', 'z8' => 'application/x-zmachine', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml', 'zsh' => 'text/x-scriptzsh', ]; /** * Determines the mimetype of a file by looking at its extension. * * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json */ public static function fromFilename(string $filename): ?string { return self::fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); } /** * Maps a file extensions to a mimetype. * * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json */ public static function fromExtension(string $extension): ?string { return self::MIME_TYPES[strtolower($extension)] ?? null; } } stream = $stream; $this->maxLength = $maxLength; } public function write($string): int { $diff = $this->maxLength - $this->stream->getSize(); // Begin returning 0 when the underlying stream is too large. if ($diff <= 0) { return 0; } // Write the stream or a subset of the stream if needed. if (strlen($string) < $diff) { return $this->stream->write($string); } return $this->stream->write(substr($string, 0, $diff)); } } assertMethod($method); if (!$uri instanceof UriInterface) { $uri = new Uri($uri); } $this->method = strtoupper($method); $this->uri = $uri; $this->setHeaders($headers); $this->protocol = $version; if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } } public function getRequestTarget(): string { if ($this->requestTarget !== null) { return $this->requestTarget; } $target = $this->uri->getPath(); if ($target === '') { $target = '/'; } if ($this->uri->getQuery() != '') { $target .= '?'.$this->uri->getQuery(); } return $target; } public function withRequestTarget($requestTarget): RequestInterface { if (preg_match('#\s#', $requestTarget)) { throw new InvalidArgumentException( 'Invalid request target provided; cannot contain whitespace' ); } $new = clone $this; $new->requestTarget = $requestTarget; return $new; } public function getMethod(): string { return $this->method; } public function withMethod($method): RequestInterface { $this->assertMethod($method); $new = clone $this; $new->method = strtoupper($method); return $new; } public function getUri(): UriInterface { return $this->uri; } public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface { if ($uri === $this->uri) { return $this; } $new = clone $this; $new->uri = $uri; if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } return $new; } private function updateHostFromUri(): void { $host = $this->uri->getHost(); if ($host == '') { return; } if (($port = $this->uri->getPort()) !== null) { $host .= ':'.$port; } if (isset($this->headerNames['host'])) { $header = $this->headerNames['host']; } else { $header = 'Host'; $this->headerNames['host'] = 'Host'; } // Ensure Host is the first header. // See: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4 $this->headers = [$header => [$host]] + $this->headers; } /** * @param mixed $method */ private function assertMethod($method): void { if (!is_string($method) || $method === '') { throw new InvalidArgumentException('Method must be a non-empty string.'); } } } 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required', ]; /** @var string */ private $reasonPhrase; /** @var int */ private $statusCode; /** * @param int $status Status code * @param (string|string[])[] $headers Response headers * @param string|resource|StreamInterface|null $body Response body * @param string $version Protocol version * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct( int $status = 200, array $headers = [], $body = null, string $version = '1.1', ?string $reason = null ) { $this->assertStatusCodeRange($status); $this->statusCode = $status; if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } $this->setHeaders($headers); if ($reason == '' && isset(self::PHRASES[$this->statusCode])) { $this->reasonPhrase = self::PHRASES[$this->statusCode]; } else { $this->reasonPhrase = (string) $reason; } $this->protocol = $version; } public function getStatusCode(): int { return $this->statusCode; } public function getReasonPhrase(): string { return $this->reasonPhrase; } public function withStatus($code, $reasonPhrase = ''): ResponseInterface { $this->assertStatusCodeIsInteger($code); $code = (int) $code; $this->assertStatusCodeRange($code); $new = clone $this; $new->statusCode = $code; if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) { $reasonPhrase = self::PHRASES[$new->statusCode]; } $new->reasonPhrase = (string) $reasonPhrase; return $new; } /** * @param mixed $statusCode */ private function assertStatusCodeIsInteger($statusCode): void { if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) { throw new \InvalidArgumentException('Status code must be an integer value.'); } } private function assertStatusCodeRange(int $statusCode): void { if ($statusCode < 100 || $statusCode >= 600) { throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); } } } @,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; } hwm = $hwm; } public function __toString(): string { return $this->getContents(); } public function getContents(): string { $buffer = $this->buffer; $this->buffer = ''; return $buffer; } public function close(): void { $this->buffer = ''; } public function detach() { $this->close(); return null; } public function getSize(): ?int { return strlen($this->buffer); } public function isReadable(): bool { return true; } public function isWritable(): bool { return true; } public function isSeekable(): bool { return false; } public function rewind(): void { $this->seek(0); } public function seek($offset, $whence = SEEK_SET): void { throw new \RuntimeException('Cannot seek a BufferStream'); } public function eof(): bool { return strlen($this->buffer) === 0; } public function tell(): int { throw new \RuntimeException('Cannot determine the position of a BufferStream'); } /** * Reads data from the buffer. */ public function read($length): string { $currentLength = strlen($this->buffer); if ($length >= $currentLength) { // No need to slice the buffer because we don't have enough data. $result = $this->buffer; $this->buffer = ''; } else { // Slice up the result to provide a subset of the buffer. $result = substr($this->buffer, 0, $length); $this->buffer = substr($this->buffer, $length); } return $result; } /** * Writes data to the buffer. */ public function write($string): int { $this->buffer .= $string; if (strlen($this->buffer) >= $this->hwm) { return 0; } return strlen($string); } /** * @return mixed */ public function getMetadata($key = null) { if ($key === 'hwm') { return $this->hwm; } return $key ? null : []; } } 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389, ]; /** * Unreserved characters for use in a regex. * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.3 */ private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~'; /** * Sub-delims for use in a regex. * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 */ private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;='; private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26', '+' => '%2B']; /** @var string Uri scheme. */ private $scheme = ''; /** @var string Uri user info. */ private $userInfo = ''; /** @var string Uri host. */ private $host = ''; /** @var int|null Uri port. */ private $port; /** @var string Uri path. */ private $path = ''; /** @var string Uri query string. */ private $query = ''; /** @var string Uri fragment. */ private $fragment = ''; /** @var string|null String representation */ private $composedComponents; public function __construct(string $uri = '') { if ($uri !== '') { $parts = self::parse($uri); if ($parts === false) { throw new MalformedUriException("Unable to parse URI: $uri"); } $this->applyParts($parts); } } /** * UTF-8 aware \parse_url() replacement. * * The internal function produces broken output for non ASCII domain names * (IDN) when used with locales other than "C". * * On the other hand, cURL understands IDN correctly only when UTF-8 locale * is configured ("C.UTF-8", "en_US.UTF-8", etc.). * * @see https://bugs.php.net/bug.php?id=52923 * @see https://www.php.net/manual/en/function.parse-url.php#114817 * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING * * @return array|false */ private static function parse(string $url) { // If IPv6 $prefix = ''; if (preg_match('%^(.*://\[[0-9:a-fA-F]+\])(.*?)$%', $url, $matches)) { /** @var array{0:string, 1:string, 2:string} $matches */ $prefix = $matches[1]; $url = $matches[2]; } /** @var string */ $encodedUrl = preg_replace_callback( '%[^:/@?&=#]+%usD', static function ($matches) { return urlencode($matches[0]); }, $url ); $result = parse_url($prefix.$encodedUrl); if ($result === false) { return false; } return array_map('urldecode', $result); } public function __toString(): string { if ($this->composedComponents === null) { $this->composedComponents = self::composeComponents( $this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment ); } return $this->composedComponents; } /** * Composes a URI reference string from its various components. * * Usually this method does not need to be called manually but instead is used indirectly via * `Psr\Http\Message\UriInterface::__toString`. * * PSR-7 UriInterface treats an empty component the same as a missing component as * getQuery(), getFragment() etc. always return a string. This explains the slight * difference to RFC 3986 Section 5.3. * * Another adjustment is that the authority separator is added even when the authority is missing/empty * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to * that format). * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.3 */ public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string { $uri = ''; // weak type checks to also accept null until we can add scalar type hints if ($scheme != '') { $uri .= $scheme.':'; } if ($authority != '' || $scheme === 'file') { $uri .= '//'.$authority; } if ($authority != '' && $path != '' && $path[0] != '/') { $path = '/'.$path; } $uri .= $path; if ($query != '') { $uri .= '?'.$query; } if ($fragment != '') { $uri .= '#'.$fragment; } return $uri; } /** * Whether the URI has the default port of the current scheme. * * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used * independently of the implementation. */ public static function isDefaultPort(UriInterface $uri): bool { return $uri->getPort() === null || (isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]); } /** * Whether the URI is absolute, i.e. it has a scheme. * * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative * to another URI, the base URI. Relative references can be divided into several forms: * - network-path references, e.g. '//example.com/path' * - absolute-path references, e.g. '/path' * - relative-path references, e.g. 'subpath' * * @see Uri::isNetworkPathReference * @see Uri::isAbsolutePathReference * @see Uri::isRelativePathReference * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4 */ public static function isAbsolute(UriInterface $uri): bool { return $uri->getScheme() !== ''; } /** * Whether the URI is a network-path reference. * * A relative reference that begins with two slash characters is termed an network-path reference. * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2 */ public static function isNetworkPathReference(UriInterface $uri): bool { return $uri->getScheme() === '' && $uri->getAuthority() !== ''; } /** * Whether the URI is a absolute-path reference. * * A relative reference that begins with a single slash character is termed an absolute-path reference. * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2 */ public static function isAbsolutePathReference(UriInterface $uri): bool { return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/'; } /** * Whether the URI is a relative-path reference. * * A relative reference that does not begin with a slash character is termed a relative-path reference. * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2 */ public static function isRelativePathReference(UriInterface $uri): bool { return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); } /** * Whether the URI is a same-document reference. * * A same-document reference refers to a URI that is, aside from its fragment * component, identical to the base URI. When no base URI is given, only an empty * URI reference (apart from its fragment) is considered a same-document reference. * * @param UriInterface $uri The URI to check * @param UriInterface|null $base An optional base URI to compare against * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4 */ public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool { if ($base !== null) { $uri = UriResolver::resolve($base, $uri); return ($uri->getScheme() === $base->getScheme()) && ($uri->getAuthority() === $base->getAuthority()) && ($uri->getPath() === $base->getPath()) && ($uri->getQuery() === $base->getQuery()); } return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; } /** * Creates a new URI with a specific query string value removed. * * Any existing query string values that exactly match the provided key are * removed. * * @param UriInterface $uri URI to use as a base. * @param string $key Query string key to remove. */ public static function withoutQueryValue(UriInterface $uri, string $key): UriInterface { $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(implode('&', $result)); } /** * Creates a new URI with a specific query string value. * * Any existing query string values that exactly match the provided key are * removed and replaced with the given key value pair. * * A value of null will set the query string key without a value, e.g. "key" * instead of "key=value". * * @param UriInterface $uri URI to use as a base. * @param string $key Key to set. * @param string|null $value Value to set */ public static function withQueryValue(UriInterface $uri, string $key, ?string $value): UriInterface { $result = self::getFilteredQueryString($uri, [$key]); $result[] = self::generateQueryString($key, $value); return $uri->withQuery(implode('&', $result)); } /** * Creates a new URI with multiple specific query string values. * * It has the same behavior as withQueryValue() but for an associative array of key => value. * * @param UriInterface $uri URI to use as a base. * @param (string|null)[] $keyValueArray Associative array of key and values */ public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface { $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); foreach ($keyValueArray as $key => $value) { $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null); } return $uri->withQuery(implode('&', $result)); } /** * Creates a URI from a hash of `parse_url` components. * * @see https://www.php.net/manual/en/function.parse-url.php * * @throws MalformedUriException If the components do not form a valid URI. */ public static function fromParts(array $parts): UriInterface { $uri = new self(); $uri->applyParts($parts); $uri->validateState(); return $uri; } public function getScheme(): string { return $this->scheme; } public function getAuthority(): string { $authority = $this->host; if ($this->userInfo !== '') { $authority = $this->userInfo.'@'.$authority; } if ($this->port !== null) { $authority .= ':'.$this->port; } return $authority; } public function getUserInfo(): string { return $this->userInfo; } public function getHost(): string { return $this->host; } public function getPort(): ?int { return $this->port; } public function getPath(): string { return $this->path; } public function getQuery(): string { return $this->query; } public function getFragment(): string { return $this->fragment; } public function withScheme($scheme): UriInterface { $scheme = $this->filterScheme($scheme); if ($this->scheme === $scheme) { return $this; } $new = clone $this; $new->scheme = $scheme; $new->composedComponents = null; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withUserInfo($user, $password = null): UriInterface { $info = $this->filterUserInfoComponent($user); if ($password !== null) { $info .= ':'.$this->filterUserInfoComponent($password); } if ($this->userInfo === $info) { return $this; } $new = clone $this; $new->userInfo = $info; $new->composedComponents = null; $new->validateState(); return $new; } public function withHost($host): UriInterface { $host = $this->filterHost($host); if ($this->host === $host) { return $this; } $new = clone $this; $new->host = $host; $new->composedComponents = null; $new->validateState(); return $new; } public function withPort($port): UriInterface { $port = $this->filterPort($port); if ($this->port === $port) { return $this; } $new = clone $this; $new->port = $port; $new->composedComponents = null; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withPath($path): UriInterface { $path = $this->filterPath($path); if ($this->path === $path) { return $this; } $new = clone $this; $new->path = $path; $new->composedComponents = null; $new->validateState(); return $new; } public function withQuery($query): UriInterface { $query = $this->filterQueryAndFragment($query); if ($this->query === $query) { return $this; } $new = clone $this; $new->query = $query; $new->composedComponents = null; return $new; } public function withFragment($fragment): UriInterface { $fragment = $this->filterQueryAndFragment($fragment); if ($this->fragment === $fragment) { return $this; } $new = clone $this; $new->fragment = $fragment; $new->composedComponents = null; return $new; } public function jsonSerialize(): string { return $this->__toString(); } /** * Apply parse_url parts to a URI. * * @param array $parts Array of parse_url parts to apply. */ private function applyParts(array $parts): void { $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : ''; $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { $this->userInfo .= ':'.$this->filterUserInfoComponent($parts['pass']); } $this->removeDefaultPort(); } /** * @param mixed $scheme * * @throws \InvalidArgumentException If the scheme is invalid. */ private function filterScheme($scheme): string { if (!is_string($scheme)) { throw new \InvalidArgumentException('Scheme must be a string'); } return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param mixed $component * * @throws \InvalidArgumentException If the user info is invalid. */ private function filterUserInfoComponent($component): string { if (!is_string($component)) { throw new \InvalidArgumentException('User info must be a string'); } return preg_replace_callback( '/(?:[^%'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component ); } /** * @param mixed $host * * @throws \InvalidArgumentException If the host is invalid. */ private function filterHost($host): string { if (!is_string($host)) { throw new \InvalidArgumentException('Host must be a string'); } return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param mixed $port * * @throws \InvalidArgumentException If the port is invalid. */ private function filterPort($port): ?int { if ($port === null) { return null; } $port = (int) $port; if (0 > $port || 0xFFFF < $port) { throw new \InvalidArgumentException( sprintf('Invalid port: %d. Must be between 0 and 65535', $port) ); } return $port; } /** * @param (string|int)[] $keys * * @return string[] */ private static function getFilteredQueryString(UriInterface $uri, array $keys): array { $current = $uri->getQuery(); if ($current === '') { return []; } $decodedKeys = array_map(function ($k): string { return rawurldecode((string) $k); }, $keys); return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); }); } private static function generateQueryString(string $key, ?string $value): string { // Query string separators ("=", "&") and literal plus signs ("+") within the // key or value need to be encoded // (while preventing double-encoding) before setting the query string. All other // chars that need percent-encoding will be encoded by withQuery(). $queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT); if ($value !== null) { $queryString .= '='.strtr($value, self::QUERY_SEPARATORS_REPLACEMENT); } return $queryString; } private function removeDefaultPort(): void { if ($this->port !== null && self::isDefaultPort($this)) { $this->port = null; } } /** * Filters the path of a URI * * @param mixed $path * * @throws \InvalidArgumentException If the path is invalid. */ private function filterPath($path): string { if (!is_string($path)) { throw new \InvalidArgumentException('Path must be a string'); } return preg_replace_callback( '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path ); } /** * Filters the query string or fragment of a URI. * * @param mixed $str * * @throws \InvalidArgumentException If the query or fragment is invalid. */ private function filterQueryAndFragment($str): string { if (!is_string($str)) { throw new \InvalidArgumentException('Query and fragment must be a string'); } return preg_replace_callback( '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str ); } private function rawurlencodeMatchZero(array $match): string { return rawurlencode($match[0]); } private function validateState(): void { if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { $this->host = self::HTTP_DEFAULT_HOST; } if ($this->getAuthority() === '') { if (0 === strpos($this->path, '//')) { throw new MalformedUriException('The path of a URI without an authority must not start with two slashes "//"'); } if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) { throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon'); } } } } stream = $stream; } /** * Magic method used to create a new stream if streams are not added in * the constructor of a decorator (e.g., LazyOpenStream). * * @return StreamInterface */ public function __get(string $name) { if ($name === 'stream') { $this->stream = $this->createStream(); return $this->stream; } throw new \UnexpectedValueException("$name not found on class"); } public function __toString(): string { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Throwable $e) { if (\PHP_VERSION_ID >= 70400) { throw $e; } trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); return ''; } } public function getContents(): string { return Utils::copyToString($this); } /** * Allow decorators to implement custom methods * * @return mixed */ public function __call(string $method, array $args) { /** @var callable $callable */ $callable = [$this->stream, $method]; $result = ($callable)(...$args); // Always return the wrapped object if the result is a return $this return $result === $this->stream ? $this : $result; } public function close(): void { $this->stream->close(); } /** * @return mixed */ public function getMetadata($key = null) { return $this->stream->getMetadata($key); } public function detach() { return $this->stream->detach(); } public function getSize(): ?int { return $this->stream->getSize(); } public function eof(): bool { return $this->stream->eof(); } public function tell(): int { return $this->stream->tell(); } public function isReadable(): bool { return $this->stream->isReadable(); } public function isWritable(): bool { return $this->stream->isWritable(); } public function isSeekable(): bool { return $this->stream->isSeekable(); } public function rewind(): void { $this->seek(0); } public function seek($offset, $whence = SEEK_SET): void { $this->stream->seek($offset, $whence); } public function read($length): string { return $this->stream->read($length); } public function write($string): int { return $this->stream->write($string); } /** * Implement in subclasses to dynamically create streams when requested. * * @throws \BadMethodCallException */ protected function createStream(): StreamInterface { throw new \BadMethodCallException('Not implemented'); } } 'UPLOAD_ERR_OK', UPLOAD_ERR_INI_SIZE => 'UPLOAD_ERR_INI_SIZE', UPLOAD_ERR_FORM_SIZE => 'UPLOAD_ERR_FORM_SIZE', UPLOAD_ERR_PARTIAL => 'UPLOAD_ERR_PARTIAL', UPLOAD_ERR_NO_FILE => 'UPLOAD_ERR_NO_FILE', UPLOAD_ERR_NO_TMP_DIR => 'UPLOAD_ERR_NO_TMP_DIR', UPLOAD_ERR_CANT_WRITE => 'UPLOAD_ERR_CANT_WRITE', UPLOAD_ERR_EXTENSION => 'UPLOAD_ERR_EXTENSION', ]; /** * @var string|null */ private $clientFilename; /** * @var string|null */ private $clientMediaType; /** * @var int */ private $error; /** * @var string|null */ private $file; /** * @var bool */ private $moved = false; /** * @var int|null */ private $size; /** * @var StreamInterface|null */ private $stream; /** * @param StreamInterface|string|resource $streamOrFile */ public function __construct( $streamOrFile, ?int $size, int $errorStatus, ?string $clientFilename = null, ?string $clientMediaType = null ) { $this->setError($errorStatus); $this->size = $size; $this->clientFilename = $clientFilename; $this->clientMediaType = $clientMediaType; if ($this->isOk()) { $this->setStreamOrFile($streamOrFile); } } /** * Depending on the value set file or stream variable * * @param StreamInterface|string|resource $streamOrFile * * @throws InvalidArgumentException */ private function setStreamOrFile($streamOrFile): void { if (is_string($streamOrFile)) { $this->file = $streamOrFile; } elseif (is_resource($streamOrFile)) { $this->stream = new Stream($streamOrFile); } elseif ($streamOrFile instanceof StreamInterface) { $this->stream = $streamOrFile; } else { throw new InvalidArgumentException( 'Invalid stream or file provided for UploadedFile' ); } } /** * @throws InvalidArgumentException */ private function setError(int $error): void { if (!isset(UploadedFile::ERROR_MAP[$error])) { throw new InvalidArgumentException( 'Invalid error status for UploadedFile' ); } $this->error = $error; } private static function isStringNotEmpty($param): bool { return is_string($param) && false === empty($param); } /** * Return true if there is no upload error */ private function isOk(): bool { return $this->error === UPLOAD_ERR_OK; } public function isMoved(): bool { return $this->moved; } /** * @throws RuntimeException if is moved or not ok */ private function validateActive(): void { if (false === $this->isOk()) { throw new RuntimeException(\sprintf('Cannot retrieve stream due to upload error (%s)', self::ERROR_MAP[$this->error])); } if ($this->isMoved()) { throw new RuntimeException('Cannot retrieve stream after it has already been moved'); } } public function getStream(): StreamInterface { $this->validateActive(); if ($this->stream instanceof StreamInterface) { return $this->stream; } /** @var string $file */ $file = $this->file; return new LazyOpenStream($file, 'r+'); } public function moveTo($targetPath): void { $this->validateActive(); if (false === self::isStringNotEmpty($targetPath)) { throw new InvalidArgumentException( 'Invalid path provided for move operation; must be a non-empty string' ); } if ($this->file) { $this->moved = PHP_SAPI === 'cli' ? rename($this->file, $targetPath) : move_uploaded_file($this->file, $targetPath); } else { Utils::copyToStream( $this->getStream(), new LazyOpenStream($targetPath, 'w') ); $this->moved = true; } if (false === $this->moved) { throw new RuntimeException( sprintf('Uploaded file could not be moved to %s', $targetPath) ); } } public function getSize(): ?int { return $this->size; } public function getError(): int { return $this->error; } public function getClientFilename(): ?string { return $this->clientFilename; } public function getClientMediaType(): ?string { return $this->clientMediaType; } } boundary = $boundary ?: bin2hex(random_bytes(20)); $this->stream = $this->createStream($elements); } public function getBoundary(): string { return $this->boundary; } public function isWritable(): bool { return false; } /** * Get the headers needed before transferring the content of a POST file * * @param string[] $headers */ private function getHeaders(array $headers): string { $str = ''; foreach ($headers as $key => $value) { $str .= "{$key}: {$value}\r\n"; } return "--{$this->boundary}\r\n".trim($str)."\r\n\r\n"; } /** * Create the aggregate stream that will be used to upload the POST data */ protected function createStream(array $elements = []): StreamInterface { $stream = new AppendStream(); foreach ($elements as $element) { if (!is_array($element)) { throw new \UnexpectedValueException('An array is expected'); } $this->addElement($stream, $element); } // Add the trailing boundary with CRLF $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); return $stream; } private function addElement(AppendStream $stream, array $element): void { foreach (['contents', 'name'] as $key) { if (!array_key_exists($key, $element)) { throw new \InvalidArgumentException("A '{$key}' key is required"); } } if (!is_string($element['name']) && !is_int($element['name'])) { throw new \InvalidArgumentException("The 'name' key must be a string or integer"); } if (is_array($element['contents'])) { if (array_key_exists('filename', $element) || array_key_exists('headers', $element)) { throw new \InvalidArgumentException( "The 'filename' and 'headers' options cannot be used when 'contents' is an array" ); } $this->addNestedElements($stream, $element['contents'], (string) $element['name']); return; } $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') { $element['filename'] = $uri; } } [$body, $headers] = $this->createElement( (string) $element['name'], $element['contents'], $element['filename'] ?? null, $element['headers'] ?? [] ); $stream->addStream(Utils::streamFor($this->getHeaders($headers))); $stream->addStream($body); $stream->addStream(Utils::streamFor("\r\n")); } /** * Recursively expand array contents into multiple form fields. * * @param array $contents */ private function addNestedElements(AppendStream $stream, array $contents, string $root): void { foreach ($contents as $key => $value) { $fieldName = $root === '' ? sprintf('[%s]', (string) $key) : sprintf('%s[%s]', $root, (string) $key); if (is_array($value)) { $this->addNestedElements($stream, $value, $fieldName); } else { $this->addElement($stream, ['name' => $fieldName, 'contents' => $value]); } } } /** * @param string[] $headers * * @return array{0: StreamInterface, 1: string[]} */ private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array { // Set a default content-disposition header if one was no provided $disposition = self::getHeader($headers, 'content-disposition'); if (!$disposition) { $headers['Content-Disposition'] = ($filename === '0' || $filename) ? sprintf( 'form-data; name="%s"; filename="%s"', $name, basename($filename) ) : "form-data; name=\"{$name}\""; } // Set a default content-length header if one was no provided $length = self::getHeader($headers, 'content-length'); if (!$length) { if ($length = $stream->getSize()) { $headers['Content-Length'] = (string) $length; } } // Set a default Content-Type if one was not supplied $type = self::getHeader($headers, 'content-type'); if (!$type && ($filename === '0' || $filename)) { $headers['Content-Type'] = MimeType::fromFilename($filename) ?? 'application/octet-stream'; } return [$stream, $headers]; } /** * @param string[] $headers */ private static function getHeader(array $headers, string $key): ?string { $lowercaseHeader = strtolower($key); foreach ($headers as $k => $v) { if (strtolower((string) $k) === $lowercaseHeader) { return $v; } } return null; } } stream = $stream; $this->setLimit($limit); $this->setOffset($offset); } public function eof(): bool { // Always return true if the underlying stream is EOF if ($this->stream->eof()) { return true; } // No limit and the underlying stream is not at EOF if ($this->limit === -1) { return false; } return $this->stream->tell() >= $this->offset + $this->limit; } /** * Returns the size of the limited subset of data */ public function getSize(): ?int { if (null === ($length = $this->stream->getSize())) { return null; } elseif ($this->limit === -1) { return $length - $this->offset; } return min($this->limit, $length - $this->offset); } /** * Allow for a bounded seek on the read limited stream */ public function seek($offset, $whence = SEEK_SET): void { if ($whence !== SEEK_SET || $offset < 0) { throw new \RuntimeException(sprintf( 'Cannot seek to offset %s with whence %s', $offset, $whence )); } $offset += $this->offset; if ($this->limit !== -1) { if ($offset > $this->offset + $this->limit) { $offset = $this->offset + $this->limit; } } $this->stream->seek($offset); } /** * Give a relative tell() */ public function tell(): int { return $this->stream->tell() - $this->offset; } /** * Set the offset to start limiting from * * @param int $offset Offset to seek to and begin byte limiting from * * @throws \RuntimeException if the stream cannot be seeked. */ public function setOffset(int $offset): void { $current = $this->stream->tell(); if ($current !== $offset) { // If the stream cannot seek to the offset position, then read to it if ($this->stream->isSeekable()) { $this->stream->seek($offset); } elseif ($current > $offset) { throw new \RuntimeException("Could not seek to stream offset $offset"); } else { $this->stream->read($offset - $current); } } $this->offset = $offset; } /** * Set the limit of bytes that the decorator allows to be read from the * stream. * * @param int $limit Number of bytes to allow to be read from the stream. * Use -1 for no limit. */ public function setLimit(int $limit): void { $this->limit = $limit; } public function read($length): string { if ($this->limit === -1) { return $this->stream->read($length); } // Check if the current position is less than the total allowed // bytes + original offset $remaining = ($this->offset + $this->limit) - $this->stream->tell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte // limit is not exceeded return $this->stream->read(min($remaining, $length)); } return ''; } } source = $source; $this->size = $options['size'] ?? null; $this->metadata = $options['metadata'] ?? []; $this->buffer = new BufferStream(); } public function __toString(): string { try { return Utils::copyToString($this); } catch (\Throwable $e) { if (\PHP_VERSION_ID >= 70400) { throw $e; } trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); return ''; } } public function close(): void { $this->detach(); } public function detach() { $this->tellPos = 0; $this->source = null; return null; } public function getSize(): ?int { return $this->size; } public function tell(): int { return $this->tellPos; } public function eof(): bool { return $this->source === null; } public function isSeekable(): bool { return false; } public function rewind(): void { $this->seek(0); } public function seek($offset, $whence = SEEK_SET): void { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable(): bool { return false; } public function write($string): int { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable(): bool { return true; } public function read($length): string { $data = $this->buffer->read($length); $readLen = strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += strlen($data) - $readLen; } return $data; } public function getContents(): string { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } /** * @return mixed */ public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return $this->metadata[$key] ?? null; } private function pump(int $length): void { if ($this->source !== null) { do { $data = ($this->source)($length); if ($data === false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= strlen($data); } while ($length > 0); } } } The MIT License (MIT) Copyright (c) 2015 Michael Dowling Copyright (c) 2015 Márk Sági-Kazár Copyright (c) 2015 Graham Campbell Copyright (c) 2016 Tobias Schultze Copyright (c) 2016 George Mponos Copyright (c) 2018 Tobias Nyholm 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. { "name": "knplabs/packagist-api", "type": "library", "description": "Packagist API client.", "keywords": ["packagist", "api", "composer"], "homepage": "http://knplabs.com", "license": "MIT", "authors": [ { "name": "KnpLabs Team", "homepage": "http://knplabs.com" } ], "require": { "php": "^7.1 || ^8.0", "guzzlehttp/guzzle": "^6.0 || ^7.0", "doctrine/inflector": "^1.0 || ^2.0" }, "require-dev": { "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0", "squizlabs/php_codesniffer": "^3.0" }, "config": { "bin-dir": "bin" }, "autoload": { "psr-0": { "Packagist\\Api\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "scripts": { "lint": "bin/phpcs --standard=PSR12 src/", "test": "bin/phpspec run -f pretty" } } role; } } type; } /** * @return string */ public function getUrl() { return $this->url; } /** * @return string */ public function getReference() { return $this->reference; } } total = $total; } /** * @param integer $monthly */ public function setMonthly($monthly) { $this->monthly = $monthly; } /** * @param integer $daily */ public function setDaily($daily) { $this->daily = $daily; } /** * @return integer */ public function getTotal() { return $this->total; } /** * @return integer */ public function getMonthly() { return $this->monthly; } /** * @return integer */ public function getDaily() { return $this->daily; } } name; } /** * @return string */ public function getEmail() { return $this->email; } /** * @return string */ public function getHomepage() { return $this->homepage; } } shasum; } /** * @return string */ public function getType() { return $this->type; } /** * @return string */ public function getUrl() { return $this->url; } /** * @return string */ public function getReference() { return $this->reference; } } name; } /** * @return string */ public function getDescription() { return $this->description; } /** * @return array */ public function getKeywords() { return $this->keywords; } /** * @return string */ public function getHomepage() { return $this->homepage; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return string */ public function getVersionNormalized() { return $this->versionNormalized; } /** * @return string */ public function getLicense() { return $this->license; } /** * @return array */ public function getAuthors() { return $this->authors; } /** * @return Source */ public function getSource() { return $this->source; } /** * @return Dist */ public function getDist() { return $this->dist; } /** * @return string */ public function getType() { return $this->type; } /** * @return string */ public function getTime() { return $this->time; } /** * @return array */ public function getAutoload() { return $this->autoload; } /** * @return array */ public function getExtra() { return $this->extra; } /** * @return array */ public function getRequire() { return $this->require; } /** * @return array */ public function getRequireDev() { return $this->requireDev; } /** * @return string */ public function getConflict() { return $this->conflict; } /** * @return string */ public function getProvide() { return $this->provide; } /** * @return string */ public function getReplace() { return $this->replace; } /** * @return string */ public function getBin() { return $this->bin; } /** * @return array */ public function getSuggest() { return $this->suggest; } /** * @return bool */ public function isAbandoned() { return (bool) $this->abandoned; } /** * Gets the package name to use as a replacement if this package is abandoned * * @return string|null */ public function getReplacementPackage(): ?string { // The Packagist API will either return a boolean, or a string value for `abandoned`. It will be a boolean // if no replacement package was provided when the package was marked as abandoned in Packagist, or it will be // a string containing the replacement package name to use if one was provided. // @see https://github.com/KnpLabs/packagist-api/pull/56#discussion_r306426997 if (is_string($this->abandoned)) { return $this->abandoned; } return null; } } build() : null; foreach ($data as $key => $value) { $property = null === $inflector ? Inflector::camelize($key) : $inflector->camelize($key); $this->$property = $value; } } } createSearchResults($data['results']); } if (isset($data['packages'])) { return $this->createSearchResults($data['packages']); } if (isset($data['package'])) { return $this->createPackageResults($data['package']); } if (isset($data['packageNames'])) { return $data['packageNames']; } throw new InvalidArgumentException('Invalid input data.'); } /** * Create a collection of \Packagist\Api\Result\Result * @param array $results * * @return array */ public function createSearchResults(array $results) { $created = array(); foreach ($results as $key => $result) { $created[$key] = $this->createResult('Packagist\Api\Result\Result', $result); } return $created; } /** * Parse array to \Packagist\Api\Result\Result * @param array $package * * @return Package */ public function createPackageResults(array $package) { $created = array(); if (isset($package['maintainers']) && $package['maintainers']) { foreach ($package['maintainers'] as $key => $maintainer) { $package['maintainers'][$key] = $this->createResult( 'Packagist\Api\Result\Package\Maintainer', $maintainer ); } } if (isset($package['downloads']) && $package['downloads']) { $package['downloads'] = $this->createResult( 'Packagist\Api\Result\Package\Downloads', $package['downloads'] ); } $package['description'] = (string) $package['description'] ?? ''; foreach ($package['versions'] as $branch => $version) { if (isset($version['authors']) && $version['authors']) { foreach ($version['authors'] as $key => $author) { $version['authors'][$key] = $this->createResult('Packagist\Api\Result\Package\Author', $author); } } if ($version['source']) { $version['source'] = $this->createResult('Packagist\Api\Result\Package\Source', $version['source']); } if (isset($version['dist']) && $version['dist']) { $version['dist'] = $this->createResult('Packagist\Api\Result\Package\Dist', $version['dist']); } $package['versions'][$branch] = $this->createResult('Packagist\Api\Result\Package\Version', $version); } $created = new Package(); $created->fromArray($package); return $created; } /** * Dynamically create DataObject of type $class and hydrate * * @param string $class DataObject class * @param array $data Array of data * * @return mixed DataObject $class hydrated */ protected function createResult($class, array $data) { $result = new $class(); $result->fromArray($data); return $result; } } name; } /** * @return string */ public function getDescription() { return $this->description; } /** * @return string */ public function getTime() { return $this->time; } /** * @return Package\Maintainer[] */ public function getMaintainers() { return $this->maintainers; } /** * @return Package\Version[] */ public function getVersions() { return $this->versions; } /** * @return string */ public function getType() { return $this->type; } /** * @return string */ public function getRepository() { return $this->repository; } /** * @return Package\Downloads */ public function getDownloads() { return $this->downloads; } /** * @return string */ public function getFavers() { return $this->favers; } /** * @return bool */ public function isAbandoned() { return (bool) $this->abandoned; } /** * Gets the package name to use as a replacement if this package is abandoned * * @return string|null */ public function getReplacementPackage(): ?string { // The Packagist API will either return a boolean, or a string value for `abandoned`. It will be a boolean // if no replacement package was provided when the package was marked as abandoned in Packagist, or it will be // a string containing the replacement package name to use if one was provided. // @see https://github.com/KnpLabs/packagist-api/pull/56#discussion_r306426997 if (is_string($this->abandoned)) { return $this->abandoned; } return null; } /** * @return integer */ public function getSuggesters() { return $this->suggesters; } /** * @return integer */ public function getDependents() { return $this->dependents; } /** * @return integer */ public function getGithubStars() { return $this->githubStars; } /** * @return integer */ public function getGithubForks() { return $this->githubForks; } } name; } /** * @return string */ public function getDescription() { return $this->description; } /** * @return string */ public function getUrl() { return $this->url; } /** * @return string */ public function getDownloads() { return $this->downloads; } /** * @return string */ public function getFavers() { return $this->favers; } /** * @return string */ public function getRepository() { return $this->repository; } } httpClient = $httpClient; $this->resultFactory = $resultFactory; $this->packagistUrl = $packagistUrl; } /** * Search packages * * Available filters : * * * vendor: vendor of package (require or require-dev in composer.json) * * type: type of package (type in composer.json) * * tags: tags of package (keywords in composer.json) * * @since 1.0 * * @param string $query Name of package * @param array $filters An array of filters * @param int $limit Pages to limit results (0 = all pages) * * @return array The results */ public function search($query, array $filters = array(), int $limit = 0) { $results = $response = array(); $filters['q'] = $query; $url = '/search.json?' . http_build_query($filters); $response['next'] = $this->url($url); do { $response = $this->request($response['next']); $response = $this->parse($response); $createResult = $this->create($response); if (!is_array($createResult)) { $createResult = [$createResult]; } $results = array_merge($results, $createResult); if (isset($response['next'])) { parse_str(parse_url($response['next'], PHP_URL_QUERY), $parse); } } while (isset($response['next']) && (0 === $limit || $parse['page'] <= $limit)); return $results; } /** * Retrieve full package information * * @since 1.0 * * @param string $package Full qualified name ex : myname/mypackage * * @return array|\Packagist\Api\Result\Package A package instance or array of packages */ public function get($package) { return $this->respond(sprintf($this->url('/packages/%s.json'), $package)); } /** * Search packages * * Available filters : * * * vendor: vendor of package (require or require-dev in composer.json) * * type: type of package (type in composer.json) * * tags: tags of package (keywords in composer.json) * * @since 1.0 * * @param array $filters An array of filters * * @return array|\Packagist\Api\Result\Package The results, or single result */ public function all(array $filters = array()) { $url = '/packages/list.json'; if ($filters) { $url .= '?' . http_build_query($filters); } return $this->respond($this->url($url)); } /** * Popular packages * * @since 1.3 * * @param int $total * @return array The results */ public function popular($total) { $results = $response = array(); $url = '/explore/popular.json?' . http_build_query(array('page' => 1)); $response['next'] = $this->url($url); do { $response = $this->request($response['next']); $response = $this->parse($response); $createResult = $this->create($response); if (!is_array($createResult)) { $createResult = [$createResult]; } $results = array_merge($results, $createResult); } while (count($results) < $total && isset($response['next'])); return array_slice($results, 0, $total); } /** * Assemble the packagist URL with the route * * @param string $route API Route that we want to achieve * * @return string Fully qualified URL */ protected function url($route) { return $this->packagistUrl . $route; } /** * Execute the url request and parse the response * * @param string $url * * @return array|\Packagist\Api\Result\Package */ protected function respond($url) { $response = $this->request($url); $response = $this->parse($response); return $this->create($response); } /** * Execute the url request * * @param string $url * * @return \Psr\Http\Message\StreamInterface */ protected function request($url) { if (null === $this->httpClient) { $this->httpClient = new HttpClient(); } return $this->httpClient ->request('GET', $url) ->getBody(); } /** * Decode json * * @param string $data Json string * * @return array Json decode */ protected function parse($data) { return json_decode($data, true); } /** * Hydrate the knowing type depending on passed data * * @param array $data * * @return array|\Packagist\Api\Result\Package */ protected function create(array $data) { if (null === $this->resultFactory) { $this->resultFactory = new Factory(); } return $this->resultFactory->create($data); } /** * Change the packagist URL * * @since 1.1 * * @param string $packagistUrl URL */ public function setPackagistUrl($packagistUrl) { $this->packagistUrl = $packagistUrl; } /** * Return the actual packagist URL * * @since 1.1 * * @return string|null URL */ public function getPackagistUrl() { return $this->packagistUrl; } } Copyright (c) 2013-2015 KNP Labs 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. { "name": "laravel/serializable-closure", "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": ["laravel", "Serializable", "closure"], "license": "MIT", "support": { "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, "authors": [ { "name": "Taylor Otwell", "email": "taylor@laravel.com" }, { "name": "Nuno Maduro", "email": "nuno@laravel.com" } ], "require": { "php": "^8.1" }, "require-dev": { "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.67|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "autoload": { "psr-4": { "Laravel\\SerializableClosure\\": "src/" } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, "extra": { "branch-alias": { "dev-master": "2.x-dev" } }, "config": { "allow-plugins": { "pestphp/pest-plugin": true }, "audit": { "block-insecure": false }, "sort-packages": true }, "minimum-stability": "dev", "prefer-stable": true } # Serializable Closure Build Status Total Downloads Latest Stable Version License ## Introduction > This project is a fork of the excellent [opis/closure: 3.x](https://github.com/opis/closure) package. At Laravel, we decided to fork this package as the upcoming version [4.x](https://github.com/opis/closure) is a complete rewrite on top of the [FFI extension](https://www.php.net/manual/en/book.ffi.php). As Laravel is a web framework, and FFI is not enabled by default in web requests, this fork allows us to keep using the `3.x` series while adding support for new PHP versions. Laravel Serializable Closure provides an easy and secure way to **serialize closures in PHP**. ## Official Documentation ### Installation > **Requires [PHP 7.4+](https://php.net/releases/)** First, install Laravel Serializable Closure via the [Composer](https://getcomposer.org/) package manager: ```bash composer require laravel/serializable-closure ``` ### Usage You may serialize a closure this way: ```php use Laravel\SerializableClosure\SerializableClosure; $closure = fn () => 'james'; // Recommended SerializableClosure::setSecretKey('secret'); $serialized = serialize(new SerializableClosure($closure)); $closure = unserialize($serialized)->getClosure(); echo $closure(); // james; ``` ### Caveats * Serializing closures on REPL environments like Laravel Tinker is not supported. * Multiple closures defined on the same source line with identical signatures may not be distinguishable after serialization. Place each closure on its own line to avoid this. ## Contributing Thank you for considering contributing to Serializable Closure! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). ## Code of Conduct In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). ## Security Vulnerabilities Please review [our security policy](https://github.com/laravel/serializable-closure/security/policy) on how to report security vulnerabilities. ## License Serializable Closure is open-sourced software licensed under the [MIT license](LICENSE.md). The MIT License (MIT) Copyright (c) Taylor Otwell 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. secret = $secret; } /** * Sign the given serializable. * * @param string $serialized * @return array */ public function sign($serialized) { return [ 'serializable' => $serialized, 'hash' => base64_encode(hash_hmac('sha256', $serialized, $this->secret, true)), ]; } /** * Verify the given signature. * * @param array{serializable: string, hash: string} $signature * @return bool */ public function verify($signature) { return hash_equals(base64_encode( hash_hmac('sha256', $signature['serializable'], $this->secret, true) ), $signature['hash']); } } closure = $closure; } /** * Resolve the closure with the given arguments. * * @return mixed */ public function __invoke() { return call_user_func_array($this->closure, func_get_args()); } /** * Gets the closure. * * @return \Closure */ public function getClosure() { return $this->closure; } /** * Get the serializable representation of the closure. * * @return array */ public function __serialize() { if ($this->scope === null) { $this->scope = new ClosureScope(); $this->scope->toSerialize++; } $this->scope->serializations++; $scope = $object = null; $reflector = $this->getReflector(); if ($reflector->isBindingRequired()) { $object = $reflector->getClosureThis(); static::wrapClosures($object, $this->scope); } if ($scope = $reflector->getClosureScopeClass()) { if (! $scope->isAnonymous() || $reflector->isBindingRequired() || $reflector->isScopeRequired()) { $scope = $scope->name; } else { $scope = null; } } $this->reference = spl_object_hash($this->closure); $this->scope[$this->closure] = $this; $use = $reflector->getUseVariables(); if (static::$transformUseVariables) { $use = call_user_func(static::$transformUseVariables, $reflector->getUseVariables()); } $code = $reflector->getCode(); $this->mapByReference($use); $data = [ 'use' => $use, 'function' => $code, 'scope' => $scope, 'this' => $object, 'self' => $this->reference, ]; if (! --$this->scope->serializations && ! --$this->scope->toSerialize) { $this->scope = null; } return $data; } /** * Restore the closure after serialization. * * @param array $data * @return void */ public function __unserialize($data) { ClosureStream::register(); $this->code = $data; unset($data); $this->code['objects'] = []; if ($this->code['use']) { $this->scope = new ClosureScope(); if (static::$resolveUseVariables) { $this->code['use'] = call_user_func(static::$resolveUseVariables, $this->code['use']); } $this->mapPointers($this->code['use']); extract($this->code['use'], EXTR_OVERWRITE | EXTR_REFS); $this->scope = null; } $this->closure = include ClosureStream::STREAM_PROTO.'://'.$this->code['function']; if ($this->code['this'] === $this) { $this->code['this'] = null; } $this->closure = $this->closure->bindTo($this->code['this'], $this->code['scope']); if (! empty($this->code['objects'])) { foreach ($this->code['objects'] as $item) { static::setPropertyValue( $item['property'], $item['instance'], $item['object'] instanceof SerializableClosure || $item['object'] instanceof UnsignedSerializableClosure ? $item['object'] : $item['object']->getClosure() ); } } $this->code = $this->code['function']; } /** * Ensures the given closures are serializable. * * @param mixed $data * @param \Laravel\SerializableClosure\Support\ClosureScope $storage * @return void */ public static function wrapClosures(&$data, $storage) { if ($data instanceof Closure) { $data = new static($data); } elseif (is_array($data)) { if (isset($data[self::ARRAY_RECURSIVE_KEY])) { return; } $data[self::ARRAY_RECURSIVE_KEY] = true; foreach ($data as $key => &$value) { if ($key === self::ARRAY_RECURSIVE_KEY) { continue; } static::wrapClosures($value, $storage); } unset($value); unset($data[self::ARRAY_RECURSIVE_KEY]); } elseif ($data instanceof \stdClass) { if (isset($storage[$data])) { $data = $storage[$data]; return; } $data = $storage[$data] = clone $data; foreach ($data as &$value) { static::wrapClosures($value, $storage); } unset($value); } elseif (is_object($data) && ! $data instanceof static && ! $data instanceof UnitEnum) { if (isset($storage[$data])) { $data = $storage[$data]; return; } $instance = $data; $reflection = new ReflectionObject($instance); if (! $reflection->isUserDefined()) { $storage[$instance] = $data; return; } $storage[$instance] = $data = $reflection->newInstanceWithoutConstructor(); do { if (! $reflection->isUserDefined()) { break; } foreach ($reflection->getProperties() as $property) { if ($property->isStatic() || ! $property->getDeclaringClass()->isUserDefined() || static::isVirtualProperty($property)) { continue; } if (! $property->isInitialized($instance)) { continue; } $value = static::getPropertyValue($property, $instance); if (static::isClosureTypedProperty($property)) { static::setPropertyValue($property, $data, $value); continue; } if (is_array($value) || is_object($value)) { static::wrapClosures($value, $storage); } static::setPropertyValue($property, $data, $value); } } while ($reflection = $reflection->getParentClass()); } } /** * Gets the closure's reflector. * * @return \Laravel\SerializableClosure\Support\ReflectionClosure */ public function getReflector() { if ($this->reflector === null) { $this->code = null; $this->reflector = new ReflectionClosure($this->closure); } return $this->reflector; } /** * Internal method used to map closure pointers. * * @param mixed $data * @return void */ protected function mapPointers(&$data) { $scope = $this->scope; if ($data instanceof static) { $data = &$data->closure; } elseif (is_array($data)) { if (isset($data[self::ARRAY_RECURSIVE_KEY])) { return; } $data[self::ARRAY_RECURSIVE_KEY] = true; foreach ($data as $key => &$value) { if ($key === self::ARRAY_RECURSIVE_KEY) { continue; } elseif ($value instanceof static) { $data[$key] = &$value->closure; } elseif ($value instanceof SelfReference && $value->hash === $this->code['self']) { $data[$key] = &$this->closure; } else { $this->mapPointers($value); } } unset($value); unset($data[self::ARRAY_RECURSIVE_KEY]); } elseif ($data instanceof \stdClass) { if (isset($scope[$data])) { return; } $scope[$data] = true; foreach ($data as $key => &$value) { if ($value instanceof SelfReference && $value->hash === $this->code['self']) { $data->{$key} = &$this->closure; } elseif (is_array($value) || is_object($value)) { $this->mapPointers($value); } } unset($value); } elseif (is_object($data) && ! ($data instanceof Closure)) { if (isset($scope[$data])) { return; } $scope[$data] = true; $reflection = new ReflectionObject($data); do { if (! $reflection->isUserDefined()) { break; } foreach ($reflection->getProperties() as $property) { if ($property->isStatic() || ! $property->getDeclaringClass()->isUserDefined() || static::isVirtualProperty($property)) { continue; } if (! $property->isInitialized($data) || $property->isReadOnly()) { continue; } $item = static::getPropertyValue($property, $data); if ($item instanceof SerializableClosure || $item instanceof UnsignedSerializableClosure || ($item instanceof SelfReference && $item->hash === $this->code['self'])) { $this->code['objects'][] = [ 'instance' => $data, 'property' => $property, 'object' => $item instanceof SelfReference ? $this : $item, ]; } elseif (is_array($item) || is_object($item)) { $this->mapPointers($item); static::setPropertyValue($property, $data, $item); } } } while ($reflection = $reflection->getParentClass()); } } /** * Internal method used to map closures by reference. * * @param mixed $data * @return void */ protected function mapByReference(&$data) { if ($data instanceof Closure) { if ($data === $this->closure) { $data = new SelfReference($this->reference); return; } if (isset($this->scope[$data])) { $data = $this->scope[$data]; return; } $instance = new static($data); $instance->scope = $this->scope; $data = $this->scope[$data] = $instance; } elseif (is_array($data)) { if (isset($data[self::ARRAY_RECURSIVE_KEY])) { return; } $data[self::ARRAY_RECURSIVE_KEY] = true; foreach ($data as $key => &$value) { if ($key === self::ARRAY_RECURSIVE_KEY) { continue; } $this->mapByReference($value); } unset($value); unset($data[self::ARRAY_RECURSIVE_KEY]); } elseif ($data instanceof \stdClass) { if (isset($this->scope[$data])) { $data = $this->scope[$data]; return; } $instance = $data; $this->scope[$instance] = $data = clone $data; foreach ($data as &$value) { $this->mapByReference($value); } unset($value); } elseif (is_object($data) && ! $data instanceof SerializableClosure && ! $data instanceof UnsignedSerializableClosure) { if (isset($this->scope[$data])) { $data = $this->scope[$data]; return; } $instance = $data; if ($data instanceof DateTimeInterface) { $this->scope[$instance] = $data; return; } if ($data instanceof UnitEnum) { $this->scope[$instance] = $data; return; } $reflection = new ReflectionObject($data); if (! $reflection->isUserDefined()) { $this->scope[$instance] = $data; return; } $this->scope[$instance] = $data = $reflection->newInstanceWithoutConstructor(); do { if (! $reflection->isUserDefined()) { break; } foreach ($reflection->getProperties() as $property) { if ($property->isStatic() || ! $property->getDeclaringClass()->isUserDefined() || static::isVirtualProperty($property)) { continue; } if (! $property->isInitialized($instance) || ($property->isReadOnly() && $property->class !== $reflection->name)) { continue; } $value = static::getPropertyValue($property, $instance); if (static::isClosureTypedProperty($property)) { static::setPropertyValue($property, $data, $value); continue; } if (is_array($value) || is_object($value)) { $this->mapByReference($value); } static::setPropertyValue($property, $data, $value); } } while ($reflection = $reflection->getParentClass()); } } /** * Get the value of a property, bypassing hooks on PHP 8.4+. * * @param \ReflectionProperty $property * @param object $object * @return mixed */ protected static function getPropertyValue(ReflectionProperty $property, object $object): mixed { return PHP_VERSION_ID >= 80400 ? $property->getRawValue($object) : $property->getValue($object); } /** * Set the value of a property, bypassing hooks on PHP 8.4+. * * @param \ReflectionProperty $property * @param object $object * @param mixed $value * @return void */ protected static function setPropertyValue(ReflectionProperty $property, object $object, mixed $value): void { PHP_VERSION_ID >= 80400 ? $property->setRawValue($object, $value) : $property->setValue($object, $value); } /** * Determine is virtual property. * * @param \ReflectionProperty $property * @return bool */ protected static function isVirtualProperty(ReflectionProperty $property): bool { return method_exists($property, 'isVirtual') && $property->isVirtual(); } /** * Determine if property is typed as Closure. * * @param \ReflectionProperty $property * @return bool */ protected static function isClosureTypedProperty(ReflectionProperty $property): bool { $type = $property->getType(); if ($type instanceof \ReflectionNamedType) { return $type->getName() === 'Closure'; } if ($type instanceof \ReflectionUnionType || $type instanceof \ReflectionIntersectionType) { foreach ($type->getTypes() as $t) { if ($t instanceof \ReflectionNamedType && $t->getName() === 'Closure') { return true; } } } return false; } } closure = $closure; } /** * Resolve the closure with the given arguments. * * @return mixed */ public function __invoke() { return call_user_func_array($this->closure, func_get_args()); } /** * Gets the closure. * * @return \Closure */ public function getClosure() { return $this->closure; } /** * Get the serializable representation of the closure. * * @return array */ public function __serialize() { if (! static::$signer) { throw new MissingSecretKeyException(); } return static::$signer->sign( serialize(new Native($this->closure)) ); } /** * Restore the closure after serialization. * * @param array{serializable: string, hash: string} $signature * @return void * * @throws \Laravel\SerializableClosure\Exceptions\InvalidSignatureException */ public function __unserialize($signature) { if (static::$signer && ! static::$signer->verify($signature)) { throw new InvalidSignatureException(); } /** @var \Laravel\SerializableClosure\Contracts\Serializable $serializable */ $serializable = unserialize($signature['serializable']); $this->closure = $serializable->getClosure(); } } hash = $hash; } } isStaticClosure === null) { $this->isStaticClosure = strtolower(substr($this->getCode(), 0, 6)) === 'static'; } return $this->isStaticClosure; } /** * Checks if the closure is a "short closure". * * @return bool */ public function isShortClosure() { if ($this->isShortClosure === null) { $code = $this->getCode(); if ($this->isStatic()) { $code = substr($code, 6); } $this->isShortClosure = strtolower(substr(trim($code), 0, 2)) === 'fn'; } return $this->isShortClosure; } /** * Get the closure's code. * * @return string */ public function getCode() { if ($this->code !== null) { return $this->code; } $fileName = $this->getFileName(); $line = $this->getStartLine() - 1; $className = null; if (null !== $className = $this->getClosureScopeClass()) { $className = '\\'.trim($className->getName(), '\\'); } $builtin_types = self::getBuiltinTypes(); $class_keywords = ['self', 'static', 'parent']; $ns = $this->getClosureNamespaceName(); $nsf = $ns == '' ? '' : ($ns[0] == '\\' ? $ns : '\\'.$ns); $_file = var_export($fileName, true); $_dir = var_export(dirname($fileName), true); $_namespace = var_export($ns, true); $_class = var_export(trim($className ?: '', '\\'), true); $_function = $ns.($ns == '' ? '' : '\\').'{closure}'; $_method = ($className == '' ? '' : trim($className, '\\').'::').$_function; $_function = var_export($_function, true); $_method = var_export($_method, true); $_trait = null; $tokens = $this->getTokens(); $state = $lastState = 'start'; $inside_structure = false; $isFirstClassCallable = false; $isShortClosure = false; $inside_structure_mark = 0; $open = 0; $code = ''; $id_start = $id_start_ci = $id_name = $context = ''; $classes = $functions = $constants = null; $use = []; $lineAdd = 0; $isUsingScope = false; $isUsingThisObject = false; $closureArgsInnerFuncCount = 0; $closureArgsBraceDepth = 0; $candidates = []; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $token = $tokens[$i]; switch ($state) { case 'start': if ($token[0] === T_FUNCTION || $token[0] === T_STATIC) { $code .= $token[1]; $state = $token[0] === T_FUNCTION ? 'function' : 'static'; } elseif ($token[0] === T_FN) { $isShortClosure = true; $code .= $token[1]; $state = 'closure_args'; } elseif ($token[0] === T_PUBLIC || $token[0] === T_PROTECTED || $token[0] === T_PRIVATE) { $code = ''; $isFirstClassCallable = true; } break; case 'static': if ($token[0] === T_WHITESPACE || $token[0] === T_COMMENT || $token[0] === T_FUNCTION) { $code .= $token[1]; if ($token[0] === T_FUNCTION) { $state = 'function'; } } elseif ($token[0] === T_FN) { $isShortClosure = true; $code .= $token[1]; $state = 'closure_args'; } else { $code = ''; $state = 'start'; } break; case 'function': switch ($token[0]) { case T_STRING: if ($isFirstClassCallable) { $state = 'closure_args'; break; } $code = ''; $state = 'named_function'; break; case '(': $code .= '('; $state = 'closure_args'; break; default: $code .= is_array($token) ? $token[1] : $token; } break; case 'named_function': if ($token[0] === T_FUNCTION || $token[0] === T_STATIC) { $code = $token[1]; $state = $token[0] === T_FUNCTION ? 'function' : 'static'; } elseif ($token[0] === T_FN) { $isShortClosure = true; $code .= $token[1]; $state = 'closure_args'; } break; case 'closure_args': $insideClosureArgsInner = $closureArgsBraceDepth > 0 || $closureArgsInnerFuncCount > 0; if ($insideClosureArgsInner) { switch ($token[0]) { case T_FUNCTION: $closureArgsInnerFuncCount++; $code .= $token[1]; break; case T_CURLY_OPEN: case T_DOLLAR_OPEN_CURLY_BRACES: $closureArgsBraceDepth++; $code .= $token[1]; break; case '{': if ($closureArgsInnerFuncCount > 0) { $closureArgsInnerFuncCount--; } $closureArgsBraceDepth++; $code .= '{'; break; case '}': $closureArgsBraceDepth--; $code .= '}'; break; default: $code .= is_array($token) ? $token[1] : $token; } break; } switch ($token[0]) { case T_FUNCTION: $closureArgsInnerFuncCount++; $code .= $token[1]; break; case T_NAME_QUALIFIED: [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); $context = 'args'; $state = 'id_name'; $lastState = 'closure_args'; break; case T_NS_SEPARATOR: case T_STRING: $id_start = $token[1]; $id_start_ci = strtolower($id_start); $id_name = ''; $context = 'args'; $state = 'id_name'; $lastState = 'closure_args'; break; case T_USE: $code .= $token[1]; $state = 'use'; break; case T_DOUBLE_ARROW: $code .= $token[1]; if ($isShortClosure) { $state = 'closure'; } break; case ':': $code .= ':'; $state = 'return'; break; case '{': $code .= '{'; $state = 'closure'; $open++; break; default: $code .= is_array($token) ? $token[1] : $token; } break; case 'use': switch ($token[0]) { case T_VARIABLE: $use[] = substr($token[1], 1); $code .= $token[1]; break; case '{': $code .= '{'; $state = 'closure'; $open++; break; case ':': $code .= ':'; $state = 'return'; break; default: $code .= is_array($token) ? $token[1] : $token; break; } break; case 'return': switch ($token[0]) { case T_WHITESPACE: case T_COMMENT: case T_DOC_COMMENT: $code .= $token[1]; break; case T_NS_SEPARATOR: case T_STRING: $id_start = $token[1]; $id_start_ci = strtolower($id_start); $id_name = ''; $context = 'return_type'; $state = 'id_name'; $lastState = 'return'; break 2; case T_NAME_QUALIFIED: [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); $context = 'return_type'; $state = 'id_name'; $lastState = 'return'; break 2; case T_DOUBLE_ARROW: $code .= $token[1]; if ($isShortClosure) { $state = 'closure'; } break; case '{': $code .= '{'; $state = 'closure'; $open++; break; default: $code .= is_array($token) ? $token[1] : $token; break; } break; case 'closure': switch ($token[0]) { case T_CURLY_OPEN: case T_DOLLAR_OPEN_CURLY_BRACES: case '{': $code .= is_array($token) ? $token[1] : $token; $open++; break; case '}': $code .= '}'; if (--$open === 0 && ! $isShortClosure) { $reset = $this->collectCandidate($candidates, $code, $use, $isShortClosure, $isUsingThisObject, $isUsingScope); $code = $reset['code']; $state = $reset['state']; $open = $reset['open']; $use = $reset['use']; $isShortClosure = $reset['isShortClosure']; $isUsingThisObject = $reset['isUsingThisObject']; $isUsingScope = $reset['isUsingScope']; $closureArgsInnerFuncCount = $reset['closureArgsInnerFuncCount']; $closureArgsBraceDepth = $reset['closureArgsBraceDepth']; } elseif ($inside_structure) { $inside_structure = ! ($open === $inside_structure_mark); } break; case '(': case '[': $code .= $token[0]; if ($isShortClosure) { $open++; } break; case ')': case ']': if ($isShortClosure) { if ($open === 0) { $reset = $this->collectCandidate($candidates, $code, $use, $isShortClosure, $isUsingThisObject, $isUsingScope); $code = $reset['code']; $state = $reset['state']; $open = $reset['open']; $use = $reset['use']; $isShortClosure = $reset['isShortClosure']; $isUsingThisObject = $reset['isUsingThisObject']; $isUsingScope = $reset['isUsingScope']; $closureArgsInnerFuncCount = $reset['closureArgsInnerFuncCount']; $closureArgsBraceDepth = $reset['closureArgsBraceDepth']; continue 3; } $open--; } $code .= $token[0]; break; case ',': case ';': if ($isShortClosure && $open === 0) { $reset = $this->collectCandidate($candidates, $code, $use, $isShortClosure, $isUsingThisObject, $isUsingScope); $code = $reset['code']; $state = $reset['state']; $open = $reset['open']; $use = $reset['use']; $isShortClosure = $reset['isShortClosure']; $isUsingThisObject = $reset['isUsingThisObject']; $isUsingScope = $reset['isUsingScope']; $closureArgsInnerFuncCount = $reset['closureArgsInnerFuncCount']; $closureArgsBraceDepth = $reset['closureArgsBraceDepth']; continue 3; } $code .= $token[0]; break; case T_LINE: $code .= $token[2] - $line + $lineAdd; break; case T_FILE: $code .= $_file; break; case T_DIR: $code .= $_dir; break; case T_NS_C: $code .= $_namespace; break; case T_CLASS_C: $code .= $inside_structure ? $token[1] : $_class; break; case T_FUNC_C: $code .= $inside_structure ? $token[1] : $_function; break; case T_METHOD_C: $code .= $inside_structure ? $token[1] : $_method; break; case T_COMMENT: if (substr($token[1], 0, 8) === '#trackme') { $timestamp = time(); $code .= '/**'.PHP_EOL; $code .= '* Date : '.date(DATE_W3C, $timestamp).PHP_EOL; $code .= '* Timestamp : '.$timestamp.PHP_EOL; $code .= '* Line : '.($line + 1).PHP_EOL; $code .= '* File : '.$_file.PHP_EOL.'*/'.PHP_EOL; $lineAdd += 5; } else { $code .= $token[1]; } break; case T_VARIABLE: if ($token[1] == '$this' && ! $inside_structure) { $isUsingThisObject = true; } $code .= $token[1]; break; case T_STATIC: case T_NS_SEPARATOR: case T_STRING: $id_start = $token[1]; $id_start_ci = strtolower($id_start); $id_name = ''; $context = 'root'; $state = 'id_name'; $lastState = 'closure'; break 2; case T_NAME_QUALIFIED: [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); $context = 'root'; $state = 'id_name'; $lastState = 'closure'; break 2; case T_NEW: $code .= $token[1]; $context = 'new'; $state = 'id_start'; $lastState = 'closure'; break 2; case T_USE: $code .= $token[1]; $context = 'use'; $state = 'id_start'; $lastState = 'closure'; break; case T_INSTANCEOF: case T_INSTEADOF: $code .= $token[1]; $context = 'instanceof'; $state = 'id_start'; $lastState = 'closure'; break; case T_OBJECT_OPERATOR: case T_NULLSAFE_OBJECT_OPERATOR: case T_DOUBLE_COLON: $code .= $token[1]; $lastState = 'closure'; $state = 'ignore_next'; break; case T_FUNCTION: $code .= $token[1]; $state = 'closure_args'; if (! $inside_structure) { $inside_structure = true; $inside_structure_mark = $open; } break; case T_TRAIT_C: if ($_trait === null) { $startLine = $this->getStartLine(); $endLine = $this->getEndLine(); $structures = $this->getStructures(); $_trait = ''; foreach ($structures as &$struct) { if ($struct['type'] === 'trait' && $struct['start'] <= $startLine && $struct['end'] >= $endLine ) { $_trait = ($ns == '' ? '' : $ns.'\\').$struct['name']; break; } } $_trait = var_export($_trait, true); } $code .= $_trait; break; default: $code .= is_array($token) ? $token[1] : $token; } break; case 'ignore_next': switch ($token[0]) { case T_WHITESPACE: case T_COMMENT: case T_DOC_COMMENT: $code .= $token[1]; break; case T_CLASS: case T_NEW: case T_STATIC: case T_VARIABLE: case T_STRING: case T_CLASS_C: case T_FILE: case T_DIR: case T_METHOD_C: case T_FUNC_C: case T_FUNCTION: case T_INSTANCEOF: case T_LINE: case T_NS_C: case T_TRAIT_C: case T_USE: $code .= $token[1]; $state = $lastState; break; default: $state = $lastState; $i--; } break; case 'id_start': switch ($token[0]) { case T_WHITESPACE: case T_COMMENT: case T_DOC_COMMENT: $code .= $token[1]; break; case T_NS_SEPARATOR: case T_NAME_FULLY_QUALIFIED: case T_STRING: case T_STATIC: $id_start = $token[1]; $id_start_ci = strtolower($id_start); $id_name = ''; $state = 'id_name'; break 2; case T_NAME_QUALIFIED: [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); $state = 'id_name'; break 2; case T_VARIABLE: $code .= $token[1]; $state = $lastState; break; case T_CLASS: $code .= $token[1]; $state = 'anonymous'; break; case '(': if ($context === 'instanceof') { $code .= '('; if ($isShortClosure) { $open++; } $state = $lastState; break; } // no break default: $i--; //reprocess last $state = 'id_name'; } break; case 'id_name': switch ($token[0]) { case $token[0] === ':' && ! in_array($context, ['instanceof', 'new'], true): if ($lastState === 'closure' && $context === 'root') { $state = 'closure'; $code .= $id_start.$token; } break; case T_NAME_QUALIFIED: case T_NS_SEPARATOR: case T_STRING: case T_WHITESPACE: case T_COMMENT: case T_DOC_COMMENT: $id_name .= $token[1]; break; case '(': if ($isShortClosure) { $open++; } if ($context === 'new' || false !== strpos($id_name, '\\')) { if ($id_start_ci === 'self' || $id_start_ci === 'static') { if (! $inside_structure) { $isUsingScope = true; } } elseif ($id_start !== '\\' && ! in_array($id_start_ci, $class_keywords)) { if ($classes === null) { $classes = $this->getClasses(); } if (isset($classes[$id_start_ci])) { $id_start = $classes[$id_start_ci]; } if ($id_start[0] !== '\\') { $id_start = $nsf.'\\'.$id_start; } } } else { if ($id_start !== '\\') { if ($functions === null) { $functions = $this->getFunctions(); } if (isset($functions[$id_start_ci])) { $id_start = $functions[$id_start_ci]; } elseif ($nsf !== '\\' && function_exists($nsf.'\\'.$id_start)) { $id_start = $nsf.'\\'.$id_start; // Cache it to functions array $functions[$id_start_ci] = $id_start; } } } $code .= $id_start.$id_name.'('; $state = $lastState; break; case T_VARIABLE: case T_DOUBLE_COLON: if ($id_start !== '\\') { if ($id_start_ci === 'self' || $id_start_ci === 'parent') { if (! $inside_structure) { $isUsingScope = true; } } elseif ($id_start_ci === 'static') { if (! $inside_structure) { $isUsingScope = $token[0] === T_DOUBLE_COLON; } } elseif (! in_array($id_start_ci, $builtin_types)) { if ($classes === null) { $classes = $this->getClasses(); } if (isset($classes[$id_start_ci])) { $id_start = $classes[$id_start_ci]; } if ($id_start[0] !== '\\') { $id_start = $nsf.'\\'.$id_start; } } } $code .= $id_start.$id_name.$token[1]; $state = $token[0] === T_DOUBLE_COLON ? 'ignore_next' : $lastState; break; default: if ($id_start !== '\\' && ! defined($id_start)) { if ($constants === null) { $constants = $this->getConstants(); } if (isset($constants[$id_start])) { $id_start = $constants[$id_start]; } elseif ($context === 'new') { if (in_array($id_start_ci, $class_keywords)) { if (! $inside_structure) { $isUsingScope = true; } } else { if ($classes === null) { $classes = $this->getClasses(); } if (isset($classes[$id_start_ci])) { $id_start = $classes[$id_start_ci]; } if ($id_start[0] !== '\\') { $id_start = $nsf.'\\'.$id_start; } } } elseif ($context === 'use' || $context === 'instanceof' || $context === 'args' || $context === 'return_type' || $context === 'extends' || $context === 'root' ) { if (in_array($id_start_ci, $class_keywords)) { if (! $inside_structure && $id_start_ci !== 'static') { $isUsingScope = true; } } elseif (! in_array($id_start_ci, $builtin_types)) { if ($classes === null) { $classes = $this->getClasses(); } if (isset($classes[$id_start_ci])) { $id_start = $classes[$id_start_ci]; } if ($id_start[0] !== '\\') { $id_start = $nsf.'\\'.$id_start; } } } } $code .= $id_start.$id_name; $state = $lastState; $i--; //reprocess last token } break; case 'anonymous': switch ($token[0]) { case T_NAME_QUALIFIED: [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); $state = 'id_name'; $lastState = 'anonymous'; break 2; case T_NS_SEPARATOR: case T_STRING: $id_start = $token[1]; $id_start_ci = strtolower($id_start); $id_name = ''; $state = 'id_name'; $context = 'extends'; $lastState = 'anonymous'; break; case '{': $state = 'closure'; if (! $inside_structure) { $inside_structure = true; $inside_structure_mark = $open; } $i--; break; default: $code .= is_array($token) ? $token[1] : $token; } break; } } $attributesCode = array_values(array_filter(array_map(function ($attribute) { $name = $attribute->getName(); // Skip attributes that cannot target functions. When a closure is // created from a method (e.g. `$obj->method(...)`), the method's // attributes are inherited. Attributes that only target methods // (like #[\Override]) would cause a fatal error when applied to // the serialized closure function. if (class_exists($name)) { $ref = new \ReflectionClass($name); $attrAttributes = $ref->getAttributes(\Attribute::class); if (! empty($attrAttributes)) { $flags = $attrAttributes[0]->getArguments()[0] ?? \Attribute::TARGET_ALL; if (($flags & \Attribute::TARGET_FUNCTION) === 0) { return null; } } } $arguments = $attribute->getArguments(); $arguments = implode(', ', array_map(function ($argument, $key) { $argument = var_export($argument, true); if (is_string($key)) { $argument = sprintf('%s: %s', $key, $argument); } return $argument; }, $arguments, array_keys($arguments))); return "#[$name($arguments)]"; }, $this->getAttributes()))); if (count($candidates) > 1) { $lastItem = array_pop($candidates); foreach ($candidates as $candidate) { if (! $this->verifyCandidateSignature($candidate)) { continue; } $this->applyCandidate($candidate); $code = $candidate['code']; if (! empty($attributesCode)) { $code = implode("\n", array_merge($attributesCode, [$code])); } $this->code = $code; return $this->code; } $candidates[] = $lastItem; } $lastItem = array_pop($candidates); if ($lastItem) { $this->applyCandidate($lastItem); $code = $lastItem['code']; } else { if ($isShortClosure) { $this->useVariables = $this->getStaticVariables(); } else { $this->useVariables = empty($use) ? $use : array_intersect_key($this->getStaticVariables(), array_flip($use)); } $this->isShortClosure = $isShortClosure; $this->isBindingRequired = $isUsingThisObject; $this->isScopeRequired = $isUsingScope; } if (! empty($attributesCode)) { $code = implode("\n", array_merge($attributesCode, [$code])); } $this->code = $code; return $this->code; } /** * Get PHP native built in types. * * @return array */ protected static function getBuiltinTypes() { return ['array', 'callable', 'string', 'int', 'bool', 'float', 'iterable', 'void', 'object', 'mixed', 'false', 'null', 'never', 'true']; } /** * Gets the use variables by the closure. * * @return array */ public function getUseVariables() { if ($this->useVariables !== null) { return $this->useVariables; } if ($this->isShortClosure()) { return $this->useVariables; } $tokens = $this->getTokens(); $use = []; $state = 'start'; foreach ($tokens as &$token) { $is_array = is_array($token); switch ($state) { case 'start': if ($is_array && $token[0] === T_USE) { $state = 'use'; } break; case 'use': if ($is_array) { if ($token[0] === T_VARIABLE) { $use[] = substr($token[1], 1); } } elseif ($token == ')') { break 2; } break; } } $this->useVariables = empty($use) ? $use : array_intersect_key($this->getStaticVariables(), array_flip($use)); return $this->useVariables; } /** * Checks if binding is required. * * @return bool */ public function isBindingRequired() { if ($this->isBindingRequired === null) { $this->getCode(); } return $this->isBindingRequired; } /** * Checks if access to the scope is required. * * @return bool */ public function isScopeRequired() { if ($this->isScopeRequired === null) { $this->getCode(); } return $this->isScopeRequired; } /** * The hash of the current file name. * * @return string */ protected function getHashedFileName() { if ($this->hashedName === null) { $this->hashedName = sha1($this->getFileName()); } return $this->hashedName; } /** * Get the file tokens. * * @return array */ protected function getFileTokens() { $key = $this->getHashedFileName(); if (! isset(static::$files[$key])) { static::$files[$key] = token_get_all(file_get_contents($this->getFileName())); } return static::$files[$key]; } /** * Get the tokens. * * @return array */ protected function getTokens() { if ($this->tokens === null) { $tokens = $this->getFileTokens(); $startLine = $this->getStartLine(); $endLine = $this->getEndLine(); $results = []; $start = false; foreach ($tokens as &$token) { if (! is_array($token)) { if ($start) { $results[] = $token; } continue; } $line = $token[2]; if ($line <= $endLine) { if ($line >= $startLine) { $start = true; $results[] = $token; } continue; } break; } $this->tokens = $results; } return $this->tokens; } /** * Get the classes. * * @return array */ protected function getClasses() { $line = $this->getStartLine(); foreach ($this->getStructures() as $struct) { if ($struct['type'] === 'namespace' && $struct['start'] <= $line && $struct['end'] >= $line ) { return $struct['classes']; } } return []; } /** * Get the functions. * * @return array */ protected function getFunctions() { $key = $this->getHashedFileName(); if (! isset(static::$functions[$key])) { $this->fetchItems(); } return static::$functions[$key]; } /** * Gets the constants. * * @return array */ protected function getConstants() { $key = $this->getHashedFileName(); if (! isset(static::$constants[$key])) { $this->fetchItems(); } return static::$constants[$key]; } /** * Get the structures. * * @return array */ protected function getStructures() { $key = $this->getHashedFileName(); if (! isset(static::$structures[$key])) { $this->fetchItems(); } return static::$structures[$key]; } /** * Fetch the items. * * @return void. */ protected function fetchItems() { $key = $this->getHashedFileName(); $classes = []; $functions = []; $constants = []; $structures = []; $tokens = $this->getFileTokens(); $open = 0; $state = 'start'; $lastState = ''; $prefix = ''; $name = ''; $alias = ''; $isFunc = $isConst = false; $startLine = $lastKnownLine = 0; $structType = $structName = ''; $structIgnore = false; $namespace = ''; $namespaceStartLine = 0; $namespaceBraced = false; $namespaceClasses = []; foreach ($tokens as $token) { if (is_array($token)) { $lastKnownLine = $token[2]; } switch ($state) { case 'start': switch ($token[0]) { case T_NAMESPACE: $structures[] = [ 'type' => 'namespace', 'name' => $namespace, 'start' => $namespaceStartLine, 'end' => $token[2] - 1, 'classes' => $namespaceClasses, ]; $namespace = ''; $namespaceClasses = []; $state = 'namespace'; $namespaceStartLine = $token[2]; break; case T_CLASS: case T_INTERFACE: case T_TRAIT: $state = 'before_structure'; $startLine = $token[2]; $structType = $token[0] == T_CLASS ? 'class' : ($token[0] == T_INTERFACE ? 'interface' : 'trait'); break; case T_USE: $state = 'use'; $prefix = $name = $alias = ''; $isFunc = $isConst = false; break; case T_FUNCTION: $state = 'structure'; $structIgnore = true; break; case T_NEW: $state = 'new'; break; case T_OBJECT_OPERATOR: case T_DOUBLE_COLON: $state = 'invoke'; break; case '}': if ($namespaceBraced) { $structures[] = [ 'type' => 'namespace', 'name' => $namespace, 'start' => $namespaceStartLine, 'end' => $lastKnownLine, 'classes' => $namespaceClasses, ]; $namespaceBraced = false; $namespace = ''; $namespaceClasses = []; } break; } break; case 'namespace': switch ($token[0]) { case T_STRING: case T_NAME_QUALIFIED: $namespace = $token[1]; break; case ';': case '{': $state = 'start'; $namespaceBraced = $token[0] === '{'; break; } break; case 'use': switch ($token[0]) { case T_FUNCTION: $isFunc = true; break; case T_CONST: $isConst = true; break; case T_NS_SEPARATOR: $name .= $token[1]; break; case T_STRING: $name .= $token[1]; $alias = $token[1]; break; case T_NAME_QUALIFIED: $name .= $token[1]; $pieces = explode('\\', $token[1]); $alias = end($pieces); break; case T_AS: $lastState = 'use'; $state = 'alias'; break; case '{': $prefix = $name; $name = $alias = ''; $state = 'use-group'; break; case ',': case ';': if ($name === '' || $name[0] !== '\\') { $name = '\\'.$name; } if ($alias !== '') { if ($isFunc) { $functions[strtolower($alias)] = $name; } elseif ($isConst) { $constants[$alias] = $name; } else { $classes[strtolower($alias)] = $name; $namespaceClasses[strtolower($alias)] = $name; } } $name = $alias = ''; $state = $token === ';' ? 'start' : 'use'; break; } break; case 'use-group': switch ($token[0]) { case T_NS_SEPARATOR: $name .= $token[1]; break; case T_NAME_QUALIFIED: $name .= $token[1]; $pieces = explode('\\', $token[1]); $alias = end($pieces); break; case T_STRING: $name .= $token[1]; $alias = $token[1]; break; case T_AS: $lastState = 'use-group'; $state = 'alias'; break; case ',': case '}': if ($prefix === '' || $prefix[0] !== '\\') { $prefix = '\\'.$prefix; } if ($alias !== '') { if ($isFunc) { $functions[strtolower($alias)] = $prefix.$name; } elseif ($isConst) { $constants[$alias] = $prefix.$name; } else { $classes[strtolower($alias)] = $prefix.$name; $namespaceClasses[strtolower($alias)] = $prefix.$name; } } $name = $alias = ''; $state = $token === '}' ? 'use' : 'use-group'; break; } break; case 'alias': if ($token[0] === T_STRING) { $alias = $token[1]; $state = $lastState; } break; case 'new': switch ($token[0]) { case T_WHITESPACE: case T_COMMENT: case T_DOC_COMMENT: break 2; case T_CLASS: $state = 'structure'; $structIgnore = true; break; default: $state = 'start'; } break; case 'invoke': switch ($token[0]) { case T_WHITESPACE: case T_COMMENT: case T_DOC_COMMENT: break 2; default: $state = 'start'; } break; case 'before_structure': if ($token[0] == T_STRING) { $structName = $token[1]; $state = 'structure'; } break; case 'structure': switch ($token[0]) { case '{': case T_CURLY_OPEN: case T_DOLLAR_OPEN_CURLY_BRACES: $open++; break; case '}': if (--$open == 0) { if (! $structIgnore) { $structures[] = [ 'type' => $structType, 'name' => $structName, 'start' => $startLine, 'end' => $lastKnownLine, ]; } $structIgnore = false; $state = 'start'; } break; } break; } } $structures[] = [ 'type' => 'namespace', 'name' => $namespace, 'start' => $namespaceStartLine, 'end' => PHP_INT_MAX, 'classes' => $namespaceClasses, ]; static::$classes[$key] = $classes; static::$functions[$key] = $functions; static::$constants[$key] = $constants; static::$structures[$key] = $structures; } /** * Returns the namespace associated to the closure. * * @return string */ protected function getClosureNamespaceName() { $startLine = $this->getStartLine(); $endLine = $this->getEndLine(); foreach ($this->getStructures() as $struct) { if ($struct['type'] === 'namespace' && $struct['start'] <= $startLine && $struct['end'] >= $endLine ) { return $struct['name']; } } return ''; } /** * Parse the given token. * * @param string $token * @return array */ protected function parseNameQualified($token) { $pieces = explode('\\', $token); $id_start = array_shift($pieces); $id_start_ci = strtolower($id_start); $id_name = '\\'.implode('\\', $pieces); return [$id_start, $id_start_ci, $id_name]; } /** * Collect a closure candidate and reset state for finding the next one. * * @param array $candidates * @param string $code * @param array $use * @param bool $isShortClosure * @param bool $isUsingThisObject * @param bool $isUsingScope * @return array */ protected function collectCandidate(&$candidates, $code, $use, $isShortClosure, $isUsingThisObject, $isUsingScope) { $candidates[] = [ 'code' => $code, 'use' => $use, 'isShortClosure' => $isShortClosure, 'isUsingThisObject' => $isUsingThisObject, 'isUsingScope' => $isUsingScope, ]; return [ 'code' => '', 'state' => 'start', 'open' => 0, 'use' => [], 'isShortClosure' => false, 'isUsingThisObject' => false, 'isUsingScope' => false, 'closureArgsInnerFuncCount' => 0, 'closureArgsBraceDepth' => 0, ]; } /** * Apply a candidate's properties to this instance. * * @param array $candidate * @return void */ protected function applyCandidate($candidate) { if ($candidate['isShortClosure']) { $this->useVariables = $this->getStaticVariables(); } else { $this->useVariables = empty($candidate['use']) ? $candidate['use'] : array_intersect_key($this->getStaticVariables(), array_flip($candidate['use'])); } $this->isShortClosure = $candidate['isShortClosure']; $this->isBindingRequired = $candidate['isUsingThisObject']; $this->isScopeRequired = $candidate['isUsingScope']; } /** * Verify that a candidate matches the closure's signature. * * @param array $candidate * @return bool */ protected function verifyCandidateSignature($candidate) { $code = $candidate['code']; $use = $candidate['use']; $isShortClosure = $candidate['isShortClosure']; // Check if code starts with 'static' (more precise than searching anywhere in code) $isStaticCode = strtolower(substr(ltrim($code), 0, 6)) === 'static'; if (parent::isStatic() !== $isStaticCode) { return false; } // Parse the candidate to extract parameters and variables $tokens = token_get_all(' 0) { return false; } } else { $actualStaticVariables = array_keys(parent::getStaticVariables()); if (! empty($use) && count(array_diff($use, $actualStaticVariables)) > 0) { return false; } if (count($use) !== count(parent::getStaticVariables())) { return false; } } return true; } } content = "length = strlen($this->content); return true; } /** * Read from stream. * * @param int $count * @return string */ public function stream_read($count) { $value = substr($this->content, $this->pointer, $count); $this->pointer += $count; return $value; } /** * Tests for end-of-file on a file pointer. * * @return bool */ public function stream_eof() { return $this->pointer >= $this->length; } /** * Change stream options. * * @param int $option * @param int $arg1 * @param int $arg2 * @return bool */ public function stream_set_option($option, $arg1, $arg2) { return false; } /** * Retrieve information about a file resource. * * @return array|bool */ public function stream_stat() { $stat = stat(__FILE__); // @phpstan-ignore-next-line $stat[7] = $stat['size'] = $this->length; return $stat; } /** * Retrieve information about a file. * * @param string $path * @param int $flags * @return array|bool */ public function url_stat($path, $flags) { $stat = stat(__FILE__); // @phpstan-ignore-next-line $stat[7] = $stat['size'] = $this->length; return $stat; } /** * Seeks to specific location in a stream. * * @param int $offset * @param int $whence * @return bool */ public function stream_seek($offset, $whence = SEEK_SET) { $crt = $this->pointer; switch ($whence) { case SEEK_SET: $this->pointer = $offset; break; case SEEK_CUR: $this->pointer += $offset; break; case SEEK_END: $this->pointer = $this->length + $offset; break; } if ($this->pointer < 0 || $this->pointer >= $this->length) { $this->pointer = $crt; return false; } return true; } /** * Retrieve the current position of a stream. * * @return int */ public function stream_tell() { return $this->pointer; } /** * Registers the stream. * * @return void */ public static function register() { if (! static::$isRegistered) { static::$isRegistered = stream_wrapper_register(static::STREAM_PROTO, __CLASS__); } } } serializable = new Serializers\Native($closure); } /** * Resolve the closure with the given arguments. * * @return mixed */ public function __invoke() { return call_user_func_array($this->serializable, func_get_args()); } /** * Gets the closure. * * @return \Closure */ public function getClosure() { return $this->serializable->getClosure(); } /** * Get the serializable representation of the closure. * * @return array{serializable: \Laravel\SerializableClosure\Contracts\Serializable} */ public function __serialize() { return [ 'serializable' => $this->serializable, ]; } /** * Restore the closure after serialization. * * @param array{serializable: \Laravel\SerializableClosure\Contracts\Serializable} $data * @return void */ public function __unserialize($data) { $this->serializable = $data['serializable']; } } serializable = Serializers\Signed::$signer ? new Serializers\Signed($closure) : new Serializers\Native($closure); } /** * Resolve the closure with the given arguments. * * @return mixed */ public function __invoke() { return call_user_func_array($this->serializable, func_get_args()); } /** * Gets the closure. * * @return \Closure */ public function getClosure() { return $this->serializable->getClosure(); } /** * Create a new unsigned serializable closure instance. * * @param Closure $closure * @return \Laravel\SerializableClosure\UnsignedSerializableClosure */ public static function unsigned(Closure $closure) { return new UnsignedSerializableClosure($closure); } /** * Sets the serializable closure secret key. * * @param string|null $secret * @return void */ public static function setSecretKey($secret) { Serializers\Signed::$signer = $secret ? new Hmac($secret) : null; } /** * Sets the transformer that should be used when serializing use variables. * * @param \Closure|null $transformer * @return void */ public static function transformUseVariablesUsing($transformer) { Serializers\Native::$transformUseVariables = $transformer; } /** * Sets the resolver that should be used when unserializing use variables. * * @param \Closure|null $resolver * @return void */ public static function resolveUseVariablesUsing($resolver) { Serializers\Native::$resolveUseVariables = $resolver; } /** * Get the serializable representation of the closure. * * @return array{serializable: \Laravel\SerializableClosure\Serializers\Signed|\Laravel\SerializableClosure\Contracts\Serializable} */ public function __serialize() { return [ 'serializable' => $this->serializable, ]; } /** * Restore the closure after serialization. * * @param array{serializable: \Laravel\SerializableClosure\Serializers\Signed|\Laravel\SerializableClosure\Contracts\Serializable} $data * @return void * * @throws \Laravel\SerializableClosure\Exceptions\InvalidSignatureException */ public function __unserialize($data) { if (Signed::$signer && ! $data['serializable'] instanceof Signed) { throw new InvalidSignatureException(); } $this->serializable = $data['serializable']; } } options[$property] ?? $default; } public function extend(array $options): Config { return new Config(array_merge($this->options, $options)); } public function withDefaults(array $defaults): Config { return new Config($this->options + $defaults); } public function toArray(): array { return $this->options; } public function withSetting(string $property, mixed $setting): Config { return $this->extend([$property => $setting]); } public function withoutSettings(string ...$settings): Config { return new Config(array_diff_key($this->options, array_flip($settings))); } } path = trim($this->path, '/'); } public function path(): string { return $this->path; } public function type(): string { return $this->type; } public function visibility(): ?string { return $this->visibility; } public function lastModified(): ?int { return $this->lastModified; } public function extraMetadata(): array { return $this->extraMetadata; } public function isFile(): bool { return false; } public function isDir(): bool { return true; } public function withPath(string $path): self { $clone = clone $this; $clone->path = $path; return $clone; } public static function fromArray(array $attributes): self { return new DirectoryAttributes( $attributes[StorageAttributes::ATTRIBUTE_PATH], $attributes[StorageAttributes::ATTRIBUTE_VISIBILITY] ?? null, $attributes[StorageAttributes::ATTRIBUTE_LAST_MODIFIED] ?? null, $attributes[StorageAttributes::ATTRIBUTE_EXTRA_METADATA] ?? [] ); } /** * @inheritDoc */ public function jsonSerialize(): array { return [ StorageAttributes::ATTRIBUTE_TYPE => $this->type, StorageAttributes::ATTRIBUTE_PATH => $this->path, StorageAttributes::ATTRIBUTE_VISIBILITY => $this->visibility, StorageAttributes::ATTRIBUTE_LAST_MODIFIED => $this->lastModified, StorageAttributes::ATTRIBUTE_EXTRA_METADATA => $this->extraMetadata, ]; } } $listing */ public function __construct(private iterable $listing) { } /** * @param callable(T): bool $filter * * @return DirectoryListing */ public function filter(callable $filter): DirectoryListing { $generator = (static function (iterable $listing) use ($filter): Generator { foreach ($listing as $item) { if ($filter($item)) { yield $item; } } })($this->listing); return new DirectoryListing($generator); } /** * @template R * * @param callable(T): R $mapper * * @return DirectoryListing */ public function map(callable $mapper): DirectoryListing { $generator = (static function (iterable $listing) use ($mapper): Generator { foreach ($listing as $item) { yield $mapper($item); } })($this->listing); return new DirectoryListing($generator); } /** * @return DirectoryListing */ public function sortByPath(): DirectoryListing { $listing = $this->toArray(); usort($listing, function (StorageAttributes $a, StorageAttributes $b) { return $a->path() <=> $b->path(); }); return new DirectoryListing($listing); } /** * @return Traversable */ public function getIterator(): Traversable { return $this->listing instanceof Traversable ? $this->listing : new ArrayIterator($this->listing); } /** * @return T[] */ public function toArray(): array { return $this->listing instanceof Traversable ? iterator_to_array($this->listing, false) : (array) $this->listing; } } location = $dirname; $e->reason = $errorMessage; return $e; } public static function dueToFailure(string $dirname, Throwable $previous): UnableToCreateDirectory { $reason = $previous instanceof UnableToCreateDirectory ? $previous->reason() : ''; $message = "Unable to create a directory at $dirname. $reason"; $e = new static(rtrim($message), 0, $previous); $e->location = $dirname; $e->reason = $reason ?: $message; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_CREATE_DIRECTORY; } public function reason(): string { return $this->reason; } public function location(): string { return $this->location; } } filePublic : $this->filePrivate; } public function forDirectory(string $visibility): int { PortableVisibilityGuard::guardAgainstInvalidInput($visibility); return $visibility === Visibility::PUBLIC ? $this->directoryPublic : $this->directoryPrivate; } public function inverseForFile(int $visibility): string { if ($visibility === $this->filePublic) { return Visibility::PUBLIC; } elseif ($visibility === $this->filePrivate) { return Visibility::PRIVATE; } return Visibility::PUBLIC; // default } public function inverseForDirectory(int $visibility): string { if ($visibility === $this->directoryPublic) { return Visibility::PUBLIC; } elseif ($visibility === $this->directoryPrivate) { return Visibility::PRIVATE; } return Visibility::PUBLIC; // default } public function defaultForDirectories(): int { return $this->defaultForDirectories === Visibility::PUBLIC ? $this->directoryPublic : $this->directoryPrivate; } /** * @param array $permissionMap */ public static function fromArray(array $permissionMap, string $defaultForDirectories = Visibility::PRIVATE): PortableVisibilityConverter { return new PortableVisibilityConverter( $permissionMap['file']['public'] ?? 0644, $permissionMap['file']['private'] ?? 0600, $permissionMap['dir']['public'] ?? 0755, $permissionMap['dir']['private'] ?? 0700, $defaultForDirectories ); } } readStream($path); $algo = (string) $config->get('checksum_algo', 'md5'); $context = hash_init($algo); hash_update_stream($context, $stream); return hash_final($context); } catch (FilesystemException $exception) { throw new UnableToProvideChecksum($exception->getMessage(), $path, $exception); } } /** * @return resource */ abstract public function readStream(string $path); } location = $location; $e->reason = $reason; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_READ; } public function reason(): string { return $this->reason; } public function location(): string { return $this->location; } } formatPropertyName((string) $offset); return isset($this->{$property}); } /** * @param mixed $offset * * @return mixed */ #[\ReturnTypeWillChange] public function offsetGet($offset) { $property = $this->formatPropertyName((string) $offset); return $this->{$property}; } /** * @param mixed $offset * @param mixed $value */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value): void { throw new RuntimeException('Properties can not be manipulated'); } /** * @param mixed $offset */ #[\ReturnTypeWillChange] public function offsetUnset($offset): void { throw new RuntimeException('Properties can not be manipulated'); } } source; } public function destination(): string { return $this->destination; } public static function fromLocationTo( string $sourcePath, string $destinationPath, ?Throwable $previous = null ): UnableToCopyFile { $e = new static("Unable to copy file from $sourcePath to $destinationPath", 0 , $previous); $e->source = $sourcePath; $e->destination = $destinationPath; return $e; } public static function sourceAndDestinationAreTheSame(string $source, string $destination): UnableToCopyFile { return UnableToCopyFile::because('Source and destination are the same', $source, $destination); } public static function because(string $reason, string $sourcePath, string $destinationPath): UnableToCopyFile { $e = new static("Unable to copy file from $sourcePath to $destinationPath, because $reason"); $e->source = $sourcePath; $e->destination = $destinationPath; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_COPY; } } adapter->fileExists($path); } public function directoryExists(string $path): bool { return $this->adapter->directoryExists($path); } public function write(string $path, string $contents, Config $config): void { $this->adapter->write($path, $contents, $config); } public function writeStream(string $path, $contents, Config $config): void { $this->adapter->writeStream($path, $contents, $config); } public function read(string $path): string { return $this->adapter->read($path); } public function readStream(string $path) { return $this->adapter->readStream($path); } public function delete(string $path): void { $this->adapter->delete($path); } public function deleteDirectory(string $path): void { $this->adapter->deleteDirectory($path); } public function createDirectory(string $path, Config $config): void { $this->adapter->createDirectory($path, $config); } public function setVisibility(string $path, string $visibility): void { $this->adapter->setVisibility($path, $visibility); } public function visibility(string $path): FileAttributes { return $this->adapter->visibility($path); } public function mimeType(string $path): FileAttributes { return $this->adapter->mimeType($path); } public function lastModified(string $path): FileAttributes { return $this->adapter->lastModified($path); } public function fileSize(string $path): FileAttributes { return $this->adapter->fileSize($path); } public function listContents(string $path, bool $deep): iterable { return $this->adapter->listContents($path, $deep); } public function move(string $source, string $destination, Config $config): void { $this->adapter->move($source, $destination, $config); } public function copy(string $source, string $destination, Config $config): void { $this->adapter->copy($source, $destination, $config); } } reason = $reason; $e->location = $location; $e->metadataType = $type; return $e; } public function reason(): string { return $this->reason; } public function location(): string { return $this->location; } public function metadataType(): string { return $this->metadataType; } public function operation(): string { return FilesystemOperationFailed::OPERATION_RETRIEVE_METADATA; } } source; } public function destination(): string { return $this->destination; } public static function fromLocationTo( string $sourcePath, string $destinationPath, ?Throwable $previous = null ): UnableToMoveFile { $message = $previous?->getMessage() ?? "Unable to move file from $sourcePath to $destinationPath"; $e = new static($message, 0, $previous); $e->source = $sourcePath; $e->destination = $destinationPath; return $e; } public static function because( string $reason, string $sourcePath, string $destinationPath, ): UnableToMoveFile { $message = "Unable to move file from $sourcePath to $destinationPath, because $reason"; $e = new static($message); $e->source = $sourcePath; $e->destination = $destinationPath; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_MOVE; } } path; } public static function forPath(string $path): PathTraversalDetected { $e = new PathTraversalDetected("Path traversal detected: {$path}"); $e->path = $path; return $e; } } getMessage(); return new UnableToListContents($message, 0, $previous); } public function operation(): string { return self::OPERATION_LIST_CONTENTS; } } location = $location; $e->reason = $reason; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_DELETE_DIRECTORY; } public function reason(): string { return $this->reason; } public function location(): string { return $this->location; } } * * @throws FilesystemException * @throws UnableToListContents */ public function listContents(string $location, bool $deep = self::LIST_SHALLOW): DirectoryListing; /** * @throws UnableToRetrieveMetadata * @throws FilesystemException */ public function lastModified(string $path): int; /** * @throws UnableToRetrieveMetadata * @throws FilesystemException */ public function fileSize(string $path): int; /** * @throws UnableToRetrieveMetadata * @throws FilesystemException */ public function mimeType(string $path): string; /** * @throws UnableToRetrieveMetadata * @throws FilesystemException */ public function visibility(string $path): string; } getMessage(), $path, $exception); } public static function noGeneratorConfigured(string $path, string $extraReason = ''): static { return new static('No generator was configured ' . $extraReason, $path); } } location = $location; $e->reason = $reason; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_DELETE; } public function reason(): string { return $this->reason; } public function location(): string { return $this->location; } } * * @throws FilesystemException */ public function listContents(string $path, bool $deep): iterable; /** * @throws UnableToMoveFile * @throws FilesystemException */ public function move(string $source, string $destination, Config $config): void; /** * @throws UnableToCopyFile * @throws FilesystemException */ public function copy(string $source, string $destination, Config $config): void; } config = new Config($config); $this->pathNormalizer = $pathNormalizer ?? new WhitespacePathNormalizer(); } public function fileExists(string $location): bool { return $this->adapter->fileExists($this->pathNormalizer->normalizePath($location)); } public function directoryExists(string $location): bool { return $this->adapter->directoryExists($this->pathNormalizer->normalizePath($location)); } public function has(string $location): bool { $path = $this->pathNormalizer->normalizePath($location); return $this->adapter->fileExists($path) || $this->adapter->directoryExists($path); } public function write(string $location, string $contents, array $config = []): void { $this->adapter->write( $this->pathNormalizer->normalizePath($location), $contents, $this->config->extend($config) ); } public function writeStream(string $location, $contents, array $config = []): void { /* @var resource $contents */ $this->assertIsResource($contents); $this->rewindStream($contents); $this->adapter->writeStream( $this->pathNormalizer->normalizePath($location), $contents, $this->config->extend($config) ); } public function read(string $location): string { return $this->adapter->read($this->pathNormalizer->normalizePath($location)); } public function readStream(string $location) { return $this->adapter->readStream($this->pathNormalizer->normalizePath($location)); } public function delete(string $location): void { $this->adapter->delete($this->pathNormalizer->normalizePath($location)); } public function deleteDirectory(string $location): void { $this->adapter->deleteDirectory($this->pathNormalizer->normalizePath($location)); } public function createDirectory(string $location, array $config = []): void { $this->adapter->createDirectory( $this->pathNormalizer->normalizePath($location), $this->config->extend($config) ); } public function listContents(string $location, bool $deep = self::LIST_SHALLOW): DirectoryListing { $path = $this->pathNormalizer->normalizePath($location); $listing = $this->adapter->listContents($path, $deep); return new DirectoryListing($this->pipeListing($location, $deep, $listing)); } private function pipeListing(string $location, bool $deep, iterable $listing): Generator { try { foreach ($listing as $item) { yield $item; } } catch (Throwable $exception) { throw UnableToListContents::atLocation($location, $deep, $exception); } } public function move(string $source, string $destination, array $config = []): void { $config = $this->resolveConfigForMoveAndCopy($config); $from = $this->pathNormalizer->normalizePath($source); $to = $this->pathNormalizer->normalizePath($destination); if ($from === $to) { $resolutionStrategy = $config->get(Config::OPTION_MOVE_IDENTICAL_PATH, ResolveIdenticalPathConflict::TRY); if ($resolutionStrategy === ResolveIdenticalPathConflict::FAIL) { throw UnableToMoveFile::sourceAndDestinationAreTheSame($source, $destination); } elseif ($resolutionStrategy === ResolveIdenticalPathConflict::IGNORE) { return; } } $this->adapter->move($from, $to, $config); } public function copy(string $source, string $destination, array $config = []): void { $config = $this->resolveConfigForMoveAndCopy($config); $from = $this->pathNormalizer->normalizePath($source); $to = $this->pathNormalizer->normalizePath($destination); if ($from === $to) { $resolutionStrategy = $config->get(Config::OPTION_COPY_IDENTICAL_PATH, ResolveIdenticalPathConflict::TRY); if ($resolutionStrategy === ResolveIdenticalPathConflict::FAIL) { throw UnableToCopyFile::sourceAndDestinationAreTheSame($source, $destination); } elseif ($resolutionStrategy === ResolveIdenticalPathConflict::IGNORE) { return; } } $this->adapter->copy($from, $to, $config); } public function lastModified(string $path): int { return $this->adapter->lastModified($this->pathNormalizer->normalizePath($path))->lastModified(); } public function fileSize(string $path): int { return $this->adapter->fileSize($this->pathNormalizer->normalizePath($path))->fileSize(); } public function mimeType(string $path): string { return $this->adapter->mimeType($this->pathNormalizer->normalizePath($path))->mimeType(); } public function setVisibility(string $path, string $visibility): void { $this->adapter->setVisibility($this->pathNormalizer->normalizePath($path), $visibility); } public function visibility(string $path): string { return $this->adapter->visibility($this->pathNormalizer->normalizePath($path))->visibility(); } public function publicUrl(string $path, array $config = []): string { $this->publicUrlGenerator ??= $this->resolvePublicUrlGenerator() ?? throw UnableToGeneratePublicUrl::noGeneratorConfigured($path); $config = $this->config->extend($config); return $this->publicUrlGenerator->publicUrl( $this->pathNormalizer->normalizePath($path), $config, ); } public function temporaryUrl(string $path, DateTimeInterface $expiresAt, array $config = []): string { $generator = $this->temporaryUrlGenerator ?? $this->adapter; if ($generator instanceof TemporaryUrlGenerator) { return $generator->temporaryUrl( $this->pathNormalizer->normalizePath($path), $expiresAt, $this->config->extend($config) ); } throw UnableToGenerateTemporaryUrl::noGeneratorConfigured($path); } public function checksum(string $path, array $config = []): string { $config = $this->config->extend($config); if ( ! $this->adapter instanceof ChecksumProvider) { return $this->calculateChecksumFromStream($path, $config); } try { return $this->adapter->checksum( $this->pathNormalizer->normalizePath($path), $config, ); } catch (ChecksumAlgoIsNotSupported) { return $this->calculateChecksumFromStream( $this->pathNormalizer->normalizePath($path), $config, ); } } private function resolvePublicUrlGenerator(): ?PublicUrlGenerator { if ($publicUrl = $this->config->get('public_url')) { return match (true) { is_array($publicUrl) => new ShardedPrefixPublicUrlGenerator($publicUrl), default => new PrefixPublicUrlGenerator($publicUrl), }; } if ($this->adapter instanceof PublicUrlGenerator) { return $this->adapter; } return null; } /** * @param mixed $contents */ private function assertIsResource($contents): void { if (is_resource($contents) === false) { throw new InvalidStreamProvided( "Invalid stream provided, expected stream resource, received " . gettype($contents) ); } elseif (($type = get_resource_type($contents)) !== 'stream') { throw new InvalidStreamProvided( "Invalid stream provided, expected stream resource, received resource of type " . $type ); } } /** * @param resource $resource */ private function rewindStream($resource): void { if (ftell($resource) !== 0 && stream_get_meta_data($resource)['seekable']) { rewind($resource); } } private function resolveConfigForMoveAndCopy(array $config): Config { $retainVisibility = $this->config->get(Config::OPTION_RETAIN_VISIBILITY, $config[Config::OPTION_RETAIN_VISIBILITY] ?? true); $fullConfig = $this->config->extend($config); /* * By default, we retain visibility. When we do not retain visibility, the visibility setting * from the default configuration is ignored. Only when it is set explicitly, we propagate the * setting. */ if ($retainVisibility && ! array_key_exists(Config::OPTION_VISIBILITY, $config)) { $fullConfig = $fullConfig->withoutSettings(Config::OPTION_VISIBILITY)->extend($config); } return $fullConfig; } } */ private $filesystems = []; /** * @var Config */ private $config; /** * MountManager constructor. * * @param array $filesystems */ public function __construct(array $filesystems = [], array $config = []) { $this->mountFilesystems($filesystems); $this->config = new Config($config); } /** * It is not recommended to mount filesystems after creation because interacting * with the Mount Manager becomes unpredictable. Use this as an escape hatch. */ public function dangerouslyMountFilesystems(string $key, FilesystemOperator $filesystem): void { $this->mountFilesystem($key, $filesystem); } /** * @param array $filesystems */ public function extend(array $filesystems, array $config = []): MountManager { $clone = clone $this; $clone->config = $this->config->extend($config); $clone->mountFilesystems($filesystems); return $clone; } public function fileExists(string $location): bool { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->fileExists($path); } catch (Throwable $exception) { throw UnableToCheckFileExistence::forLocation($location, $exception); } } public function has(string $location): bool { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->fileExists($path) || $filesystem->directoryExists($path); } catch (Throwable $exception) { throw UnableToCheckExistence::forLocation($location, $exception); } } public function directoryExists(string $location): bool { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->directoryExists($path); } catch (Throwable $exception) { throw UnableToCheckDirectoryExistence::forLocation($location, $exception); } } public function read(string $location): string { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->read($path); } catch (UnableToReadFile $exception) { throw UnableToReadFile::fromLocation($location, $exception->reason(), $exception); } } public function readStream(string $location) { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->readStream($path); } catch (UnableToReadFile $exception) { throw UnableToReadFile::fromLocation($location, $exception->reason(), $exception); } } public function listContents(string $location, bool $deep = self::LIST_SHALLOW): DirectoryListing { /** @var FilesystemOperator $filesystem */ [$filesystem, $path, $mountIdentifier] = $this->determineFilesystemAndPath($location); return $filesystem ->listContents($path, $deep) ->map( function (StorageAttributes $attributes) use ($mountIdentifier) { return $attributes->withPath(sprintf('%s://%s', $mountIdentifier, $attributes->path())); } ); } public function lastModified(string $location): int { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->lastModified($path); } catch (UnableToRetrieveMetadata $exception) { throw UnableToRetrieveMetadata::lastModified($location, $exception->reason(), $exception); } } public function fileSize(string $location): int { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->fileSize($path); } catch (UnableToRetrieveMetadata $exception) { throw UnableToRetrieveMetadata::fileSize($location, $exception->reason(), $exception); } } public function mimeType(string $location): string { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { return $filesystem->mimeType($path); } catch (UnableToRetrieveMetadata $exception) { throw UnableToRetrieveMetadata::mimeType($location, $exception->reason(), $exception); } } public function visibility(string $path): string { /** @var FilesystemOperator $filesystem */ [$filesystem, $location] = $this->determineFilesystemAndPath($path); try { return $filesystem->visibility($location); } catch (UnableToRetrieveMetadata $exception) { throw UnableToRetrieveMetadata::visibility($path, $exception->reason(), $exception); } } public function write(string $location, string $contents, array $config = []): void { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { $filesystem->write($path, $contents, $this->config->extend($config)->toArray()); } catch (UnableToWriteFile $exception) { throw UnableToWriteFile::atLocation($location, $exception->reason(), $exception); } } public function writeStream(string $location, $contents, array $config = []): void { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); $filesystem->writeStream($path, $contents, $this->config->extend($config)->toArray()); } public function setVisibility(string $path, string $visibility): void { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($path); $filesystem->setVisibility($path, $visibility); } public function delete(string $location): void { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { $filesystem->delete($path); } catch (UnableToDeleteFile $exception) { throw UnableToDeleteFile::atLocation($location, $exception->reason(), $exception); } } public function deleteDirectory(string $location): void { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { $filesystem->deleteDirectory($path); } catch (UnableToDeleteDirectory $exception) { throw UnableToDeleteDirectory::atLocation($location, $exception->reason(), $exception); } } public function createDirectory(string $location, array $config = []): void { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($location); try { $filesystem->createDirectory($path, $this->config->extend($config)->toArray()); } catch (UnableToCreateDirectory $exception) { throw UnableToCreateDirectory::dueToFailure($location, $exception); } } public function move(string $source, string $destination, array $config = []): void { /** @var FilesystemOperator $sourceFilesystem */ /* @var FilesystemOperator $destinationFilesystem */ [$sourceFilesystem, $sourcePath] = $this->determineFilesystemAndPath($source); [$destinationFilesystem, $destinationPath] = $this->determineFilesystemAndPath($destination); $sourceFilesystem === $destinationFilesystem ? $this->moveInTheSameFilesystem( $sourceFilesystem, $sourcePath, $destinationPath, $source, $destination, $config, ) : $this->moveAcrossFilesystems($source, $destination, $config); } public function copy(string $source, string $destination, array $config = []): void { /** @var FilesystemOperator $sourceFilesystem */ /* @var FilesystemOperator $destinationFilesystem */ [$sourceFilesystem, $sourcePath] = $this->determineFilesystemAndPath($source); [$destinationFilesystem, $destinationPath] = $this->determineFilesystemAndPath($destination); $sourceFilesystem === $destinationFilesystem ? $this->copyInSameFilesystem( $sourceFilesystem, $sourcePath, $destinationPath, $source, $destination, $config, ) : $this->copyAcrossFilesystem( $sourceFilesystem, $sourcePath, $destinationFilesystem, $destinationPath, $source, $destination, $config, ); } public function publicUrl(string $path, array $config = []): string { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($path); if ( ! method_exists($filesystem, 'publicUrl')) { throw new UnableToGeneratePublicUrl(sprintf('%s does not support generating public urls.', $filesystem::class), $path); } return $filesystem->publicUrl($path, $config); } public function temporaryUrl(string $path, DateTimeInterface $expiresAt, array $config = []): string { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($path); if ( ! method_exists($filesystem, 'temporaryUrl')) { throw new UnableToGenerateTemporaryUrl(sprintf('%s does not support generating public urls.', $filesystem::class), $path); } return $filesystem->temporaryUrl($path, $expiresAt, $this->config->extend($config)->toArray()); } public function checksum(string $path, array $config = []): string { /** @var FilesystemOperator $filesystem */ [$filesystem, $path] = $this->determineFilesystemAndPath($path); if ( ! method_exists($filesystem, 'checksum')) { throw new UnableToProvideChecksum(sprintf('%s does not support providing checksums.', $filesystem::class), $path); } return $filesystem->checksum($path, $this->config->extend($config)->toArray()); } private function mountFilesystems(array $filesystems): void { foreach ($filesystems as $key => $filesystem) { $this->guardAgainstInvalidMount($key, $filesystem); /* @var string $key */ /* @var FilesystemOperator $filesystem */ $this->mountFilesystem($key, $filesystem); } } private function guardAgainstInvalidMount(mixed $key, mixed $filesystem): void { if ( ! is_string($key)) { throw UnableToMountFilesystem::becauseTheKeyIsNotValid($key); } if ( ! $filesystem instanceof FilesystemOperator) { throw UnableToMountFilesystem::becauseTheFilesystemWasNotValid($filesystem); } } private function mountFilesystem(string $key, FilesystemOperator $filesystem): void { $this->filesystems[$key] = $filesystem; } /** * @param string $path * * @return array{0:FilesystemOperator, 1:string, 2:string} */ private function determineFilesystemAndPath(string $path): array { if (strpos($path, '://') < 1) { throw UnableToResolveFilesystemMount::becauseTheSeparatorIsMissing($path); } /** @var string $mountIdentifier */ /** @var string $mountPath */ [$mountIdentifier, $mountPath] = explode('://', $path, 2); if ( ! array_key_exists($mountIdentifier, $this->filesystems)) { throw UnableToResolveFilesystemMount::becauseTheMountWasNotRegistered($mountIdentifier); } return [$this->filesystems[$mountIdentifier], $mountPath, $mountIdentifier]; } private function copyInSameFilesystem( FilesystemOperator $sourceFilesystem, string $sourcePath, string $destinationPath, string $source, string $destination, array $config, ): void { try { $sourceFilesystem->copy($sourcePath, $destinationPath, $this->config->extend($config)->toArray()); } catch (UnableToCopyFile $exception) { throw UnableToCopyFile::fromLocationTo($source, $destination, $exception); } } private function copyAcrossFilesystem( FilesystemOperator $sourceFilesystem, string $sourcePath, FilesystemOperator $destinationFilesystem, string $destinationPath, string $source, string $destination, array $config, ): void { $config = $this->config->extend($config); $retainVisibility = (bool) $config->get(Config::OPTION_RETAIN_VISIBILITY, true); $visibility = $config->get(Config::OPTION_VISIBILITY); try { if ($visibility == null && $retainVisibility) { $visibility = $sourceFilesystem->visibility($sourcePath); $config = $config->extend(compact('visibility')); } $stream = $sourceFilesystem->readStream($sourcePath); $destinationFilesystem->writeStream($destinationPath, $stream, $config->toArray()); } catch (UnableToRetrieveMetadata | UnableToReadFile | UnableToWriteFile $exception) { throw UnableToCopyFile::fromLocationTo($source, $destination, $exception); } } private function moveInTheSameFilesystem( FilesystemOperator $sourceFilesystem, string $sourcePath, string $destinationPath, string $source, string $destination, array $config, ): void { try { $sourceFilesystem->move($sourcePath, $destinationPath, $this->config->extend($config)->toArray()); } catch (UnableToMoveFile $exception) { throw UnableToMoveFile::fromLocationTo($source, $destination, $exception); } } private function moveAcrossFilesystems(string $source, string $destination, array $config = []): void { try { $this->copy($source, $destination, $config); $this->delete($source); } catch (UnableToCopyFile | UnableToDeleteFile $exception) { throw UnableToMoveFile::fromLocationTo($source, $destination, $exception); } } } location; } public static function atLocation(string $location): UnreadableFileEncountered { $e = new static("Unreadable file encountered at location {$location}."); $e->location = $location; return $e; } } getMessage(), $path, $exception); } public static function noGeneratorConfigured(string $path, string $extraReason = ''): static { return new static('No generator was configured ' . $extraReason, $path); } } reason; } public static function atLocation(string $filename, string $extraMessage = '', ?Throwable $previous = null): self { $message = "Unable to set visibility for file {$filename}. $extraMessage"; $e = new static(rtrim($message), 0, $previous); $e->reason = $extraMessage; $e->location = $filename; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_SET_VISIBILITY; } public function location(): string { return $this->location; } } location; } public static function atLocation(string $pathName): SymbolicLinkEncountered { $e = new static("Unsupported symbolic link encountered at location $pathName"); $e->location = $pathName; return $e; } } prefix = rtrim($prefix, '\\/'); if ($this->prefix !== '' || $prefix === $separator) { $this->prefix .= $separator; } } public function prefixPath(string $path): string { return $this->prefix . ltrim($path, '\\/'); } public function stripPrefix(string $path): string { /* @var string */ return substr($path, strlen($this->prefix)); } public function stripDirectoryPrefix(string $path): string { return rtrim($this->stripPrefix($path), '\\/'); } public function prefixDirectoryPath(string $path): string { $prefixedPath = $this->prefixPath(rtrim($path, '\\/')); if ($prefixedPath === '' || substr($prefixedPath, -1) === $this->separator) { return $prefixedPath; } return $prefixedPath . $this->separator; } } location = $location; $e->reason = $reason; return $e; } public function operation(): string { return FilesystemOperationFailed::OPERATION_WRITE; } public function reason(): string { return $this->reason; } public function location(): string { return $this->location; } } count = count($prefixes); if ($this->count === 0) { throw new InvalidArgumentException('At least one prefix is required.'); } $this->prefixes = array_map(static fn (string $prefix) => new PathPrefixer($prefix, '/'), $prefixes); } public function publicUrl(string $path, Config $config): string { $index = abs(crc32($path)) % $this->count; return $this->prefixes[$index]->prefixPath($path); } } generators as $generator) { try { return $generator->publicUrl($path, $config); } catch (UnableToGeneratePublicUrl) { } } throw new UnableToGeneratePublicUrl('No supported public url generator found.', $path); } } prefixer = new PathPrefixer($urlPrefix, '/'); } public function publicUrl(string $path, Config $config): string { return $this->prefixer->prefixPath($path); } } rejectFunkyWhiteSpace($path); return $this->normalizeRelativePath($path); } private function rejectFunkyWhiteSpace(string $path): void { if (preg_match('#\p{C}+#u', $path)) { throw CorruptedPathDetected::forPath($path); } } private function normalizeRelativePath(string $path): string { $parts = []; foreach (explode('/', $path) as $part) { switch ($part) { case '': case '.': break; case '..': if (empty($parts)) { throw PathTraversalDetected::forPath($path); } array_pop($parts); break; default: $parts[] = $part; break; } } return implode('/', $parts); } } path = ltrim($this->path, '/'); } public function type(): string { return $this->type; } public function path(): string { return $this->path; } public function fileSize(): ?int { return $this->fileSize; } public function visibility(): ?string { return $this->visibility; } public function lastModified(): ?int { return $this->lastModified; } public function mimeType(): ?string { return $this->mimeType; } public function extraMetadata(): array { return $this->extraMetadata; } public function isFile(): bool { return true; } public function isDir(): bool { return false; } public function withPath(string $path): self { $clone = clone $this; $clone->path = $path; return $clone; } public static function fromArray(array $attributes): self { return new FileAttributes( $attributes[StorageAttributes::ATTRIBUTE_PATH], $attributes[StorageAttributes::ATTRIBUTE_FILE_SIZE] ?? null, $attributes[StorageAttributes::ATTRIBUTE_VISIBILITY] ?? null, $attributes[StorageAttributes::ATTRIBUTE_LAST_MODIFIED] ?? null, $attributes[StorageAttributes::ATTRIBUTE_MIME_TYPE] ?? null, $attributes[StorageAttributes::ATTRIBUTE_EXTRA_METADATA] ?? [] ); } public function jsonSerialize(): array { return [ StorageAttributes::ATTRIBUTE_TYPE => self::TYPE_FILE, StorageAttributes::ATTRIBUTE_PATH => $this->path, StorageAttributes::ATTRIBUTE_FILE_SIZE => $this->fileSize, StorageAttributes::ATTRIBUTE_VISIBILITY => $this->visibility, StorageAttributes::ATTRIBUTE_LAST_MODIFIED => $this->lastModified, StorageAttributes::ATTRIBUTE_MIME_TYPE => $this->mimeType, StorageAttributes::ATTRIBUTE_EXTRA_METADATA => $this->extraMetadata, ]; } } Copyright (c) 2013-2026 Frank de Jonge 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. # League\Flysystem [![Author](https://img.shields.io/badge/author-@frankdejonge-blue.svg)](https://twitter.com/frankdejonge) [![Source Code](https://img.shields.io/badge/source-thephpleague/flysystem-blue.svg)](https://github.com/thephpleague/flysystem) [![Latest Version](https://img.shields.io/github/tag/thephpleague/flysystem.svg)](https://github.com/thephpleague/flysystem/releases) [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://github.com/thephpleague/flysystem/blob/master/LICENSE) [![Quality Assurance](https://github.com/thephpleague/flysystem/workflows/Quality%20Assurance/badge.svg?branch=2.x)](https://github.com/thephpleague/flysystem/actions?query=workflow%3A%22Quality+Assurance%22) [![Total Downloads](https://img.shields.io/packagist/dt/league/flysystem.svg)](https://packagist.org/packages/league/flysystem) ![php 7.2+](https://img.shields.io/badge/php-min%208.0.2-red.svg) ## About Flysystem Flysystem is a file storage library for PHP. It provides one interface to interact with many types of filesystems. When you use Flysystem, you're not only protected from vendor lock-in, you'll also have a consistent experience for which ever storage is right for you. ## Getting Started * **[New in V3](https://flysystem.thephpleague.com/docs/what-is-new/)**: What is new in Flysystem V2/V3? * **[Architecture](https://flysystem.thephpleague.com/docs/architecture/)**: Flysystem's internal architecture * **[Flysystem API](https://flysystem.thephpleague.com/docs/usage/filesystem-api/)**: How to interact with your Flysystem instance * **[Upgrade from 1x](https://flysystem.thephpleague.com/docs/upgrade-from-1.x/)**: How to upgrade from 1.x/2.x ### Officially supported adapters * **[Local](https://flysystem.thephpleague.com/docs/adapter/local/)** * **[FTP](https://flysystem.thephpleague.com/docs/adapter/ftp/)** * **[SFTP](https://flysystem.thephpleague.com/docs/adapter/sftp-v3/)** * **[Memory](https://flysystem.thephpleague.com/docs/adapter/in-memory/)** * **[AWS S3](https://flysystem.thephpleague.com/docs/adapter/aws-s3-v3/)** * **[AsyncAws S3](https://flysystem.thephpleague.com/docs/adapter/async-aws-s3/)** * **[Google Cloud Storage](https://flysystem.thephpleague.com/docs/adapter/google-cloud-storage/)** * **[MongoDB GridFS](https://flysystem.thephpleague.com/docs/adapter/gridfs/)** * **[WebDAV](https://flysystem.thephpleague.com/docs/adapter/webdav/)** * **[ZipArchive](https://flysystem.thephpleague.com/docs/adapter/zip-archive/)** ### Third party Adapters * **[Azure Blob Storage](https://github.com/Azure-OSS/azure-storage-php-adapter-flysystem)** * **[Gitlab](https://github.com/RoyVoetman/flysystem-gitlab-storage)** * **[Google Drive (using regular paths)](https://github.com/masbug/flysystem-google-drive-ext)** * **[bunny.net / BunnyCDN](https://github.com/PlatformCommunity/flysystem-bunnycdn/tree/v3)** * **[Sharepoint 365 / One Drive (Using MS Graph)](https://github.com/shitware-ltd/flysystem-msgraph)** * **[OneDrive](https://github.com/doerffler/flysystem-onedrive)** * **[Dropbox](https://github.com/spatie/flysystem-dropbox)** * **[ReplicateAdapter](https://github.com/ajgarlag/flysystem-replicate)** * **[Uploadcare](https://github.com/vormkracht10/flysystem-uploadcare)** * **[Useful adapters (FallbackAdapter, LogAdapter, ReadWriteAdapter, RetryAdapter)](https://github.com/ElGigi/FlysystemUsefulAdapters)** * **[Metadata Cache](https://github.com/jgivoni/flysystem-cache-adapter)** * **[Migration adapter (lazy)](https://github.com/antonsacred/flysystem-lazy-migration-adapter)** You can always [create an adapter](https://flysystem.thephpleague.com/docs/advanced/creating-an-adapter/) yourself. ## Security If you discover any security related issues, please email info@frankdejonge.nl instead of using the issue tracker. ## Enjoy Oh, and if you've come down this far, you might as well follow me on [twitter](https://twitter.com/frankdejonge). { "name": "league/flysystem-local", "description": "Local filesystem adapter for Flysystem.", "keywords": ["flysystem", "filesystem", "local", "file", "files"], "type": "library", "prefer-stable": true, "autoload": { "psr-4": { "League\\Flysystem\\Local\\": "" } }, "require": { "php": "^8.0.2", "ext-fileinfo": "*", "league/flysystem": "^3.0.0", "league/mime-type-detection": "^1.0.0" }, "license": "MIT", "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ] } Copyright (c) 2013-2026 Frank de Jonge 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. prefixer = new PathPrefixer($location, DIRECTORY_SEPARATOR); $visibility ??= new PortableVisibilityConverter(); $this->visibility = $visibility; $this->rootLocation = $location; $this->mimeTypeDetector = $mimeTypeDetector ?? new FallbackMimeTypeDetector( detector: new FinfoMimeTypeDetector(), useInconclusiveMimeTypeFallback: $useInconclusiveMimeTypeFallback, ); if ( ! $lazyRootCreation) { $this->ensureRootDirectoryExists(); } } private function ensureRootDirectoryExists(): void { if ($this->rootLocationIsSetup) { return; } $this->ensureDirectoryExists($this->rootLocation, $this->visibility->defaultForDirectories()); $this->rootLocationIsSetup = true; } public function write(string $path, string $contents, Config $config): void { $this->writeToFile($path, $contents, $config); } public function writeStream(string $path, $contents, Config $config): void { $this->writeToFile($path, $contents, $config); } /** * @param resource|string $contents */ private function writeToFile(string $path, $contents, Config $config): void { $prefixedLocation = $this->prefixer->prefixPath($path); $this->ensureRootDirectoryExists(); $this->ensureDirectoryExists( dirname($prefixedLocation), $this->resolveDirectoryVisibility($config->get(Config::OPTION_DIRECTORY_VISIBILITY)) ); error_clear_last(); if (@file_put_contents($prefixedLocation, $contents, $this->writeFlags) === false) { throw UnableToWriteFile::atLocation($path, error_get_last()['message'] ?? ''); } if ($visibility = $config->get(Config::OPTION_VISIBILITY)) { $this->setVisibility($path, (string) $visibility); } } public function delete(string $path): void { $location = $this->prefixer->prefixPath($path); if ( ! file_exists($location)) { return; } error_clear_last(); if ( ! @unlink($location)) { throw UnableToDeleteFile::atLocation($location, error_get_last()['message'] ?? ''); } } public function deleteDirectory(string $prefix): void { $location = $this->prefixer->prefixPath($prefix); if ( ! is_dir($location)) { return; } $contents = $this->listDirectoryRecursively($location, RecursiveIteratorIterator::CHILD_FIRST); /** @var SplFileInfo $file */ foreach ($contents as $file) { if ( ! $this->deleteFileInfoObject($file)) { throw UnableToDeleteDirectory::atLocation($prefix, "Unable to delete file at " . $file->getPathname()); } } unset($contents); if ( ! @rmdir($location)) { throw UnableToDeleteDirectory::atLocation($prefix, error_get_last()['message'] ?? ''); } } private function listDirectoryRecursively( string $path, int $mode = RecursiveIteratorIterator::SELF_FIRST ): Generator { if ( ! is_dir($path)) { return; } yield from new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), $mode ); } protected function deleteFileInfoObject(SplFileInfo $file): bool { switch ($file->getType()) { case 'dir': return @rmdir((string) $file->getRealPath()); case 'link': return @unlink((string) $file->getPathname()); default: return @unlink((string) $file->getRealPath()); } } public function listContents(string $path, bool $deep): iterable { $location = $this->prefixer->prefixPath($path); if ( ! is_dir($location)) { return; } /** @var SplFileInfo[] $iterator */ $iterator = $deep ? $this->listDirectoryRecursively($location) : $this->listDirectory($location); foreach ($iterator as $fileInfo) { $pathName = $fileInfo->getPathname(); try { if ($fileInfo->isLink()) { if ($this->linkHandling & self::SKIP_LINKS) { continue; } throw SymbolicLinkEncountered::atLocation($pathName); } $path = $this->prefixer->stripPrefix($pathName); $lastModified = $fileInfo->getMTime(); $isDirectory = $fileInfo->isDir(); $permissions = octdec(substr(sprintf('%o', $fileInfo->getPerms()), -4)); $visibility = $isDirectory ? $this->visibility->inverseForDirectory($permissions) : $this->visibility->inverseForFile($permissions); yield $isDirectory ? new DirectoryAttributes(str_replace('\\', '/', $path), $visibility, $lastModified) : new FileAttributes( str_replace('\\', '/', $path), $fileInfo->getSize(), $visibility, $lastModified ); } catch (Throwable $exception) { if (file_exists($pathName)) { throw $exception; } } } } public function move(string $source, string $destination, Config $config): void { $sourcePath = $this->prefixer->prefixPath($source); $destinationPath = $this->prefixer->prefixPath($destination); $this->ensureRootDirectoryExists(); $this->ensureDirectoryExists( dirname($destinationPath), $this->resolveDirectoryVisibility($config->get(Config::OPTION_DIRECTORY_VISIBILITY)) ); error_clear_last(); if ( ! @rename($sourcePath, $destinationPath)) { throw UnableToMoveFile::because(error_get_last()['message'] ?? 'unknown reason', $source, $destination); } if ($visibility = $config->get(Config::OPTION_VISIBILITY)) { $this->setVisibility($destination, (string) $visibility); } } public function copy(string $source, string $destination, Config $config): void { $sourcePath = $this->prefixer->prefixPath($source); $destinationPath = $this->prefixer->prefixPath($destination); $this->ensureRootDirectoryExists(); $this->ensureDirectoryExists( dirname($destinationPath), $this->resolveDirectoryVisibility($config->get(Config::OPTION_DIRECTORY_VISIBILITY)) ); error_clear_last(); if ($sourcePath !== $destinationPath && ! @copy($sourcePath, $destinationPath)) { throw UnableToCopyFile::because(error_get_last()['message'] ?? 'unknown', $source, $destination); } $visibility = $config->get( Config::OPTION_VISIBILITY, $config->get(Config::OPTION_RETAIN_VISIBILITY, true) ? $this->visibility($source)->visibility() : null, ); if ($visibility) { $this->setVisibility($destination, (string) $visibility); } } public function read(string $path): string { $location = $this->prefixer->prefixPath($path); error_clear_last(); $contents = @file_get_contents($location); if ($contents === false) { throw UnableToReadFile::fromLocation($path, error_get_last()['message'] ?? ''); } return $contents; } public function readStream(string $path) { $location = $this->prefixer->prefixPath($path); error_clear_last(); $contents = @fopen($location, 'rb'); if ($contents === false) { throw UnableToReadFile::fromLocation($path, error_get_last()['message'] ?? ''); } return $contents; } protected function ensureDirectoryExists(string $dirname, int $visibility): void { if (is_dir($dirname)) { return; } error_clear_last(); if ( ! @mkdir($dirname, $visibility, true)) { $mkdirError = error_get_last(); } clearstatcache(true, $dirname); if ( ! is_dir($dirname)) { $errorMessage = isset($mkdirError['message']) ? $mkdirError['message'] : ''; throw UnableToCreateDirectory::atLocation($dirname, $errorMessage); } } public function fileExists(string $location): bool { $location = $this->prefixer->prefixPath($location); clearstatcache(); return is_file($location); } public function directoryExists(string $location): bool { $location = $this->prefixer->prefixPath($location); clearstatcache(); return is_dir($location); } public function createDirectory(string $path, Config $config): void { $this->ensureRootDirectoryExists(); $location = $this->prefixer->prefixPath($path); $visibility = $config->get(Config::OPTION_VISIBILITY, $config->get(Config::OPTION_DIRECTORY_VISIBILITY)); $permissions = $this->resolveDirectoryVisibility($visibility); if (is_dir($location)) { $this->setPermissions($location, $permissions); return; } error_clear_last(); if ( ! @mkdir($location, $permissions, true)) { throw UnableToCreateDirectory::atLocation($path, error_get_last()['message'] ?? ''); } } public function setVisibility(string $path, string $visibility): void { $path = $this->prefixer->prefixPath($path); $visibility = is_dir($path) ? $this->visibility->forDirectory($visibility) : $this->visibility->forFile( $visibility ); $this->setPermissions($path, $visibility); } public function visibility(string $path): FileAttributes { $location = $this->prefixer->prefixPath($path); clearstatcache(false, $location); error_clear_last(); $fileperms = @fileperms($location); if ($fileperms === false) { throw UnableToRetrieveMetadata::visibility($path, error_get_last()['message'] ?? ''); } $permissions = $fileperms & 0777; $visibility = $this->visibility->inverseForFile($permissions); return new FileAttributes($path, null, $visibility); } private function resolveDirectoryVisibility(?string $visibility): int { return $visibility === null ? $this->visibility->defaultForDirectories() : $this->visibility->forDirectory( $visibility ); } public function mimeType(string $path): FileAttributes { $location = $this->prefixer->prefixPath($path); error_clear_last(); if ( ! is_file($location)) { throw UnableToRetrieveMetadata::mimeType($location, 'No such file exists.'); } $mimeType = $this->mimeTypeDetector->detectMimeTypeFromFile($location); if ($mimeType === null) { throw UnableToRetrieveMetadata::mimeType($path, error_get_last()['message'] ?? ''); } return new FileAttributes($path, null, null, null, $mimeType); } public function lastModified(string $path): FileAttributes { $location = $this->prefixer->prefixPath($path); clearstatcache(); error_clear_last(); $lastModified = @filemtime($location); if ($lastModified === false) { throw UnableToRetrieveMetadata::lastModified($path, error_get_last()['message'] ?? ''); } return new FileAttributes($path, null, null, $lastModified); } public function fileSize(string $path): FileAttributes { $location = $this->prefixer->prefixPath($path); clearstatcache(); error_clear_last(); if (is_file($location) && ($fileSize = @filesize($location)) !== false) { return new FileAttributes($path, $fileSize); } throw UnableToRetrieveMetadata::fileSize($path, error_get_last()['message'] ?? ''); } public function checksum(string $path, Config $config): string { $algo = $config->get('checksum_algo', 'md5'); $location = $this->prefixer->prefixPath($path); error_clear_last(); $checksum = @hash_file($algo, $location); if ($checksum === false) { throw new UnableToProvideChecksum(error_get_last()['message'] ?? '', $path); } return $checksum; } private function listDirectory(string $location): Generator { $iterator = new DirectoryIterator($location); foreach ($iterator as $item) { if ($item->isDot()) { continue; } yield $item; } } private function setPermissions(string $location, int $visibility): void { error_clear_last(); if ( ! @chmod($location, $visibility)) { $extraMessage = error_get_last()['message'] ?? ''; throw UnableToSetVisibility::atLocation($this->prefixer->stripPrefix($location), $extraMessage); } } } detector->detectMimeType($path, $contents); } public function detectMimeTypeFromBuffer(string $contents): ?string { return $this->detector->detectMimeTypeFromBuffer($contents); } public function detectMimeTypeFromPath(string $path): ?string { return $this->detector->detectMimeTypeFromPath($path); } public function detectMimeTypeFromFile(string $path): ?string { $mimeType = $this->detector->detectMimeTypeFromFile($path); if ($mimeType !== null && ! in_array($mimeType, $this->inconclusiveMimetypes)) { return $mimeType; } return $this->detector->detectMimeTypeFromPath($path) ?? ($this->useInconclusiveMimeTypeFallback ? $mimeType : null); } } # Changelog ## 1.16.0 - 2025-09-21 - Updated lookup - Prepped for 8.4 implicit nullable deprecation ## 1.15.0 - 2024-01-28 - Updated lookup ## 1.14.0 - 2022-10-17 ### Updated - Updated lookup ## 1.13.0 - 2023-08-05 ### Added - A reverse lookup mechanism to fetch one or all extensions for a given mimetype ## 1.12.0 - 2023-08-03 ### Updated - Updated lookup ## 1.11.0 - 2023-04-17 ### Updated - Updated lookup ## 1.10.0 - 2022-04-11 ### Fixed - Added Flysystem v1 inconclusive mime-types and made it configurable as a constructor parameter. ## 1.9.0 - 2021-11-21 ### Updated - Updated lookup ## 1.8.0 - 2021-09-25 ### Added - Added the decorator `OverridingExtensionToMimeTypeMap` which allows you to override values. ## 1.7.0 - 2021-01-18 ### Added - Added a `bufferSampleSize` parameter to the `FinfoMimeTypeDetector` class that allows you to send a reduced content sample which costs less memory. ## 1.6.0 - 2021-01-18 ### Changes - Updated generated mime-type map { "name": "league/mime-type-detection", "description": "Mime-type detection for Flysystem", "license": "MIT", "authors": [ { "name": "Frank de Jonge", "email": "info@frankdejonge.nl" } ], "scripts": { "test": "vendor/bin/phpunit", "phpstan": "vendor/bin/phpstan analyse -l 6 src" }, "require": { "php": "^7.4 || ^8.0", "ext-fileinfo": "*" }, "require-dev": { "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0", "phpstan/phpstan": "^0.12.68", "friendsofphp/php-cs-fixer": "^3.2" }, "autoload": { "psr-4": { "League\\MimeTypeDetection\\": "src" } }, "config": { "platform": { "php": "7.4.0" } } } extensions = $extensions ?: new GeneratedExtensionToMimeTypeMap(); } public function detectMimeType(string $path, $contents): ?string { return $this->detectMimeTypeFromPath($path); } public function detectMimeTypeFromPath(string $path): ?string { $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION)); return $this->extensions->lookupMimeType($extension); } public function detectMimeTypeFromFile(string $path): ?string { return $this->detectMimeTypeFromPath($path); } public function detectMimeTypeFromBuffer(string $contents): ?string { return null; } public function lookupExtension(string $mimetype): ?string { return $this->extensions instanceof ExtensionLookup ? $this->extensions->lookupExtension($mimetype) : null; } public function lookupAllExtensions(string $mimetype): array { return $this->extensions instanceof ExtensionLookup ? $this->extensions->lookupAllExtensions($mimetype) : []; } } */ private $inconclusiveMimetypes; public function __construct( string $magicFile = '', ?ExtensionToMimeTypeMap $extensionMap = null, ?int $bufferSampleSize = null, array $inconclusiveMimetypes = self::INCONCLUSIVE_MIME_TYPES ) { $this->finfo = new finfo(FILEINFO_MIME_TYPE, $magicFile); $this->extensionMap = $extensionMap ?: new GeneratedExtensionToMimeTypeMap(); $this->bufferSampleSize = $bufferSampleSize; $this->inconclusiveMimetypes = $inconclusiveMimetypes; } public function detectMimeType(string $path, $contents): ?string { $mimeType = is_string($contents) ? (@$this->finfo->buffer($this->takeSample($contents)) ?: null) : null; if ($mimeType !== null && ! in_array($mimeType, $this->inconclusiveMimetypes)) { return $mimeType; } return $this->detectMimeTypeFromPath($path); } public function detectMimeTypeFromPath(string $path): ?string { $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION)); return $this->extensionMap->lookupMimeType($extension); } public function detectMimeTypeFromFile(string $path): ?string { return @$this->finfo->file($path) ?: null; } public function detectMimeTypeFromBuffer(string $contents): ?string { return @$this->finfo->buffer($this->takeSample($contents)) ?: null; } private function takeSample(string $contents): string { if ($this->bufferSampleSize === null) { return $contents; } return (string) substr($contents, 0, $this->bufferSampleSize); } public function lookupExtension(string $mimetype): ?string { return $this->extensionMap instanceof ExtensionLookup ? $this->extensionMap->lookupExtension($mimetype) : null; } public function lookupAllExtensions(string $mimetype): array { return $this->extensionMap instanceof ExtensionLookup ? $this->extensionMap->lookupAllExtensions($mimetype) : []; } } * * @internal */ public const MIME_TYPES_FOR_EXTENSIONS = [ '1km' => 'application/vnd.1000minds.decision-model+xml', '3dml' => 'text/vnd.in3d.3dml', '3ds' => 'image/x-3ds', '3g2' => 'video/3gpp2', '3gp' => 'video/3gp', '3gpp' => 'video/3gpp', '3mf' => 'model/3mf', '7z' => 'application/x-7z-compressed', '7zip' => 'application/x-7z-compressed', '123' => 'application/vnd.lotus-1-2-3', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/acc', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/vnd.nokia.n-gage.ac+xml', 'ac3' => 'audio/ac3', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'adts' => 'audio/aac', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'age' => 'application/vnd.age', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/pdf', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'aml' => 'application/automationml-aml+xml', 'amlx' => 'application/automationml-amlx+zip', 'amr' => 'audio/amr', 'apk' => 'application/vnd.android.package-archive', 'apng' => 'image/apng', 'appcache' => 'text/cache-manifest', 'appinstaller' => 'application/appinstaller', 'application' => 'application/x-ms-application', 'appx' => 'application/appx', 'appxbundle' => 'application/appxbundle', 'apr' => 'application/vnd.lotus-approach', 'arc' => 'application/x-freearc', 'arj' => 'application/x-arj', 'asc' => 'application/pgp-signature', 'asf' => 'video/x-ms-asf', 'asm' => 'text/x-asm', 'aso' => 'application/vnd.accpac.simply.aso', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomdeleted' => 'application/atomdeleted+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/x-au', 'avci' => 'image/avci', 'avcs' => 'image/avcs', 'avi' => 'video/x-msvideo', 'avif' => 'image/avif', 'aw' => 'application/applixware', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azv' => 'image/vnd.airzip.accelerator.azv', 'azw' => 'application/vnd.amazon.ebook', 'b16' => 'image/vnd.pco.b16', 'bary' => 'model/vnd.bary', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bdo' => 'application/vnd.nato.bindingdataobject+xml', 'bdoc' => 'application/x-bdoc', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'blb' => 'application/x-blorb', 'blorb' => 'application/x-blorb', 'bmi' => 'application/vnd.bmi', 'bmml' => 'application/vnd.balsamiq.bmml+xml', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'bpmn' => 'application/octet-stream', 'brf' => 'application/braille', 'bsp' => 'model/vnd.valve.source.compiled-map', 'btf' => 'image/prs.btif', 'btif' => 'image/prs.btif', 'buffer' => 'application/octet-stream', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'cab' => 'application/vnd.ms-cab-compressed', 'caf' => 'audio/x-caf', 'cap' => 'application/vnd.tcpdump.pcap', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cb7' => 'application/x-cbr', 'cba' => 'application/x-cbr', 'cbr' => 'application/x-cbr', 'cbt' => 'application/x-cbr', 'cbz' => 'application/x-cbr', 'cc' => 'text/x-c', 'cco' => 'application/x-cocoa', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdfx' => 'application/cdfx+xml', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdr' => 'application/cdr', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfs' => 'application/x-cfs-compressed', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cjs' => 'application/node', 'cla' => 'application/vnd.claymore', 'class' => 'application/octet-stream', 'cld' => 'model/vnd.cld', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'coffee' => 'text/coffeescript', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpl' => 'application/cpl+xml', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'crx' => 'application/x-chrome-extension', 'cryptonote' => 'application/vnd.rig.cryptonote', 'csh' => 'application/x-csh', 'csl' => 'application/vnd.citationstyles.style+xml', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'csr' => 'application/octet-stream', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cwl' => 'application/cwl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dart' => 'application/vnd.dart', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dbf' => 'application/vnd.dbf', 'dbk' => 'application/docbook+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'ddf' => 'application/vnd.syncml.dmddf+xml', 'dds' => 'image/vnd.ms-dds', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dgc' => 'application/x-dgc-compressed', 'dib' => 'image/bmp', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'disposition-notification' => 'message/disposition-notification', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/octet-stream', 'dmg' => 'application/x-apple-diskimage', 'dmn' => 'application/octet-stream', 'dmp' => 'application/vnd.tcpdump.pcap', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dpx' => 'image/dpx', 'dra' => 'audio/vnd.dra', 'drle' => 'image/dicom-rle', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dst' => 'application/octet-stream', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvb' => 'video/vnd.dvb.file', 'dvi' => 'application/x-dvi', 'dwd' => 'application/atsc-dwd+xml', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ear' => 'application/java-archive', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'emf' => 'image/emf', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'emotionml' => 'application/emotionml+xml', 'emz' => 'application/x-msmetafile', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esa' => 'application/vnd.osgi.subsystem', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'eva' => 'application/x-eva', 'evy' => 'application/x-envoy', 'exe' => 'application/octet-stream', 'exi' => 'application/exi', 'exp' => 'application/express', 'exr' => 'image/aces', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/mp4', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'fbs' => 'image/vnd.fastbidsheet', 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/vnd.fdf', 'fdt' => 'application/fdt+xml', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fits' => 'image/fits', 'flac' => 'audio/x-flac', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'fo' => 'application/vnd.software602.filler.form+xml', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gam' => 'application/x-tads', 'gbr' => 'application/rpki-ghostbusters', 'gca' => 'application/x-gca-compressed', 'gdl' => 'model/vnd.gdl', 'gdoc' => 'application/vnd.google-apps.document', 'ged' => 'text/vnd.familysearch.gedcom', 'geo' => 'application/vnd.dynageo', 'geojson' => 'application/geo+json', 'gex' => 'application/vnd.geometry-explorer', 'ggb' => 'application/vnd.geogebra.file', 'ggs' => 'application/vnd.geogebra.slides', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'glb' => 'model/gltf-binary', 'gltf' => 'model/gltf+json', 'gml' => 'application/gml+xml', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gpg' => 'application/gpg-keys', 'gph' => 'application/vnd.flographit', 'gpx' => 'application/gpx+xml', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gramps' => 'application/x-gramps-xml', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gsf' => 'application/x-font-ghostscript', 'gsheet' => 'application/vnd.google-apps.spreadsheet', 'gslides' => 'application/vnd.google-apps.presentation', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxf' => 'application/gxf', 'gxt' => 'application/vnd.geonext', 'gz' => 'application/gzip', 'gzip' => 'application/gzip', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hbs' => 'text/x-handlebars-template', 'hdd' => 'application/x-virtualbox-hdd', 'hdf' => 'application/x-hdf', 'heic' => 'image/heic', 'heics' => 'image/heic-sequence', 'heif' => 'image/heif', 'heifs' => 'image/heif-sequence', 'hej2' => 'image/hej2k', 'held' => 'application/atsc-held+xml', 'hh' => 'text/x-c', 'hjson' => 'application/hjson', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'hsj2' => 'image/hsj2', 'htc' => 'text/x-component', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'img' => 'application/octet-stream', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'ini' => 'text/plain', 'ink' => 'application/inkml+xml', 'inkml' => 'application/inkml+xml', 'install' => 'application/x-install-instructions', 'iota' => 'application/vnd.astraea-software.iota', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/x-iso9660-image', 'itp' => 'application/vnd.shana.informed.formtemplate', 'its' => 'application/its+xml', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jade' => 'text/jade', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'jardiff' => 'application/x-java-archive-diff', 'java' => 'text/x-java-source', 'jhc' => 'image/jphc', 'jisp' => 'application/vnd.jisp', 'jls' => 'image/jls', 'jlt' => 'application/vnd.hp-jlyt', 'jng' => 'image/x-jng', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jp2' => 'image/jp2', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpf' => 'image/jpx', 'jpg' => 'image/jpeg', 'jpg2' => 'image/jp2', 'jpgm' => 'video/jpm', 'jpgv' => 'video/jpeg', 'jph' => 'image/jph', 'jpm' => 'video/jpm', 'jpx' => 'image/jpx', 'js' => 'application/javascript', 'json' => 'application/json', 'json5' => 'application/json5', 'jsonld' => 'application/ld+json', 'jsonml' => 'application/jsonml+json', 'jsx' => 'text/jsx', 'jt' => 'model/jt', 'jxl' => 'image/jxl', 'jxr' => 'image/jxr', 'jxra' => 'image/jxra', 'jxrs' => 'image/jxrs', 'jxs' => 'image/jxs', 'jxsc' => 'image/jxsc', 'jxsi' => 'image/jxsi', 'jxss' => 'image/jxss', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kdb' => 'application/octet-stream', 'kdbx' => 'application/x-keepass2', 'key' => 'application/x-iwork-keynote-sffkey', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'kpxx' => 'application/vnd.ds-keypoint', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktx2' => 'image/ktx2', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'less' => 'text/less', 'lgr' => 'application/lgr+xml', 'lha' => 'application/octet-stream', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'litcoffee' => 'text/coffeescript', 'lnk' => 'application/x-ms-shortcut', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lua' => 'text/x-lua', 'luac' => 'application/x-lua-bytecode', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/octet-stream', 'm1v' => 'video/mpeg', 'm2a' => 'audio/mpeg', 'm2t' => 'video/mp2t', 'm2ts' => 'video/mp2t', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'text/plain', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/x-m4a', 'm4p' => 'application/mp4', 'm4s' => 'video/iso.segment', 'm4u' => 'application/vnd.mpegurl', 'm4v' => 'video/x-m4v', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm21' => 'application/mp21', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'maei' => 'application/mmt-aei+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'manifest' => 'text/cache-manifest', 'map' => 'application/json', 'mar' => 'application/octet-stream', 'markdown' => 'text/markdown', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'md' => 'text/markdown', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'mdx' => 'text/mdx', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'metalink' => 'application/metalink+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mft' => 'application/rpki-manifest', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mie' => 'application/x-mie', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mjs' => 'text/javascript', 'mk3d' => 'video/x-matroska', 'mka' => 'audio/x-matroska', 'mkd' => 'text/x-markdown', 'mks' => 'video/x-matroska', 'mkv' => 'video/x-matroska', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mml' => 'text/mathml', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mng' => 'video/x-mng', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mp21' => 'application/mp21', 'mpc' => 'application/vnd.mophun.certificate', 'mpd' => 'application/dash+xml', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpf' => 'application/media-policy-dataset+xml', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msg' => 'application/vnd.ms-outlook', 'msh' => 'model/mesh', 'msi' => 'application/x-msdownload', 'msix' => 'application/msix', 'msixbundle' => 'application/msixbundle', 'msl' => 'application/vnd.mobius.msl', 'msm' => 'application/octet-stream', 'msp' => 'application/octet-stream', 'msty' => 'application/vnd.muvee.style', 'mtl' => 'model/mtl', 'mts' => 'video/mp2t', 'mus' => 'application/vnd.musician', 'musd' => 'application/mmt-usd+xml', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mvt' => 'application/vnd.mapbox-vector-tile', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxmf' => 'audio/mobile-xmf', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'ndjson' => 'application/x-ndjson', 'nfo' => 'text/x-nfo', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nitf' => 'application/vnd.nitf', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nq' => 'application/n-quads', 'nsc' => 'application/x-conference', 'nsf' => 'application/vnd.lotus-notes', 'nt' => 'application/n-triples', 'ntf' => 'application/vnd.nitf', 'numbers' => 'application/x-iwork-numbers-sffnumbers', 'nzb' => 'application/x-nzb', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'obgx' => 'application/vnd.openblox.game+xml', 'obj' => 'model/obj', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogex' => 'model/vnd.opengex', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'omdoc' => 'application/omdoc+xml', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'opml' => 'text/x-opml', 'oprc' => 'application/vnd.palm', 'opus' => 'audio/ogg', 'org' => 'text/x-org', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osm' => 'application/vnd.openstreetmap.data+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'font/otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'ova' => 'application/x-virtualbox-ova', 'ovf' => 'application/x-virtualbox-ovf', 'owl' => 'application/rdf+xml', 'oxps' => 'application/oxps', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p7a' => 'application/x-pkcs7-signature', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'p10' => 'application/x-pkcs10', 'p12' => 'application/x-pkcs12', 'pac' => 'application/x-ns-proxy-autoconfig', 'pages' => 'application/x-iwork-pages-sffpages', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcap' => 'application/vnd.tcpdump.pcap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/x-pcx', 'pdb' => 'application/x-pilot', 'pde' => 'text/x-processing', 'pdf' => 'application/pdf', 'pem' => 'application/x-x509-user-cert', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp', 'phar' => 'application/octet-stream', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'phps' => 'application/x-httpd-php-source', 'phtml' => 'application/x-httpd-php', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'pkpass' => 'application/vnd.apple.pkpass', 'pl' => 'application/x-perl', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pm' => 'application/x-perl', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppa' => 'application/vnd.ms-powerpoint', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'model/prc', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'provx' => 'application/provenance+xml', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'application/x-photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'pti' => 'image/prs.pti', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pv' => 'application/octet-stream', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pxf' => 'application/octet-stream', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyo' => 'model/vnd.pytha.pyox', 'pyox' => 'model/vnd.pytha.pyox', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-realaudio', 'ram' => 'audio/x-pn-realaudio', 'raml' => 'application/raml+yaml', 'rapd' => 'application/route-apd+xml', 'rar' => 'application/x-rar', 'ras' => 'image/x-cmu-raster', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'relo' => 'application/p2p-overlay+xml', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'ris' => 'application/x-research-info-systems', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'audio/x-pn-realaudio', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rmvb' => 'application/vnd.rn-realmedia-vbr', 'rnc' => 'application/relax-ng-compact-syntax', 'rng' => 'application/xml', 'roa' => 'application/rpki-roa', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpm' => 'audio/x-pn-realaudio-plugin', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsa' => 'application/x-pkcs7', 'rsat' => 'application/atsc-rsat+xml', 'rsd' => 'application/rsd+xml', 'rsheet' => 'application/urc-ressheet+xml', 'rss' => 'application/rss+xml', 'rtf' => 'text/rtf', 'rtx' => 'text/richtext', 'run' => 'application/x-makeself', 'rusd' => 'application/route-usd+xml', 'rv' => 'video/vnd.rn-realvideo', 's' => 'text/x-asm', 's3m' => 'audio/s3m', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sass' => 'text/x-sass', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scss' => 'text/x-scss', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'sea' => 'application/octet-stream', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'senmlx' => 'application/senml+xml', 'sensmlx' => 'application/sensml+xml', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sfv' => 'text/x-sfv', 'sgi' => 'image/sgi', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shex' => 'text/shex', 'shf' => 'application/shf+xml', 'shtml' => 'text/html', 'sid' => 'image/x-mrsid-image', 'sieve' => 'application/sieve', 'sig' => 'application/pgp-signature', 'sil' => 'audio/silk', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'siv' => 'application/sieve', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slim' => 'text/slim', 'slm' => 'text/slim', 'sls' => 'application/route-s-tsid+xml', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil', 'smil' => 'application/smil', 'smv' => 'video/x-smv', 'smzip' => 'application/vnd.stepmania.package', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spdx' => 'text/spdx', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'sql' => 'application/x-sql', 'src' => 'application/x-wais-source', 'srt' => 'application/x-subrip', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'ssdl' => 'application/ssdl+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'sst' => 'application/octet-stream', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'step' => 'application/STEP', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'model/stl', 'stp' => 'application/STEP', 'stpx' => 'model/step+xml', 'stpxz' => 'model/step-xml+zip', 'stpz' => 'model/step+zip', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'styl' => 'text/stylus', 'stylus' => 'text/stylus', 'sub' => 'text/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'swidtag' => 'application/swid+xml', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 't' => 'text/troff', 't3' => 'application/x-t3vm-image', 't38' => 'image/t38', 'taglet' => 'application/vnd.mynfc', 'tao' => 'application/vnd.tao.intent-module-archive', 'tap' => 'image/vnd.tencent.tap', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'td' => 'application/urc-targetdesc+xml', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'tfx' => 'image/tiff-fx', 'tga' => 'image/x-tga', 'tgz' => 'application/x-tar', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tk' => 'application/x-tcl', 'tmo' => 'application/vnd.tmobile-livetv', 'toml' => 'application/toml', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trig' => 'application/trig', 'trm' => 'application/x-msterminal', 'ts' => 'video/mp2t', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'font/collection', 'ttf' => 'font/ttf', 'ttl' => 'text/turtle', 'ttml' => 'application/ttml+xml', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u3d' => 'model/u3d', 'u8dsn' => 'message/global-delivery-status', 'u8hdr' => 'message/global-headers', 'u8mdn' => 'message/global-disposition-notification', 'u8msg' => 'message/global', 'u32' => 'application/x-authorware-bin', 'ubj' => 'application/ubjson', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'ulx' => 'application/x-glulx', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uo' => 'application/vnd.uoml+xml', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'usda' => 'model/vnd.usda', 'usdz' => 'model/vnd.usdz+zip', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvvz' => 'application/vnd.dece.zip', 'uvx' => 'application/vnd.dece.unspecified', 'uvz' => 'application/vnd.dece.zip', 'vbox' => 'application/x-virtualbox-vbox', 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', 'vcard' => 'text/vcard', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vdi' => 'application/x-virtualbox-vdi', 'vds' => 'model/vnd.sap.vds', 'vhd' => 'application/x-virtualbox-vhd', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vlc' => 'application/videolan', 'vmdk' => 'application/x-virtualbox-vmdk', 'vob' => 'video/x-ms-vob', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtf' => 'image/vnd.valve.source.texture', 'vtt' => 'text/vtt', 'vtu' => 'model/vnd.vtu', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wadl' => 'application/vnd.sun.wadl+xml', 'war' => 'application/java-archive', 'wasm' => 'application/wasm', 'wav' => 'audio/x-wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'wdp' => 'image/vnd.ms-photo', 'weba' => 'audio/webm', 'webapp' => 'application/x-web-app-manifest+json', 'webm' => 'video/webm', 'webmanifest' => 'application/manifest+json', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgsl' => 'text/wgsl', 'wgt' => 'application/widget', 'wif' => 'application/watcherinfo+xml', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'image/wmf', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-msmetafile', 'woff' => 'font/woff', 'woff2' => 'font/woff2', 'word' => 'application/msword', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsc' => 'message/vnd.wfa.wsc', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x3d' => 'model/x3d+xml', 'x3db' => 'model/x3d+fastinfoset', 'x3dbz' => 'model/x3d+binary', 'x3dv' => 'model/x3d-vrml', 'x3dvz' => 'model/x3d+vrml', 'x3dz' => 'model/x3d+xml', 'x32' => 'application/x-authorware-bin', 'x_b' => 'model/vnd.parasolid.transmit.binary', 'x_t' => 'model/vnd.parasolid.transmit.text', 'xaml' => 'application/xaml+xml', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xav' => 'application/xcap-att+xml', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xca' => 'application/xcap-caps+xml', 'xcs' => 'application/calendar+xml', 'xdcf' => 'application/vnd.gov.sk.xmldatacontainer+xml', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xel' => 'application/xcap-el+xml', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtm' => 'application/vnd.pwg-xhtml-print+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xl' => 'application/excel', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlf' => 'application/xliff+xml', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xm' => 'audio/xm', 'xml' => 'application/xml', 'xns' => 'application/xcap-ns+xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpl' => 'application/xproc+xml', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsd' => 'application/xml', 'xsf' => 'application/prs.xsf+xml', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'xz' => 'application/x-xz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'ymp' => 'text/x-suse-ymp', 'z' => 'application/x-compress', 'z1' => 'application/x-zmachine', 'z2' => 'application/x-zmachine', 'z3' => 'application/x-zmachine', 'z4' => 'application/x-zmachine', 'z5' => 'application/x-zmachine', 'z6' => 'application/x-zmachine', 'z7' => 'application/x-zmachine', 'z8' => 'application/x-zmachine', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml', 'zsh' => 'text/x-scriptzsh', ]; /** * @var array * * @internal */ public const EXTENSIONS_FOR_MIME_TIMES = [ 'application/andrew-inset' => ['ez'], 'application/appinstaller' => ['appinstaller'], 'application/applixware' => ['aw'], 'application/appx' => ['appx'], 'application/appxbundle' => ['appxbundle'], 'application/atom+xml' => ['atom'], 'application/atomcat+xml' => ['atomcat'], 'application/atomdeleted+xml' => ['atomdeleted'], 'application/atomsvc+xml' => ['atomsvc'], 'application/atsc-dwd+xml' => ['dwd'], 'application/atsc-held+xml' => ['held'], 'application/atsc-rsat+xml' => ['rsat'], 'application/automationml-aml+xml' => ['aml'], 'application/automationml-amlx+zip' => ['amlx'], 'application/bdoc' => ['bdoc'], 'application/calendar+xml' => ['xcs'], 'application/ccxml+xml' => ['ccxml'], 'application/cdfx+xml' => ['cdfx'], 'application/cdmi-capability' => ['cdmia'], 'application/cdmi-container' => ['cdmic'], 'application/cdmi-domain' => ['cdmid'], 'application/cdmi-object' => ['cdmio'], 'application/cdmi-queue' => ['cdmiq'], 'application/cpl+xml' => ['cpl'], 'application/cu-seeme' => ['cu'], 'application/cwl' => ['cwl'], 'application/dash+xml' => ['mpd'], 'application/dash-patch+xml' => ['mpp'], 'application/davmount+xml' => ['davmount'], 'application/docbook+xml' => ['dbk'], 'application/dssc+der' => ['dssc'], 'application/dssc+xml' => ['xdssc'], 'application/ecmascript' => ['ecma'], 'application/emma+xml' => ['emma'], 'application/emotionml+xml' => ['emotionml'], 'application/epub+zip' => ['epub'], 'application/exi' => ['exi'], 'application/express' => ['exp'], 'application/fdf' => ['fdf'], 'application/fdt+xml' => ['fdt'], 'application/font-tdpfr' => ['pfr'], 'application/geo+json' => ['geojson'], 'application/gml+xml' => ['gml'], 'application/gpx+xml' => ['gpx'], 'application/gxf' => ['gxf'], 'application/gzip' => ['gz', 'gzip'], 'application/hjson' => ['hjson'], 'application/hyperstudio' => ['stk'], 'application/inkml+xml' => ['ink', 'inkml'], 'application/ipfix' => ['ipfix'], 'application/its+xml' => ['its'], 'application/java-archive' => ['jar', 'war', 'ear'], 'application/java-serialized-object' => ['ser'], 'application/java-vm' => ['class'], 'application/javascript' => ['js'], 'application/json' => ['json', 'map'], 'application/json5' => ['json5'], 'application/jsonml+json' => ['jsonml'], 'application/ld+json' => ['jsonld'], 'application/lgr+xml' => ['lgr'], 'application/lost+xml' => ['lostxml'], 'application/mac-binhex40' => ['hqx'], 'application/mac-compactpro' => ['cpt'], 'application/mads+xml' => ['mads'], 'application/manifest+json' => ['webmanifest'], 'application/marc' => ['mrc'], 'application/marcxml+xml' => ['mrcx'], 'application/mathematica' => ['ma', 'nb', 'mb'], 'application/mathml+xml' => ['mathml'], 'application/mbox' => ['mbox'], 'application/media-policy-dataset+xml' => ['mpf'], 'application/mediaservercontrol+xml' => ['mscml'], 'application/metalink+xml' => ['metalink'], 'application/metalink4+xml' => ['meta4'], 'application/mets+xml' => ['mets'], 'application/mmt-aei+xml' => ['maei'], 'application/mmt-usd+xml' => ['musd'], 'application/mods+xml' => ['mods'], 'application/mp21' => ['m21', 'mp21'], 'application/mp4' => ['mp4', 'mpg4', 'mp4s', 'm4p'], 'application/msix' => ['msix'], 'application/msixbundle' => ['msixbundle'], 'application/msword' => ['doc', 'dot', 'word'], 'application/mxf' => ['mxf'], 'application/n-quads' => ['nq'], 'application/n-triples' => ['nt'], 'application/node' => ['cjs'], 'application/octet-stream' => ['bin', 'dms', 'lrf', 'mar', 'so', 'dist', 'distz', 'pkg', 'bpk', 'dump', 'elc', 'deploy', 'exe', 'dll', 'deb', 'dmg', 'iso', 'img', 'msi', 'msp', 'msm', 'buffer', 'phar', 'lha', 'lzh', 'class', 'sea', 'dmn', 'bpmn', 'kdb', 'sst', 'csr', 'dst', 'pv', 'pxf'], 'application/oda' => ['oda'], 'application/oebps-package+xml' => ['opf'], 'application/ogg' => ['ogx'], 'application/omdoc+xml' => ['omdoc'], 'application/onenote' => ['onetoc', 'onetoc2', 'onetmp', 'onepkg'], 'application/oxps' => ['oxps'], 'application/p2p-overlay+xml' => ['relo'], 'application/patch-ops-error+xml' => ['xer'], 'application/pdf' => ['pdf', 'ai'], 'application/pgp-encrypted' => ['pgp'], 'application/pgp-keys' => ['asc'], 'application/pgp-signature' => ['sig', 'asc'], 'application/pics-rules' => ['prf'], 'application/pkcs10' => ['p10'], 'application/pkcs7-mime' => ['p7m', 'p7c'], 'application/pkcs7-signature' => ['p7s'], 'application/pkcs8' => ['p8'], 'application/pkix-attr-cert' => ['ac'], 'application/pkix-cert' => ['cer'], 'application/pkix-crl' => ['crl'], 'application/pkix-pkipath' => ['pkipath'], 'application/pkixcmp' => ['pki'], 'application/pls+xml' => ['pls'], 'application/postscript' => ['ai', 'eps', 'ps'], 'application/provenance+xml' => ['provx'], 'application/prs.cww' => ['cww'], 'application/prs.xsf+xml' => ['xsf'], 'application/pskc+xml' => ['pskcxml'], 'application/raml+yaml' => ['raml'], 'application/rdf+xml' => ['rdf', 'owl'], 'application/reginfo+xml' => ['rif'], 'application/relax-ng-compact-syntax' => ['rnc'], 'application/resource-lists+xml' => ['rl'], 'application/resource-lists-diff+xml' => ['rld'], 'application/rls-services+xml' => ['rs'], 'application/route-apd+xml' => ['rapd'], 'application/route-s-tsid+xml' => ['sls'], 'application/route-usd+xml' => ['rusd'], 'application/rpki-ghostbusters' => ['gbr'], 'application/rpki-manifest' => ['mft'], 'application/rpki-roa' => ['roa'], 'application/rsd+xml' => ['rsd'], 'application/rss+xml' => ['rss'], 'application/rtf' => ['rtf'], 'application/sbml+xml' => ['sbml'], 'application/scvp-cv-request' => ['scq'], 'application/scvp-cv-response' => ['scs'], 'application/scvp-vp-request' => ['spq'], 'application/scvp-vp-response' => ['spp'], 'application/sdp' => ['sdp'], 'application/senml+xml' => ['senmlx'], 'application/sensml+xml' => ['sensmlx'], 'application/set-payment-initiation' => ['setpay'], 'application/set-registration-initiation' => ['setreg'], 'application/shf+xml' => ['shf'], 'application/sieve' => ['siv', 'sieve'], 'application/smil+xml' => ['smi', 'smil'], 'application/sparql-query' => ['rq'], 'application/sparql-results+xml' => ['srx'], 'application/sql' => ['sql'], 'application/srgs' => ['gram'], 'application/srgs+xml' => ['grxml'], 'application/sru+xml' => ['sru'], 'application/ssdl+xml' => ['ssdl'], 'application/ssml+xml' => ['ssml'], 'application/swid+xml' => ['swidtag'], 'application/tei+xml' => ['tei', 'teicorpus'], 'application/thraud+xml' => ['tfi'], 'application/timestamped-data' => ['tsd'], 'application/toml' => ['toml'], 'application/trig' => ['trig'], 'application/ttml+xml' => ['ttml'], 'application/ubjson' => ['ubj'], 'application/urc-ressheet+xml' => ['rsheet'], 'application/urc-targetdesc+xml' => ['td'], 'application/vnd.1000minds.decision-model+xml' => ['1km'], 'application/vnd.3gpp.pic-bw-large' => ['plb'], 'application/vnd.3gpp.pic-bw-small' => ['psb'], 'application/vnd.3gpp.pic-bw-var' => ['pvb'], 'application/vnd.3gpp2.tcap' => ['tcap'], 'application/vnd.3m.post-it-notes' => ['pwn'], 'application/vnd.accpac.simply.aso' => ['aso'], 'application/vnd.accpac.simply.imp' => ['imp'], 'application/vnd.acucobol' => ['acu'], 'application/vnd.acucorp' => ['atc', 'acutc'], 'application/vnd.adobe.air-application-installer-package+zip' => ['air'], 'application/vnd.adobe.formscentral.fcdt' => ['fcdt'], 'application/vnd.adobe.fxp' => ['fxp', 'fxpl'], 'application/vnd.adobe.xdp+xml' => ['xdp'], 'application/vnd.adobe.xfdf' => ['xfdf'], 'application/vnd.age' => ['age'], 'application/vnd.ahead.space' => ['ahead'], 'application/vnd.airzip.filesecure.azf' => ['azf'], 'application/vnd.airzip.filesecure.azs' => ['azs'], 'application/vnd.amazon.ebook' => ['azw'], 'application/vnd.americandynamics.acc' => ['acc'], 'application/vnd.amiga.ami' => ['ami'], 'application/vnd.android.package-archive' => ['apk'], 'application/vnd.anser-web-certificate-issue-initiation' => ['cii'], 'application/vnd.anser-web-funds-transfer-initiation' => ['fti'], 'application/vnd.antix.game-component' => ['atx'], 'application/vnd.apple.installer+xml' => ['mpkg'], 'application/vnd.apple.keynote' => ['key'], 'application/vnd.apple.mpegurl' => ['m3u8'], 'application/vnd.apple.numbers' => ['numbers'], 'application/vnd.apple.pages' => ['pages'], 'application/vnd.apple.pkpass' => ['pkpass'], 'application/vnd.aristanetworks.swi' => ['swi'], 'application/vnd.astraea-software.iota' => ['iota'], 'application/vnd.audiograph' => ['aep'], 'application/vnd.balsamiq.bmml+xml' => ['bmml'], 'application/vnd.blueice.multipass' => ['mpm'], 'application/vnd.bmi' => ['bmi'], 'application/vnd.businessobjects' => ['rep'], 'application/vnd.chemdraw+xml' => ['cdxml'], 'application/vnd.chipnuts.karaoke-mmd' => ['mmd'], 'application/vnd.cinderella' => ['cdy'], 'application/vnd.citationstyles.style+xml' => ['csl'], 'application/vnd.claymore' => ['cla'], 'application/vnd.cloanto.rp9' => ['rp9'], 'application/vnd.clonk.c4group' => ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'], 'application/vnd.cluetrust.cartomobile-config' => ['c11amc'], 'application/vnd.cluetrust.cartomobile-config-pkg' => ['c11amz'], 'application/vnd.commonspace' => ['csp'], 'application/vnd.contact.cmsg' => ['cdbcmsg'], 'application/vnd.cosmocaller' => ['cmc'], 'application/vnd.crick.clicker' => ['clkx'], 'application/vnd.crick.clicker.keyboard' => ['clkk'], 'application/vnd.crick.clicker.palette' => ['clkp'], 'application/vnd.crick.clicker.template' => ['clkt'], 'application/vnd.crick.clicker.wordbank' => ['clkw'], 'application/vnd.criticaltools.wbs+xml' => ['wbs'], 'application/vnd.ctc-posml' => ['pml'], 'application/vnd.cups-ppd' => ['ppd'], 'application/vnd.curl.car' => ['car'], 'application/vnd.curl.pcurl' => ['pcurl'], 'application/vnd.dart' => ['dart'], 'application/vnd.data-vision.rdz' => ['rdz'], 'application/vnd.dbf' => ['dbf'], 'application/vnd.dece.data' => ['uvf', 'uvvf', 'uvd', 'uvvd'], 'application/vnd.dece.ttml+xml' => ['uvt', 'uvvt'], 'application/vnd.dece.unspecified' => ['uvx', 'uvvx'], 'application/vnd.dece.zip' => ['uvz', 'uvvz'], 'application/vnd.denovo.fcselayout-link' => ['fe_launch'], 'application/vnd.dna' => ['dna'], 'application/vnd.dolby.mlp' => ['mlp'], 'application/vnd.dpgraph' => ['dpg'], 'application/vnd.dreamfactory' => ['dfac'], 'application/vnd.ds-keypoint' => ['kpxx'], 'application/vnd.dvb.ait' => ['ait'], 'application/vnd.dvb.service' => ['svc'], 'application/vnd.dynageo' => ['geo'], 'application/vnd.ecowin.chart' => ['mag'], 'application/vnd.enliven' => ['nml'], 'application/vnd.epson.esf' => ['esf'], 'application/vnd.epson.msf' => ['msf'], 'application/vnd.epson.quickanime' => ['qam'], 'application/vnd.epson.salt' => ['slt'], 'application/vnd.epson.ssf' => ['ssf'], 'application/vnd.eszigno3+xml' => ['es3', 'et3'], 'application/vnd.ezpix-album' => ['ez2'], 'application/vnd.ezpix-package' => ['ez3'], 'application/vnd.fdf' => ['fdf'], 'application/vnd.fdsn.mseed' => ['mseed'], 'application/vnd.fdsn.seed' => ['seed', 'dataless'], 'application/vnd.flographit' => ['gph'], 'application/vnd.fluxtime.clip' => ['ftc'], 'application/vnd.framemaker' => ['fm', 'frame', 'maker', 'book'], 'application/vnd.frogans.fnc' => ['fnc'], 'application/vnd.frogans.ltf' => ['ltf'], 'application/vnd.fsc.weblaunch' => ['fsc'], 'application/vnd.fujitsu.oasys' => ['oas'], 'application/vnd.fujitsu.oasys2' => ['oa2'], 'application/vnd.fujitsu.oasys3' => ['oa3'], 'application/vnd.fujitsu.oasysgp' => ['fg5'], 'application/vnd.fujitsu.oasysprs' => ['bh2'], 'application/vnd.fujixerox.ddd' => ['ddd'], 'application/vnd.fujixerox.docuworks' => ['xdw'], 'application/vnd.fujixerox.docuworks.binder' => ['xbd'], 'application/vnd.fuzzysheet' => ['fzs'], 'application/vnd.genomatix.tuxedo' => ['txd'], 'application/vnd.geogebra.file' => ['ggb'], 'application/vnd.geogebra.slides' => ['ggs'], 'application/vnd.geogebra.tool' => ['ggt'], 'application/vnd.geometry-explorer' => ['gex', 'gre'], 'application/vnd.geonext' => ['gxt'], 'application/vnd.geoplan' => ['g2w'], 'application/vnd.geospace' => ['g3w'], 'application/vnd.gmx' => ['gmx'], 'application/vnd.google-apps.document' => ['gdoc'], 'application/vnd.google-apps.presentation' => ['gslides'], 'application/vnd.google-apps.spreadsheet' => ['gsheet'], 'application/vnd.google-earth.kml+xml' => ['kml'], 'application/vnd.google-earth.kmz' => ['kmz'], 'application/vnd.gov.sk.xmldatacontainer+xml' => ['xdcf'], 'application/vnd.grafeq' => ['gqf', 'gqs'], 'application/vnd.groove-account' => ['gac'], 'application/vnd.groove-help' => ['ghf'], 'application/vnd.groove-identity-message' => ['gim'], 'application/vnd.groove-injector' => ['grv'], 'application/vnd.groove-tool-message' => ['gtm'], 'application/vnd.groove-tool-template' => ['tpl'], 'application/vnd.groove-vcard' => ['vcg'], 'application/vnd.hal+xml' => ['hal'], 'application/vnd.handheld-entertainment+xml' => ['zmm'], 'application/vnd.hbci' => ['hbci'], 'application/vnd.hhe.lesson-player' => ['les'], 'application/vnd.hp-hpgl' => ['hpgl'], 'application/vnd.hp-hpid' => ['hpid'], 'application/vnd.hp-hps' => ['hps'], 'application/vnd.hp-jlyt' => ['jlt'], 'application/vnd.hp-pcl' => ['pcl'], 'application/vnd.hp-pclxl' => ['pclxl'], 'application/vnd.hydrostatix.sof-data' => ['sfd-hdstx'], 'application/vnd.ibm.minipay' => ['mpy'], 'application/vnd.ibm.modcap' => ['afp', 'listafp', 'list3820'], 'application/vnd.ibm.rights-management' => ['irm'], 'application/vnd.ibm.secure-container' => ['sc'], 'application/vnd.iccprofile' => ['icc', 'icm'], 'application/vnd.igloader' => ['igl'], 'application/vnd.immervision-ivp' => ['ivp'], 'application/vnd.immervision-ivu' => ['ivu'], 'application/vnd.insors.igm' => ['igm'], 'application/vnd.intercon.formnet' => ['xpw', 'xpx'], 'application/vnd.intergeo' => ['i2g'], 'application/vnd.intu.qbo' => ['qbo'], 'application/vnd.intu.qfx' => ['qfx'], 'application/vnd.ipunplugged.rcprofile' => ['rcprofile'], 'application/vnd.irepository.package+xml' => ['irp'], 'application/vnd.is-xpr' => ['xpr'], 'application/vnd.isac.fcs' => ['fcs'], 'application/vnd.jam' => ['jam'], 'application/vnd.jcp.javame.midlet-rms' => ['rms'], 'application/vnd.jisp' => ['jisp'], 'application/vnd.joost.joda-archive' => ['joda'], 'application/vnd.kahootz' => ['ktz', 'ktr'], 'application/vnd.kde.karbon' => ['karbon'], 'application/vnd.kde.kchart' => ['chrt'], 'application/vnd.kde.kformula' => ['kfo'], 'application/vnd.kde.kivio' => ['flw'], 'application/vnd.kde.kontour' => ['kon'], 'application/vnd.kde.kpresenter' => ['kpr', 'kpt'], 'application/vnd.kde.kspread' => ['ksp'], 'application/vnd.kde.kword' => ['kwd', 'kwt'], 'application/vnd.kenameaapp' => ['htke'], 'application/vnd.kidspiration' => ['kia'], 'application/vnd.kinar' => ['kne', 'knp'], 'application/vnd.koan' => ['skp', 'skd', 'skt', 'skm'], 'application/vnd.kodak-descriptor' => ['sse'], 'application/vnd.las.las+xml' => ['lasxml'], 'application/vnd.llamagraphics.life-balance.desktop' => ['lbd'], 'application/vnd.llamagraphics.life-balance.exchange+xml' => ['lbe'], 'application/vnd.lotus-1-2-3' => ['123'], 'application/vnd.lotus-approach' => ['apr'], 'application/vnd.lotus-freelance' => ['pre'], 'application/vnd.lotus-notes' => ['nsf'], 'application/vnd.lotus-organizer' => ['org'], 'application/vnd.lotus-screencam' => ['scm'], 'application/vnd.lotus-wordpro' => ['lwp'], 'application/vnd.macports.portpkg' => ['portpkg'], 'application/vnd.mapbox-vector-tile' => ['mvt'], 'application/vnd.mcd' => ['mcd'], 'application/vnd.medcalcdata' => ['mc1'], 'application/vnd.mediastation.cdkey' => ['cdkey'], 'application/vnd.mfer' => ['mwf'], 'application/vnd.mfmp' => ['mfm'], 'application/vnd.micrografx.flo' => ['flo'], 'application/vnd.micrografx.igx' => ['igx'], 'application/vnd.mif' => ['mif'], 'application/vnd.mobius.daf' => ['daf'], 'application/vnd.mobius.dis' => ['dis'], 'application/vnd.mobius.mbk' => ['mbk'], 'application/vnd.mobius.mqy' => ['mqy'], 'application/vnd.mobius.msl' => ['msl'], 'application/vnd.mobius.plc' => ['plc'], 'application/vnd.mobius.txf' => ['txf'], 'application/vnd.mophun.application' => ['mpn'], 'application/vnd.mophun.certificate' => ['mpc'], 'application/vnd.mozilla.xul+xml' => ['xul'], 'application/vnd.ms-artgalry' => ['cil'], 'application/vnd.ms-cab-compressed' => ['cab'], 'application/vnd.ms-excel' => ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'], 'application/vnd.ms-excel.addin.macroenabled.12' => ['xlam'], 'application/vnd.ms-excel.sheet.binary.macroenabled.12' => ['xlsb'], 'application/vnd.ms-excel.sheet.macroenabled.12' => ['xlsm'], 'application/vnd.ms-excel.template.macroenabled.12' => ['xltm'], 'application/vnd.ms-fontobject' => ['eot'], 'application/vnd.ms-htmlhelp' => ['chm'], 'application/vnd.ms-ims' => ['ims'], 'application/vnd.ms-lrm' => ['lrm'], 'application/vnd.ms-officetheme' => ['thmx'], 'application/vnd.ms-outlook' => ['msg'], 'application/vnd.ms-pki.seccat' => ['cat'], 'application/vnd.ms-pki.stl' => ['stl'], 'application/vnd.ms-powerpoint' => ['ppt', 'pps', 'pot', 'ppa'], 'application/vnd.ms-powerpoint.addin.macroenabled.12' => ['ppam'], 'application/vnd.ms-powerpoint.presentation.macroenabled.12' => ['pptm'], 'application/vnd.ms-powerpoint.slide.macroenabled.12' => ['sldm'], 'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => ['ppsm'], 'application/vnd.ms-powerpoint.template.macroenabled.12' => ['potm'], 'application/vnd.ms-project' => ['mpp', 'mpt'], 'application/vnd.ms-word.document.macroenabled.12' => ['docm'], 'application/vnd.ms-word.template.macroenabled.12' => ['dotm'], 'application/vnd.ms-works' => ['wps', 'wks', 'wcm', 'wdb'], 'application/vnd.ms-wpl' => ['wpl'], 'application/vnd.ms-xpsdocument' => ['xps'], 'application/vnd.mseq' => ['mseq'], 'application/vnd.musician' => ['mus'], 'application/vnd.muvee.style' => ['msty'], 'application/vnd.mynfc' => ['taglet'], 'application/vnd.nato.bindingdataobject+xml' => ['bdo'], 'application/vnd.neurolanguage.nlu' => ['nlu'], 'application/vnd.nitf' => ['ntf', 'nitf'], 'application/vnd.noblenet-directory' => ['nnd'], 'application/vnd.noblenet-sealer' => ['nns'], 'application/vnd.noblenet-web' => ['nnw'], 'application/vnd.nokia.n-gage.ac+xml' => ['ac'], 'application/vnd.nokia.n-gage.data' => ['ngdat'], 'application/vnd.nokia.n-gage.symbian.install' => ['n-gage'], 'application/vnd.nokia.radio-preset' => ['rpst'], 'application/vnd.nokia.radio-presets' => ['rpss'], 'application/vnd.novadigm.edm' => ['edm'], 'application/vnd.novadigm.edx' => ['edx'], 'application/vnd.novadigm.ext' => ['ext'], 'application/vnd.oasis.opendocument.chart' => ['odc'], 'application/vnd.oasis.opendocument.chart-template' => ['otc'], 'application/vnd.oasis.opendocument.database' => ['odb'], 'application/vnd.oasis.opendocument.formula' => ['odf'], 'application/vnd.oasis.opendocument.formula-template' => ['odft'], 'application/vnd.oasis.opendocument.graphics' => ['odg'], 'application/vnd.oasis.opendocument.graphics-template' => ['otg'], 'application/vnd.oasis.opendocument.image' => ['odi'], 'application/vnd.oasis.opendocument.image-template' => ['oti'], 'application/vnd.oasis.opendocument.presentation' => ['odp'], 'application/vnd.oasis.opendocument.presentation-template' => ['otp'], 'application/vnd.oasis.opendocument.spreadsheet' => ['ods'], 'application/vnd.oasis.opendocument.spreadsheet-template' => ['ots'], 'application/vnd.oasis.opendocument.text' => ['odt'], 'application/vnd.oasis.opendocument.text-master' => ['odm'], 'application/vnd.oasis.opendocument.text-template' => ['ott'], 'application/vnd.oasis.opendocument.text-web' => ['oth'], 'application/vnd.olpc-sugar' => ['xo'], 'application/vnd.oma.dd2+xml' => ['dd2'], 'application/vnd.openblox.game+xml' => ['obgx'], 'application/vnd.openofficeorg.extension' => ['oxt'], 'application/vnd.openstreetmap.data+xml' => ['osm'], 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => ['pptx'], 'application/vnd.openxmlformats-officedocument.presentationml.slide' => ['sldx'], 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => ['ppsx'], 'application/vnd.openxmlformats-officedocument.presentationml.template' => ['potx'], 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => ['xlsx'], 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => ['xltx'], 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => ['docx'], 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => ['dotx'], 'application/vnd.osgeo.mapguide.package' => ['mgp'], 'application/vnd.osgi.dp' => ['dp'], 'application/vnd.osgi.subsystem' => ['esa'], 'application/vnd.palm' => ['pdb', 'pqa', 'oprc'], 'application/vnd.pawaafile' => ['paw'], 'application/vnd.pg.format' => ['str'], 'application/vnd.pg.osasli' => ['ei6'], 'application/vnd.picsel' => ['efif'], 'application/vnd.pmi.widget' => ['wg'], 'application/vnd.pocketlearn' => ['plf'], 'application/vnd.powerbuilder6' => ['pbd'], 'application/vnd.previewsystems.box' => ['box'], 'application/vnd.proteus.magazine' => ['mgz'], 'application/vnd.publishare-delta-tree' => ['qps'], 'application/vnd.pvi.ptid1' => ['ptid'], 'application/vnd.pwg-xhtml-print+xml' => ['xhtm'], 'application/vnd.quark.quarkxpress' => ['qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb'], 'application/vnd.rar' => ['rar'], 'application/vnd.realvnc.bed' => ['bed'], 'application/vnd.recordare.musicxml' => ['mxl'], 'application/vnd.recordare.musicxml+xml' => ['musicxml'], 'application/vnd.rig.cryptonote' => ['cryptonote'], 'application/vnd.rim.cod' => ['cod'], 'application/vnd.rn-realmedia' => ['rm'], 'application/vnd.rn-realmedia-vbr' => ['rmvb'], 'application/vnd.route66.link66+xml' => ['link66'], 'application/vnd.sailingtracker.track' => ['st'], 'application/vnd.seemail' => ['see'], 'application/vnd.sema' => ['sema'], 'application/vnd.semd' => ['semd'], 'application/vnd.semf' => ['semf'], 'application/vnd.shana.informed.formdata' => ['ifm'], 'application/vnd.shana.informed.formtemplate' => ['itp'], 'application/vnd.shana.informed.interchange' => ['iif'], 'application/vnd.shana.informed.package' => ['ipk'], 'application/vnd.simtech-mindmapper' => ['twd', 'twds'], 'application/vnd.smaf' => ['mmf'], 'application/vnd.smart.teacher' => ['teacher'], 'application/vnd.software602.filler.form+xml' => ['fo'], 'application/vnd.solent.sdkm+xml' => ['sdkm', 'sdkd'], 'application/vnd.spotfire.dxp' => ['dxp'], 'application/vnd.spotfire.sfs' => ['sfs'], 'application/vnd.stardivision.calc' => ['sdc'], 'application/vnd.stardivision.draw' => ['sda'], 'application/vnd.stardivision.impress' => ['sdd'], 'application/vnd.stardivision.math' => ['smf'], 'application/vnd.stardivision.writer' => ['sdw', 'vor'], 'application/vnd.stardivision.writer-global' => ['sgl'], 'application/vnd.stepmania.package' => ['smzip'], 'application/vnd.stepmania.stepchart' => ['sm'], 'application/vnd.sun.wadl+xml' => ['wadl'], 'application/vnd.sun.xml.calc' => ['sxc'], 'application/vnd.sun.xml.calc.template' => ['stc'], 'application/vnd.sun.xml.draw' => ['sxd'], 'application/vnd.sun.xml.draw.template' => ['std'], 'application/vnd.sun.xml.impress' => ['sxi'], 'application/vnd.sun.xml.impress.template' => ['sti'], 'application/vnd.sun.xml.math' => ['sxm'], 'application/vnd.sun.xml.writer' => ['sxw'], 'application/vnd.sun.xml.writer.global' => ['sxg'], 'application/vnd.sun.xml.writer.template' => ['stw'], 'application/vnd.sus-calendar' => ['sus', 'susp'], 'application/vnd.svd' => ['svd'], 'application/vnd.symbian.install' => ['sis', 'sisx'], 'application/vnd.syncml+xml' => ['xsm'], 'application/vnd.syncml.dm+wbxml' => ['bdm'], 'application/vnd.syncml.dm+xml' => ['xdm'], 'application/vnd.syncml.dmddf+xml' => ['ddf'], 'application/vnd.tao.intent-module-archive' => ['tao'], 'application/vnd.tcpdump.pcap' => ['pcap', 'cap', 'dmp'], 'application/vnd.tmobile-livetv' => ['tmo'], 'application/vnd.trid.tpt' => ['tpt'], 'application/vnd.triscape.mxs' => ['mxs'], 'application/vnd.trueapp' => ['tra'], 'application/vnd.ufdl' => ['ufd', 'ufdl'], 'application/vnd.uiq.theme' => ['utz'], 'application/vnd.umajin' => ['umj'], 'application/vnd.unity' => ['unityweb'], 'application/vnd.uoml+xml' => ['uoml', 'uo'], 'application/vnd.vcx' => ['vcx'], 'application/vnd.visio' => ['vsd', 'vst', 'vss', 'vsw'], 'application/vnd.visionary' => ['vis'], 'application/vnd.vsf' => ['vsf'], 'application/vnd.wap.wbxml' => ['wbxml'], 'application/vnd.wap.wmlc' => ['wmlc'], 'application/vnd.wap.wmlscriptc' => ['wmlsc'], 'application/vnd.webturbo' => ['wtb'], 'application/vnd.wolfram.player' => ['nbp'], 'application/vnd.wordperfect' => ['wpd'], 'application/vnd.wqd' => ['wqd'], 'application/vnd.wt.stf' => ['stf'], 'application/vnd.xara' => ['xar'], 'application/vnd.xfdl' => ['xfdl'], 'application/vnd.yamaha.hv-dic' => ['hvd'], 'application/vnd.yamaha.hv-script' => ['hvs'], 'application/vnd.yamaha.hv-voice' => ['hvp'], 'application/vnd.yamaha.openscoreformat' => ['osf'], 'application/vnd.yamaha.openscoreformat.osfpvg+xml' => ['osfpvg'], 'application/vnd.yamaha.smaf-audio' => ['saf'], 'application/vnd.yamaha.smaf-phrase' => ['spf'], 'application/vnd.yellowriver-custom-menu' => ['cmp'], 'application/vnd.zul' => ['zir', 'zirz'], 'application/vnd.zzazz.deck+xml' => ['zaz'], 'application/voicexml+xml' => ['vxml'], 'application/wasm' => ['wasm'], 'application/watcherinfo+xml' => ['wif'], 'application/widget' => ['wgt'], 'application/winhlp' => ['hlp'], 'application/wsdl+xml' => ['wsdl'], 'application/wspolicy+xml' => ['wspolicy'], 'application/x-7z-compressed' => ['7z', '7zip'], 'application/x-abiword' => ['abw'], 'application/x-ace-compressed' => ['ace'], 'application/x-apple-diskimage' => ['dmg'], 'application/x-arj' => ['arj'], 'application/x-authorware-bin' => ['aab', 'x32', 'u32', 'vox'], 'application/x-authorware-map' => ['aam'], 'application/x-authorware-seg' => ['aas'], 'application/x-bcpio' => ['bcpio'], 'application/x-bdoc' => ['bdoc'], 'application/x-bittorrent' => ['torrent'], 'application/x-blorb' => ['blb', 'blorb'], 'application/x-bzip' => ['bz'], 'application/x-bzip2' => ['bz2', 'boz'], 'application/x-cbr' => ['cbr', 'cba', 'cbt', 'cbz', 'cb7'], 'application/x-cdlink' => ['vcd'], 'application/x-cfs-compressed' => ['cfs'], 'application/x-chat' => ['chat'], 'application/x-chess-pgn' => ['pgn'], 'application/x-chrome-extension' => ['crx'], 'application/x-cocoa' => ['cco'], 'application/x-conference' => ['nsc'], 'application/x-cpio' => ['cpio'], 'application/x-csh' => ['csh'], 'application/x-debian-package' => ['deb', 'udeb'], 'application/x-dgc-compressed' => ['dgc'], 'application/x-director' => ['dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa'], 'application/x-doom' => ['wad'], 'application/x-dtbncx+xml' => ['ncx'], 'application/x-dtbook+xml' => ['dtb'], 'application/x-dtbresource+xml' => ['res'], 'application/x-dvi' => ['dvi'], 'application/x-envoy' => ['evy'], 'application/x-eva' => ['eva'], 'application/x-font-bdf' => ['bdf'], 'application/x-font-ghostscript' => ['gsf'], 'application/x-font-linux-psf' => ['psf'], 'application/x-font-pcf' => ['pcf'], 'application/x-font-snf' => ['snf'], 'application/x-font-type1' => ['pfa', 'pfb', 'pfm', 'afm'], 'application/x-freearc' => ['arc'], 'application/x-futuresplash' => ['spl'], 'application/x-gca-compressed' => ['gca'], 'application/x-glulx' => ['ulx'], 'application/x-gnumeric' => ['gnumeric'], 'application/x-gramps-xml' => ['gramps'], 'application/x-gtar' => ['gtar'], 'application/x-hdf' => ['hdf'], 'application/x-httpd-php' => ['php', 'php4', 'php3', 'phtml'], 'application/x-install-instructions' => ['install'], 'application/x-iso9660-image' => ['iso'], 'application/x-iwork-keynote-sffkey' => ['key'], 'application/x-iwork-numbers-sffnumbers' => ['numbers'], 'application/x-iwork-pages-sffpages' => ['pages'], 'application/x-java-archive-diff' => ['jardiff'], 'application/x-java-jnlp-file' => ['jnlp'], 'application/x-keepass2' => ['kdbx'], 'application/x-latex' => ['latex'], 'application/x-lua-bytecode' => ['luac'], 'application/x-lzh-compressed' => ['lzh', 'lha'], 'application/x-makeself' => ['run'], 'application/x-mie' => ['mie'], 'application/x-mobipocket-ebook' => ['prc', 'mobi'], 'application/x-ms-application' => ['application'], 'application/x-ms-shortcut' => ['lnk'], 'application/x-ms-wmd' => ['wmd'], 'application/x-ms-wmz' => ['wmz'], 'application/x-ms-xbap' => ['xbap'], 'application/x-msaccess' => ['mdb'], 'application/x-msbinder' => ['obd'], 'application/x-mscardfile' => ['crd'], 'application/x-msclip' => ['clp'], 'application/x-msdos-program' => ['exe'], 'application/x-msdownload' => ['exe', 'dll', 'com', 'bat', 'msi'], 'application/x-msmediaview' => ['mvb', 'm13', 'm14'], 'application/x-msmetafile' => ['wmf', 'wmz', 'emf', 'emz'], 'application/x-msmoney' => ['mny'], 'application/x-mspublisher' => ['pub'], 'application/x-msschedule' => ['scd'], 'application/x-msterminal' => ['trm'], 'application/x-mswrite' => ['wri'], 'application/x-netcdf' => ['nc', 'cdf'], 'application/x-ns-proxy-autoconfig' => ['pac'], 'application/x-nzb' => ['nzb'], 'application/x-perl' => ['pl', 'pm'], 'application/x-pilot' => ['prc', 'pdb'], 'application/x-pkcs12' => ['p12', 'pfx'], 'application/x-pkcs7-certificates' => ['p7b', 'spc'], 'application/x-pkcs7-certreqresp' => ['p7r'], 'application/x-rar-compressed' => ['rar'], 'application/x-redhat-package-manager' => ['rpm'], 'application/x-research-info-systems' => ['ris'], 'application/x-sea' => ['sea'], 'application/x-sh' => ['sh'], 'application/x-shar' => ['shar'], 'application/x-shockwave-flash' => ['swf'], 'application/x-silverlight-app' => ['xap'], 'application/x-sql' => ['sql'], 'application/x-stuffit' => ['sit'], 'application/x-stuffitx' => ['sitx'], 'application/x-subrip' => ['srt'], 'application/x-sv4cpio' => ['sv4cpio'], 'application/x-sv4crc' => ['sv4crc'], 'application/x-t3vm-image' => ['t3'], 'application/x-tads' => ['gam'], 'application/x-tar' => ['tar', 'tgz'], 'application/x-tcl' => ['tcl', 'tk'], 'application/x-tex' => ['tex'], 'application/x-tex-tfm' => ['tfm'], 'application/x-texinfo' => ['texinfo', 'texi'], 'application/x-tgif' => ['obj'], 'application/x-ustar' => ['ustar'], 'application/x-virtualbox-hdd' => ['hdd'], 'application/x-virtualbox-ova' => ['ova'], 'application/x-virtualbox-ovf' => ['ovf'], 'application/x-virtualbox-vbox' => ['vbox'], 'application/x-virtualbox-vbox-extpack' => ['vbox-extpack'], 'application/x-virtualbox-vdi' => ['vdi'], 'application/x-virtualbox-vhd' => ['vhd'], 'application/x-virtualbox-vmdk' => ['vmdk'], 'application/x-wais-source' => ['src'], 'application/x-web-app-manifest+json' => ['webapp'], 'application/x-x509-ca-cert' => ['der', 'crt', 'pem'], 'application/x-xfig' => ['fig'], 'application/x-xliff+xml' => ['xlf'], 'application/x-xpinstall' => ['xpi'], 'application/x-xz' => ['xz'], 'application/x-zmachine' => ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'], 'application/xaml+xml' => ['xaml'], 'application/xcap-att+xml' => ['xav'], 'application/xcap-caps+xml' => ['xca'], 'application/xcap-diff+xml' => ['xdf'], 'application/xcap-el+xml' => ['xel'], 'application/xcap-ns+xml' => ['xns'], 'application/xenc+xml' => ['xenc'], 'application/xfdf' => ['xfdf'], 'application/xhtml+xml' => ['xhtml', 'xht'], 'application/xliff+xml' => ['xlf'], 'application/xml' => ['xml', 'xsl', 'xsd', 'rng'], 'application/xml-dtd' => ['dtd'], 'application/xop+xml' => ['xop'], 'application/xproc+xml' => ['xpl'], 'application/xslt+xml' => ['xsl', 'xslt'], 'application/xspf+xml' => ['xspf'], 'application/xv+xml' => ['mxml', 'xhvml', 'xvml', 'xvm'], 'application/yang' => ['yang'], 'application/yin+xml' => ['yin'], 'application/zip' => ['zip'], 'audio/3gpp' => ['3gpp'], 'audio/aac' => ['adts', 'aac'], 'audio/adpcm' => ['adp'], 'audio/amr' => ['amr'], 'audio/basic' => ['au', 'snd'], 'audio/midi' => ['mid', 'midi', 'kar', 'rmi'], 'audio/mobile-xmf' => ['mxmf'], 'audio/mp3' => ['mp3'], 'audio/mp4' => ['m4a', 'mp4a'], 'audio/mpeg' => ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'], 'audio/ogg' => ['oga', 'ogg', 'spx', 'opus'], 'audio/s3m' => ['s3m'], 'audio/silk' => ['sil'], 'audio/vnd.dece.audio' => ['uva', 'uvva'], 'audio/vnd.digital-winds' => ['eol'], 'audio/vnd.dra' => ['dra'], 'audio/vnd.dts' => ['dts'], 'audio/vnd.dts.hd' => ['dtshd'], 'audio/vnd.lucent.voice' => ['lvp'], 'audio/vnd.ms-playready.media.pya' => ['pya'], 'audio/vnd.nuera.ecelp4800' => ['ecelp4800'], 'audio/vnd.nuera.ecelp7470' => ['ecelp7470'], 'audio/vnd.nuera.ecelp9600' => ['ecelp9600'], 'audio/vnd.rip' => ['rip'], 'audio/wav' => ['wav'], 'audio/wave' => ['wav'], 'audio/webm' => ['weba'], 'audio/x-aac' => ['aac'], 'audio/x-aiff' => ['aif', 'aiff', 'aifc'], 'audio/x-caf' => ['caf'], 'audio/x-flac' => ['flac'], 'audio/x-m4a' => ['m4a'], 'audio/x-matroska' => ['mka'], 'audio/x-mpegurl' => ['m3u'], 'audio/x-ms-wax' => ['wax'], 'audio/x-ms-wma' => ['wma'], 'audio/x-pn-realaudio' => ['ram', 'ra', 'rm'], 'audio/x-pn-realaudio-plugin' => ['rmp', 'rpm'], 'audio/x-realaudio' => ['ra'], 'audio/x-wav' => ['wav'], 'audio/xm' => ['xm'], 'chemical/x-cdx' => ['cdx'], 'chemical/x-cif' => ['cif'], 'chemical/x-cmdf' => ['cmdf'], 'chemical/x-cml' => ['cml'], 'chemical/x-csml' => ['csml'], 'chemical/x-xyz' => ['xyz'], 'font/collection' => ['ttc'], 'font/otf' => ['otf'], 'font/ttf' => ['ttf'], 'font/woff' => ['woff'], 'font/woff2' => ['woff2'], 'image/aces' => ['exr'], 'image/apng' => ['apng'], 'image/avci' => ['avci'], 'image/avcs' => ['avcs'], 'image/avif' => ['avif'], 'image/bmp' => ['bmp', 'dib'], 'image/cgm' => ['cgm'], 'image/dicom-rle' => ['drle'], 'image/dpx' => ['dpx'], 'image/emf' => ['emf'], 'image/fits' => ['fits'], 'image/g3fax' => ['g3'], 'image/gif' => ['gif'], 'image/heic' => ['heic'], 'image/heic-sequence' => ['heics'], 'image/heif' => ['heif'], 'image/heif-sequence' => ['heifs'], 'image/hej2k' => ['hej2'], 'image/hsj2' => ['hsj2'], 'image/ief' => ['ief'], 'image/jls' => ['jls'], 'image/jp2' => ['jp2', 'jpg2'], 'image/jpeg' => ['jpeg', 'jpg', 'jpe'], 'image/jph' => ['jph'], 'image/jphc' => ['jhc'], 'image/jpm' => ['jpm', 'jpgm'], 'image/jpx' => ['jpx', 'jpf'], 'image/jxl' => ['jxl'], 'image/jxr' => ['jxr'], 'image/jxra' => ['jxra'], 'image/jxrs' => ['jxrs'], 'image/jxs' => ['jxs'], 'image/jxsc' => ['jxsc'], 'image/jxsi' => ['jxsi'], 'image/jxss' => ['jxss'], 'image/ktx' => ['ktx'], 'image/ktx2' => ['ktx2'], 'image/png' => ['png'], 'image/prs.btif' => ['btif', 'btf'], 'image/prs.pti' => ['pti'], 'image/sgi' => ['sgi'], 'image/svg+xml' => ['svg', 'svgz'], 'image/t38' => ['t38'], 'image/tiff' => ['tif', 'tiff'], 'image/tiff-fx' => ['tfx'], 'image/vnd.adobe.photoshop' => ['psd'], 'image/vnd.airzip.accelerator.azv' => ['azv'], 'image/vnd.dece.graphic' => ['uvi', 'uvvi', 'uvg', 'uvvg'], 'image/vnd.djvu' => ['djvu', 'djv'], 'image/vnd.dvb.subtitle' => ['sub'], 'image/vnd.dwg' => ['dwg'], 'image/vnd.dxf' => ['dxf'], 'image/vnd.fastbidsheet' => ['fbs'], 'image/vnd.fpx' => ['fpx'], 'image/vnd.fst' => ['fst'], 'image/vnd.fujixerox.edmics-mmr' => ['mmr'], 'image/vnd.fujixerox.edmics-rlc' => ['rlc'], 'image/vnd.microsoft.icon' => ['ico'], 'image/vnd.ms-dds' => ['dds'], 'image/vnd.ms-modi' => ['mdi'], 'image/vnd.ms-photo' => ['wdp'], 'image/vnd.net-fpx' => ['npx'], 'image/vnd.pco.b16' => ['b16'], 'image/vnd.tencent.tap' => ['tap'], 'image/vnd.valve.source.texture' => ['vtf'], 'image/vnd.wap.wbmp' => ['wbmp'], 'image/vnd.xiff' => ['xif'], 'image/vnd.zbrush.pcx' => ['pcx'], 'image/webp' => ['webp'], 'image/wmf' => ['wmf'], 'image/x-3ds' => ['3ds'], 'image/x-cmu-raster' => ['ras'], 'image/x-cmx' => ['cmx'], 'image/x-freehand' => ['fh', 'fhc', 'fh4', 'fh5', 'fh7'], 'image/x-icon' => ['ico'], 'image/x-jng' => ['jng'], 'image/x-mrsid-image' => ['sid'], 'image/x-ms-bmp' => ['bmp'], 'image/x-pcx' => ['pcx'], 'image/x-pict' => ['pic', 'pct'], 'image/x-portable-anymap' => ['pnm'], 'image/x-portable-bitmap' => ['pbm'], 'image/x-portable-graymap' => ['pgm'], 'image/x-portable-pixmap' => ['ppm'], 'image/x-rgb' => ['rgb'], 'image/x-tga' => ['tga'], 'image/x-xbitmap' => ['xbm'], 'image/x-xpixmap' => ['xpm'], 'image/x-xwindowdump' => ['xwd'], 'message/disposition-notification' => ['disposition-notification'], 'message/global' => ['u8msg'], 'message/global-delivery-status' => ['u8dsn'], 'message/global-disposition-notification' => ['u8mdn'], 'message/global-headers' => ['u8hdr'], 'message/rfc822' => ['eml', 'mime'], 'message/vnd.wfa.wsc' => ['wsc'], 'model/3mf' => ['3mf'], 'model/gltf+json' => ['gltf'], 'model/gltf-binary' => ['glb'], 'model/iges' => ['igs', 'iges'], 'model/jt' => ['jt'], 'model/mesh' => ['msh', 'mesh', 'silo'], 'model/mtl' => ['mtl'], 'model/obj' => ['obj'], 'model/prc' => ['prc'], 'model/step+xml' => ['stpx'], 'model/step+zip' => ['stpz'], 'model/step-xml+zip' => ['stpxz'], 'model/stl' => ['stl'], 'model/u3d' => ['u3d'], 'model/vnd.bary' => ['bary'], 'model/vnd.cld' => ['cld'], 'model/vnd.collada+xml' => ['dae'], 'model/vnd.dwf' => ['dwf'], 'model/vnd.gdl' => ['gdl'], 'model/vnd.gtw' => ['gtw'], 'model/vnd.mts' => ['mts'], 'model/vnd.opengex' => ['ogex'], 'model/vnd.parasolid.transmit.binary' => ['x_b'], 'model/vnd.parasolid.transmit.text' => ['x_t'], 'model/vnd.pytha.pyox' => ['pyo', 'pyox'], 'model/vnd.sap.vds' => ['vds'], 'model/vnd.usda' => ['usda'], 'model/vnd.usdz+zip' => ['usdz'], 'model/vnd.valve.source.compiled-map' => ['bsp'], 'model/vnd.vtu' => ['vtu'], 'model/vrml' => ['wrl', 'vrml'], 'model/x3d+binary' => ['x3db', 'x3dbz'], 'model/x3d+fastinfoset' => ['x3db'], 'model/x3d+vrml' => ['x3dv', 'x3dvz'], 'model/x3d+xml' => ['x3d', 'x3dz'], 'model/x3d-vrml' => ['x3dv'], 'text/cache-manifest' => ['appcache', 'manifest'], 'text/calendar' => ['ics', 'ifb'], 'text/coffeescript' => ['coffee', 'litcoffee'], 'text/css' => ['css'], 'text/csv' => ['csv'], 'text/html' => ['html', 'htm', 'shtml'], 'text/jade' => ['jade'], 'text/javascript' => ['js', 'mjs'], 'text/jsx' => ['jsx'], 'text/less' => ['less'], 'text/markdown' => ['md', 'markdown'], 'text/mathml' => ['mml'], 'text/mdx' => ['mdx'], 'text/n3' => ['n3'], 'text/plain' => ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini', 'm3u'], 'text/prs.lines.tag' => ['dsc'], 'text/richtext' => ['rtx'], 'text/rtf' => ['rtf'], 'text/sgml' => ['sgml', 'sgm'], 'text/shex' => ['shex'], 'text/slim' => ['slim', 'slm'], 'text/spdx' => ['spdx'], 'text/stylus' => ['stylus', 'styl'], 'text/tab-separated-values' => ['tsv'], 'text/troff' => ['t', 'tr', 'roff', 'man', 'me', 'ms'], 'text/turtle' => ['ttl'], 'text/uri-list' => ['uri', 'uris', 'urls'], 'text/vcard' => ['vcard'], 'text/vnd.curl' => ['curl'], 'text/vnd.curl.dcurl' => ['dcurl'], 'text/vnd.curl.mcurl' => ['mcurl'], 'text/vnd.curl.scurl' => ['scurl'], 'text/vnd.dvb.subtitle' => ['sub'], 'text/vnd.familysearch.gedcom' => ['ged'], 'text/vnd.fly' => ['fly'], 'text/vnd.fmi.flexstor' => ['flx'], 'text/vnd.graphviz' => ['gv'], 'text/vnd.in3d.3dml' => ['3dml'], 'text/vnd.in3d.spot' => ['spot'], 'text/vnd.sun.j2me.app-descriptor' => ['jad'], 'text/vnd.wap.wml' => ['wml'], 'text/vnd.wap.wmlscript' => ['wmls'], 'text/vtt' => ['vtt'], 'text/wgsl' => ['wgsl'], 'text/x-asm' => ['s', 'asm'], 'text/x-c' => ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'], 'text/x-component' => ['htc'], 'text/x-fortran' => ['f', 'for', 'f77', 'f90'], 'text/x-handlebars-template' => ['hbs'], 'text/x-java-source' => ['java'], 'text/x-lua' => ['lua'], 'text/x-markdown' => ['mkd'], 'text/x-nfo' => ['nfo'], 'text/x-opml' => ['opml'], 'text/x-org' => ['org'], 'text/x-pascal' => ['p', 'pas'], 'text/x-processing' => ['pde'], 'text/x-sass' => ['sass'], 'text/x-scss' => ['scss'], 'text/x-setext' => ['etx'], 'text/x-sfv' => ['sfv'], 'text/x-suse-ymp' => ['ymp'], 'text/x-uuencode' => ['uu'], 'text/x-vcalendar' => ['vcs'], 'text/x-vcard' => ['vcf'], 'text/xml' => ['xml'], 'text/yaml' => ['yaml', 'yml'], 'video/3gpp' => ['3gp', '3gpp'], 'video/3gpp2' => ['3g2'], 'video/h261' => ['h261'], 'video/h263' => ['h263'], 'video/h264' => ['h264'], 'video/iso.segment' => ['m4s'], 'video/jpeg' => ['jpgv'], 'video/jpm' => ['jpm', 'jpgm'], 'video/mj2' => ['mj2', 'mjp2'], 'video/mp2t' => ['ts', 'm2t', 'm2ts', 'mts'], 'video/mp4' => ['mp4', 'mp4v', 'mpg4', 'f4v'], 'video/mpeg' => ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'], 'video/ogg' => ['ogv'], 'video/quicktime' => ['qt', 'mov'], 'video/vnd.dece.hd' => ['uvh', 'uvvh'], 'video/vnd.dece.mobile' => ['uvm', 'uvvm'], 'video/vnd.dece.pd' => ['uvp', 'uvvp'], 'video/vnd.dece.sd' => ['uvs', 'uvvs'], 'video/vnd.dece.video' => ['uvv', 'uvvv'], 'video/vnd.dvb.file' => ['dvb'], 'video/vnd.fvt' => ['fvt'], 'video/vnd.mpegurl' => ['mxu', 'm4u'], 'video/vnd.ms-playready.media.pyv' => ['pyv'], 'video/vnd.uvvu.mp4' => ['uvu', 'uvvu'], 'video/vnd.vivo' => ['viv'], 'video/webm' => ['webm'], 'video/x-f4v' => ['f4v'], 'video/x-fli' => ['fli'], 'video/x-flv' => ['flv'], 'video/x-m4v' => ['m4v'], 'video/x-matroska' => ['mkv', 'mk3d', 'mks'], 'video/x-mng' => ['mng'], 'video/x-ms-asf' => ['asf', 'asx'], 'video/x-ms-vob' => ['vob'], 'video/x-ms-wm' => ['wm'], 'video/x-ms-wmv' => ['wmv'], 'video/x-ms-wmx' => ['wmx'], 'video/x-ms-wvx' => ['wvx'], 'video/x-msvideo' => ['avi'], 'video/x-sgi-movie' => ['movie'], 'video/x-smv' => ['smv'], 'x-conference/x-cooltalk' => ['ice'], 'application/x-photoshop' => ['psd'], 'application/smil' => ['smi', 'smil'], 'application/powerpoint' => ['ppt'], 'application/vnd.ms-powerpoint.addin.macroEnabled.12' => ['ppam'], 'application/vnd.ms-powerpoint.presentation.macroEnabled.12' => ['pptm', 'potm'], 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' => ['ppsm'], 'application/wbxml' => ['wbxml'], 'application/wmlc' => ['wmlc'], 'application/x-httpd-php-source' => ['phps'], 'application/x-compress' => ['z'], 'application/x-rar' => ['rar'], 'video/vnd.rn-realvideo' => ['rv'], 'application/vnd.ms-word.template.macroEnabled.12' => ['docm', 'dotm'], 'application/vnd.ms-excel.sheet.macroEnabled.12' => ['xlsm'], 'application/vnd.ms-excel.template.macroEnabled.12' => ['xltm'], 'application/vnd.ms-excel.addin.macroEnabled.12' => ['xlam'], 'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => ['xlsb'], 'application/excel' => ['xl'], 'application/x-x509-user-cert' => ['pem'], 'application/x-pkcs10' => ['p10'], 'application/x-pkcs7-signature' => ['p7a'], 'application/pgp' => ['pgp'], 'application/gpg-keys' => ['gpg'], 'application/x-pkcs7' => ['rsa'], 'video/3gp' => ['3gp'], 'audio/acc' => ['aac'], 'application/vnd.mpegurl' => ['m4u'], 'application/videolan' => ['vlc'], 'audio/x-au' => ['au'], 'audio/ac3' => ['ac3'], 'text/x-scriptzsh' => ['zsh'], 'application/cdr' => ['cdr'], 'application/STEP' => ['step', 'stp'], 'application/x-ndjson' => ['ndjson'], 'application/braille' => ['brf'], ]; public function lookupMimeType(string $extension): ?string { return self::MIME_TYPES_FOR_EXTENSIONS[$extension] ?? null; } public function lookupExtension(string $mimetype): ?string { return self::EXTENSIONS_FOR_MIME_TIMES[$mimetype][0] ?? null; } /** * @return string[] */ public function lookupAllExtensions(string $mimetype): array { return self::EXTENSIONS_FOR_MIME_TIMES[$mimetype] ?? []; } } $overrides */ public function __construct(ExtensionToMimeTypeMap $innerMap, array $overrides) { $this->innerMap = $innerMap; $this->overrides = $overrides; } public function lookupMimeType(string $extension): ?string { return $this->overrides[$extension] ?? $this->innerMap->lookupMimeType($extension); } } 5.3.2 0.11.1 (2011-12-04) ------------------- * fixed issue #28: `mkdir()` overwrites existing directories/files 0.11.0 (2011-11-29) ------------------- * implemented issue #20: `vfsStream::create()` removes old structure * implemented issue #4: possibility to copy structure from existing file system * fixed issue #23: `unlink()` should not remove any directory * fixed issue #25: `vfsStreamDirectory::hasChild()` gives false positives for nested paths, patch provided by Andrew Coulton * fixed issue #26: opening a file for reading only should not update its modification time, reported and initial patch provided by Ludovic Chabant 0.10.1 (2011-08-22) ------------------- * fixed issue #16: replace `vfsStreamContent` to `vfsStreamContainer` for autocompletion * fixed issue #17: `vfsStream::create()` has issues with numeric directories, patch provided by mathieuk 0.10.0 (2011-07-22) ------------------- * added new method `vfsStreamContainer::hasChildren()` and `vfsStreamDirectory::hasChildren()` * implemented issue #14: less verbose way to initialize vfsStream * implemented issue #13: remove deprecated method `vfsStreamContent::setFilemtime()` * implemented issue #6: locking meachanism for files * ensured that `stream_set_blocking()`, `stream_set_timeout()` and `stream_set_write_buffer()` on vfsStream urls have the same behaviour with PHP 5.2 and 5.3 * implemented issue #10: method to print directory structure 0.9.0 (2011-07-13) ------------------ * implemented feature request issue #7: add support for `fileatime()` and `filectime()` * fixed issue #3: add support for `streamWrapper::stream_cast()` * fixed issue #9: resolve path not called everywhere its needed * deprecated `vfsStreamAbstractContent::setFilemtime()`, use `vfsStreamAbstractContent::lastModified()` instead, will be removed with 0.10.0 0.8.0 (2010-10-08) ------------------ * implemented enhancement #6: use `vfsStream::umask()` to influence initial file mode for files and directories * implemented enhancement #19: support of .. in the url, patch provided by Guislain Duthieuw * fixed issue #18: `getChild()` returns NULL when child's name contains parent name * fixed bug with incomplete error message when accessing non-existing files on root level 0.7.0 (2010-06-08) ------------------ * added new `vfsStream::setup()` method to simplify vfsStream usage * fixed issue #15: `mkdir()` creates a subfolder in a folder without permissions 0.6.0 (2010-02-15) ------------------ * added support for `$mode` param when opening files, implements enhancement #7 and fixes issue #13 * `vfsStreamWrapper::stream_open()` now evaluates `$options` for `STREAM_REPORT_ERRORS` 0.5.0 (2010-01-25) ------------------ * added support for `rename()`, patch provided by Benoit Aubuchon * added support for . as directory alias so that `vfs://foo/.` resolves to `vfs://foo`, can be used as workaround for bug #8 0.4.0 (2009-07-13) ------------------ * added support for file modes, users and groups (with restrictions, see http://code.google.com/p/bovigo/wiki/vfsStreamDocsKnownIssues) * fixed bug #5: `vfsStreamDirectory::addChild()` does not replace child with same name * fixed bug with `is_writable()` because of missing `stat()` fields, patch provided by Sergey Galkin 0.3.2 (2009-02-16) ------------------ * support trailing slashes on directories in vfsStream urls, patch provided by Gabriel Birke * fixed bug #4: vfsstream can only be read once, reported by Christoph Bloemer * enabled multiple iterations at the same time over the same directory 0.3.1 (2008-02-18) ------------------ * fixed path/directory separator issues under linux systems * fixed uid/gid issues under linux systems 0.3.0 (2008-01-02) ------------------ * added support for `rmdir()` * added `vfsStream::newDirectory()`, dropped `vfsStreamDirectory::ceate()` * added new interface `vfsStreamContainer` * added `vfsStreamContent::at()` which allows code like `$file = vfsStream::newFile('file.txt.')->withContent('foo')->at($otherDir);` * added `vfsStreamContent::lastModified()`, made `vfsStreamContent::setFilemtime()` an alias for this * moved from Stubbles development environment to bovigo * refactorings to reduce crap index of various methods 0.2.0 (2007-12-29) ------------------ * moved `vfsStreamWrapper::PROTOCOL` to `vfsStream::SCHEME` * added new `vfsStream::url()` method to assist in creating correct vfsStream urls * added `vfsStream::path()` method as opposite to `vfsStream::url()` * a call to `vfsStreamWrapper::register()` will now reset the root to null, implemented on request from David Zuelke * added support for `is_readable()`, `is_dir()`, `is_file()` * added `vfsStream::newFile()` to be able to do `$file = vfsStream::newFile("foo.txt")->withContent("bar");` 0.1.0 (2007-12-14) ------------------ * Initial release. { "name": "mikey179/vfsstream", "type": "library", "homepage": "http://vfs.bovigo.org/", "description": "Virtual file system to mock the real file system in unit tests.", "license": "BSD-3-Clause", "authors": [ { "name": "Frank Kleine", "homepage": "http://frankkleine.de/", "role": "Developer" } ], "support": { "issues": "https://github.com/bovigo/vfsStream/issues", "source": "https://github.com/bovigo/vfsStream/tree/master", "wiki": "https://github.com/bovigo/vfsStream/wiki" }, "require": { "php": ">=7.1.0" }, "require-dev": { "phpunit/phpunit": "^7.5||^8.5||^9.6", "yoast/phpunit-polyfills": "^2.0" }, "autoload": { "psr-0": { "org\\bovigo\\vfs\\": "src/main/php" } }, "scripts": { "test": "phpunit" }, "extra": { "branch-alias": { "dev-master": "1.6.x-dev" } } } You can find documentation in the [wiki](https://github.com/mikey179/vfsStream/wiki). Also you might want to check [vfsStream examples](https://github.com/mikey179/vfsStream-examples). [![Build Status](https://secure.travis-ci.org/mikey179/vfsStream.png)](http://travis-ci.org/mikey179/vfsStream) [![Build Status Windows](https://ci.appveyor.com/api/projects/status/6whqgluyeggspjp1/branch/master?svg=true)](https://ci.appveyor.com/project/mikey179/vfsstream) [![Coverage Status](https://coveralls.io/repos/github/bovigo/vfsStream/badge.svg?branch=v1.x)](https://coveralls.io/github/bovigo/vfsStream?branch=v1.x) [![Latest Stable Version](https://poser.pugx.org/mikey179/vfsStream/version.png)](https://packagist.org/packages/mikey179/vfsStream) [![Latest Unstable Version](https://poser.pugx.org/mikey179/vfsStream/v/unstable.png)](//packagist.org/packages/mikey179/vfsStream) ./src/test/phpt ./src/test/php src/main/php rootDirectory = vfsStream::newDirectory('/'); $this->rootDirectory->addChild(vfsStream::newDirectory('var/log/app')); $dir = $this->rootDirectory->getChild('var/log/app'); $dir->addChild(vfsStream::newDirectory('app1')); $dir->addChild(vfsStream::newDirectory('app2')); $dir->addChild(vfsStream::newDirectory('foo')); } /** * @test */ public function shouldContainThreeSubdirectories() { $this->assertEquals(3, count($this->rootDirectory->getChild('var/log/app')->getChildren()) ); } /** * @test */ public function shouldContainSubdirectoryFoo() { $this->assertTrue($this->rootDirectory->getChild('var/log/app')->hasChild('foo')); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $this->rootDirectory->getChild('var/log/app')->getChild('foo') ); } /** * @test */ public function shouldContainSubdirectoryApp1() { $this->assertTrue($this->rootDirectory->getChild('var/log/app')->hasChild('app1')); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $this->rootDirectory->getChild('var/log/app')->getChild('app1') ); } /** * @test */ public function shouldContainSubdirectoryApp2() { $this->assertTrue($this->rootDirectory->getChild('var/log/app')->hasChild('app2')); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $this->rootDirectory->getChild('var/log/app')->getChild('app2') ); } } dir = new vfsStreamDirectory('foo'); $this->mockChild1 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $this->mockChild1->expects($this->any()) ->method('getName') ->will($this->returnValue('bar')); $this->dir->addChild($this->mockChild1); $this->mockChild2 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $this->mockChild2->expects($this->any()) ->method('getName') ->will($this->returnValue('baz')); $this->dir->addChild($this->mockChild2); } /** * clean up test environment */ public function tearDown(): void { vfsStream::enableDotfiles(); } /** * @return array */ public function provideSwitchWithExpectations() { return array(array(function() { vfsStream::disableDotfiles(); }, array() ), array(function() { vfsStream::enableDotfiles(); }, array('.', '..') ) ); } private function getDirName($dir) { if (is_string($dir)) { return $dir; } return $dir->getName(); } /** * @param \Closure $dotFilesSwitch * @param array $dirNames * @test * @dataProvider provideSwitchWithExpectations */ public function iteration(\Closure $dotFilesSwitch, array $dirs) { $dirs[] = $this->mockChild1; $dirs[] = $this->mockChild2; $dotFilesSwitch(); $dirIterator = $this->dir->getIterator(); foreach ($dirs as $dir) { $this->assertEquals($this->getDirName($dir), $dirIterator->key()); $this->assertTrue($dirIterator->valid()); if (!is_string($dir)) { $this->assertSame($dir, $dirIterator->current()); } $dirIterator->next(); } $this->assertFalse($dirIterator->valid()); $this->assertNull($dirIterator->key()); $this->assertNull($dirIterator->current()); } } assertEquals('vfs://foo', vfsStream::url('foo')); $this->assertEquals('vfs://foo/bar.baz', vfsStream::url('foo/bar.baz')); $this->assertEquals('vfs://foo/bar.baz', vfsStream::url('foo\bar.baz')); } /** * assure that url2path conversion works correct * * @test */ public function path() { $this->assertEquals('foo', vfsStream::path('vfs://foo')); $this->assertEquals('foo/bar.baz', vfsStream::path('vfs://foo/bar.baz')); $this->assertEquals('foo/bar.baz', vfsStream::path('vfs://foo\bar.baz')); } /** * windows directory separators are converted into default separator * * @author Gabriel Birke * @test */ public function pathConvertsWindowsDirectorySeparators() { $this->assertEquals('foo/bar', vfsStream::path('vfs://foo\\bar')); } /** * trailing whitespace should be removed * * @author Gabriel Birke * @test */ public function pathRemovesTrailingWhitespace() { $this->assertEquals('foo/bar', vfsStream::path('vfs://foo/bar ')); } /** * trailing slashes are removed * * @author Gabriel Birke * @test */ public function pathRemovesTrailingSlash() { $this->assertEquals('foo/bar', vfsStream::path('vfs://foo/bar/')); } /** * trailing slash and whitespace should be removed * * @author Gabriel Birke * @test */ public function pathRemovesTrailingSlashAndWhitespace() { $this->assertEquals('foo/bar', vfsStream::path('vfs://foo/bar/ ')); } /** * double slashes should be replaced by single slash * * @author Gabriel Birke * @test */ public function pathRemovesDoubleSlashes() { // Regular path $this->assertEquals('my/path', vfsStream::path('vfs://my/path')); // Path with double slashes $this->assertEquals('my/path', vfsStream::path('vfs://my//path')); } /** * test to create a new file * * @test */ public function newFile() { $file = vfsStream::newFile('filename.txt'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamFile', $file); $this->assertEquals('filename.txt', $file->getName()); $this->assertEquals(0666, $file->getPermissions()); } /** * test to create a new file with non-default permissions * * @test * @group permissions */ public function newFileWithDifferentPermissions() { $file = vfsStream::newFile('filename.txt', 0644); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamFile', $file); $this->assertEquals('filename.txt', $file->getName()); $this->assertEquals(0644, $file->getPermissions()); } /** * test to create a new directory structure * * @test */ public function newSingleDirectory() { $foo = vfsStream::newDirectory('foo'); $this->assertEquals('foo', $foo->getName()); $this->assertEquals(0, count($foo->getChildren())); $this->assertEquals(0777, $foo->getPermissions()); } /** * test to create a new directory structure with non-default permissions * * @test * @group permissions */ public function newSingleDirectoryWithDifferentPermissions() { $foo = vfsStream::newDirectory('foo', 0755); $this->assertEquals('foo', $foo->getName()); $this->assertEquals(0, count($foo->getChildren())); $this->assertEquals(0755, $foo->getPermissions()); } /** * test to create a new directory structure * * @test */ public function newDirectoryStructure() { $foo = vfsStream::newDirectory('foo/bar/baz'); $this->assertEquals('foo', $foo->getName()); $this->assertEquals(0777, $foo->getPermissions()); $this->assertTrue($foo->hasChild('bar')); $this->assertTrue($foo->hasChild('bar/baz')); $this->assertFalse($foo->hasChild('baz')); $bar = $foo->getChild('bar'); $this->assertEquals('bar', $bar->getName()); $this->assertEquals(0777, $bar->getPermissions()); $this->assertTrue($bar->hasChild('baz')); $baz1 = $bar->getChild('baz'); $this->assertEquals('baz', $baz1->getName()); $this->assertEquals(0777, $baz1->getPermissions()); $baz2 = $foo->getChild('bar/baz'); $this->assertSame($baz1, $baz2); } /** * test that correct directory structure is created * * @test */ public function newDirectoryWithSlashAtStart() { $foo = vfsStream::newDirectory('/foo/bar/baz', 0755); $this->assertEquals('foo', $foo->getName()); $this->assertEquals(0755, $foo->getPermissions()); $this->assertTrue($foo->hasChild('bar')); $this->assertTrue($foo->hasChild('bar/baz')); $this->assertFalse($foo->hasChild('baz')); $bar = $foo->getChild('bar'); $this->assertEquals('bar', $bar->getName()); $this->assertEquals(0755, $bar->getPermissions()); $this->assertTrue($bar->hasChild('baz')); $baz1 = $bar->getChild('baz'); $this->assertEquals('baz', $baz1->getName()); $this->assertEquals(0755, $baz1->getPermissions()); $baz2 = $foo->getChild('bar/baz'); $this->assertSame($baz1, $baz2); } /** * @test * @group setup * @since 0.7.0 */ public function setupRegistersStreamWrapperAndCreatesRootDirectoryWithDefaultNameAndPermissions() { $root = vfsStream::setup(); $this->assertSame($root, vfsStreamWrapper::getRoot()); $this->assertEquals('root', $root->getName()); $this->assertEquals(0777, $root->getPermissions()); } /** * @test * @group setup * @since 0.7.0 */ public function setupRegistersStreamWrapperAndCreatesRootDirectoryWithGivenNameAndDefaultPermissions() { $root = vfsStream::setup('foo'); $this->assertSame($root, vfsStreamWrapper::getRoot()); $this->assertEquals('foo', $root->getName()); $this->assertEquals(0777, $root->getPermissions()); } /** * @test * @group setup * @since 0.7.0 */ public function setupRegistersStreamWrapperAndCreatesRootDirectoryWithGivenNameAndPermissions() { $root = vfsStream::setup('foo', 0444); $this->assertSame($root, vfsStreamWrapper::getRoot()); $this->assertEquals('foo', $root->getName()); $this->assertEquals(0444, $root->getPermissions()); } /** * @test * @group issue_14 * @group issue_20 * @since 0.10.0 */ public function setupWithEmptyArrayIsEqualToSetup() { $root = vfsStream::setup('example', 0755, array() ); $this->assertEquals('example', $root->getName()); $this->assertEquals(0755, $root->getPermissions()); $this->assertFalse($root->hasChildren()); } /** * @test * @group issue_14 * @group issue_20 * @since 0.10.0 */ public function setupArraysAreTurnedIntoSubdirectories() { $root = vfsStream::setup('root', null, array('test' => array()) ); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('test')); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $root->getChild('test') ); $this->assertFalse($root->getChild('test')->hasChildren()); } /** * @test * @group issue_14 * @group issue_20 * @since 0.10.0 */ public function setupStringsAreTurnedIntoFilesWithContent() { $root = vfsStream::setup('root', null, array('test.txt' => 'some content') ); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('test.txt')); $this->assertVfsFile($root->getChild('test.txt'), 'some content'); } /** * @test * @group issue_14 * @group issue_20 * @since 0.10.0 */ public function setupWorksRecursively() { $root = vfsStream::setup('root', null, array('test' => array('foo' => array('test.txt' => 'hello'), 'baz.txt' => 'world' ) ) ); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('test')); $test = $root->getChild('test'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $test); $this->assertTrue($test->hasChildren()); $this->assertTrue($test->hasChild('baz.txt')); $this->assertVfsFile($test->getChild('baz.txt'), 'world'); $this->assertTrue($test->hasChild('foo')); $foo = $test->getChild('foo'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $foo); $this->assertTrue($foo->hasChildren()); $this->assertTrue($foo->hasChild('test.txt')); $this->assertVfsFile($foo->getChild('test.txt'), 'hello'); } /** * @test * @group issue_17 * @group issue_20 */ public function setupCastsNumericDirectoriesToStrings() { $root = vfsStream::setup('root', null, array(2011 => array ('test.txt' => 'some content')) ); $this->assertTrue($root->hasChild('2011')); $directory = $root->getChild('2011'); $this->assertVfsFile($directory->getChild('test.txt'), 'some content'); $this->assertTrue(file_exists('vfs://root/2011/test.txt')); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createArraysAreTurnedIntoSubdirectories() { $baseDir = vfsStream::create(array('test' => array()), new vfsStreamDirectory('baseDir')); $this->assertTrue($baseDir->hasChildren()); $this->assertTrue($baseDir->hasChild('test')); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $baseDir->getChild('test') ); $this->assertFalse($baseDir->getChild('test')->hasChildren()); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createArraysAreTurnedIntoSubdirectoriesOfRoot() { $root = vfsStream::setup(); $this->assertSame($root, vfsStream::create(array('test' => array()))); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('test')); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $root->getChild('test') ); $this->assertFalse($root->getChild('test')->hasChildren()); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createThrowsExceptionIfNoBaseDirGivenAndNoRootSet() { $this->expectException(\InvalidArgumentException::class); vfsStream::create(array('test' => array())); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createWorksRecursively() { $baseDir = vfsStream::create(array('test' => array('foo' => array('test.txt' => 'hello'), 'baz.txt' => 'world' ) ), new vfsStreamDirectory('baseDir') ); $this->assertTrue($baseDir->hasChildren()); $this->assertTrue($baseDir->hasChild('test')); $test = $baseDir->getChild('test'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $test); $this->assertTrue($test->hasChildren()); $this->assertTrue($test->hasChild('baz.txt')); $this->assertVfsFile($test->getChild('baz.txt'), 'world'); $this->assertTrue($test->hasChild('foo')); $foo = $test->getChild('foo'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $foo); $this->assertTrue($foo->hasChildren()); $this->assertTrue($foo->hasChild('test.txt')); $this->assertVfsFile($foo->getChild('test.txt'), 'hello'); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createWorksRecursivelyWithRoot() { $root = vfsStream::setup(); $this->assertSame($root, vfsStream::create(array('test' => array('foo' => array('test.txt' => 'hello'), 'baz.txt' => 'world' ) ) ) ); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('test')); $test = $root->getChild('test'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $test); $this->assertTrue($test->hasChildren()); $this->assertTrue($test->hasChild('baz.txt')); $this->assertVfsFile($test->getChild('baz.txt'), 'world'); $this->assertTrue($test->hasChild('foo')); $foo = $test->getChild('foo'); $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $foo); $this->assertTrue($foo->hasChildren()); $this->assertTrue($foo->hasChild('test.txt')); $this->assertVfsFile($foo->getChild('test.txt'), 'hello'); } /** * @test * @group issue_20 * @since 0.10.0 */ public function createStringsAreTurnedIntoFilesWithContent() { $baseDir = vfsStream::create(array('test.txt' => 'some content'), new vfsStreamDirectory('baseDir')); $this->assertTrue($baseDir->hasChildren()); $this->assertTrue($baseDir->hasChild('test.txt')); $this->assertVfsFile($baseDir->getChild('test.txt'), 'some content'); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createStringsAreTurnedIntoFilesWithContentWithRoot() { $root = vfsStream::setup(); $this->assertSame($root, vfsStream::create(array('test.txt' => 'some content')) ); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('test.txt')); $this->assertVfsFile($root->getChild('test.txt'), 'some content'); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createCastsNumericDirectoriesToStrings() { $baseDir = vfsStream::create(array(2011 => array ('test.txt' => 'some content')), new vfsStreamDirectory('baseDir')); $this->assertTrue($baseDir->hasChild('2011')); $directory = $baseDir->getChild('2011'); $this->assertVfsFile($directory->getChild('test.txt'), 'some content'); } /** * @test * @group issue_20 * @since 0.11.0 */ public function createCastsNumericDirectoriesToStringsWithRoot() { $root = vfsStream::setup(); $this->assertSame($root, vfsStream::create(array(2011 => array ('test.txt' => 'some content'))) ); $this->assertTrue($root->hasChild('2011')); $directory = $root->getChild('2011'); $this->assertVfsFile($directory->getChild('test.txt'), 'some content'); } /** * helper function for assertions on vfsStreamFile * * @param vfsStreamFile $file * @param string $content */ protected function assertVfsFile(vfsStreamFile $file, $content) { $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamFile', $file ); $this->assertEquals($content, $file->getContent() ); } /** * @test * @group issue_10 * @since 0.10.0 */ public function inspectWithContentGivesContentToVisitor() { $mockContent = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamVisitor'); $mockVisitor->expects($this->once()) ->method('visit') ->with($this->equalTo($mockContent)) ->will($this->returnValue($mockVisitor)); $this->assertSame($mockVisitor, vfsStream::inspect($mockVisitor, $mockContent)); } /** * @test * @group issue_10 * @since 0.10.0 */ public function inspectWithoutContentGivesRootToVisitor() { $root = vfsStream::setup(); $mockVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamVisitor'); $mockVisitor->expects($this->once()) ->method('visitDirectory') ->with($this->equalTo($root)) ->will($this->returnValue($mockVisitor)); $this->assertSame($mockVisitor, vfsStream::inspect($mockVisitor)); } /** * @test * @group issue_10 * @since 0.10.0 */ public function inspectWithoutContentAndWithoutRootThrowsInvalidArgumentException() { $this->expectException(\InvalidArgumentException::class); $mockVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamVisitor'); $mockVisitor->expects($this->never()) ->method('visit'); $mockVisitor->expects($this->never()) ->method('visitDirectory'); vfsStream::inspect($mockVisitor); } /** * returns path to file system copy resource directory * * @return string */ protected function getFileSystemCopyDir() { return realpath(dirname(__FILE__) . '/../../../../resources/filesystemcopy'); } /** * @test * @group issue_4 * @since 0.11.0 */ public function copyFromFileSystemThrowsExceptionIfNoBaseDirGivenAndNoRootSet() { $this->expectException(\InvalidArgumentException::class); vfsStream::copyFromFileSystem($this->getFileSystemCopyDir()); } /** * @test * @group issue_4 * @since 0.11.0 */ public function copyFromEmptyFolder() { $baseDir = vfsStream::copyFromFileSystem($this->getFileSystemCopyDir() . '/emptyFolder', vfsStream::newDirectory('test') ); $baseDir->removeChild('.gitignore'); $this->assertFalse($baseDir->hasChildren()); } /** * @test * @group issue_4 * @since 0.11.0 */ public function copyFromEmptyFolderWithRoot() { $root = vfsStream::setup(); $this->assertEquals($root, vfsStream::copyFromFileSystem($this->getFileSystemCopyDir() . '/emptyFolder') ); $root->removeChild('.gitignore'); $this->assertFalse($root->hasChildren()); } /** * @test * @group issue_4 * @since 0.11.0 */ public function copyFromWithSubFolders() { $baseDir = vfsStream::copyFromFileSystem($this->getFileSystemCopyDir(), vfsStream::newDirectory('test'), 3 ); $this->assertTrue($baseDir->hasChildren()); $this->assertTrue($baseDir->hasChild('emptyFolder')); $this->assertTrue($baseDir->hasChild('withSubfolders')); $subfolderDir = $baseDir->getChild('withSubfolders'); $this->assertTrue($subfolderDir->hasChild('subfolder1')); $this->assertTrue($subfolderDir->getChild('subfolder1')->hasChild('file1.txt')); $this->assertVfsFile($subfolderDir->getChild('subfolder1/file1.txt'), ' '); $this->assertTrue($subfolderDir->hasChild('subfolder2')); $this->assertTrue($subfolderDir->hasChild('aFile.txt')); $this->assertVfsFile($subfolderDir->getChild('aFile.txt'), 'foo'); } /** * @test * @group issue_4 * @since 0.11.0 */ public function copyFromWithSubFoldersWithRoot() { $root = vfsStream::setup(); $this->assertEquals($root, vfsStream::copyFromFileSystem($this->getFileSystemCopyDir(), null, 3 ) ); $this->assertTrue($root->hasChildren()); $this->assertTrue($root->hasChild('emptyFolder')); $this->assertTrue($root->hasChild('withSubfolders')); $subfolderDir = $root->getChild('withSubfolders'); $this->assertTrue($subfolderDir->hasChild('subfolder1')); $this->assertTrue($subfolderDir->getChild('subfolder1')->hasChild('file1.txt')); $this->assertVfsFile($subfolderDir->getChild('subfolder1/file1.txt'), ' '); $this->assertTrue($subfolderDir->hasChild('subfolder2')); $this->assertTrue($subfolderDir->hasChild('aFile.txt')); $this->assertVfsFile($subfolderDir->getChild('aFile.txt'), 'foo'); } /** * @test * @group issue_4 * @group issue_29 * @since 0.11.2 */ public function copyFromPreservesFilePermissions() { if (DIRECTORY_SEPARATOR !== '/') { $this->markTestSkipped('Only applicable on Linux style systems.'); } $copyDir = $this->getFileSystemCopyDir(); $root = vfsStream::setup(); $this->assertEquals($root, vfsStream::copyFromFileSystem($copyDir, null ) ); $this->assertEquals(fileperms($copyDir . '/withSubfolders') - vfsStreamContent::TYPE_DIR, $root->getChild('withSubfolders') ->getPermissions() ); $this->assertEquals(fileperms($copyDir . '/withSubfolders/aFile.txt') - vfsStreamContent::TYPE_FILE, $root->getChild('withSubfolders/aFile.txt') ->getPermissions() ); } /** * To test this the max file size is reduced to something reproduceable. * * @test * @group issue_91 * @since 1.5.0 */ public function copyFromFileSystemMocksLargeFiles() { if (DIRECTORY_SEPARATOR !== '/') { $this->markTestSkipped('Only applicable on Linux style systems.'); } $copyDir = $this->getFileSystemCopyDir(); $root = vfsStream::setup(); vfsStream::copyFromFileSystem($copyDir, $root, 3); $this->assertEquals( ' ', $root->getChild('withSubfolders/subfolder1/file1.txt')->getContent() ); } /** * @test * @group issue_121 * @since 1.6.1 */ public function createDirectoryWithTrailingSlashShouldNotCreateSubdirectoryWithEmptyName() { $directory = vfsStream::newDirectory('foo/'); $this->assertFalse($directory->hasChildren()); } /** * @test * @group issue_149 */ public function addStructureHandlesVfsStreamFileObjects() { $structure = array( 'topLevel' => array( 'thisIsAFile' => 'file contents', vfsStream::newFile('anotherFile'), ), ); vfsStream::setup(); $root = vfsStream::create($structure); $this->assertTrue($root->hasChild('topLevel/anotherFile')); } /** * @test * @group issue_149 */ public function createHandlesLargeFileContentObjects() { $structure = array( 'topLevel' => array( 'thisIsAFile' => 'file contents', 'anotherFile' => LargeFileContent::withMegabytes(2), ), ); vfsStream::setup(); $root = vfsStream::create($structure); $this->assertTrue($root->hasChild('topLevel/anotherFile')); } } root = vfsStream::setup(); vfsStream::newFile('foo.txt')->at($this->root); } /** * @test */ public function setBlockingDoesNotWork() { $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertFalse(stream_set_blocking($fp, 1)); fclose($fp); } /** * @test */ public function removeBlockingDoesNotWork() { $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertFalse(stream_set_blocking($fp, 0)); fclose($fp); } /** * @test */ public function setTimeoutDoesNotWork() { $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertFalse(stream_set_timeout($fp, 1)); fclose($fp); } /** * @test */ public function setWriteBufferDoesNotWork() { $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertEquals(-1, stream_set_write_buffer($fp, 512)); fclose($fp); } } largeFile = vfsStream::newFile('large.txt') ->withContent(LargeFileContent::withGigabytes(100)) ->at($root); } /** * @test */ public function hasLargeFileSize() { if (PHP_INT_MAX == 2147483647) { $this->markTestSkipped('Requires 64-bit version of PHP'); } $this->assertEquals( 100 * 1024 * 1024 * 1024, filesize($this->largeFile->url()) ); } /** * @test */ public function canReadFromLargeFile() { $fp = fopen($this->largeFile->url(), 'rb'); $data = fread($fp, 15); fclose($fp); $this->assertEquals(str_repeat(' ', 15), $data); } /** * @test */ public function canWriteIntoLargeFile() { $fp = fopen($this->largeFile->url(), 'rb+'); fseek($fp, 100 * 1024 * 1024, SEEK_SET); fwrite($fp, 'foobarbaz'); fclose($fp); $this->largeFile->seek((100 * 1024 * 1024) - 3, SEEK_SET); $this->assertEquals( ' foobarbaz ', $this->largeFile->read(15) ); } } block = new vfsStreamBlock('foo'); } /** * test default values and methods * * @test */ public function defaultValues() { $this->assertEquals(vfsStreamContent::TYPE_BLOCK, $this->block->getType()); $this->assertEquals('foo', $this->block->getName()); $this->assertTrue($this->block->appliesTo('foo')); $this->assertFalse($this->block->appliesTo('foo/bar')); $this->assertFalse($this->block->appliesTo('bar')); } /** * tests how external functions see this object * * @test */ public function external() { $root = vfsStream::setup('root'); $root->addChild(vfsStream::newBlock('foo')); $this->assertEquals('block', filetype(vfsStream::url('root/foo'))); } /** * tests adding a complex structure * * @test */ public function addStructure() { $structure = array( 'topLevel' => array( 'thisIsAFile' => 'file contents', '[blockDevice]' => 'block contents' ) ); $root = vfsStream::create($structure); $this->assertSame('block', filetype(vfsStream::url('root/topLevel/blockDevice'))); } /** * tests that a blank name for a block device throws an exception * @test */ public function createWithEmptyName() { $this->expectException(vfsStreamException::class); $structure = array( 'topLevel' => array( 'thisIsAFile' => 'file contents', '[]' => 'block contents' ) ); $root = vfsStream::create($structure); } } assertFalse(mkdir(vfsStream::url('another'))); $this->assertEquals(2, count($this->foo->getChildren())); $this->assertSame($this->foo, vfsStreamWrapper::getRoot()); } /** * mkdir() should not overwrite existing root * * @test */ public function mkdirNoNewRootRecursively() { $this->assertFalse(mkdir(vfsStream::url('another/more'), 0777, true)); $this->assertEquals(2, count($this->foo->getChildren())); $this->assertSame($this->foo, vfsStreamWrapper::getRoot()); } /** * assert that mkdir() creates the correct directory structure * * @test * @group permissions */ public function mkdirNonRecursively() { $this->assertFalse(mkdir($this->barURL . '/another/more')); $this->assertEquals(2, count($this->foo->getChildren())); $this->assertTrue(mkdir($this->fooURL . '/another')); $this->assertEquals(3, count($this->foo->getChildren())); $this->assertEquals(0777, $this->foo->getChild('another')->getPermissions()); } /** * assert that mkdir() creates the correct directory structure * * @test * @group permissions */ public function mkdirRecursively() { $this->assertTrue(mkdir($this->fooURL . '/another/more', 0777, true)); $this->assertEquals(3, count($this->foo->getChildren())); $another = $this->foo->getChild('another'); $this->assertTrue($another->hasChild('more')); $this->assertEquals(0777, $this->foo->getChild('another')->getPermissions()); $this->assertEquals(0777, $this->foo->getChild('another')->getChild('more')->getPermissions()); } /** * @test * @group issue_9 * @since 0.9.0 */ public function mkdirWithDots() { $this->assertTrue(mkdir($this->fooURL . '/another/../more/.', 0777, true)); $this->assertEquals(3, count($this->foo->getChildren())); $this->assertTrue($this->foo->hasChild('more')); } /** * no root > new directory becomes root * * @test * @group permissions */ public function mkdirWithoutRootCreatesNewRoot() { vfsStreamWrapper::register(); $this->assertTrue(@mkdir(vfsStream::url('foo'))); $this->assertEquals(vfsStreamContent::TYPE_DIR, vfsStreamWrapper::getRoot()->getType()); $this->assertEquals('foo', vfsStreamWrapper::getRoot()->getName()); $this->assertEquals(0777, vfsStreamWrapper::getRoot()->getPermissions()); } /** * trying to create a subdirectory of a file should not work * * @test */ public function mkdirOnFileReturnsFalse() { $this->assertFalse(mkdir($this->baz1URL . '/another/more', 0777, true)); } /** * assert that mkdir() creates the correct directory structure * * @test * @group permissions */ public function mkdirNonRecursivelyDifferentPermissions() { $this->assertTrue(mkdir($this->fooURL . '/another', 0755)); $this->assertEquals(0755, $this->foo->getChild('another')->getPermissions()); } /** * assert that mkdir() creates the correct directory structure * * @test * @group permissions */ public function mkdirRecursivelyDifferentPermissions() { $this->assertTrue(mkdir($this->fooURL . '/another/more', 0755, true)); $this->assertEquals(3, count($this->foo->getChildren())); $another = $this->foo->getChild('another'); $this->assertTrue($another->hasChild('more')); $this->assertEquals(0755, $this->foo->getChild('another')->getPermissions()); $this->assertEquals(0755, $this->foo->getChild('another')->getChild('more')->getPermissions()); } /** * assert that mkdir() creates the correct directory structure * * @test * @group permissions */ public function mkdirRecursivelyUsesDefaultPermissions() { $this->foo->chmod(0700); $this->assertTrue(mkdir($this->fooURL . '/another/more', 0777, true)); $this->assertEquals(3, count($this->foo->getChildren())); $another = $this->foo->getChild('another'); $this->assertTrue($another->hasChild('more')); $this->assertEquals(0777, $this->foo->getChild('another')->getPermissions()); $this->assertEquals(0777, $this->foo->getChild('another')->getChild('more')->getPermissions()); } /** * no root > new directory becomes root * * @test * @group permissions */ public function mkdirWithoutRootCreatesNewRootDifferentPermissions() { vfsStreamWrapper::register(); $this->assertTrue(@mkdir(vfsStream::url('foo'), 0755)); $this->assertEquals(vfsStreamContent::TYPE_DIR, vfsStreamWrapper::getRoot()->getType()); $this->assertEquals('foo', vfsStreamWrapper::getRoot()->getName()); $this->assertEquals(0755, vfsStreamWrapper::getRoot()->getPermissions()); } /** * no root > new directory becomes root * * @test * @group permissions */ public function mkdirWithoutRootCreatesNewRootWithDefaultPermissions() { vfsStreamWrapper::register(); $this->assertTrue(@mkdir(vfsStream::url('foo'))); $this->assertEquals(vfsStreamContent::TYPE_DIR, vfsStreamWrapper::getRoot()->getType()); $this->assertEquals('foo', vfsStreamWrapper::getRoot()->getName()); $this->assertEquals(0777, vfsStreamWrapper::getRoot()->getPermissions()); } /** * @test * @group permissions * @group bug_15 */ public function mkdirDirCanNotCreateNewDirInNonWritingDirectory() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root')); vfsStreamWrapper::getRoot()->addChild(new vfsStreamDirectory('restrictedFolder', 0000)); $this->assertFalse(is_writable(vfsStream::url('root/restrictedFolder/'))); $this->assertFalse(mkdir(vfsStream::url('root/restrictedFolder/newFolder'))); $this->assertFalse(vfsStreamWrapper::getRoot()->hasChild('restrictedFolder/newFolder')); } /** * @test * @group issue_28 */ public function mkDirShouldNotOverwriteExistingDirectories() { vfsStream::setup('root'); $dir = vfsStream::url('root/dir'); $this->assertTrue(mkdir($dir)); $this->assertFalse(@mkdir($dir)); } /** * @test * @group issue_28 */ public function mkDirShouldNotOverwriteExistingDirectoriesAndTriggerE_USER_WARNING() { $this->expectException(Error\Warning::class); $this->expectExceptionMessage('mkdir(): Path vfs://root/dir exists'); vfsStream::setup('root'); $dir = vfsStream::url('root/dir'); $this->assertTrue(mkdir($dir)); $this->assertFalse(mkdir($dir)); } /** * @test * @group issue_28 */ public function mkDirShouldNotOverwriteExistingFiles() { $root = vfsStream::setup('root'); vfsStream::newFile('test.txt')->at($root); $this->assertFalse(@mkdir(vfsStream::url('root/test.txt'))); } /** * @test * @group issue_28 */ public function mkDirShouldNotOverwriteExistingFilesAndTriggerE_USER_WARNING() { $this->expectException(Error\Warning::class); $this->expectExceptionMessage('mkdir(): Path vfs://root/test.txt exists'); $root = vfsStream::setup('root'); vfsStream::newFile('test.txt')->at($root); $this->assertFalse(mkdir(vfsStream::url('root/test.txt'))); } /** * @test * @group issue_131 * @since 1.6.3 */ public function allowsRecursiveMkDirWithDirectoryName0() { vfsStream::setup('root'); $subdir = vfsStream::url('root/a/0'); mkdir($subdir, 0777, true); $this->assertFileExists($subdir); } /** * @test * @group permissions * @group bug_15 */ public function canNotIterateOverNonReadableDirectory() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); $this->assertFalse(@opendir(vfsStream::url('root'))); $this->assertFalse(@dir(vfsStream::url('root'))); } /** * assert is_dir() returns correct result * * @test */ public function is_dir() { $this->assertTrue(is_dir($this->fooURL)); $this->assertTrue(is_dir($this->fooURL . '/.')); $this->assertTrue(is_dir($this->barURL)); $this->assertTrue(is_dir($this->barURL . '/.')); $this->assertFalse(is_dir($this->baz1URL)); $this->assertFalse(is_dir($this->baz2URL)); $this->assertFalse(is_dir($this->fooURL . '/another')); $this->assertFalse(is_dir(vfsStream::url('another'))); } /** * can not unlink without root * * @test */ public function canNotUnlinkDirectoryWithoutRoot() { vfsStreamWrapper::register(); $this->assertFalse(@rmdir(vfsStream::url('foo'))); } /** * rmdir() can not remove files * * @test */ public function rmdirCanNotRemoveFiles() { $this->assertFalse(rmdir($this->baz1URL)); $this->assertFalse(rmdir($this->baz2URL)); } /** * rmdir() can not remove a non-existing directory * * @test */ public function rmdirCanNotRemoveNonExistingDirectory() { $this->assertFalse(rmdir($this->fooURL . '/another')); } /** * rmdir() can not remove non-empty directories * * @test */ public function rmdirCanNotRemoveNonEmptyDirectory() { $this->assertFalse(rmdir($this->fooURL)); $this->assertFalse(rmdir($this->barURL)); } /** * @test */ public function rmdirCanRemoveEmptyDirectory() { vfsStream::newDirectory('empty')->at($this->foo); $this->assertTrue($this->foo->hasChild('empty')); $this->assertTrue(rmdir($this->fooURL . '/empty')); $this->assertFalse($this->foo->hasChild('empty')); } /** * @test */ public function rmdirCanRemoveEmptyDirectoryWithDot() { vfsStream::newDirectory('empty')->at($this->foo); $this->assertTrue($this->foo->hasChild('empty')); $this->assertTrue(rmdir($this->fooURL . '/empty/.')); $this->assertFalse($this->foo->hasChild('empty')); } /** * rmdir() can remove empty directories * * @test */ public function rmdirCanRemoveEmptyRoot() { $this->foo->removeChild('bar'); $this->foo->removeChild('baz2'); $this->assertTrue(rmdir($this->fooURL)); $this->assertFalse(file_exists($this->fooURL)); // make sure statcache was cleared $this->assertNull(vfsStreamWrapper::getRoot()); } /** * @test * @group permissions * @group bug_15 */ public function rmdirDirCanNotRemoveDirFromNonWritingDirectory() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); vfsStreamWrapper::getRoot()->addChild(new vfsStreamDirectory('nonRemovableFolder')); $this->assertFalse(is_writable(vfsStream::url('root'))); $this->assertFalse(rmdir(vfsStream::url('root/nonRemovableFolder'))); $this->assertTrue(vfsStreamWrapper::getRoot()->hasChild('nonRemovableFolder')); } /** * @test * @group permissions * @group bug_17 */ public function issue17() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0770)); vfsStreamWrapper::getRoot()->chgrp(vfsStream::GROUP_USER_1) ->chown(vfsStream::OWNER_USER_1); $this->assertFalse(mkdir(vfsStream::url('root/doesNotWork'))); $this->assertFalse(vfsStreamWrapper::getRoot()->hasChild('doesNotWork')); } /** * @test * @group bug_19 */ public function accessWithDoubleDotReturnsCorrectContent() { $this->assertEquals('baz2', file_get_contents(vfsStream::url('foo/bar/../baz2')) ); } /** * @test * @group bug_115 */ public function accessWithExcessDoubleDotsReturnsCorrectContent() { $this->assertEquals('baz2', file_get_contents(vfsStream::url('foo/../../../../bar/../baz2')) ); } /** * @test * @group bug_115 */ public function alwaysResolvesRootDirectoryAsOwnParentWithDoubleDot() { vfsStreamWrapper::getRoot()->chown(vfsStream::OWNER_USER_1); $this->assertTrue(is_dir(vfsStream::url('foo/..'))); $stat = stat(vfsStream::url('foo/..')); $this->assertEquals( vfsStream::OWNER_USER_1, $stat['uid'] ); } /** * @test * @since 0.11.0 * @group issue_23 */ public function unlinkCanNotRemoveNonEmptyDirectory() { try { $this->assertFalse(unlink($this->barURL)); } catch (\PHPUnit_Framework_Error $fe) { $this->assertEquals('unlink(vfs://foo/bar): Operation not permitted', $fe->getMessage()); } $this->assertTrue($this->foo->hasChild('bar')); $this->assertFileExists($this->barURL); } /** * @test * @since 0.11.0 * @group issue_23 */ public function unlinkCanNotRemoveEmptyDirectory() { vfsStream::newDirectory('empty')->at($this->foo); try { $this->assertTrue(unlink($this->fooURL . '/empty')); } catch (\PHPUnit_Framework_Error $fe) { $this->assertEquals('unlink(vfs://foo/empty): Operation not permitted', $fe->getMessage()); } $this->assertTrue($this->foo->hasChild('empty')); $this->assertFileExists($this->fooURL . '/empty'); } /** * @test * @group issue_32 */ public function canCreateFolderOfSameNameAsParentFolder() { $root = vfsStream::setup('testFolder'); mkdir(vfsStream::url('testFolder') . '/testFolder/subTestFolder', 0777, true); $this->assertTrue(file_exists(vfsStream::url('testFolder/testFolder/subTestFolder/.'))); } /** * @test * @group issue_32 */ public function canRetrieveFolderOfSameNameAsParentFolder() { $root = vfsStream::setup('testFolder'); mkdir(vfsStream::url('testFolder') . '/testFolder/subTestFolder', 0777, true); $this->assertTrue($root->hasChild('testFolder')); $this->assertNotNull($root->getChild('testFolder')); } } array('test.file' => '')); $this->root = vfsStream::setup('root', null, $structure); } /** * @test * @group issue_52 */ public function canNotChangePermissionWhenDirectoryNotWriteable() { $this->root->getChild('test_directory')->chmod(0444); $this->assertFalse(@chmod(vfsStream::url('root/test_directory/test.file'), 0777)); } /** * @test * @group issue_53 */ public function canNotChangePermissionWhenFileNotOwned() { $this->root->getChild('test_directory')->getChild('test.file')->chown(vfsStream::OWNER_USER_1); $this->assertFalse(@chmod(vfsStream::url('root/test_directory/test.file'), 0777)); } /** * @test * @group issue_52 */ public function canNotChangeOwnerWhenDirectoryNotWriteable() { $this->root->getChild('test_directory')->chmod(0444); $this->assertFalse(@chown(vfsStream::url('root/test_directory/test.file'), vfsStream::OWNER_USER_2)); } /** * @test * @group issue_53 */ public function canNotChangeOwnerWhenFileNotOwned() { $this->root->getChild('test_directory')->getChild('test.file')->chown(vfsStream::OWNER_USER_1); $this->assertFalse(@chown(vfsStream::url('root/test_directory/test.file'), vfsStream::OWNER_USER_2)); } /** * @test * @group issue_52 */ public function canNotChangeGroupWhenDirectoryNotWriteable() { $this->root->getChild('test_directory')->chmod(0444); $this->assertFalse(@chgrp(vfsStream::url('root/test_directory/test.file'), vfsStream::GROUP_USER_2)); } /** * @test * @group issue_53 */ public function canNotChangeGroupWhenFileNotOwned() { $this->root->getChild('test_directory')->getChild('test.file')->chown(vfsStream::OWNER_USER_1); $this->assertFalse(@chgrp(vfsStream::url('root/test_directory/test.file'), vfsStream::GROUP_USER_2)); } /** * @test * @group issue_107 * @requires PHP 5.4 * @since 1.5.0 */ public function touchOnNonWriteableDirectoryTriggersError() { $this->expectException(Error\Warning::class); $this->expectExceptionMessage('Can not create new file in non-writable path root'); $this->root->chmod(0555); touch($this->root->url() . '/touch.txt'); } /** * @test * @group issue_107 * @requires PHP 5.4 * @since 1.5.0 */ public function touchOnNonWriteableDirectoryDoesNotCreateFile() { $this->root->chmod(0555); $this->assertFalse(@touch($this->root->url() . '/touch.txt')); $this->assertFalse($this->root->hasChild('touch.txt')); } } rootDir = vfsStream::url('root'); $this->lostAndFound = $this->rootDir . '/lost+found/'; mkdir($this->lostAndFound); } /** * @test */ public function worksWithCorrectName() { $results = array(); $it = new \RecursiveDirectoryIterator($this->lostAndFound); foreach ($it as $f) { $results[] = $f->getPathname(); } $this->assertEquals( array( 'vfs://root/lost+found' . DIRECTORY_SEPARATOR . '.', 'vfs://root/lost+found' . DIRECTORY_SEPARATOR . '..' ), $results ); } /** * @test */ public function doesNotWorkWithInvalidName() { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessage('ailed to open dir'); $results = array(); $it = new \RecursiveDirectoryIterator($this->rootDir . '/lost found/'); foreach ($it as $f) { $results[] = $f->getPathname(); } } /** * @test */ public function returnsCorrectNames() { $results = array(); $it = new \RecursiveDirectoryIterator($this->rootDir); foreach ($it as $f) { $results[] = $f->getPathname(); } $this->assertEquals( array( 'vfs://root' . DIRECTORY_SEPARATOR . '.', 'vfs://root' . DIRECTORY_SEPARATOR . '..', 'vfs://root' . DIRECTORY_SEPARATOR . 'lost+found' ), $results ); } } assertSame($this->foo, vfsStreamWrapper::getRoot()); vfsStreamWrapper::register(); $this->assertNull(vfsStreamWrapper::getRoot()); } /** * @test * @since 0.11.0 */ public function setRootReturnsRoot() { vfsStreamWrapper::register(); $root = vfsStream::newDirectory('root'); $this->assertSame($root, vfsStreamWrapper::setRoot($root)); } /** * assure that filesize is returned correct * * @test */ public function filesize() { $this->assertEquals(0, filesize($this->fooURL)); $this->assertEquals(0, filesize($this->fooURL . '/.')); $this->assertEquals(0, filesize($this->barURL)); $this->assertEquals(0, filesize($this->barURL . '/.')); $this->assertEquals(4, filesize($this->baz2URL)); $this->assertEquals(5, filesize($this->baz1URL)); } /** * assert that file_exists() delivers correct result * * @test */ public function file_exists() { $this->assertTrue(file_exists($this->fooURL)); $this->assertTrue(file_exists($this->fooURL . '/.')); $this->assertTrue(file_exists($this->barURL)); $this->assertTrue(file_exists($this->barURL . '/.')); $this->assertTrue(file_exists($this->baz1URL)); $this->assertTrue(file_exists($this->baz2URL)); $this->assertFalse(file_exists($this->fooURL . '/another')); $this->assertFalse(file_exists(vfsStream::url('another'))); } /** * assert that filemtime() delivers correct result * * @test */ public function filemtime() { $this->assertEquals(100, filemtime($this->fooURL)); $this->assertEquals(100, filemtime($this->fooURL . '/.')); $this->assertEquals(200, filemtime($this->barURL)); $this->assertEquals(200, filemtime($this->barURL . '/.')); $this->assertEquals(300, filemtime($this->baz1URL)); $this->assertEquals(400, filemtime($this->baz2URL)); } /** * @test * @group issue_23 */ public function unlinkRemovesFilesOnly() { $this->assertTrue(unlink($this->baz2URL)); $this->assertFalse(file_exists($this->baz2URL)); // make sure statcache was cleared $this->assertEquals(array($this->bar), $this->foo->getChildren()); $this->assertFalse(@unlink($this->fooURL . '/another')); $this->assertFalse(@unlink(vfsStream::url('another'))); $this->assertEquals(array($this->bar), $this->foo->getChildren()); } /** * @test * @group issue_49 */ public function unlinkReturnsFalseWhenFileDoesNotExist() { vfsStream::setup()->addChild(vfsStream::newFile('foo.blubb')); $this->assertFalse(@unlink(vfsStream::url('foo.blubb2'))); } /** * @test * @group issue_49 */ public function unlinkReturnsFalseWhenFileDoesNotExistAndFileWithSameNameExistsInRoot() { vfsStream::setup()->addChild(vfsStream::newFile('foo.blubb')); $this->assertFalse(@unlink(vfsStream::url('foo.blubb'))); } /** * assert dirname() returns correct directory name * * @test */ public function dirname() { $this->assertEquals($this->fooURL, dirname($this->barURL)); $this->assertEquals($this->barURL, dirname($this->baz1URL)); # returns "vfs:" instead of "." # however this seems not to be fixable because dirname() does not # call the stream wrapper #$this->assertEquals(dirname(vfsStream::url('doesNotExist')), '.'); } /** * assert basename() returns correct file name * * @test */ public function basename() { $this->assertEquals('bar', basename($this->barURL)); $this->assertEquals('baz1', basename($this->baz1URL)); $this->assertEquals('doesNotExist', basename(vfsStream::url('doesNotExist'))); } /** * assert is_readable() works correct * * @test */ public function is_readable() { $this->assertTrue(is_readable($this->fooURL)); $this->assertTrue(is_readable($this->fooURL . '/.')); $this->assertTrue(is_readable($this->barURL)); $this->assertTrue(is_readable($this->barURL . '/.')); $this->assertTrue(is_readable($this->baz1URL)); $this->assertTrue(is_readable($this->baz2URL)); $this->assertFalse(is_readable($this->fooURL . '/another')); $this->assertFalse(is_readable(vfsStream::url('another'))); $this->foo->chmod(0222); $this->assertFalse(is_readable($this->fooURL)); $this->baz1->chmod(0222); $this->assertFalse(is_readable($this->baz1URL)); } /** * assert is_writable() works correct * * @test */ public function is_writable() { $this->assertTrue(is_writable($this->fooURL)); $this->assertTrue(is_writable($this->fooURL . '/.')); $this->assertTrue(is_writable($this->barURL)); $this->assertTrue(is_writable($this->barURL . '/.')); $this->assertTrue(is_writable($this->baz1URL)); $this->assertTrue(is_writable($this->baz2URL)); $this->assertFalse(is_writable($this->fooURL . '/another')); $this->assertFalse(is_writable(vfsStream::url('another'))); $this->foo->chmod(0444); $this->assertFalse(is_writable($this->fooURL)); $this->baz1->chmod(0444); $this->assertFalse(is_writable($this->baz1URL)); } /** * assert is_executable() works correct * * @test */ public function is_executable() { $this->assertFalse(is_executable($this->baz1URL)); $this->baz1->chmod(0766); $this->assertTrue(is_executable($this->baz1URL)); $this->assertFalse(is_executable($this->baz2URL)); } /** * assert is_executable() works correct * * @test */ public function directoriesAndNonExistingFilesAreSometimesExecutable() { // Inconsistent behavior has been fixed in 7.3 // see https://github.com/php/php-src/commit/94b4abdbc4d if (PHP_VERSION_ID >= 70300) { $this->assertTrue(is_executable($this->fooURL)); $this->assertTrue(is_executable($this->fooURL . '/.')); $this->assertTrue(is_executable($this->barURL)); $this->assertTrue(is_executable($this->barURL . '/.')); } else { $this->assertFalse(is_executable($this->fooURL)); $this->assertFalse(is_executable($this->fooURL . '/.')); $this->assertFalse(is_executable($this->barURL)); $this->assertFalse(is_executable($this->barURL . '/.')); } $this->assertFalse(is_executable($this->fooURL . '/another')); $this->assertFalse(is_executable(vfsStream::url('another'))); } /** * file permissions * * @test * @group permissions */ public function chmod() { $this->assertEquals(40777, decoct(fileperms($this->fooURL))); $this->assertEquals(40777, decoct(fileperms($this->fooURL . '/.'))); $this->assertEquals(40777, decoct(fileperms($this->barURL))); $this->assertEquals(40777, decoct(fileperms($this->barURL . '/.'))); $this->assertEquals(100666, decoct(fileperms($this->baz1URL))); $this->assertEquals(100666, decoct(fileperms($this->baz2URL))); $this->foo->chmod(0755); $this->bar->chmod(0700); $this->baz1->chmod(0644); $this->baz2->chmod(0600); $this->assertEquals(40755, decoct(fileperms($this->fooURL))); $this->assertEquals(40755, decoct(fileperms($this->fooURL . '/.'))); $this->assertEquals(40700, decoct(fileperms($this->barURL))); $this->assertEquals(40700, decoct(fileperms($this->barURL . '/.'))); $this->assertEquals(100644, decoct(fileperms($this->baz1URL))); $this->assertEquals(100600, decoct(fileperms($this->baz2URL))); } /** * @test * @group issue_11 * @group permissions */ public function chmodModifiesPermissions() { if (version_compare(phpversion(), '5.4.0', '<')) { $this->assertFalse(@chmod($this->fooURL, 0755)); $this->assertFalse(@chmod($this->barURL, 0711)); $this->assertFalse(@chmod($this->baz1URL, 0644)); $this->assertFalse(@chmod($this->baz2URL, 0664)); $this->assertEquals(40777, decoct(fileperms($this->fooURL))); $this->assertEquals(40777, decoct(fileperms($this->barURL))); $this->assertEquals(100666, decoct(fileperms($this->baz1URL))); $this->assertEquals(100666, decoct(fileperms($this->baz2URL))); } else { $this->assertTrue(chmod($this->fooURL, 0755)); $this->assertTrue(chmod($this->barURL, 0711)); $this->assertTrue(chmod($this->baz1URL, 0644)); $this->assertTrue(chmod($this->baz2URL, 0664)); $this->assertEquals(40755, decoct(fileperms($this->fooURL))); $this->assertEquals(40711, decoct(fileperms($this->barURL))); $this->assertEquals(100644, decoct(fileperms($this->baz1URL))); $this->assertEquals(100664, decoct(fileperms($this->baz2URL))); } } /** * @test * @group permissions */ public function fileownerIsCurrentUserByDefault() { $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL)); $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL . '/.')); $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->barURL)); $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->barURL . '/.')); $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->baz1URL)); $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->baz2URL)); } /** * @test * @group issue_11 * @group permissions */ public function chownChangesUser() { if (version_compare(phpversion(), '5.4.0', '<')) { $this->foo->chown(vfsStream::OWNER_USER_1); $this->bar->chown(vfsStream::OWNER_USER_1); $this->baz1->chown(vfsStream::OWNER_USER_2); $this->baz2->chown(vfsStream::OWNER_USER_2); } else { chown($this->fooURL, vfsStream::OWNER_USER_1); chown($this->barURL, vfsStream::OWNER_USER_1); chown($this->baz1URL, vfsStream::OWNER_USER_2); chown($this->baz2URL, vfsStream::OWNER_USER_2); } $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->fooURL)); $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->fooURL . '/.')); $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->barURL)); $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->barURL . '/.')); $this->assertEquals(vfsStream::OWNER_USER_2, fileowner($this->baz1URL)); $this->assertEquals(vfsStream::OWNER_USER_2, fileowner($this->baz2URL)); } /** * @test * @group issue_11 * @group permissions */ public function chownDoesNotWorkOnVfsStreamUrls() { if (version_compare(phpversion(), '5.4.0', '<')) { $this->assertFalse(@chown($this->fooURL, vfsStream::OWNER_USER_2)); $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL)); } } /** * @test * @group issue_11 * @group permissions */ public function groupIsCurrentGroupByDefault() { $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL)); $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL . '/.')); $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->barURL)); $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->barURL . '/.')); $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->baz1URL)); $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->baz2URL)); } /** * @test * @group issue_11 * @group permissions */ public function chgrp() { if (version_compare(phpversion(), '5.4.0', '<')) { $this->foo->chgrp(vfsStream::GROUP_USER_1); $this->bar->chgrp(vfsStream::GROUP_USER_1); $this->baz1->chgrp(vfsStream::GROUP_USER_2); $this->baz2->chgrp(vfsStream::GROUP_USER_2); } else { chgrp($this->fooURL, vfsStream::GROUP_USER_1); chgrp($this->barURL, vfsStream::GROUP_USER_1); chgrp($this->baz1URL, vfsStream::GROUP_USER_2); chgrp($this->baz2URL, vfsStream::GROUP_USER_2); } $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->fooURL)); $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->fooURL . '/.')); $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->barURL)); $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->barURL . '/.')); $this->assertEquals(vfsStream::GROUP_USER_2, filegroup($this->baz1URL)); $this->assertEquals(vfsStream::GROUP_USER_2, filegroup($this->baz2URL)); } /** * @test * @group issue_11 * @group permissions */ public function chgrpDoesNotWorkOnVfsStreamUrls() { if (version_compare(phpversion(), '5.4.0', '<')) { $this->assertFalse(@chgrp($this->fooURL, vfsStream::GROUP_USER_2)); $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL)); } } /** * @test * @author Benoit Aubuchon */ public function renameDirectory() { // move foo/bar to foo/baz3 $baz3URL = vfsStream::url('foo/baz3'); $this->assertTrue(rename($this->barURL, $baz3URL)); $this->assertFileExists($baz3URL); $this->assertFileDoesNotExist($this->barURL); } /** * @test */ public function renameDirectoryWithDots() { // move foo/bar to foo/baz3 $baz3URL = vfsStream::url('foo/baz3'); $this->assertTrue(rename($this->barURL . '/.', $baz3URL)); $this->assertFileExists($baz3URL); $this->assertFileDoesNotExist($this->barURL); } /** * @test * @group issue_9 * @since 0.9.0 */ public function renameDirectoryWithDotsInTarget() { // move foo/bar to foo/baz3 $baz3URL = vfsStream::url('foo/../baz3/.'); $this->assertTrue(rename($this->barURL . '/.', $baz3URL)); $this->assertFileExists($baz3URL); $this->assertFileDoesNotExist($this->barURL); } /** * @test * @author Benoit Aubuchon */ public function renameDirectoryOverwritingExistingFile() { // move foo/bar to foo/baz2 $this->assertTrue(rename($this->barURL, $this->baz2URL)); $this->assertFileExists(vfsStream::url('foo/baz2/baz1')); $this->assertFileDoesNotExist($this->barURL); } /** * @test */ public function renameFileIntoFile() { $this->expectException(Error\Warning::class); // foo/baz2 is a file, so it can not be turned into a directory $baz3URL = vfsStream::url('foo/baz2/baz3'); $this->assertTrue(rename($this->baz1URL, $baz3URL)); $this->assertFileExists($baz3URL); $this->assertFileDoesNotExist($this->baz1URL); } /** * @test * @author Benoit Aubuchon */ public function renameFileToDirectory() { // move foo/bar/baz1 to foo/baz3 $baz3URL = vfsStream::url('foo/baz3'); $this->assertTrue(rename($this->baz1URL, $baz3URL)); $this->assertFileExists($this->barURL); $this->assertFileExists($baz3URL); $this->assertFileDoesNotExist($this->baz1URL); } /** * assert that trying to rename from a non existing file trigger a warning * * @test */ public function renameOnSourceFileNotFound() { $this->expectException(Error\Warning::class); rename(vfsStream::url('notfound'), $this->baz1URL); } /** * assert that trying to rename to a directory that is not found trigger a warning * @test */ public function renameOnDestinationDirectoryFileNotFound() { $this->expectException(Error\Warning::class); rename($this->baz1URL, vfsStream::url('foo/notfound/file2')); } /** * stat() and fstat() should return the same result * * @test */ public function statAndFstatReturnSameResult() { $fp = fopen($this->baz2URL, 'r'); $this->assertEquals(stat($this->baz2URL), fstat($fp) ); fclose($fp); } /** * stat() returns full data * * @test */ public function statReturnsFullDataForFiles() { $this->assertEquals(array(0 => 0, 1 => 0, 2 => 0100666, 3 => 0, 4 => vfsStream::getCurrentUser(), 5 => vfsStream::getCurrentGroup(), 6 => 0, 7 => 4, 8 => 400, 9 => 400, 10 => 400, 11 => -1, 12 => -1, 'dev' => 0, 'ino' => 0, 'mode' => 0100666, 'nlink' => 0, 'uid' => vfsStream::getCurrentUser(), 'gid' => vfsStream::getCurrentGroup(), 'rdev' => 0, 'size' => 4, 'atime' => 400, 'mtime' => 400, 'ctime' => 400, 'blksize' => -1, 'blocks' => -1 ), stat($this->baz2URL) ); } /** * @test */ public function statReturnsFullDataForDirectories() { $this->assertEquals(array(0 => 0, 1 => 0, 2 => 0040777, 3 => 0, 4 => vfsStream::getCurrentUser(), 5 => vfsStream::getCurrentGroup(), 6 => 0, 7 => 0, 8 => 100, 9 => 100, 10 => 100, 11 => -1, 12 => -1, 'dev' => 0, 'ino' => 0, 'mode' => 0040777, 'nlink' => 0, 'uid' => vfsStream::getCurrentUser(), 'gid' => vfsStream::getCurrentGroup(), 'rdev' => 0, 'size' => 0, 'atime' => 100, 'mtime' => 100, 'ctime' => 100, 'blksize' => -1, 'blocks' => -1 ), stat($this->fooURL) ); } /** * @test */ public function statReturnsFullDataForDirectoriesWithDot() { $this->assertEquals(array(0 => 0, 1 => 0, 2 => 0040777, 3 => 0, 4 => vfsStream::getCurrentUser(), 5 => vfsStream::getCurrentGroup(), 6 => 0, 7 => 0, 8 => 100, 9 => 100, 10 => 100, 11 => -1, 12 => -1, 'dev' => 0, 'ino' => 0, 'mode' => 0040777, 'nlink' => 0, 'uid' => vfsStream::getCurrentUser(), 'gid' => vfsStream::getCurrentGroup(), 'rdev' => 0, 'size' => 0, 'atime' => 100, 'mtime' => 100, 'ctime' => 100, 'blksize' => -1, 'blocks' => -1 ), stat($this->fooURL . '/.') ); } /** * @test */ public function openFileWithoutDirectory() { $this->expectException(Error\Warning::class); vfsStreamWrapper::register(); $this->assertFalse(file_get_contents(vfsStream::url('file.txt'))); } /** * @test * @group issue_33 * @since 1.1.0 * @requires PHP 5.4.0 */ public function truncateRemovesSuperflouosContent() { if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } $handle = fopen($this->baz1URL, "r+"); $this->assertTrue(ftruncate($handle, 0)); $this->assertEquals(0, filesize($this->baz1URL)); $this->assertEquals('', file_get_contents($this->baz1URL)); fclose($handle); } /** * @test * @group issue_33 * @since 1.1.0 * @requires PHP 5.4.0 */ public function truncateToGreaterSizeAddsZeroBytes() { if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } $handle = fopen($this->baz1URL, "r+"); $this->assertTrue(ftruncate($handle, 25)); $this->assertEquals(25, filesize($this->baz1URL)); $this->assertEquals("baz 1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", file_get_contents($this->baz1URL)); fclose($handle); } /** * @test * @group issue_11 * @requires PHP 5.4.0 */ public function touchCreatesNonExistingFile() { $this->assertTrue(touch($this->fooURL . '/new.txt')); $this->assertTrue($this->foo->hasChild('new.txt')); } /** * @test * @group issue_11 * @requires PHP 5.4.0 */ public function touchChangesAccessAndModificationTimeForFile() { $this->assertTrue(touch($this->baz1URL, 303, 313)); $this->assertEquals(303, $this->baz1->filemtime()); $this->assertEquals(313, $this->baz1->fileatime()); } /** * @test * @group issue_11 * @group issue_80 * @requires PHP 5.4.0 */ public function touchChangesTimesToCurrentTimestampWhenNoTimesGiven() { $this->assertTrue(touch($this->baz1URL)); $this->assertEquals(time(), $this->baz1->filemtime(), '', 1); $this->assertEquals(time(), $this->baz1->fileatime(), '', 1); } /** * @test * @group issue_11 * @requires PHP 5.4.0 */ public function touchWithModifiedTimeChangesAccessAndModifiedTime() { $this->assertTrue(touch($this->baz1URL, 303)); $this->assertEquals(303, $this->baz1->filemtime()); $this->assertEquals(303, $this->baz1->fileatime()); } /** * @test * @group issue_11 * @requires PHP 5.4.0 */ public function touchChangesAccessAndModificationTimeForDirectory() { $this->assertTrue(touch($this->fooURL, 303, 313)); $this->assertEquals(303, $this->foo->filemtime()); $this->assertEquals(313, $this->foo->fileatime()); } /** * @test * @group issue_34 * @since 1.2.0 */ public function pathesAreCorrectlySet() { $this->assertEquals(vfsStream::path($this->fooURL), $this->foo->path()); $this->assertEquals(vfsStream::path($this->barURL), $this->bar->path()); $this->assertEquals(vfsStream::path($this->baz1URL), $this->baz1->path()); $this->assertEquals(vfsStream::path($this->baz2URL), $this->baz2->path()); } /** * @test * @group issue_34 * @since 1.2.0 */ public function urlsAreCorrectlySet() { $this->assertEquals($this->fooURL, $this->foo->url()); $this->assertEquals($this->barURL, $this->bar->url()); $this->assertEquals($this->baz1URL, $this->baz1->url()); $this->assertEquals($this->baz2URL, $this->baz2->url()); } /** * @test * @group issue_34 * @since 1.2.0 */ public function pathIsUpdatedAfterMove() { // move foo/bar/baz1 to foo/baz3 $baz3URL = vfsStream::url('foo/baz3'); $this->assertTrue(rename($this->baz1URL, $baz3URL)); $this->assertEquals(vfsStream::path($baz3URL), $this->baz1->path()); } /** * @test * @group issue_34 * @since 1.2.0 */ public function urlIsUpdatedAfterMove() { // move foo/bar/baz1 to foo/baz3 $baz3URL = vfsStream::url('foo/baz3'); $this->assertTrue(rename($this->baz1URL, $baz3URL)); $this->assertEquals($baz3URL, $this->baz1->url()); } /** * @test */ public function fileCopy() { $baz3URL = vfsStream::url('foo/baz3'); $this->assertTrue(copy($this->baz1URL, $baz3URL)); } } */ public static function getMethodCalls($path) { if (isset(self::$calledMethods[$path]) === true) { return self::$calledMethods[$path]; } return array(); } /** * helper method for setting up vfsStream with the proxy * * @param string $rootDirName optional name of root directory * @param int $permissions optional file permissions of root directory * @return vfsStreamDirectory * @throws vfsStreamException */ public static function setup($rootDirName = 'root', $permissions = null) { self::$root = vfsStream::newDirectory($rootDirName, $permissions); if (true === self::$registered) { return self::$root; } if (@stream_wrapper_register(vfsStream::SCHEME, __CLASS__) === false) { throw new vfsStreamException('A handler has already been registered for the ' . vfsStream::SCHEME . ' protocol.'); } self::$registered = true; return self::$root; } /** * open the stream * * @param string $path the path to open * @param string $mode mode for opening * @param string $options options for opening * @param string $opened_path full path that was actually opened * @return bool */ public function stream_open($path, $mode, $options, $opened_path) { $this->path = $path; self::recordMethodCall('stream_open', $this->path); return parent::stream_open($path, $mode, $options, $opened_path); } /** * closes the stream */ public function stream_close() { self::recordMethodCall('stream_close', $this->path); return parent::stream_close(); } /** * read the stream up to $count bytes * * @param int $count amount of bytes to read * @return string */ public function stream_read($count) { self::recordMethodCall('stream_read', $this->path); return parent::stream_read($count); } /** * writes data into the stream * * @param string $data * @return int amount of bytes written */ public function stream_write($data) { self::recordMethodCall('stream_write', $this->path); return parent::stream_write($data); } /** * checks whether stream is at end of file * * @return bool */ public function stream_eof() { self::recordMethodCall('stream_eof', $this->path); return parent::stream_eof(); } /** * returns the current position of the stream * * @return int */ public function stream_tell() { self::recordMethodCall('stream_tell', $this->path); return parent::stream_tell(); } /** * seeks to the given offset * * @param int $offset * @param int $whence * @return bool */ public function stream_seek($offset, $whence) { self::recordMethodCall('stream_seek', $this->path); return parent::stream_seek($offset, $whence); } /** * flushes unstored data into storage * * @return bool */ public function stream_flush() { self::recordMethodCall('stream_flush', $this->path); return parent::stream_flush(); } /** * returns status of stream * * @return array */ public function stream_stat() { self::recordMethodCall('stream_stat', $this->path); return parent::stream_stat(); } /** * retrieve the underlaying resource * * @param int $cast_as * @return bool */ public function stream_cast($cast_as) { self::recordMethodCall('stream_cast', $this->path); return parent::stream_cast($cast_as); } /** * set lock status for stream * * @param int $operation * @return bool */ public function stream_lock($operation) { self::recordMethodCall('stream_link', $this->path); return parent::stream_lock($operation); } /** * remove the data under the given path * * @param string $path * @return bool */ public function unlink($path) { self::recordMethodCall('unlink', $path); return parent::unlink($path); } /** * rename from one path to another * * @param string $path_from * @param string $path_to * @return bool */ public function rename($path_from, $path_to) { self::recordMethodCall('rename', $path_from); return parent::rename($path_from, $path_to); } /** * creates a new directory * * @param string $path * @param int $mode * @param int $options * @return bool */ public function mkdir($path, $mode, $options) { self::recordMethodCall('mkdir', $path); return parent::mkdir($path, $mode, $options); } /** * removes a directory * * @param string $path * @param int $options * @return bool */ public function rmdir($path, $options) { self::recordMethodCall('rmdir', $path); return parent::rmdir($path, $options); } /** * opens a directory * * @param string $path * @param int $options * @return bool */ public function dir_opendir($path, $options) { $this->path = $path; self::recordMethodCall('dir_opendir', $this->path); return parent::dir_opendir($path, $options); } /** * reads directory contents * * @return string */ public function dir_readdir() { self::recordMethodCall('dir_readdir', $this->path); return parent::dir_readdir(); } /** * reset directory iteration * * @return bool */ public function dir_rewinddir() { self::recordMethodCall('dir_rewinddir', $this->path); return parent::dir_rewinddir(); } /** * closes directory * * @return bool */ public function dir_closedir() { self::recordMethodCall('dir_closedir', $this->path); return parent::dir_closedir(); } /** * returns status of url * * @param string $path path of url to return status for * @param int $flags flags set by the stream API * @return array */ public function url_stat($path, $flags) { self::recordMethodCall('url_stat', $path); return parent::url_stat($path, $flags); } } = 80000) { $this->bc_expectException('\ValueError'); } else { $this->bc_expectException('\PHPUnit_Framework_Error'); } $root = vfsStream::setup(); $file = vfsStream::newFile('foo.txt')->at($root)->withContent('testContent'); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $readarray = array($fp); $writearray = array(); $exceptarray = array(); stream_select($readarray, $writearray, $exceptarray, 1); } } root = vfsStream::setup(); } /** * @test */ public function fileIsNotLockedByDefault() { $this->assertFalse(vfsStream::newFile('foo.txt')->isLocked()); } /** * @test */ public function streamIsNotLockedByDefault() { file_put_contents(vfsStream::url('root/foo.txt'), 'content'); $this->assertFalse($this->root->getChild('foo.txt')->isLocked()); } /** * @test */ public function canAquireSharedLock() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertTrue(flock($fp, LOCK_SH)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp); } /** * @test */ public function canAquireSharedLockWithNonBlockingFlockCall() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertTrue(flock($fp, LOCK_SH | LOCK_NB)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp); } /** * @test */ public function canAquireEclusiveLock() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertTrue(flock($fp, LOCK_EX)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); fclose($fp); } /** * @test */ public function canAquireEclusiveLockWithNonBlockingFlockCall() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertTrue(flock($fp, LOCK_EX | LOCK_NB)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); fclose($fp); } /** * @test */ public function canRemoveLock() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_EX); $this->assertTrue(flock($fp, LOCK_UN)); $this->assertFalse($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canRemoveLockWhenNotLocked() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $this->assertTrue(flock($fp, LOCK_UN)); $this->assertFalse($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertFalse($file->hasSharedLock($fp)); $this->assertFalse($file->hasExclusiveLock()); $this->assertFalse($file->hasExclusiveLock($fp)); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canRemoveSharedLockWithoutRemovingSharedLockOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_SH); $file->lock($fp2, LOCK_SH); $this->assertTrue(flock($fp1, LOCK_UN)); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasSharedLock($fp1)); $this->assertTrue($file->hasSharedLock($fp2)); fclose($fp1); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canNotRemoveSharedLockAcquiredOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_SH); $this->assertTrue(flock($fp2, LOCK_UN)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp1); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canNotRemoveExlusiveLockAcquiredOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_EX); $this->assertTrue(flock($fp2, LOCK_UN)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); fclose($fp1); fclose($fp2); } /** * @test */ public function canRemoveLockWithNonBlockingFlockCall() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_EX); $this->assertTrue(flock($fp, LOCK_UN | LOCK_NB)); $this->assertFalse($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canNotAquireExclusiveLockIfAlreadyExclusivelyLockedOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_EX); $this->assertFalse(flock($fp2, LOCK_EX + LOCK_NB)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); $this->assertTrue($file->hasExclusiveLock($fp1)); $this->assertFalse($file->hasExclusiveLock($fp2)); fclose($fp1); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canAquireExclusiveLockIfAlreadySelfExclusivelyLocked() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_EX); $this->assertTrue(flock($fp, LOCK_EX + LOCK_NB)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canNotAquireExclusiveLockIfAlreadySharedLockedOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_SH); $this->assertFalse(flock($fp2, LOCK_EX)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp1); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canAquireExclusiveLockIfAlreadySelfSharedLocked() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_SH); $this->assertTrue(flock($fp, LOCK_EX)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canNotAquireSharedLockIfAlreadyExclusivelyLockedOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_EX); $this->assertFalse(flock($fp2, LOCK_SH + LOCK_NB)); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); fclose($fp1); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canAquireSharedLockIfAlreadySelfExclusivelyLocked() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_EX); $this->assertTrue(flock($fp, LOCK_SH + LOCK_NB)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canAquireSharedLockIfAlreadySelfSharedLocked() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_SH); $this->assertTrue(flock($fp, LOCK_SH)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); fclose($fp); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function canAquireSharedLockIfAlreadySharedLockedOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp1, LOCK_SH); $this->assertTrue(flock($fp2, LOCK_SH)); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertTrue($file->hasSharedLock($fp1)); $this->assertTrue($file->hasSharedLock($fp2)); $this->assertFalse($file->hasExclusiveLock()); fclose($fp1); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/31 * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_31 * @group issue_40 */ public function removesExclusiveLockOnStreamClose() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_EX); fclose($fp); $this->assertFalse($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); } /** * @see https://github.com/mikey179/vfsStream/issues/31 * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_31 * @group issue_40 */ public function removesSharedLockOnStreamClose() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp, LOCK_SH); fclose($fp); $this->assertFalse($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertFalse($file->hasExclusiveLock()); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function notRemovesExclusiveLockOnStreamCloseIfExclusiveLockAcquiredOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp2, LOCK_EX); fclose($fp1); $this->assertTrue($file->isLocked()); $this->assertFalse($file->hasSharedLock()); $this->assertTrue($file->hasExclusiveLock()); $this->assertTrue($file->hasExclusiveLock($fp2)); fclose($fp2); } /** * @see https://github.com/mikey179/vfsStream/issues/40 * @test * @group issue_40 */ public function notRemovesSharedLockOnStreamCloseIfSharedLockAcquiredOnOtherFileHandler() { $file = vfsStream::newFile('foo.txt')->at($this->root); $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); $file->lock($fp2, LOCK_SH); fclose($fp1); $this->assertTrue($file->isLocked()); $this->assertTrue($file->hasSharedLock()); $this->assertTrue($file->hasSharedLock($fp2)); $this->assertFalse($file->hasExclusiveLock()); fclose($fp2); } } file = new vfsStreamFile('foo'); } /** * test default values and methods * * @test */ public function defaultValues() { $this->assertEquals(vfsStreamContent::TYPE_FILE, $this->file->getType()); $this->assertEquals('foo', $this->file->getName()); $this->assertTrue($this->file->appliesTo('foo')); $this->assertFalse($this->file->appliesTo('foo/bar')); $this->assertFalse($this->file->appliesTo('bar')); } /** * test setting and getting the content of a file * * @test */ public function content() { $this->assertEquals('', $this->file->getContent()); $this->assertSame($this->file, $this->file->setContent('bar')); $this->assertEquals('bar', $this->file->getContent()); $this->assertSame($this->file, $this->file->withContent('baz')); $this->assertEquals('baz', $this->file->getContent()); } /** * test renaming the directory * * @test */ public function rename() { $this->file->rename('bar'); $this->assertEquals('bar', $this->file->getName()); $this->assertFalse($this->file->appliesTo('foo')); $this->assertFalse($this->file->appliesTo('foo/bar')); $this->assertTrue($this->file->appliesTo('bar')); } /** * test reading contents from the file * * @test */ public function readEmptyFile() { $this->assertTrue($this->file->eof()); $this->assertEquals(0, $this->file->size()); $this->assertEquals('', $this->file->read(5)); $this->assertEquals(5, $this->file->getBytesRead()); $this->assertTrue($this->file->eof()); } /** * test reading contents from the file * * @test */ public function read() { $this->file->setContent('foobarbaz'); $this->assertFalse($this->file->eof()); $this->assertEquals(9, $this->file->size()); $this->assertEquals('foo', $this->file->read(3)); $this->assertEquals(3, $this->file->getBytesRead()); $this->assertFalse($this->file->eof()); $this->assertEquals(9, $this->file->size()); $this->assertEquals('bar', $this->file->read(3)); $this->assertEquals(6, $this->file->getBytesRead()); $this->assertFalse($this->file->eof()); $this->assertEquals(9, $this->file->size()); $this->assertEquals('baz', $this->file->read(3)); $this->assertEquals(9, $this->file->getBytesRead()); $this->assertEquals(9, $this->file->size()); $this->assertTrue($this->file->eof()); $this->assertEquals('', $this->file->read(3)); } /** * test seeking to offset * * @test */ public function seekEmptyFile() { $this->assertFalse($this->file->seek(0, 55)); $this->assertTrue($this->file->seek(0, SEEK_SET)); $this->assertEquals(0, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(5, SEEK_SET)); $this->assertEquals(5, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(0, SEEK_CUR)); $this->assertEquals(5, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(2, SEEK_CUR)); $this->assertEquals(7, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(0, SEEK_END)); $this->assertEquals(0, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(2, SEEK_END)); $this->assertEquals(2, $this->file->getBytesRead()); } /** * @test * @since 1.6.5 */ public function seekEmptyFileBeforeBeginningDoesNotChangeOffset() { $this->assertFalse($this->file->seek(-5, SEEK_SET), 'Seek before beginning of file'); $this->assertEquals(0, $this->file->getBytesRead()); } /** * test seeking to offset * * @test */ public function seekRead() { $this->file->setContent('foobarbaz'); $this->assertFalse($this->file->seek(0, 55)); $this->assertTrue($this->file->seek(0, SEEK_SET)); $this->assertEquals('foobarbaz', $this->file->readUntilEnd()); $this->assertEquals(0, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(5, SEEK_SET)); $this->assertEquals('rbaz', $this->file->readUntilEnd()); $this->assertEquals(5, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(0, SEEK_CUR)); $this->assertEquals('rbaz', $this->file->readUntilEnd()); $this->assertEquals(5, $this->file->getBytesRead(), 5); $this->assertTrue($this->file->seek(2, SEEK_CUR)); $this->assertEquals('az', $this->file->readUntilEnd()); $this->assertEquals(7, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(0, SEEK_END)); $this->assertEquals('', $this->file->readUntilEnd()); $this->assertEquals(9, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(2, SEEK_END)); $this->assertEquals('', $this->file->readUntilEnd()); $this->assertEquals(11, $this->file->getBytesRead()); } /** * @test * @since 1.6.5 */ public function seekFileBeforeBeginningDoesNotChangeOffset() { $this->file->setContent('foobarbaz'); $this->assertFalse($this->file->seek(-5, SEEK_SET), 'Seek before beginning of file'); $this->assertEquals(0, $this->file->getBytesRead()); $this->assertTrue($this->file->seek(2, SEEK_CUR)); $this->assertFalse($this->file->seek(-5, SEEK_SET), 'Seek before beginning of file'); $this->assertEquals(2, $this->file->getBytesRead()); $this->assertEquals('obarbaz', $this->file->readUntilEnd()); $this->assertFalse($this->file->seek(-5, SEEK_CUR), 'Seek before beginning of file'); $this->assertEquals(2, $this->file->getBytesRead()); $this->assertEquals('obarbaz', $this->file->readUntilEnd()); $this->assertFalse($this->file->seek(-20, SEEK_END), 'Seek before beginning of file'); $this->assertEquals(2, $this->file->getBytesRead()); $this->assertEquals('obarbaz', $this->file->readUntilEnd()); } /** * test writing data into the file * * @test */ public function writeEmptyFile() { $this->assertEquals(3, $this->file->write('foo')); $this->assertEquals('foo', $this->file->getContent()); $this->assertEquals(3, $this->file->size()); $this->assertEquals(3, $this->file->write('bar')); $this->assertEquals('foobar', $this->file->getContent()); $this->assertEquals(6, $this->file->size()); } /** * test writing data into the file * * @test */ public function write() { $this->file->setContent('foobarbaz'); $this->assertTrue($this->file->seek(3, SEEK_SET)); $this->assertEquals(3, $this->file->write('foo')); $this->assertEquals('foofoobaz', $this->file->getContent()); $this->assertEquals(9, $this->file->size()); $this->assertEquals(3, $this->file->write('bar')); $this->assertEquals('foofoobar', $this->file->getContent()); $this->assertEquals(9, $this->file->size()); } /** * setting and retrieving permissions for a file * * @test * @group permissions */ public function permissions() { $this->assertEquals(0666, $this->file->getPermissions()); $this->assertSame($this->file, $this->file->chmod(0644)); $this->assertEquals(0644, $this->file->getPermissions()); } /** * setting and retrieving permissions for a file * * @test * @group permissions */ public function permissionsSet() { $this->file = new vfsStreamFile('foo', 0644); $this->assertEquals(0644, $this->file->getPermissions()); $this->assertSame($this->file, $this->file->chmod(0600)); $this->assertEquals(0600, $this->file->getPermissions()); } /** * setting and retrieving owner of a file * * @test * @group permissions */ public function owner() { $this->assertEquals(vfsStream::getCurrentUser(), $this->file->getUser()); $this->assertTrue($this->file->isOwnedByUser(vfsStream::getCurrentUser())); $this->assertSame($this->file, $this->file->chown(vfsStream::OWNER_USER_1)); $this->assertEquals(vfsStream::OWNER_USER_1, $this->file->getUser()); $this->assertTrue($this->file->isOwnedByUser(vfsStream::OWNER_USER_1)); } /** * setting and retrieving owner group of a file * * @test * @group permissions */ public function group() { $this->assertEquals(vfsStream::getCurrentGroup(), $this->file->getGroup()); $this->assertTrue($this->file->isOwnedByGroup(vfsStream::getCurrentGroup())); $this->assertSame($this->file, $this->file->chgrp(vfsStream::GROUP_USER_1)); $this->assertEquals(vfsStream::GROUP_USER_1, $this->file->getGroup()); $this->assertTrue($this->file->isOwnedByGroup(vfsStream::GROUP_USER_1)); } /** * @test * @group issue_33 * @since 1.1.0 */ public function truncateRemovesSuperflouosContent() { $this->assertEquals(11, $this->file->write("lorem ipsum")); $this->assertTrue($this->file->truncate(5)); $this->assertEquals(5, $this->file->size()); $this->assertEquals('lorem', $this->file->getContent()); } /** * @test * @group issue_33 * @since 1.1.0 */ public function truncateToGreaterSizeAddsZeroBytes() { $this->assertEquals(11, $this->file->write("lorem ipsum")); $this->assertTrue($this->file->truncate(25)); $this->assertEquals(25, $this->file->size()); $this->assertEquals("lorem ipsum\0\0\0\0\0\0\0\0\0\0\0\0\0\0", $this->file->getContent()); } /** * @test * @group issue_79 * @since 1.3.0 */ public function withContentAcceptsAnyFileContentInstance() { $mockFileContent = $this->bc_getMock('org\bovigo\vfs\content\FileContent'); $mockFileContent->expects($this->once()) ->method('content') ->will($this->returnValue('foobarbaz')); $this->assertEquals( 'foobarbaz', $this->file->withContent($mockFileContent) ->getContent() ); } /** * @test * @group issue_79 * @since 1.3.0 */ public function withContentThrowsInvalidArgumentExceptionWhenContentIsNoStringAndNoFileContent() { $this->expectException(\InvalidArgumentException::class); $this->file->withContent(313); } } markTestSkipped('No ext/zip installed, skipping test.'); } $this->markTestSkipped('Zip extension can not work with vfsStream urls.'); vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(vfsStream::newDirectory('root')); } /** * @test */ public function createZipArchive() { $zip = new ZipArchive(); $this->assertTrue($zip->open(vfsStream::url('root/test.zip'), ZipArchive::CREATE)); $this->assertTrue($zip->addFromString("testfile1.txt", "#1 This is a test string added as testfile1.txt.\n")); $this->assertTrue($zip->addFromString("testfile2.txt", "#2 This is a test string added as testfile2.txt.\n")); $zip->setArchiveComment('a test'); var_dump($zip); $this->assertTrue($zip->close()); var_dump($zip->getStatusString()); var_dump($zip->close()); var_dump($zip->getStatusString()); var_dump($zip); var_dump(file_exists(vfsStream::url('root/test.zip'))); } } assertEquals('baz2', file_get_contents($this->baz2URL)); $this->assertEquals('baz 1', file_get_contents($this->baz1URL)); $this->assertFalse(@file_get_contents($this->barURL)); $this->assertFalse(@file_get_contents($this->fooURL)); } /** * @test * @group permissions * @group bug_15 */ public function file_get_contentsNonReadableFile() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root')); vfsStream::newFile('new.txt', 0000)->at(vfsStreamWrapper::getRoot())->withContent('content'); $this->assertEquals('', @file_get_contents(vfsStream::url('root/new.txt'))); } /** * assert that file_put_contents() delivers correct file contents * * @test */ public function file_put_contentsExistingFile() { $this->assertEquals(14, file_put_contents($this->baz2URL, 'baz is not bar')); $this->assertEquals('baz is not bar', $this->baz2->getContent()); $this->assertEquals(6, file_put_contents($this->baz1URL, 'foobar')); $this->assertEquals('foobar', $this->baz1->getContent()); $this->assertFalse(@file_put_contents($this->barURL, 'This does not work.')); $this->assertFalse(@file_put_contents($this->fooURL, 'This does not work, too.')); } /** * @test * @group permissions * @group bug_15 */ public function file_put_contentsExistingFileNonWritableDirectory() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); vfsStream::newFile('new.txt')->at(vfsStreamWrapper::getRoot())->withContent('content'); $this->assertEquals(15, @file_put_contents(vfsStream::url('root/new.txt'), 'This does work.')); $this->assertEquals('This does work.', file_get_contents(vfsStream::url('root/new.txt'))); } /** * @test * @group permissions * @group bug_15 */ public function file_put_contentsExistingNonWritableFile() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root')); vfsStream::newFile('new.txt', 0400)->at(vfsStreamWrapper::getRoot())->withContent('content'); $this->assertFalse(@file_put_contents(vfsStream::url('root/new.txt'), 'This does not work.')); $this->assertEquals('content', file_get_contents(vfsStream::url('root/new.txt'))); } /** * assert that file_put_contents() delivers correct file contents * * @test */ public function file_put_contentsNonExistingFile() { $this->assertEquals(14, file_put_contents($this->fooURL . '/baznot.bar', 'baz is not bar')); $this->assertEquals(3, count($this->foo->getChildren())); $this->assertEquals(14, file_put_contents($this->barURL . '/baznot.bar', 'baz is not bar')); $this->assertEquals(2, count($this->bar->getChildren())); } /** * @test * @group permissions * @group bug_15 */ public function file_put_contentsNonExistingFileNonWritableDirectory() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); $this->assertFalse(@file_put_contents(vfsStream::url('root/new.txt'), 'This does not work.')); $this->assertFalse(file_exists(vfsStream::url('root/new.txt'))); } /** * using a file pointer should work without any problems * * @test */ public function usingFilePointer() { $fp = fopen($this->baz1URL, 'r'); $this->assertEquals(0, ftell($fp)); $this->assertFalse(feof($fp)); $this->assertEquals(0, fseek($fp, 2)); $this->assertEquals(2, ftell($fp)); $this->assertEquals(0, fseek($fp, 1, SEEK_CUR)); $this->assertEquals(3, ftell($fp)); $this->assertEquals(0, fseek($fp, 1, SEEK_END)); $this->assertEquals(6, ftell($fp)); $this->assertTrue(feof($fp)); $this->assertEquals(0, fseek($fp, 2)); $this->assertFalse(feof($fp)); $this->assertEquals(2, ftell($fp)); $this->assertEquals('z', fread($fp, 1)); $this->assertEquals(3, ftell($fp)); $this->assertEquals(' 1', fread($fp, 8092)); $this->assertEquals(5, ftell($fp)); $this->assertTrue(fclose($fp)); } /** * assert is_file() returns correct result * * @test */ public function is_file() { $this->assertFalse(is_file($this->fooURL)); $this->assertFalse(is_file($this->barURL)); $this->assertTrue(is_file($this->baz1URL)); $this->assertTrue(is_file($this->baz2URL)); $this->assertFalse(is_file($this->fooURL . '/another')); $this->assertFalse(is_file(vfsStream::url('another'))); } /** * @test * @group issue7 * @group issue13 */ public function issue13CanNotOverwriteFiles() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); file_put_contents($vfsFile, 'd'); $this->assertEquals('d', file_get_contents($vfsFile)); } /** * @test * @group issue7 * @group issue13 */ public function appendContentIfOpenedWithModeA() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $fp = fopen($vfsFile, 'ab'); fwrite($fp, 'd'); fclose($fp); $this->assertEquals('testd', file_get_contents($vfsFile)); } /** * @test * @group issue7 * @group issue13 */ public function canOverwriteNonExistingFileWithModeX() { $vfsFile = vfsStream::url('foo/overwrite.txt'); $fp = fopen($vfsFile, 'xb'); fwrite($fp, 'test'); fclose($fp); $this->assertEquals('test', file_get_contents($vfsFile)); } /** * @test * @group issue7 * @group issue13 */ public function canNotOverwriteExistingFileWithModeX() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $this->assertFalse(@fopen($vfsFile, 'xb')); $this->assertEquals('test', file_get_contents($vfsFile)); } /** * @test * @group issue7 * @group issue13 */ public function canNotOpenNonExistingFileReadonly() { $this->assertFalse(@fopen(vfsStream::url('foo/doesNotExist.txt'), 'rb')); } /** * @test * @group issue7 * @group issue13 */ public function canNotOpenNonExistingFileReadAndWrite() { $this->assertFalse(@fopen(vfsStream::url('foo/doesNotExist.txt'), 'rb+')); } /** * @test * @group issue7 * @group issue13 */ public function canNotOpenWithIllegalMode() { $this->assertFalse(@fopen($this->baz2URL, 'invalid')); } /** * @test * @group issue7 * @group issue13 */ public function canNotWriteToReadOnlyFile() { $fp = fopen($this->baz2URL, 'rb'); $this->assertEquals('baz2', fread($fp, 4096)); $this->assertEquals(0, fwrite($fp, 'foo')); fclose($fp); $this->assertEquals('baz2', file_get_contents($this->baz2URL)); } /** * @test * @group issue7 * @group issue13 */ public function canNotReadFromWriteOnlyFileWithModeW() { $fp = fopen($this->baz2URL, 'wb'); $this->assertEquals('', fread($fp, 4096)); $this->assertEquals(3, fwrite($fp, 'foo')); fseek($fp, 0); $this->assertEquals('', fread($fp, 4096)); fclose($fp); $this->assertEquals('foo', file_get_contents($this->baz2URL)); } /** * @test * @group issue7 * @group issue13 */ public function canNotReadFromWriteOnlyFileWithModeA() { $fp = fopen($this->baz2URL, 'ab'); $this->assertEquals('', fread($fp, 4096)); $this->assertEquals(3, fwrite($fp, 'foo')); fseek($fp, 0); $this->assertEquals('', fread($fp, 4096)); fclose($fp); $this->assertEquals('baz2foo', file_get_contents($this->baz2URL)); } /** * @test * @group issue7 * @group issue13 */ public function canNotReadFromWriteOnlyFileWithModeX() { $vfsFile = vfsStream::url('foo/modeXtest.txt'); $fp = fopen($vfsFile, 'xb'); $this->assertEquals('', fread($fp, 4096)); $this->assertEquals(3, fwrite($fp, 'foo')); fseek($fp, 0); $this->assertEquals('', fread($fp, 4096)); fclose($fp); $this->assertEquals('foo', file_get_contents($vfsFile)); } /** * @test * @group permissions * @group bug_15 */ public function canNotRemoveFileFromDirectoryWithoutWritePermissions() { vfsStreamWrapper::register(); vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); vfsStream::newFile('new.txt')->at(vfsStreamWrapper::getRoot()); $this->assertFalse(unlink(vfsStream::url('root/new.txt'))); $this->assertTrue(file_exists(vfsStream::url('root/new.txt'))); } /** * @test * @group issue_30 */ public function truncatesFileWhenOpenedWithModeW() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $fp = fopen($vfsFile, 'wb'); $this->assertEquals('', file_get_contents($vfsFile)); fclose($fp); } /** * @test * @group issue_30 */ public function createsNonExistingFileWhenOpenedWithModeC() { $vfsFile = vfsStream::url('foo/tobecreated.txt'); $fp = fopen($vfsFile, 'cb'); fwrite($fp, 'some content'); $this->assertTrue($this->foo->hasChild('tobecreated.txt')); fclose($fp); $this->assertEquals('some content', file_get_contents($vfsFile)); } /** * @test * @group issue_30 */ public function createsNonExistingFileWhenOpenedWithModeCplus() { $vfsFile = vfsStream::url('foo/tobecreated.txt'); $fp = fopen($vfsFile, 'cb+'); fwrite($fp, 'some content'); $this->assertTrue($this->foo->hasChild('tobecreated.txt')); fclose($fp); $this->assertEquals('some content', file_get_contents($vfsFile)); } /** * @test * @group issue_30 */ public function doesNotTruncateFileWhenOpenedWithModeC() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $fp = fopen($vfsFile, 'cb'); $this->assertEquals('test', file_get_contents($vfsFile)); fclose($fp); } /** * @test * @group issue_30 */ public function setsPointerToStartWhenOpenedWithModeC() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $fp = fopen($vfsFile, 'cb'); $this->assertEquals(0, ftell($fp)); fclose($fp); } /** * @test * @group issue_30 */ public function doesNotTruncateFileWhenOpenedWithModeCplus() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $fp = fopen($vfsFile, 'cb+'); $this->assertEquals('test', file_get_contents($vfsFile)); fclose($fp); } /** * @test * @group issue_30 */ public function setsPointerToStartWhenOpenedWithModeCplus() { $vfsFile = vfsStream::url('foo/overwrite.txt'); file_put_contents($vfsFile, 'test'); $fp = fopen($vfsFile, 'cb+'); $this->assertEquals(0, ftell($fp)); fclose($fp); } /** * @test */ public function cannotOpenExistingNonwritableFileWithModeA() { $this->baz1->chmod(0400); $this->assertFalse(@fopen($this->baz1URL, 'a')); } /** * @test */ public function cannotOpenExistingNonwritableFileWithModeW() { $this->baz1->chmod(0400); $this->assertFalse(@fopen($this->baz1URL, 'w')); } /** * @test */ public function cannotOpenNonReadableFileWithModeR() { $this->baz1->chmod(0); $this->assertFalse(@fopen($this->baz1URL, 'r')); } /** * @test */ public function cannotRenameToNonWritableDir() { $this->bar->chmod(0); $this->assertFalse(@rename($this->baz2URL, vfsStream::url('foo/bar/baz3'))); } /** * @test * @group issue_38 */ public function cannotReadFileFromNonReadableDir() { $this->markTestSkipped("Issue #38."); $this->bar->chmod(0); $this->assertFalse(@file_get_contents($this->baz1URL)); } } dir = new vfsStreamDirectory('foo'); } /** * assure that a directory seperator inside the name throws an exception * * @test */ public function invalidCharacterInName() { $this->expectException(vfsStreamException::class); $dir = new vfsStreamDirectory('foo/bar'); } /** * test default values and methods * * @test */ public function defaultValues() { $this->assertEquals(vfsStreamContent::TYPE_DIR, $this->dir->getType()); $this->assertEquals('foo', $this->dir->getName()); $this->assertTrue($this->dir->appliesTo('foo')); $this->assertTrue($this->dir->appliesTo('foo/bar')); $this->assertFalse($this->dir->appliesTo('bar')); $this->assertEquals(array(), $this->dir->getChildren()); } /** * test renaming the directory * * @test */ public function rename() { $this->dir->rename('bar'); $this->assertEquals('bar', $this->dir->getName()); $this->assertFalse($this->dir->appliesTo('foo')); $this->assertFalse($this->dir->appliesTo('foo/bar')); $this->assertTrue($this->dir->appliesTo('bar')); } /** * renaming the directory to an invalid name throws a vfsStreamException * * @test */ public function renameToInvalidNameThrowsvfsStreamException() { $this->expectException(vfsStreamException::class); $this->dir->rename('foo/baz'); } /** * @test * @since 0.10.0 */ public function hasNoChildrenByDefault() { $this->assertFalse($this->dir->hasChildren()); } /** * @test * @since 0.10.0 */ public function hasChildrenReturnsTrueIfAtLeastOneChildPresent() { $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild->expects($this->any()) ->method('appliesTo') ->will($this->returnValue(false)); $mockChild->expects($this->any()) ->method('getName') ->will($this->returnValue('baz')); $this->dir->addChild($mockChild); $this->assertTrue($this->dir->hasChildren()); } /** * @test */ public function hasChildReturnsFalseForNonExistingChild() { $this->assertFalse($this->dir->hasChild('bar')); } /** * @test */ public function getChildReturnsNullForNonExistingChild() { $this->assertNull($this->dir->getChild('bar')); } /** * @test */ public function removeChildReturnsFalseForNonExistingChild() { $this->assertFalse($this->dir->removeChild('bar')); } /** * @test */ public function nonExistingChild() { $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild->expects($this->any()) ->method('appliesTo') ->will($this->returnValue(false)); $mockChild->expects($this->any()) ->method('getName') ->will($this->returnValue('baz')); $this->dir->addChild($mockChild); $this->assertFalse($this->dir->removeChild('bar')); } /** * test that adding, handling and removing of a child works as expected * * @test */ public function childHandling() { $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild->expects($this->any()) ->method('getType') ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); $mockChild->expects($this->any()) ->method('getName') ->will($this->returnValue('bar')); $mockChild->expects($this->any()) ->method('appliesTo') ->with($this->equalTo('bar')) ->will($this->returnValue(true)); $mockChild->expects($this->once()) ->method('size') ->will($this->returnValue(5)); $this->dir->addChild($mockChild); $this->assertTrue($this->dir->hasChild('bar')); $bar = $this->dir->getChild('bar'); $this->assertSame($mockChild, $bar); $this->assertEquals(array($mockChild), $this->dir->getChildren()); $this->assertEquals(0, $this->dir->size()); $this->assertEquals(5, $this->dir->sizeSummarized()); $this->assertTrue($this->dir->removeChild('bar')); $this->assertEquals(array(), $this->dir->getChildren()); $this->assertEquals(0, $this->dir->size()); $this->assertEquals(0, $this->dir->sizeSummarized()); } /** * test that adding, handling and removing of a child works as expected * * @test */ public function childHandlingWithSubdirectory() { $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild->expects($this->any()) ->method('getType') ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); $mockChild->expects($this->any()) ->method('getName') ->will($this->returnValue('bar')); $mockChild->expects($this->once()) ->method('size') ->will($this->returnValue(5)); $subdir = new vfsStreamDirectory('subdir'); $subdir->addChild($mockChild); $this->dir->addChild($subdir); $this->assertTrue($this->dir->hasChild('subdir')); $this->assertSame($subdir, $this->dir->getChild('subdir')); $this->assertEquals(array($subdir), $this->dir->getChildren()); $this->assertEquals(0, $this->dir->size()); $this->assertEquals(5, $this->dir->sizeSummarized()); $this->assertTrue($this->dir->removeChild('subdir')); $this->assertEquals(array(), $this->dir->getChildren()); $this->assertEquals(0, $this->dir->size()); $this->assertEquals(0, $this->dir->sizeSummarized()); } /** * dd * * @test * @group regression * @group bug_5 */ public function addChildReplacesChildWithSameName_Bug_5() { $mockChild1 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild1->expects($this->any()) ->method('getType') ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); $mockChild1->expects($this->any()) ->method('getName') ->will($this->returnValue('bar')); $mockChild2 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild2->expects($this->any()) ->method('getType') ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); $mockChild2->expects($this->any()) ->method('getName') ->will($this->returnValue('bar')); $this->dir->addChild($mockChild1); $this->assertTrue($this->dir->hasChild('bar')); $this->assertSame($mockChild1, $this->dir->getChild('bar')); $this->dir->addChild($mockChild2); $this->assertTrue($this->dir->hasChild('bar')); $this->assertSame($mockChild2, $this->dir->getChild('bar')); } /** * When testing for a nested path, verify that directory separators are respected properly * so that subdir1/subdir2 is not considered equal to subdir1Xsubdir2. * * @test * @group bug_24 * @group regression */ public function explicitTestForSeparatorWithNestedPaths_Bug_24() { $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockChild->expects($this->any()) ->method('getType') ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); $mockChild->expects($this->any()) ->method('getName') ->will($this->returnValue('bar')); $subdir1 = new vfsStreamDirectory('subdir1'); $this->dir->addChild($subdir1); $subdir2 = new vfsStreamDirectory('subdir2'); $subdir1->addChild($subdir2); $subdir2->addChild($mockChild); $this->assertTrue($this->dir->hasChild('subdir1'), "Level 1 path with separator exists"); $this->assertTrue($this->dir->hasChild('subdir1/subdir2'), "Level 2 path with separator exists"); $this->assertTrue($this->dir->hasChild('subdir1/subdir2/bar'), "Level 3 path with separator exists"); $this->assertFalse($this->dir->hasChild('subdir1.subdir2'), "Path with period does not exist"); $this->assertFalse($this->dir->hasChild('subdir1.subdir2/bar'), "Nested path with period does not exist"); } /** * setting and retrieving permissions for a directory * * @test * @group permissions */ public function permissions() { $this->assertEquals(0777, $this->dir->getPermissions()); $this->assertSame($this->dir, $this->dir->chmod(0755)); $this->assertEquals(0755, $this->dir->getPermissions()); } /** * setting and retrieving permissions for a directory * * @test * @group permissions */ public function permissionsSet() { $this->dir = new vfsStreamDirectory('foo', 0755); $this->assertEquals(0755, $this->dir->getPermissions()); $this->assertSame($this->dir, $this->dir->chmod(0700)); $this->assertEquals(0700, $this->dir->getPermissions()); } /** * setting and retrieving owner of a file * * @test * @group permissions */ public function owner() { $this->assertEquals(vfsStream::getCurrentUser(), $this->dir->getUser()); $this->assertTrue($this->dir->isOwnedByUser(vfsStream::getCurrentUser())); $this->assertSame($this->dir, $this->dir->chown(vfsStream::OWNER_USER_1)); $this->assertEquals(vfsStream::OWNER_USER_1, $this->dir->getUser()); $this->assertTrue($this->dir->isOwnedByUser(vfsStream::OWNER_USER_1)); } /** * setting and retrieving owner group of a file * * @test * @group permissions */ public function group() { $this->assertEquals(vfsStream::getCurrentGroup(), $this->dir->getGroup()); $this->assertTrue($this->dir->isOwnedByGroup(vfsStream::getCurrentGroup())); $this->assertSame($this->dir, $this->dir->chgrp(vfsStream::GROUP_USER_1)); $this->assertEquals(vfsStream::GROUP_USER_1, $this->dir->getGroup()); $this->assertTrue($this->dir->isOwnedByGroup(vfsStream::GROUP_USER_1)); } } backupIncludePath = get_include_path(); vfsStream::setup(); mkdir('vfs://root/a/path', 0777, true); set_include_path('vfs://root/a' . PATH_SEPARATOR . $this->backupIncludePath); } /** * clean up test environment */ public function tearDown(): void { set_include_path($this->backupIncludePath); } /** * @test */ public function knownFileCanBeResolved() { file_put_contents('vfs://root/a/path/knownFile.php', ''); $this->assertEquals('vfs://root/a/path/knownFile.php', stream_resolve_include_path('path/knownFile.php')); } /** * @test */ public function unknownFileCanNotBeResolvedYieldsFalse() { $this->assertFalse(@stream_resolve_include_path('path/unknownFile.php')); } } assertNotContains(vfsStream::SCHEME, stream_get_wrappers()); } /** * Unregistering a third party wrapper for vfs:// fails. * * @test * @runInSeparateProcess */ public function unregisterThirdPartyVfsScheme() { $this->expectException(vfsStreamException::class); // Unregister possible registered URL wrapper. vfsStreamWrapper::unregister(); $mock = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamWrapper'); stream_wrapper_register(vfsStream::SCHEME, get_class($mock)); vfsStreamWrapper::unregister(); } /** * Unregistering when not in registered state will fail. * * @test * @runInSeparateProcess */ public function unregisterWhenNotInRegisteredState() { $this->expectException(vfsStreamException::class); vfsStreamWrapper::register(); stream_wrapper_unregister(vfsStream::SCHEME); vfsStreamWrapper::unregister(); } /** * Unregistering while not registers won't fail. * * @test */ public function unregisterWhenNotRegistered() { // Unregister possible registered URL wrapper. vfsStreamWrapper::unregister(); $this->assertNotContains(vfsStream::SCHEME, stream_get_wrappers()); vfsStreamWrapper::unregister(); } } no directory to open * * @test */ public function canNotOpenDirectory() { $this->assertFalse(@dir(vfsStream::url('foo'))); } /** * can not unlink without root * * @test */ public function canNotUnlink() { $this->assertFalse(@unlink(vfsStream::url('foo'))); } /** * can not open a file without root * * @test */ public function canNotOpen() { $this->assertFalse(@fopen(vfsStream::url('foo'), 'r')); } /** * can not rename a file without root * * @test */ public function canNotRename() { $this->assertFalse(@rename(vfsStream::url('foo'), vfsStream::url('bar'))); } } array( 'schema.xsd' => ' ', ) ); vfsStream::setup('root', null, $structure); $doc = new \DOMDocument(); $this->assertTrue($doc->load(vfsStream::url('root/foo bar/schema.xsd'))); } /** * @test */ public function vfsStreamCanHandleUrlEncodedPath() { $content = ' '; $structure = array('foo bar' => array( 'schema.xsd' => $content, ) ); vfsStream::setup('root', null, $structure); $this->assertEquals( $content, file_get_contents(vfsStream::url('root/foo bar/schema.xsd')) ); } } at($root); } /** * This test verifies the current behaviour where vfsStream URLs do not work * with file_put_contents() and LOCK_EX. The test is intended to break once * PHP changes this so we get notified about the change. * * @test */ public function filePutContentsLockShouldReportError() { @file_put_contents(vfsStream::url('root/testfile'), "some string\n", LOCK_EX); $php_error = error_get_last(); $this->assertEquals("file_put_contents(): Exclusive locks may only be set for regular files", $php_error['message']); } /** * @test */ public function flockSouldPass() { $fp = fopen(vfsStream::url('root/testfile'), 'w'); flock($fp, LOCK_EX); fwrite($fp, "another string\n"); flock($fp, LOCK_UN); fclose($fp); $this->assertEquals("another string\n", file_get_contents(vfsStream::url('root/testfile'))); } } root = vfsStream::setup(); vfsStream::setQuota(10); } /** * @test */ public function writeLessThanQuotaWritesEverything() { $this->assertEquals(9, file_put_contents(vfsStream::url('root/file.txt'), '123456789')); $this->assertEquals('123456789', $this->root->getChild('file.txt')->getContent()); } /** * @test */ public function writeUpToQotaWritesEverything() { $this->assertEquals(10, file_put_contents(vfsStream::url('root/file.txt'), '1234567890')); $this->assertEquals('1234567890', $this->root->getChild('file.txt')->getContent()); } /** * @test */ public function writeMoreThanQotaWritesOnlyUpToQuota() { try { file_put_contents(vfsStream::url('root/file.txt'), '12345678901'); } catch (\PHPUnit_Framework_Error $e) { $this->assertEquals('file_put_contents(): Only 10 of 11 bytes written, possibly out of free disk space', $e->getMessage() ); } $this->assertEquals('1234567890', $this->root->getChild('file.txt')->getContent()); } /** * @test */ public function considersAllFilesForQuota() { vfsStream::newFile('foo.txt') ->withContent('foo') ->at(vfsStream::newDirectory('bar') ->at($this->root) ); try { file_put_contents(vfsStream::url('root/file.txt'), '12345678901'); } catch (\PHPUnit_Framework_Error $e) { $this->assertEquals('file_put_contents(): Only 7 of 11 bytes written, possibly out of free disk space', $e->getMessage() ); } $this->assertEquals('1234567', $this->root->getChild('file.txt')->getContent()); } /** * @test * @group issue_33 */ public function truncateToLessThanQuotaWritesEverything() { if (version_compare(PHP_VERSION, '5.4.0', '<')) { $this->markTestSkipped('Requires PHP 5.4'); } if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); $this->assertTrue(ftruncate($fp, 9)); fclose($fp); $this->assertEquals(9, $this->root->getChild('file.txt')->size() ); $this->assertEquals("\0\0\0\0\0\0\0\0\0", $this->root->getChild('file.txt')->getContent() ); } /** * @test * @group issue_33 */ public function truncateUpToQotaWritesEverything() { if (version_compare(PHP_VERSION, '5.4.0', '<')) { $this->markTestSkipped('Requires PHP 5.4'); } if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); $this->assertTrue(ftruncate($fp, 10)); fclose($fp); $this->assertEquals(10, $this->root->getChild('file.txt')->size() ); $this->assertEquals("\0\0\0\0\0\0\0\0\0\0", $this->root->getChild('file.txt')->getContent() ); } /** * @test * @group issue_33 */ public function truncateToMoreThanQotaWritesOnlyUpToQuota() { if (version_compare(PHP_VERSION, '5.4.0', '<')) { $this->markTestSkipped('Requires PHP 5.4'); } if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); $this->assertTrue(ftruncate($fp, 11)); fclose($fp); $this->assertEquals(10, $this->root->getChild('file.txt')->size() ); $this->assertEquals("\0\0\0\0\0\0\0\0\0\0", $this->root->getChild('file.txt')->getContent() ); } /** * @test * @group issue_33 */ public function truncateConsidersAllFilesForQuota() { if (version_compare(PHP_VERSION, '5.4.0', '<')) { $this->markTestSkipped('Requires PHP 5.4'); } if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } vfsStream::newFile('bar.txt') ->withContent('bar') ->at(vfsStream::newDirectory('bar') ->at($this->root) ); $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); $this->assertTrue(ftruncate($fp, 11)); fclose($fp); $this->assertEquals(7, $this->root->getChild('file.txt')->size() ); $this->assertEquals("\0\0\0\0\0\0\0", $this->root->getChild('file.txt')->getContent() ); } /** * @test * @group issue_33 */ public function canNotTruncateToGreaterLengthWhenDiscQuotaReached() { if (version_compare(PHP_VERSION, '5.4.0', '<')) { $this->markTestSkipped('Requires PHP 5.4'); } if (strstr(PHP_VERSION, 'hiphop') !== false) { $this->markTestSkipped('Not supported on hhvm'); } vfsStream::newFile('bar.txt') ->withContent('1234567890') ->at(vfsStream::newDirectory('bar') ->at($this->root) ); $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); $this->assertFalse(ftruncate($fp, 11)); fclose($fp); $this->assertEquals(0, $this->root->getChild('file.txt')->size() ); $this->assertEquals('', $this->root->getChild('file.txt')->getContent() ); } } abstractVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamAbstractVisitor', array('visitFile', 'visitDirectory') ); } /** * @test */ public function visitThrowsInvalidArgumentExceptionOnUnknownContentType() { $this->expectException(\InvalidArgumentException::class); $mockContent = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); $mockContent->expects($this->any()) ->method('getType') ->will($this->returnValue('invalid')); $this->assertSame($this->abstractVisitor, $this->abstractVisitor->visit($mockContent) ); } /** * @test */ public function visitWithFileCallsVisitFile() { $file = new vfsStreamFile('foo.txt'); $this->abstractVisitor->expects($this->once()) ->method('visitFile') ->with($this->equalTo($file)); $this->assertSame($this->abstractVisitor, $this->abstractVisitor->visit($file) ); } /** * tests that a block device eventually calls out to visit file * * @test */ public function visitWithBlockCallsVisitFile() { $block = new vfsStreamBlock('foo'); $this->abstractVisitor->expects($this->once()) ->method('visitFile') ->with($this->equalTo($block)); $this->assertSame($this->abstractVisitor, $this->abstractVisitor->visit($block) ); } /** * @test */ public function visitWithDirectoryCallsVisitDirectory() { $dir = new vfsStreamDirectory('bar'); $this->abstractVisitor->expects($this->once()) ->method('visitDirectory') ->with($this->equalTo($dir)); $this->assertSame($this->abstractVisitor, $this->abstractVisitor->visit($dir) ); } } expectException(\InvalidArgumentException::class); new vfsStreamPrintVisitor('invalid'); } /** * @test */ public function constructWithNonStreamResourceThrowsInvalidArgumentException() { $this->expectException(\InvalidArgumentException::class); new vfsStreamPrintVisitor(xml_parser_create()); } /** * @test */ public function visitFileWritesFileNameToStream() { $output = vfsStream::newFile('foo.txt') ->at(vfsStream::setup()); $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); $this->assertSame($printVisitor, $printVisitor->visitFile(vfsStream::newFile('bar.txt')) ); $this->assertEquals("- bar.txt\n", $output->getContent()); } /** * @test */ public function visitFileWritesBlockDeviceToStream() { $output = vfsStream::newFile('foo.txt') ->at(vfsStream::setup()); $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); $this->assertSame($printVisitor, $printVisitor->visitBlockDevice(vfsStream::newBlock('bar')) ); $this->assertEquals("- [bar]\n", $output->getContent()); } /** * @test */ public function visitDirectoryWritesDirectoryNameToStream() { $output = vfsStream::newFile('foo.txt') ->at(vfsStream::setup()); $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); $this->assertSame($printVisitor, $printVisitor->visitDirectory(vfsStream::newDirectory('baz')) ); $this->assertEquals("- baz\n", $output->getContent()); } /** * @test */ public function visitRecursiveDirectoryStructure() { $root = vfsStream::setup('root', null, array('test' => array('foo' => array('test.txt' => 'hello'), 'baz.txt' => 'world' ), 'foo.txt' => '' ) ); $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); $this->assertSame($printVisitor, $printVisitor->visitDirectory($root) ); $this->assertEquals("- root\n - test\n - foo\n - test.txt\n - baz.txt\n - foo.txt\n", file_get_contents('vfs://root/foo.txt')); } } assertEquals(array('foo.txt' => 'test'), $structureVisitor->visitFile(vfsStream::newFile('foo.txt') ->withContent('test') ) ->getStructure() ); } /** * @test */ public function visitFileCreatesStructureForBlock() { $structureVisitor = new vfsStreamStructureVisitor(); $this->assertEquals(array('[foo]' => 'test'), $structureVisitor->visitBlockDevice(vfsStream::newBlock('foo') ->withContent('test') ) ->getStructure() ); } /** * @test */ public function visitDirectoryCreatesStructureForDirectory() { $structureVisitor = new vfsStreamStructureVisitor(); $this->assertEquals(array('baz' => array()), $structureVisitor->visitDirectory(vfsStream::newDirectory('baz')) ->getStructure() ); } /** * @test */ public function visitRecursiveDirectoryStructure() { $root = vfsStream::setup('root', null, array('test' => array('foo' => array('test.txt' => 'hello'), 'baz.txt' => 'world' ), 'foo.txt' => '' ) ); $structureVisitor = new vfsStreamStructureVisitor(); $this->assertEquals(array('root' => array('test' => array('foo' => array('test.txt' => 'hello'), 'baz.txt' => 'world' ), 'foo.txt' => '' ), ), $structureVisitor->visitDirectory($root) ->getStructure() ); } } assertEquals(vfsStream::umask(), vfsStream::umask() ); $this->assertEquals(0000, vfsStream::umask() ); } /** * @test */ public function changingUmaskSettingReturnsOldUmaskSetting() { $this->assertEquals(0000, vfsStream::umask(0022) ); $this->assertEquals(0022, vfsStream::umask() ); } /** * @test */ public function createFileWithDefaultUmaskSetting() { $file = new vfsStreamFile('foo'); $this->assertEquals(0666, $file->getPermissions()); } /** * @test */ public function createFileWithDifferentUmaskSetting() { vfsStream::umask(0022); $file = new vfsStreamFile('foo'); $this->assertEquals(0644, $file->getPermissions()); } /** * @test */ public function createDirectoryWithDefaultUmaskSetting() { $directory = new vfsStreamDirectory('foo'); $this->assertEquals(0777, $directory->getPermissions()); } /** * @test */ public function createDirectoryWithDifferentUmaskSetting() { vfsStream::umask(0022); $directory = new vfsStreamDirectory('foo'); $this->assertEquals(0755, $directory->getPermissions()); } /** * @test */ public function createFileUsingStreamWithDefaultUmaskSetting() { $root = vfsStream::setup(); file_put_contents(vfsStream::url('root/newfile.txt'), 'file content'); $this->assertEquals(0666, $root->getChild('newfile.txt')->getPermissions()); } /** * @test */ public function createFileUsingStreamWithDifferentUmaskSetting() { $root = vfsStream::setup(); vfsStream::umask(0022); file_put_contents(vfsStream::url('root/newfile.txt'), 'file content'); $this->assertEquals(0644, $root->getChild('newfile.txt')->getPermissions()); } /** * @test */ public function createDirectoryUsingStreamWithDefaultUmaskSetting() { $root = vfsStream::setup(); mkdir(vfsStream::url('root/newdir')); $this->assertEquals(0777, $root->getChild('newdir')->getPermissions()); } /** * @test */ public function createDirectoryUsingStreamWithDifferentUmaskSetting() { $root = vfsStream::setup(); vfsStream::umask(0022); mkdir(vfsStream::url('root/newdir')); $this->assertEquals(0755, $root->getChild('newdir')->getPermissions()); } /** * @test */ public function createDirectoryUsingStreamWithExplicit0() { $root = vfsStream::setup(); vfsStream::umask(0022); mkdir(vfsStream::url('root/newdir'), 0000); $this->assertEquals(0000, $root->getChild('newdir')->getPermissions()); } /** * @test * */ public function createDirectoryUsingStreamWithDifferentUmaskSettingButExplicit0777() { $root = vfsStream::setup(); vfsStream::umask(0022); mkdir(vfsStream::url('root/newdir'), 0777); $this->assertEquals(0755, $root->getChild('newdir')->getPermissions()); } /** * @test */ public function createDirectoryUsingStreamWithDifferentUmaskSettingButExplicitModeRequestedByCall() { $root = vfsStream::setup(); vfsStream::umask(0022); mkdir(vfsStream::url('root/newdir'), 0700); $this->assertEquals(0700, $root->getChild('newdir')->getPermissions()); } /** * @test */ public function defaultUmaskSettingDoesNotInfluenceSetup() { $root = vfsStream::setup(); $this->assertEquals(0777, $root->getPermissions()); } /** * @test */ public function umaskSettingShouldBeRespectedBySetup() { vfsStream::umask(0022); $root = vfsStream::setup(); $this->assertEquals(0755, $root->getPermissions()); } } bc_getMock('org\\bovigo\\vfs\\vfsStreamWrapper'); stream_wrapper_register(vfsStream::SCHEME, get_class($mock)); } /** * clean up test environment */ public function tearDown(): void { TestvfsStreamWrapper::unregister(); } /** * registering the stream wrapper when another stream wrapper is already * registered for the vfs scheme should throw an exception * * @test */ public function registerOverAnotherStreamWrapper() { $this->expectException(vfsStreamException::class); vfsStreamWrapper::register(); } } stringBasedFileContent = new StringBasedFileContent('foobarbaz'); } /** * @test */ public function hasContentOriginallySet() { $this->assertEquals('foobarbaz', $this->stringBasedFileContent->content()); } /** * @test */ public function hasNotReachedEofAfterCreation() { $this->assertFalse($this->stringBasedFileContent->eof()); } /** * @test */ public function sizeEqualsLengthOfGivenString() { $this->assertEquals(9, $this->stringBasedFileContent->size()); } /** * @test */ public function readReturnsSubstringWithRequestedLength() { $this->assertEquals('foo', $this->stringBasedFileContent->read(3)); } /** * @test */ public function readMovesOffset() { $this->assertEquals('foo', $this->stringBasedFileContent->read(3)); $this->assertEquals('bar', $this->stringBasedFileContent->read(3)); $this->assertEquals('baz', $this->stringBasedFileContent->read(3)); } /** * @test */ public function reaMoreThanSizeReturnsWholeContent() { $this->assertEquals('foobarbaz', $this->stringBasedFileContent->read(10)); } /** * @test */ public function readAfterEndReturnsEmptyString() { // Read more than the length of the string to test substr() returning // false. $this->stringBasedFileContent->read(10); $this->assertSame('', $this->stringBasedFileContent->read(3)); } /** * @test */ public function readDoesNotChangeSize() { $this->stringBasedFileContent->read(3); $this->assertEquals(9, $this->stringBasedFileContent->size()); } /** * @test */ public function readLessThenSizeDoesNotReachEof() { $this->stringBasedFileContent->read(3); $this->assertFalse($this->stringBasedFileContent->eof()); } /** * @test */ public function readSizeReachesEof() { $this->stringBasedFileContent->read(9); $this->assertTrue($this->stringBasedFileContent->eof()); } /** * @test */ public function readMoreThanSizeReachesEof() { $this->stringBasedFileContent->read(10); $this->assertTrue($this->stringBasedFileContent->eof()); } /** * @test */ public function seekWithInvalidOptionReturnsFalse() { $this->assertFalse($this->stringBasedFileContent->seek(0, 55)); } /** * @test */ public function canSeekToGivenOffset() { $this->assertTrue($this->stringBasedFileContent->seek(5, SEEK_SET)); $this->assertEquals('rbaz', $this->stringBasedFileContent->read(10)); } /** * @test */ public function canSeekFromCurrentOffset() { $this->assertTrue($this->stringBasedFileContent->seek(5, SEEK_SET)); $this->assertTrue($this->stringBasedFileContent->seek(2, SEEK_CUR)); $this->assertEquals('az', $this->stringBasedFileContent->read(10)); } /** * @test */ public function canSeekToEnd() { $this->assertTrue($this->stringBasedFileContent->seek(0, SEEK_END)); $this->assertEquals('', $this->stringBasedFileContent->read(10)); } /** * @test */ public function writeOverwritesExistingContentWhenOffsetNotAtEof() { $this->assertEquals(3, $this->stringBasedFileContent->write('bar')); $this->assertEquals('barbarbaz', $this->stringBasedFileContent->content()); } /** * @test */ public function writeAppendsContentWhenOffsetAtEof() { $this->assertTrue($this->stringBasedFileContent->seek(0, SEEK_END)); $this->assertEquals(3, $this->stringBasedFileContent->write('bar')); $this->assertEquals('foobarbazbar', $this->stringBasedFileContent->content()); } /** * @test * @group issue_33 * @since 1.1.0 */ public function truncateRemovesSuperflouosContent() { $this->assertTrue($this->stringBasedFileContent->truncate(6)); $this->assertEquals('foobar', $this->stringBasedFileContent->content()); } /** * @test * @group issue_33 * @since 1.1.0 */ public function truncateDecreasesSize() { $this->assertTrue($this->stringBasedFileContent->truncate(6)); $this->assertEquals(6, $this->stringBasedFileContent->size()); } /** * @test * @group issue_33 * @since 1.1.0 */ public function truncateToGreaterSizeAddsZeroBytes() { $this->assertTrue($this->stringBasedFileContent->truncate(25)); $this->assertEquals( "foobarbaz\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", $this->stringBasedFileContent->content() ); } /** * @test * @group issue_33 * @since 1.1.0 */ public function truncateToGreaterSizeIncreasesSize() { $this->assertTrue($this->stringBasedFileContent->truncate(25)); $this->assertEquals(25, $this->stringBasedFileContent->size()); } } largeFileContent = new LargeFileContent(100); } /** * @test */ public function hasSizeOriginallyGiven() { $this->assertEquals(100, $this->largeFileContent->size()); } /** * @test */ public function contentIsFilledUpWithSpacesIfNoDataWritten() { $this->assertEquals( str_repeat(' ', 100), $this->largeFileContent->content() ); } /** * @test */ public function readReturnsSpacesWhenNothingWrittenAtOffset() { $this->assertEquals( str_repeat(' ', 10), $this->largeFileContent->read(10) ); } /** * @test */ public function readReturnsContentFilledWithSpaces() { $this->largeFileContent->write('foobarbaz'); $this->largeFileContent->seek(0, SEEK_SET); $this->assertEquals( 'foobarbaz ', $this->largeFileContent->read(10) ); } /** * @test */ public function writesDataAtStartWhenOffsetNotMoved() { $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals( 'foobarbaz' . str_repeat(' ', 91), $this->largeFileContent->content() ); } /** * @test */ public function writeDataAtStartDoesNotIncreaseSize() { $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals(100, $this->largeFileContent->size()); } /** * @test */ public function writesDataAtOffsetWhenOffsetMoved() { $this->largeFileContent->seek(50, SEEK_SET); $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals( str_repeat(' ', 50) . 'foobarbaz' . str_repeat(' ', 41), $this->largeFileContent->content() ); } /** * @test */ public function writeDataInBetweenDoesNotIncreaseSize() { $this->largeFileContent->seek(50, SEEK_SET); $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals(100, $this->largeFileContent->size()); } /** * @test */ public function writesDataOverEndWhenOffsetAndDataLengthLargerThanSize() { $this->largeFileContent->seek(95, SEEK_SET); $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals( str_repeat(' ', 95) . 'foobarbaz', $this->largeFileContent->content() ); } /** * @test */ public function writeDataOverLastOffsetIncreasesSize() { $this->largeFileContent->seek(95, SEEK_SET); $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals(104, $this->largeFileContent->size()); } /** * @test */ public function writesDataAfterEndWhenOffsetAfterEnd() { $this->largeFileContent->seek(0, SEEK_END); $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals( str_repeat(' ', 100) . 'foobarbaz', $this->largeFileContent->content() ); } /** * @test */ public function writeDataAfterLastOffsetIncreasesSize() { $this->largeFileContent->seek(0, SEEK_END); $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); $this->assertEquals(109, $this->largeFileContent->size()); } /** * @test */ public function truncateReducesSize() { $this->assertTrue($this->largeFileContent->truncate(50)); $this->assertEquals(50, $this->largeFileContent->size()); } /** * @test */ public function truncateRemovesWrittenContentAfterOffset() { $this->largeFileContent->seek(45, SEEK_SET); $this->largeFileContent->write('foobarbaz'); $this->assertTrue($this->largeFileContent->truncate(50)); $this->assertEquals( str_repeat(' ', 45) . 'fooba', $this->largeFileContent->content() ); } /** * @test */ public function createInstanceWithKilobytes() { $this->assertEquals( 100 * 1024, LargeFileContent::withKilobytes(100) ->size() ); } /** * @test */ public function createInstanceWithMegabytes() { $this->assertEquals( 100 * 1024 * 1024, LargeFileContent::withMegabytes(100) ->size() ); } /** * @test */ public function createInstanceWithGigabytes() { $this->assertEquals( 100 * 1024 * 1024 * 1024, LargeFileContent::withGigabytes(100) ->size() ); } } assertEmpty(glob(vfsStream::url('example'), GLOB_MARK)); } } root = vfsStream::setup(); } /** * @test */ public function fileCanBeAccessedUsingWinDirSeparator() { vfsStream::newFile('foo/bar/baz.txt') ->at($this->root) ->withContent('test'); $this->assertEquals('test', file_get_contents('vfs://root/foo\bar\baz.txt')); } /** * @test */ public function directoryCanBeCreatedUsingWinDirSeparator() { mkdir('vfs://root/dir\bar\foo', true, 0777); $this->assertTrue($this->root->hasChild('dir')); $this->assertTrue($this->root->getChild('dir')->hasChild('bar')); $this->assertTrue($this->root->getChild('dir/bar')->hasChild('foo')); } /** * @test */ public function directoryExitsTestUsingTrailingWinDirSeparator() { $structure = array( 'dir' => array( 'bar' => array( ) ) ); vfsStream::create($structure, $this->root); $this->assertTrue(file_exists(vfsStream::url('root/').'dir\\')); } } assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function executePermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0100); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function executePermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0010); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function executePermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0001); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function writePermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0200); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function writePermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0020); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function writePermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0002); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function executeAndWritePermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0300); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function executeAndWritePermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0030); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function executeAndWritePermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0003); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readPermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0400); $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readPermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0040); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readPermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0004); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readAndExecutePermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0500); $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readAndExecutePermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0050); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readAndExecutePermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0005); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readAndWritePermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0600); $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readAndWritePermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0060); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function readAndWritePermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0006); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function allPermissionsForUser() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0700); $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function allPermissionsForGroup() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0070); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, -1 ) ); } /** * @test * @group permissions * @group bug_15 */ public function allPermissionsForOther() { $abstractContent = new TestvfsStreamAbstractContent('foo', 0007); $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isReadable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isReadable(-1, -1 ) ); $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isWritable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isWritable(-1, -1 ) ); $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup() ) ); $this->assertFalse($abstractContent->isExecutable(-1, vfsStream::getCurrentGroup() ) ); $this->assertTrue($abstractContent->isExecutable(-1, -1 ) ); } } rootDirectory = vfsStream::newDirectory('/'); $this->rootDirectory->addChild(vfsStream::newDirectory('var/log/app')); } /** * Test: should save directory name as string internal * * @small */ public function testShouldSaveDirectoryNameAsStringInternal() { $dir = $this->rootDirectory->getChild('var/log/app'); $dir->addChild(vfsStream::newDirectory(80)); static::assertNotNull($this->rootDirectory->getChild('var/log/app/80')); } /** * Test: should rename directory name as string internal * * @small */ public function testShouldRenameDirectoryNameAsStringInternal() { $dir = $this->rootDirectory->getChild('var/log/app'); $dir->addChild(vfsStream::newDirectory(80)); $child = $this->rootDirectory->getChild('var/log/app/80'); $child->rename(90); static::assertNotNull($this->rootDirectory->getChild('var/log/app/90')); } } lastModified(50) ->lastAccessed(50) ->lastAttributeModified(50); $this->fooUrl = vfsStream::url('root/foo.txt'); $this->barUrl = vfsStream::url('root/bar'); $this->bazUrl = vfsStream::url('root/bar/baz.txt'); } /** * helper assertion for the tests * * @param string $url url to check * @param vfsStreamContent $content content to compare */ protected function assertFileTimesEqualStreamTimes($url, vfsStreamContent $content) { $this->assertEquals(filemtime($url), $content->filemtime()); $this->assertEquals(fileatime($url), $content->fileatime()); $this->assertEquals(filectime($url), $content->filectime()); } /** * @test * @group issue_7 * @group issue_26 */ public function openFileChangesAttributeTimeOnly() { $file = vfsStream::newFile('foo.txt') ->withContent('test') ->at(vfsStreamWrapper::getRoot()) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); fclose(fopen($this->fooUrl, 'rb')); $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl)); $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl)); $this->assertLessThanOrEqual(100, filemtime($this->fooUrl)); $this->assertEquals(100, filectime($this->fooUrl)); $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); } /** * @test * @group issue_7 * @group issue_26 */ public function fileGetContentsChangesAttributeTimeOnly() { $file = vfsStream::newFile('foo.txt') ->withContent('test') ->at(vfsStreamWrapper::getRoot()) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); file_get_contents($this->fooUrl); $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl)); $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl)); $this->assertLessThanOrEqual(100, filemtime($this->fooUrl)); $this->assertEquals(100, filectime($this->fooUrl)); $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); } /** * @test * @group issue_7 * @group issue_26 */ public function openFileWithTruncateChangesAttributeAndModificationTime() { $file = vfsStream::newFile('foo.txt') ->withContent('test') ->at(vfsStreamWrapper::getRoot()) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); fclose(fopen($this->fooUrl, 'wb')); $this->assertGreaterThan(time() - 2, filemtime($this->fooUrl)); $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl)); $this->assertLessThanOrEqual(time(), filemtime($this->fooUrl)); $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl)); $this->assertEquals(100, filectime($this->fooUrl)); $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); } /** * @test * @group issue_7 */ public function readFileChangesAccessTime() { $file = vfsStream::newFile('foo.txt') ->withContent('test') ->at(vfsStreamWrapper::getRoot()) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); $fp = fopen($this->fooUrl, 'rb'); $openTime = time(); sleep(2); fread($fp, 1024); fclose($fp); $this->assertLessThanOrEqual($openTime, filemtime($this->fooUrl)); $this->assertLessThanOrEqual($openTime + 3, fileatime($this->fooUrl)); $this->assertEquals(100, filectime($this->fooUrl)); $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); } /** * @test * @group issue_7 */ public function writeFileChangesModificationTime() { $file = vfsStream::newFile('foo.txt') ->at(vfsStreamWrapper::getRoot()) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); $fp = fopen($this->fooUrl, 'wb'); $openTime = time(); sleep(2); fwrite($fp, 'test'); fclose($fp); $this->assertLessThanOrEqual($openTime + 3, filemtime($this->fooUrl)); $this->assertLessThanOrEqual($openTime, fileatime($this->fooUrl)); $this->assertEquals(100, filectime($this->fooUrl)); $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); } /** * @test * @group issue_7 */ public function createNewFileSetsAllTimesToCurrentTime() { file_put_contents($this->fooUrl, 'test'); $this->assertLessThanOrEqual(time(), filemtime($this->fooUrl)); $this->assertEquals(fileatime($this->fooUrl), filectime($this->fooUrl)); $this->assertEquals(fileatime($this->fooUrl), filemtime($this->fooUrl)); $this->assertFileTimesEqualStreamTimes($this->fooUrl, vfsStreamWrapper::getRoot()->getChild('foo.txt')); } /** * @test * @group issue_7 */ public function createNewFileChangesAttributeAndModificationTimeOfContainingDirectory() { $dir = vfsStream::newDirectory('bar') ->at(vfsStreamWrapper::getRoot()) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); file_put_contents($this->bazUrl, 'test'); $this->assertLessThanOrEqual(time(), filemtime($this->barUrl)); $this->assertLessThanOrEqual(time(), filectime($this->barUrl)); $this->assertEquals(100, fileatime($this->barUrl)); $this->assertFileTimesEqualStreamTimes($this->barUrl, $dir); } /** * @test * @group issue_7 */ public function addNewFileNameWithLinkFunctionChangesAttributeTimeOfOriginalFile() { $this->markTestSkipped('Links are currently not supported by vfsStream.'); } /** * @test * @group issue_7 */ public function addNewFileNameWithLinkFunctionChangesAttributeAndModificationTimeOfDirectoryContainingLink() { $this->markTestSkipped('Links are currently not supported by vfsStream.'); } /** * @test * @group issue_7 */ public function removeFileChangesAttributeAndModificationTimeOfContainingDirectory() { $dir = vfsStream::newDirectory('bar') ->at(vfsStreamWrapper::getRoot()); $file = vfsStream::newFile('baz.txt') ->at($dir) ->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); $dir->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); unlink($this->bazUrl); $this->assertLessThanOrEqual(time(), filemtime($this->barUrl)); $this->assertLessThanOrEqual(time(), filectime($this->barUrl)); $this->assertEquals(100, fileatime($this->barUrl)); $this->assertFileTimesEqualStreamTimes($this->barUrl, $dir); } /** * @test * @group issue_7 */ public function renameFileChangesAttributeAndModificationTimeOfAffectedDirectories() { $target = vfsStream::newDirectory('target') ->at(vfsStreamWrapper::getRoot()) ->lastModified(200) ->lastAccessed(200) ->lastAttributeModified(200); $source = vfsStream::newDirectory('bar') ->at(vfsStreamWrapper::getRoot()); $file = vfsStream::newFile('baz.txt') ->at($source) ->lastModified(300) ->lastAccessed(300) ->lastAttributeModified(300); $source->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); rename($this->bazUrl, vfsStream::url('root/target/baz.txt')); $this->assertLessThanOrEqual(time(), filemtime($this->barUrl)); $this->assertLessThanOrEqual(time(), filectime($this->barUrl)); $this->assertEquals(100, fileatime($this->barUrl)); $this->assertFileTimesEqualStreamTimes($this->barUrl, $source); $this->assertLessThanOrEqual(time(), filemtime(vfsStream::url('root/target'))); $this->assertLessThanOrEqual(time(), filectime(vfsStream::url('root/target'))); $this->assertEquals(200, fileatime(vfsStream::url('root/target'))); $this->assertFileTimesEqualStreamTimes(vfsStream::url('root/target'), $target); } /** * @test * @group issue_7 */ public function renameFileDoesNotChangeFileTimesOfFileItself() { $target = vfsStream::newDirectory('target') ->at(vfsStreamWrapper::getRoot()) ->lastModified(200) ->lastAccessed(200) ->lastAttributeModified(200); $source = vfsStream::newDirectory('bar') ->at(vfsStreamWrapper::getRoot()); $file = vfsStream::newFile('baz.txt') ->at($source) ->lastModified(300) ->lastAccessed(300) ->lastAttributeModified(300); $source->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); rename($this->bazUrl, vfsStream::url('root/target/baz.txt')); $this->assertEquals(300, filemtime(vfsStream::url('root/target/baz.txt'))); $this->assertEquals(300, filectime(vfsStream::url('root/target/baz.txt'))); $this->assertEquals(300, fileatime(vfsStream::url('root/target/baz.txt'))); $this->assertFileTimesEqualStreamTimes(vfsStream::url('root/target/baz.txt'), $file); } /** * @test * @group issue_7 */ public function changeFileAttributesChangesAttributeTimeOfFileItself() { $this->markTestSkipped('Changing file attributes via stream wrapper for self-defined streams is not supported by PHP.'); } } fooURL = vfsStream::url('foo'); $this->barURL = vfsStream::url('foo/bar'); $this->baz1URL = vfsStream::url('foo/bar/baz1'); $this->baz2URL = vfsStream::url('foo/baz2'); $this->foo = new vfsStreamDirectory('foo'); $this->bar = new vfsStreamDirectory('bar'); $this->baz1 = vfsStream::newFile('baz1') ->lastModified(300) ->lastAccessed(300) ->lastAttributeModified(300) ->withContent('baz 1'); $this->baz2 = vfsStream::newFile('baz2') ->withContent('baz2') ->lastModified(400) ->lastAccessed(400) ->lastAttributeModified(400); $this->bar->addChild($this->baz1); $this->foo->addChild($this->bar); $this->foo->addChild($this->baz2); $this->foo->lastModified(100) ->lastAccessed(100) ->lastAttributeModified(100); $this->bar->lastModified(200) ->lastAccessed(100) ->lastAttributeModified(100); vfsStreamWrapper::register(); vfsStreamWrapper::setRoot($this->foo); } } assertEquals($expectedCount, $actualCount, 'Directory foo contains ' . $expectedCount . ' children, but got ' . $actualCount . ' children while iterating over directory contents' ); } /** * @param \Closure $dotFilesSwitch * @param string[] $expectedDirectories * @test * @dataProvider provideSwitchWithExpectations */ public function directoryIteration(\Closure $dotFilesSwitch, array $expectedDirectories) { $dotFilesSwitch(); $dir = dir($this->fooURL); $i = 0; while (false !== ($entry = $dir->read())) { $i++; $this->assertTrue(in_array($entry, $expectedDirectories)); } $this->assertDirectoryCount(count($expectedDirectories), $i); $dir->rewind(); $i = 0; while (false !== ($entry = $dir->read())) { $i++; $this->assertTrue(in_array($entry, $expectedDirectories)); } $this->assertDirectoryCount(count($expectedDirectories), $i); $dir->close(); } /** * @param \Closure $dotFilesSwitch * @param string[] $expectedDirectories * @test * @dataProvider provideSwitchWithExpectations */ public function directoryIterationWithDot(\Closure $dotFilesSwitch, array $expectedDirectories) { $dotFilesSwitch(); $dir = dir($this->fooURL . '/.'); $i = 0; while (false !== ($entry = $dir->read())) { $i++; $this->assertTrue(in_array($entry, $expectedDirectories)); } $this->assertDirectoryCount(count($expectedDirectories), $i); $dir->rewind(); $i = 0; while (false !== ($entry = $dir->read())) { $i++; $this->assertTrue(in_array($entry, $expectedDirectories)); } $this->assertDirectoryCount(count($expectedDirectories), $i); $dir->close(); } /** * assure that a directory iteration works as expected * * @param \Closure $dotFilesSwitch * @param string[] $expectedDirectories * @test * @dataProvider provideSwitchWithExpectations * @group regression * @group bug_2 */ public function directoryIterationWithOpenDir_Bug_2(\Closure $dotFilesSwitch, array $expectedDirectories) { $dotFilesSwitch(); $handle = opendir($this->fooURL); $i = 0; while (false !== ($entry = readdir($handle))) { $i++; $this->assertTrue(in_array($entry, $expectedDirectories)); } $this->assertDirectoryCount(count($expectedDirectories), $i); rewinddir($handle); $i = 0; while (false !== ($entry = readdir($handle))) { $i++; $this->assertTrue(in_array($entry, $expectedDirectories)); } $this->assertDirectoryCount(count($expectedDirectories), $i); closedir($handle); } /** * assure that a directory iteration works as expected * * @author Christoph Bloemer * @param \Closure $dotFilesSwitch * @param string[] $expectedDirectories * @test * @dataProvider provideSwitchWithExpectations * @group regression * @group bug_4 */ public function directoryIteration_Bug_4(\Closure $dotFilesSwitch, array $expectedDirectories) { $dotFilesSwitch(); $dir = $this->fooURL; $list1 = array(); if ($handle = opendir($dir)) { while (false !== ($listItem = readdir($handle))) { if ('.' != $listItem && '..' != $listItem) { if (is_file($dir . '/' . $listItem) === true) { $list1[] = 'File:[' . $listItem . ']'; } elseif (is_dir($dir . '/' . $listItem) === true) { $list1[] = 'Folder:[' . $listItem . ']'; } } } closedir($handle); } $list2 = array(); if ($handle = opendir($dir)) { while (false !== ($listItem = readdir($handle))) { if ('.' != $listItem && '..' != $listItem) { if (is_file($dir . '/' . $listItem) === true) { $list2[] = 'File:[' . $listItem . ']'; } elseif (is_dir($dir . '/' . $listItem) === true) { $list2[] = 'Folder:[' . $listItem . ']'; } } } closedir($handle); } $this->assertEquals($list1, $list2); $this->assertEquals(2, count($list1)); $this->assertEquals(2, count($list2)); } /** * assure that a directory iteration works as expected * * @param \Closure $dotFilesSwitch * @param string[] $expectedDirectories * @test * @dataProvider provideSwitchWithExpectations */ public function directoryIterationShouldBeIndependent(\Closure $dotFilesSwitch, array $expectedDirectories) { $dotFilesSwitch(); $list1 = array(); $list2 = array(); $handle1 = opendir($this->fooURL); if (false !== ($listItem = readdir($handle1))) { $list1[] = $listItem; } $handle2 = opendir($this->fooURL); if (false !== ($listItem = readdir($handle2))) { $list2[] = $listItem; } if (false !== ($listItem = readdir($handle1))) { $list1[] = $listItem; } if (false !== ($listItem = readdir($handle2))) { $list2[] = $listItem; } closedir($handle1); closedir($handle2); $this->assertEquals($list1, $list2); $this->assertEquals(2, count($list1)); $this->assertEquals(2, count($list2)); } /** * @test * @group issue_50 */ public function recursiveDirectoryIterationWithDotsEnabled() { vfsStream::enableDotfiles(); vfsStream::setup(); $structure = array( 'Core' => array( 'AbstractFactory' => array( 'test.php' => 'some text content', 'other.php' => 'Some more text content', 'Invalid.csv' => 'Something else', ), 'AnEmptyFolder' => array(), 'badlocation.php' => 'some bad content', ) ); $root = vfsStream::create($structure); $rootPath = vfsStream::url($root->getName()); $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath), \RecursiveIteratorIterator::CHILD_FIRST); $pathes = array(); foreach ($iterator as $fullFileName => $fileSPLObject) { $pathes[] = $fullFileName; } $this->assertEquals(array('vfs://root'.DIRECTORY_SEPARATOR.'.', 'vfs://root'.DIRECTORY_SEPARATOR.'..', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'.', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'..', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'.', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'..', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'test.php', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'other.php', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'Invalid.csv', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder'.DIRECTORY_SEPARATOR.'.', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder'.DIRECTORY_SEPARATOR.'..', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'badlocation.php', 'vfs://root'.DIRECTORY_SEPARATOR.'Core' ), $pathes ); } /** * @test * @group issue_50 */ public function recursiveDirectoryIterationWithDotsDisabled() { vfsStream::disableDotfiles(); vfsStream::setup(); $structure = array( 'Core' => array( 'AbstractFactory' => array( 'test.php' => 'some text content', 'other.php' => 'Some more text content', 'Invalid.csv' => 'Something else', ), 'AnEmptyFolder' => array(), 'badlocation.php' => 'some bad content', ) ); $root = vfsStream::create($structure); $rootPath = vfsStream::url($root->getName()); $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath), \RecursiveIteratorIterator::CHILD_FIRST); $pathes = array(); foreach ($iterator as $fullFileName => $fileSPLObject) { $pathes[] = $fullFileName; } $this->assertEquals(array('vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'test.php', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'other.php', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'Invalid.csv', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder', 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'badlocation.php', 'vfs://root'.DIRECTORY_SEPARATOR.'Core' ), $pathes ); } } quota = new Quota(10); } /** * @test */ public function unlimitedQuotaIsNotLimited() { $this->assertFalse(Quota::unlimited()->isLimited()); } /** * @test */ public function limitedQuotaIsLimited() { $this->assertTrue($this->quota->isLimited()); } /** * @test */ public function unlimitedQuotaHasAlwaysSpaceLeft() { $this->assertEquals(303, Quota::unlimited()->spaceLeft(303)); } /** * @test */ public function hasNoSpaceLeftWhenUsedSpaceIsLargerThanQuota() { $this->assertEquals(0, $this->quota->spaceLeft(11)); } /** * @test */ public function hasNoSpaceLeftWhenUsedSpaceIsEqualToQuota() { $this->assertEquals(0, $this->quota->spaceLeft(10)); } /** * @test */ public function hasSpaceLeftWhenUsedSpaceIsLowerThanQuota() { $this->assertEquals(1, $this->quota->spaceLeft(9)); } } array('test.file' => '')); $root = vfsStream::setup('root', null, $structure); $root->getChild('test_directory')->chmod(0777); $root->getChild('test_directory')->getChild('test.file')->chmod(0444); $this->assertTrue(@unlink(vfsStream::url('root/test_directory/test.file'))); } /** * @test * @group issue_51 */ public function canNotRemoveWritableFileFromNonWritableDirectory() { $structure = array('test_directory' => array('test.file' => '')); $root = vfsStream::setup('root', null, $structure); $root->getChild('test_directory')->chmod(0444); $root->getChild('test_directory')->getChild('test.file')->chmod(0777); $this->assertFalse(@unlink(vfsStream::url('root/test_directory/test.file'))); } /** * @test * @since 1.4.0 * @group issue_68 */ public function unlinkNonExistingFileTriggersError() { vfsStream::setup(); try { $this->assertFalse(unlink('vfs://root/foo.txt')); } catch (\PHPUnit_Framework_Error $fe) { $this->assertEquals('unlink(vfs://root/foo.txt): No such file or directory', $fe->getMessage()); } } } expectException($exception); } elseif (method_exists($this, 'setExpectedException')) { $this->setExpectedException($exception); } } // A BC hack to get handle the deprecation of this method in PHPUnit public function bc_getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false, $proxyTarget = null) { if (method_exists($this, "getMockBuilder")) { return $this ->getMockBuilder($originalClassName) ->setMethods($methods) ->getMock() ; } return parent::getMock($originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods, $proxyTarget); } } foofoobar--TEST-- Reproduce octal output from stream wrapper invocation See https://bugs.php.net/bug.php?id=71287 See https://github.com/mikey179/vfsStream/issues/120 --FILE-- --EXPECTF-- Warning: file_put_contents(): Only 7 of 9 bytes written, possibly out of free disk space in %s on line %dchildren = $children; if (vfsStream::useDotfiles()) { array_unshift($this->children, new DotDirectory('.'), new DotDirectory('..')); } reset($this->children); } /** * resets children pointer */ #[\ReturnTypeWillChange] public function rewind() { reset($this->children); } /** * returns the current child * * @return vfsStreamContent */ #[\ReturnTypeWillChange] public function current() { $child = current($this->children); if (false === $child) { return null; } return $child; } /** * returns the name of the current child * * @return string */ #[\ReturnTypeWillChange] public function key() { $child = current($this->children); if (false === $child) { return null; } return $child->getName(); } /** * iterates to next child */ #[\ReturnTypeWillChange] public function next() { next($this->children); } /** * checks if the current value is valid * * @return bool */ #[\ReturnTypeWillChange] public function valid() { return (false !== current($this->children)); } } name = "{$name}"; $time = time(); if (null === $permissions) { $permissions = $this->getDefaultPermissions() & ~vfsStream::umask(); } $this->lastAccessed = $time; $this->lastAttributeModified = $time; $this->lastModified = $time; $this->permissions = $permissions; $this->user = vfsStream::getCurrentUser(); $this->group = vfsStream::getCurrentGroup(); } /** * returns default permissions for concrete implementation * * @return int * @since 0.8.0 */ protected abstract function getDefaultPermissions(); /** * returns the file name of the content * * @return string */ public function getName() { return $this->name; } /** * renames the content * * @param string $newName */ public function rename($newName) { $this->name = "{$newName}"; } /** * checks whether the container can be applied to given name * * @param string $name * @return bool */ public function appliesTo($name) { if ($name === $this->name) { return true; } $segment_name = $this->name.'/'; return (strncmp($segment_name, $name, strlen($segment_name)) == 0); } /** * returns the type of the container * * @return int */ public function getType() { return $this->type; } /** * sets the last modification time of the stream content * * @param int $filemtime * @return $this */ public function lastModified($filemtime) { $this->lastModified = $filemtime; return $this; } /** * returns the last modification time of the stream content * * @return int */ public function filemtime() { return $this->lastModified; } /** * sets last access time of the stream content * * @param int $fileatime * @return $this * @since 0.9 */ public function lastAccessed($fileatime) { $this->lastAccessed = $fileatime; return $this; } /** * returns the last access time of the stream content * * @return int * @since 0.9 */ public function fileatime() { return $this->lastAccessed; } /** * sets the last attribute modification time of the stream content * * @param int $filectime * @return $this * @since 0.9 */ public function lastAttributeModified($filectime) { $this->lastAttributeModified = $filectime; return $this; } /** * returns the last attribute modification time of the stream content * * @return int * @since 0.9 */ public function filectime() { return $this->lastAttributeModified; } /** * adds content to given container * * @param vfsStreamContainer $container * @return $this */ public function at(vfsStreamContainer $container) { $container->addChild($this); return $this; } /** * change file mode to given permissions * * @param int $permissions * @return $this */ public function chmod($permissions) { $this->permissions = $permissions; $this->lastAttributeModified = time(); clearstatcache(); return $this; } /** * returns permissions * * @return int */ public function getPermissions() { return $this->permissions; } /** * checks whether content is readable * * @param int $user id of user to check for * @param int $group id of group to check for * @return bool */ public function isReadable($user, $group) { if ($this->user === $user) { $check = 0400; } elseif ($this->group === $group) { $check = 0040; } else { $check = 0004; } return (bool) ($this->permissions & $check); } /** * checks whether content is writable * * @param int $user id of user to check for * @param int $group id of group to check for * @return bool */ public function isWritable($user, $group) { if ($this->user === $user) { $check = 0200; } elseif ($this->group === $group) { $check = 0020; } else { $check = 0002; } return (bool) ($this->permissions & $check); } /** * checks whether content is executable * * @param int $user id of user to check for * @param int $group id of group to check for * @return bool */ public function isExecutable($user, $group) { if ($this->user === $user) { $check = 0100; } elseif ($this->group === $group) { $check = 0010; } else { $check = 0001; } return (bool) ($this->permissions & $check); } /** * change owner of file to given user * * @param int $user * @return $this */ public function chown($user) { $this->user = $user; $this->lastAttributeModified = time(); return $this; } /** * checks whether file is owned by given user * * @param int $user * @return bool */ public function isOwnedByUser($user) { return $this->user === $user; } /** * returns owner of file * * @return int */ public function getUser() { return $this->user; } /** * change owner group of file to given group * * @param int $group * @return $this */ public function chgrp($group) { $this->group = $group; $this->lastAttributeModified = time(); return $this; } /** * checks whether file is owned by group * * @param int $group * @return bool */ public function isOwnedByGroup($group) { return $this->group === $group; } /** * returns owner group of file * * @return int */ public function getGroup() { return $this->group; } /** * sets parent path * * @param string $parentPath * @internal only to be set by parent * @since 1.2.0 */ public function setParentPath($parentPath) { $this->parentPath = $parentPath; } /** * returns path to this content * * @return string * @since 1.2.0 */ public function path() { if (null === $this->parentPath) { return $this->name; } return $this->parentPath . '/' . $this->name; } /** * returns complete vfsStream url for this content * * @return string * @since 1.2.0 */ public function url() { return vfsStream::url($this->path()); } } * array('Core' = array('AbstractFactory' => array('test.php' => 'some text content', * 'other.php' => 'Some more text content', * 'Invalid.csv' => 'Something else', * ), * 'AnEmptyFolder' => array(), * 'badlocation.php' => 'some bad content', * ) * ) * * the resulting directory tree will look like this: *
     * root
     * \- Core
     *  |- badlocation.php
     *  |- AbstractFactory
     *  | |- test.php
     *  | |- other.php
     *  | \- Invalid.csv
     *  \- AnEmptyFolder
     * 
* Arrays will become directories with their key as directory name, and * strings becomes files with their key as file name and their value as file * content. * * @param string $rootDirName name of root directory * @param int $permissions file permissions of root directory * @param array $structure directory structure to add under root directory * @return \org\bovigo\vfs\vfsStreamDirectory * @since 0.7.0 * @see https://github.com/mikey179/vfsStream/issues/14 * @see https://github.com/mikey179/vfsStream/issues/20 */ public static function setup($rootDirName = 'root', $permissions = null, array $structure = array()) { vfsStreamWrapper::register(); return self::create($structure, vfsStreamWrapper::setRoot(self::newDirectory($rootDirName, $permissions))); } /** * creates vfsStream directory structure from an array and adds it to given base dir * * Assumed $structure contains an array like this: * * array('Core' = array('AbstractFactory' => array('test.php' => 'some text content', * 'other.php' => 'Some more text content', * 'Invalid.csv' => 'Something else', * ), * 'AnEmptyFolder' => array(), * 'badlocation.php' => 'some bad content', * ) * ) * * the resulting directory tree will look like this: *
     * baseDir
     * \- Core
     *  |- badlocation.php
     *  |- AbstractFactory
     *  | |- test.php
     *  | |- other.php
     *  | \- Invalid.csv
     *  \- AnEmptyFolder
     * 
* Arrays will become directories with their key as directory name, and * strings becomes files with their key as file name and their value as file * content. * * If no baseDir is given it will try to add the structure to the existing * root directory without replacing existing childs except those with equal * names. * * @param array $structure directory structure to add under root directory * @param vfsStreamDirectory $baseDir base directory to add structure to * @return vfsStreamDirectory * @throws \InvalidArgumentException * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/14 * @see https://github.com/mikey179/vfsStream/issues/20 */ public static function create(array $structure, ?vfsStreamDirectory $baseDir = null) { if (null === $baseDir) { $baseDir = vfsStreamWrapper::getRoot(); } if (null === $baseDir) { throw new \InvalidArgumentException('No baseDir given and no root directory set.'); } return self::addStructure($structure, $baseDir); } /** * helper method to create subdirectories recursively * * @param array $structure subdirectory structure to add * @param vfsStreamDirectory $baseDir directory to add the structure to * @return vfsStreamDirectory */ protected static function addStructure(array $structure, vfsStreamDirectory $baseDir) { foreach ($structure as $name => $data) { $name = (string) $name; if (is_array($data) === true) { self::addStructure($data, self::newDirectory($name)->at($baseDir)); } elseif (is_string($data) === true) { $matches = null; preg_match('/^\[(.*)\]$/', $name, $matches); if ($matches !== array()) { self::newBlock($matches[1])->withContent($data)->at($baseDir); } else { self::newFile($name)->withContent($data)->at($baseDir); } } elseif ($data instanceof FileContent) { self::newFile($name)->withContent($data)->at($baseDir); } elseif ($data instanceof vfsStreamFile) { $baseDir->addChild($data); } } return $baseDir; } /** * copies the file system structure from given path into the base dir * * If no baseDir is given it will try to add the structure to the existing * root directory without replacing existing childs except those with equal * names. * File permissions are copied as well. * Please note that file contents will only be copied if their file size * does not exceed the given $maxFileSize which defaults to 1024 KB. In case * the file is larger file content will be mocked, see * https://github.com/mikey179/vfsStream/wiki/MockingLargeFiles. * * @param string $path path to copy the structure from * @param vfsStreamDirectory $baseDir directory to add the structure to * @param int $maxFileSize maximum file size of files to copy content from * @return vfsStreamDirectory * @throws \InvalidArgumentException * @since 0.11.0 * @see https://github.com/mikey179/vfsStream/issues/4 */ public static function copyFromFileSystem($path, ?vfsStreamDirectory $baseDir = null, $maxFileSize = 1048576) { if (null === $baseDir) { $baseDir = vfsStreamWrapper::getRoot(); } if (null === $baseDir) { throw new \InvalidArgumentException('No baseDir given and no root directory set.'); } $dir = new \DirectoryIterator($path); foreach ($dir as $fileinfo) { switch (filetype($fileinfo->getPathname())) { case 'file': if ($fileinfo->getSize() <= $maxFileSize) { $content = file_get_contents($fileinfo->getPathname()); } else { $content = new LargeFileContent($fileinfo->getSize()); } self::newFile( $fileinfo->getFilename(), octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) ) ->withContent($content) ->at($baseDir); break; case 'dir': if (!$fileinfo->isDot()) { self::copyFromFileSystem( $fileinfo->getPathname(), self::newDirectory( $fileinfo->getFilename(), octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) )->at($baseDir), $maxFileSize ); } break; case 'block': self::newBlock( $fileinfo->getFilename(), octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) )->at($baseDir); break; } } return $baseDir; } /** * returns a new file with given name * * @param string $name name of file to create * @param int $permissions permissions of file to create * @return vfsStreamFile */ public static function newFile($name, $permissions = null) { return new vfsStreamFile($name, $permissions); } /** * returns a new directory with given name * * If the name contains slashes, a new directory structure will be created. * The returned directory will always be the parent directory of this * directory structure. * * @param string $name name of directory to create * @param int $permissions permissions of directory to create * @return vfsStreamDirectory */ public static function newDirectory($name, $permissions = null) { if ('/' === substr($name, 0, 1)) { $name = substr($name, 1); } $firstSlash = strpos($name, '/'); if (false === $firstSlash) { return new vfsStreamDirectory($name, $permissions); } $ownName = substr($name, 0, $firstSlash); $subDirs = substr($name, $firstSlash + 1); $directory = new vfsStreamDirectory($ownName, $permissions); if (is_string($subDirs) && strlen($subDirs) > 0) { self::newDirectory($subDirs, $permissions)->at($directory); } return $directory; } /** * returns a new block with the given name * * @param string $name name of the block device * @param int $permissions permissions of block to create * @return vfsStreamBlock */ public static function newBlock($name, $permissions = null) { return new vfsStreamBlock($name, $permissions); } /** * returns current user * * If the system does not support posix_getuid() the current user will be root (0). * * @return int */ public static function getCurrentUser() { return function_exists('posix_getuid') ? posix_getuid() : self::OWNER_ROOT; } /** * returns current group * * If the system does not support posix_getgid() the current group will be root (0). * * @return int */ public static function getCurrentGroup() { return function_exists('posix_getgid') ? posix_getgid() : self::GROUP_ROOT; } /** * use visitor to inspect a content structure * * If the given content is null it will fall back to use the current root * directory of the stream wrapper. * * Returns given visitor for method chaining comfort. * * @param vfsStreamVisitor $visitor the visitor who inspects * @param vfsStreamContent $content directory structure to inspect * @return vfsStreamVisitor * @throws \InvalidArgumentException * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/10 */ public static function inspect(vfsStreamVisitor $visitor, ?vfsStreamContent $content = null) { if (null !== $content) { return $visitor->visit($content); } $root = vfsStreamWrapper::getRoot(); if (null === $root) { throw new \InvalidArgumentException('No content given and no root directory set.'); } return $visitor->visitDirectory($root); } /** * sets quota to given amount of bytes * * @param int $bytes * @since 1.1.0 */ public static function setQuota($bytes) { vfsStreamWrapper::setQuota(new Quota($bytes)); } /** * checks if vfsStream lists dotfiles in directory listings * * @return bool * @since 1.3.0 */ public static function useDotfiles() { return self::$dotFiles; } /** * disable dotfiles in directory listings * * @since 1.3.0 */ public static function disableDotfiles() { self::$dotFiles = false; } /** * enable dotfiles in directory listings * * @since 1.3.0 */ public static function enableDotfiles() { self::$dotFiles = true; } } type = vfsStreamContent::TYPE_BLOCK; } } getName() === $path) { return self::$root; } if ($this->isInRoot($path) && self::$root->hasChild($path) === true) { return self::$root->getChild($path); } return null; } /** * helper method to detect whether given path is in root path * * @param string $path * @return bool */ private function isInRoot($path) { return substr($path, 0, strlen(self::$root->getName())) === self::$root->getName(); } /** * returns content for given path but only when it is of given type * * @param string $path * @param int $type * @return vfsStreamContent */ protected function getContentOfType($path, $type) { $content = $this->getContent($path); if (null !== $content && $content->getType() === $type) { return $content; } return null; } /** * splits path into its dirname and the basename * * @param string $path * @return string[] */ protected function splitPath($path) { $lastSlashPos = strrpos($path, '/'); if (false === $lastSlashPos) { return array('dirname' => '', 'basename' => $path); } return array('dirname' => substr($path, 0, $lastSlashPos), 'basename' => substr($path, $lastSlashPos + 1) ); } /** * helper method to resolve a path from /foo/bar/. to /foo/bar * * @param string $path * @return string */ protected function resolvePath($path) { $newPath = array(); foreach (explode('/', $path) as $pathPart) { if ('.' !== $pathPart) { if ('..' !== $pathPart) { $newPath[] = $pathPart; } elseif (count($newPath) > 1) { array_pop($newPath); } } } return implode('/', $newPath); } /** * open the stream * * @param string $path the path to open * @param string $mode mode for opening * @param string $options options for opening * @param string $opened_path full path that was actually opened * @return bool */ public function stream_open($path, $mode, $options, $opened_path) { $extended = ((strstr($mode, '+') !== false) ? (true) : (false)); $mode = str_replace(array('t', 'b', '+'), '', $mode); if (in_array($mode, array('r', 'w', 'a', 'x', 'c')) === false) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('Illegal mode ' . $mode . ', use r, w, a, x or c, flavoured with t, b and/or +', E_USER_WARNING); } return false; } $this->mode = $this->calculateMode($mode, $extended); $path = $this->resolvePath(vfsStream::path($path)); $this->content = $this->getContentOfType($path, vfsStreamContent::TYPE_FILE); if (null !== $this->content) { if (self::WRITE === $mode) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('File ' . $path . ' already exists, can not open with mode x', E_USER_WARNING); } return false; } if ( (self::TRUNCATE === $mode || self::APPEND === $mode) && $this->content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false ) { return false; } if (self::TRUNCATE === $mode) { $this->content->openWithTruncate(); } elseif (self::APPEND === $mode) { $this->content->openForAppend(); } else { if (!$this->content->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('Permission denied', E_USER_WARNING); } return false; } $this->content->open(); } return true; } $content = $this->createFile($path, $mode, $options); if (false === $content) { return false; } $this->content = $content; return true; } /** * creates a file at given path * * @param string $path the path to open * @param string $mode mode for opening * @param string $options options for opening * @return bool */ private function createFile($path, $mode = null, $options = null) { $names = $this->splitPath($path); if (empty($names['dirname']) === true) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('File ' . $names['basename'] . ' does not exist', E_USER_WARNING); } return false; } $dir = $this->getContentOfType($names['dirname'], vfsStreamContent::TYPE_DIR); if (null === $dir) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('Directory ' . $names['dirname'] . ' does not exist', E_USER_WARNING); } return false; } elseif ($dir->hasChild($names['basename']) === true) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('Directory ' . $names['dirname'] . ' already contains a director named ' . $names['basename'], E_USER_WARNING); } return false; } if (self::READ === $mode) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('Can not open non-existing file ' . $path . ' for reading', E_USER_WARNING); } return false; } if ($dir->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { trigger_error('Can not create new file in non-writable path ' . $names['dirname'], E_USER_WARNING); } return false; } return vfsStream::newFile($names['basename'])->at($dir); } /** * calculates the file mode * * @param string $mode opening mode: r, w, a or x * @param bool $extended true if + was set with opening mode * @return int */ protected function calculateMode($mode, $extended) { if (true === $extended) { return self::ALL; } if (self::READ === $mode) { return self::READONLY; } return self::WRITEONLY; } /** * closes the stream * * @see https://github.com/mikey179/vfsStream/issues/40 */ public function stream_close() { $this->content->lock($this, LOCK_UN); } /** * read the stream up to $count bytes * * @param int $count amount of bytes to read * @return string */ public function stream_read($count) { if (self::WRITEONLY === $this->mode) { return ''; } if ($this->content->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { return ''; } return $this->content->read($count); } /** * writes data into the stream * * @param string $data * @return int amount of bytes written */ public function stream_write($data) { if (self::READONLY === $this->mode) { return 0; } if ($this->content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { return 0; } if (self::$quota->isLimited()) { $data = substr($data, 0, self::$quota->spaceLeft(self::$root->sizeSummarized())); } return $this->content->write($data); } /** * truncates a file to a given length * * @param int $size length to truncate file to * @return bool * @since 1.1.0 */ public function stream_truncate($size) { if (self::READONLY === $this->mode) { return false; } if ($this->content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { return false; } if ($this->content->getType() !== vfsStreamContent::TYPE_FILE) { return false; } if (self::$quota->isLimited() && $this->content->size() < $size) { $maxSize = self::$quota->spaceLeft(self::$root->sizeSummarized()); if (0 === $maxSize) { return false; } if ($size > $maxSize) { $size = $maxSize; } } return $this->content->truncate($size); } /** * sets metadata like owner, user or permissions * * @param string $path * @param int $option * @param mixed $var * @return bool * @since 1.1.0 */ public function stream_metadata($path, $option, $var) { $path = $this->resolvePath(vfsStream::path($path)); $content = $this->getContent($path); switch ($option) { case STREAM_META_TOUCH: if (null === $content) { $content = $this->createFile($path, null, STREAM_REPORT_ERRORS); // file creation may not be allowed at provided path if (false === $content) { return false; } } $currentTime = time(); $content->lastModified(((isset($var[0])) ? ($var[0]) : ($currentTime))) ->lastAccessed(((isset($var[1])) ? ($var[1]) : ($currentTime))); return true; case STREAM_META_OWNER_NAME: return false; case STREAM_META_OWNER: if (null === $content) { return false; } return $this->doPermChange($path, $content, function() use ($content, $var) { $content->chown($var); } ); case STREAM_META_GROUP_NAME: return false; case STREAM_META_GROUP: if (null === $content) { return false; } return $this->doPermChange($path, $content, function() use ($content, $var) { $content->chgrp($var); } ); case STREAM_META_ACCESS: if (null === $content) { return false; } return $this->doPermChange($path, $content, function() use ($content, $var) { $content->chmod($var); } ); default: return false; } } /** * executes given permission change when necessary rights allow such a change * * @param string $path * @param vfsStreamAbstractContent $content * @param \Closure $change * @return bool */ private function doPermChange($path, vfsStreamAbstractContent $content, \Closure $change) { if (!$content->isOwnedByUser(vfsStream::getCurrentUser())) { return false; } if (self::$root->getName() !== $path) { $names = $this->splitPath($path); $parent = $this->getContent($names['dirname']); if (!$parent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { return false; } } $change(); return true; } /** * checks whether stream is at end of file * * @return bool */ public function stream_eof() { return $this->content->eof(); } /** * returns the current position of the stream * * @return int */ public function stream_tell() { return $this->content->getBytesRead(); } /** * seeks to the given offset * * @param int $offset * @param int $whence * @return bool */ public function stream_seek($offset, $whence) { return $this->content->seek($offset, $whence); } /** * flushes unstored data into storage * * @return bool */ public function stream_flush() { return true; } /** * returns status of stream * * @return array */ public function stream_stat() { $fileStat = array('dev' => 0, 'ino' => 0, 'mode' => $this->content->getType() | $this->content->getPermissions(), 'nlink' => 0, 'uid' => $this->content->getUser(), 'gid' => $this->content->getGroup(), 'rdev' => 0, 'size' => $this->content->size(), 'atime' => $this->content->fileatime(), 'mtime' => $this->content->filemtime(), 'ctime' => $this->content->filectime(), 'blksize' => -1, 'blocks' => -1 ); return array_merge(array_values($fileStat), $fileStat); } /** * retrieve the underlaying resource * * Please note that this method always returns false as there is no * underlaying resource to return. * * @param int $cast_as * @since 0.9.0 * @see https://github.com/mikey179/vfsStream/issues/3 * @return bool */ public function stream_cast($cast_as) { return false; } /** * set lock status for stream * * @param int $operation * @return bool * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/6 * @see https://github.com/mikey179/vfsStream/issues/31 * @see https://github.com/mikey179/vfsStream/issues/40 */ public function stream_lock($operation) { if ((LOCK_NB & $operation) == LOCK_NB) { $operation = $operation - LOCK_NB; } return $this->content->lock($this, $operation); } /** * sets options on the stream * * @param int $option key of option to set * @param int $arg1 * @param int $arg2 * @return bool * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/15 * @see http://www.php.net/manual/streamwrapper.stream-set-option.php */ public function stream_set_option($option, $arg1, $arg2) { switch ($option) { case STREAM_OPTION_BLOCKING: // break omitted case STREAM_OPTION_READ_TIMEOUT: // break omitted case STREAM_OPTION_WRITE_BUFFER: // break omitted default: // nothing to do here } return false; } /** * remove the data under the given path * * @param string $path * @return bool */ public function unlink($path) { $realPath = $this->resolvePath(vfsStream::path($path)); $content = $this->getContent($realPath); if (null === $content) { trigger_error('unlink(' . $path . '): No such file or directory', E_USER_WARNING); return false; } if ($content->getType() !== vfsStreamContent::TYPE_FILE) { trigger_error('unlink(' . $path . '): Operation not permitted', E_USER_WARNING); return false; } return $this->doUnlink($realPath); } /** * removes a path * * @param string $path * @return bool */ protected function doUnlink($path) { if (self::$root->getName() === $path) { // delete root? very brave. :) self::$root = null; clearstatcache(); return true; } $names = $this->splitPath($path); $content = $this->getContent($names['dirname']); if (!$content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { return false; } clearstatcache(); return $content->removeChild($names['basename']); } /** * rename from one path to another * * @param string $path_from * @param string $path_to * @return bool * @author Benoit Aubuchon */ public function rename($path_from, $path_to) { $srcRealPath = $this->resolvePath(vfsStream::path($path_from)); $dstRealPath = $this->resolvePath(vfsStream::path($path_to)); $srcContent = $this->getContent($srcRealPath); if (null == $srcContent) { trigger_error(' No such file or directory', E_USER_WARNING); return false; } $dstNames = $this->splitPath($dstRealPath); $dstParentContent = $this->getContent($dstNames['dirname']); if (null == $dstParentContent) { trigger_error('No such file or directory', E_USER_WARNING); return false; } if (!$dstParentContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { trigger_error('Permission denied', E_USER_WARNING); return false; } if ($dstParentContent->getType() !== vfsStreamContent::TYPE_DIR) { trigger_error('Target is not a directory', E_USER_WARNING); return false; } // remove old source first, so we can rename later // (renaming first would lead to not being able to remove the old path) if (!$this->doUnlink($srcRealPath)) { return false; } $dstContent = $srcContent; // Renaming the filename $dstContent->rename($dstNames['basename']); // Copying to the destination $dstParentContent->addChild($dstContent); return true; } /** * creates a new directory * * @param string $path * @param int $mode * @param int $options * @return bool */ public function mkdir($path, $mode, $options) { $umask = vfsStream::umask(); if (0 < $umask) { $permissions = $mode & ~$umask; } else { $permissions = $mode; } $path = $this->resolvePath(vfsStream::path($path)); if (null !== $this->getContent($path)) { trigger_error('mkdir(): Path vfs://' . $path . ' exists', E_USER_WARNING); return false; } if (null === self::$root) { self::$root = vfsStream::newDirectory($path, $permissions); return true; } $maxDepth = count(explode('/', $path)); $names = $this->splitPath($path); $newDirs = $names['basename']; $dir = null; $i = 0; while ($dir === null && $i < $maxDepth) { $dir = $this->getContent($names['dirname']); $names = $this->splitPath($names['dirname']); if (null == $dir) { $newDirs = $names['basename'] . '/' . $newDirs; } $i++; } if (null === $dir || $dir->getType() !== vfsStreamContent::TYPE_DIR || $dir->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { return false; } $recursive = ((STREAM_MKDIR_RECURSIVE & $options) !== 0) ? (true) : (false); if (strpos($newDirs, '/') !== false && false === $recursive) { return false; } vfsStream::newDirectory($newDirs, $permissions)->at($dir); return true; } /** * removes a directory * * @param string $path * @param int $options * @return bool * @todo consider $options with STREAM_MKDIR_RECURSIVE */ public function rmdir($path, $options) { $path = $this->resolvePath(vfsStream::path($path)); $child = $this->getContentOfType($path, vfsStreamContent::TYPE_DIR); if (null === $child) { return false; } // can only remove empty directories if (count($child->getChildren()) > 0) { return false; } if (self::$root->getName() === $path) { // delete root? very brave. :) self::$root = null; clearstatcache(); return true; } $names = $this->splitPath($path); $dir = $this->getContentOfType($names['dirname'], vfsStreamContent::TYPE_DIR); if ($dir->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { return false; } clearstatcache(); return $dir->removeChild($child->getName()); } /** * opens a directory * * @param string $path * @param int $options * @return bool */ public function dir_opendir($path, $options) { $path = $this->resolvePath(vfsStream::path($path)); $this->dir = $this->getContentOfType($path, vfsStreamContent::TYPE_DIR); if (null === $this->dir || $this->dir->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { return false; } $this->dirIterator = $this->dir->getIterator(); return true; } /** * reads directory contents * * @return string */ public function dir_readdir() { $dir = $this->dirIterator->current(); if (null === $dir) { return false; } $this->dirIterator->next(); return $dir->getName(); } /** * reset directory iteration * * @return bool */ public function dir_rewinddir() { return $this->dirIterator->rewind(); } /** * closes directory * * @return bool */ public function dir_closedir() { $this->dirIterator = null; return true; } /** * returns status of url * * @param string $path path of url to return status for * @param int $flags flags set by the stream API * @return array */ public function url_stat($path, $flags) { $content = $this->getContent($this->resolvePath(vfsStream::path($path))); if (null === $content) { if (($flags & STREAM_URL_STAT_QUIET) != STREAM_URL_STAT_QUIET) { trigger_error(' No such file or directory: ' . $path, E_USER_WARNING); } return false; } $fileStat = array('dev' => 0, 'ino' => 0, 'mode' => $content->getType() | $content->getPermissions(), 'nlink' => 0, 'uid' => $content->getUser(), 'gid' => $content->getGroup(), 'rdev' => 0, 'size' => $content->size(), 'atime' => $content->fileatime(), 'mtime' => $content->filemtime(), 'ctime' => $content->filectime(), 'blksize' => -1, 'blocks' => -1 ); return array_merge(array_values($fileStat), $fileStat); } } out = $out; $this->depth = 0; } /** * visit a file and process it * * @param vfsStreamFile $file * @return vfsStreamPrintVisitor */ public function visitFile(vfsStreamFile $file) { $this->printContent($file->getName()); return $this; } /** * visit a block device and process it * * @param vfsStreamBlock $block * @return vfsStreamPrintVisitor */ public function visitBlockDevice(vfsStreamBlock $block) { $name = '[' . $block->getName() . ']'; $this->printContent($name); return $this; } /** * visit a directory and process it * * @param vfsStreamDirectory $dir * @return vfsStreamPrintVisitor */ public function visitDirectory(vfsStreamDirectory $dir) { $this->printContent($dir->getName()); $this->depth++; foreach ($dir as $child) { $this->visit($child); } $this->depth--; return $this; } /** * helper method to print the content * * @param string $name */ protected function printContent($name) { fwrite($this->out, str_repeat(' ', $this->depth) . '- ' . $name . "\n"); } } reset(); } /** * visit a file and process it * * @param vfsStreamFile $file * @return vfsStreamStructureVisitor */ public function visitFile(vfsStreamFile $file) { $this->current[$file->getName()] = $file->getContent(); return $this; } /** * visit a block device and process it * * @param vfsStreamBlock $block * @return vfsStreamStructureVisitor */ public function visitBlockDevice(vfsStreamBlock $block) { $this->current['[' . $block->getName() . ']'] = $block->getContent(); return $this; } /** * visit a directory and process it * * @param vfsStreamDirectory $dir * @return vfsStreamStructureVisitor */ public function visitDirectory(vfsStreamDirectory $dir) { $this->current[$dir->getName()] = array(); $tmp =& $this->current; $this->current =& $tmp[$dir->getName()]; foreach ($dir as $child) { $this->visit($child); } $this->current =& $tmp; return $this; } /** * returns structure of visited contents * * @return array * @api */ public function getStructure() { return $this->structure; } /** * resets structure so visitor could be reused * * @return vfsStreamStructureVisitor */ public function reset() { $this->structure = array(); $this->current =& $this->structure; return $this; } } getType()) { case vfsStreamContent::TYPE_BLOCK: $this->visitBlockDevice($content); break; case vfsStreamContent::TYPE_FILE: $this->visitFile($content); break; case vfsStreamContent::TYPE_DIR: if (!$content->isDot()) { $this->visitDirectory($content); } break; default: throw new \InvalidArgumentException('Unknown content type ' . $content->getType() . ' for ' . $content->getName()); } return $this; } /** * visit a block device and process it * * @param vfsStreamBlock $block * @return vfsStreamVisitor */ public function visitBlockDevice(vfsStreamBlock $block) { return $this->visitFile($block); } } content = $content; } /** * returns actual content * * @return string */ public function content() { return $this->content; } /** * returns size of content * * @return int */ public function size() { return strlen($this->content); } /** * actual reading of length starting at given offset * * @param int $offset * @param int $count */ protected function doRead($offset, $count) { return (string) substr($this->content, $offset, $count); } /** * actual writing of data with specified length at given offset * * @param string $data * @param int $offset * @param int $length */ protected function doWrite($data, $offset, $length) { $this->content = substr($this->content, 0, $offset) . $data . substr($this->content, $offset + $length); } /** * Truncates a file to a given length * * @param int $size length to truncate file to * @return bool */ public function truncate($size) { if ($size > $this->size()) { // Pad with null-chars if we're "truncating up" $this->content .= str_repeat("\0", $size - $this->size()); } else { $this->content = substr($this->content, 0, $size); } return true; } } size = $size; } /** * create large file with given size in kilobyte * * @param int $kilobyte * @return LargeFileContent */ public static function withKilobytes($kilobyte) { return new self($kilobyte * 1024); } /** * create large file with given size in megabyte * * @param int $megabyte * @return LargeFileContent */ public static function withMegabytes($megabyte) { return self::withKilobytes($megabyte * 1024); } /** * create large file with given size in gigabyte * * @param int $gigabyte * @return LargeFileContent */ public static function withGigabytes($gigabyte) { return self::withMegabytes($gigabyte * 1024); } /** * returns actual content * * @return string */ public function content() { return $this->doRead(0, $this->size); } /** * returns size of content * * @return int */ public function size() { return $this->size; } /** * actual reading of given byte count starting at given offset * * @param int $offset * @param int $count */ protected function doRead($offset, $count) { if (($offset + $count) > $this->size) { $count = $this->size - $offset; } $result = ''; for ($i = 0; $i < $count; $i++) { if (isset($this->content[$i + $offset])) { $result .= $this->content[$i + $offset]; } else { $result .= ' '; } } return $result; } /** * actual writing of data with specified length at given offset * * @param string $data * @param int $offset * @param int $length */ protected function doWrite($data, $offset, $length) { for ($i = 0; $i < $length; $i++) { $this->content[$i + $offset] = substr($data, $i, 1); } if ($offset >= $this->size) { $this->size += $length; } elseif (($offset + $length) > $this->size) { $this->size = $offset + $length; } } /** * Truncates a file to a given length * * @param int $size length to truncate file to * @return bool */ public function truncate($size) { $this->size = $size; foreach (array_filter(array_keys($this->content), function($pos) use ($size) { return $pos >= $size; } ) as $removePos) { unset($this->content[$removePos]); } return true; } } doRead($this->offset, $count); $this->offset += $count; return $data; } /** * actual reading of given byte count starting at given offset * * @param int $offset * @param int $count */ protected abstract function doRead($offset, $count); /** * seeks to the given offset * * @param int $offset * @param int $whence * @return bool */ public function seek($offset, $whence) { $newOffset = $this->offset; switch ($whence) { case SEEK_CUR: $newOffset += $offset; break; case SEEK_END: $newOffset = $this->size() + $offset; break; case SEEK_SET: $newOffset = $offset; break; default: return false; } if ($newOffset<0) { return false; } $this->offset = $newOffset; return true; } /** * checks whether pointer is at end of file * * @return bool */ public function eof() { return $this->size() <= $this->offset; } /** * writes an amount of data * * @param string $data * @return int amount of written bytes */ public function write($data) { $dataLength = strlen($data); $this->doWrite($data, $this->offset, $dataLength); $this->offset += $dataLength; return $dataLength; } /** * actual writing of data with specified length at given offset * * @param string $data * @param int $offset * @param int $length */ protected abstract function doWrite($data, $offset, $length); /** * for backwards compatibility with vfsStreamFile::bytesRead() * * @return int * @deprecated */ public function bytesRead() { return $this->offset; } /** * for backwards compatibility with vfsStreamFile::readUntilEnd() * * @return string * @deprecated */ public function readUntilEnd() { return substr($this->content(), $this->offset); } } type = vfsStreamContent::TYPE_DIR; parent::__construct($name, $permissions); } /** * returns default permissions for concrete implementation * * @return int * @since 0.8.0 */ protected function getDefaultPermissions() { return 0777; } /** * returns size of directory * * The size of a directory is always 0 bytes. To calculate the summarized * size of all children in the directory use sizeSummarized(). * * @return int */ public function size() { return 0; } /** * returns summarized size of directory and its children * * @return int */ public function sizeSummarized() { $size = 0; foreach ($this->children as $child) { if ($child->getType() === vfsStreamContent::TYPE_DIR) { $size += $child->sizeSummarized(); } else { $size += $child->size(); } } return $size; } /** * renames the content * * @param string $newName * @throws vfsStreamException */ public function rename($newName) { if (strstr($newName, '/') !== false) { throw new vfsStreamException('Directory name can not contain /.'); } parent::rename($newName); } /** * sets parent path * * @param string $parentPath * @internal only to be set by parent * @since 1.2.0 */ public function setParentPath($parentPath) { parent::setParentPath($parentPath); foreach ($this->children as $child) { $child->setParentPath($this->path()); } } /** * adds child to the directory * * @param vfsStreamContent $child */ public function addChild(vfsStreamContent $child) { $child->setParentPath($this->path()); $this->children[$child->getName()] = $child; $this->updateModifications(); } /** * removes child from the directory * * @param string $name * @return bool */ public function removeChild($name) { foreach ($this->children as $key => $child) { if ($child->appliesTo($name)) { $child->setParentPath(null); unset($this->children[$key]); $this->updateModifications(); return true; } } return false; } /** * updates internal timestamps */ protected function updateModifications() { $time = time(); $this->lastAttributeModified = $time; $this->lastModified = $time; } /** * checks whether the container contains a child with the given name * * @param string $name * @return bool */ public function hasChild($name) { return ($this->getChild($name) !== null); } /** * returns the child with the given name * * @param string $name * @return vfsStreamContent */ public function getChild($name) { $childName = $this->getRealChildName($name); foreach ($this->children as $child) { if ($child->getName() === $childName) { return $child; } if ($child->appliesTo($childName) === true && $child->hasChild($childName) === true) { return $child->getChild($childName); } } return null; } /** * helper method to detect the real child name * * @param string $name * @return string */ protected function getRealChildName($name) { if ($this->appliesTo($name) === true) { return self::getChildName($name, $this->name); } return $name; } /** * helper method to calculate the child name * * @param string $name * @param string $ownName * @return string */ protected static function getChildName($name, $ownName) { if ($name === $ownName) { return $name; } return substr($name, strlen($ownName) + 1); } /** * checks whether directory contains any children * * @return bool * @since 0.10.0 */ public function hasChildren() { return (count($this->children) > 0); } /** * returns a list of children for this directory * * @return vfsStreamContent[] */ public function getChildren() { return array_values($this->children); } /** * returns iterator for the children * * @return vfsStreamContainerIterator */ #[\ReturnTypeWillChange] public function getIterator() { return new vfsStreamContainerIterator($this->children); } /** * checks whether dir is a dot dir * * @return bool */ public function isDot() { if ('.' === $this->name || '..' === $this->name) { return true; } return false; } } amount = $amount; } /** * create with unlimited space * * @return Quota */ public static function unlimited() { return new self(self::UNLIMITED); } /** * checks if a quota is set * * @return bool */ public function isLimited() { return self::UNLIMITED < $this->amount; } /** * checks if given used space exceeda quota limit * * * @param int $usedSpace * @return int */ public function spaceLeft($usedSpace) { if (self::UNLIMITED === $this->amount) { return $usedSpace; } if ($usedSpace >= $this->amount) { return 0; } $spaceLeft = $this->amount - $usedSpace; if (0 >= $spaceLeft) { return 0; } return $spaceLeft; } } content = new StringBasedFileContent(''); $this->type = vfsStreamContent::TYPE_FILE; parent::__construct($name, $permissions); } /** * returns default permissions for concrete implementation * * @return int * @since 0.8.0 */ protected function getDefaultPermissions() { return 0666; } /** * checks whether the container can be applied to given name * * @param string $name * @return bool */ public function appliesTo($name) { return ($name === $this->name); } /** * alias for withContent() * * @param string $content * @return vfsStreamFile * @see withContent() */ public function setContent($content) { return $this->withContent($content); } /** * sets the contents of the file * * Setting content with this method does not change the time when the file * was last modified. * * @param string]FileContent $content * @return vfsStreamFile * @throws \InvalidArgumentException */ public function withContent($content) { if (is_string($content)) { $this->content = new StringBasedFileContent($content); } elseif ($content instanceof FileContent) { $this->content = $content; } else { throw new \InvalidArgumentException('Given content must either be a string or an instance of org\bovigo\vfs\content\FileContent'); } return $this; } /** * returns the contents of the file * * Getting content does not change the time when the file * was last accessed. * * @return string */ public function getContent() { return $this->content->content(); } /** * simply open the file * * @since 0.9 */ public function open() { $this->content->seek(0, SEEK_SET); $this->lastAccessed = time(); } /** * open file and set pointer to end of file * * @since 0.9 */ public function openForAppend() { $this->content->seek(0, SEEK_END); $this->lastAccessed = time(); } /** * open file and truncate content * * @since 0.9 */ public function openWithTruncate() { $this->open(); $this->content->truncate(0); $time = time(); $this->lastAccessed = $time; $this->lastModified = $time; } /** * reads the given amount of bytes from content * * Using this method changes the time when the file was last accessed. * * @param int $count * @return string */ public function read($count) { $this->lastAccessed = time(); return $this->content->read($count); } /** * returns the content until its end from current offset * * Using this method changes the time when the file was last accessed. * * @return string * @deprecated since 1.3.0 */ public function readUntilEnd() { $this->lastAccessed = time(); return $this->content->readUntilEnd(); } /** * writes an amount of data * * Using this method changes the time when the file was last modified. * * @param string $data * @return int amount of written bytes */ public function write($data) { $this->lastModified = time(); return $this->content->write($data); } /** * Truncates a file to a given length * * @param int $size length to truncate file to * @return bool * @since 1.1.0 */ public function truncate($size) { $this->content->truncate($size); $this->lastModified = time(); return true; } /** * checks whether pointer is at end of file * * @return bool */ public function eof() { return $this->content->eof(); } /** * returns the current position within the file * * @return int * @deprecated since 1.3.0 */ public function getBytesRead() { return $this->content->bytesRead(); } /** * seeks to the given offset * * @param int $offset * @param int $whence * @return bool */ public function seek($offset, $whence) { return $this->content->seek($offset, $whence); } /** * returns size of content * * @return int */ public function size() { return $this->content->size(); } /** * locks file for * * @param resource|vfsStreamWrapper $resource * @param int $operation * @return bool * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/6 * @see https://github.com/mikey179/vfsStream/issues/40 */ public function lock($resource, $operation) { if ((LOCK_NB & $operation) == LOCK_NB) { $operation = $operation - LOCK_NB; } // call to lock file on the same file handler firstly releases the lock $this->unlock($resource); if (LOCK_EX === $operation) { if ($this->isLocked()) { return false; } $this->setExclusiveLock($resource); } elseif(LOCK_SH === $operation) { if ($this->hasExclusiveLock()) { return false; } $this->addSharedLock($resource); } return true; } /** * Removes lock from file acquired by given resource * * @param resource|vfsStreamWrapper $resource * @see https://github.com/mikey179/vfsStream/issues/40 */ public function unlock($resource) { if ($this->hasExclusiveLock($resource)) { $this->exclusiveLock = null; } if ($this->hasSharedLock($resource)) { unset($this->sharedLock[$this->getResourceId($resource)]); } } /** * Set exlusive lock on file by given resource * * @param resource|vfsStreamWrapper $resource * @see https://github.com/mikey179/vfsStream/issues/40 */ protected function setExclusiveLock($resource) { $this->exclusiveLock = $this->getResourceId($resource); } /** * Add shared lock on file by given resource * * @param resource|vfsStreamWrapper $resource * @see https://github.com/mikey179/vfsStream/issues/40 */ protected function addSharedLock($resource) { $this->sharedLock[$this->getResourceId($resource)] = true; } /** * checks whether file is locked * * @param resource|vfsStreamWrapper $resource * @return bool * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/6 * @see https://github.com/mikey179/vfsStream/issues/40 */ public function isLocked($resource = null) { return $this->hasSharedLock($resource) || $this->hasExclusiveLock($resource); } /** * checks whether file is locked in shared mode * * @param resource|vfsStreamWrapper $resource * @return bool * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/6 * @see https://github.com/mikey179/vfsStream/issues/40 */ public function hasSharedLock($resource = null) { if (null !== $resource) { return isset($this->sharedLock[$this->getResourceId($resource)]); } return !empty($this->sharedLock); } /** * Returns unique resource id * * @param resource|vfsStreamWrapper $resource * @return string * @see https://github.com/mikey179/vfsStream/issues/40 */ public function getResourceId($resource) { if (is_resource($resource)) { $data = stream_get_meta_data($resource); $resource = $data['wrapper_data']; } return spl_object_hash($resource); } /** * checks whether file is locked in exclusive mode * * @param resource|vfsStreamWrapper $resource * @return bool * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/6 * @see https://github.com/mikey179/vfsStream/issues/40 */ public function hasExclusiveLock($resource = null) { if (null !== $resource) { return $this->exclusiveLock === $this->getResourceId($resource); } return null !== $this->exclusiveLock; } } =3 <3.2.2" }, "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" }, "files": [ "src/DeepCopy/deep_copy.php" ] }, "autoload-dev": { "psr-4": { "DeepCopyTest\\": "tests/DeepCopyTest/", "DeepCopy\\": "fixtures/" } }, "config": { "sort-packages": true } } # DeepCopy DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. [![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) [![Integrate](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml/badge.svg?branch=1.x)](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml) ## Table of Contents 1. [How](#how) 1. [Why](#why) 1. [Using simply `clone`](#using-simply-clone) 1. [Overriding `__clone()`](#overriding-__clone) 1. [With `DeepCopy`](#with-deepcopy) 1. [How it works](#how-it-works) 1. [Going further](#going-further) 1. [Matchers](#matchers) 1. [Property name](#property-name) 1. [Specific property](#specific-property) 1. [Type](#type) 1. [Filters](#filters) 1. [`SetNullFilter`](#setnullfilter-filter) 1. [`KeepFilter`](#keepfilter-filter) 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) 1. [`ReplaceFilter`](#replacefilter-type-filter) 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) 1. [Edge cases](#edge-cases) 1. [Contributing](#contributing) 1. [Tests](#tests) ## How? Install with Composer: ``` composer require myclabs/deep-copy ``` Use it: ```php use DeepCopy\DeepCopy; $copier = new DeepCopy(); $myCopy = $copier->copy($myObject); ``` ## Why? - How do you create copies of your objects? ```php $myCopy = clone $myObject; ``` - How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior yourself. - But how do you handle **cycles** in the association graph? Now you're in for a big mess :( ![association graph](doc/graph.png) ### Using simply `clone` ![Using clone](doc/clone.png) ### Overriding `__clone()` ![Overriding __clone](doc/deep-clone.png) ### With `DeepCopy` ![With DeepCopy](doc/deep-copy.png) ## How it works DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it keeps a hash map of all instances and thus preserves the object graph. To use it: ```php use function DeepCopy\deep_copy; $copy = deep_copy($var); ``` Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: ```php use DeepCopy\DeepCopy; $copier = new DeepCopy(true); $copy = $copier->copy($var); ``` You may want to roll your own deep copy function: ```php namespace Acme; use DeepCopy\DeepCopy; function deep_copy($var) { static $copier = null; if (null === $copier) { $copier = new DeepCopy(true); } return $copier->copy($var); } ``` ## Going further You can add filters to customize the copy process. The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, with `$filter` implementing `DeepCopy\Filter\Filter` and `$matcher` implementing `DeepCopy\Matcher\Matcher`. We provide some generic filters and matchers. ### Matchers - `DeepCopy\Matcher` applies on a object attribute. - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. #### Property name The `PropertyNameMatcher` will match a property by its name: ```php use DeepCopy\Matcher\PropertyNameMatcher; // Will apply a filter to any property of any objects named "id" $matcher = new PropertyNameMatcher('id'); ``` #### Specific property The `PropertyMatcher` will match a specific property of a specific class: ```php use DeepCopy\Matcher\PropertyMatcher; // Will apply a filter to the property "id" of any objects of the class "MyClass" $matcher = new PropertyMatcher('MyClass', 'id'); ``` #### Type The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of [gettype()](http://php.net/manual/en/function.gettype.php) function): ```php use DeepCopy\TypeMatcher\TypeMatcher; // Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection $matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); ``` ### Filters - `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` - `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` By design, matching a filter will stop the chain of filters (i.e. the next ones will not be applied). Using the ([`ChainableFilter`](#chainablefilter-filter)) won't stop the chain of filters. #### `SetNullFilter` (filter) Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have any ID: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\SetNullFilter; use DeepCopy\Matcher\PropertyNameMatcher; $object = MyClass::load(123); echo $object->id; // 123 $copier = new DeepCopy(); $copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); $copy = $copier->copy($object); echo $copy->id; // null ``` #### `KeepFilter` (filter) If you want a property to remain untouched (for example, an association to an object): ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\KeepFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); $copy = $copier->copy($object); // $copy->category has not been touched ``` #### `ChainableFilter` (filter) If you use cloning on proxy classes, you might want to apply two filters for: 1. loading the data 2. applying a transformation You can use the `ChainableFilter` as a decorator of the proxy loader filter, which won't stop the chain of filters (i.e. the next ones may be applied). ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\ChainableFilter; use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; use DeepCopy\Filter\SetNullFilter; use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; use DeepCopy\Matcher\PropertyNameMatcher; $copier = new DeepCopy(); $copier->addFilter(new ChainableFilter(new DoctrineProxyFilter()), new DoctrineProxyMatcher()); $copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); $copy = $copier->copy($object); echo $copy->id; // null ``` #### `DoctrineCollectionFilter` (filter) If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; use DeepCopy\Matcher\PropertyTypeMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); $copy = $copier->copy($object); ``` #### `DoctrineEmptyCollectionFilter` (filter) If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the `DoctrineEmptyCollectionFilter` ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); $copy = $copier->copy($object); // $copy->myProperty will return an empty collection ``` #### `DoctrineProxyFilter` (filter) If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a Doctrine proxy class (...\\\_\_CG\_\_\Proxy). You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. **Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded before other filters are applied!** We recommend to decorate the `DoctrineProxyFilter` with the `ChainableFilter` to allow applying other filters to the cloned lazy loaded entities. ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; $copier = new DeepCopy(); $copier->addFilter(new ChainableFilter(new DoctrineProxyFilter()), new DoctrineProxyMatcher()); $copy = $copier->copy($object); // $copy should now contain a clone of all entities, including those that were not yet fully loaded. ``` #### `ReplaceFilter` (type filter) 1. If you want to replace the value of a property: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\ReplaceFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $callback = function ($currentValue) { return $currentValue . ' (copy)' }; $copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); $copy = $copier->copy($object); // $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' ``` 2. If you want to replace whole element: ```php use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\ReplaceFilter; use DeepCopy\TypeMatcher\TypeMatcher; $copier = new DeepCopy(); $callback = function (MyClass $myClass) { return get_class($myClass); }; $copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); $copy = $copier->copy([new MyClass, 'some string', new MyClass]); // $copy will contain ['MyClass', 'some string', 'MyClass'] ``` The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. #### `ShallowCopyFilter` (type filter) Stop *DeepCopy* from recursively copying element, using standard `clone` instead: ```php use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\ShallowCopyFilter; use DeepCopy\TypeMatcher\TypeMatcher; use Mockery as m; $this->deepCopy = new DeepCopy(); $this->deepCopy->addTypeFilter( new ShallowCopyFilter, new TypeMatcher(m\MockInterface::class) ); $myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); // All mocks will be just cloned, not deep copied ``` ## Edge cases The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are not applied. There is two ways for you to handle them: - Implement your own `__clone()` method - Use a filter with a type matcher ## Contributing DeepCopy is distributed under the MIT license. ### Tests Running the tests is simple: ```php vendor/bin/phpunit ``` ### Support Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). __load(); } } setAccessible(true); } $reflectionProperty->setValue($object, new ArrayCollection()); } } setAccessible(true); } $oldCollection = $reflectionProperty->getValue($object); $newCollection = $oldCollection->map( function ($item) use ($objectCopier) { return $objectCopier($item); } ); $reflectionProperty->setValue($object, $newCollection); } } setAccessible(true); } $reflectionProperty->setValue($object, null); } } filter = $filter; } public function apply($object, $property, $objectCopier) { $this->filter->apply($object, $property, $objectCopier); } } callback = $callable; } /** * Replaces the object property by the result of the callback called with the object property. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); if (PHP_VERSION_ID < 80100) { $reflectionProperty->setAccessible(true); } $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); $reflectionProperty->setValue($object, $value); } } propertyType = $propertyType; } /** * {@inheritdoc} */ public function matches($object, $property) { try { $reflectionProperty = ReflectionHelper::getProperty($object, $property); } catch (ReflectionException $exception) { return false; } if (PHP_VERSION_ID < 80100) { $reflectionProperty->setAccessible(true); } // Uninitialized properties (for PHP >7.4) if (method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { // null instanceof $this->propertyType return false; } return $reflectionProperty->getValue($object) instanceof $this->propertyType; } } class = $class; $this->property = $property; } /** * Matches a specific property of a specific class. * * {@inheritdoc} */ public function matches($object, $property) { return ($object instanceof $this->class) && $property == $this->property; } } property = $property; } /** * Matches a property by its name. * * {@inheritdoc} */ public function matches($object, $property) { return $property == $this->property; } } copy($value); } } copier = $copier; } /** * {@inheritdoc} */ public function apply($arrayObject) { $clone = clone $arrayObject; foreach ($arrayObject->getArrayCopy() as $k => $v) { $clone->offsetSet($k, $this->copier->copy($v)); } return $clone; } } copier = $copier; } /** * {@inheritdoc} */ public function apply($element) { $newElement = clone $element; $copy = $this->createCopyClosure(); return $copy($newElement); } private function createCopyClosure() { $copier = $this->copier; $copy = function (SplDoublyLinkedList $list) use ($copier) { // Replace each element in the list with a deep copy of itself for ($i = 1; $i <= $list->count(); $i++) { $copy = $copier->recursiveCopy($list->shift()); $list->push($copy); } return $list; }; return Closure::bind($copy, null, DeepCopy::class); } } callback = $callable; } /** * {@inheritdoc} */ public function apply($element) { return call_user_func($this->callback, $element); } } $propertyValue) { $copy->{$propertyName} = $propertyValue; } return $copy; } } = 80200 && $element->include_end_date) { $options |= DatePeriod::INCLUDE_END_DATE; } if (!$element->include_start_date) { $options |= DatePeriod::EXCLUDE_START_DATE; } if ($element->getEndDate()) { return new DatePeriod($element->getStartDate(), $element->getDateInterval(), $element->getEndDate(), $options); } if (PHP_VERSION_ID >= 70217) { $recurrences = $element->getRecurrences(); } else { $recurrences = $element->recurrences - $element->include_start_date; } return new DatePeriod($element->getStartDate(), $element->getDateInterval(), $recurrences, $options); } } type = $type; } /** * @param mixed $element * * @return boolean */ public function matches($element) { return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; } } Filter, 'matcher' => Matcher] pairs. */ private $filters = []; /** * Type Filters to apply. * * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. */ private $typeFilters = []; /** * @var bool */ private $skipUncloneable = false; /** * @var bool */ private $useCloneMethod; /** * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used * instead of the regular deep cloning. */ public function __construct($useCloneMethod = false) { $this->useCloneMethod = $useCloneMethod; $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); $this->addTypeFilter(new DatePeriodFilter(), new TypeMatcher(DatePeriod::class)); $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); } /** * If enabled, will not throw an exception when coming across an uncloneable property. * * @param $skipUncloneable * * @return $this */ public function skipUncloneable($skipUncloneable = true) { $this->skipUncloneable = $skipUncloneable; return $this; } /** * Deep copies the given object. * * @template TObject * * @param TObject $object * * @return TObject */ public function copy($object) { $this->hashMap = []; return $this->recursiveCopy($object); } public function addFilter(Filter $filter, Matcher $matcher) { $this->filters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } public function prependFilter(Filter $filter, Matcher $matcher) { array_unshift($this->filters, [ 'matcher' => $matcher, 'filter' => $filter, ]); } public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) { $this->typeFilters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } public function prependTypeFilter(TypeFilter $filter, TypeMatcher $matcher) { array_unshift($this->typeFilters, [ 'matcher' => $matcher, 'filter' => $filter, ]); } private function recursiveCopy($var) { // Matches Type Filter if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { return $filter->apply($var); } // Resource if (is_resource($var)) { return $var; } // Array if (is_array($var)) { return $this->copyArray($var); } // Scalar if (! is_object($var)) { return $var; } // Enum if (PHP_VERSION_ID >= 80100 && enum_exists(get_class($var))) { return $var; } // Object return $this->copyObject($var); } /** * Copy an array * @param array $array * @return array */ private function copyArray(array $array) { foreach ($array as $key => $value) { $array[$key] = $this->recursiveCopy($value); } return $array; } /** * Copies an object. * * @param object $object * * @throws CloneException * * @return object */ private function copyObject($object) { $objectHash = spl_object_hash($object); if (isset($this->hashMap[$objectHash])) { return $this->hashMap[$objectHash]; } $reflectedObject = new ReflectionObject($object); $isCloneable = $reflectedObject->isCloneable(); if (false === $isCloneable) { if ($this->skipUncloneable) { $this->hashMap[$objectHash] = $object; return $object; } throw new CloneException( sprintf( 'The class "%s" is not cloneable.', $reflectedObject->getName() ) ); } $newObject = clone $object; $this->hashMap[$objectHash] = $newObject; if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { return $newObject; } if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { return $newObject; } foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { $this->copyObjectProperty($newObject, $property); } return $newObject; } private function copyObjectProperty($object, ReflectionProperty $property) { // Ignore static properties if ($property->isStatic()) { return; } // Ignore readonly properties if (method_exists($property, 'isReadOnly') && $property->isReadOnly()) { return; } // Apply the filters foreach ($this->filters as $item) { /** @var Matcher $matcher */ $matcher = $item['matcher']; /** @var Filter $filter */ $filter = $item['filter']; if ($matcher->matches($object, $property->getName())) { $filter->apply( $object, $property->getName(), function ($object) { return $this->recursiveCopy($object); } ); if ($filter instanceof ChainableFilter) { continue; } // If a filter matches, we stop processing this property return; } } if (PHP_VERSION_ID < 80100) { $property->setAccessible(true); } // Ignore uninitialized properties (for PHP >7.4) if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { return; } $propertyValue = $property->getValue($object); // Copy the property $property->setValue($object, $this->recursiveCopy($propertyValue)); } /** * Returns first filter that matches variable, `null` if no such filter found. * * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and * 'matcher' with value of type {@see TypeMatcher} * @param mixed $var * * @return TypeFilter|null */ private function getFirstMatchedTypeFilter(array $filterRecords, $var) { $matched = $this->first( $filterRecords, function (array $record) use ($var) { /* @var TypeMatcher $matcher */ $matcher = $record['matcher']; return $matcher->matches($var); } ); return isset($matched) ? $matched['filter'] : null; } /** * Returns first element that matches predicate, `null` if no such element found. * * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. * @param callable $predicate Predicate arguments are: element. * * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' * with value of type {@see TypeMatcher} or `null`. */ private function first(array $elements, callable $predicate) { foreach ($elements as $element) { if (call_user_func($predicate, $element)) { return $element; } } return null; } } getProperties() does not return private properties from ancestor classes. * * @author muratyaman@gmail.com * @see http://php.net/manual/en/reflectionclass.getproperties.php * * @param ReflectionClass $ref * * @return ReflectionProperty[] */ public static function getProperties(ReflectionClass $ref) { $props = $ref->getProperties(); $propsArr = array(); foreach ($props as $prop) { $propertyName = $prop->getName(); $propsArr[$propertyName] = $prop; } if ($parentClass = $ref->getParentClass()) { $parentPropsArr = self::getProperties($parentClass); foreach ($propsArr as $key => $property) { $parentPropsArr[$key] = $property; } return $parentPropsArr; } return $propsArr; } /** * Retrieves property by name from object and all its ancestors. * * @param object|string $object * @param string $name * * @throws PropertyException * @throws ReflectionException * * @return ReflectionProperty */ public static function getProperty($object, $name) { $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); if ($reflection->hasProperty($name)) { return $reflection->getProperty($name); } if ($parentClass = $reflection->getParentClass()) { return self::getProperty($parentClass->getName(), $name); } throw new PropertyException( sprintf( 'The class "%s" doesn\'t have a property with the given name: "%s".', is_object($object) ? get_class($object) : $object, $name ) ); } } The MIT License (MIT) Copyright (c) 2013 My C-Sense Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #!/usr/bin/env php createForVersion($attributes['version']); $dumper = new PhpParser\NodeDumper([ 'dumpComments' => true, 'dumpPositions' => $attributes['with-positions'], ]); $prettyPrinter = new PhpParser\PrettyPrinter\Standard; $traverser = new PhpParser\NodeTraverser(); $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); foreach ($files as $file) { if ($file === '-') { $code = file_get_contents('php://stdin'); fwrite(STDERR, "====> Stdin:\n"); } else if (strpos($file, ' Code $code\n"); } else { if (!file_exists($file)) { fwrite(STDERR, "File $file does not exist.\n"); exit(1); } $code = file_get_contents($file); fwrite(STDERR, "====> File $file:\n"); } if ($attributes['with-recovery']) { $errorHandler = new PhpParser\ErrorHandler\Collecting; $stmts = $parser->parse($code, $errorHandler); foreach ($errorHandler->getErrors() as $error) { $message = formatErrorMessage($error, $code, $attributes['with-column-info']); fwrite(STDERR, $message . "\n"); } if (null === $stmts) { continue; } } else { try { $stmts = $parser->parse($code); } catch (PhpParser\Error $error) { $message = formatErrorMessage($error, $code, $attributes['with-column-info']); fwrite(STDERR, $message . "\n"); exit(1); } } foreach ($operations as $operation) { if ('dump' === $operation) { fwrite(STDERR, "==> Node dump:\n"); echo $dumper->dump($stmts, $code), "\n"; } elseif ('pretty-print' === $operation) { fwrite(STDERR, "==> Pretty print:\n"); echo $prettyPrinter->prettyPrintFile($stmts), "\n"; } elseif ('json-dump' === $operation) { fwrite(STDERR, "==> JSON dump:\n"); echo json_encode($stmts, JSON_PRETTY_PRINT), "\n"; } elseif ('var-dump' === $operation) { fwrite(STDERR, "==> var_dump():\n"); var_dump($stmts); } elseif ('resolve-names' === $operation) { fwrite(STDERR, "==> Resolved names.\n"); $stmts = $traverser->traverse($stmts); } } } function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { if ($withColumnInfo && $e->hasColumnInfo()) { return $e->getMessageWithColumnInfo($code); } else { return $e->getMessage(); } } function showHelp($error = '') { if ($error) { fwrite(STDERR, $error . "\n\n"); } fwrite($error ? STDERR : STDOUT, <<<'OUTPUT' Usage: php-parse [operations] file1.php [file2.php ...] or: php-parse [operations] " false, 'with-positions' => false, 'with-recovery' => false, 'version' => PhpParser\PhpVersion::getNewestSupported(), ]; array_shift($args); $parseOptions = true; foreach ($args as $arg) { if (!$parseOptions) { $files[] = $arg; continue; } switch ($arg) { case '--dump': case '-d': $operations[] = 'dump'; break; case '--pretty-print': case '-p': $operations[] = 'pretty-print'; break; case '--json-dump': case '-j': $operations[] = 'json-dump'; break; case '--var-dump': $operations[] = 'var-dump'; break; case '--resolve-names': case '-N': $operations[] = 'resolve-names'; break; case '--with-column-info': case '-c': $attributes['with-column-info'] = true; break; case '--with-positions': case '-P': $attributes['with-positions'] = true; break; case '--with-recovery': case '-r': $attributes['with-recovery'] = true; break; case '--help': case '-h': showHelp(); break; case '--': $parseOptions = false; break; default: if (preg_match('/^--version=(.*)$/', $arg, $matches)) { $attributes['version'] = PhpParser\PhpVersion::fromString($matches[1]); } elseif ($arg[0] === '-' && \strlen($arg[0]) > 1) { showHelp("Invalid operation $arg."); } else { $files[] = $arg; } } } return [$operations, $files, $attributes]; } { "name": "nikic/php-parser", "type": "library", "description": "A PHP parser written in PHP", "keywords": [ "php", "parser" ], "license": "BSD-3-Clause", "authors": [ { "name": "Nikita Popov" } ], "require": { "php": ">=7.4", "ext-tokenizer": "*", "ext-json": "*", "ext-ctype": "*" }, "require-dev": { "phpunit/phpunit": "^9.0", "ircmaxell/php-yacc": "^0.0.7" }, "extra": { "branch-alias": { "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "autoload-dev": { "psr-4": { "PhpParser\\": "test/PhpParser/" } }, "bin": [ "bin/php-parse" ] } PHP Parser ========== [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) This is a PHP parser written in PHP. Its purpose is to simplify static code analysis and manipulation. [**Documentation for version 5.x**][doc_master] (current; for running on PHP >= 7.4; for parsing PHP 7.0 to PHP 8.4, with limited support for parsing PHP 5.x). [Documentation for version 4.x][doc_4_x] (supported; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.3). Features -------- The main features provided by this library are: * Parsing PHP 7, and PHP 8 code into an abstract syntax tree (AST). * Invalid code can be parsed into a partial AST. * The AST contains accurate location information. * Dumping the AST in human-readable form. * Converting an AST back to PHP code. * Formatting can be preserved for partially changed ASTs. * Infrastructure to traverse and modify ASTs. * Resolution of namespaced names. * Evaluation of constant expressions. * Builders to simplify AST construction for code generation. * Converting an AST into JSON and back. Quick Start ----------- Install the library using [composer](https://getcomposer.org): php composer.phar require nikic/php-parser Parse some PHP code into an AST and dump the result in human-readable form: ```php createForNewestSupportedVersion(); try { $ast = $parser->parse($code); } catch (Error $error) { echo "Parse error: {$error->getMessage()}\n"; return; } $dumper = new NodeDumper; echo $dumper->dump($ast) . "\n"; ``` This dumps an AST looking something like this: ``` array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) flags: 0 type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( name: var_dump ) args: array( 0: Arg( name: null value: Expr_Variable( name: foo ) byRef: false unpack: false ) ) ) ) ) ) ) ``` Let's traverse the AST and perform some kind of modification. For example, drop all function bodies: ```php use PhpParser\Node; use PhpParser\Node\Stmt\Function_; use PhpParser\NodeTraverser; use PhpParser\NodeVisitorAbstract; $traverser = new NodeTraverser(); $traverser->addVisitor(new class extends NodeVisitorAbstract { public function enterNode(Node $node) { if ($node instanceof Function_) { // Clean out the function body $node->stmts = []; } } }); $ast = $traverser->traverse($ast); echo $dumper->dump($ast) . "\n"; ``` This gives us an AST where the `Function_::$stmts` are empty: ``` array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( ) ) ) ``` Finally, we can convert the new AST back to PHP code: ```php use PhpParser\PrettyPrinter; $prettyPrinter = new PrettyPrinter\Standard; echo $prettyPrinter->prettyPrintFile($ast); ``` This gives us our original code, minus the `var_dump()` call inside the function: ```php 50100, 'callable' => 50400, 'bool' => 70000, 'int' => 70000, 'float' => 70000, 'string' => 70000, 'iterable' => 70100, 'void' => 70100, 'object' => 70200, 'null' => 80000, 'false' => 80000, 'mixed' => 80000, 'never' => 80100, 'true' => 80200, ]; private function __construct(int $id) { $this->id = $id; } /** * Create a PhpVersion object from major and minor version components. */ public static function fromComponents(int $major, int $minor): self { return new self($major * 10000 + $minor * 100); } /** * Get the newest PHP version supported by this library. Support for this version may be partial, * if it is still under development. */ public static function getNewestSupported(): self { return self::fromComponents(8, 5); } /** * Get the host PHP version, that is the PHP version we're currently running on. */ public static function getHostVersion(): self { return self::fromComponents(\PHP_MAJOR_VERSION, \PHP_MINOR_VERSION); } /** * Parse the version from a string like "8.1". */ public static function fromString(string $version): self { if (!preg_match('/^(\d+)\.(\d+)/', $version, $matches)) { throw new \LogicException("Invalid PHP version \"$version\""); } return self::fromComponents((int) $matches[1], (int) $matches[2]); } /** * Check whether two versions are the same. */ public function equals(PhpVersion $other): bool { return $this->id === $other->id; } /** * Check whether this version is greater than or equal to the argument. */ public function newerOrEqual(PhpVersion $other): bool { return $this->id >= $other->id; } /** * Check whether this version is older than the argument. */ public function older(PhpVersion $other): bool { return $this->id < $other->id; } /** * Check whether this is the host PHP version. */ public function isHostVersion(): bool { return $this->equals(self::getHostVersion()); } /** * Check whether this PHP version supports the given builtin type. Type name must be lowercase. */ public function supportsBuiltinType(string $type): bool { $minVersion = self::BUILTIN_TYPE_VERSIONS[$type] ?? null; return $minVersion !== null && $this->id >= $minVersion; } /** * Whether this version supports [] array literals. */ public function supportsShortArraySyntax(): bool { return $this->id >= 50400; } /** * Whether this version supports [] for destructuring. */ public function supportsShortArrayDestructuring(): bool { return $this->id >= 70100; } /** * Whether this version supports flexible heredoc/nowdoc. */ public function supportsFlexibleHeredoc(): bool { return $this->id >= 70300; } /** * Whether this version supports trailing commas in parameter lists. */ public function supportsTrailingCommaInParamList(): bool { return $this->id >= 80000; } /** * Whether this version allows "$var =& new Obj". */ public function allowsAssignNewByReference(): bool { return $this->id < 70000; } /** * Whether this version allows invalid octals like "08". */ public function allowsInvalidOctals(): bool { return $this->id < 70000; } /** * Whether this version allows DEL (\x7f) to occur in identifiers. */ public function allowsDelInIdentifiers(): bool { return $this->id < 70100; } /** * Whether this version supports yield in expression context without parentheses. */ public function supportsYieldWithoutParentheses(): bool { return $this->id >= 70000; } /** * Whether this version supports unicode escape sequences in strings. */ public function supportsUnicodeEscapes(): bool { return $this->id >= 70000; } /* * Whether this version supports attributes. */ public function supportsAttributes(): bool { return $this->id >= 80000; } public function supportsNewDereferenceWithoutParentheses(): bool { return $this->id >= 80400; } } postprocessTokens($tokens, $errorHandler); if (false !== $scream) { ini_set('xdebug.scream', $scream); } return $tokens; } private function handleInvalidCharacter(Token $token, ErrorHandler $errorHandler): void { $chr = $token->text; if ($chr === "\0") { // PHP cuts error message after null byte, so need special case $errorMsg = 'Unexpected null byte'; } else { $errorMsg = sprintf( 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) ); } $errorHandler->handleError(new Error($errorMsg, [ 'startLine' => $token->line, 'endLine' => $token->line, 'startFilePos' => $token->pos, 'endFilePos' => $token->pos, ])); } private function isUnterminatedComment(Token $token): bool { return $token->is([\T_COMMENT, \T_DOC_COMMENT]) && substr($token->text, 0, 2) === '/*' && substr($token->text, -2) !== '*/'; } /** * @param list $tokens */ protected function postprocessTokens(array &$tokens, ErrorHandler $errorHandler): void { // This function reports errors (bad characters and unterminated comments) in the token // array, and performs certain canonicalizations: // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. // * Add a sentinel token with ID 0. $numTokens = \count($tokens); if ($numTokens === 0) { // Empty input edge case: Just add the sentinel token. $tokens[] = new Token(0, "\0", 1, 0); return; } for ($i = 0; $i < $numTokens; $i++) { $token = $tokens[$i]; if ($token->id === \T_BAD_CHARACTER) { $this->handleInvalidCharacter($token, $errorHandler); } if ($token->id === \ord('&')) { $next = $i + 1; while (isset($tokens[$next]) && $tokens[$next]->id === \T_WHITESPACE) { $next++; } $followedByVarOrVarArg = isset($tokens[$next]) && $tokens[$next]->is([\T_VARIABLE, \T_ELLIPSIS]); $token->id = $followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; } } // Check for unterminated comment $lastToken = $tokens[$numTokens - 1]; if ($this->isUnterminatedComment($lastToken)) { $errorHandler->handleError(new Error('Unterminated comment', [ 'startLine' => $lastToken->line, 'endLine' => $lastToken->getEndLine(), 'startFilePos' => $lastToken->pos, 'endFilePos' => $lastToken->getEndPos(), ])); } // Add sentinel token. $tokens[] = new Token(0, "\0", $lastToken->getEndLine(), $lastToken->getEndPos()); } } traverse($nodes); return $visitor->getFoundNodes(); } /** * Find all nodes that are instances of a certain class. * @template TNode as Node * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param class-string $class Class name * * @return TNode[] Found nodes (all instances of $class) */ public function findInstanceOf($nodes, string $class): array { return $this->find($nodes, function ($node) use ($class) { return $node instanceof $class; }); } /** * Find first node satisfying a filter callback. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param callable $filter Filter callback: function(Node $node) : bool * * @return null|Node Found node (or null if none found) */ public function findFirst($nodes, callable $filter): ?Node { if ($nodes === []) { return null; } if (!is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FirstFindingVisitor($filter); $traverser = new NodeTraverser($visitor); $traverser->traverse($nodes); return $visitor->getFoundNode(); } /** * Find first node that is an instance of a certain class. * * @template TNode as Node * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param class-string $class Class name * * @return null|TNode Found node, which is an instance of $class (or null if none found) */ public function findFirstInstanceOf($nodes, string $class): ?Node { return $this->findFirst($nodes, function ($node) use ($class) { return $node instanceof $class; }); } } tokens = $tokens; $this->indentMap = $this->calcIndentMap($tabWidth); } /** * Whether the given position is immediately surrounded by parenthesis. * * @param int $startPos Start position * @param int $endPos End position */ public function haveParens(int $startPos, int $endPos): bool { return $this->haveTokenImmediatelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')'); } /** * Whether the given position is immediately surrounded by braces. * * @param int $startPos Start position * @param int $endPos End position */ public function haveBraces(int $startPos, int $endPos): bool { return ($this->haveTokenImmediatelyBefore($startPos, '{') || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN)) && $this->haveTokenImmediatelyAfter($endPos, '}'); } /** * Check whether the position is directly preceded by a certain token type. * * During this check whitespace and comments are skipped. * * @param int $pos Position before which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType): bool { $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { $token = $tokens[$pos]; if ($token->is($expectedTokenType)) { return true; } if (!$token->isIgnorable()) { break; } } return false; } /** * Check whether the position is directly followed by a certain token type. * * During this check whitespace and comments are skipped. * * @param int $pos Position after which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType): bool { $tokens = $this->tokens; $pos++; for ($c = \count($tokens); $pos < $c; $pos++) { $token = $tokens[$pos]; if ($token->is($expectedTokenType)) { return true; } if (!$token->isIgnorable()) { break; } } return false; } /** @param int|string|(int|string)[] $skipTokenType */ public function skipLeft(int $pos, $skipTokenType): int { $tokens = $this->tokens; $pos = $this->skipLeftWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } if (!$tokens[$pos]->is($skipTokenType)) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos--; return $this->skipLeftWhitespace($pos); } /** @param int|string|(int|string)[] $skipTokenType */ public function skipRight(int $pos, $skipTokenType): int { $tokens = $this->tokens; $pos = $this->skipRightWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } if (!$tokens[$pos]->is($skipTokenType)) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos++; return $this->skipRightWhitespace($pos); } /** * Return first non-whitespace token position smaller or equal to passed position. * * @param int $pos Token position * @return int Non-whitespace token position */ public function skipLeftWhitespace(int $pos): int { $tokens = $this->tokens; for (; $pos >= 0; $pos--) { if (!$tokens[$pos]->isIgnorable()) { break; } } return $pos; } /** * Return first non-whitespace position greater or equal to passed position. * * @param int $pos Token position * @return int Non-whitespace token position */ public function skipRightWhitespace(int $pos): int { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { if (!$tokens[$pos]->isIgnorable()) { break; } } return $pos; } /** @param int|string|(int|string)[] $findTokenType */ public function findRight(int $pos, $findTokenType): int { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { if ($tokens[$pos]->is($findTokenType)) { return $pos; } } return -1; } /** * Whether the given position range contains a certain token type. * * @param int $startPos Starting position (inclusive) * @param int $endPos Ending position (exclusive) * @param int|string $tokenType Token type to look for * @return bool Whether the token occurs in the given range */ public function haveTokenInRange(int $startPos, int $endPos, $tokenType): bool { $tokens = $this->tokens; for ($pos = $startPos; $pos < $endPos; $pos++) { if ($tokens[$pos]->is($tokenType)) { return true; } } return false; } public function haveTagInRange(int $startPos, int $endPos): bool { return $this->haveTokenInRange($startPos, $endPos, \T_OPEN_TAG) || $this->haveTokenInRange($startPos, $endPos, \T_CLOSE_TAG); } /** * Get indentation before token position. * * @param int $pos Token position * * @return int Indentation depth (in spaces) */ public function getIndentationBefore(int $pos): int { return $this->indentMap[$pos]; } /** * Get the code corresponding to a token offset range, optionally adjusted for indentation. * * @param int $from Token start position (inclusive) * @param int $to Token end position (exclusive) * @param int $indent By how much the code should be indented (can be negative as well) * * @return string Code corresponding to token range, adjusted for indentation */ public function getTokenCode(int $from, int $to, int $indent): string { $tokens = $this->tokens; $result = ''; for ($pos = $from; $pos < $to; $pos++) { $token = $tokens[$pos]; $id = $token->id; $text = $token->text; if ($id === \T_CONSTANT_ENCAPSED_STRING || $id === \T_ENCAPSED_AND_WHITESPACE) { $result .= $text; } else { // TODO Handle non-space indentation if ($indent < 0) { $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $text); } elseif ($indent > 0) { $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $text); } else { $result .= $text; } } } return $result; } /** * Precalculate the indentation at every token position. * * @return int[] Token position to indentation map */ private function calcIndentMap(int $tabWidth): array { $indentMap = []; $indent = 0; foreach ($this->tokens as $i => $token) { $indentMap[] = $indent; if ($token->id === \T_WHITESPACE) { $content = $token->text; $newlinePos = \strrpos($content, "\n"); if (false !== $newlinePos) { $indent = $this->getIndent(\substr($content, $newlinePos + 1), $tabWidth); } elseif ($i === 1 && $this->tokens[0]->id === \T_OPEN_TAG && $this->tokens[0]->text[\strlen($this->tokens[0]->text) - 1] === "\n") { // Special case: Newline at the end of opening tag followed by whitespace. $indent = $this->getIndent($content, $tabWidth); } } } // Add a sentinel for one past end of the file $indentMap[] = $indent; return $indentMap; } private function getIndent(string $ws, int $tabWidth): int { $spaces = \substr_count($ws, " "); $tabs = \substr_count($ws, "\t"); assert(\strlen($ws) === $spaces + $tabs); return $spaces + $tabs * $tabWidth; } } type = $type; $this->old = $old; $this->new = $new; } } = 80000) { class TokenPolyfill extends \PhpToken { } return; } /** * This is a polyfill for the PhpToken class introduced in PHP 8.0. We do not actually polyfill * PhpToken, because composer might end up picking a different polyfill implementation, which does * not meet our requirements. * * @internal */ class TokenPolyfill { /** @var int The ID of the token. Either a T_* constant of a character code < 256. */ public int $id; /** @var string The textual content of the token. */ public string $text; /** @var int The 1-based starting line of the token (or -1 if unknown). */ public int $line; /** @var int The 0-based starting position of the token (or -1 if unknown). */ public int $pos; /** @var array Tokens ignored by the PHP parser. */ private const IGNORABLE_TOKENS = [ \T_WHITESPACE => true, \T_COMMENT => true, \T_DOC_COMMENT => true, \T_OPEN_TAG => true, ]; /** @var array Tokens that may be part of a T_NAME_* identifier. */ private static array $identifierTokens; /** * Create a Token with the given ID and text, as well optional line and position information. */ final public function __construct(int $id, string $text, int $line = -1, int $pos = -1) { $this->id = $id; $this->text = $text; $this->line = $line; $this->pos = $pos; } /** * Get the name of the token. For single-char tokens this will be the token character. * Otherwise it will be a T_* style name, or null if the token ID is unknown. */ public function getTokenName(): ?string { if ($this->id < 256) { return \chr($this->id); } $name = token_name($this->id); return $name === 'UNKNOWN' ? null : $name; } /** * Check whether the token is of the given kind. The kind may be either an integer that matches * the token ID, a string that matches the token text, or an array of integers/strings. In the * latter case, the function returns true if any of the kinds in the array match. * * @param int|string|(int|string)[] $kind */ public function is($kind): bool { if (\is_int($kind)) { return $this->id === $kind; } if (\is_string($kind)) { return $this->text === $kind; } if (\is_array($kind)) { foreach ($kind as $entry) { if (\is_int($entry)) { if ($this->id === $entry) { return true; } } elseif (\is_string($entry)) { if ($this->text === $entry) { return true; } } else { throw new \TypeError( 'Argument #1 ($kind) must only have elements of type string|int, ' . gettype($entry) . ' given'); } } return false; } throw new \TypeError( 'Argument #1 ($kind) must be of type string|int|array, ' .gettype($kind) . ' given'); } /** * Check whether this token would be ignored by the PHP parser. Returns true for T_WHITESPACE, * T_COMMENT, T_DOC_COMMENT and T_OPEN_TAG, and false for everything else. */ public function isIgnorable(): bool { return isset(self::IGNORABLE_TOKENS[$this->id]); } /** * Return the textual content of the token. */ public function __toString(): string { return $this->text; } /** * Tokenize the given source code and return an array of tokens. * * This performs certain canonicalizations to match the PHP 8.0 token format: * * Bad characters are represented using T_BAD_CHARACTER rather than omitted. * * T_COMMENT does not include trailing newlines, instead the newline is part of a following * T_WHITESPACE token. * * Namespaced names are represented using T_NAME_* tokens. * * @return static[] */ public static function tokenize(string $code, int $flags = 0): array { self::init(); $tokens = []; $line = 1; $pos = 0; $origTokens = \token_get_all($code, $flags); $numTokens = \count($origTokens); for ($i = 0; $i < $numTokens; $i++) { $token = $origTokens[$i]; if (\is_string($token)) { if (\strlen($token) === 2) { // b" and B" are tokenized as single-char tokens, even though they aren't. $tokens[] = new static(\ord('"'), $token, $line, $pos); $pos += 2; } else { $tokens[] = new static(\ord($token), $token, $line, $pos); $pos++; } } else { $id = $token[0]; $text = $token[1]; // Emulate PHP 8.0 comment format, which does not include trailing whitespace anymore. if ($id === \T_COMMENT && \substr($text, 0, 2) !== '/*' && \preg_match('/(\r\n|\n|\r)$/D', $text, $matches) ) { $trailingNewline = $matches[0]; $text = \substr($text, 0, -\strlen($trailingNewline)); $tokens[] = new static($id, $text, $line, $pos); $pos += \strlen($text); if ($i + 1 < $numTokens && $origTokens[$i + 1][0] === \T_WHITESPACE) { // Move trailing newline into following T_WHITESPACE token, if it already exists. $origTokens[$i + 1][1] = $trailingNewline . $origTokens[$i + 1][1]; $origTokens[$i + 1][2]--; } else { // Otherwise, we need to create a new T_WHITESPACE token. $tokens[] = new static(\T_WHITESPACE, $trailingNewline, $line, $pos); $line++; $pos += \strlen($trailingNewline); } continue; } // Emulate PHP 8.0 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and // T_STRING into a single token. if (($id === \T_NS_SEPARATOR || isset(self::$identifierTokens[$id]))) { $newText = $text; $lastWasSeparator = $id === \T_NS_SEPARATOR; for ($j = $i + 1; $j < $numTokens; $j++) { if ($lastWasSeparator) { if (!isset(self::$identifierTokens[$origTokens[$j][0]])) { break; } $lastWasSeparator = false; } else { if ($origTokens[$j][0] !== \T_NS_SEPARATOR) { break; } $lastWasSeparator = true; } $newText .= $origTokens[$j][1]; } if ($lastWasSeparator) { // Trailing separator is not part of the name. $j--; $newText = \substr($newText, 0, -1); } if ($j > $i + 1) { if ($id === \T_NS_SEPARATOR) { $id = \T_NAME_FULLY_QUALIFIED; } elseif ($id === \T_NAMESPACE) { $id = \T_NAME_RELATIVE; } else { $id = \T_NAME_QUALIFIED; } $tokens[] = new static($id, $newText, $line, $pos); $pos += \strlen($newText); $i = $j - 1; continue; } } $tokens[] = new static($id, $text, $line, $pos); $line += \substr_count($text, "\n"); $pos += \strlen($text); } } return $tokens; } /** Initialize private static state needed by tokenize(). */ private static function init(): void { if (isset(self::$identifierTokens)) { return; } // Based on semi_reserved production. self::$identifierTokens = \array_fill_keys([ \T_STRING, \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, \T_MATCH, ], true); } } $attributes Attributes */ public function __construct( array $attrGroups, int $flags, array $args, ?Node\Name $extends, array $implements, array $stmts, array $attributes ) { parent::__construct($attributes); $this->attrGroups = $attrGroups; $this->flags = $flags; $this->args = $args; $this->extends = $extends; $this->implements = $implements; $this->stmts = $stmts; } public static function fromNewNode(Expr\New_ $newNode): self { $class = $newNode->class; assert($class instanceof Node\Stmt\Class_); // We don't assert that $class->name is null here, to allow consumers to assign unique names // to anonymous classes for their own purposes. We simplify ignore the name here. return new self( $class->attrGroups, $class->flags, $newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes() ); } public function getType(): string { return 'Expr_PrintableNewAnonClass'; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts']; } } isEqual = $isEqual; } /** * Calculate diff (edit script) from $old to $new. * * @param T[] $old Original array * @param T[] $new New array * * @return DiffElem[] Diff (edit script) */ public function diff(array $old, array $new): array { $old = \array_values($old); $new = \array_values($new); list($trace, $x, $y) = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } /** * Calculate diff, including "replace" operations. * * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * * @param T[] $old Original array * @param T[] $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ public function diffWithReplacements(array $old, array $new): array { return $this->coalesceReplacements($this->diff($old, $new)); } /** * @param T[] $old * @param T[] $new * @return array{array>, int, int} */ private function calculateTrace(array $old, array $new): array { $n = \count($old); $m = \count($new); $max = $n + $m; $v = [1 => 0]; $trace = []; for ($d = 0; $d <= $max; $d++) { $trace[] = $v; for ($k = -$d; $k <= $d; $k += 2) { if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { $x = $v[$k + 1]; } else { $x = $v[$k - 1] + 1; } $y = $x - $k; while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { $x++; $y++; } $v[$k] = $x; if ($x >= $n && $y >= $m) { return [$trace, $x, $y]; } } } throw new \Exception('Should not happen'); } /** * @param array> $trace * @param T[] $old * @param T[] $new * @return DiffElem[] */ private function extractDiff(array $trace, int $x, int $y, array $old, array $new): array { $result = []; for ($d = \count($trace) - 1; $d >= 0; $d--) { $v = $trace[$d]; $k = $x - $y; if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { $prevK = $k + 1; } else { $prevK = $k - 1; } $prevX = $v[$prevK]; $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); $x--; $y--; } if ($d === 0) { break; } while ($x > $prevX) { $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); $x--; } while ($y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); $y--; } } return array_reverse($result); } /** * Coalesce equal-length sequences of remove+add into a replace operation. * * @param DiffElem[] $diff * @return DiffElem[] */ private function coalesceReplacements(array $diff): array { $newDiff = []; $c = \count($diff); for ($i = 0; $i < $c; $i++) { $diffType = $diff[$i]->type; if ($diffType !== DiffElem::TYPE_REMOVE) { $newDiff[] = $diff[$i]; continue; } $j = $i; while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { $j++; } $k = $j; while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { $k++; } if ($j - $i === $k - $j) { $len = $j - $i; for ($n = 0; $n < $len; $n++) { $newDiff[] = new DiffElem( DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new ); } } else { for (; $i < $k; $i++) { $newDiff[] = $diff[$i]; } } $i = $k - 1; } return $newDiff; } } */ public function getAttributes(): array; /** * Replaces all the attributes of this node. * * @param array $attributes */ public function setAttributes(array $attributes): void; } */ protected array $precedenceMap = [ // [precedence, precedenceLHS, precedenceRHS] // Where the latter two are the precedences to use for the LHS and RHS of a binary operator, // where 1 is added to one of the sides depending on associativity. This information is not // used for unary operators and set to -1. Expr\Clone_::class => [-10, 0, 1], BinaryOp\Pow::class => [ 0, 0, 1], Expr\BitwiseNot::class => [ 10, -1, -1], Expr\UnaryPlus::class => [ 10, -1, -1], Expr\UnaryMinus::class => [ 10, -1, -1], Cast\Int_::class => [ 10, -1, -1], Cast\Double::class => [ 10, -1, -1], Cast\String_::class => [ 10, -1, -1], Cast\Array_::class => [ 10, -1, -1], Cast\Object_::class => [ 10, -1, -1], Cast\Bool_::class => [ 10, -1, -1], Cast\Unset_::class => [ 10, -1, -1], Expr\ErrorSuppress::class => [ 10, -1, -1], Expr\Instanceof_::class => [ 20, -1, -1], Expr\BooleanNot::class => [ 30, -1, -1], BinaryOp\Mul::class => [ 40, 41, 40], BinaryOp\Div::class => [ 40, 41, 40], BinaryOp\Mod::class => [ 40, 41, 40], BinaryOp\Plus::class => [ 50, 51, 50], BinaryOp\Minus::class => [ 50, 51, 50], // FIXME: This precedence is incorrect for PHP 8. BinaryOp\Concat::class => [ 50, 51, 50], BinaryOp\ShiftLeft::class => [ 60, 61, 60], BinaryOp\ShiftRight::class => [ 60, 61, 60], BinaryOp\Pipe::class => [ 65, 66, 65], BinaryOp\Smaller::class => [ 70, 70, 70], BinaryOp\SmallerOrEqual::class => [ 70, 70, 70], BinaryOp\Greater::class => [ 70, 70, 70], BinaryOp\GreaterOrEqual::class => [ 70, 70, 70], BinaryOp\Equal::class => [ 80, 80, 80], BinaryOp\NotEqual::class => [ 80, 80, 80], BinaryOp\Identical::class => [ 80, 80, 80], BinaryOp\NotIdentical::class => [ 80, 80, 80], BinaryOp\Spaceship::class => [ 80, 80, 80], BinaryOp\BitwiseAnd::class => [ 90, 91, 90], BinaryOp\BitwiseXor::class => [100, 101, 100], BinaryOp\BitwiseOr::class => [110, 111, 110], BinaryOp\BooleanAnd::class => [120, 121, 120], BinaryOp\BooleanOr::class => [130, 131, 130], BinaryOp\Coalesce::class => [140, 140, 141], Expr\Ternary::class => [150, 150, 150], Expr\Assign::class => [160, -1, -1], Expr\AssignRef::class => [160, -1, -1], AssignOp\Plus::class => [160, -1, -1], AssignOp\Minus::class => [160, -1, -1], AssignOp\Mul::class => [160, -1, -1], AssignOp\Div::class => [160, -1, -1], AssignOp\Concat::class => [160, -1, -1], AssignOp\Mod::class => [160, -1, -1], AssignOp\BitwiseAnd::class => [160, -1, -1], AssignOp\BitwiseOr::class => [160, -1, -1], AssignOp\BitwiseXor::class => [160, -1, -1], AssignOp\ShiftLeft::class => [160, -1, -1], AssignOp\ShiftRight::class => [160, -1, -1], AssignOp\Pow::class => [160, -1, -1], AssignOp\Coalesce::class => [160, -1, -1], Expr\YieldFrom::class => [170, -1, -1], Expr\Yield_::class => [175, -1, -1], Expr\Print_::class => [180, -1, -1], BinaryOp\LogicalAnd::class => [190, 191, 190], BinaryOp\LogicalXor::class => [200, 201, 200], BinaryOp\LogicalOr::class => [210, 211, 210], Expr\Include_::class => [220, -1, -1], Expr\ArrowFunction::class => [230, -1, -1], Expr\Throw_::class => [240, -1, -1], Expr\Cast\Void_::class => [250, -1, -1], ]; /** @var int Current indentation level. */ protected int $indentLevel; /** @var string String for single level of indentation */ private string $indent; /** @var int Width in spaces to indent by. */ private int $indentWidth; /** @var bool Whether to use tab indentation. */ private bool $useTabs; /** @var int Width in spaces of one tab. */ private int $tabWidth = 4; /** @var string Newline style. Does not include current indentation. */ protected string $newline; /** @var string Newline including current indentation. */ protected string $nl; /** @var string|null Token placed at end of doc string to ensure it is followed by a newline. * Null if flexible doc strings are used. */ protected ?string $docStringEndToken; /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ protected bool $canUseSemicolonNamespaces; /** @var bool Whether to use short array syntax if the node specifies no preference */ protected bool $shortArraySyntax; /** @var PhpVersion PHP version to target */ protected PhpVersion $phpVersion; /** @var TokenStream|null Original tokens for use in format-preserving pretty print */ protected ?TokenStream $origTokens; /** @var Internal\Differ Differ for node lists */ protected Differ $nodeListDiffer; /** @var array Map determining whether a certain character is a label character */ protected array $labelCharMap; /** * @var array> Map from token classes and subnode names to FIXUP_* constants. * This is used during format-preserving prints to place additional parens/braces if necessary. */ protected array $fixupMap; /** * @var array Map from "{$node->getType()}->{$subNode}" * to ['left' => $l, 'right' => $r], where $l and $r specify the token type that needs to be stripped * when removing this node. */ protected array $removalMap; /** * @var array Map from * "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. * $find is an optional token after which the insertion occurs. $extraLeft/Right * are optionally added before/after the main insertions. */ protected array $insertionMap; /** * @var array Map From "{$class}->{$subNode}" to string that should be inserted * between elements of this list subnode. */ protected array $listInsertionMap; /** * @var array */ protected array $emptyListInsertionMap; /** @var array * Map from "{$class}->{$subNode}" to [$printFn, $skipToken, $findToken] where $printFn is the function to * print the modifiers, $skipToken is the token to skip at the start and $findToken is the token before which * the modifiers should be reprinted. */ protected array $modifierChangeMap; /** * Creates a pretty printer instance using the given options. * * Supported options: * * PhpVersion $phpVersion: The PHP version to target (default to PHP 7.4). This option * controls compatibility of the generated code with older PHP * versions in cases where a simple stylistic choice exists (e.g. * array() vs []). It is safe to pretty-print an AST for a newer * PHP version while specifying an older target (but the result will * of course not be compatible with the older version in that case). * * string $newline: The newline style to use. Should be "\n" (default) or "\r\n". * * string $indent: The indentation to use. Should either be all spaces or a single * tab. Defaults to four spaces (" "). * * bool $shortArraySyntax: Whether to use [] instead of array() as the default array * syntax, if the node does not specify a format. Defaults to whether * the phpVersion support short array syntax. * * @param array{ * phpVersion?: PhpVersion, newline?: string, indent?: string, shortArraySyntax?: bool * } $options Dictionary of formatting options */ public function __construct(array $options = []) { $this->phpVersion = $options['phpVersion'] ?? PhpVersion::fromComponents(7, 4); $this->newline = $options['newline'] ?? "\n"; if ($this->newline !== "\n" && $this->newline != "\r\n") { throw new \LogicException('Option "newline" must be one of "\n" or "\r\n"'); } $this->shortArraySyntax = $options['shortArraySyntax'] ?? $this->phpVersion->supportsShortArraySyntax(); $this->docStringEndToken = $this->phpVersion->supportsFlexibleHeredoc() ? null : '_DOC_STRING_END_' . mt_rand(); $this->indent = $indent = $options['indent'] ?? ' '; if ($indent === "\t") { $this->useTabs = true; $this->indentWidth = $this->tabWidth; } elseif ($indent === \str_repeat(' ', \strlen($indent))) { $this->useTabs = false; $this->indentWidth = \strlen($indent); } else { throw new \LogicException('Option "indent" must either be all spaces or a single tab'); } } /** * Reset pretty printing state. */ protected function resetState(): void { $this->indentLevel = 0; $this->nl = $this->newline; $this->origTokens = null; } /** * Set indentation level * * @param int $level Level in number of spaces */ protected function setIndentLevel(int $level): void { $this->indentLevel = $level; if ($this->useTabs) { $tabs = \intdiv($level, $this->tabWidth); $spaces = $level % $this->tabWidth; $this->nl = $this->newline . \str_repeat("\t", $tabs) . \str_repeat(' ', $spaces); } else { $this->nl = $this->newline . \str_repeat(' ', $level); } } /** * Increase indentation level. */ protected function indent(): void { $this->indentLevel += $this->indentWidth; $this->nl .= $this->indent; } /** * Decrease indentation level. */ protected function outdent(): void { assert($this->indentLevel >= $this->indentWidth); $this->setIndentLevel($this->indentLevel - $this->indentWidth); } /** * Pretty prints an array of statements. * * @param Node[] $stmts Array of statements * * @return string Pretty printed statements */ public function prettyPrint(array $stmts): string { $this->resetState(); $this->preprocessNodes($stmts); return ltrim($this->handleMagicTokens($this->pStmts($stmts, false))); } /** * Pretty prints an expression. * * @param Expr $node Expression node * * @return string Pretty printed node */ public function prettyPrintExpr(Expr $node): string { $this->resetState(); return $this->handleMagicTokens($this->p($node)); } /** * Pretty prints a file of statements (includes the opening newline . $this->newline; } $p = "newline . $this->newline . $this->prettyPrint($stmts); if ($stmts[0] instanceof Stmt\InlineHTML) { $p = preg_replace('/^<\?php\s+\?>\r?\n?/', '', $p); } if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) { $p = preg_replace('/<\?php$/', '', rtrim($p)); } return $p; } /** * Preprocesses the top-level nodes to initialize pretty printer state. * * @param Node[] $nodes Array of nodes */ protected function preprocessNodes(array $nodes): void { /* We can use semicolon-namespaces unless there is a global namespace declaration */ $this->canUseSemicolonNamespaces = true; foreach ($nodes as $node) { if ($node instanceof Stmt\Namespace_ && null === $node->name) { $this->canUseSemicolonNamespaces = false; break; } } } /** * Handles (and removes) doc-string-end tokens. */ protected function handleMagicTokens(string $str): string { if ($this->docStringEndToken !== null) { // Replace doc-string-end tokens with nothing or a newline $str = str_replace( $this->docStringEndToken . ';' . $this->newline, ';' . $this->newline, $str); $str = str_replace($this->docStringEndToken, $this->newline, $str); } return $str; } /** * Pretty prints an array of nodes (statements) and indents them optionally. * * @param Node[] $nodes Array of nodes * @param bool $indent Whether to indent the printed nodes * * @return string Pretty printed statements */ protected function pStmts(array $nodes, bool $indent = true): string { if ($indent) { $this->indent(); } $result = ''; foreach ($nodes as $node) { $comments = $node->getComments(); if ($comments) { $result .= $this->nl . $this->pComments($comments); if ($node instanceof Stmt\Nop) { continue; } } $result .= $this->nl . $this->p($node); } if ($indent) { $this->outdent(); } return $result; } /** * Pretty-print an infix operation while taking precedence into account. * * @param string $class Node class of operator * @param Node $leftNode Left-hand side node * @param string $operatorString String representation of the operator * @param Node $rightNode Right-hand side node * @param int $precedence Precedence of parent operator * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed infix operation */ protected function pInfixOp( string $class, Node $leftNode, string $operatorString, Node $rightNode, int $precedence, int $lhsPrecedence ): string { list($opPrecedence, $newPrecedenceLHS, $newPrecedenceRHS) = $this->precedenceMap[$class]; $prefix = ''; $suffix = ''; if ($opPrecedence >= $precedence) { $prefix = '('; $suffix = ')'; $lhsPrecedence = self::MAX_PRECEDENCE; } return $prefix . $this->p($leftNode, $newPrecedenceLHS, $newPrecedenceLHS) . $operatorString . $this->p($rightNode, $newPrecedenceRHS, $lhsPrecedence) . $suffix; } /** * Pretty-print a prefix operation while taking precedence into account. * * @param string $class Node class of operator * @param string $operatorString String representation of the operator * @param Node $node Node * @param int $precedence Precedence of parent operator * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed prefix operation */ protected function pPrefixOp(string $class, string $operatorString, Node $node, int $precedence, int $lhsPrecedence): string { $opPrecedence = $this->precedenceMap[$class][0]; $prefix = ''; $suffix = ''; if ($opPrecedence >= $lhsPrecedence) { $prefix = '('; $suffix = ')'; $lhsPrecedence = self::MAX_PRECEDENCE; } $printedArg = $this->p($node, $opPrecedence, $lhsPrecedence); if (($operatorString === '+' && $printedArg[0] === '+') || ($operatorString === '-' && $printedArg[0] === '-') ) { // Avoid printing +(+$a) as ++$a and similar. $printedArg = '(' . $printedArg . ')'; } return $prefix . $operatorString . $printedArg . $suffix; } /** * Pretty-print a postfix operation while taking precedence into account. * * @param string $class Node class of operator * @param string $operatorString String representation of the operator * @param Node $node Node * @param int $precedence Precedence of parent operator * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed postfix operation */ protected function pPostfixOp(string $class, Node $node, string $operatorString, int $precedence, int $lhsPrecedence): string { $opPrecedence = $this->precedenceMap[$class][0]; $prefix = ''; $suffix = ''; if ($opPrecedence >= $precedence) { $prefix = '('; $suffix = ')'; $lhsPrecedence = self::MAX_PRECEDENCE; } if ($opPrecedence < $lhsPrecedence) { $lhsPrecedence = $opPrecedence; } return $prefix . $this->p($node, $opPrecedence, $lhsPrecedence) . $operatorString . $suffix; } /** * Pretty prints an array of nodes and implodes the printed values. * * @param Node[] $nodes Array of Nodes to be printed * @param string $glue Character to implode with * * @return string Imploded pretty printed nodes> $pre */ protected function pImplode(array $nodes, string $glue = ''): string { $pNodes = []; foreach ($nodes as $node) { if (null === $node) { $pNodes[] = ''; } else { $pNodes[] = $this->p($node); } } return implode($glue, $pNodes); } /** * Pretty prints an array of nodes and implodes the printed values with commas. * * @param Node[] $nodes Array of Nodes to be printed * * @return string Comma separated pretty printed nodes */ protected function pCommaSeparated(array $nodes): string { return $this->pImplode($nodes, ', '); } /** * Pretty prints a comma-separated list of nodes in multiline style, including comments. * * The result includes a leading newline and one level of indentation (same as pStmts). * * @param Node[] $nodes Array of Nodes to be printed * @param bool $trailingComma Whether to use a trailing comma * * @return string Comma separated pretty printed nodes in multiline style */ protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma): string { $this->indent(); $result = ''; $lastIdx = count($nodes) - 1; foreach ($nodes as $idx => $node) { if ($node !== null) { $comments = $node->getComments(); if ($comments) { $result .= $this->nl . $this->pComments($comments); } $result .= $this->nl . $this->p($node); } else { $result .= $this->nl; } if ($trailingComma || $idx !== $lastIdx) { $result .= ','; } } $this->outdent(); return $result; } /** * Prints reformatted text of the passed comments. * * @param Comment[] $comments List of comments * * @return string Reformatted text of comments */ protected function pComments(array $comments): string { $formattedComments = []; foreach ($comments as $comment) { $formattedComments[] = str_replace("\n", $this->nl, $comment->getReformattedText()); } return implode($this->nl, $formattedComments); } /** * Perform a format-preserving pretty print of an AST. * * The format preservation is best effort. For some changes to the AST the formatting will not * be preserved (at least not locally). * * In order to use this method a number of prerequisites must be satisfied: * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. * * The CloningVisitor must be run on the AST prior to modification. * * The original tokens must be provided, using the getTokens() method on the lexer. * * @param Node[] $stmts Modified AST with links to original AST * @param Node[] $origStmts Original AST with token offset information * @param Token[] $origTokens Tokens of the original code */ public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens): string { $this->initializeNodeListDiffer(); $this->initializeLabelCharMap(); $this->initializeFixupMap(); $this->initializeRemovalMap(); $this->initializeInsertionMap(); $this->initializeListInsertionMap(); $this->initializeEmptyListInsertionMap(); $this->initializeModifierChangeMap(); $this->resetState(); $this->origTokens = new TokenStream($origTokens, $this->tabWidth); $this->preprocessNodes($stmts); $pos = 0; $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); if (null !== $result) { $result .= $this->origTokens->getTokenCode($pos, count($origTokens) - 1, 0); } else { // Fallback // TODO Add newline . $this->pStmts($stmts, false); } return $this->handleMagicTokens($result); } protected function pFallback(Node $node, int $precedence, int $lhsPrecedence): string { return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence); } /** * Pretty prints a node. * * This method also handles formatting preservation for nodes. * * @param Node $node Node to be pretty printed * @param int $precedence Precedence of parent operator * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * @param bool $parentFormatPreserved Whether parent node has preserved formatting * * @return string Pretty printed node */ protected function p( Node $node, int $precedence = self::MAX_PRECEDENCE, int $lhsPrecedence = self::MAX_PRECEDENCE, bool $parentFormatPreserved = false ): string { // No orig tokens means this is a normal pretty print without preservation of formatting if (!$this->origTokens) { return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence); } /** @var Node|null $origNode */ $origNode = $node->getAttribute('origNode'); if (null === $origNode) { return $this->pFallback($node, $precedence, $lhsPrecedence); } $class = \get_class($node); \assert($class === \get_class($origNode)); $startPos = $origNode->getStartTokenPos(); $endPos = $origNode->getEndTokenPos(); \assert($startPos >= 0 && $endPos >= 0); $fallbackNode = $node; if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { // Normalize node structure of anonymous classes assert($origNode instanceof Expr\New_); $node = PrintableNewAnonClassNode::fromNewNode($node); $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); $class = PrintableNewAnonClassNode::class; } // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting // is not preserved, then we need to use the fallback code to make sure the tags are // printed. if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); $type = $node->getType(); $fixupInfo = $this->fixupMap[$class] ?? null; $result = ''; $pos = $startPos; foreach ($node->getSubNodeNames() as $subNodeName) { $subNode = $node->$subNodeName; $origSubNode = $origNode->$subNodeName; if ((!$subNode instanceof Node && $subNode !== null) || (!$origSubNode instanceof Node && $origSubNode !== null) ) { if ($subNode === $origSubNode) { // Unchanged, can reuse old code continue; } if (is_array($subNode) && is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it $listResult = $this->pArray( $subNode, $origSubNode, $pos, $indentAdjustment, $class, $subNodeName, $fixupInfo[$subNodeName] ?? null ); if (null === $listResult) { return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } $result .= $listResult; continue; } // Check if this is a modifier change $key = $class . '->' . $subNodeName; if (!isset($this->modifierChangeMap[$key])) { return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } [$printFn, $skipToken, $findToken] = $this->modifierChangeMap[$key]; $skipWSPos = $this->origTokens->skipRight($pos, $skipToken); $result .= $this->origTokens->getTokenCode($pos, $skipWSPos, $indentAdjustment); $result .= $this->$printFn($subNode); $pos = $this->origTokens->findRight($skipWSPos, $findToken); continue; } $extraLeft = ''; $extraRight = ''; if ($origSubNode !== null) { $subStartPos = $origSubNode->getStartTokenPos(); $subEndPos = $origSubNode->getEndTokenPos(); \assert($subStartPos >= 0 && $subEndPos >= 0); } else { if ($subNode === null) { // Both null, nothing to do continue; } // A node has been inserted, check if we have insertion information for it $key = $type . '->' . $subNodeName; if (!isset($this->insertionMap[$key])) { return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; if (null !== $findToken) { $subStartPos = $this->origTokens->findRight($pos, $findToken) + (int) !$beforeToken; } else { $subStartPos = $pos; } if (null === $extraLeft && null !== $extraRight) { // If inserting on the right only, skipping whitespace looks better $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); } $subEndPos = $subStartPos - 1; } if (null === $subNode) { // A node has been removed, check if we have removal information for it $key = $type . '->' . $subNodeName; if (!isset($this->removalMap[$key])) { return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } // Adjust positions to account for additional tokens that must be skipped $removalInfo = $this->removalMap[$key]; if (isset($removalInfo['left'])) { $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; } if (isset($removalInfo['right'])) { $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; } } $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); if (null !== $subNode) { $result .= $extraLeft; $origIndentLevel = $this->indentLevel; $this->setIndentLevel(max($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment, 0)); // If it's the same node that was previously in this position, it certainly doesn't // need fixup. It's important to check this here, because our fixup checks are more // conservative than strictly necessary. if (isset($fixupInfo[$subNodeName]) && $subNode->getAttribute('origNode') !== $origSubNode ) { $fixup = $fixupInfo[$subNodeName]; $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); } else { $res = $this->p($subNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); $result .= $extraRight; } $pos = $subEndPos + 1; } $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); return $result; } /** * Perform a format-preserving pretty print of an array. * * @param Node[] $nodes New nodes * @param Node[] $origNodes Original nodes * @param int $pos Current token position (updated by reference) * @param int $indentAdjustment Adjustment for indentation * @param string $parentNodeClass Class of the containing node. * @param string $subNodeName Name of array subnode. * @param null|int $fixup Fixup information for array item nodes * * @return null|string Result of pretty print or null if cannot preserve formatting */ protected function pArray( array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeClass, string $subNodeName, ?int $fixup ): ?string { $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); $mapKey = $parentNodeClass . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $isStmtList = $subNodeName === 'stmts'; $beforeFirstKeepOrReplace = true; $skipRemovedNode = false; $delayedAdd = []; $lastElemIndentLevel = $this->indentLevel; $insertNewline = false; if ($insertStr === "\n") { $insertStr = ''; $insertNewline = true; } if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { $startPos = $origNodes[0]->getStartTokenPos(); $endPos = $origNodes[0]->getEndTokenPos(); \assert($startPos >= 0 && $endPos >= 0); if (!$this->origTokens->haveBraces($startPos, $endPos)) { // This was a single statement without braces, but either additional statements // have been added, or the single statement has been removed. This requires the // addition of braces. For now fall back. // TODO: Try to preserve formatting return null; } } $result = ''; foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; /** @var Node|string|null $arrItem */ $arrItem = $diffElem->new; /** @var Node|string|null $origArrItem */ $origArrItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = false; if ($origArrItem === null || $arrItem === null) { // We can only handle the case where both are null if ($origArrItem === $arrItem) { continue; } return null; } if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { // We can only deal with nodes. This can occur for Names, which use string arrays. return null; } $itemStartPos = $origArrItem->getStartTokenPos(); $itemEndPos = $origArrItem->getEndTokenPos(); \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); $origIndentLevel = $this->indentLevel; $lastElemIndentLevel = max($this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment, 0); $this->setIndentLevel($lastElemIndentLevel); $comments = $arrItem->getComments(); $origComments = $origArrItem->getComments(); $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; \assert($commentStartPos >= 0); if ($commentStartPos < $pos) { // Comments may be assigned to multiple nodes if they start at the same position. // Make sure we don't try to print them multiple times. $commentStartPos = $itemStartPos; } if ($skipRemovedNode) { if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) { // We'd remove an opening/closing PHP tag. // TODO: Preserve formatting. $this->setIndentLevel($origIndentLevel); return null; } } else { $result .= $this->origTokens->getTokenCode( $pos, $commentStartPos, $indentAdjustment); } if (!empty($delayedAdd)) { /** @var Node $delayedAddNode */ foreach ($delayedAdd as $delayedAddNode) { if ($insertNewline) { $delayedAddComments = $delayedAddNode->getComments(); if ($delayedAddComments) { $result .= $this->pComments($delayedAddComments) . $this->nl; } } $this->safeAppend($result, $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true)); if ($insertNewline) { $result .= $insertStr . $this->nl; } else { $result .= $insertStr; } } $delayedAdd = []; } if ($comments !== $origComments) { if ($comments) { $result .= $this->pComments($comments) . $this->nl; } } else { $result .= $this->origTokens->getTokenCode( $commentStartPos, $itemStartPos, $indentAdjustment); } // If we had to remove anything, we have done so now. $skipRemovedNode = false; } elseif ($diffType === DiffElem::TYPE_ADD) { if (null === $insertStr) { // We don't have insertion information for this list type return null; } if (!$arrItem instanceof Node) { // We only support list insertion of nodes. return null; } // We go multiline if the original code was multiline, // or if it's an array item with a comment above it. // Match always uses multiline formatting. if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments() || $parentNodeClass === Expr\Match_::class) ) { $insertStr = ','; $insertNewline = true; } if ($beforeFirstKeepOrReplace) { // Will be inserted at the next "replace" or "keep" element $delayedAdd[] = $arrItem; continue; } $itemStartPos = $pos; $itemEndPos = $pos - 1; $origIndentLevel = $this->indentLevel; $this->setIndentLevel($lastElemIndentLevel); if ($insertNewline) { $result .= $insertStr . $this->nl; $comments = $arrItem->getComments(); if ($comments) { $result .= $this->pComments($comments) . $this->nl; } } else { $result .= $insertStr; } } elseif ($diffType === DiffElem::TYPE_REMOVE) { if (!$origArrItem instanceof Node) { // We only support removal for nodes return null; } $itemStartPos = $origArrItem->getStartTokenPos(); $itemEndPos = $origArrItem->getEndTokenPos(); \assert($itemStartPos >= 0 && $itemEndPos >= 0); // Consider comments part of the node. $origComments = $origArrItem->getComments(); if ($origComments) { $itemStartPos = $origComments[0]->getStartTokenPos(); } if ($i === 0) { // If we're removing from the start, keep the tokens before the node and drop those after it, // instead of the other way around. $result .= $this->origTokens->getTokenCode( $pos, $itemStartPos, $indentAdjustment); $skipRemovedNode = true; } else { if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) { // We'd remove an opening/closing PHP tag. // TODO: Preserve formatting. return null; } } $pos = $itemEndPos + 1; continue; } else { throw new \Exception("Shouldn't happen"); } if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); } else { $res = $this->p($arrItem, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); $pos = $itemEndPos + 1; } if ($skipRemovedNode) { // TODO: Support removing single node. return null; } if (!empty($delayedAdd)) { if (!isset($this->emptyListInsertionMap[$mapKey])) { return null; } list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; if (null !== $findToken) { $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); $pos = $insertPos; } $first = true; $result .= $extraLeft; foreach ($delayedAdd as $delayedAddNode) { if (!$first) { $result .= $insertStr; if ($insertNewline) { $result .= $this->nl; } } $result .= $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true); $first = false; } $result .= $extraRight === "\n" ? $this->nl : $extraRight; } return $result; } /** * Print node with fixups. * * Fixups here refer to the addition of extra parentheses, braces or other characters, that * are required to preserve program semantics in a certain context (e.g. to maintain precedence * or because only certain expressions are allowed in certain places). * * @param int $fixup Fixup type * @param Node $subNode Subnode to print * @param string|null $parentClass Class of parent node * @param int $subStartPos Original start pos of subnode * @param int $subEndPos Original end pos of subnode * * @return string Result of fixed-up print of subnode */ protected function pFixup(int $fixup, Node $subNode, ?string $parentClass, int $subStartPos, int $subEndPos): string { switch ($fixup) { case self::FIXUP_PREC_LEFT: // We use a conservative approximation where lhsPrecedence == precedence. if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { $precedence = $this->precedenceMap[$parentClass][1]; return $this->p($subNode, $precedence, $precedence); } break; case self::FIXUP_PREC_RIGHT: if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { $precedence = $this->precedenceMap[$parentClass][2]; return $this->p($subNode, $precedence, $precedence); } break; case self::FIXUP_PREC_UNARY: if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { $precedence = $this->precedenceMap[$parentClass][0]; return $this->p($subNode, $precedence, $precedence); } break; case self::FIXUP_CALL_LHS: if ($this->callLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos) ) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_DEREF_LHS: if ($this->dereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos) ) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_STATIC_DEREF_LHS: if ($this->staticDereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos) ) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_NEW: if ($this->newOperandRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_BRACED_NAME: case self::FIXUP_VAR_BRACED_NAME: if ($subNode instanceof Expr && !$this->origTokens->haveBraces($subStartPos, $subEndPos) ) { return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') . '{' . $this->p($subNode) . '}'; } break; case self::FIXUP_ENCAPSED: if (!$subNode instanceof Node\InterpolatedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos) ) { return '{' . $this->p($subNode) . '}'; } break; default: throw new \Exception('Cannot happen'); } // Nothing special to do return $this->p($subNode); } /** * Appends to a string, ensuring whitespace between label characters. * * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". * Without safeAppend the result would be "echox", which does not preserve semantics. */ protected function safeAppend(string &$str, string $append): void { if ($str === "") { $str = $append; return; } if ($append === "") { return; } if (!$this->labelCharMap[$append[0]] || !$this->labelCharMap[$str[\strlen($str) - 1]]) { $str .= $append; } else { $str .= " " . $append; } } /** * Determines whether the LHS of a call must be wrapped in parenthesis. * * @param Node $node LHS of a call * * @return bool Whether parentheses are required */ protected function callLhsRequiresParens(Node $node): bool { if ($node instanceof Expr\New_) { return !$this->phpVersion->supportsNewDereferenceWithoutParentheses(); } return !($node instanceof Node\Name || $node instanceof Expr\Variable || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_); } /** * Determines whether the LHS of an array/object operation must be wrapped in parentheses. * * @param Node $node LHS of dereferencing operation * * @return bool Whether parentheses are required */ protected function dereferenceLhsRequiresParens(Node $node): bool { // A constant can occur on the LHS of an array/object deref, but not a static deref. return $this->staticDereferenceLhsRequiresParens($node) && !$node instanceof Expr\ConstFetch; } /** * Determines whether the LHS of a static operation must be wrapped in parentheses. * * @param Node $node LHS of dereferencing operation * * @return bool Whether parentheses are required */ protected function staticDereferenceLhsRequiresParens(Node $node): bool { if ($node instanceof Expr\New_) { return !$this->phpVersion->supportsNewDereferenceWithoutParentheses(); } return !($node instanceof Expr\Variable || $node instanceof Node\Name || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || $node instanceof Expr\NullsafePropertyFetch || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_ || $node instanceof Scalar\String_ || $node instanceof Expr\ClassConstFetch); } /** * Determines whether an expression used in "new" or "instanceof" requires parentheses. * * @param Node $node New or instanceof operand * * @return bool Whether parentheses are required */ protected function newOperandRequiresParens(Node $node): bool { if ($node instanceof Node\Name || $node instanceof Expr\Variable) { return false; } if ($node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || $node instanceof Expr\NullsafePropertyFetch ) { return $this->newOperandRequiresParens($node->var); } if ($node instanceof Expr\StaticPropertyFetch) { return $this->newOperandRequiresParens($node->class); } return true; } /** * Print modifiers, including trailing whitespace. * * @param int $modifiers Modifier mask to print * * @return string Printed modifiers */ protected function pModifiers(int $modifiers): string { return ($modifiers & Modifiers::FINAL ? 'final ' : '') . ($modifiers & Modifiers::ABSTRACT ? 'abstract ' : '') . ($modifiers & Modifiers::PUBLIC ? 'public ' : '') . ($modifiers & Modifiers::PROTECTED ? 'protected ' : '') . ($modifiers & Modifiers::PRIVATE ? 'private ' : '') . ($modifiers & Modifiers::PUBLIC_SET ? 'public(set) ' : '') . ($modifiers & Modifiers::PROTECTED_SET ? 'protected(set) ' : '') . ($modifiers & Modifiers::PRIVATE_SET ? 'private(set) ' : '') . ($modifiers & Modifiers::STATIC ? 'static ' : '') . ($modifiers & Modifiers::READONLY ? 'readonly ' : ''); } protected function pStatic(bool $static): string { return $static ? 'static ' : ''; } /** * Determine whether a list of nodes uses multiline formatting. * * @param (Node|null)[] $nodes Node list * * @return bool Whether multiline formatting is used */ protected function isMultiline(array $nodes): bool { if (\count($nodes) < 2) { return false; } $pos = -1; foreach ($nodes as $node) { if (null === $node) { continue; } $endPos = $node->getEndTokenPos() + 1; if ($pos >= 0) { $text = $this->origTokens->getTokenCode($pos, $endPos, 0); if (false === strpos($text, "\n")) { // We require that a newline is present between *every* item. If the formatting // is inconsistent, with only some items having newlines, we don't consider it // as multiline return false; } } $pos = $endPos; } return true; } /** * Lazily initializes label char map. * * The label char map determines whether a certain character may occur in a label. */ protected function initializeLabelCharMap(): void { if (isset($this->labelCharMap)) { return; } $this->labelCharMap = []; for ($i = 0; $i < 256; $i++) { $chr = chr($i); $this->labelCharMap[$chr] = $i >= 0x80 || ctype_alnum($chr); } if ($this->phpVersion->allowsDelInIdentifiers()) { $this->labelCharMap["\x7f"] = true; } } /** * Lazily initializes node list differ. * * The node list differ is used to determine differences between two array subnodes. */ protected function initializeNodeListDiffer(): void { if (isset($this->nodeListDiffer)) { return; } $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { if ($a instanceof Node && $b instanceof Node) { return $a === $b->getAttribute('origNode'); } // Can happen for array destructuring return $a === null && $b === null; }); } /** * Lazily initializes fixup map. * * The fixup map is used to determine whether a certain subnode of a certain node may require * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. */ protected function initializeFixupMap(): void { if (isset($this->fixupMap)) { return; } $this->fixupMap = [ Expr\Instanceof_::class => [ 'expr' => self::FIXUP_PREC_UNARY, 'class' => self::FIXUP_NEW, ], Expr\Ternary::class => [ 'cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT, ], Expr\Yield_::class => ['value' => self::FIXUP_PREC_UNARY], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS], Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\ClassConstFetch::class => [ 'class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\New_::class => ['class' => self::FIXUP_NEW], Expr\MethodCall::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\NullsafeMethodCall::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\StaticPropertyFetch::class => [ 'class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME, ], Expr\PropertyFetch::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\NullsafePropertyFetch::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Scalar\InterpolatedString::class => [ 'parts' => self::FIXUP_ENCAPSED, ], ]; $binaryOps = [ BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class, BinaryOp\Pipe::class, ]; foreach ($binaryOps as $binaryOp) { $this->fixupMap[$binaryOp] = [ 'left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT ]; } $prefixOps = [ Expr\Clone_::class, Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class, Expr\ArrowFunction::class, Expr\Throw_::class, ]; foreach ($prefixOps as $prefixOp) { $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_UNARY]; } } /** * Lazily initializes the removal map. * * The removal map is used to determine which additional tokens should be removed when a * certain node is replaced by null. */ protected function initializeRemovalMap(): void { if (isset($this->removalMap)) { return; } $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; $stripLeft = ['left' => \T_WHITESPACE]; $stripRight = ['right' => \T_WHITESPACE]; $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; $stripColon = ['left' => ':']; $stripEquals = ['left' => '=']; $this->removalMap = [ 'Expr_ArrayDimFetch->dim' => $stripBoth, 'ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassConst->type' => $stripRight, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'PropertyItem->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft, // 'Stmt_Case->cond': Replace with "default" // 'Stmt_Class->name': Unclear what to do // 'Stmt_Declare->stmts': Not a plain node // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node ]; } protected function initializeInsertionMap(): void { if (isset($this->insertionMap)) { return; } // TODO: "yield" where both key and value are inserted doesn't work // [$find, $beforeToken, $extraLeft, $extraRight] $this->insertionMap = [ 'Expr_ArrayDimFetch->dim' => ['[', false, null, null], 'ArrayItem->key' => [null, false, null, ' => '], 'Expr_ArrowFunction->returnType' => [')', false, ': ', null], 'Expr_Closure->returnType' => [')', false, ': ', null], 'Expr_Ternary->if' => ['?', false, ' ', ' '], 'Expr_Yield->key' => [\T_YIELD, false, null, ' => '], 'Expr_Yield->value' => [\T_YIELD, false, ' ', null], 'Param->type' => [null, false, null, ' '], 'Param->default' => [null, false, ' = ', null], 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], 'Stmt_Catch->var' => [null, false, ' ', null], 'Stmt_ClassMethod->returnType' => [')', false, ': ', null], 'Stmt_ClassConst->type' => [\T_CONST, false, ' ', null], 'Stmt_Class->extends' => [null, false, ' extends ', null], 'Stmt_Enum->scalarType' => [null, false, ' : ', null], 'Stmt_EnumCase->expr' => [null, false, ' = ', null], 'Expr_PrintableNewAnonClass->extends' => [null, false, ' extends ', null], 'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null], 'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '], 'Stmt_Function->returnType' => [')', false, ': ', null], 'Stmt_If->else' => [null, false, ' ', null], 'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null], 'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '], 'PropertyItem->default' => [null, false, ' = ', null], 'Stmt_Return->expr' => [\T_RETURN, false, ' ', null], 'Stmt_StaticVar->default' => [null, false, ' = ', null], //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO 'Stmt_TryCatch->finally' => [null, false, ' ', null], // 'Expr_Exit->expr': Complicated due to optional () // 'Stmt_Case->cond': Conversion from default to case // 'Stmt_Class->name': Unclear // 'Stmt_Declare->stmts': Not a proper node // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node ]; } protected function initializeListInsertionMap(): void { if (isset($this->listInsertionMap)) { return; } $this->listInsertionMap = [ // special //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully //'Scalar_InterpolatedString->parts' => '', Stmt\Catch_::class . '->types' => '|', UnionType::class . '->types' => '|', IntersectionType::class . '->types' => '&', Stmt\If_::class . '->elseifs' => ' ', Stmt\TryCatch::class . '->catches' => ' ', // comma-separated lists Expr\Array_::class . '->items' => ', ', Expr\ArrowFunction::class . '->params' => ', ', Expr\Closure::class . '->params' => ', ', Expr\Closure::class . '->uses' => ', ', Expr\FuncCall::class . '->args' => ', ', Expr\Isset_::class . '->vars' => ', ', Expr\List_::class . '->items' => ', ', Expr\MethodCall::class . '->args' => ', ', Expr\NullsafeMethodCall::class . '->args' => ', ', Expr\New_::class . '->args' => ', ', PrintableNewAnonClassNode::class . '->args' => ', ', Expr\StaticCall::class . '->args' => ', ', Stmt\ClassConst::class . '->consts' => ', ', Stmt\ClassMethod::class . '->params' => ', ', Stmt\Class_::class . '->implements' => ', ', Stmt\Enum_::class . '->implements' => ', ', PrintableNewAnonClassNode::class . '->implements' => ', ', Stmt\Const_::class . '->consts' => ', ', Stmt\Declare_::class . '->declares' => ', ', Stmt\Echo_::class . '->exprs' => ', ', Stmt\For_::class . '->init' => ', ', Stmt\For_::class . '->cond' => ', ', Stmt\For_::class . '->loop' => ', ', Stmt\Function_::class . '->params' => ', ', Stmt\Global_::class . '->vars' => ', ', Stmt\GroupUse::class . '->uses' => ', ', Stmt\Interface_::class . '->extends' => ', ', Expr\Match_::class . '->arms' => ', ', Stmt\Property::class . '->props' => ', ', Stmt\StaticVar::class . '->vars' => ', ', Stmt\TraitUse::class . '->traits' => ', ', Stmt\TraitUseAdaptation\Precedence::class . '->insteadof' => ', ', Stmt\Unset_::class . '->vars' => ', ', Stmt\UseUse::class . '->uses' => ', ', MatchArm::class . '->conds' => ', ', AttributeGroup::class . '->attrs' => ', ', PropertyHook::class . '->params' => ', ', // statement lists Expr\Closure::class . '->stmts' => "\n", Stmt\Case_::class . '->stmts' => "\n", Stmt\Catch_::class . '->stmts' => "\n", Stmt\Class_::class . '->stmts' => "\n", Stmt\Enum_::class . '->stmts' => "\n", PrintableNewAnonClassNode::class . '->stmts' => "\n", Stmt\Interface_::class . '->stmts' => "\n", Stmt\Trait_::class . '->stmts' => "\n", Stmt\ClassMethod::class . '->stmts' => "\n", Stmt\Declare_::class . '->stmts' => "\n", Stmt\Do_::class . '->stmts' => "\n", Stmt\ElseIf_::class . '->stmts' => "\n", Stmt\Else_::class . '->stmts' => "\n", Stmt\Finally_::class . '->stmts' => "\n", Stmt\Foreach_::class . '->stmts' => "\n", Stmt\For_::class . '->stmts' => "\n", Stmt\Function_::class . '->stmts' => "\n", Stmt\If_::class . '->stmts' => "\n", Stmt\Namespace_::class . '->stmts' => "\n", Stmt\Block::class . '->stmts' => "\n", // Attribute groups Stmt\Class_::class . '->attrGroups' => "\n", Stmt\Enum_::class . '->attrGroups' => "\n", Stmt\EnumCase::class . '->attrGroups' => "\n", Stmt\Interface_::class . '->attrGroups' => "\n", Stmt\Trait_::class . '->attrGroups' => "\n", Stmt\Function_::class . '->attrGroups' => "\n", Stmt\ClassMethod::class . '->attrGroups' => "\n", Stmt\ClassConst::class . '->attrGroups' => "\n", Stmt\Property::class . '->attrGroups' => "\n", PrintableNewAnonClassNode::class . '->attrGroups' => ' ', Expr\Closure::class . '->attrGroups' => ' ', Expr\ArrowFunction::class . '->attrGroups' => ' ', Param::class . '->attrGroups' => ' ', PropertyHook::class . '->attrGroups' => ' ', Stmt\Switch_::class . '->cases' => "\n", Stmt\TraitUse::class . '->adaptations' => "\n", Stmt\TryCatch::class . '->stmts' => "\n", Stmt\While_::class . '->stmts' => "\n", PropertyHook::class . '->body' => "\n", Stmt\Property::class . '->hooks' => "\n", Param::class . '->hooks' => "\n", // dummy for top-level context 'File->stmts' => "\n", ]; } protected function initializeEmptyListInsertionMap(): void { if (isset($this->emptyListInsertionMap)) { return; } // TODO Insertion into empty statement lists. // [$find, $extraLeft, $extraRight] $this->emptyListInsertionMap = [ Expr\ArrowFunction::class . '->params' => ['(', '', ''], Expr\Closure::class . '->uses' => [')', ' use (', ')'], Expr\Closure::class . '->params' => ['(', '', ''], Expr\FuncCall::class . '->args' => ['(', '', ''], Expr\MethodCall::class . '->args' => ['(', '', ''], Expr\NullsafeMethodCall::class . '->args' => ['(', '', ''], Expr\New_::class . '->args' => ['(', '', ''], PrintableNewAnonClassNode::class . '->args' => ['(', '', ''], PrintableNewAnonClassNode::class . '->implements' => [null, ' implements ', ''], Expr\StaticCall::class . '->args' => ['(', '', ''], Stmt\Class_::class . '->implements' => [null, ' implements ', ''], Stmt\Enum_::class . '->implements' => [null, ' implements ', ''], Stmt\ClassMethod::class . '->params' => ['(', '', ''], Stmt\Interface_::class . '->extends' => [null, ' extends ', ''], Stmt\Function_::class . '->params' => ['(', '', ''], Stmt\Interface_::class . '->attrGroups' => [null, '', "\n"], Stmt\Class_::class . '->attrGroups' => [null, '', "\n"], Stmt\ClassConst::class . '->attrGroups' => [null, '', "\n"], Stmt\ClassMethod::class . '->attrGroups' => [null, '', "\n"], Stmt\Function_::class . '->attrGroups' => [null, '', "\n"], Stmt\Property::class . '->attrGroups' => [null, '', "\n"], Stmt\Trait_::class . '->attrGroups' => [null, '', "\n"], Expr\ArrowFunction::class . '->attrGroups' => [null, '', ' '], Expr\Closure::class . '->attrGroups' => [null, '', ' '], Stmt\Const_::class . '->attrGroups' => [null, '', "\n"], PrintableNewAnonClassNode::class . '->attrGroups' => [\T_NEW, ' ', ''], /* These cannot be empty to start with: * Expr_Isset->vars * Stmt_Catch->types * Stmt_Const->consts * Stmt_ClassConst->consts * Stmt_Declare->declares * Stmt_Echo->exprs * Stmt_Global->vars * Stmt_GroupUse->uses * Stmt_Property->props * Stmt_StaticVar->vars * Stmt_TraitUse->traits * Stmt_TraitUseAdaptation_Precedence->insteadof * Stmt_Unset->vars * Stmt_Use->uses * UnionType->types */ /* TODO * Stmt_If->elseifs * Stmt_TryCatch->catches * Expr_Array->items * Expr_List->items * Stmt_For->init * Stmt_For->cond * Stmt_For->loop */ ]; } protected function initializeModifierChangeMap(): void { if (isset($this->modifierChangeMap)) { return; } $this->modifierChangeMap = [ Stmt\ClassConst::class . '->flags' => ['pModifiers', \T_WHITESPACE, \T_CONST], Stmt\ClassMethod::class . '->flags' => ['pModifiers', \T_WHITESPACE, \T_FUNCTION], Stmt\Class_::class . '->flags' => ['pModifiers', \T_WHITESPACE, \T_CLASS], Stmt\Property::class . '->flags' => ['pModifiers', \T_WHITESPACE, \T_VARIABLE], PrintableNewAnonClassNode::class . '->flags' => ['pModifiers', \T_NEW, \T_CLASS], Param::class . '->flags' => ['pModifiers', \T_WHITESPACE, \T_VARIABLE], PropertyHook::class . '->flags' => ['pModifiers', \T_WHITESPACE, \T_STRING], Expr\Closure::class . '->static' => ['pStatic', \T_WHITESPACE, \T_FUNCTION], Expr\ArrowFunction::class . '->static' => ['pStatic', \T_WHITESPACE, \T_FN], //Stmt\TraitUseAdaptation\Alias::class . '->newModifier' => 0, // TODO ]; // List of integer subnodes that are not modifiers: // Expr_Include->type // Stmt_GroupUse->type // Stmt_Use->type // UseItem->type } } [aliasName => originalName]] */ protected array $aliases = []; /** @var Name[][] Same as $aliases but preserving original case */ protected array $origAliases = []; /** @var ErrorHandler Error handler */ protected ErrorHandler $errorHandler; /** * Create a name context. * * @param ErrorHandler $errorHandler Error handling used to report errors */ public function __construct(ErrorHandler $errorHandler) { $this->errorHandler = $errorHandler; } /** * Start a new namespace. * * This also resets the alias table. * * @param Name|null $namespace Null is the global namespace */ public function startNamespace(?Name $namespace = null): void { $this->namespace = $namespace; $this->origAliases = $this->aliases = [ Stmt\Use_::TYPE_NORMAL => [], Stmt\Use_::TYPE_FUNCTION => [], Stmt\Use_::TYPE_CONSTANT => [], ]; } /** * Add an alias / import. * * @param Name $name Original name * @param string $aliasName Aliased name * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * @param array $errorAttrs Attributes to use to report an error */ public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []): void { // Constant names are case sensitive, everything else case insensitive if ($type === Stmt\Use_::TYPE_CONSTANT) { $aliasLookupName = $aliasName; } else { $aliasLookupName = strtolower($aliasName); } if (isset($this->aliases[$type][$aliasLookupName])) { $typeStringMap = [ Stmt\Use_::TYPE_NORMAL => '', Stmt\Use_::TYPE_FUNCTION => 'function ', Stmt\Use_::TYPE_CONSTANT => 'const ', ]; $this->errorHandler->handleError(new Error( sprintf( 'Cannot use %s%s as %s because the name is already in use', $typeStringMap[$type], $name, $aliasName ), $errorAttrs )); return; } $this->aliases[$type][$aliasLookupName] = $name; $this->origAliases[$type][$aliasName] = $name; } /** * Get current namespace. * * @return null|Name Namespace (or null if global namespace) */ public function getNamespace(): ?Name { return $this->namespace; } /** * Get resolved name. * * @param Name $name Name to resolve * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} * * @return null|Name Resolved name, or null if static resolution is not possible */ public function getResolvedName(Name $name, int $type): ?Name { // don't resolve special class names if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { if (!$name->isUnqualified()) { $this->errorHandler->handleError(new Error( sprintf("'\\%s' is an invalid class name", $name->toString()), $name->getAttributes() )); } return $name; } // fully qualified names are already resolved if ($name->isFullyQualified()) { return $name; } // Try to resolve aliases if (null !== $resolvedName = $this->resolveAlias($name, $type)) { return $resolvedName; } if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { if (null === $this->namespace) { // outside of a namespace unaliased unqualified is same as fully qualified return new FullyQualified($name, $name->getAttributes()); } // Cannot resolve statically return null; } // if no alias exists prepend current namespace return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); } /** * Get resolved class name. * * @param Name $name Class ame to resolve * * @return Name Resolved name */ public function getResolvedClassName(Name $name): Name { return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); } /** * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). * * @param string $name Fully-qualified name (without leading namespace separator) * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name[] Possible representations of the name */ public function getPossibleNames(string $name, int $type): array { $lcName = strtolower($name); if ($type === Stmt\Use_::TYPE_NORMAL) { // self, parent and static must always be unqualified if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { return [new Name($name)]; } } // Collect possible ways to write this name, starting with the fully-qualified name $possibleNames = [new FullyQualified($name)]; if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) { // Make sure there is no alias that makes the normally namespace-relative name // into something else if (null === $this->resolveAlias($nsRelativeName, $type)) { $possibleNames[] = $nsRelativeName; } } // Check for relevant namespace use statements foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { $lcOrig = $orig->toLowerString(); if (0 === strpos($lcName, $lcOrig . '\\')) { $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig))); } } // Check for relevant type-specific use statements foreach ($this->origAliases[$type] as $alias => $orig) { if ($type === Stmt\Use_::TYPE_CONSTANT) { // Constants are complicated-sensitive $normalizedOrig = $this->normalizeConstName($orig->toString()); if ($normalizedOrig === $this->normalizeConstName($name)) { $possibleNames[] = new Name($alias); } } else { // Everything else is case-insensitive if ($orig->toLowerString() === $lcName) { $possibleNames[] = new Name($alias); } } } return $possibleNames; } /** * Get shortest representation of this fully-qualified name. * * @param string $name Fully-qualified name (without leading namespace separator) * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name Shortest representation */ public function getShortName(string $name, int $type): Name { $possibleNames = $this->getPossibleNames($name, $type); // Find shortest name $shortestName = null; $shortestLength = \INF; foreach ($possibleNames as $possibleName) { $length = strlen($possibleName->toCodeString()); if ($length < $shortestLength) { $shortestName = $possibleName; $shortestLength = $length; } } return $shortestName; } private function resolveAlias(Name $name, int $type): ?FullyQualified { $firstPart = $name->getFirst(); if ($name->isQualified()) { // resolve aliases for qualified names, always against class alias table $checkName = strtolower($firstPart); if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); } } elseif ($name->isUnqualified()) { // constant aliases are case-sensitive, function aliases case-insensitive $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart); if (isset($this->aliases[$type][$checkName])) { // resolve unqualified aliases return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); } } // No applicable aliases return null; } private function getNamespaceRelativeName(string $name, string $lcName, int $type): ?Name { if (null === $this->namespace) { return new Name($name); } if ($type === Stmt\Use_::TYPE_CONSTANT) { // The constants true/false/null always resolve to the global symbols, even inside a // namespace, so they may be used without qualification if ($lcName === "true" || $lcName === "false" || $lcName === "null") { return new Name($name); } } $namespacePrefix = strtolower($this->namespace . '\\'); if (0 === strpos($lcName, $namespacePrefix)) { return new Name(substr($name, strlen($namespacePrefix))); } return null; } private function normalizeConstName(string $name): string { $nsSep = strrpos($name, '\\'); if (false === $nsSep) { return $name; } // Constants have case-insensitive namespace and case-sensitive short-name $ns = substr($name, 0, $nsSep); $shortName = substr($name, $nsSep + 1); return strtolower($ns) . '\\' . $shortName; } } [] Node type to reflection class map */ private array $reflectionClassCache; /** @return mixed */ public function decode(string $json) { $value = json_decode($json, true); if (json_last_error()) { throw new \RuntimeException('JSON decoding error: ' . json_last_error_msg()); } return $this->decodeRecursive($value); } /** * @param mixed $value * @return mixed */ private function decodeRecursive($value) { if (\is_array($value)) { if (isset($value['nodeType'])) { if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { return $this->decodeComment($value); } return $this->decodeNode($value); } return $this->decodeArray($value); } return $value; } private function decodeArray(array $array): array { $decodedArray = []; foreach ($array as $key => $value) { $decodedArray[$key] = $this->decodeRecursive($value); } return $decodedArray; } private function decodeNode(array $value): Node { $nodeType = $value['nodeType']; if (!\is_string($nodeType)) { throw new \RuntimeException('Node type must be a string'); } $reflectionClass = $this->reflectionClassFromNodeType($nodeType); $node = $reflectionClass->newInstanceWithoutConstructor(); if (isset($value['attributes'])) { if (!\is_array($value['attributes'])) { throw new \RuntimeException('Attributes must be an array'); } $node->setAttributes($this->decodeArray($value['attributes'])); } foreach ($value as $name => $subNode) { if ($name === 'nodeType' || $name === 'attributes') { continue; } $node->$name = $this->decodeRecursive($subNode); } return $node; } private function decodeComment(array $value): Comment { $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; if (!isset($value['text'])) { throw new \RuntimeException('Comment must have text'); } return new $className( $value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1 ); } /** @return \ReflectionClass */ private function reflectionClassFromNodeType(string $nodeType): \ReflectionClass { if (!isset($this->reflectionClassCache[$nodeType])) { $className = $this->classNameFromNodeType($nodeType); $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); } return $this->reflectionClassCache[$nodeType]; } /** @return class-string */ private function classNameFromNodeType(string $nodeType): string { $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\'); if (class_exists($className)) { return $className; } $className .= '_'; if (class_exists($className)) { return $className; } throw new \RuntimeException("Unknown node type \"$nodeType\""); } } $attributes Additional attributes */ public function __construct(Expr $value, ?Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) { $this->attributes = $attributes; $this->key = $key; $this->value = $value; $this->byRef = $byRef; $this->unpack = $unpack; } public function getSubNodeNames(): array { return ['key', 'value', 'byRef', 'unpack']; } public function getType(): string { return 'ArrayItem'; } } // @deprecated compatibility alias class_alias(ArrayItem::class, Expr\ArrayItem::class); $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_Clone'; } } Arguments */ public array $args; /** * Constructs a function call node. * * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Node $class, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->args = $args; } public function getSubNodeNames(): array { return ['class', 'args']; } public function getType(): string { return 'Expr_New'; } public function getRawArgs(): array { return $this->args; } } '; } public function getType(): string { return 'Expr_BinaryOp_Pipe'; } } '; } public function getType(): string { return 'Expr_BinaryOp_Greater'; } } ='; } public function getType(): string { return 'Expr_BinaryOp_GreaterOrEqual'; } } '; } public function getType(): string { return 'Expr_BinaryOp_Spaceship'; } } >'; } public function getType(): string { return 'Expr_BinaryOp_ShiftRight'; } } $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames(): array { return ['vars']; } public function getType(): string { return 'Expr_Isset'; } } $attributes Additional attributes */ public function __construct(array $items = [], array $attributes = []) { $this->attributes = $attributes; $this->items = $items; } public function getSubNodeNames(): array { return ['items']; } public function getType(): string { return 'Expr_Array'; } } $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } public function getSubNodeNames(): array { return ['name']; } public function getType(): string { return 'Expr_Variable'; } } $attributes Additional attributes */ public function __construct(Expr $var, ?Expr $dim = null, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->dim = $dim; } public function getSubNodeNames(): array { return ['var', 'dim']; } public function getType(): string { return 'Expr_ArrayDimFetch'; } } Arguments */ public array $args; /** * Constructs a function call node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames(): array { return ['var', 'name', 'args']; } public function getType(): string { return 'Expr_MethodCall'; } public function getRawArgs(): array { return $this->args; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_ErrorSuppress'; } } $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames(): array { return ['var', 'expr']; } } $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames(): array { return ['var', 'expr']; } public function getType(): string { return 'Expr_AssignRef'; } } $attributes Additional attributes */ public function __construct(Expr $expr, Node $class, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; $this->class = $class; } public function getSubNodeNames(): array { return ['expr', 'class']; } public function getType(): string { return 'Expr_Instanceof'; } } $attributes Additional attributes */ public function __construct(?Expr $value = null, ?Expr $key = null, array $attributes = []) { $this->attributes = $attributes; $this->key = $key; $this->value = $value; } public function getSubNodeNames(): array { return ['key', 'value']; } public function getType(): string { return 'Expr_Yield'; } } $attributes Additional attributes */ public function __construct(Name $name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } public function getSubNodeNames(): array { return ['name']; } public function getType(): string { return 'Expr_ConstFetch'; } } $attributes Additional attributes */ public function __construct(Node $class, $name, array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames(): array { return ['class', 'name']; } public function getType(): string { return 'Expr_ClassConstFetch'; } } $attributes Additional attributes */ public function __construct(array $parts, array $attributes = []) { $this->attributes = $attributes; $this->parts = $parts; } public function getSubNodeNames(): array { return ['parts']; } public function getType(): string { return 'Expr_ShellExec'; } } $attributes Additional attributes */ public function __construct(Expr $left, Expr $right, array $attributes = []) { $this->attributes = $attributes; $this->left = $left; $this->right = $right; } public function getSubNodeNames(): array { return ['left', 'right']; } /** * Get the operator sigil for this binary operation. * * In the case there are multiple possible sigils for an operator, this method does not * necessarily return the one used in the parsed code. */ abstract public function getOperatorSigil(): string; } $attributes Additional attributes */ public function __construct(array $items, array $attributes = []) { $this->attributes = $attributes; $this->items = $items; } public function getSubNodeNames(): array { return ['items']; } public function getType(): string { return 'Expr_List'; } } false : Whether the closure is static * 'byRef' => false : Whether to return by reference * 'params' => array() : Parameters * 'returnType' => null : Return type * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct(array $subNodes, array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? false; $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; $this->returnType = $subNodes['returnType'] ?? null; $this->expr = $subNodes['expr']; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; } public function returnsByRef(): bool { return $this->byRef; } public function getParams(): array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getAttrGroups(): array { return $this->attrGroups; } /** * @return Node\Stmt\Return_[] */ public function getStmts(): array { return [new Node\Stmt\Return_($this->expr)]; } public function getType(): string { return 'Expr_ArrowFunction'; } } $attributes Additional attributes */ public function __construct(Expr $var, $name, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames(): array { return ['var', 'name']; } public function getType(): string { return 'Expr_NullsafePropertyFetch'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_UnaryPlus'; } } false : Whether the closure is static * 'byRef' => false : Whether to return by reference * 'params' => array(): Parameters * 'uses' => array(): use()s * 'returnType' => null : Return type * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attributes groups * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? false; $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; $this->uses = $subNodes['uses'] ?? []; $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; } public function returnsByRef(): bool { return $this->byRef; } public function getParams(): array { return $this->params; } public function getReturnType() { return $this->returnType; } /** @return Node\Stmt[] */ public function getStmts(): array { return $this->stmts; } public function getAttrGroups(): array { return $this->attrGroups; } public function getType(): string { return 'Expr_Closure'; } } $attributes Additional attributes */ public function __construct(Expr $expr, int $type, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; $this->type = $type; } public function getSubNodeNames(): array { return ['expr', 'type']; } public function getType(): string { return 'Expr_Include'; } } */ abstract public function getRawArgs(): array; /** * Returns whether this call expression is actually a first class callable. */ public function isFirstClassCallable(): bool { $rawArgs = $this->getRawArgs(); return count($rawArgs) === 1 && current($rawArgs) instanceof VariadicPlaceholder; } /** * Assert that this is not a first-class callable and return only ordinary Args. * * @return Arg[] */ public function getArgs(): array { assert(!$this->isFirstClassCallable()); return $this->getRawArgs(); } /** * Retrieves a specific argument from the raw arguments. * * Returns the named argument that matches the given `$name`, or the * positional (unnamed) argument that exists at the given `$position`, * otherwise, returns `null` for first-class callables or if no match is found. */ public function getArg(string $name, int $position): ?Arg { if ($this->isFirstClassCallable()) { return null; } foreach ($this->getRawArgs() as $i => $arg) { if ($arg->unpack) { continue; } if ( ($arg->name !== null && $arg->name->toString() === $name) || ($arg->name === null && $i === $position) ) { return $arg; } } return null; } } Arguments */ public array $args; /** * Constructs a function call node. * * @param Node\Name|Expr $name Function name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Node $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->args = $args; } public function getSubNodeNames(): array { return ['name', 'args']; } public function getType(): string { return 'Expr_FuncCall'; } public function getRawArgs(): array { return $this->args; } } $attributes Additional attributes */ public function __construct(?Expr $expr = null, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_Exit'; } } $attributes Additional attributes */ public function __construct(Node $class, $name, array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; } public function getSubNodeNames(): array { return ['class', 'name']; } public function getType(): string { return 'Expr_StaticPropertyFetch'; } } $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } public function getSubNodeNames(): array { return ['var']; } public function getType(): string { return 'Expr_PreInc'; } } $attributes Additional attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; } public function getSubNodeNames(): array { return []; } public function getType(): string { return 'Expr_Error'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_BitwiseNot'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_Print'; } } $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } public function getSubNodeNames(): array { return ['var']; } public function getType(): string { return 'Expr_PostInc'; } } $attributes Additional attributes */ public function __construct(Expr $cond, ?Expr $if, Expr $else, array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->if = $if; $this->else = $else; } public function getSubNodeNames(): array { return ['cond', 'if', 'else']; } public function getType(): string { return 'Expr_Ternary'; } } $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames(): array { return ['var', 'expr']; } public function getType(): string { return 'Expr_Assign'; } } $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } public function getSubNodeNames(): array { return ['var']; } public function getType(): string { return 'Expr_PreDec'; } } Arguments */ public array $args; /** * Constructs a static method call node. * * @param Node\Name|Expr $class Class name * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Node $class, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames(): array { return ['class', 'name', 'args']; } public function getType(): string { return 'Expr_StaticCall'; } public function getRawArgs(): array { return $this->args; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } } $attributes Additional attributes */ public function __construct(Expr $var, $name, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames(): array { return ['var', 'name']; } public function getType(): string { return 'Expr_PropertyFetch'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_Eval'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_BooleanNot'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_Empty'; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_UnaryMinus'; } } $attributes Additional attributes */ public function __construct(Node\Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_Throw'; } } $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } public function getSubNodeNames(): array { return ['var']; } public function getType(): string { return 'Expr_PostDec'; } } Arguments */ public array $args; /** * Constructs a nullsafe method call node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames(): array { return ['var', 'name', 'args']; } public function getType(): string { return 'Expr_NullsafeMethodCall'; } public function getRawArgs(): array { return $this->args; } } $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Expr_YieldFrom'; } } $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $arms = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->arms = $arms; } public function getSubNodeNames(): array { return ['cond', 'arms']; } public function getType(): string { return 'Expr_Match'; } } false : Whether to return by reference * 'params' => array(): Parameters * 'returnType' => null : Return type * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->byRef = $subNodes['byRef'] ?? false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; } public function returnsByRef(): bool { return $this->byRef; } public function getParams(): array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getAttrGroups(): array { return $this->attrGroups; } /** @return Node\Stmt[] */ public function getStmts(): array { return $this->stmts; } public function getType(): string { return 'Stmt_Function'; } } array(): Statements * 'elseifs' => array(): Elseif clauses * 'else' => null : Else clause * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $subNodes['stmts'] ?? []; $this->elseifs = $subNodes['elseifs'] ?? []; $this->else = $subNodes['else'] ?? null; } public function getSubNodeNames(): array { return ['cond', 'stmts', 'elseifs', 'else']; } public function getType(): string { return 'Stmt_If'; } } $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['cond', 'stmts']; } public function getType(): string { return 'Stmt_While'; } } $attributes Additional attributes */ public function __construct(Node\Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Stmt_Expression'; } } $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $cases, array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->cases = $cases; } public function getSubNodeNames(): array { return ['cond', 'cases']; } public function getType(): string { return 'Stmt_Switch'; } } $attributes Additional attributes */ public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = []) { $this->attributes = $attributes; $this->type = $type; $this->uses = $uses; } public function getSubNodeNames(): array { return ['type', 'uses']; } public function getType(): string { return 'Stmt_Use'; } } $attributes Additional attributes */ public function __construct(?Node\Expr $expr = null, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames(): array { return ['expr']; } public function getType(): string { return 'Stmt_Return'; } } $attributes Additional attributes */ public function __construct(?Node\Name $name = null, ?array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['name', 'stmts']; } public function getType(): string { return 'Stmt_Namespace'; } } 0 : Flags * 'extends' => null : Name of extended class * 'implements' => array(): Names of implemented interfaces * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->extends = $subNodes['extends'] ?? null; $this->implements = $subNodes['implements'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; } /** * Whether the class is explicitly abstract. */ public function isAbstract(): bool { return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the class is final. */ public function isFinal(): bool { return (bool) ($this->flags & Modifiers::FINAL); } public function isReadonly(): bool { return (bool) ($this->flags & Modifiers::READONLY); } /** * Whether the class is anonymous. */ public function isAnonymous(): bool { return null === $this->name; } public function getType(): string { return 'Stmt_Class'; } } $attributes Additional attributes */ public function __construct(?Node\Expr $num = null, array $attributes = []) { $this->attributes = $attributes; $this->num = $num; } public function getSubNodeNames(): array { return ['num']; } public function getType(): string { return 'Stmt_Break'; } } $attributes Additional attributes */ public function __construct(array $stmts, array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; } public function getType(): string { return 'Stmt_Block'; } public function getSubNodeNames(): array { return ['stmts']; } } $attrGroups PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, ?Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) { parent::__construct($attributes); $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->expr = $expr; $this->attrGroups = $attrGroups; } public function getSubNodeNames(): array { return ['attrGroups', 'name', 'expr']; } public function getType(): string { return 'Stmt_EnumCase'; } } */ private static array $magicNames = [ '__construct' => true, '__destruct' => true, '__call' => true, '__callstatic' => true, '__get' => true, '__set' => true, '__isset' => true, '__unset' => true, '__sleep' => true, '__wakeup' => true, '__tostring' => true, '__set_state' => true, '__clone' => true, '__invoke' => true, '__debuginfo' => true, '__serialize' => true, '__unserialize' => true, ]; /** * Constructs a class method node. * * @param string|Node\Identifier $name Name * @param array{ * flags?: int, * byRef?: bool, * params?: Node\Param[], * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, * stmts?: Node\Stmt[]|null, * attrGroups?: Node\AttributeGroup[], * } $subNodes Array of the following optional subnodes: * 'flags => 0 : Flags * 'byRef' => false : Whether to return by reference * 'params' => array() : Parameters * 'returnType' => null : Return type * 'stmts' => array() : Statements * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; $this->byRef = $subNodes['byRef'] ?? false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; } public function returnsByRef(): bool { return $this->byRef; } public function getParams(): array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getStmts(): ?array { return $this->stmts; } public function getAttrGroups(): array { return $this->attrGroups; } /** * Whether the method is explicitly or implicitly public. */ public function isPublic(): bool { return ($this->flags & Modifiers::PUBLIC) !== 0 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether the method is protected. */ public function isProtected(): bool { return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether the method is private. */ public function isPrivate(): bool { return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether the method is abstract. */ public function isAbstract(): bool { return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the method is final. */ public function isFinal(): bool { return (bool) ($this->flags & Modifiers::FINAL); } /** * Whether the method is static. */ public function isStatic(): bool { return (bool) ($this->flags & Modifiers::STATIC); } /** * Whether the method is magic. */ public function isMagic(): bool { return isset(self::$magicNames[$this->name->toLowerString()]); } public function getType(): string { return 'Stmt_ClassMethod'; } } $attributes Additional attributes */ public function __construct( array $types, ?Expr\Variable $var = null, array $stmts = [], array $attributes = [] ) { $this->attributes = $attributes; $this->types = $types; $this->var = $var; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['types', 'var', 'stmts']; } public function getType(): string { return 'Stmt_Catch'; } } $attributes Additional attributes */ public function __construct(string $remaining, array $attributes = []) { $this->attributes = $attributes; $this->remaining = $remaining; } public function getSubNodeNames(): array { return ['remaining']; } public function getType(): string { return 'Stmt_HaltCompiler'; } } $attributes Additional attributes * @param list $attrGroups PHP attribute groups */ public function __construct( array $consts, array $attributes = [], array $attrGroups = [] ) { $this->attributes = $attributes; $this->attrGroups = $attrGroups; $this->consts = $consts; } public function getSubNodeNames(): array { return ['attrGroups', 'consts']; } public function getType(): string { return 'Stmt_Const'; } } $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames(): array { return ['name']; } public function getType(): string { return 'Stmt_Label'; } } $attributes Additional attributes */ public function __construct(array $exprs, array $attributes = []) { $this->attributes = $attributes; $this->exprs = $exprs; } public function getSubNodeNames(): array { return ['exprs']; } public function getType(): string { return 'Stmt_Echo'; } } $attributes Additional attributes */ public function __construct(array $declares, ?array $stmts = null, array $attributes = []) { $this->attributes = $attributes; $this->declares = $declares; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['declares', 'stmts']; } public function getType(): string { return 'Stmt_Declare'; } } array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'name', 'stmts']; } public function getType(): string { return 'Stmt_Trait'; } } $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['cond', 'stmts']; } public function getType(): string { return 'Stmt_ElseIf'; } } */ public function getTraitUses(): array { $traitUses = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof TraitUse) { $traitUses[] = $stmt; } } return $traitUses; } /** * @return list */ public function getConstants(): array { $constants = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassConst) { $constants[] = $stmt; } } return $constants; } /** * @return list */ public function getProperties(): array { $properties = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { $properties[] = $stmt; } } return $properties; } /** * Gets property with the given name defined directly in this class/interface/trait. * * @param string $name Name of the property * * @return Property|null Property node or null if the property does not exist */ public function getProperty(string $name): ?Property { foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { foreach ($stmt->props as $prop) { if ($prop instanceof PropertyItem && $name === $prop->name->toString()) { return $stmt; } } } } return null; } /** * Gets all methods defined directly in this class/interface/trait * * @return list */ public function getMethods(): array { $methods = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod) { $methods[] = $stmt; } } return $methods; } /** * Gets method with the given name defined directly in this class/interface/trait. * * @param string $name Name of the method (compared case-insensitively) * * @return ClassMethod|null Method node or null if the method does not exist */ public function getMethod(string $name): ?ClassMethod { $lowerName = strtolower($name); foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { return $stmt; } } return null; } } $attributes Additional attributes */ public function __construct(array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['stmts']; } public function getType(): string { return 'Stmt_Else'; } } $attributes Additional attributes */ public function __construct(Name $prefix, array $uses, int $type = Use_::TYPE_NORMAL, array $attributes = []) { $this->attributes = $attributes; $this->type = $type; $this->prefix = $prefix; $this->uses = $uses; } public function getSubNodeNames(): array { return ['type', 'prefix', 'uses']; } public function getType(): string { return 'Stmt_GroupUse'; } } $attributes Additional attributes */ public function __construct(array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['stmts']; } public function getType(): string { return 'Stmt_Finally'; } } $attributes Additional attributes */ public function __construct(?Node\Name $trait, $method, ?int $newModifier, $newName, array $attributes = []) { $this->attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; $this->newModifier = $newModifier; $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; } public function getSubNodeNames(): array { return ['trait', 'method', 'newModifier', 'newName']; } public function getType(): string { return 'Stmt_TraitUseAdaptation_Alias'; } } $attributes Additional attributes */ public function __construct(Node\Name $trait, $method, array $insteadof, array $attributes = []) { $this->attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; $this->insteadof = $insteadof; } public function getSubNodeNames(): array { return ['trait', 'method', 'insteadof']; } public function getType(): string { return 'Stmt_TraitUseAdaptation_Precedence'; } } $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames(): array { return ['value']; } public function getType(): string { return 'Stmt_InlineHTML'; } } $attributes Additional attributes */ public function __construct(array $traits, array $adaptations = [], array $attributes = []) { $this->attributes = $attributes; $this->traits = $traits; $this->adaptations = $adaptations; } public function getSubNodeNames(): array { return ['traits', 'adaptations']; } public function getType(): string { return 'Stmt_TraitUse'; } } null : Scalar type * 'implements' => array() : Names of implemented interfaces * 'stmts' => array() : Statements * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->scalarType = $subNodes['scalarType'] ?? null; $this->implements = $subNodes['implements'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; parent::__construct($attributes); } public function getSubNodeNames(): array { return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; } public function getType(): string { return 'Stmt_Enum'; } } $attributes Additional attributes */ public function __construct(?Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['cond', 'stmts']; } public function getType(): string { return 'Stmt_Case'; } } $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames(): array { return ['vars']; } public function getType(): string { return 'Stmt_Static'; } } $attributes Additional attributes * @param list $attrGroups PHP attribute groups * @param null|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration */ public function __construct( array $consts, int $flags = 0, array $attributes = [], array $attrGroups = [], ?Node $type = null ) { $this->attributes = $attributes; $this->flags = $flags; $this->consts = $consts; $this->attrGroups = $attrGroups; $this->type = $type; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'type', 'consts']; } /** * Whether constant is explicitly or implicitly public. */ public function isPublic(): bool { return ($this->flags & Modifiers::PUBLIC) !== 0 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether constant is protected. */ public function isProtected(): bool { return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether constant is private. */ public function isPrivate(): bool { return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether constant is final. */ public function isFinal(): bool { return (bool) ($this->flags & Modifiers::FINAL); } public function getType(): string { return 'Stmt_ClassConst'; } } $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames(): array { return ['name']; } public function getType(): string { return 'Stmt_Goto'; } } $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames(): array { return ['vars']; } public function getType(): string { return 'Stmt_Unset'; } } null : Variable to assign key to * 'byRef' => false : Whether to assign value by reference * 'stmts' => array(): Statements * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; $this->keyVar = $subNodes['keyVar'] ?? null; $this->byRef = $subNodes['byRef'] ?? false; $this->valueVar = $valueVar; $this->stmts = $subNodes['stmts'] ?? []; } public function getSubNodeNames(): array { return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; } public function getType(): string { return 'Stmt_Foreach'; } } array(): Init expressions * 'cond' => array(): Loop conditions * 'loop' => array(): Loop expressions * 'stmts' => array(): Statements * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->init = $subNodes['init'] ?? []; $this->cond = $subNodes['cond'] ?? []; $this->loop = $subNodes['loop'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; } public function getSubNodeNames(): array { return ['init', 'cond', 'loop', 'stmts']; } public function getType(): string { return 'Stmt_For'; } } $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames(): array { return ['stmts', 'cond']; } public function getType(): string { return 'Stmt_Do'; } } $attributes Additional attributes */ public function __construct(array $stmts, array $catches, ?Finally_ $finally = null, array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; $this->catches = $catches; $this->finally = $finally; } public function getSubNodeNames(): array { return ['stmts', 'catches', 'finally']; } public function getType(): string { return 'Stmt_TryCatch'; } } $attributes Additional attributes * @param null|Identifier|Name|ComplexType $type Type declaration * @param Node\AttributeGroup[] $attrGroups PHP attribute groups * @param Node\PropertyHook[] $hooks Property hooks */ public function __construct(int $flags, array $props, array $attributes = [], ?Node $type = null, array $attrGroups = [], array $hooks = []) { $this->attributes = $attributes; $this->flags = $flags; $this->props = $props; $this->type = $type; $this->attrGroups = $attrGroups; $this->hooks = $hooks; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'type', 'props', 'hooks']; } /** * Whether the property is explicitly or implicitly public. */ public function isPublic(): bool { return ($this->flags & Modifiers::PUBLIC) !== 0 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether the property is protected. */ public function isProtected(): bool { return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether the property is private. */ public function isPrivate(): bool { return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether the property is static. */ public function isStatic(): bool { return (bool) ($this->flags & Modifiers::STATIC); } /** * Whether the property is readonly. */ public function isReadonly(): bool { return (bool) ($this->flags & Modifiers::READONLY); } /** * Whether the property is abstract. */ public function isAbstract(): bool { return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the property is final. */ public function isFinal(): bool { return (bool) ($this->flags & Modifiers::FINAL); } /** * Whether the property has explicit public(set) visibility. */ public function isPublicSet(): bool { return (bool) ($this->flags & Modifiers::PUBLIC_SET); } /** * Whether the property has explicit protected(set) visibility. */ public function isProtectedSet(): bool { return (bool) ($this->flags & Modifiers::PROTECTED_SET); } /** * Whether the property has explicit private(set) visibility. */ public function isPrivateSet(): bool { return (bool) ($this->flags & Modifiers::PRIVATE_SET); } public function getType(): string { return 'Stmt_Property'; } } $attributes Additional attributes */ public function __construct(?Node\Expr $num = null, array $attributes = []) { $this->attributes = $attributes; $this->num = $num; } public function getSubNodeNames(): array { return ['num']; } public function getType(): string { return 'Stmt_Continue'; } } array(): Name of extended interfaces * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->extends = $subNodes['extends'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames(): array { return ['attrGroups', 'name', 'extends', 'stmts']; } public function getType(): string { return 'Stmt_Interface'; } } $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames(): array { return ['vars']; } public function getType(): string { return 'Stmt_Global'; } } value pair node. * * @param string|Node\Identifier $key Key * @param Node\Expr $value Value * @param array $attributes Additional attributes */ public function __construct($key, Node\Expr $value, array $attributes = []) { $this->attributes = $attributes; $this->key = \is_string($key) ? new Node\Identifier($key) : $key; $this->value = $value; } public function getSubNodeNames(): array { return ['key', 'value']; } public function getType(): string { return 'DeclareItem'; } } // @deprecated compatibility alias class_alias(DeclareItem::class, Stmt\DeclareDeclare::class); toString(); } public function getType(): string { return 'Name_FullyQualified'; } } toString(); } public function getType(): string { return 'Name_Relative'; } } */ public ?array $conds; public Expr $body; /** * @param null|list $conds */ public function __construct(?array $conds, Node\Expr $body, array $attributes = []) { $this->conds = $conds; $this->body = $body; $this->attributes = $attributes; } public function getSubNodeNames(): array { return ['conds', 'body']; } public function getType(): string { return 'MatchArm'; } } $attributes Additional attributes */ public function __construct($name, ?Node\Expr $default = null, array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; $this->default = $default; } public function getSubNodeNames(): array { return ['name', 'default']; } public function getType(): string { return 'PropertyItem'; } } // @deprecated compatibility alias class_alias(PropertyItem::class, Stmt\PropertyProperty::class); $attributes Additional attributes */ public function __construct(array $types, array $attributes = []) { $this->attributes = $attributes; $this->types = $types; } public function getSubNodeNames(): array { return ['types']; } public function getType(): string { return 'UnionType'; } } Attribute arguments */ public array $args; /** * @param Node\Name $name Attribute name * @param list $args Attribute arguments * @param array $attributes Additional node attributes */ public function __construct(Name $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->args = $args; } public function getSubNodeNames(): array { return ['name', 'args']; } public function getType(): string { return 'Attribute'; } } 0 : Flags * 'byRef' => false : Whether hook returns by reference * 'params' => array(): Parameters * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, $body, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->body = $body; $this->flags = $subNodes['flags'] ?? 0; $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function returnsByRef(): bool { return $this->byRef; } public function getParams(): array { return $this->params; } public function getReturnType() { return null; } /** * Whether the property hook is final. */ public function isFinal(): bool { return (bool) ($this->flags & Modifiers::FINAL); } public function getStmts(): ?array { if ($this->body instanceof Expr) { $name = $this->name->toLowerString(); if ($name === 'get') { return [new Return_($this->body)]; } if ($name === 'set') { if (!$this->hasAttribute('propertyName')) { throw new \LogicException( 'Can only use getStmts() on a "set" hook if the "propertyName" attribute is set'); } $propName = $this->getAttribute('propertyName'); $prop = new PropertyFetch(new Variable('this'), (string) $propName); return [new Expression(new Assign($prop, $this->body))]; } throw new \LogicException('Unknown property hook "' . $name . '"'); } return $this->body; } public function getAttrGroups(): array { return $this->attrGroups; } public function getType(): string { return 'PropertyHook'; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'body']; } } $attributes Additional attributes */ public function __construct(float $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames(): array { return ['value']; } /** * @param mixed[] $attributes */ public static function fromString(string $str, array $attributes = []): Float_ { $attributes['rawValue'] = $str; $float = self::parse($str); return new Float_($float, $attributes); } /** * @internal * * Parses a DNUMBER token like PHP would. * * @param string $str A string number * * @return float The parsed number */ public static function parse(string $str): float { $str = str_replace('_', '', $str); // Check whether this is one of the special integer notations. if ('0' === $str[0]) { // hex if ('x' === $str[1] || 'X' === $str[1]) { return hexdec($str); } // bin if ('b' === $str[1] || 'B' === $str[1]) { return bindec($str); } // oct, but only if the string does not contain any of '.eE'. if (false === strpbrk($str, '.eE')) { // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit // (8 or 9) so that only the digits before that are used. return octdec(substr($str, 0, strcspn($str, '89'))); } } // dec return (float) $str; } public function getType(): string { return 'Scalar_Float'; } } // @deprecated compatibility alias class_alias(Float_::class, DNumber::class); $attributes Additional attributes */ public function __construct(array $parts, array $attributes = []) { $this->attributes = $attributes; $this->parts = $parts; } public function getSubNodeNames(): array { return ['parts']; } public function getType(): string { return 'Scalar_InterpolatedString'; } } // @deprecated compatibility alias class_alias(InterpolatedString::class, Encapsed::class); Escaped character to its decoded value */ protected static array $replacements = [ '\\' => '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1B", ]; /** * Constructs a string scalar node. * * @param string $value Value of the string * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames(): array { return ['value']; } /** * @param array $attributes * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes */ public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self { $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B'))) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; $attributes['rawValue'] = $str; $string = self::parse($str, $parseUnicodeEscape); return new self($string, $attributes); } /** * @internal * * Parses a string token. * * @param string $str String token content * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string The parsed string */ public static function parse(string $str, bool $parseUnicodeEscape = true): string { $bLength = 0; if ('b' === $str[0] || 'B' === $str[0]) { $bLength = 1; } if ('\'' === $str[$bLength]) { return str_replace( ['\\\\', '\\\''], ['\\', '\''], substr($str, $bLength + 1, -1) ); } else { return self::parseEscapeSequences( substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape ); } } /** * @internal * * Parses escape sequences in strings (all string types apart from single quoted). * * @param string $str String without quotes * @param null|string $quote Quote type * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string String with escape sequences parsed */ public static function parseEscapeSequences(string $str, ?string $quote, bool $parseUnicodeEscape = true): string { if (null !== $quote) { $str = str_replace('\\' . $quote, $quote, $str); } $extra = ''; if ($parseUnicodeEscape) { $extra = '|u\{([0-9a-fA-F]+)\}'; } return preg_replace_callback( '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', function ($matches) { $str = $matches[1]; if (isset(self::$replacements[$str])) { return self::$replacements[$str]; } if ('x' === $str[0] || 'X' === $str[0]) { return chr(hexdec(substr($str, 1))); } if ('u' === $str[0]) { $dec = hexdec($matches[2]); // If it overflowed to float, treat as INT_MAX, it will throw an error anyway. return self::codePointToUtf8(\is_int($dec) ? $dec : \PHP_INT_MAX); } else { return chr(octdec($str) & 255); } }, $str ); } /** * Converts a Unicode code point to its UTF-8 encoded representation. * * @param int $num Code point * * @return string UTF-8 representation of code point */ private static function codePointToUtf8(int $num): string { if ($num <= 0x7F) { return chr($num); } if ($num <= 0x7FF) { return chr(($num >> 6) + 0xC0) . chr(($num & 0x3F) + 0x80); } if ($num <= 0xFFFF) { return chr(($num >> 12) + 0xE0) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); } if ($num <= 0x1FFFFF) { return chr(($num >> 18) + 0xF0) . chr((($num >> 12) & 0x3F) + 0x80) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); } throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); } public function getType(): string { return 'Scalar_String'; } } $attributes Additional attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; } public function getSubNodeNames(): array { return []; } /** * Get name of magic constant. * * @return string Name of magic constant */ abstract public function getName(): string; } $attributes Additional attributes */ public function __construct(int $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames(): array { return ['value']; } /** * Constructs an Int node from a string number literal. * * @param string $str String number literal (decimal, octal, hex or binary) * @param array $attributes Additional attributes * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) * * @return Int_ The constructed LNumber, including kind attribute */ public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false): Int_ { $attributes['rawValue'] = $str; $str = str_replace('_', '', $str); if ('0' !== $str[0] || '0' === $str) { $attributes['kind'] = Int_::KIND_DEC; return new Int_((int) $str, $attributes); } if ('x' === $str[1] || 'X' === $str[1]) { $attributes['kind'] = Int_::KIND_HEX; return new Int_(hexdec($str), $attributes); } if ('b' === $str[1] || 'B' === $str[1]) { $attributes['kind'] = Int_::KIND_BIN; return new Int_(bindec($str), $attributes); } if (!$allowInvalidOctal && strpbrk($str, '89')) { throw new Error('Invalid numeric literal', $attributes); } // Strip optional explicit octal prefix. if ('o' === $str[1] || 'O' === $str[1]) { $str = substr($str, 2); } // use intval instead of octdec to get proper cutting behavior with malformed numbers $attributes['kind'] = Int_::KIND_OCT; return new Int_(intval($str, 8), $attributes); } public function getType(): string { return 'Scalar_Int'; } } // @deprecated compatibility alias class_alias(Int_::class, LNumber::class); $attributes Additional attributes * @param Identifier|null $name Parameter name (for named parameters) */ public function __construct( Expr $value, bool $byRef = false, bool $unpack = false, array $attributes = [], ?Identifier $name = null ) { $this->attributes = $attributes; $this->name = $name; $this->value = $value; $this->byRef = $byRef; $this->unpack = $unpack; } public function getSubNodeNames(): array { return ['name', 'value', 'byRef', 'unpack']; } public function getType(): string { return 'Arg'; } } $attributes Additional attributes */ public function __construct( Expr\Variable $var, ?Node\Expr $default = null, array $attributes = [] ) { $this->attributes = $attributes; $this->var = $var; $this->default = $default; } public function getSubNodeNames(): array { return ['var', 'default']; } public function getType(): string { return 'StaticVar'; } } // @deprecated compatibility alias class_alias(StaticVar::class, Stmt\StaticVar::class); $attributes Additional attributes */ public function __construct($name, Expr $value, array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->value = $value; } public function getSubNodeNames(): array { return ['name', 'value']; } public function getType(): string { return 'Const'; } } $attributes Additional attributes */ public function __construct(Node $type, array $attributes = []) { $this->attributes = $attributes; $this->type = $type; } public function getSubNodeNames(): array { return ['type']; } public function getType(): string { return 'NullableType'; } } $attributes Additional attributes */ public function __construct(Expr\Variable $var, bool $byRef = false, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->byRef = $byRef; } public function getSubNodeNames(): array { return ['var', 'byRef']; } public function getType(): string { return 'ClosureUse'; } } // @deprecated compatibility alias class_alias(ClosureUse::class, Expr\ClosureUse::class); $attributes Additional attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; } public function getType(): string { return 'VariadicPlaceholder'; } public function getSubNodeNames(): array { return []; } } */ private static array $specialClassNames = [ 'self' => true, 'parent' => true, 'static' => true, ]; /** * Constructs a name node. * * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) * @param array $attributes Additional attributes */ final public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = self::prepareName($name); } public function getSubNodeNames(): array { return ['name']; } /** * Get parts of name (split by the namespace separator). * * @psalm-return non-empty-list * @return string[] Parts of name */ public function getParts(): array { return \explode('\\', $this->name); } /** * Gets the first part of the name, i.e. everything before the first namespace separator. * * @return string First part of the name */ public function getFirst(): string { if (false !== $pos = \strpos($this->name, '\\')) { return \substr($this->name, 0, $pos); } return $this->name; } /** * Gets the last part of the name, i.e. everything after the last namespace separator. * * @return string Last part of the name */ public function getLast(): string { if (false !== $pos = \strrpos($this->name, '\\')) { return \substr($this->name, $pos + 1); } return $this->name; } /** * Checks whether the name is unqualified. (E.g. Name) * * @return bool Whether the name is unqualified */ public function isUnqualified(): bool { return false === \strpos($this->name, '\\'); } /** * Checks whether the name is qualified. (E.g. Name\Name) * * @return bool Whether the name is qualified */ public function isQualified(): bool { return false !== \strpos($this->name, '\\'); } /** * Checks whether the name is fully qualified. (E.g. \Name) * * @return bool Whether the name is fully qualified */ public function isFullyQualified(): bool { return false; } /** * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) * * @return bool Whether the name is relative */ public function isRelative(): bool { return false; } /** * Returns a string representation of the name itself, without taking the name type into * account (e.g., not including a leading backslash for fully qualified names). * * @psalm-return non-empty-string * @return string String representation */ public function toString(): string { return $this->name; } /** * Returns a string representation of the name as it would occur in code (e.g., including * leading backslash for fully qualified names. * * @psalm-return non-empty-string * @return string String representation */ public function toCodeString(): string { return $this->toString(); } /** * Returns lowercased string representation of the name, without taking the name type into * account (e.g., no leading backslash for fully qualified names). * * @psalm-return non-empty-string&lowercase-string * @return string Lowercased string representation */ public function toLowerString(): string { return strtolower($this->name); } /** * Checks whether the identifier is a special class name (self, parent or static). * * @return bool Whether identifier is a special class name */ public function isSpecialClassName(): bool { return isset(self::$specialClassNames[strtolower($this->name)]); } /** * Returns a string representation of the name by imploding the namespace parts with the * namespace separator. * * @psalm-return non-empty-string * @return string String representation */ public function __toString(): string { return $this->name; } /** * Gets a slice of a name (similar to array_slice). * * This method returns a new instance of the same type as the original and with the same * attributes. * * If the slice is empty, null is returned. The null value will be correctly handled in * concatenations using concat(). * * Offset and length have the same meaning as in array_slice(). * * @param int $offset Offset to start the slice at (may be negative) * @param int|null $length Length of the slice (may be negative) * * @return static|null Sliced name */ public function slice(int $offset, ?int $length = null) { if ($offset === 1 && $length === null) { // Short-circuit the common case. if (false !== $pos = \strpos($this->name, '\\')) { return new static(\substr($this->name, $pos + 1)); } return null; } $parts = \explode('\\', $this->name); $numParts = \count($parts); $realOffset = $offset < 0 ? $offset + $numParts : $offset; if ($realOffset < 0 || $realOffset > $numParts) { throw new \OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset)); } if (null === $length) { $realLength = $numParts - $realOffset; } else { $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; if ($realLength < 0 || $realLength > $numParts - $realOffset) { throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length)); } } if ($realLength === 0) { // Empty slice is represented as null return null; } return new static(array_slice($parts, $realOffset, $realLength), $this->attributes); } /** * Concatenate two names, yielding a new Name instance. * * The type of the generated instance depends on which class this method is called on, for * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. * * If one of the arguments is null, a new instance of the other name will be returned. If both * arguments are null, null will be returned. As such, writing * Name::concat($namespace, $shortName) * where $namespace is a Name node or null will work as expected. * * @param string|string[]|self|null $name1 The first name * @param string|string[]|self|null $name2 The second name * @param array $attributes Attributes to assign to concatenated name * * @return static|null Concatenated name */ public static function concat($name1, $name2, array $attributes = []) { if (null === $name1 && null === $name2) { return null; } if (null === $name1) { return new static($name2, $attributes); } if (null === $name2) { return new static($name1, $attributes); } else { return new static( self::prepareName($name1) . '\\' . self::prepareName($name2), $attributes ); } } /** * Prepares a (string, array or Name node) name for use in name changing methods by converting * it to a string. * * @param string|string[]|self $name Name to prepare * * @psalm-return non-empty-string * @return string Prepared name */ private static function prepareName($name): string { if (\is_string($name)) { if ('' === $name) { throw new \InvalidArgumentException('Name cannot be empty'); } return $name; } if (\is_array($name)) { if (empty($name)) { throw new \InvalidArgumentException('Name cannot be empty'); } return implode('\\', $name); } if ($name instanceof self) { return $name->name; } throw new \InvalidArgumentException( 'Expected string, array of parts or Name instance' ); } public function getType(): string { return 'Name'; } } $attributes Additional attributes * @param int $flags Optional visibility flags * @param list $attrGroups PHP attribute groups * @param PropertyHook[] $hooks Property hooks for promoted properties */ public function __construct( Expr $var, ?Expr $default = null, ?Node $type = null, bool $byRef = false, bool $variadic = false, array $attributes = [], int $flags = 0, array $attrGroups = [], array $hooks = [] ) { $this->attributes = $attributes; $this->type = $type; $this->byRef = $byRef; $this->variadic = $variadic; $this->var = $var; $this->default = $default; $this->flags = $flags; $this->attrGroups = $attrGroups; $this->hooks = $hooks; } public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default', 'hooks']; } public function getType(): string { return 'Param'; } /** * Whether this parameter uses constructor property promotion. */ public function isPromoted(): bool { return $this->flags !== 0 || $this->hooks !== []; } public function isFinal(): bool { return (bool) ($this->flags & Modifiers::FINAL); } public function isPublic(): bool { $public = (bool) ($this->flags & Modifiers::PUBLIC); if ($public) { return true; } if (!$this->isPromoted()) { return false; } return ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } public function isProtected(): bool { return (bool) ($this->flags & Modifiers::PROTECTED); } public function isPrivate(): bool { return (bool) ($this->flags & Modifiers::PRIVATE); } public function isReadonly(): bool { return (bool) ($this->flags & Modifiers::READONLY); } /** * Whether the promoted property has explicit public(set) visibility. */ public function isPublicSet(): bool { return (bool) ($this->flags & Modifiers::PUBLIC_SET); } /** * Whether the promoted property has explicit protected(set) visibility. */ public function isProtectedSet(): bool { return (bool) ($this->flags & Modifiers::PROTECTED_SET); } /** * Whether the promoted property has explicit private(set) visibility. */ public function isPrivateSet(): bool { return (bool) ($this->flags & Modifiers::PRIVATE_SET); } } $attributes Additional node attributes */ public function __construct(array $attrs, array $attributes = []) { $this->attributes = $attributes; $this->attrs = $attrs; } public function getSubNodeNames(): array { return ['attrs']; } public function getType(): string { return 'AttributeGroup'; } } */ private static array $specialClassNames = [ 'self' => true, 'parent' => true, 'static' => true, ]; /** * Constructs an identifier node. * * @param string $name Identifier as string * @param array $attributes Additional attributes */ public function __construct(string $name, array $attributes = []) { if ($name === '') { throw new \InvalidArgumentException('Identifier name cannot be empty'); } $this->attributes = $attributes; $this->name = $name; } public function getSubNodeNames(): array { return ['name']; } /** * Get identifier as string. * * @psalm-return non-empty-string * @return string Identifier as string. */ public function toString(): string { return $this->name; } /** * Get lowercased identifier as string. * * @psalm-return non-empty-string&lowercase-string * @return string Lowercased identifier as string */ public function toLowerString(): string { return strtolower($this->name); } /** * Checks whether the identifier is a special class name (self, parent or static). * * @return bool Whether identifier is a special class name */ public function isSpecialClassName(): bool { return isset(self::$specialClassNames[strtolower($this->name)]); } /** * Get identifier as string. * * @psalm-return non-empty-string * @return string Identifier as string */ public function __toString(): string { return $this->name; } public function getType(): string { return 'Identifier'; } } $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames(): array { return ['value']; } public function getType(): string { return 'InterpolatedStringPart'; } } // @deprecated compatibility alias class_alias(InterpolatedStringPart::class, Scalar\EncapsedStringPart::class); $attributes Additional attributes */ public function __construct(array $types, array $attributes = []) { $this->attributes = $attributes; $this->types = $types; } public function getSubNodeNames(): array { return ['types']; } public function getType(): string { return 'IntersectionType'; } } $attributes Additional attributes */ public function __construct(Node\Name $name, $alias = null, int $type = Use_::TYPE_UNKNOWN, array $attributes = []) { $this->attributes = $attributes; $this->type = $type; $this->name = $name; $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; } public function getSubNodeNames(): array { return ['type', 'name', 'alias']; } /** * Get alias. If not explicitly given this is the last component of the used name. */ public function getAlias(): Identifier { if (null !== $this->alias) { return $this->alias; } return new Identifier($this->name->getLast()); } public function getType(): string { return 'UseItem'; } } // @deprecated compatibility alias class_alias(UseItem::class, Stmt\UseUse::class); text = $text; $this->startLine = $startLine; $this->startFilePos = $startFilePos; $this->startTokenPos = $startTokenPos; $this->endLine = $endLine; $this->endFilePos = $endFilePos; $this->endTokenPos = $endTokenPos; } /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ public function getText(): string { return $this->text; } /** * Gets the line number the comment started on. * * @return int Line number (or -1 if not available) * @phpstan-return -1|positive-int */ public function getStartLine(): int { return $this->startLine; } /** * Gets the file offset the comment started on. * * @return int File offset (or -1 if not available) */ public function getStartFilePos(): int { return $this->startFilePos; } /** * Gets the token offset the comment started on. * * @return int Token offset (or -1 if not available) */ public function getStartTokenPos(): int { return $this->startTokenPos; } /** * Gets the line number the comment ends on. * * @return int Line number (or -1 if not available) * @phpstan-return -1|positive-int */ public function getEndLine(): int { return $this->endLine; } /** * Gets the file offset the comment ends on. * * @return int File offset (or -1 if not available) */ public function getEndFilePos(): int { return $this->endFilePos; } /** * Gets the token offset the comment ends on. * * @return int Token offset (or -1 if not available) */ public function getEndTokenPos(): int { return $this->endTokenPos; } /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ public function __toString(): string { return $this->text; } /** * Gets the reformatted comment text. * * "Reformatted" here means that we try to clean up the whitespace at the * starts of the lines. This is necessary because we receive the comments * without leading whitespace on the first line, but with leading whitespace * on all subsequent lines. * * Additionally, this normalizes CRLF newlines to LF newlines. */ public function getReformattedText(): string { $text = str_replace("\r\n", "\n", $this->text); $newlinePos = strpos($text, "\n"); if (false === $newlinePos) { // Single line comments don't need further processing return $text; } if (preg_match('(^.*(?:\n\s+\*.*)+$)', $text)) { // Multi line comment of the type // // /* // * Some text. // * Some more text. // */ // // is handled by replacing the whitespace sequences before the * by a single space return preg_replace('(^\s+\*)m', ' *', $text); } if (preg_match('(^/\*\*?\s*\n)', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { // Multi line comment of the type // // /* // Some text. // Some more text. // */ // // is handled by removing the whitespace sequence on the line before the closing // */ on all lines. So if the last line is " */", then " " is removed at the // start of all lines. return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text); } if (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { // Multi line comment of the type // // /* Some text. // Some more text. // Indented text. // Even more text. */ // // is handled by removing the difference between the shortest whitespace prefix on all // lines and the length of the "/* " opening sequence. $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1)); $removeLen = $prefixLen - strlen($matches[0]); return preg_replace('(^\s{' . $removeLen . '})m', '', $text); } // No idea how to format this comment, so simply return as is return $text; } /** * Get length of shortest whitespace prefix (at the start of a line). * * If there is a line with no prefix whitespace, 0 is a valid return value. * * @param string $str String to check * @return int Length in characters. Tabs count as single characters. */ private function getShortestWhitespacePrefixLen(string $str): int { $lines = explode("\n", $str); $shortestPrefixLen = \PHP_INT_MAX; foreach ($lines as $line) { preg_match('(^\s*)', $line, $matches); $prefixLen = strlen($matches[0]); if ($prefixLen < $shortestPrefixLen) { $shortestPrefixLen = $prefixLen; } } return $shortestPrefixLen; } /** * @return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} */ public function jsonSerialize(): array { // Technically not a node, but we make it look like one anyway $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; return [ 'nodeType' => $type, 'text' => $this->text, // TODO: Rename these to include "start". 'line' => $this->startLine, 'filePos' => $this->startFilePos, 'tokenPos' => $this->startTokenPos, 'endLine' => $this->endLine, 'endFilePos' => $this->endFilePos, 'endTokenPos' => $this->endTokenPos, ]; } } id == \T_LNUMBER && $token->text === '0' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id == \T_STRING && preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1]->text) ) { $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1]->text); array_splice($tokens, $i, 2, [ new Token($tokenKind, '0' . $tokens[$i + 1]->text, $token->line, $token->pos), ]); $c--; } } return $tokens; } private function resolveIntegerOrFloatToken(string $str): int { $str = substr($str, 1); $str = str_replace('_', '', $str); $num = octdec($str); return is_float($num) ? \T_DNUMBER : \T_LNUMBER; } public function reverseEmulate(string $code, array $tokens): array { // Explicit octals were not legal code previously, don't bother. return $tokens; } } emulator = $emulator; } public function getPhpVersion(): PhpVersion { return $this->emulator->getPhpVersion(); } public function isEmulationNeeded(string $code): bool { return $this->emulator->isEmulationNeeded($code); } public function emulate(string $code, array $tokens): array { return $this->emulator->reverseEmulate($code, $tokens); } public function reverseEmulate(string $code, array $tokens): array { return $this->emulator->emulate($code, $tokens); } public function preprocessCode(string $code, array &$patches): string { return $code; } } getKeywordString()) !== false; } /** @param Token[] $tokens */ protected function isKeywordContext(array $tokens, int $pos): bool { $prevToken = $this->getPreviousNonSpaceToken($tokens, $pos); if ($prevToken === null) { return false; } return $prevToken->id !== \T_OBJECT_OPERATOR && $prevToken->id !== \T_NULLSAFE_OBJECT_OPERATOR; } public function emulate(string $code, array $tokens): array { $keywordString = $this->getKeywordString(); foreach ($tokens as $i => $token) { if ($token->id === T_STRING && strtolower($token->text) === $keywordString && $this->isKeywordContext($tokens, $i)) { $token->id = $this->getKeywordToken(); } } return $tokens; } /** @param Token[] $tokens */ private function getPreviousNonSpaceToken(array $tokens, int $start): ?Token { for ($i = $start - 1; $i >= 0; --$i) { if ($tokens[$i]->id === T_WHITESPACE) { continue; } return $tokens[$i]; } return null; } public function reverseEmulate(string $code, array $tokens): array { $keywordToken = $this->getKeywordToken(); foreach ($tokens as $token) { if ($token->id === $keywordToken) { $token->id = \T_STRING; } } return $tokens; } } \T_PUBLIC_SET, \T_PROTECTED => \T_PROTECTED_SET, \T_PRIVATE => \T_PRIVATE_SET, ]; for ($i = 0, $c = count($tokens); $i < $c; ++$i) { $token = $tokens[$i]; if (isset($map[$token->id]) && $i + 3 < $c && $tokens[$i + 1]->text === '(' && $tokens[$i + 2]->id === \T_STRING && \strtolower($tokens[$i + 2]->text) === 'set' && $tokens[$i + 3]->text === ')' && $this->isKeywordContext($tokens, $i) ) { array_splice($tokens, $i, 4, [ new Token( $map[$token->id], $token->text . '(' . $tokens[$i + 2]->text . ')', $token->line, $token->pos), ]); $c -= 3; } } return $tokens; } public function reverseEmulate(string $code, array $tokens): array { $reverseMap = [ \T_PUBLIC_SET => \T_PUBLIC, \T_PROTECTED_SET => \T_PROTECTED, \T_PRIVATE_SET => \T_PRIVATE, ]; for ($i = 0, $c = count($tokens); $i < $c; ++$i) { $token = $tokens[$i]; if (isset($reverseMap[$token->id]) && \preg_match('/(public|protected|private)\((set)\)/i', $token->text, $matches) ) { [, $modifier, $set] = $matches; $modifierLen = \strlen($modifier); array_splice($tokens, $i, 1, [ new Token($reverseMap[$token->id], $modifier, $token->line, $token->pos), new Token(\ord('('), '(', $token->line, $token->pos + $modifierLen), new Token(\T_STRING, $set, $token->line, $token->pos + $modifierLen + 1), new Token(\ord(')'), ')', $token->line, $token->pos + $modifierLen + 4), ]); $i += 3; $c += 3; } } return $tokens; } /** @param Token[] $tokens */ protected function isKeywordContext(array $tokens, int $pos): bool { $prevToken = $this->getPreviousNonSpaceToken($tokens, $pos); if ($prevToken === null) { return false; } return $prevToken->id !== \T_OBJECT_OPERATOR && $prevToken->id !== \T_NULLSAFE_OBJECT_OPERATOR; } /** @param Token[] $tokens */ private function getPreviousNonSpaceToken(array $tokens, int $start): ?Token { for ($i = $start - 1; $i >= 0; --$i) { if ($tokens[$i]->id === T_WHITESPACE) { continue; } return $tokens[$i]; } return null; } } text === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '[') { array_splice($tokens, $i, 2, [ new Token(\T_ATTRIBUTE, '#[', $token->line, $token->pos), ]); $c--; continue; } } return $tokens; } public function reverseEmulate(string $code, array $tokens): array { // TODO return $tokens; } public function preprocessCode(string $code, array &$patches): string { $pos = 0; while (false !== $pos = strpos($code, '#[', $pos)) { // Replace #[ with %[ $code[$pos] = '%'; $patches[] = [$pos, 'replace', '#']; $pos += 2; } return $code; } } text !== '(') { continue; } $numTokens = 1; $text = '('; $j = $i + 1; if ($j < $c && $tokens[$j]->id === \T_WHITESPACE && preg_match('/[ \t]+/', $tokens[$j]->text)) { $text .= $tokens[$j]->text; $numTokens++; $j++; } if ($j >= $c || $tokens[$j]->id !== \T_STRING || \strtolower($tokens[$j]->text) !== 'void') { continue; } $text .= $tokens[$j]->text; $numTokens++; $k = $j + 1; if ($k < $c && $tokens[$k]->id === \T_WHITESPACE && preg_match('/[ \t]+/', $tokens[$k]->text)) { $text .= $tokens[$k]->text; $numTokens++; $k++; } if ($k >= $c || $tokens[$k]->text !== ')') { continue; } $text .= ')'; $numTokens++; array_splice($tokens, $i, $numTokens, [ new Token(\T_VOID_CAST, $text, $token->line, $token->pos), ]); $c -= $numTokens - 1; } return $tokens; } public function reverseEmulate(string $code, array $tokens): array { for ($i = 0, $c = count($tokens); $i < $c; ++$i) { $token = $tokens[$i]; if ($token->id !== \T_VOID_CAST) { continue; } if (!preg_match('/^\(([ \t]*)(void)([ \t]*)\)$/i', $token->text, $match)) { throw new \LogicException('Unexpected T_VOID_CAST contents'); } $newTokens = []; $pos = $token->pos; $newTokens[] = new Token(\ord('('), '(', $token->line, $pos); $pos++; if ($match[1] !== '') { $newTokens[] = new Token(\T_WHITESPACE, $match[1], $token->line, $pos); $pos += \strlen($match[1]); } $newTokens[] = new Token(\T_STRING, $match[2], $token->line, $pos); $pos += \strlen($match[2]); if ($match[3] !== '') { $newTokens[] = new Token(\T_WHITESPACE, $match[3], $token->line, $pos); $pos += \strlen($match[3]); } $newTokens[] = new Token(\ord(')'), ')', $token->line, $pos); array_splice($tokens, $i, 1, $newTokens); $i += \count($newTokens) - 1; $c += \count($newTokens) - 1; } return $tokens; } } ') !== false; } public function emulate(string $code, array $tokens): array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way for ($i = 0, $c = count($tokens); $i < $c; ++$i) { $token = $tokens[$i]; if ($token->text === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id === \T_OBJECT_OPERATOR) { array_splice($tokens, $i, 2, [ new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos), ]); $c--; continue; } // Handle ?-> inside encapsed string. if ($token->id === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1]->id === \T_VARIABLE && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $token->text, $matches) ) { $replacement = [ new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos), new Token(\T_STRING, $matches[1], $token->line, $token->pos + 3), ]; $matchLen = \strlen($matches[0]); if ($matchLen !== \strlen($token->text)) { $replacement[] = new Token( \T_ENCAPSED_AND_WHITESPACE, \substr($token->text, $matchLen), $token->line, $token->pos + $matchLen ); } array_splice($tokens, $i, 1, $replacement); $c += \count($replacement) - 1; continue; } } return $tokens; } public function reverseEmulate(string $code, array $tokens): array { // ?-> was not valid code previously, don't bother. return $tokens; } } ') !== false; } public function emulate(string $code, array $tokens): array { for ($i = 0, $c = count($tokens); $i < $c; ++$i) { $token = $tokens[$i]; if ($token->text === '|' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '>') { array_splice($tokens, $i, 2, [ new Token(\T_PIPE, '|>', $token->line, $token->pos), ]); $c--; } } return $tokens; } public function reverseEmulate(string $code, array $tokens): array { for ($i = 0, $c = count($tokens); $i < $c; ++$i) { $token = $tokens[$i]; if ($token->id === \T_PIPE) { array_splice($tokens, $i, 1, [ new Token(\ord('|'), '|', $token->line, $token->pos), new Token(\ord('>'), '>', $token->line, $token->pos + 1), ]); $i++; $c++; } } return $tokens; } } text === '(' || ($tokens[$pos + 1]->id === \T_WHITESPACE && isset($tokens[$pos + 2]) && $tokens[$pos + 2]->text === '('))); } } id === \T_WHITESPACE && $tokens[$pos + 2]->id === \T_STRING; } } */ private array $emulators = []; private PhpVersion $targetPhpVersion; private PhpVersion $hostPhpVersion; /** * @param PhpVersion|null $phpVersion PHP version to emulate. Defaults to newest supported. */ public function __construct(?PhpVersion $phpVersion = null) { $this->targetPhpVersion = $phpVersion ?? PhpVersion::getNewestSupported(); $this->hostPhpVersion = PhpVersion::getHostVersion(); $emulators = [ new MatchTokenEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator(), new ReadonlyFunctionTokenEmulator(), new PropertyTokenEmulator(), new AsymmetricVisibilityTokenEmulator(), new PipeOperatorEmulator(), new VoidCastEmulator(), ]; // Collect emulators that are relevant for the PHP version we're running // and the PHP version we're targeting for emulation. foreach ($emulators as $emulator) { $emulatorPhpVersion = $emulator->getPhpVersion(); if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = $emulator; } elseif ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = new ReverseEmulator($emulator); } } } public function tokenize(string $code, ?ErrorHandler $errorHandler = null): array { $emulators = array_filter($this->emulators, function ($emulator) use ($code) { return $emulator->isEmulationNeeded($code); }); if (empty($emulators)) { // Nothing to emulate, yay return parent::tokenize($code, $errorHandler); } if ($errorHandler === null) { $errorHandler = new ErrorHandler\Throwing(); } $this->patches = []; foreach ($emulators as $emulator) { $code = $emulator->preprocessCode($code, $this->patches); } $collector = new ErrorHandler\Collecting(); $tokens = parent::tokenize($code, $collector); $this->sortPatches(); $tokens = $this->fixupTokens($tokens); $errors = $collector->getErrors(); if (!empty($errors)) { $this->fixupErrors($errors); foreach ($errors as $error) { $errorHandler->handleError($error); } } foreach ($emulators as $emulator) { $tokens = $emulator->emulate($code, $tokens); } return $tokens; } private function isForwardEmulationNeeded(PhpVersion $emulatorPhpVersion): bool { return $this->hostPhpVersion->older($emulatorPhpVersion) && $this->targetPhpVersion->newerOrEqual($emulatorPhpVersion); } private function isReverseEmulationNeeded(PhpVersion $emulatorPhpVersion): bool { return $this->hostPhpVersion->newerOrEqual($emulatorPhpVersion) && $this->targetPhpVersion->older($emulatorPhpVersion); } private function sortPatches(): void { // Patches may be contributed by different emulators. // Make sure they are sorted by increasing patch position. usort($this->patches, function ($p1, $p2) { return $p1[0] <=> $p2[0]; }); } /** * @param list $tokens * @return list */ private function fixupTokens(array $tokens): array { if (\count($this->patches) === 0) { return $tokens; } // Load first patch $patchIdx = 0; list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // We use a manual loop over the tokens, because we modify the array on the fly $posDelta = 0; $lineDelta = 0; for ($i = 0, $c = \count($tokens); $i < $c; $i++) { $token = $tokens[$i]; $pos = $token->pos; $token->pos += $posDelta; $token->line += $lineDelta; $localPosDelta = 0; $len = \strlen($token->text); while ($patchPos >= $pos && $patchPos < $pos + $len) { $patchTextLen = \strlen($patchText); if ($patchType === 'remove') { if ($patchPos === $pos && $patchTextLen === $len) { // Remove token entirely array_splice($tokens, $i, 1, []); $i--; $c--; } else { // Remove from token string $token->text = substr_replace( $token->text, '', $patchPos - $pos + $localPosDelta, $patchTextLen ); $localPosDelta -= $patchTextLen; } $lineDelta -= \substr_count($patchText, "\n"); } elseif ($patchType === 'add') { // Insert into the token string $token->text = substr_replace( $token->text, $patchText, $patchPos - $pos + $localPosDelta, 0 ); $localPosDelta += $patchTextLen; $lineDelta += \substr_count($patchText, "\n"); } elseif ($patchType === 'replace') { // Replace inside the token string $token->text = substr_replace( $token->text, $patchText, $patchPos - $pos + $localPosDelta, $patchTextLen ); } else { assert(false); } // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { // No more patches. However, we still need to adjust position. $patchPos = \PHP_INT_MAX; break; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; } $posDelta += $localPosDelta; } return $tokens; } /** * Fixup line and position information in errors. * * @param Error[] $errors */ private function fixupErrors(array $errors): void { foreach ($errors as $error) { $attrs = $error->getAttributes(); $posDelta = 0; $lineDelta = 0; foreach ($this->patches as $patch) { list($patchPos, $patchType, $patchText) = $patch; if ($patchPos >= $attrs['startFilePos']) { // No longer relevant break; } if ($patchType === 'add') { $posDelta += strlen($patchText); $lineDelta += substr_count($patchText, "\n"); } elseif ($patchType === 'remove') { $posDelta -= strlen($patchText); $lineDelta -= substr_count($patchText, "\n"); } } $attrs['startFilePos'] += $posDelta; $attrs['endFilePos'] += $posDelta; $attrs['startLine'] += $lineDelta; $attrs['endLine'] += $lineDelta; $error->setAttributes($attrs); } } } filterCallback = $filterCallback; } /** * Get found node satisfying the filter callback. * * Returns null if no node satisfies the filter callback. * * @return null|Node Found node (or null if not found) */ public function getFoundNode(): ?Node { return $this->foundNode; } public function beforeTraverse(array $nodes): ?array { $this->foundNode = null; return null; } public function enterNode(Node $node) { $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNode = $node; return NodeVisitor::STOP_TRAVERSAL; } return null; } } Found nodes */ protected array $foundNodes; public function __construct(callable $filterCallback) { $this->filterCallback = $filterCallback; } /** * Get found nodes satisfying the filter callback. * * Nodes are returned in pre-order. * * @return list Found nodes */ public function getFoundNodes(): array { return $this->foundNodes; } public function beforeTraverse(array $nodes): ?array { $this->foundNodes = []; return null; } public function enterNode(Node $node) { $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNodes[] = $node; } return null; } } setAttribute('origNode', $origNode); return $node; } } nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing()); $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false; $this->replaceNodes = $options['replaceNodes'] ?? true; } /** * Get name resolution context. */ public function getNameContext(): NameContext { return $this->nameContext; } public function beforeTraverse(array $nodes): ?array { $this->nameContext->startNamespace(); return null; } public function enterNode(Node $node) { if ($node instanceof Stmt\Namespace_) { $this->nameContext->startNamespace($node->name); } elseif ($node instanceof Stmt\Use_) { foreach ($node->uses as $use) { $this->addAlias($use, $node->type, null); } } elseif ($node instanceof Stmt\GroupUse) { foreach ($node->uses as $use) { $this->addAlias($use, $node->type, $node->prefix); } } elseif ($node instanceof Stmt\Class_) { if (null !== $node->extends) { $node->extends = $this->resolveClassName($node->extends); } foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); } else { $node->namespacedName = null; } } elseif ($node instanceof Stmt\Interface_) { foreach ($node->extends as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Enum_) { foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Trait_) { $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Function_) { $this->resolveSignature($node); $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\ClassMethod || $node instanceof Expr\Closure || $node instanceof Expr\ArrowFunction ) { $this->resolveSignature($node); $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Property) { if (null !== $node->type) { $node->type = $this->resolveType($node->type); } $this->resolveAttrGroups($node); } elseif ($node instanceof Node\PropertyHook) { foreach ($node->params as $param) { $param->type = $this->resolveType($param->type); $this->resolveAttrGroups($param); } $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Const_) { foreach ($node->consts as $const) { $this->addNamespacedName($const); } $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\ClassConst) { if (null !== $node->type) { $node->type = $this->resolveType($node->type); } $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\EnumCase) { $this->resolveAttrGroups($node); } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_ ) { if ($node->class instanceof Name) { $node->class = $this->resolveClassName($node->class); } } elseif ($node instanceof Stmt\Catch_) { foreach ($node->types as &$type) { $type = $this->resolveClassName($type); } } elseif ($node instanceof Expr\FuncCall) { if ($node->name instanceof Name) { $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); } } elseif ($node instanceof Expr\ConstFetch) { $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); } elseif ($node instanceof Stmt\TraitUse) { foreach ($node->traits as &$trait) { $trait = $this->resolveClassName($trait); } foreach ($node->adaptations as $adaptation) { if (null !== $adaptation->trait) { $adaptation->trait = $this->resolveClassName($adaptation->trait); } if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { foreach ($adaptation->insteadof as &$insteadof) { $insteadof = $this->resolveClassName($insteadof); } } } } return null; } /** @param Stmt\Use_::TYPE_* $type */ private function addAlias(Node\UseItem $use, int $type, ?Name $prefix = null): void { // Add prefix for group uses $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; // Type is determined either by individual element or whole use declaration $type |= $use->type; $this->nameContext->addAlias( $name, (string) $use->getAlias(), $type, $use->getAttributes() ); } /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure|Expr\ArrowFunction $node */ private function resolveSignature($node): void { foreach ($node->params as $param) { $param->type = $this->resolveType($param->type); $this->resolveAttrGroups($param); } $node->returnType = $this->resolveType($node->returnType); } /** * @template T of Node\Identifier|Name|Node\ComplexType|null * @param T $node * @return T */ private function resolveType(?Node $node): ?Node { if ($node instanceof Name) { return $this->resolveClassName($node); } if ($node instanceof Node\NullableType) { $node->type = $this->resolveType($node->type); return $node; } if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { foreach ($node->types as &$type) { $type = $this->resolveType($type); } return $node; } return $node; } /** * Resolve name, according to name resolver options. * * @param Name $name Function or constant name to resolve * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name Resolved name, or original name with attribute */ protected function resolveName(Name $name, int $type): Name { if (!$this->replaceNodes) { $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { $name->setAttribute('resolvedName', $resolvedName); } else { $name->setAttribute('namespacedName', FullyQualified::concat( $this->nameContext->getNamespace(), $name, $name->getAttributes())); } return $name; } if ($this->preserveOriginalNames) { // Save the original name $originalName = $name; $name = clone $originalName; $name->setAttribute('originalName', $originalName); } $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { return $resolvedName; } // unqualified names inside a namespace cannot be resolved at compile-time // add the namespaced version of the name as an attribute $name->setAttribute('namespacedName', FullyQualified::concat( $this->nameContext->getNamespace(), $name, $name->getAttributes())); return $name; } protected function resolveClassName(Name $name): Name { return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); } protected function addNamespacedName(Node $node): void { $node->namespacedName = Name::concat( $this->nameContext->getNamespace(), (string) $node->name); } protected function resolveAttrGroups(Node $node): void { foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attr) { $attr->name = $this->resolveClassName($attr->name); } } } } $weakReferences=false on the child node, the parent node can be accessed through * $node->getAttribute('parent'), the previous * node can be accessed through $node->getAttribute('previous'), * and the next node can be accessed through $node->getAttribute('next'). * * With $weakReferences=true attribute names are prefixed by "weak_", e.g. "weak_parent". */ final class NodeConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ private array $stack = []; /** * @var ?Node */ private $previous; private bool $weakReferences; public function __construct(bool $weakReferences = false) { $this->weakReferences = $weakReferences; } public function beforeTraverse(array $nodes) { $this->stack = []; $this->previous = null; } public function enterNode(Node $node) { if (!empty($this->stack)) { $parent = $this->stack[count($this->stack) - 1]; if ($this->weakReferences) { $node->setAttribute('weak_parent', \WeakReference::create($parent)); } else { $node->setAttribute('parent', $parent); } } if ($this->previous !== null) { if ( $this->weakReferences ) { if ($this->previous->getAttribute('weak_parent') === $node->getAttribute('weak_parent')) { $node->setAttribute('weak_previous', \WeakReference::create($this->previous)); $this->previous->setAttribute('weak_next', \WeakReference::create($node)); } } elseif ($this->previous->getAttribute('parent') === $node->getAttribute('parent')) { $node->setAttribute('previous', $this->previous); $this->previous->setAttribute('next', $node); } } $this->stack[] = $node; } public function leaveNode(Node $node) { $this->previous = $node; array_pop($this->stack); } } Token positions of comments */ private array $commentPositions = []; /** * Create a comment annotation visitor. * * @param Token[] $tokens Token array */ public function __construct(array $tokens) { $this->tokens = $tokens; // Collect positions of comments. We use this to avoid traversing parts of the AST where // there are no comments. foreach ($tokens as $i => $token) { if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) { $this->commentPositions[] = $i; } } } public function enterNode(Node $node) { $nextCommentPos = current($this->commentPositions); if ($nextCommentPos === false) { // No more comments. return self::STOP_TRAVERSAL; } $oldPos = $this->pos; $this->pos = $pos = $node->getStartTokenPos(); if ($nextCommentPos > $oldPos && $nextCommentPos < $pos) { $comments = []; while (--$pos >= $oldPos) { $token = $this->tokens[$pos]; if ($token->id === \T_DOC_COMMENT) { $comments[] = new Comment\Doc( $token->text, $token->line, $token->pos, $pos, $token->getEndLine(), $token->getEndPos() - 1, $pos); continue; } if ($token->id === \T_COMMENT) { $comments[] = new Comment( $token->text, $token->line, $token->pos, $pos, $token->getEndLine(), $token->getEndPos() - 1, $pos); continue; } if ($token->id !== \T_WHITESPACE) { break; } } if (!empty($comments)) { $node->setAttribute('comments', array_reverse($comments)); } do { $nextCommentPos = next($this->commentPositions); } while ($nextCommentPos !== false && $nextCommentPos < $this->pos); } $endPos = $node->getEndTokenPos(); if ($nextCommentPos > $endPos) { // Skip children if there are no comments located inside this node. $this->pos = $endPos; return self::DONT_TRAVERSE_CHILDREN; } return null; } } $weakReferences=false on the child node, the parent node can be accessed through * $node->getAttribute('parent'). * * With $weakReferences=true the attribute name is "weak_parent" instead. */ final class ParentConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ private array $stack = []; private bool $weakReferences; public function __construct(bool $weakReferences = false) { $this->weakReferences = $weakReferences; } public function beforeTraverse(array $nodes) { $this->stack = []; } public function enterNode(Node $node) { if (!empty($this->stack)) { $parent = $this->stack[count($this->stack) - 1]; if ($this->weakReferences) { $node->setAttribute('weak_parent', \WeakReference::create($parent)); } else { $node->setAttribute('parent', $parent); } } $this->stack[] = $node; } public function leaveNode(Node $node) { array_pop($this->stack); } } fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) { throw new ConstExprEvaluationException( "Expression of type {$expr->getType()} cannot be evaluated" ); }; } /** * Silently evaluates a constant expression into a PHP value. * * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. * The original source of the exception is available through getPrevious(). * * If some part of the expression cannot be evaluated, the fallback evaluator passed to the * constructor will be invoked. By default, if no fallback is provided, an exception of type * ConstExprEvaluationException is thrown. * * See class doc comment for caveats and limitations. * * @param Expr $expr Constant expression to evaluate * @return mixed Result of evaluation * * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred */ public function evaluateSilently(Expr $expr) { set_error_handler(function ($num, $str, $file, $line) { throw new \ErrorException($str, 0, $num, $file, $line); }); try { return $this->evaluate($expr); } catch (\Throwable $e) { if (!$e instanceof ConstExprEvaluationException) { $e = new ConstExprEvaluationException( "An error occurred during constant expression evaluation", 0, $e); } throw $e; } finally { restore_error_handler(); } } /** * Directly evaluates a constant expression into a PHP value. * * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these * into a ConstExprEvaluationException. * * If some part of the expression cannot be evaluated, the fallback evaluator passed to the * constructor will be invoked. By default, if no fallback is provided, an exception of type * ConstExprEvaluationException is thrown. * * See class doc comment for caveats and limitations. * * @param Expr $expr Constant expression to evaluate * @return mixed Result of evaluation * * @throws ConstExprEvaluationException if the expression cannot be evaluated */ public function evaluateDirectly(Expr $expr) { return $this->evaluate($expr); } /** @return mixed */ private function evaluate(Expr $expr) { if ($expr instanceof Scalar\Int_ || $expr instanceof Scalar\Float_ || $expr instanceof Scalar\String_ ) { return $expr->value; } if ($expr instanceof Expr\Array_) { return $this->evaluateArray($expr); } // Unary operators if ($expr instanceof Expr\UnaryPlus) { return +$this->evaluate($expr->expr); } if ($expr instanceof Expr\UnaryMinus) { return -$this->evaluate($expr->expr); } if ($expr instanceof Expr\BooleanNot) { return !$this->evaluate($expr->expr); } if ($expr instanceof Expr\BitwiseNot) { return ~$this->evaluate($expr->expr); } if ($expr instanceof Expr\BinaryOp) { return $this->evaluateBinaryOp($expr); } if ($expr instanceof Expr\Ternary) { return $this->evaluateTernary($expr); } if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; } if ($expr instanceof Expr\ConstFetch) { return $this->evaluateConstFetch($expr); } return ($this->fallbackEvaluator)($expr); } private function evaluateArray(Expr\Array_ $expr): array { $array = []; foreach ($expr->items as $item) { if (null !== $item->key) { $array[$this->evaluate($item->key)] = $this->evaluate($item->value); } elseif ($item->unpack) { $array = array_merge($array, $this->evaluate($item->value)); } else { $array[] = $this->evaluate($item->value); } } return $array; } /** @return mixed */ private function evaluateTernary(Expr\Ternary $expr) { if (null === $expr->if) { return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); } return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else); } /** @return mixed */ private function evaluateBinaryOp(Expr\BinaryOp $expr) { if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch ) { // This needs to be special cased to respect BP_VAR_IS fetch semantics return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right); } // The evaluate() calls are repeated in each branch, because some of the operators are // short-circuiting and evaluating the RHS in advance may be illegal in that case $l = $expr->left; $r = $expr->right; switch ($expr->getOperatorSigil()) { case '&': return $this->evaluate($l) & $this->evaluate($r); case '|': return $this->evaluate($l) | $this->evaluate($r); case '^': return $this->evaluate($l) ^ $this->evaluate($r); case '&&': return $this->evaluate($l) && $this->evaluate($r); case '||': return $this->evaluate($l) || $this->evaluate($r); case '??': return $this->evaluate($l) ?? $this->evaluate($r); case '.': return $this->evaluate($l) . $this->evaluate($r); case '/': return $this->evaluate($l) / $this->evaluate($r); case '==': return $this->evaluate($l) == $this->evaluate($r); case '>': return $this->evaluate($l) > $this->evaluate($r); case '>=': return $this->evaluate($l) >= $this->evaluate($r); case '===': return $this->evaluate($l) === $this->evaluate($r); case 'and': return $this->evaluate($l) and $this->evaluate($r); case 'or': return $this->evaluate($l) or $this->evaluate($r); case 'xor': return $this->evaluate($l) xor $this->evaluate($r); case '-': return $this->evaluate($l) - $this->evaluate($r); case '%': return $this->evaluate($l) % $this->evaluate($r); case '*': return $this->evaluate($l) * $this->evaluate($r); case '!=': return $this->evaluate($l) != $this->evaluate($r); case '!==': return $this->evaluate($l) !== $this->evaluate($r); case '+': return $this->evaluate($l) + $this->evaluate($r); case '**': return $this->evaluate($l) ** $this->evaluate($r); case '<<': return $this->evaluate($l) << $this->evaluate($r); case '>>': return $this->evaluate($l) >> $this->evaluate($r); case '<': return $this->evaluate($l) < $this->evaluate($r); case '<=': return $this->evaluate($l) <= $this->evaluate($r); case '<=>': return $this->evaluate($l) <=> $this->evaluate($r); case '|>': $lval = $this->evaluate($l); return $this->evaluate($r)($lval); } throw new \Exception('Should not happen'); } /** @return mixed */ private function evaluateConstFetch(Expr\ConstFetch $expr) { $name = $expr->name->toLowerString(); switch ($name) { case 'null': return null; case 'false': return false; case 'true': return true; } return ($this->fallbackEvaluator)($expr); } } Attributes */ protected array $attributes; /** * Creates a Node. * * @param array $attributes Array of attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; } /** * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) * @phpstan-return -1|positive-int */ public function getLine(): int { return $this->attributes['startLine'] ?? -1; } /** * Gets line the node started in. * * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * * @return int Start line (or -1 if not available) * @phpstan-return -1|positive-int */ public function getStartLine(): int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the node ended in. * * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * * @return int End line (or -1 if not available) * @phpstan-return -1|positive-int */ public function getEndLine(): int { return $this->attributes['endLine'] ?? -1; } /** * Gets the token offset of the first token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token start position (or -1 if not available) */ public function getStartTokenPos(): int { return $this->attributes['startTokenPos'] ?? -1; } /** * Gets the token offset of the last token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token end position (or -1 if not available) */ public function getEndTokenPos(): int { return $this->attributes['endTokenPos'] ?? -1; } /** * Gets the file offset of the first character that is part of this node. * * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File start position (or -1 if not available) */ public function getStartFilePos(): int { return $this->attributes['startFilePos'] ?? -1; } /** * Gets the file offset of the last character that is part of this node. * * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File end position (or -1 if not available) */ public function getEndFilePos(): int { return $this->attributes['endFilePos'] ?? -1; } /** * Gets all comments directly preceding this node. * * The comments are also available through the "comments" attribute. * * @return Comment[] */ public function getComments(): array { return $this->attributes['comments'] ?? []; } /** * Gets the doc comment of the node. * * @return null|Comment\Doc Doc comment object or null */ public function getDocComment(): ?Comment\Doc { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { $comment = $comments[$i]; if ($comment instanceof Comment\Doc) { return $comment; } } return null; } /** * Sets the doc comment of the node. * * This will either replace an existing doc comment or add it to the comments array. * * @param Comment\Doc $docComment Doc comment to set */ public function setDocComment(Comment\Doc $docComment): void { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { if ($comments[$i] instanceof Comment\Doc) { // Replace existing doc comment. $comments[$i] = $docComment; $this->setAttribute('comments', $comments); return; } } // Append new doc comment. $comments[] = $docComment; $this->setAttribute('comments', $comments); } public function setAttribute(string $key, $value): void { $this->attributes[$key] = $value; } public function hasAttribute(string $key): bool { return array_key_exists($key, $this->attributes); } public function getAttribute(string $key, $default = null) { if (array_key_exists($key, $this->attributes)) { return $this->attributes[$key]; } return $default; } public function getAttributes(): array { return $this->attributes; } public function setAttributes(array $attributes): void { $this->attributes = $attributes; } /** * @return array */ public function jsonSerialize(): array { return ['nodeType' => $this->getType()] + get_object_vars($this); } } pAttrGroups($node->attrGroups, $this->phpVersion->supportsAttributes()) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : '') . ($node->hooks ? ' {' . $this->pStmts($node->hooks) . $this->nl . '}' : ''); } protected function pArg(Node\Arg $node): string { return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node): string { return '...'; } protected function pConst(Node\Const_ $node): string { return $node->name . ' = ' . $this->p($node->value); } protected function pNullableType(Node\NullableType $node): string { return '?' . $this->p($node->type); } protected function pUnionType(Node\UnionType $node): string { $types = []; foreach ($node->types as $typeNode) { if ($typeNode instanceof Node\IntersectionType) { $types[] = '('. $this->p($typeNode) . ')'; continue; } $types[] = $this->p($typeNode); } return implode('|', $types); } protected function pIntersectionType(Node\IntersectionType $node): string { return $this->pImplode($node->types, '&'); } protected function pIdentifier(Node\Identifier $node): string { return $node->name; } protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node): string { return '$' . $node->name; } protected function pAttribute(Node\Attribute $node): string { return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); } protected function pAttributeGroup(Node\AttributeGroup $node): string { return '#[' . $this->pCommaSeparated($node->attrs) . ']'; } // Names protected function pName(Name $node): string { return $node->name; } protected function pName_FullyQualified(Name\FullyQualified $node): string { return '\\' . $node->name; } protected function pName_Relative(Name\Relative $node): string { return 'namespace\\' . $node->name; } // Magic Constants protected function pScalar_MagicConst_Class(MagicConst\Class_ $node): string { return '__CLASS__'; } protected function pScalar_MagicConst_Dir(MagicConst\Dir $node): string { return '__DIR__'; } protected function pScalar_MagicConst_File(MagicConst\File $node): string { return '__FILE__'; } protected function pScalar_MagicConst_Function(MagicConst\Function_ $node): string { return '__FUNCTION__'; } protected function pScalar_MagicConst_Line(MagicConst\Line $node): string { return '__LINE__'; } protected function pScalar_MagicConst_Method(MagicConst\Method $node): string { return '__METHOD__'; } protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node): string { return '__NAMESPACE__'; } protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node): string { return '__TRAIT__'; } protected function pScalar_MagicConst_Property(MagicConst\Property $node): string { return '__PROPERTY__'; } // Scalars private function indentString(string $str): string { return str_replace("\n", $this->nl, $str); } protected function pScalar_String(Scalar\String_ $node): string { $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); switch ($kind) { case Scalar\String_::KIND_NOWDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { $shouldIdent = $this->phpVersion->supportsFlexibleHeredoc(); $nl = $shouldIdent ? $this->nl : $this->newline; if ($node->value === '') { return "<<<'$label'$nl$label{$this->docStringEndToken}"; } // Make sure trailing \r is not combined with following \n into CRLF. if ($node->value[strlen($node->value) - 1] !== "\r") { $value = $shouldIdent ? $this->indentString($node->value) : $node->value; return "<<<'$label'$nl$value$nl$label{$this->docStringEndToken}"; } } /* break missing intentionally */ // no break case Scalar\String_::KIND_SINGLE_QUOTED: return $this->pSingleQuotedString($node->value); case Scalar\String_::KIND_HEREDOC: $label = $node->getAttribute('docLabel'); $escaped = $this->escapeString($node->value, null); if ($label && !$this->containsEndLabel($escaped, $label)) { $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline; if ($escaped === '') { return "<<<$label$nl$label{$this->docStringEndToken}"; } return "<<<$label$nl$escaped$nl$label{$this->docStringEndToken}"; } /* break missing intentionally */ // no break case Scalar\String_::KIND_DOUBLE_QUOTED: return '"' . $this->escapeString($node->value, '"') . '"'; } throw new \Exception('Invalid string kind'); } protected function pScalar_InterpolatedString(Scalar\InterpolatedString $node): string { if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { $label = $node->getAttribute('docLabel'); if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline; if (count($node->parts) === 1 && $node->parts[0] instanceof Node\InterpolatedStringPart && $node->parts[0]->value === '' ) { return "<<<$label$nl$label{$this->docStringEndToken}"; } return "<<<$label$nl" . $this->pEncapsList($node->parts, null) . "$nl$label{$this->docStringEndToken}"; } } return '"' . $this->pEncapsList($node->parts, '"') . '"'; } protected function pScalar_Int(Scalar\Int_ $node): string { if ($node->getAttribute('shouldPrintRawValue') === true) { return $node->getAttribute('rawValue'); } if ($node->value === -\PHP_INT_MAX - 1) { // PHP_INT_MIN cannot be represented as a literal, // because the sign is not part of the literal return '(-' . \PHP_INT_MAX . '-1)'; } $kind = $node->getAttribute('kind', Scalar\Int_::KIND_DEC); if (Scalar\Int_::KIND_DEC === $kind) { return (string) $node->value; } if ($node->value < 0) { $sign = '-'; $str = (string) -$node->value; } else { $sign = ''; $str = (string) $node->value; } switch ($kind) { case Scalar\Int_::KIND_BIN: return $sign . '0b' . base_convert($str, 10, 2); case Scalar\Int_::KIND_OCT: return $sign . '0' . base_convert($str, 10, 8); case Scalar\Int_::KIND_HEX: return $sign . '0x' . base_convert($str, 10, 16); } throw new \Exception('Invalid number kind'); } protected function pScalar_Float(Scalar\Float_ $node): string { if (!is_finite($node->value)) { if ($node->value === \INF) { return '1.0E+1000'; } if ($node->value === -\INF) { return '-1.0E+1000'; } else { return '\NAN'; } } // Try to find a short full-precision representation $stringValue = sprintf('%.16G', $node->value); if ($node->value !== (float) $stringValue) { $stringValue = sprintf('%.17G', $node->value); } // %G is locale dependent and there exists no locale-independent alternative. We don't want // mess with switching locales here, so let's assume that a comma is the only non-standard // decimal separator we may encounter... $stringValue = str_replace(',', '.', $stringValue); // ensure that number is really printed as float return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; } // Assignments protected function pExpr_Assign(Expr\Assign $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\Assign::class, $this->p($node->var) . ' = ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignRef(Expr\AssignRef $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\AssignRef::class, $this->p($node->var) . ' =& ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Plus(AssignOp\Plus $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Plus::class, $this->p($node->var) . ' += ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Minus(AssignOp\Minus $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Minus::class, $this->p($node->var) . ' -= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Mul(AssignOp\Mul $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Mul::class, $this->p($node->var) . ' *= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Div(AssignOp\Div $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Div::class, $this->p($node->var) . ' /= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Concat(AssignOp\Concat $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Concat::class, $this->p($node->var) . ' .= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Mod(AssignOp\Mod $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Mod::class, $this->p($node->var) . ' %= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\BitwiseAnd::class, $this->p($node->var) . ' &= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\BitwiseOr::class, $this->p($node->var) . ' |= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\BitwiseXor::class, $this->p($node->var) . ' ^= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\ShiftLeft::class, $this->p($node->var) . ' <<= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\ShiftRight::class, $this->p($node->var) . ' >>= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Pow(AssignOp\Pow $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Pow::class, $this->p($node->var) . ' **= ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(AssignOp\Coalesce::class, $this->p($node->var) . ' ??= ', $node->expr, $precedence, $lhsPrecedence); } // Binary expressions protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Div(BinaryOp\Div $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node, int $precedence, int $lhsPrecedence): string { return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_BinaryOp_Pipe(BinaryOp\Pipe $node, int $precedence, int $lhsPrecedence): string { if ($node->right instanceof Expr\ArrowFunction) { // Force parentheses around arrow functions. $lhsPrecedence = $this->precedenceMap[Expr\ArrowFunction::class][0]; } return $this->pInfixOp(BinaryOp\Pipe::class, $node->left, ' |> ', $node->right, $precedence, $lhsPrecedence); } protected function pExpr_Instanceof(Expr\Instanceof_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPostfixOp( Expr\Instanceof_::class, $node->expr, ' instanceof ' . $this->pNewOperand($node->class), $precedence, $lhsPrecedence); } // Unary expressions protected function pExpr_BooleanNot(Expr\BooleanNot $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_BitwiseNot(Expr\BitwiseNot $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_UnaryMinus(Expr\UnaryMinus $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_UnaryPlus(Expr\UnaryPlus $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_PreInc(Expr\PreInc $node): string { return '++' . $this->p($node->var); } protected function pExpr_PreDec(Expr\PreDec $node): string { return '--' . $this->p($node->var); } protected function pExpr_PostInc(Expr\PostInc $node): string { return $this->p($node->var) . '++'; } protected function pExpr_PostDec(Expr\PostDec $node): string { return $this->p($node->var) . '--'; } protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_YieldFrom(Expr\YieldFrom $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Print(Expr\Print_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr, $precedence, $lhsPrecedence); } // Casts protected function pExpr_Cast_Int(Cast\Int_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_Double(Cast\Double $node, int $precedence, int $lhsPrecedence): string { $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); if ($kind === Cast\Double::KIND_DOUBLE) { $cast = '(double)'; } elseif ($kind === Cast\Double::KIND_FLOAT) { $cast = '(float)'; } else { assert($kind === Cast\Double::KIND_REAL); $cast = '(real)'; } return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_String(Cast\String_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_Array(Cast\Array_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_Object(Cast\Object_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_Bool(Cast\Bool_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_Unset(Cast\Unset_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Cast_Void(Cast\Void_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Cast\Void_::class, '(void) ', $node->expr, $precedence, $lhsPrecedence); } // Function calls and similar constructs protected function pExpr_FuncCall(Expr\FuncCall $node): string { return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_MethodCall(Expr\MethodCall $node): string { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node): string { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_StaticCall(Expr\StaticCall $node): string { return $this->pStaticDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? ($node->name instanceof Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}') : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_Empty(Expr\Empty_ $node): string { return 'empty(' . $this->p($node->expr) . ')'; } protected function pExpr_Isset(Expr\Isset_ $node): string { return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; } protected function pExpr_Eval(Expr\Eval_ $node): string { return 'eval(' . $this->p($node->expr) . ')'; } protected function pExpr_Include(Expr\Include_ $node, int $precedence, int $lhsPrecedence): string { static $map = [ Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', Expr\Include_::TYPE_REQUIRE => 'require', Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once', ]; return $this->pPrefixOp(Expr\Include_::class, $map[$node->type] . ' ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_List(Expr\List_ $node): string { $syntax = $node->getAttribute('kind', $this->phpVersion->supportsShortArrayDestructuring() ? Expr\List_::KIND_ARRAY : Expr\List_::KIND_LIST); if ($syntax === Expr\List_::KIND_ARRAY) { return '[' . $this->pMaybeMultiline($node->items, true) . ']'; } else { return 'list(' . $this->pMaybeMultiline($node->items, true) . ')'; } } // Other protected function pExpr_Error(Expr\Error $node): string { throw new \LogicException('Cannot pretty-print AST with Error nodes'); } protected function pExpr_Variable(Expr\Variable $node): string { if ($node->name instanceof Expr) { return '${' . $this->p($node->name) . '}'; } else { return '$' . $node->name; } } protected function pExpr_Array(Expr\Array_ $node): string { $syntax = $node->getAttribute('kind', $this->shortArraySyntax ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); if ($syntax === Expr\Array_::KIND_SHORT) { return '[' . $this->pMaybeMultiline($node->items, true) . ']'; } else { return 'array(' . $this->pMaybeMultiline($node->items, true) . ')'; } } protected function pKey(?Node $node): string { if ($node === null) { return ''; } // => is not really an operator and does not typically participate in precedence resolution. // However, there is an exception if yield expressions with keys are involved: // [yield $a => $b] is interpreted as [(yield $a => $b)], so we need to ensure that // [(yield $a) => $b] is printed with parentheses. We approximate this by lowering the LHS // precedence to that of yield (which will also print unnecessary parentheses for rare low // precedence unary operators like include). $yieldPrecedence = $this->precedenceMap[Expr\Yield_::class][0]; return $this->p($node, self::MAX_PRECEDENCE, $yieldPrecedence) . ' => '; } protected function pArrayItem(Node\ArrayItem $node): string { return $this->pKey($node->key) . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node): string { return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; } protected function pExpr_ConstFetch(Expr\ConstFetch $node): string { return $this->p($node->name); } protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node): string { return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name); } protected function pExpr_PropertyFetch(Expr\PropertyFetch $node): string { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); } protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node): string { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); } protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node): string { return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); } protected function pExpr_ShellExec(Expr\ShellExec $node): string { return '`' . $this->pEncapsList($node->parts, '`') . '`'; } protected function pExpr_Closure(Expr\Closure $node): string { return $this->pAttrGroups($node->attrGroups, true) . $this->pStatic($node->static) . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pParams($node->params) . ')' . (!empty($node->uses) ? ' use (' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pExpr_Match(Expr\Match_ $node): string { return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, true) . $this->nl . '}'; } protected function pMatchArm(Node\MatchArm $node): string { $result = ''; if ($node->conds) { for ($i = 0, $c = \count($node->conds); $i + 1 < $c; $i++) { $result .= $this->p($node->conds[$i]) . ', '; } $result .= $this->pKey($node->conds[$i]); } else { $result = 'default => '; } return $result . $this->p($node->body); } protected function pExpr_ArrowFunction(Expr\ArrowFunction $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp( Expr\ArrowFunction::class, $this->pAttrGroups($node->attrGroups, true) . $this->pStatic($node->static) . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pParams($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ', $node->expr, $precedence, $lhsPrecedence); } protected function pClosureUse(Node\ClosureUse $node): string { return ($node->byRef ? '&' : '') . $this->p($node->var); } protected function pExpr_New(Expr\New_ $node): string { if ($node->class instanceof Stmt\Class_) { $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; return 'new ' . $this->pClassCommon($node->class, $args); } return 'new ' . $this->pNewOperand($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_Clone(Expr\Clone_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\Clone_::class, 'clone ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Ternary(Expr\Ternary $node, int $precedence, int $lhsPrecedence): string { // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. // this is okay because the part between ? and : never needs parentheses. return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else, $precedence, $lhsPrecedence ); } protected function pExpr_Exit(Expr\Exit_ $node): string { $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); } protected function pExpr_Throw(Expr\Throw_ $node, int $precedence, int $lhsPrecedence): string { return $this->pPrefixOp(Expr\Throw_::class, 'throw ', $node->expr, $precedence, $lhsPrecedence); } protected function pExpr_Yield(Expr\Yield_ $node, int $precedence, int $lhsPrecedence): string { if ($node->value === null) { $opPrecedence = $this->precedenceMap[Expr\Yield_::class][0]; return $opPrecedence >= $lhsPrecedence ? '(yield)' : 'yield'; } else { if (!$this->phpVersion->supportsYieldWithoutParentheses()) { return '(yield ' . $this->pKey($node->key) . $this->p($node->value) . ')'; } return $this->pPrefixOp( Expr\Yield_::class, 'yield ' . $this->pKey($node->key), $node->value, $precedence, $lhsPrecedence); } } // Declarations protected function pStmt_Namespace(Stmt\Namespace_ $node): string { if ($this->canUseSemicolonNamespaces) { return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, false); } else { return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } } protected function pStmt_Use(Stmt\Use_ $node): string { return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; } protected function pStmt_GroupUse(Stmt\GroupUse $node): string { return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\{' . $this->pCommaSeparated($node->uses) . '};'; } protected function pUseItem(Node\UseItem $node): string { return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); } protected function pUseType(int $type): string { return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); } protected function pStmt_Interface(Stmt\Interface_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Enum(Stmt\Enum_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? ' : ' . $this->p($node->scalarType) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Class(Stmt\Class_ $node): string { return $this->pClassCommon($node, ' ' . $node->name); } protected function pStmt_Trait(Stmt\Trait_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_EnumCase(Stmt\EnumCase $node): string { return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; } protected function pStmt_TraitUse(Stmt\TraitUse $node): string { return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); } protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node): string { return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; } protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node): string { return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; } protected function pStmt_Property(Stmt\Property $node): string { return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ($node->hooks ? ' {' . $this->pStmts($node->hooks) . $this->nl . '}' : ';'); } protected function pPropertyItem(Node\PropertyItem $node): string { return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } protected function pPropertyHook(Node\PropertyHook $node): string { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . ($node->byRef ? '&' : '') . $node->name . ($node->params ? '(' . $this->pParams($node->params) . ')' : '') . (\is_array($node->body) ? ' {' . $this->pStmts($node->body) . $this->nl . '}' : ($node->body !== null ? ' => ' . $this->p($node->body) : '') . ';'); } protected function pStmt_ClassMethod(Stmt\ClassMethod $node): string { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pParams($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } protected function pStmt_ClassConst(Stmt\ClassConst $node): string { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' . (null !== $node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Function(Stmt\Function_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pParams($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Const(Stmt\Const_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'const ' . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Declare(Stmt\Declare_ $node): string { return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } protected function pDeclareItem(Node\DeclareItem $node): string { return $node->key . '=' . $this->p($node->value); } // Control flow protected function pStmt_If(Stmt\If_ $node): string { return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); } protected function pStmt_ElseIf(Stmt\ElseIf_ $node): string { return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Else(Stmt\Else_ $node): string { if (\count($node->stmts) === 1 && $node->stmts[0] instanceof Stmt\If_) { // Print as "else if" rather than "else { if }" return 'else ' . $this->p($node->stmts[0]); } return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_For(Stmt\For_ $node): string { return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Foreach(Stmt\Foreach_ $node): string { return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_While(Stmt\While_ $node): string { return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Do(Stmt\Do_ $node): string { return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; } protected function pStmt_Switch(Stmt\Switch_ $node): string { return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; } protected function pStmt_Case(Stmt\Case_ $node): string { return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); } protected function pStmt_TryCatch(Stmt\TryCatch $node): string { return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); } protected function pStmt_Catch(Stmt\Catch_ $node): string { return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Finally(Stmt\Finally_ $node): string { return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Break(Stmt\Break_ $node): string { return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } protected function pStmt_Continue(Stmt\Continue_ $node): string { return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } protected function pStmt_Return(Stmt\Return_ $node): string { return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; } protected function pStmt_Label(Stmt\Label $node): string { return $node->name . ':'; } protected function pStmt_Goto(Stmt\Goto_ $node): string { return 'goto ' . $node->name . ';'; } // Other protected function pStmt_Expression(Stmt\Expression $node): string { return $this->p($node->expr) . ';'; } protected function pStmt_Echo(Stmt\Echo_ $node): string { return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; } protected function pStmt_Static(Stmt\Static_ $node): string { return 'static ' . $this->pCommaSeparated($node->vars) . ';'; } protected function pStmt_Global(Stmt\Global_ $node): string { return 'global ' . $this->pCommaSeparated($node->vars) . ';'; } protected function pStaticVar(Node\StaticVar $node): string { return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } protected function pStmt_Unset(Stmt\Unset_ $node): string { return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; } protected function pStmt_InlineHTML(Stmt\InlineHTML $node): string { $newline = $node->getAttribute('hasLeadingNewline', true) ? $this->newline : ''; return '?>' . $newline . $node->value . 'remaining; } protected function pStmt_Nop(Stmt\Nop $node): string { return ''; } protected function pStmt_Block(Stmt\Block $node): string { return '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } // Helpers protected function pClassCommon(Stmt\Class_ $node, string $afterClassToken): string { return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pObjectProperty(Node $node): string { if ($node instanceof Expr) { return '{' . $this->p($node) . '}'; } else { assert($node instanceof Node\Identifier); return $node->name; } } /** @param (Expr|Node\InterpolatedStringPart)[] $encapsList */ protected function pEncapsList(array $encapsList, ?string $quote): string { $return = ''; foreach ($encapsList as $element) { if ($element instanceof Node\InterpolatedStringPart) { $return .= $this->escapeString($element->value, $quote); } else { $return .= '{' . $this->p($element) . '}'; } } return $return; } protected function pSingleQuotedString(string $string): string { // It is idiomatic to only escape backslashes when necessary, i.e. when followed by ', \ or // the end of the string ('Foo\Bar' instead of 'Foo\\Bar'). However, we also don't want to // produce an odd number of backslashes, so '\\\\a' should not get rendered as '\\\a', even // though that would be legal. $regex = '/\'|\\\\(?=[\'\\\\]|$)|(?<=\\\\)\\\\/'; return '\'' . preg_replace($regex, '\\\\$0', $string) . '\''; } protected function escapeString(string $string, ?string $quote): string { if (null === $quote) { // For doc strings, don't escape newlines $escaped = addcslashes($string, "\t\f\v$\\"); // But do escape isolated \r. Combined with the terminating newline, it might get // interpreted as \r\n and dropped from the string contents. $escaped = preg_replace('/\r(?!\n)/', '\\r', $escaped); if ($this->phpVersion->supportsFlexibleHeredoc()) { $escaped = $this->indentString($escaped); } } else { $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); } // Escape control characters and non-UTF-8 characters. // Regex based on https://stackoverflow.com/a/11709412/385378. $regex = '/( [\x00-\x08\x0E-\x1F] # Control characters | [\xC0-\xC1] # Invalid UTF-8 Bytes | [\xF5-\xFF] # Invalid UTF-8 Bytes | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle | (? $part) { if ($part instanceof Node\InterpolatedStringPart && $this->containsEndLabel($this->escapeString($part->value, null), $label, $i === 0) ) { return true; } } return false; } protected function pDereferenceLhs(Node $node): string { if (!$this->dereferenceLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pStaticDereferenceLhs(Node $node): string { if (!$this->staticDereferenceLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pCallLhs(Node $node): string { if (!$this->callLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pNewOperand(Node $node): string { if (!$this->newOperandRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } /** * @param Node[] $nodes */ protected function hasNodeWithComments(array $nodes): bool { foreach ($nodes as $node) { if ($node && $node->getComments()) { return true; } } return false; } /** @param Node[] $nodes */ protected function pMaybeMultiline(array $nodes, bool $trailingComma = false): string { if (!$this->hasNodeWithComments($nodes)) { return $this->pCommaSeparated($nodes); } else { return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; } } /** @param Node\Param[] $params */ private function hasParamWithAttributes(array $params): bool { foreach ($params as $param) { if ($param->attrGroups) { return true; } } return false; } /** @param Node\Param[] $params */ protected function pParams(array $params): string { if ($this->hasNodeWithComments($params) || ($this->hasParamWithAttributes($params) && !$this->phpVersion->supportsAttributes()) ) { return $this->pCommaSeparatedMultiline($params, $this->phpVersion->supportsTrailingCommaInParamList()) . $this->nl; } return $this->pCommaSeparated($params); } /** @param Node\AttributeGroup[] $nodes */ protected function pAttrGroups(array $nodes, bool $inline = false): string { $result = ''; $sep = $inline ? ' ' : $this->nl; foreach ($nodes as $node) { $result .= $this->p($node) . $sep; } return $result; } } */ protected array $stmts = []; /** @var list */ protected array $attributeGroups = []; /** * Creates a function builder. * * @param string $name Name of the function */ public function __construct(string $name) { $this->name = $name; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built function node. * * @return Stmt\Function_ The built function node */ public function getNode(): Node { return new Stmt\Function_($this->name, [ 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } type = self::TYPE_UNDEFINED; $this->trait = is_null($trait) ? null : BuilderHelpers::normalizeName($trait); $this->method = BuilderHelpers::normalizeIdentifier($method); } /** * Sets alias of method. * * @param Node\Identifier|string $alias Alias for adapted method * * @return $this The builder instance (for fluid interface) */ public function as($alias) { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set alias for not alias adaptation buider'); } $this->alias = BuilderHelpers::normalizeIdentifier($alias); return $this; } /** * Sets adapted method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->setModifier(Modifiers::PUBLIC); return $this; } /** * Sets adapted method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->setModifier(Modifiers::PROTECTED); return $this; } /** * Sets adapted method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->setModifier(Modifiers::PRIVATE); return $this; } /** * Adds overwritten traits. * * @param Node\Name|string ...$traits Traits for overwrite * * @return $this The builder instance (for fluid interface) */ public function insteadof(...$traits) { if ($this->type === self::TYPE_UNDEFINED) { if (is_null($this->trait)) { throw new \LogicException('Precedence adaptation must have trait'); } $this->type = self::TYPE_PRECEDENCE; } if ($this->type !== self::TYPE_PRECEDENCE) { throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); } foreach ($traits as $trait) { $this->insteadof[] = BuilderHelpers::normalizeName($trait); } return $this; } protected function setModifier(int $modifier): void { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); } if (is_null($this->modifier)) { $this->modifier = $modifier; } else { throw new \LogicException('Multiple access type modifiers are not allowed'); } } /** * Returns the built node. * * @return Node The built node */ public function getNode(): Node { switch ($this->type) { case self::TYPE_ALIAS: return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); case self::TYPE_PRECEDENCE: return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); default: throw new \LogicException('Type of adaptation is not defined'); } } } name = BuilderHelpers::normalizeName($name); $this->type = $type; } /** * Sets alias for used name. * * @param string $alias Alias to use (last component of full name by default) * * @return $this The builder instance (for fluid interface) */ public function as(string $alias) { $this->alias = $alias; return $this; } /** * Returns the built node. * * @return Stmt\Use_ The built node */ public function getNode(): Node { return new Stmt\Use_([ new Node\UseItem($this->name, $this->alias) ], $this->type); } } name = null !== $name ? BuilderHelpers::normalizeName($name) : null; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Returns the built node. * * @return Stmt\Namespace_ The built node */ public function getNode(): Node { return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); } } */ protected array $implements = []; protected int $flags = 0; /** @var list */ protected array $uses = []; /** @var list */ protected array $constants = []; /** @var list */ protected array $properties = []; /** @var list */ protected array $methods = []; /** @var list */ protected array $attributeGroups = []; /** * Creates a class builder. * * @param string $name Name of the class */ public function __construct(string $name) { $this->name = $name; } /** * Extends a class. * * @param Name|string $class Name of class to extend * * @return $this The builder instance (for fluid interface) */ public function extend($class) { $this->extends = BuilderHelpers::normalizeName($class); return $this; } /** * Implements one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to implement * * @return $this The builder instance (for fluid interface) */ public function implement(...$interfaces) { foreach ($interfaces as $interface) { $this->implements[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Makes the class abstract. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::ABSTRACT); return $this; } /** * Makes the class final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::FINAL); return $this; } /** * Makes the class readonly. * * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::READONLY); return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\Property) { $this->properties[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; } elseif ($stmt instanceof Stmt\ClassConst) { $this->constants[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Class_ The built class node */ public function getNode(): PhpParser\Node { return new Stmt\Class_($this->name, [ 'flags' => $this->flags, 'extends' => $this->extends, 'implements' => $this->implements, 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } */ protected array $attributes = []; /** @var list */ protected array $attributeGroups = []; /** * Creates an enum case builder. * * @param string|Identifier $name Name */ public function __construct($name) { $this->name = $name; } /** * Sets the value. * * @param Node\Expr|string|int $value * * @return $this */ public function setValue($value) { $this->value = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets doc comment for the constant. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = [ 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] ]; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built enum case node. * * @return Stmt\EnumCase The built constant node */ public function getNode(): PhpParser\Node { return new Stmt\EnumCase( $this->name, $this->value, $this->attributeGroups, $this->attributes ); } } */ protected array $attributes = []; /** * Adds a statement. * * @param PhpParser\Node\Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ abstract public function addStmt($stmt); /** * Adds multiple statements. * * @param (PhpParser\Node\Stmt|PhpParser\Builder)[] $stmts The statements to add * * @return $this The builder instance (for fluid interface) */ public function addStmts(array $stmts) { foreach ($stmts as $stmt) { $this->addStmt($stmt); } return $this; } /** * Sets doc comment for the declaration. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes['comments'] = [ BuilderHelpers::normalizeDocComment($docComment) ]; return $this; } } |null */ protected ?array $stmts = []; /** @var list */ protected array $attributeGroups = []; /** * Creates a method builder. * * @param string $name Name of the method */ public function __construct(string $name) { $this->name = $name; } /** * Makes the method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** * Makes the method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** * Makes the method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** * Makes the method static. * * @return $this The builder instance (for fluid interface) */ public function makeStatic() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC); return $this; } /** * Makes the method abstract. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { if (!empty($this->stmts)) { throw new \LogicException('Cannot make method with statements abstract'); } $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT); $this->stmts = null; // abstract methods don't have statements return $this; } /** * Makes the method final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { if (null === $this->stmts) { throw new \LogicException('Cannot add statements to an abstract method'); } $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built method node. * * @return Stmt\ClassMethod The built method node */ public function getNode(): Node { return new Stmt\ClassMethod($this->name, [ 'flags' => $this->flags, 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } */ protected array $uses = []; /** @var list */ protected array $constants = []; /** @var list */ protected array $properties = []; /** @var list */ protected array $methods = []; /** @var list */ protected array $attributeGroups = []; /** * Creates an interface builder. * * @param string $name Name of the interface */ public function __construct(string $name) { $this->name = $name; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\Property) { $this->properties[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; } elseif ($stmt instanceof Stmt\ClassConst) { $this->constants[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built trait node. * * @return Stmt\Trait_ The built interface node */ public function getNode(): PhpParser\Node { return new Stmt\Trait_( $this->name, [ 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes ); } } and($trait); } } /** * Adds used trait. * * @param Node\Name|string $trait Trait name * * @return $this The builder instance (for fluid interface) */ public function and($trait) { $this->traits[] = BuilderHelpers::normalizeName($trait); return $this; } /** * Adds trait adaptation. * * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation * * @return $this The builder instance (for fluid interface) */ public function with($adaptation) { $adaptation = BuilderHelpers::normalizeNode($adaptation); if (!$adaptation instanceof Stmt\TraitUseAdaptation) { throw new \LogicException('Adaptation must have type TraitUseAdaptation'); } $this->adaptations[] = $adaptation; return $this; } /** * Returns the built node. * * @return Node The built node */ public function getNode(): Node { return new Stmt\TraitUse($this->traits, $this->adaptations); } } */ protected array $implements = []; /** @var list */ protected array $uses = []; /** @var list */ protected array $enumCases = []; /** @var list */ protected array $constants = []; /** @var list */ protected array $methods = []; /** @var list */ protected array $attributeGroups = []; /** * Creates an enum builder. * * @param string $name Name of the enum */ public function __construct(string $name) { $this->name = $name; } /** * Sets the scalar type. * * @param string|Identifier $scalarType * * @return $this */ public function setScalarType($scalarType) { $this->scalarType = BuilderHelpers::normalizeType($scalarType); return $this; } /** * Implements one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to implement * * @return $this The builder instance (for fluid interface) */ public function implement(...$interfaces) { foreach ($interfaces as $interface) { $this->implements[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\EnumCase) { $this->enumCases[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; } elseif ($stmt instanceof Stmt\ClassConst) { $this->constants[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Enum_ The built enum node */ public function getNode(): PhpParser\Node { return new Stmt\Enum_($this->name, [ 'scalarType' => $this->scalarType, 'implements' => $this->implements, 'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } */ protected array $attributeGroups = []; /** * Creates a parameter builder. * * @param string $name Name of the parameter */ public function __construct(string $name) { $this->name = $name; } /** * Sets default value for the parameter. * * @param mixed $value Default value to use * * @return $this The builder instance (for fluid interface) */ public function setDefault($value) { $this->default = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets type for the parameter. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * * @return $this The builder instance (for fluid interface) */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); if ($this->type == 'void') { throw new \LogicException('Parameter type cannot be void'); } return $this; } /** * Make the parameter accept the value by reference. * * @return $this The builder instance (for fluid interface) */ public function makeByRef() { $this->byRef = true; return $this; } /** * Make the parameter variadic * * @return $this The builder instance (for fluid interface) */ public function makeVariadic() { $this->variadic = true; return $this; } /** * Makes the (promoted) parameter public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** * Makes the (promoted) parameter protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** * Makes the (promoted) parameter private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** * Makes the (promoted) parameter readonly. * * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY); return $this; } /** * Gives the promoted property private(set) visibility. * * @return $this The builder instance (for fluid interface) */ public function makePrivateSet() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE_SET); return $this; } /** * Gives the promoted property protected(set) visibility. * * @return $this The builder instance (for fluid interface) */ public function makeProtectedSet() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED_SET); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built parameter node. * * @return Node\Param The built parameter node */ public function getNode(): Node { return new Node\Param( new Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups ); } } returnByRef = true; return $this; } /** * Adds a parameter. * * @param Node\Param|Param $param The parameter to add * * @return $this The builder instance (for fluid interface) */ public function addParam($param) { $param = BuilderHelpers::normalizeNode($param); if (!$param instanceof Node\Param) { throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType())); } $this->params[] = $param; return $this; } /** * Adds multiple parameters. * * @param (Node\Param|Param)[] $params The parameters to add * * @return $this The builder instance (for fluid interface) */ public function addParams(array $params) { foreach ($params as $param) { $this->addParam($param); } return $this; } /** * Sets the return type for PHP 7. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type * * @return $this The builder instance (for fluid interface) */ public function setReturnType($type) { $this->returnType = BuilderHelpers::normalizeType($type); return $this; } } */ protected array $attributes = []; /** @var list */ protected array $constants = []; /** @var list */ protected array $attributeGroups = []; /** @var Identifier|Node\Name|Node\ComplexType|null */ protected ?Node $type = null; /** * Creates a class constant builder * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value */ public function __construct($name, $value) { $this->constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; } /** * Add another constant to const group * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value * * @return $this The builder instance (for fluid interface) */ public function addConst($name, $value) { $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); return $this; } /** * Makes the constant public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** * Makes the constant protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** * Makes the constant private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** * Makes the constant final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } /** * Sets doc comment for the constant. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = [ 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] ]; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Sets the constant type. * * @param string|Node\Name|Identifier|Node\ComplexType $type * * @return $this */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); return $this; } /** * Returns the built class node. * * @return Stmt\ClassConst The built constant node */ public function getNode(): PhpParser\Node { return new Stmt\ClassConst( $this->constants, $this->flags, $this->attributes, $this->attributeGroups, $this->type ); } } */ protected array $attributes = []; /** @var null|Identifier|Name|ComplexType */ protected ?Node $type = null; /** @var list */ protected array $attributeGroups = []; /** @var list */ protected array $hooks = []; /** * Creates a property builder. * * @param string $name Name of the property */ public function __construct(string $name) { $this->name = $name; } /** * Makes the property public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** * Makes the property protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** * Makes the property private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** * Makes the property static. * * @return $this The builder instance (for fluid interface) */ public function makeStatic() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC); return $this; } /** * Makes the property readonly. * * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY); return $this; } /** * Makes the property abstract. Requires at least one property hook to be specified as well. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT); return $this; } /** * Makes the property final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } /** * Gives the property private(set) visibility. * * @return $this The builder instance (for fluid interface) */ public function makePrivateSet() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE_SET); return $this; } /** * Gives the property protected(set) visibility. * * @return $this The builder instance (for fluid interface) */ public function makeProtectedSet() { $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED_SET); return $this; } /** * Sets default value for the property. * * @param mixed $value Default value to use * * @return $this The builder instance (for fluid interface) */ public function setDefault($value) { $this->default = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets doc comment for the property. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = [ 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] ]; return $this; } /** * Sets the property type for PHP 7.4+. * * @param string|Name|Identifier|ComplexType $type * * @return $this */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Adds a property hook. * * @return $this The builder instance (for fluid interface) */ public function addHook(Node\PropertyHook $hook) { $this->hooks[] = $hook; return $this; } /** * Returns the built class node. * * @return Stmt\Property The built property node */ public function getNode(): PhpParser\Node { if ($this->flags & Modifiers::ABSTRACT && !$this->hooks) { throw new PhpParser\Error('Only hooked properties may be declared abstract'); } return new Stmt\Property( $this->flags !== 0 ? $this->flags : Modifiers::PUBLIC, [ new Node\PropertyItem($this->name, $this->default) ], $this->attributes, $this->type, $this->attributeGroups, $this->hooks ); } } */ protected array $extends = []; /** @var list */ protected array $constants = []; /** @var list */ protected array $methods = []; /** @var list */ protected array $attributeGroups = []; /** * Creates an interface builder. * * @param string $name Name of the interface */ public function __construct(string $name) { $this->name = $name; } /** * Extends one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to extend * * @return $this The builder instance (for fluid interface) */ public function extend(...$interfaces) { foreach ($interfaces as $interface) { $this->extends[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\ClassConst) { $this->constants[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { // we erase all statements in the body of an interface method $stmt->stmts = null; $this->methods[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built interface node. * * @return Stmt\Interface_ The built interface node */ public function getNode(): PhpParser\Node { return new Stmt\Interface_($this->name, [ 'extends' => $this->extends, 'stmts' => array_merge($this->constants, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } getNode(); } if ($node instanceof Node) { return $node; } throw new \LogicException('Expected node or builder object'); } /** * Normalizes a node to a statement. * * Expressions are wrapped in a Stmt\Expression node. * * @param Node|Builder $node The node to normalize * * @return Stmt The normalized statement node */ public static function normalizeStmt($node): Stmt { $node = self::normalizeNode($node); if ($node instanceof Stmt) { return $node; } if ($node instanceof Expr) { return new Stmt\Expression($node); } throw new \LogicException('Expected statement or expression node'); } /** * Normalizes strings to Identifier. * * @param string|Identifier $name The identifier to normalize * * @return Identifier The normalized identifier */ public static function normalizeIdentifier($name): Identifier { if ($name instanceof Identifier) { return $name; } if (\is_string($name)) { return new Identifier($name); } throw new \LogicException('Expected string or instance of Node\Identifier'); } /** * Normalizes strings to Identifier, also allowing expressions. * * @param string|Identifier|Expr $name The identifier to normalize * * @return Identifier|Expr The normalized identifier or expression */ public static function normalizeIdentifierOrExpr($name) { if ($name instanceof Identifier || $name instanceof Expr) { return $name; } if (\is_string($name)) { return new Identifier($name); } throw new \LogicException('Expected string or instance of Node\Identifier or Node\Expr'); } /** * Normalizes a name: Converts string names to Name nodes. * * @param Name|string $name The name to normalize * * @return Name The normalized name */ public static function normalizeName($name): Name { if ($name instanceof Name) { return $name; } if (is_string($name)) { if (!$name) { throw new \LogicException('Name cannot be empty'); } if ($name[0] === '\\') { return new Name\FullyQualified(substr($name, 1)); } if (0 === strpos($name, 'namespace\\')) { return new Name\Relative(substr($name, strlen('namespace\\'))); } return new Name($name); } throw new \LogicException('Name must be a string or an instance of Node\Name'); } /** * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. * * @param Expr|Name|string $name The name to normalize * * @return Name|Expr The normalized name or expression */ public static function normalizeNameOrExpr($name) { if ($name instanceof Expr) { return $name; } if (!is_string($name) && !($name instanceof Name)) { throw new \LogicException( 'Name must be a string or an instance of Node\Name or Node\Expr' ); } return self::normalizeName($name); } /** * Normalizes a type: Converts plain-text type names into proper AST representation. * * In particular, builtin types become Identifiers, custom types become Names and nullables * are wrapped in NullableType nodes. * * @param string|Name|Identifier|ComplexType $type The type to normalize * * @return Name|Identifier|ComplexType The normalized type */ public static function normalizeType($type) { if (!is_string($type)) { if ( !$type instanceof Name && !$type instanceof Identifier && !$type instanceof ComplexType ) { throw new \LogicException( 'Type must be a string, or an instance of Name, Identifier or ComplexType' ); } return $type; } $nullable = false; if (strlen($type) > 0 && $type[0] === '?') { $nullable = true; $type = substr($type, 1); } $builtinTypes = [ 'array', 'callable', 'bool', 'int', 'float', 'string', 'iterable', 'void', 'object', 'null', 'false', 'mixed', 'never', 'true', ]; $lowerType = strtolower($type); if (in_array($lowerType, $builtinTypes)) { $type = new Identifier($lowerType); } else { $type = self::normalizeName($type); } $notNullableTypes = [ 'void', 'mixed', 'never', ]; if ($nullable && in_array((string) $type, $notNullableTypes)) { throw new \LogicException(sprintf('%s type cannot be nullable', $type)); } return $nullable ? new NullableType($type) : $type; } /** * Normalizes a value: Converts nulls, booleans, integers, * floats, strings and arrays into their respective nodes * * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value The value to normalize * * @return Expr The normalized value */ public static function normalizeValue($value): Expr { if ($value instanceof Node\Expr) { return $value; } if (is_null($value)) { return new Expr\ConstFetch( new Name('null') ); } if (is_bool($value)) { return new Expr\ConstFetch( new Name($value ? 'true' : 'false') ); } if (is_int($value)) { return new Scalar\Int_($value); } if (is_float($value)) { return new Scalar\Float_($value); } if (is_string($value)) { return new Scalar\String_($value); } if (is_array($value)) { $items = []; $lastKey = -1; foreach ($value as $itemKey => $itemValue) { // for consecutive, numeric keys don't generate keys if (null !== $lastKey && ++$lastKey === $itemKey) { $items[] = new Node\ArrayItem( self::normalizeValue($itemValue) ); } else { $lastKey = null; $items[] = new Node\ArrayItem( self::normalizeValue($itemValue), self::normalizeValue($itemKey) ); } } return new Expr\Array_($items); } if ($value instanceof \UnitEnum) { return new Expr\ClassConstFetch(new FullyQualified(\get_class($value)), new Identifier($value->name)); } throw new \LogicException('Invalid value'); } /** * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. * * @param Comment\Doc|string $docComment The doc comment to normalize * * @return Comment\Doc The normalized doc comment */ public static function normalizeDocComment($docComment): Comment\Doc { if ($docComment instanceof Comment\Doc) { return $docComment; } if (is_string($docComment)) { return new Comment\Doc($docComment); } throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc'); } /** * Normalizes a attribute: Converts attribute to the Attribute Group if needed. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return Node\AttributeGroup The Attribute Group */ public static function normalizeAttribute($attribute): Node\AttributeGroup { if ($attribute instanceof Node\AttributeGroup) { return $attribute; } if (!($attribute instanceof Node\Attribute)) { throw new \LogicException('Attribute must be an instance of PhpParser\Node\Attribute or PhpParser\Node\AttributeGroup'); } return new Node\AttributeGroup([$attribute]); } /** * Adds a modifier and returns new modifier bitmask. * * @param int $modifiers Existing modifiers * @param int $modifier Modifier to set * * @return int New modifiers */ public static function addModifier(int $modifiers, int $modifier): int { Modifiers::verifyModifier($modifiers, $modifier); return $modifiers | $modifier; } /** * Adds a modifier and returns new modifier bitmask. * @return int New modifiers */ public static function addClassModifier(int $existingModifiers, int $modifierToSet): int { Modifiers::verifyClassModifier($existingModifiers, $modifierToSet); return $existingModifiers | $modifierToSet; } } true, 'startLine' => true, 'endLine' => true, 'startFilePos' => true, 'endFilePos' => true, 'startTokenPos' => true, 'endTokenPos' => true, ]; /** * Constructs a NodeDumper. * * Supported options: * * bool dumpComments: Whether comments should be dumped. * * bool dumpPositions: Whether line/offset information should be dumped. To dump offset * information, the code needs to be passed to dump(). * * bool dumpOtherAttributes: Whether non-comment, non-position attributes should be dumped. * * @param array $options Options (see description) */ public function __construct(array $options = []) { $this->dumpComments = !empty($options['dumpComments']); $this->dumpPositions = !empty($options['dumpPositions']); $this->dumpOtherAttributes = !empty($options['dumpOtherAttributes']); } /** * Dumps a node or array. * * @param array|Node $node Node or array to dump * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if * the dumpPositions option is enabled and the dumping of node offsets * is desired. * * @return string Dumped value */ public function dump($node, ?string $code = null): string { $this->code = $code; $this->res = ''; $this->nl = "\n"; $this->dumpRecursive($node, false); return $this->res; } /** @param mixed $node */ protected function dumpRecursive($node, bool $indent = true): void { if ($indent) { $this->nl .= " "; } if ($node instanceof Node) { $this->res .= $node->getType(); if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) { $this->res .= $p; } $this->res .= '('; foreach ($node->getSubNodeNames() as $key) { $this->res .= "$this->nl " . $key . ': '; $value = $node->$key; if (\is_int($value)) { if ('flags' === $key || 'newModifier' === $key) { $this->res .= $this->dumpFlags($value); continue; } if ('type' === $key && $node instanceof Include_) { $this->res .= $this->dumpIncludeType($value); continue; } if ('type' === $key && ($node instanceof Use_ || $node instanceof UseItem || $node instanceof GroupUse)) { $this->res .= $this->dumpUseType($value); continue; } } $this->dumpRecursive($value); } if ($this->dumpComments && $comments = $node->getComments()) { $this->res .= "$this->nl comments: "; $this->dumpRecursive($comments); } if ($this->dumpOtherAttributes) { foreach ($node->getAttributes() as $key => $value) { if (isset(self::IGNORE_ATTRIBUTES[$key])) { continue; } $this->res .= "$this->nl $key: "; if (\is_int($value)) { if ('kind' === $key) { if ($node instanceof Int_) { $this->res .= $this->dumpIntKind($value); continue; } if ($node instanceof String_ || $node instanceof InterpolatedString) { $this->res .= $this->dumpStringKind($value); continue; } if ($node instanceof Array_) { $this->res .= $this->dumpArrayKind($value); continue; } if ($node instanceof List_) { $this->res .= $this->dumpListKind($value); continue; } } } $this->dumpRecursive($value); } } $this->res .= "$this->nl)"; } elseif (\is_array($node)) { $this->res .= 'array('; foreach ($node as $key => $value) { $this->res .= "$this->nl " . $key . ': '; $this->dumpRecursive($value); } $this->res .= "$this->nl)"; } elseif ($node instanceof Comment) { $this->res .= \str_replace("\n", $this->nl, $node->getReformattedText()); } elseif (\is_string($node)) { $this->res .= \str_replace("\n", $this->nl, $node); } elseif (\is_int($node) || \is_float($node)) { $this->res .= $node; } elseif (null === $node) { $this->res .= 'null'; } elseif (false === $node) { $this->res .= 'false'; } elseif (true === $node) { $this->res .= 'true'; } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } if ($indent) { $this->nl = \substr($this->nl, 0, -4); } } protected function dumpFlags(int $flags): string { $strs = []; if ($flags & Modifiers::PUBLIC) { $strs[] = 'PUBLIC'; } if ($flags & Modifiers::PROTECTED) { $strs[] = 'PROTECTED'; } if ($flags & Modifiers::PRIVATE) { $strs[] = 'PRIVATE'; } if ($flags & Modifiers::ABSTRACT) { $strs[] = 'ABSTRACT'; } if ($flags & Modifiers::STATIC) { $strs[] = 'STATIC'; } if ($flags & Modifiers::FINAL) { $strs[] = 'FINAL'; } if ($flags & Modifiers::READONLY) { $strs[] = 'READONLY'; } if ($flags & Modifiers::PUBLIC_SET) { $strs[] = 'PUBLIC_SET'; } if ($flags & Modifiers::PROTECTED_SET) { $strs[] = 'PROTECTED_SET'; } if ($flags & Modifiers::PRIVATE_SET) { $strs[] = 'PRIVATE_SET'; } if ($strs) { return implode(' | ', $strs) . ' (' . $flags . ')'; } else { return (string) $flags; } } /** @param array $map */ private function dumpEnum(int $value, array $map): string { if (!isset($map[$value])) { return (string) $value; } return $map[$value] . ' (' . $value . ')'; } private function dumpIncludeType(int $type): string { return $this->dumpEnum($type, [ Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE', ]); } private function dumpUseType(int $type): string { return $this->dumpEnum($type, [ Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT', ]); } private function dumpIntKind(int $kind): string { return $this->dumpEnum($kind, [ Int_::KIND_BIN => 'KIND_BIN', Int_::KIND_OCT => 'KIND_OCT', Int_::KIND_DEC => 'KIND_DEC', Int_::KIND_HEX => 'KIND_HEX', ]); } private function dumpStringKind(int $kind): string { return $this->dumpEnum($kind, [ String_::KIND_SINGLE_QUOTED => 'KIND_SINGLE_QUOTED', String_::KIND_DOUBLE_QUOTED => 'KIND_DOUBLE_QUOTED', String_::KIND_HEREDOC => 'KIND_HEREDOC', String_::KIND_NOWDOC => 'KIND_NOWDOC', ]); } private function dumpArrayKind(int $kind): string { return $this->dumpEnum($kind, [ Array_::KIND_LONG => 'KIND_LONG', Array_::KIND_SHORT => 'KIND_SHORT', ]); } private function dumpListKind(int $kind): string { return $this->dumpEnum($kind, [ List_::KIND_LIST => 'KIND_LIST', List_::KIND_ARRAY => 'KIND_ARRAY', ]); } /** * Dump node position, if possible. * * @param Node $node Node for which to dump position * * @return string|null Dump of position, or null if position information not available */ protected function dumpPosition(Node $node): ?string { if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { return null; } $start = $node->getStartLine(); $end = $node->getEndLine(); if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') && null !== $this->code ) { $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); } return "[$start - $end]"; } // Copied from Error class private function toColumn(string $code, int $pos): int { if ($pos > strlen($code)) { throw new \RuntimeException('Invalid position information'); } $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); if (false === $lineStartPos) { $lineStartPos = -1; } return $pos - $lineStartPos; } } */ protected array $attributes; /** * Creates an Exception signifying a parse error. * * @param string $message Error message * @param array $attributes Attributes of node/token where error occurred */ public function __construct(string $message, array $attributes = []) { $this->rawMessage = $message; $this->attributes = $attributes; $this->updateMessage(); } /** * Gets the error message * * @return string Error message */ public function getRawMessage(): string { return $this->rawMessage; } /** * Gets the line the error starts in. * * @return int Error start line * @phpstan-return -1|positive-int */ public function getStartLine(): int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the error ends in. * * @return int Error end line * @phpstan-return -1|positive-int */ public function getEndLine(): int { return $this->attributes['endLine'] ?? -1; } /** * Gets the attributes of the node/token the error occurred at. * * @return array */ public function getAttributes(): array { return $this->attributes; } /** * Sets the attributes of the node/token the error occurred at. * * @param array $attributes */ public function setAttributes(array $attributes): void { $this->attributes = $attributes; $this->updateMessage(); } /** * Sets the line of the PHP file the error occurred in. * * @param string $message Error message */ public function setRawMessage(string $message): void { $this->rawMessage = $message; $this->updateMessage(); } /** * Sets the line the error starts in. * * @param int $line Error start line */ public function setStartLine(int $line): void { $this->attributes['startLine'] = $line; $this->updateMessage(); } /** * Returns whether the error has start and end column information. * * For column information enable the startFilePos and endFilePos in the lexer options. */ public function hasColumnInfo(): bool { return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); } /** * Gets the start column (1-based) into the line where the error started. * * @param string $code Source code of the file */ public function getStartColumn(string $code): int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } return $this->toColumn($code, $this->attributes['startFilePos']); } /** * Gets the end column (1-based) into the line where the error ended. * * @param string $code Source code of the file */ public function getEndColumn(string $code): int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } return $this->toColumn($code, $this->attributes['endFilePos']); } /** * Formats message including line and column information. * * @param string $code Source code associated with the error, for calculation of the columns * * @return string Formatted message */ public function getMessageWithColumnInfo(string $code): string { return sprintf( '%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), $this->getEndLine(), $this->getEndColumn($code) ); } /** * Converts a file offset into a column. * * @param string $code Source code that $pos indexes into * @param int $pos 0-based position in $code * * @return int 1-based column (relative to start of line) */ private function toColumn(string $code, int $pos): int { if ($pos > strlen($code)) { throw new \RuntimeException('Invalid position information'); } $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); if (false === $lineStartPos) { $lineStartPos = -1; } return $pos - $lineStartPos; } /** * Updates the exception message after a change to rawMessage or rawLine. */ protected function updateMessage(): void { $this->message = $this->rawMessage; if (-1 === $this->getStartLine()) { $this->message .= ' on unknown line'; } else { $this->message .= ' on line ' . $this->getStartLine(); } } } pos + \strlen($this->text); } /** Get 1-based end line number of the token. */ public function getEndLine(): int { return $this->line + \substr_count($this->text, "\n"); } } isHostVersion()) { $lexer = new Lexer(); } else { $lexer = new Lexer\Emulative($version); } if ($version->id >= 80000) { return new Php8($lexer, $version); } return new Php7($lexer, $version); } /** * Create a parser targeting the newest version supported by this library. Code for older * versions will be accepted if there have been no relevant backwards-compatibility breaks in * PHP. */ public function createForNewestSupportedVersion(): Parser { return $this->createForVersion(PhpVersion::getNewestSupported()); } /** * Create a parser targeting the host PHP version, that is the PHP version we're currently * running on. This parser will not use any token emulation. */ public function createForHostVersion(): Parser { return $this->createForVersion(PhpVersion::getHostVersion()); } } 'public', self::PROTECTED => 'protected', self::PRIVATE => 'private', self::STATIC => 'static', self::ABSTRACT => 'abstract', self::FINAL => 'final', self::READONLY => 'readonly', self::PUBLIC_SET => 'public(set)', self::PROTECTED_SET => 'protected(set)', self::PRIVATE_SET => 'private(set)', ]; public static function toString(int $modifier): string { if (!isset(self::TO_STRING_MAP[$modifier])) { throw new \InvalidArgumentException("Unknown modifier $modifier"); } return self::TO_STRING_MAP[$modifier]; } private static function isValidModifier(int $modifier): bool { $isPow2 = ($modifier & ($modifier - 1)) == 0 && $modifier != 0; return $isPow2 && $modifier <= self::PRIVATE_SET; } /** * @internal */ public static function verifyClassModifier(int $a, int $b): void { assert(self::isValidModifier($b)); if (($a & $b) != 0) { throw new Error( 'Multiple ' . self::toString($b) . ' modifiers are not allowed'); } if ($a & 48 && $b & 48) { throw new Error('Cannot use the final modifier on an abstract class'); } } /** * @internal */ public static function verifyModifier(int $a, int $b): void { assert(self::isValidModifier($b)); if (($a & Modifiers::VISIBILITY_MASK && $b & Modifiers::VISIBILITY_MASK) || ($a & Modifiers::VISIBILITY_SET_MASK && $b & Modifiers::VISIBILITY_SET_MASK) ) { throw new Error('Multiple access type modifiers are not allowed'); } if (($a & $b) != 0) { throw new Error( 'Multiple ' . self::toString($b) . ' modifiers are not allowed'); } if ($a & 48 && $b & 48) { throw new Error('Cannot use the final modifier on an abstract class member'); } } } Map of PHP token IDs to drop */ protected array $dropTokens; /** @var int[] Map of external symbols (static::T_*) to internal symbols */ protected array $tokenToSymbol; /** @var string[] Map of symbols to their names */ protected array $symbolToName; /** @var array Names of the production rules (only necessary for debugging) */ protected array $productions; /** @var int[] Map of states to a displacement into the $action table. The corresponding action for this * state/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the * action is defaulted, i.e. $actionDefault[$state] should be used instead. */ protected array $actionBase; /** @var int[] Table of actions. Indexed according to $actionBase comment. */ protected array $action; /** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol * then the action is defaulted, i.e. $actionDefault[$state] should be used instead. */ protected array $actionCheck; /** @var int[] Map of states to their default action */ protected array $actionDefault; /** @var callable[] Semantic action callbacks */ protected array $reduceCallbacks; /** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this * non-terminal/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) */ protected array $gotoBase; /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */ protected array $goto; /** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal * then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. */ protected array $gotoCheck; /** @var int[] Map of non-terminals to the default state to goto after their reduction */ protected array $gotoDefault; /** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for * determining the state to goto after reduction. */ protected array $ruleToNonTerminal; /** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to * be popped from the stack(s) on reduction. */ protected array $ruleToLength; /* * The following members are part of the parser state: */ /** @var mixed Temporary value containing the result of last semantic action (reduction) */ protected $semValue; /** @var mixed[] Semantic value stack (contains values of tokens and semantic action results) */ protected array $semStack; /** @var int[] Token start position stack */ protected array $tokenStartStack; /** @var int[] Token end position stack */ protected array $tokenEndStack; /** @var ErrorHandler Error handler */ protected ErrorHandler $errorHandler; /** @var int Error state, used to avoid error floods */ protected int $errorState; /** @var \SplObjectStorage|null Array nodes created during parsing, for postprocessing of empty elements. */ protected ?\SplObjectStorage $createdArrays; /** @var \SplObjectStorage|null * Arrow functions that are wrapped in parentheses, to enforce the pipe operator parentheses requirements. */ protected ?\SplObjectStorage $parenthesizedArrowFunctions; /** @var Token[] Tokens for the current parse */ protected array $tokens; /** @var int Current position in token array */ protected int $tokenPos; /** * Initialize $reduceCallbacks map. */ abstract protected function initReduceCallbacks(): void; /** * Creates a parser instance. * * Options: * * phpVersion: ?PhpVersion, * * @param Lexer $lexer A lexer * @param PhpVersion $phpVersion PHP version to target, defaults to latest supported. This * option is best-effort: Even if specified, parsing will generally assume the latest * supported version and only adjust behavior in minor ways, for example by omitting * errors in older versions and interpreting type hints as a name or identifier depending * on version. */ public function __construct(Lexer $lexer, ?PhpVersion $phpVersion = null) { $this->lexer = $lexer; $this->phpVersion = $phpVersion ?? PhpVersion::getNewestSupported(); $this->initReduceCallbacks(); $this->phpTokenToSymbol = $this->createTokenMap(); $this->dropTokens = array_fill_keys( [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], true ); } /** * Parses PHP code into a node tree. * * If a non-throwing error handler is used, the parser will continue parsing after an error * occurred and attempt to build a partial AST. * * @param string $code The source code to parse * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults * to ErrorHandler\Throwing. * * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ public function parse(string $code, ?ErrorHandler $errorHandler = null): ?array { $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing(); $this->createdArrays = new \SplObjectStorage(); $this->parenthesizedArrowFunctions = new \SplObjectStorage(); $this->tokens = $this->lexer->tokenize($code, $this->errorHandler); $result = $this->doParse(); // Report errors for any empty elements used inside arrays. This is delayed until after the main parse, // because we don't know a priori whether a given array expression will be used in a destructuring context // or not. foreach ($this->createdArrays as $node) { foreach ($node->items as $item) { if ($item->value instanceof Expr\Error) { $this->errorHandler->handleError( new Error('Cannot use empty array elements in arrays', $item->getAttributes())); } } } // Clear out some of the interior state, so we don't hold onto unnecessary // memory between uses of the parser $this->tokenStartStack = []; $this->tokenEndStack = []; $this->semStack = []; $this->semValue = null; $this->createdArrays = null; $this->parenthesizedArrowFunctions = null; if ($result !== null) { $traverser = new NodeTraverser(new CommentAnnotatingVisitor($this->tokens)); $traverser->traverse($result); } return $result; } public function getTokens(): array { return $this->tokens; } /** @return Stmt[]|null */ protected function doParse(): ?array { // We start off with no lookahead-token $symbol = self::SYMBOL_NONE; $tokenValue = null; $this->tokenPos = -1; // Keep stack of start and end attributes $this->tokenStartStack = []; $this->tokenEndStack = [0]; // Start off in the initial state and keep a stack of previous states $state = 0; $stateStack = [$state]; // Semantic value stack (contains values of tokens and semantic action results) $this->semStack = []; // Current position in the stack(s) $stackPos = 0; $this->errorState = 0; for (;;) { //$this->traceNewState($state, $symbol); if ($this->actionBase[$state] === 0) { $rule = $this->actionDefault[$state]; } else { if ($symbol === self::SYMBOL_NONE) { do { $token = $this->tokens[++$this->tokenPos]; $tokenId = $token->id; } while (isset($this->dropTokens[$tokenId])); // Map the lexer token id to the internally used symbols. $tokenValue = $token->text; if (!isset($this->phpTokenToSymbol[$tokenId])) { throw new \RangeException(sprintf( 'The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue )); } $symbol = $this->phpTokenToSymbol[$tokenId]; //$this->traceRead($symbol); } $idx = $this->actionBase[$state] + $symbol; if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) || ($state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)) && ($action = $this->action[$idx]) !== $this->defaultAction) { /* * >= numNonLeafStates: shift and reduce * > 0: shift * = 0: accept * < 0: reduce * = -YYUNEXPECTED: error */ if ($action > 0) { /* shift */ //$this->traceShift($symbol); ++$stackPos; $stateStack[$stackPos] = $state = $action; $this->semStack[$stackPos] = $tokenValue; $this->tokenStartStack[$stackPos] = $this->tokenPos; $this->tokenEndStack[$stackPos] = $this->tokenPos; $symbol = self::SYMBOL_NONE; if ($this->errorState) { --$this->errorState; } if ($action < $this->numNonLeafStates) { continue; } /* $yyn >= numNonLeafStates means shift-and-reduce */ $rule = $action - $this->numNonLeafStates; } else { $rule = -$action; } } else { $rule = $this->actionDefault[$state]; } } for (;;) { if ($rule === 0) { /* accept */ //$this->traceAccept(); return $this->semValue; } if ($rule !== $this->unexpectedTokenRule) { /* reduce */ //$this->traceReduce($rule); $ruleLength = $this->ruleToLength[$rule]; try { $callback = $this->reduceCallbacks[$rule]; if ($callback !== null) { $callback($this, $stackPos); } elseif ($ruleLength > 0) { $this->semValue = $this->semStack[$stackPos - $ruleLength + 1]; } } catch (Error $e) { if (-1 === $e->getStartLine()) { $e->setStartLine($this->tokens[$this->tokenPos]->line); } $this->emitError($e); // Can't recover from this type of error return null; } /* Goto - shift nonterminal */ $lastTokenEnd = $this->tokenEndStack[$stackPos]; $stackPos -= $ruleLength; $nonTerminal = $this->ruleToNonTerminal[$rule]; $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { $state = $this->goto[$idx]; } else { $state = $this->gotoDefault[$nonTerminal]; } ++$stackPos; $stateStack[$stackPos] = $state; $this->semStack[$stackPos] = $this->semValue; $this->tokenEndStack[$stackPos] = $lastTokenEnd; if ($ruleLength === 0) { // Empty productions use the start attributes of the lookahead token. $this->tokenStartStack[$stackPos] = $this->tokenPos; } } else { /* error */ switch ($this->errorState) { case 0: $msg = $this->getErrorMessage($symbol, $state); $this->emitError(new Error($msg, $this->getAttributesForToken($this->tokenPos))); // Break missing intentionally // no break case 1: case 2: $this->errorState = 3; // Pop until error-expecting state uncovered while (!( (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) || ($state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this if ($stackPos <= 0) { // Could not recover from error return null; } $state = $stateStack[--$stackPos]; //$this->tracePop($state); } //$this->traceShift($this->errorSymbol); ++$stackPos; $stateStack[$stackPos] = $state = $action; // We treat the error symbol as being empty, so we reset the end attributes // to the end attributes of the last non-error symbol $this->tokenStartStack[$stackPos] = $this->tokenPos; $this->tokenEndStack[$stackPos] = $this->tokenEndStack[$stackPos - 1]; break; case 3: if ($symbol === 0) { // Reached EOF without recovering from error return null; } //$this->traceDiscard($symbol); $symbol = self::SYMBOL_NONE; break 2; } } if ($state < $this->numNonLeafStates) { break; } /* >= numNonLeafStates means shift-and-reduce */ $rule = $state - $this->numNonLeafStates; } } } protected function emitError(Error $error): void { $this->errorHandler->handleError($error); } /** * Format error message including expected tokens. * * @param int $symbol Unexpected symbol * @param int $state State at time of error * * @return string Formatted error message */ protected function getErrorMessage(int $symbol, int $state): string { $expectedString = ''; if ($expected = $this->getExpectedTokens($state)) { $expectedString = ', expecting ' . implode(' or ', $expected); } return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; } /** * Get limited number of expected tokens in given state. * * @param int $state State * * @return string[] Expected tokens. If too many, an empty array is returned. */ protected function getExpectedTokens(int $state): array { $expected = []; $base = $this->actionBase[$state]; foreach ($this->symbolToName as $symbol => $name) { $idx = $base + $symbol; if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol ) { if ($this->action[$idx] !== $this->unexpectedTokenRule && $this->action[$idx] !== $this->defaultAction && $symbol !== $this->errorSymbol ) { if (count($expected) === 4) { /* Too many expected tokens */ return []; } $expected[] = $name; } } } return $expected; } /** * Get attributes for a node with the given start and end token positions. * * @param int $tokenStartPos Token position the node starts at * @param int $tokenEndPos Token position the node ends at * @return array Attributes */ protected function getAttributes(int $tokenStartPos, int $tokenEndPos): array { $startToken = $this->tokens[$tokenStartPos]; $afterEndToken = $this->tokens[$tokenEndPos + 1]; return [ 'startLine' => $startToken->line, 'startTokenPos' => $tokenStartPos, 'startFilePos' => $startToken->pos, 'endLine' => $afterEndToken->line, 'endTokenPos' => $tokenEndPos, 'endFilePos' => $afterEndToken->pos - 1, ]; } /** * Get attributes for a single token at the given token position. * * @return array Attributes */ protected function getAttributesForToken(int $tokenPos): array { if ($tokenPos < \count($this->tokens) - 1) { return $this->getAttributes($tokenPos, $tokenPos); } // Get attributes for the sentinel token. $token = $this->tokens[$tokenPos]; return [ 'startLine' => $token->line, 'startTokenPos' => $tokenPos, 'startFilePos' => $token->pos, 'endLine' => $token->line, 'endTokenPos' => $tokenPos, 'endFilePos' => $token->pos, ]; } /* * Tracing functions used for debugging the parser. */ /* protected function traceNewState($state, $symbol): void { echo '% State ' . $state . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; } protected function traceRead($symbol): void { echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; } protected function traceShift($symbol): void { echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; } protected function traceAccept(): void { echo "% Accepted.\n"; } protected function traceReduce($n): void { echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; } protected function tracePop($state): void { echo '% Recovering, uncovered state ' . $state . "\n"; } protected function traceDiscard($symbol): void { echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; } */ /* * Helper functions invoked by semantic actions */ /** * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. * * @param Node\Stmt[] $stmts * @return Node\Stmt[] */ protected function handleNamespaces(array $stmts): array { $hasErrored = false; $style = $this->getNamespacingStyle($stmts); if (null === $style) { // not namespaced, nothing to do return $stmts; } if ('brace' === $style) { // For braced namespaces we only have to check that there are no invalid statements between the namespaces $afterFirstNamespace = false; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { $afterFirstNamespace = true; } elseif (!$stmt instanceof Node\Stmt\HaltCompiler && !$stmt instanceof Node\Stmt\Nop && $afterFirstNamespace && !$hasErrored) { $this->emitError(new Error( 'No code may exist outside of namespace {}', $stmt->getAttributes())); $hasErrored = true; // Avoid one error for every statement } } return $stmts; } else { // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts $resultStmts = []; $targetStmts = &$resultStmts; $lastNs = null; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { if ($lastNs !== null) { $this->fixupNamespaceAttributes($lastNs); } if ($stmt->stmts === null) { $stmt->stmts = []; $targetStmts = &$stmt->stmts; $resultStmts[] = $stmt; } else { // This handles the invalid case of mixed style namespaces $resultStmts[] = $stmt; $targetStmts = &$resultStmts; } $lastNs = $stmt; } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { // __halt_compiler() is not moved into the namespace $resultStmts[] = $stmt; } else { $targetStmts[] = $stmt; } } if ($lastNs !== null) { $this->fixupNamespaceAttributes($lastNs); } return $resultStmts; } } private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt): void { // We moved the statements into the namespace node, as such the end of the namespace node // needs to be extended to the end of the statements. if (empty($stmt->stmts)) { return; } // We only move the builtin end attributes here. This is the best we can do with the // knowledge we have. $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; $lastStmt = $stmt->stmts[count($stmt->stmts) - 1]; foreach ($endAttributes as $endAttribute) { if ($lastStmt->hasAttribute($endAttribute)) { $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); } } } /** @return array */ private function getNamespaceErrorAttributes(Namespace_ $node): array { $attrs = $node->getAttributes(); // Adjust end attributes to only cover the "namespace" keyword, not the whole namespace. if (isset($attrs['startLine'])) { $attrs['endLine'] = $attrs['startLine']; } if (isset($attrs['startTokenPos'])) { $attrs['endTokenPos'] = $attrs['startTokenPos']; } if (isset($attrs['startFilePos'])) { $attrs['endFilePos'] = $attrs['startFilePos'] + \strlen('namespace') - 1; } return $attrs; } /** * Determine namespacing style (semicolon or brace) * * @param Node[] $stmts Top-level statements. * * @return null|string One of "semicolon", "brace" or null (no namespaces) */ private function getNamespacingStyle(array $stmts): ?string { $style = null; $hasNotAllowedStmts = false; foreach ($stmts as $i => $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; if (null === $style) { $style = $currentStyle; if ($hasNotAllowedStmts) { $this->emitError(new Error( 'Namespace declaration statement has to be the very first statement in the script', $this->getNamespaceErrorAttributes($stmt) )); } } elseif ($style !== $currentStyle) { $this->emitError(new Error( 'Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $this->getNamespaceErrorAttributes($stmt) )); // Treat like semicolon style for namespace normalization return 'semicolon'; } continue; } /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ if ($stmt instanceof Node\Stmt\Declare_ || $stmt instanceof Node\Stmt\HaltCompiler || $stmt instanceof Node\Stmt\Nop) { continue; } /* There may be a hashbang line at the very start of the file */ if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && preg_match('/\A#!.*\r?\n\z/', $stmt->value)) { continue; } /* Everything else if forbidden before namespace declarations */ $hasNotAllowedStmts = true; } return $style; } /** @return Name|Identifier */ protected function handleBuiltinTypes(Name $name) { if (!$name->isUnqualified()) { return $name; } $lowerName = $name->toLowerString(); if (!$this->phpVersion->supportsBuiltinType($lowerName)) { return $name; } return new Node\Identifier($lowerName, $name->getAttributes()); } /** * Get combined start and end attributes at a stack location * * @param int $stackPos Stack location * * @return array Combined start and end attributes */ protected function getAttributesAt(int $stackPos): array { return $this->getAttributes($this->tokenStartStack[$stackPos], $this->tokenEndStack[$stackPos]); } protected function getFloatCastKind(string $cast): int { $cast = strtolower($cast); if (strpos($cast, 'float') !== false) { return Double::KIND_FLOAT; } if (strpos($cast, 'real') !== false) { return Double::KIND_REAL; } return Double::KIND_DOUBLE; } protected function getIntCastKind(string $cast): int { $cast = strtolower($cast); if (strpos($cast, 'integer') !== false) { return Expr\Cast\Int_::KIND_INTEGER; } return Expr\Cast\Int_::KIND_INT; } protected function getBoolCastKind(string $cast): int { $cast = strtolower($cast); if (strpos($cast, 'boolean') !== false) { return Expr\Cast\Bool_::KIND_BOOLEAN; } return Expr\Cast\Bool_::KIND_BOOL; } protected function getStringCastKind(string $cast): int { $cast = strtolower($cast); if (strpos($cast, 'binary') !== false) { return Expr\Cast\String_::KIND_BINARY; } return Expr\Cast\String_::KIND_STRING; } /** @param array $attributes */ protected function parseLNumber(string $str, array $attributes, bool $allowInvalidOctal = false): Int_ { try { return Int_::fromString($str, $attributes, $allowInvalidOctal); } catch (Error $error) { $this->emitError($error); // Use dummy value return new Int_(0, $attributes); } } /** * Parse a T_NUM_STRING token into either an integer or string node. * * @param string $str Number string * @param array $attributes Attributes * * @return Int_|String_ Integer or string node. */ protected function parseNumString(string $str, array $attributes) { if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { return new String_($str, $attributes); } $num = +$str; if (!is_int($num)) { return new String_($str, $attributes); } return new Int_($num, $attributes); } /** @param array $attributes */ protected function stripIndentation( string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes ): string { if ($indentLen === 0) { return $string; } $start = $newlineAtStart ? '(?:(?<=\n)|\A)' : '(?<=\n)'; $end = $newlineAtEnd ? '(?:(?=[\r\n])|\z)' : '(?=[\r\n])'; $regex = '/' . $start . '([ \t]*)(' . $end . ')?/'; return preg_replace_callback( $regex, function ($matches) use ($indentLen, $indentChar, $attributes) { $prefix = substr($matches[1], 0, $indentLen); if (false !== strpos($prefix, $indentChar === " " ? "\t" : " ")) { $this->emitError(new Error( 'Invalid indentation - tabs and spaces cannot be mixed', $attributes )); } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) { $this->emitError(new Error( 'Invalid body indentation level ' . '(expecting an indentation level of at least ' . $indentLen . ')', $attributes )); } return substr($matches[0], strlen($prefix)); }, $string ); } /** * @param string|(Expr|InterpolatedStringPart)[] $contents * @param array $attributes * @param array $endTokenAttributes */ protected function parseDocString( string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape ): Expr { $kind = strpos($startToken, "'") === false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; $regex = '/\A[bB]?<<<[ \t]*[\'"]?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\'"]?(?:\r\n|\n|\r)\z/'; $result = preg_match($regex, $startToken, $matches); assert($result === 1); $label = $matches[1]; $result = preg_match('/\A[ \t]*/', $endToken, $matches); assert($result === 1); $indentation = $matches[0]; $attributes['kind'] = $kind; $attributes['docLabel'] = $label; $attributes['docIndentation'] = $indentation; $indentHasSpaces = false !== strpos($indentation, " "); $indentHasTabs = false !== strpos($indentation, "\t"); if ($indentHasSpaces && $indentHasTabs) { $this->emitError(new Error( 'Invalid indentation - tabs and spaces cannot be mixed', $endTokenAttributes )); // Proceed processing as if this doc string is not indented $indentation = ''; } $indentLen = \strlen($indentation); $indentChar = $indentHasSpaces ? " " : "\t"; if (\is_string($contents)) { if ($contents === '') { $attributes['rawValue'] = $contents; return new String_('', $attributes); } $contents = $this->stripIndentation( $contents, $indentLen, $indentChar, true, true, $attributes ); $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents); $attributes['rawValue'] = $contents; if ($kind === String_::KIND_HEREDOC) { $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); } return new String_($contents, $attributes); } else { assert(count($contents) > 0); if (!$contents[0] instanceof Node\InterpolatedStringPart) { // If there is no leading encapsed string part, pretend there is an empty one $this->stripIndentation( '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes() ); } $newContents = []; foreach ($contents as $i => $part) { if ($part instanceof Node\InterpolatedStringPart) { $isLast = $i === \count($contents) - 1; $part->value = $this->stripIndentation( $part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes() ); if ($isLast) { $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value); } $part->setAttribute('rawValue', $part->value); $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ('' === $part->value) { continue; } } $newContents[] = $part; } return new InterpolatedString($newContents, $attributes); } } protected function createCommentFromToken(Token $token, int $tokenPos): Comment { assert($token->id === \T_COMMENT || $token->id == \T_DOC_COMMENT); return \T_DOC_COMMENT === $token->id ? new Comment\Doc($token->text, $token->line, $token->pos, $tokenPos, $token->getEndLine(), $token->getEndPos() - 1, $tokenPos) : new Comment($token->text, $token->line, $token->pos, $tokenPos, $token->getEndLine(), $token->getEndPos() - 1, $tokenPos); } /** * Get last comment before the given token position, if any */ protected function getCommentBeforeToken(int $tokenPos): ?Comment { while (--$tokenPos >= 0) { $token = $this->tokens[$tokenPos]; if (!isset($this->dropTokens[$token->id])) { break; } if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) { return $this->createCommentFromToken($token, $tokenPos); } } return null; } /** * Create a zero-length nop to capture preceding comments, if any. */ protected function maybeCreateZeroLengthNop(int $tokenPos): ?Nop { $comment = $this->getCommentBeforeToken($tokenPos); if ($comment === null) { return null; } $commentEndLine = $comment->getEndLine(); $commentEndFilePos = $comment->getEndFilePos(); $commentEndTokenPos = $comment->getEndTokenPos(); $attributes = [ 'startLine' => $commentEndLine, 'endLine' => $commentEndLine, 'startFilePos' => $commentEndFilePos + 1, 'endFilePos' => $commentEndFilePos, 'startTokenPos' => $commentEndTokenPos + 1, 'endTokenPos' => $commentEndTokenPos, ]; return new Nop($attributes); } protected function maybeCreateNop(int $tokenStartPos, int $tokenEndPos): ?Nop { if ($this->getCommentBeforeToken($tokenStartPos) === null) { return null; } return new Nop($this->getAttributes($tokenStartPos, $tokenEndPos)); } protected function handleHaltCompiler(): string { // Prevent the lexer from returning any further tokens. $nextToken = $this->tokens[$this->tokenPos + 1]; $this->tokenPos = \count($this->tokens) - 2; // Return text after __halt_compiler. return $nextToken->id === \T_INLINE_HTML ? $nextToken->text : ''; } protected function inlineHtmlHasLeadingNewline(int $stackPos): bool { $tokenPos = $this->tokenStartStack[$stackPos]; $token = $this->tokens[$tokenPos]; assert($token->id == \T_INLINE_HTML); if ($tokenPos > 0) { $prevToken = $this->tokens[$tokenPos - 1]; assert($prevToken->id == \T_CLOSE_TAG); return false !== strpos($prevToken->text, "\n") || false !== strpos($prevToken->text, "\r"); } return true; } /** * @return array */ protected function createEmptyElemAttributes(int $tokenPos): array { return $this->getAttributesForToken($tokenPos); } protected function fixupArrayDestructuring(Array_ $node): Expr\List_ { $this->createdArrays->offsetUnset($node); return new Expr\List_(array_map(function (Node\ArrayItem $item) { if ($item->value instanceof Expr\Error) { // We used Error as a placeholder for empty elements, which are legal for destructuring. return null; } if ($item->value instanceof Array_) { return new Node\ArrayItem( $this->fixupArrayDestructuring($item->value), $item->key, $item->byRef, $item->getAttributes()); } return $item; }, $node->items), ['kind' => Expr\List_::KIND_ARRAY] + $node->getAttributes()); } protected function postprocessList(Expr\List_ $node): void { foreach ($node->items as $i => $item) { if ($item->value instanceof Expr\Error) { // We used Error as a placeholder for empty elements, which are legal for destructuring. $node->items[$i] = null; } } } /** @param ElseIf_|Else_ $node */ protected function fixupAlternativeElse($node): void { // Make sure a trailing nop statement carrying comments is part of the node. $numStmts = \count($node->stmts); if ($numStmts !== 0 && $node->stmts[$numStmts - 1] instanceof Nop) { $nopAttrs = $node->stmts[$numStmts - 1]->getAttributes(); if (isset($nopAttrs['endLine'])) { $node->setAttribute('endLine', $nopAttrs['endLine']); } if (isset($nopAttrs['endFilePos'])) { $node->setAttribute('endFilePos', $nopAttrs['endFilePos']); } if (isset($nopAttrs['endTokenPos'])) { $node->setAttribute('endTokenPos', $nopAttrs['endTokenPos']); } } } protected function checkClassModifier(int $a, int $b, int $modifierPos): void { try { Modifiers::verifyClassModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } protected function checkModifier(int $a, int $b, int $modifierPos): void { // Jumping through some hoops here because verifyModifier() is also used elsewhere try { Modifiers::verifyModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } protected function checkParam(Param $node): void { if ($node->variadic && null !== $node->default) { $this->emitError(new Error( 'Variadic parameter cannot have a default value', $node->default->getAttributes() )); } } protected function checkTryCatch(TryCatch $node): void { if (empty($node->catches) && null === $node->finally) { $this->emitError(new Error( 'Cannot use try without catch or finally', $node->getAttributes() )); } } protected function checkNamespace(Namespace_ $node): void { if (null !== $node->stmts) { foreach ($node->stmts as $stmt) { if ($stmt instanceof Namespace_) { $this->emitError(new Error( 'Namespace declarations cannot be nested', $stmt->getAttributes() )); } } } } private function checkClassName(?Identifier $name, int $namePos): void { if (null !== $name && $name->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as class name as it is reserved', $name), $this->getAttributesAt($namePos) )); } } /** @param Name[] $interfaces */ private function checkImplementedInterfaces(array $interfaces): void { foreach ($interfaces as $interface) { if ($interface->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes() )); } } } protected function checkClass(Class_ $node, int $namePos): void { $this->checkClassName($node->name, $namePos); if ($node->extends && $node->extends->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), $node->extends->getAttributes() )); } $this->checkImplementedInterfaces($node->implements); } protected function checkInterface(Interface_ $node, int $namePos): void { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->extends); } protected function checkEnum(Enum_ $node, int $namePos): void { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->implements); } protected function checkClassMethod(ClassMethod $node, int $modifierPos): void { if ($node->flags & Modifiers::STATIC) { switch ($node->name->toLowerString()) { case '__construct': $this->emitError(new Error( sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; case '__destruct': $this->emitError(new Error( sprintf('Destructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; case '__clone': $this->emitError(new Error( sprintf('Clone method %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; } } if ($node->flags & Modifiers::READONLY) { $this->emitError(new Error( sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); } } protected function checkClassConst(ClassConst $node, int $modifierPos): void { foreach ([Modifiers::STATIC, Modifiers::ABSTRACT, Modifiers::READONLY] as $modifier) { if ($node->flags & $modifier) { $this->emitError(new Error( "Cannot use '" . Modifiers::toString($modifier) . "' as constant modifier", $this->getAttributesAt($modifierPos))); } } } protected function checkUseUse(UseItem $node, int $namePos): void { if ($node->alias && $node->alias->isSpecialClassName()) { $this->emitError(new Error( sprintf( 'Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias ), $this->getAttributesAt($namePos) )); } } protected function checkPropertyHooksForMultiProperty(Property $property, int $hookPos): void { if (count($property->props) > 1) { $this->emitError(new Error( 'Cannot use hooks when declaring multiple properties', $this->getAttributesAt($hookPos))); } } /** @param PropertyHook[] $hooks */ protected function checkEmptyPropertyHookList(array $hooks, int $hookPos): void { if (empty($hooks)) { $this->emitError(new Error( 'Property hook list cannot be empty', $this->getAttributesAt($hookPos))); } } protected function checkPropertyHook(PropertyHook $hook, ?int $paramListPos): void { $name = $hook->name->toLowerString(); if ($name !== 'get' && $name !== 'set') { $this->emitError(new Error( 'Unknown hook "' . $hook->name . '", expected "get" or "set"', $hook->name->getAttributes())); } if ($name === 'get' && $paramListPos !== null) { $this->emitError(new Error( 'get hook must not have a parameter list', $this->getAttributesAt($paramListPos))); } } protected function checkPropertyHookModifiers(int $a, int $b, int $modifierPos): void { try { Modifiers::verifyModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } if ($b != Modifiers::FINAL) { $this->emitError(new Error( 'Cannot use the ' . Modifiers::toString($b) . ' modifier on a property hook', $this->getAttributesAt($modifierPos))); } } protected function checkConstantAttributes(Const_ $node): void { if ($node->attrGroups !== [] && count($node->consts) > 1) { $this->emitError(new Error( 'Cannot use attributes on multiple constants at once', $node->getAttributes())); } } protected function checkPipeOperatorParentheses(Expr $node): void { if ($node instanceof Expr\ArrowFunction && !$this->parenthesizedArrowFunctions->offsetExists($node)) { $this->emitError(new Error( 'Arrow functions on the right hand side of |> must be parenthesized', $node->getAttributes())); } } /** * @param Property|Param $node */ protected function addPropertyNameToHooks(Node $node): void { if ($node instanceof Property) { $name = $node->props[0]->name->toString(); } else { $name = $node->var->name; } foreach ($node->hooks as $hook) { $hook->setAttribute('propertyName', $name); } } /** @param array $args */ private function isSimpleExit(array $args): bool { if (\count($args) === 0) { return true; } if (\count($args) === 1) { $arg = $args[0]; return $arg instanceof Arg && $arg->name === null && $arg->byRef === false && $arg->unpack === false; } return false; } /** * @param array $args * @param array $attrs */ protected function createExitExpr(string $name, int $namePos, array $args, array $attrs): Expr { if ($this->isSimpleExit($args)) { // Create Exit node for backwards compatibility. $attrs['kind'] = strtolower($name) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; return new Expr\Exit_(\count($args) === 1 ? $args[0]->value : null, $attrs); } return new Expr\FuncCall(new Name($name, $this->getAttributesAt($namePos)), $args, $attrs); } /** * Creates the token map. * * The token map maps the PHP internal token identifiers * to the identifiers used by the Parser. Additionally it * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. * * @return array The token map */ protected function createTokenMap(): array { $tokenMap = []; // Single-char tokens use an identity mapping. for ($i = 0; $i < 256; ++$i) { $tokenMap[$i] = $i; } foreach ($this->symbolToName as $name) { if ($name[0] === 'T') { $tokenMap[\constant($name)] = constant(static::class . '::' . $name); } } // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO $tokenMap[\T_OPEN_TAG_WITH_ECHO] = static::T_ECHO; // T_CLOSE_TAG is equivalent to ';' $tokenMap[\T_CLOSE_TAG] = ord(';'); // We have created a map from PHP token IDs to external symbol IDs. // Now map them to the internal symbol ID. $fullTokenMap = []; foreach ($tokenMap as $phpToken => $extSymbol) { $intSymbol = $this->tokenToSymbol[$extSymbol]; if ($intSymbol === $this->invalidSymbol) { continue; } $fullTokenMap[$phpToken] = $intSymbol; } return $fullTokenMap; } } Visitors */ protected array $visitors = []; /** @var bool Whether traversal should be stopped */ protected bool $stopTraversal; /** * Create a traverser with the given visitors. * * @param NodeVisitor ...$visitors Node visitors */ public function __construct(NodeVisitor ...$visitors) { $this->visitors = $visitors; } /** * Adds a visitor. * * @param NodeVisitor $visitor Visitor to add */ public function addVisitor(NodeVisitor $visitor): void { $this->visitors[] = $visitor; } /** * Removes an added visitor. */ public function removeVisitor(NodeVisitor $visitor): void { $index = array_search($visitor, $this->visitors); if ($index !== false) { array_splice($this->visitors, $index, 1, []); } } /** * Traverses an array of nodes using the registered visitors. * * @param Node[] $nodes Array of nodes * * @return Node[] Traversed array of nodes */ public function traverse(array $nodes): array { $this->stopTraversal = false; foreach ($this->visitors as $visitor) { if (null !== $return = $visitor->beforeTraverse($nodes)) { $nodes = $return; } } $nodes = $this->traverseArray($nodes); for ($i = \count($this->visitors) - 1; $i >= 0; --$i) { $visitor = $this->visitors[$i]; if (null !== $return = $visitor->afterTraverse($nodes)) { $nodes = $return; } } return $nodes; } /** * Recursively traverse a node. * * @param Node $node Node to traverse. */ protected function traverseNode(Node $node): void { foreach ($node->getSubNodeNames() as $name) { $subNode = $node->$name; if (\is_array($subNode)) { $node->$name = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } continue; } if (!$subNode instanceof Node) { continue; } $traverseChildren = true; $visitorIndex = -1; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $node->$name = $return; } elseif (NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; } elseif (NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = false; break; } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { $node->$name = null; continue 2; } else { throw new \LogicException( 'enterNode() returned invalid value of type ' . gettype($return) ); } } } if ($traverseChildren) { $this->traverseNode($subNode); if ($this->stopTraversal) { break; } } for (; $visitorIndex >= 0; --$visitorIndex) { $visitor = $this->visitors[$visitorIndex]; $return = $visitor->leaveNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $node->$name = $return; } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { $node->$name = null; break; } elseif (\is_array($return)) { throw new \LogicException( 'leaveNode() may only return an array ' . 'if the parent structure is an array' ); } else { throw new \LogicException( 'leaveNode() returned invalid value of type ' . gettype($return) ); } } } } } /** * Recursively traverse array (usually of nodes). * * @param Node[] $nodes Array to traverse * * @return Node[] Result of traversal (may be original array or changed one) */ protected function traverseArray(array $nodes): array { $doNodes = []; foreach ($nodes as $i => $node) { if (!$node instanceof Node) { if (\is_array($node)) { throw new \LogicException('Invalid node structure: Contains nested arrays'); } continue; } $traverseChildren = true; $visitorIndex = -1; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $nodes[$i] = $node = $return; } elseif (\is_array($return)) { $doNodes[] = [$i, $return]; continue 2; } elseif (NodeVisitor::REMOVE_NODE === $return) { $doNodes[] = [$i, []]; continue 2; } elseif (NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; } elseif (NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = false; break; } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { throw new \LogicException( 'REPLACE_WITH_NULL can not be used if the parent structure is an array'); } else { throw new \LogicException( 'enterNode() returned invalid value of type ' . gettype($return) ); } } } if ($traverseChildren) { $this->traverseNode($node); if ($this->stopTraversal) { break; } } for (; $visitorIndex >= 0; --$visitorIndex) { $visitor = $this->visitors[$visitorIndex]; $return = $visitor->leaveNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $nodes[$i] = $node = $return; } elseif (\is_array($return)) { $doNodes[] = [$i, $return]; break; } elseif (NodeVisitor::REMOVE_NODE === $return) { $doNodes[] = [$i, []]; break; } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { throw new \LogicException( 'REPLACE_WITH_NULL can not be used if the parent structure is an array'); } else { throw new \LogicException( 'leaveNode() returned invalid value of type ' . gettype($return) ); } } } } if (!empty($doNodes)) { while (list($i, $replace) = array_pop($doNodes)) { array_splice($nodes, $i, 1, $replace); } } return $nodes; } private function ensureReplacementReasonable(Node $old, Node $new): void { if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { throw new \LogicException( "Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?" ); } if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { throw new \LogicException( "Trying to replace expression ({$old->getType()}) " . "with statement ({$new->getType()})" ); } } } '", "T_IS_GREATER_OR_EQUAL", "T_PIPE", "'.'", "T_SL", "T_SR", "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_PUBLIC_SET", "T_PROTECTED_SET", "T_PRIVATE_SET", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_PROPERTY_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'('", "')'", "'{'", "'}'", "'`'", "'\"'", "'$'" ); protected array $tokenToSymbol = array( 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 58, 172, 174, 173, 57, 174, 174, 167, 168, 55, 53, 9, 54, 50, 56, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 32, 165, 45, 17, 47, 31, 70, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 72, 174, 166, 37, 174, 171, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 169, 36, 170, 60, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 46, 48, 49, 51, 52, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 ); protected array $action = array( 132, 133, 134, 582, 135, 136, 162, 779, 780, 781, 137, 41, 863,-32766, 970, 1404, -584, 974, 973, 1302, 0, 395, 396, 455, 246, 854,-32766,-32766,-32766,-32766, -32766, 440,-32766, 27,-32766, 773, 772,-32766,-32766,-32766, -32766, 508,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766, 131,-32766,-32766,-32766,-32766, 437, 782, 859, 1148,-32766, 949,-32766,-32766,-32766,-32766,-32766,-32766, 972, 1385, 300, 271, 53, 398, 786, 787, 788, 789, 305, 865, 441, -341, 39, 254, -584, -584, -195, 843, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 819, 583, 820, 821, 822, 823, 811, 812, 353, 354, 814, 815, 800, 801, 802, 804, 805, 806, 368, 846, 847, 848, 849, 850, 584, 1062, -194, 856, 807, 808, 585, 586, 3, 831, 829, 830, 842, 826, 827, 4, 860, 587, 588, 825, 589, 590, 591, 592, 939, 593, 594, 5, 854, -32766,-32766,-32766, 828, 595, 596,-32766, 138, 764, 132, 133, 134, 582, 135, 136, 1098, 779, 780, 781, 137, 41,-32766,-32766,-32766,-32766,-32766,-32766, -275, 1302, 613, 153, 1071, 749, 990, 991,-32766,-32766,-32766, 992,-32766, 891,-32766, 892,-32766, 773, 772,-32766, 986, 1309, 397, 396,-32766,-32766,-32766, 858, 299, 630,-32766,-32766, 440, 502, 736,-32766,-32766, 437, 782,-32767,-32767,-32767,-32767, 106, 107, 108, 109, 951,-32766, 1021, 29, 734, 271, 53, 398, 786, 787, 788, 789, 144, 1071, 441, -341, 332, 38, 864, 862, -195, 843, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 819, 583, 820, 821, 822, 823, 811, 812, 353, 354, 814, 815, 800, 801, 802, 804, 805, 806, 368, 846, 847, 848, 849, 850, 584, 863, -194, 139, 807, 808, 585, 586, 323, 831, 829, 830, 842, 826, 827, 1370, 148, 587, 588, 825, 589, 590, 591, 592, 245, 593, 594, 395, 396,-32766, -32766,-32766, 828, 595, 596, -85, 138, 440, 132, 133, 134, 582, 135, 136, 1095, 779, 780, 781, 137, 41, -32766,-32766,-32766,-32766,-32766, 51, 578, 1302, 257,-32766, 636, 107, 108, 109,-32766,-32766,-32766, 503,-32766, 316, -32766,-32766,-32766, 773, 772,-32766, -383, 166, -383, 1022, -32766,-32766,-32766, 305, 79, 1133,-32766,-32766, 1414, 762, 332, 1415,-32766, 437, 782,-32766, 1071, 110, 111, 112, 113, 114, -85, 283,-32766, 477, 478, 479, 271, 53, 398, 786, 787, 788, 789, 115, 407, 441, 10,-32766, 299, 1341, 306, 307, 843, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 819, 583, 820, 821, 822, 823, 811, 812, 353, 354, 814, 815, 800, 801, 802, 804, 805, 806, 368, 846, 847, 848, 849, 850, 584, 320, 1068, -582, 807, 808, 585, 586, 1389, 831, 829, 830, 842, 826, 827, 329, 1388, 587, 588, 825, 589, 590, 591, 592, 86, 593, 594, 1071, 332,-32766,-32766, -32766, 828, 595, 596, 349, 151, -581, 132, 133, 134, 582, 135, 136, 1100, 779, 780, 781, 137, 41,-32766, 290,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767, -32767,-32767,-32767,-32766,-32766,-32766, 891, 1175, 892, -582, -582, 754, 773, 772, 1159, 1160, 1161, 1155, 1154, 1153, 1162, 1156, 1157, 1158,-32766, -582,-32766,-32766,-32766,-32766, -32766,-32766,-32766, 782,-32766,-32766,-32766, -588, -78,-32766, -32766,-32766, 350, -581, -581,-32766,-32766, 271, 53, 398, 786, 787, 788, 789, 383,-32766, 441,-32766,-32766, -581, -32766, 773, 772, 843, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 819, 583, 820, 821, 822, 823, 811, 812, 353, 354, 814, 815, 800, 801, 802, 804, 805, 806, 368, 846, 847, 848, 849, 850, 584, -620, 1068, -620, 807, 808, 585, 586, 389, 831, 829, 830, 842, 826, 827, 441, 405, 587, 588, 825, 589, 590, 591, 592, 333, 593, 594, 1071, 87, 88, 89, 459, 828, 595, 596, 460, 151, 803, 774, 775, 776, 777, 778, 854, 779, 780, 781, 816, 817, 40, 461, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 462, 283, 1329, 1159, 1160, 1161, 1155, 1154, 1153, 1162, 1156, 1157, 1158, 115, 869, 488, 489, 782, 1304, 1303, 1305, 108, 109, 1132, 154,-32766, -32766, 1134, 679, 23, 156, 783, 784, 785, 786, 787, 788, 789, 698, 699, 852, 152, 423, -580, 393, 394, 157, 843, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 819, 841, 820, 821, 822, 823, 811, 812, 813, 840, 814, 815, 800, 801, 802, 804, 805, 806, 845, 846, 847, 848, 849, 850, 851, 1094, -578, 863, 807, 808, 809, 810, -58, 831, 829, 830, 842, 826, 827, 399, 400, 818, 824, 825, 832, 833, 835, 834, 294, 836, 837, 158, -580, -580, 160, 294, 828, 839, 838, 54, 55, 56, 57, 534, 58, 59, 36, -110, -580, -57, 60, 61, -110, 62, -110, 670, 671, 129, 130, 312, -587, 140, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -578, -578, 141, 147, 949, 161, 712, -87, 163, 164, 165, -84, 949, -78, -73, -72, -578, 63, 64, 143, -309, -71, 65, 332, 66, 251, 252, 67, 68, 69, 70, 71, 72, 73, 74, 739, 31, 276, 47, 457, 535, -357, 713, 740, 1335, 1336, 536, -70, 863, 1068, -69, -68, 1333, 45, 22, 537, 949, 538, -67, 539, -66, 540, 52, -65, 541, 542, 714, 715, -46, 48, 49, 463, 392, 391, 1071, 50, 543, -18, 145, 281, 1302, 381, 348, 291, 750, 1304, 1303, 1305, 1295, 939, 753, 290, 948, 545, 546, 547, 150, 939, 290, -305, 295, 288, 289, 292, 293, 549, 550, 338, 1321, 1322, 1323, 1324, 1326, 1318, 1319, 304, 1300, 296, 301, 302, 283, 1325, 1320, 773, 772, 1304, 1303, 1305, 305, 308, 309, 75, -154, -154, -154, 327, 328, 332, 966, 854, 1070, 939, 149, 115, 1416, 388, 680, -154, 708, -154, 725, -154, 13, -154, 668, 723, 313, 31, 277, 1304, 1303, 1305, 863, 390,-32766, 600, 1166, 987, 951, 863, 310, 701, 734, 1333, 990, 991, 951,-32766, 686, 544, 734, 949, 685, 606, 1340, 485, 513, 925, 986, -110, -110, -110, 35, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 702, 949, 634, 1295, 773, 772, 741, -579, 305, -614, 1334, 0, 0, 0, 951, 311, 949, 0, 734, -154, 549, 550, 319, 1321, 1322, 1323, 1324, 1326, 1318, 1319, 1209, 1211, 744, 0, 1342, 0, 1325, 1320, -544, -534, 0, -578,-32766, -4, 949, 11, 77, 751, 1302, 30, 387, 328, 332, 862, 43,-32766,-32766,-32766, -613, -32766, 939,-32766, 968,-32766, 44, 759,-32766, 1330, 773, 772, 760,-32766,-32766,-32766, -579, -579, 882,-32766,-32766, 930, 1031, 1008, 1015,-32766, 437, 1005, 939, 1016, 928, 1003, -579, 1137, 1140, 1141, 1138,-32766, 1177, 1139, 1145, 37, 874, 939, -586, 1357, 1374, 1407,-32766, 673, -578, -578, -612, -588, 1302, -587, -586, -585, 31, 276, -528, -32766,-32766,-32766, 1,-32766, -578,-32766, 78,-32766, 863, 939,-32766, 32, 1333, -278, 33,-32766,-32766,-32766, 42, 1007, 46,-32766,-32766, 734, 76, 80, 81,-32766, 437, 82, 83, 390, 84, 453, 31, 277, 85, 146, 303, -32766, 155, 159, 990, 991, 249, 951, 863, 544, 1295, 734, 1333, 334, 369, 370, 371, 548, 986, -110, -110, -110, 951, 372, 326, 373, 734, 374, 550, 375, 1321, 1322, 1323, 1324, 1326, 1318, 1319, 376, 377, 422, 378, 21, -50, 1325, 1320, 379, 382, 454, 1295, 577, 951, 380, 384, 77, 734, -4, -276, -275, 328, 332, 15, 16, 17, 18, 20, 363, 550, 421, 1321, 1322, 1323, 1324, 1326, 1318, 1319, 142, 504, 505, 512, 515, 516, 1325, 1320, 949, 517, 518,-32766, 522, 523, 524, 531, 77, 1302, 611, 718, 1101, 328, 332, 1097,-32766,-32766, -32766, 1250,-32766, 1331,-32766, 949,-32766, 1099, 1096,-32766, 1077, 1290, 1309, 1073,-32766,-32766,-32766, -280,-32766, -102, -32766,-32766, 14, 19, 1302, 24,-32766, 437, 323, 420, 625,-32766,-32766,-32766, 631,-32766, 659,-32766,-32766,-32766, 724, 1254,-32766, -16, 1308, 1251, 1386,-32766,-32766,-32766, 735,-32766, 738,-32766,-32766, 742, 743, 1302, 745,-32766, 437, 746, 747, 748,-32766,-32766,-32766, 939,-32766, 300, -32766,-32766,-32766, 752, 1309,-32766, 764, 737, 332, 765, -32766,-32766,-32766, -253, -253, -253,-32766,-32766, 426, 390, 939, 756,-32766, 437, 926, 863, 1411, 1413, 885, 884, 990, 991, 980, 1023,-32766, 544, -252, -252, -252, 1412, 979, 977, 390, 925, 986, -110, -110, -110, 978, 981, 1283, 959, 969, 990, 991, 957, 1176, 1172, 544, 1126, -110, -110, 1013, 1014, 657, -110, 925, 986, -110, -110, -110, 1410, 2, 1368, -110, 1268, 951, 1383, 0, 0, 734, -253, 0,-32766, 0, 0,-32766, 863, 1059, 1054, 1053, 1052, 1058, 1055, 1056, 1057, 0, 0, 0, 951, 0, 0, 0, 734, -252, 305, 0, 0, 79, 0, 0, 1071, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, -110, -110, 0, 0, 0, -110, 0, 0, 0, 0, 0, 0, 0, 299, -110, 0, 0, 0, 0, 0, 0, 0, 0,-32766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 0, 0, 79, 0, 0, 0, 0, 0, 332 ); protected array $actionCheck = array( 3, 4, 5, 6, 7, 8, 17, 10, 11, 12, 13, 14, 84, 76, 1, 87, 72, 74, 75, 82, 0, 108, 109, 110, 15, 82, 89, 90, 91, 10, 93, 118, 95, 103, 97, 38, 39, 100, 10, 11, 12, 104, 105, 106, 107, 10, 11, 12, 111, 112, 15, 10, 11, 12, 117, 118, 59, 82, 128, 31, 1, 33, 34, 35, 36, 37, 129, 124, 1, 31, 73, 74, 75, 76, 77, 78, 79, 164, 1, 82, 9, 153, 154, 139, 140, 9, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 1, 9, 82, 128, 129, 130, 131, 9, 133, 134, 135, 136, 137, 138, 9, 162, 141, 142, 143, 144, 145, 146, 147, 86, 149, 150, 9, 82, 10, 11, 12, 156, 157, 158, 118, 160, 169, 3, 4, 5, 6, 7, 8, 168, 10, 11, 12, 13, 14, 31, 76, 33, 34, 35, 36, 168, 82, 83, 15, 143, 169, 119, 120, 89, 90, 91, 124, 93, 108, 95, 110, 97, 38, 39, 100, 133, 1, 108, 109, 105, 106, 107, 162, 167, 1, 111, 112, 118, 32, 169, 118, 117, 118, 59, 45, 46, 47, 48, 49, 50, 51, 52, 165, 129, 32, 9, 169, 73, 74, 75, 76, 77, 78, 79, 169, 143, 82, 168, 173, 9, 165, 161, 168, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 84, 168, 9, 128, 129, 130, 131, 168, 133, 134, 135, 136, 137, 138, 1, 9, 141, 142, 143, 144, 145, 146, 147, 99, 149, 150, 108, 109, 10, 11, 12, 156, 157, 158, 32, 160, 118, 3, 4, 5, 6, 7, 8, 168, 10, 11, 12, 13, 14, 31, 76, 33, 34, 35, 72, 87, 82, 9, 142, 54, 50, 51, 52, 89, 90, 91, 169, 93, 9, 95, 118, 97, 38, 39, 100, 108, 15, 110, 165, 105, 106, 107, 164, 167, 165, 111, 112, 82, 169, 173, 85, 117, 118, 59, 118, 143, 53, 54, 55, 56, 57, 99, 59, 129, 134, 135, 136, 73, 74, 75, 76, 77, 78, 79, 71, 108, 82, 110, 142, 167, 152, 139, 140, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 9, 118, 72, 128, 129, 130, 131, 1, 133, 134, 135, 136, 137, 138, 9, 9, 141, 142, 143, 144, 145, 146, 147, 169, 149, 150, 143, 173, 10, 11, 12, 156, 157, 158, 9, 160, 72, 3, 4, 5, 6, 7, 8, 168, 10, 11, 12, 13, 14, 31, 167, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 10, 11, 12, 108, 165, 110, 139, 140, 169, 38, 39, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 31, 155, 33, 34, 35, 36, 37, 38, 39, 59, 10, 11, 12, 167, 17, 10, 11, 12, 9, 139, 140, 10, 11, 73, 74, 75, 76, 77, 78, 79, 9, 31, 82, 33, 34, 155, 31, 38, 39, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 166, 118, 168, 128, 129, 130, 131, 9, 133, 134, 135, 136, 137, 138, 82, 9, 141, 142, 143, 144, 145, 146, 147, 72, 149, 150, 143, 10, 11, 12, 9, 156, 157, 158, 9, 160, 3, 4, 5, 6, 7, 8, 82, 10, 11, 12, 13, 14, 31, 9, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 9, 59, 1, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 71, 9, 139, 140, 59, 161, 162, 163, 51, 52, 1, 15, 53, 54, 170, 77, 78, 15, 73, 74, 75, 76, 77, 78, 79, 77, 78, 82, 103, 104, 72, 108, 109, 15, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 1, 72, 84, 128, 129, 130, 131, 17, 133, 134, 135, 136, 137, 138, 108, 109, 141, 142, 143, 144, 145, 146, 147, 31, 149, 150, 15, 139, 140, 15, 31, 156, 157, 158, 2, 3, 4, 5, 6, 7, 8, 15, 103, 155, 17, 13, 14, 108, 16, 110, 113, 114, 17, 17, 115, 167, 17, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 139, 140, 17, 17, 1, 17, 82, 32, 17, 17, 17, 32, 1, 32, 32, 32, 155, 53, 54, 169, 36, 32, 58, 173, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 32, 72, 73, 74, 75, 76, 170, 118, 32, 80, 81, 82, 32, 84, 118, 32, 32, 88, 89, 90, 91, 1, 93, 32, 95, 32, 97, 72, 32, 100, 101, 142, 143, 32, 105, 106, 107, 108, 109, 143, 111, 112, 32, 32, 32, 82, 117, 118, 32, 32, 161, 162, 163, 124, 86, 32, 167, 32, 129, 130, 131, 32, 86, 167, 36, 38, 36, 36, 36, 36, 141, 142, 36, 144, 145, 146, 147, 148, 149, 150, 151, 118, 38, 38, 38, 59, 157, 158, 38, 39, 161, 162, 163, 164, 139, 140, 167, 77, 78, 79, 171, 172, 173, 39, 82, 142, 86, 72, 71, 85, 155, 92, 92, 79, 94, 94, 96, 99, 98, 115, 82, 116, 72, 73, 161, 162, 163, 84, 108, 87, 91, 84, 133, 165, 84, 137, 96, 169, 88, 119, 120, 165, 142, 102, 124, 169, 1, 98, 159, 152, 99, 99, 132, 133, 134, 135, 136, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 102, 1, 159, 124, 38, 39, 32, 72, 164, 167, 172, -1, -1, -1, 165, 138, 1, -1, 169, 170, 141, 142, 137, 144, 145, 146, 147, 148, 149, 150, 61, 62, 32, -1, 152, -1, 157, 158, 155, 155, -1, 72, 76, 0, 1, 155, 167, 32, 82, 155, 155, 172, 173, 161, 165, 89, 90, 91, 167, 93, 86, 95, 160, 97, 165, 165, 100, 166, 38, 39, 165, 105, 106, 107, 139, 140, 165, 111, 112, 165, 165, 165, 165, 117, 118, 165, 86, 165, 165, 165, 155, 165, 165, 165, 165, 129, 165, 165, 165, 169, 166, 86, 167, 166, 166, 166, 76, 166, 139, 140, 167, 167, 82, 167, 167, 167, 72, 73, 167, 89, 90, 91, 167, 93, 155, 95, 160, 97, 84, 86, 100, 167, 88, 168, 167, 105, 106, 107, 167, 165, 167, 111, 112, 169, 167, 167, 167, 117, 118, 167, 167, 108, 167, 110, 72, 73, 167, 167, 115, 129, 167, 167, 119, 120, 167, 165, 84, 124, 124, 169, 88, 167, 167, 167, 167, 132, 133, 134, 135, 136, 165, 167, 169, 167, 169, 167, 142, 167, 144, 145, 146, 147, 148, 149, 150, 167, 167, 170, 167, 156, 32, 157, 158, 167, 167, 167, 124, 167, 165, 167, 169, 167, 169, 170, 168, 168, 172, 173, 168, 168, 168, 168, 168, 168, 142, 168, 144, 145, 146, 147, 148, 149, 150, 32, 168, 168, 168, 168, 168, 157, 158, 1, 168, 168, 76, 168, 168, 168, 168, 167, 82, 168, 168, 168, 172, 173, 168, 89, 90, 91, 168, 93, 168, 95, 1, 97, 168, 168, 100, 168, 168, 1, 168, 105, 106, 107, 168, 76, 168, 111, 112, 168, 168, 82, 168, 117, 118, 168, 168, 168, 89, 90, 91, 168, 93, 168, 95, 129, 97, 168, 168, 100, 32, 168, 168, 168, 105, 106, 107, 169, 76, 169, 111, 112, 169, 169, 82, 169, 117, 118, 169, 169, 169, 89, 90, 91, 86, 93, 31, 95, 129, 97, 169, 1, 100, 169, 169, 173, 169, 105, 106, 107, 102, 103, 104, 111, 112, 170, 108, 86, 170, 117, 118, 170, 84, 170, 170, 170, 170, 119, 120, 170, 170, 129, 124, 102, 103, 104, 170, 170, 170, 108, 132, 133, 134, 135, 136, 170, 170, 170, 170, 170, 119, 120, 170, 170, 170, 124, 170, 119, 120, 170, 170, 170, 124, 132, 133, 134, 135, 136, 170, 167, 170, 133, 171, 165, 170, -1, -1, 169, 170, -1, 142, -1, -1, 118, 84, 120, 121, 122, 123, 124, 125, 126, 127, -1, -1, -1, 165, -1, -1, -1, 169, 170, 164, -1, -1, 167, -1, -1, 143, -1, -1, 173, -1, -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, -1, 124, -1, -1, -1, -1, -1, -1, -1, 167, 133, -1, -1, -1, -1, -1, -1, -1, -1, 142, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 164, -1, -1, 167, -1, -1, -1, -1, -1, 173 ); protected array $actionBase = array( 0, 156, -3, 315, 474, 474, 880, 1074, 1271, 1294, 749, 675, 531, 559, 836, 1031, 1031, 1046, 1031, 828, 1005, 42, 59, 59, 59, 963, 898, 632, 632, 898, 632, 997, 997, 997, 997, 1061, 1061, -63, -63, 96, 1232, 1199, 255, 255, 255, 255, 255, 1265, 255, 255, 255, 255, 255, 1265, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 77, 194, 120, 205, 1197, 783, 1150, 1163, 1152, 1166, 1145, 1144, 1151, 1156, 1167, 1261, 1263, 889, 1254, 1267, 1158, 972, 1147, 1162, 962, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 19, 35, 535, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 529, 529, 529, 910, 910, 524, 299, 1113, 1075, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 140, 28, 1000, 493, 493, 458, 458, 458, 458, 458, 696, 1328, 1301, 171, 171, 171, 171, 1363, 1363, -70, 523, 248, 756, 291, 197, -87, 644, 38, 199, 323, 323, 482, 482, 233, 233, 482, 482, 482, 324, 324, 94, 94, 94, 94, 82, 249, 860, 67, 67, 67, 67, 860, 860, 860, 860, 913, 869, 860, 1036, 1049, 860, 860, 370, 645, 966, 646, 646, 398, -72, -72, 398, 64, -72, 294, 286, 257, 859, 91, 433, 257, 1073, 404, 686, 686, 815, 686, 686, 686, 923, 610, 923, 1141, 902, 902, 861, 807, 964, 1198, 1168, 901, 1252, 929, 1253, 1200, 342, 251, -56, 263, 550, 806, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1195, 523, 1141, -25, 1247, 1249, 1195, 1195, 1195, 523, 523, 523, 523, 523, 523, 523, 523, 870, 523, 523, 694, -25, 625, 635, -25, 896, 523, 915, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 178, 77, 77, 194, 13, 13, 77, 200, 121, 13, 13, 13, -11, 13, 77, 77, 77, 610, 886, 849, 663, 283, 874, 114, 886, 886, 886, 71, 9, 76, 809, 888, 288, 882, 882, 882, 907, 986, 986, 882, 903, 882, 907, 882, 882, 986, 986, 875, 986, 274, 620, 465, 597, 624, 986, 340, 882, 882, 882, 882, 916, 986, 127, 139, 639, 882, 329, 287, 882, 882, 916, 858, 876, 908, 986, 986, 986, 916, 545, 908, 908, 908, 931, 936, 864, 872, 445, 431, 679, 232, 924, 872, 872, 882, 605, 864, 872, 864, 872, 933, 872, 872, 872, 864, 872, 903, 533, 872, 813, 665, 218, 872, 882, 20, 1008, 1009, 800, 1010, 1002, 1013, 1069, 1014, 1016, 1171, 982, 1028, 1004, 1020, 1071, 998, 995, 885, 792, 793, 921, 914, 979, 897, 897, 897, 975, 977, 897, 897, 897, 897, 897, 897, 897, 897, 792, 932, 926, 899, 1037, 796, 810, 1114, 857, 1214, 1264, 1036, 1008, 1016, 804, 1004, 1020, 998, 995, 856, 853, 844, 851, 843, 840, 808, 814, 871, 1116, 1119, 1021, 920, 811, 1085, 1038, 1211, 1044, 1045, 1047, 1088, 1123, 942, 1125, 1216, 895, 1217, 1218, 965, 1051, 1173, 897, 974, 873, 968, 1049, 978, 792, 969, 1129, 1130, 1081, 961, 1097, 1098, 1072, 911, 884, 970, 1219, 1059, 1060, 1062, 1176, 1177, 930, 1082, 996, 1099, 912, 1058, 1100, 1101, 1105, 1106, 1179, 1222, 1182, 922, 1183, 945, 879, 1077, 909, 1223, 165, 892, 893, 906, 1068, 683, 1035, 1184, 1208, 1229, 1108, 1109, 1110, 1230, 1231, 1024, 946, 1083, 900, 1084, 1078, 947, 948, 689, 905, 1132, 890, 891, 904, 705, 768, 1238, 1239, 1240, 1025, 877, 894, 951, 953, 1133, 887, 1135, 1241, 771, 954, 1242, 1115, 816, 817, 521, 784, 747, 818, 881, 1194, 925, 865, 878, 1067, 817, 883, 955, 1245, 957, 958, 959, 1111, 960, 1086, 1246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789, 789, 789, 789, 789, 789, 789, 789, 789, 632, 632, 632, 632, 789, 789, 789, 789, 789, 789, 789, 632, 789, 789, 789, 632, 632, 0, 0, 632, 0, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 823, 823, 616, 616, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 616, 616, 0, 616, 616, 616, 616, 616, 616, 616, 875, 823, 823, 324, 324, 324, 324, 823, 823, 396, 396, 396, 823, 324, 823, 64, 324, 823, 64, 823, 823, 823, 823, 823, 823, 823, 823, 823, 0, 0, 823, 823, 823, 823, -25, -72, 823, 903, 903, 903, 903, 823, 823, 823, 823, -72, -72, 823, -57, -57, 823, 823, 0, 0, 0, 324, 324, -25, 0, 0, -25, 0, 0, 903, 903, 823, 64, 875, 446, 823, 342, 0, 0, 0, 0, 0, 0, 0, -25, 903, -25, 523, -72, -72, 523, 523, 13, 77, 446, 612, 612, 612, 612, 77, 0, 0, 0, 0, 0, 610, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 903, 0, 875, 0, 875, 875, 903, 903, 903, 0, 0, 0, 0, 0, 0, 0, 0, 986, 0, 0, 0, 0, 0, 0, 0, 903, 0, 986, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 897, 911, 0, 0, 911, 0, 897, 897, 897, 0, 0, 0, 905, 887 ); protected array $actionDefault = array( 3,32767,32767,32767, 102, 102,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 100, 32767, 632, 632, 632, 632,32767,32767, 257, 102,32767, 32767, 503, 417, 417, 417,32767,32767,32767, 576, 576, 576, 576, 576, 17,32767,32767,32767,32767,32767,32767, 32767, 503,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 36, 7, 8, 10, 11, 49, 338, 100, 32767,32767,32767,32767,32767,32767,32767,32767, 102,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767, 404, 625,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 497, 507, 485, 486, 488, 489, 416, 577, 631, 344, 628, 342, 415, 146, 354, 343, 245, 261, 508, 262, 509, 512, 513, 218, 401, 150, 151, 448, 504, 450, 502, 506, 449, 422, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 420, 421, 505, 482, 481, 480,32767,32767, 446, 447,32767, 32767,32767,32767,32767,32767,32767,32767, 102,32767, 451, 454, 419, 452, 453, 470, 471, 468, 469, 472,32767, 323,32767, 473, 474, 475, 476,32767,32767, 382, 196, 380,32767, 477,32767, 111, 455, 323, 111,32767,32767, 32767,32767,32767,32767,32767,32767,32767, 461, 462,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767, 102,32767,32767,32767, 100, 520, 570, 479, 456, 457,32767, 545,32767, 102, 32767, 547,32767,32767,32767,32767,32767,32767,32767,32767, 572, 443, 445, 540, 626, 423, 629,32767, 533, 100, 196,32767, 546, 196, 196,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767, 571,32767, 639, 533, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,32767, 196, 110,32767, 110, 110,32767,32767, 100, 196, 196, 196, 196, 196, 196, 196, 196, 548, 196, 196, 191,32767, 271, 273, 102, 594, 196, 550,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 404,32767,32767,32767,32767, 533, 466, 139, 32767, 535, 139, 578, 458, 459, 460, 578, 578, 578, 319, 296,32767,32767,32767,32767,32767, 548, 548, 100, 100, 100, 100,32767,32767,32767,32767, 111, 519, 99, 99, 99, 99, 99, 103, 101,32767,32767,32767,32767, 226,32767, 101, 101, 99,32767, 101, 101,32767,32767, 226, 228, 215, 230,32767, 598, 599, 226, 101, 230, 230, 230, 250, 250, 522, 325, 101, 99, 101, 101, 198, 325, 325,32767, 101, 522, 325, 522, 325, 200, 325, 325, 325, 522, 325,32767, 101, 325, 217, 99, 99, 325,32767,32767,32767,32767, 535,32767,32767,32767, 32767,32767,32767,32767, 225,32767,32767,32767,32767,32767, 32767,32767,32767, 565,32767, 583, 596, 464, 465, 467, 582, 580, 490, 491, 492, 493, 494, 495, 496, 499, 627,32767, 539,32767,32767,32767, 353,32767, 637,32767, 32767,32767, 9, 74, 528, 42, 43, 51, 57, 554, 555, 556, 557, 551, 552, 558, 553,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 638,32767, 578,32767,32767,32767,32767, 463, 560, 604,32767,32767, 579, 630,32767,32767,32767, 32767,32767,32767,32767,32767, 139,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767, 565,32767, 137,32767, 32767,32767,32767,32767,32767,32767,32767, 561,32767,32767, 32767, 578,32767,32767,32767,32767, 321, 318,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767, 578,32767,32767,32767,32767,32767, 298,32767, 315,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767, 400, 535, 301, 303, 304,32767,32767,32767,32767, 376,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767, 153, 153, 3, 3, 356, 153, 153, 153, 356, 356, 153, 356, 356, 356, 153, 153, 153, 153, 153, 153, 153, 283, 186, 265, 268, 250, 250, 153, 368, 153, 402, 402, 411 ); protected array $goto = array( 201, 169, 201, 201, 201, 1069, 598, 719, 448, 684, 644, 681, 443, 345, 341, 342, 344, 615, 447, 346, 449, 661, 481, 728, 570, 570, 570, 570, 1245, 626, 172, 172, 172, 172, 225, 202, 198, 198, 182, 184, 220, 198, 198, 198, 198, 198, 1195, 199, 199, 199, 199, 199, 1195, 192, 193, 194, 195, 196, 197, 222, 220, 223, 557, 558, 438, 559, 562, 563, 564, 565, 566, 567, 568, 569, 173, 174, 175, 200, 176, 177, 178, 170, 179, 180, 181, 183, 219, 221, 224, 242, 247, 248, 259, 260, 262, 263, 264, 265, 266, 267, 268, 272, 273, 274, 275, 282, 285, 297, 298, 324, 325, 444, 445, 446, 620, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 193, 194, 195, 196, 197, 222, 203, 204, 205, 206, 243, 185, 186, 207, 187, 208, 204, 188, 244, 203, 168, 209, 210, 189, 211, 212, 213, 190, 214, 215, 171, 216, 217, 218, 191, 287, 284, 287, 287, 883, 255, 255, 255, 255, 255, 1125, 605, 487, 487, 622, 758, 660, 662, 1103, 359, 682, 487, 1075, 1074, 706, 709, 1041, 717, 726, 1037, 733, 922, 879, 922, 922, 253, 253, 253, 253, 250, 256, 646, 646, 1078, 1079, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 880, 351, 938, 933, 934, 947, 889, 935, 886, 936, 937, 887, 890, 476, 941, 894, 476, 1044, 1044, 893, 364, 364, 364, 364, 352, 351, 532, 1131, 1127, 1128, 1351, 1351, 331, 315, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1069, 1301, 1072, 1072, 704, 983, 1301, 1301, 1064, 1080, 1081, 1069, 942, 1301, 943, 458, 1069, 881, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 897, 855, 1069, 1069, 1069, 1069, 677, 678, 1301, 695, 696, 697, 1006, 1301, 1301, 1301, 1301, 450, 909, 1301, 436, 896, 1301, 1301, 1382, 1382, 1382, 1382, 915, 581, 574, 499, 612, 450, 367, 971, 971, 955, 501, 1076, 1076, 956, 1400, 1400, 367, 367, 688, 1087, 1083, 1084, 572, 411, 414, 623, 627, 572, 572, 367, 367, 1400, 357, 367, 572, 1417, 1377, 1378, 317, 574, 581, 607, 608, 318, 618, 624, 1390, 640, 641, 1027, 576, 1403, 1403, 367, 367, 28, 474, 520, 442, 521, 635, 1000, 1000, 1000, 1000, 527, 409, 474, 1348, 1348, 994, 1001, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 633, 647, 650, 651, 652, 653, 674, 675, 676, 730, 732, 561, 561, 258, 258, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 610, 1362, 467, 683, 467, 876, 616, 638, 876, 467, 467, 1191, 861, 1373, 360, 361, 1093, 456, 1373, 1373, 560, 560, 705, 432, 560, 1373, 560, 560, 560, 560, 560, 560, 560, 560, 1277, 975, 575, 602, 575, 1278, 1281, 976, 575, 1282, 602, 689, 412, 480, 1384, 1384, 1384, 1384, 347, 873, 716, 576, 861, 876, 861, 490, 619, 491, 492, 639, 8, 857, 9, 902, 907, 989, 716, 1408, 1409, 716, 1369, 418, 1296, 278, 899, 330, 1174, 424, 425, 1292, 330, 330, 693, 1049, 694, 1114, 429, 430, 431, 761, 707, 1060, 905, 433, 1102, 1104, 1107, 355, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 419, 339, 467, 911, 467, 467, 1294, 628, 629, 1116, 497, 960, 1181, 621, 1144, 1371, 1371, 1116, 1118, 1297, 1298, 1011, 1284, 1046, 1151, 1179, 1152, 731, 871, 528, 722, 901, 1142, 687, 1025, 1284, 496, 1375, 1376, 895, 910, 898, 1113, 1117, 998, 427, 727, 1165, 1299, 1359, 1360, 1291, 1030, 386, 1009, 1002, 0, 757, 0, 0, 573, 1039, 1034, 654, 656, 658, 0, 0, 0, 0, 0, 0, 0, 0, 876, 0, 0, 999, 0, 766, 766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163, 914 ); protected array $gotoCheck = array( 42, 42, 42, 42, 42, 73, 127, 73, 66, 66, 56, 56, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 159, 9, 107, 107, 107, 107, 159, 107, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 23, 23, 23, 23, 15, 5, 5, 5, 5, 5, 15, 48, 157, 157, 134, 48, 48, 48, 131, 97, 48, 157, 119, 119, 48, 48, 48, 48, 48, 48, 48, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 108, 108, 120, 120, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 26, 177, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 83, 15, 15, 83, 107, 107, 15, 24, 24, 24, 24, 177, 177, 76, 15, 15, 15, 179, 179, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 73, 73, 89, 89, 89, 89, 73, 73, 89, 89, 89, 73, 65, 73, 65, 83, 73, 27, 73, 73, 73, 73, 73, 73, 73, 73, 73, 35, 6, 73, 73, 73, 73, 86, 86, 73, 86, 86, 86, 49, 73, 73, 73, 73, 118, 35, 73, 43, 35, 73, 73, 9, 9, 9, 9, 45, 76, 76, 84, 181, 118, 14, 9, 9, 73, 84, 118, 118, 73, 191, 191, 14, 14, 118, 118, 118, 118, 19, 59, 59, 59, 59, 19, 19, 14, 14, 191, 188, 14, 19, 14, 187, 187, 76, 76, 76, 76, 76, 76, 76, 76, 190, 76, 76, 103, 14, 191, 191, 14, 14, 76, 19, 163, 13, 163, 13, 19, 19, 19, 19, 163, 62, 19, 180, 180, 19, 19, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 182, 182, 5, 5, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 104, 14, 23, 64, 23, 22, 2, 2, 22, 23, 23, 158, 12, 134, 97, 97, 115, 113, 134, 134, 165, 165, 117, 14, 165, 134, 165, 165, 165, 165, 165, 165, 165, 165, 79, 79, 9, 9, 9, 79, 79, 79, 9, 79, 9, 121, 9, 9, 134, 134, 134, 134, 29, 18, 7, 14, 12, 22, 12, 9, 9, 9, 9, 80, 46, 7, 46, 39, 9, 92, 7, 9, 9, 7, 134, 28, 20, 24, 37, 24, 156, 82, 82, 169, 24, 24, 82, 110, 82, 133, 82, 82, 82, 99, 82, 114, 9, 82, 130, 130, 130, 82, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 31, 9, 23, 41, 23, 23, 14, 17, 17, 134, 160, 17, 17, 8, 8, 134, 134, 134, 136, 20, 20, 96, 20, 17, 149, 149, 149, 8, 20, 8, 8, 17, 8, 17, 17, 20, 185, 185, 185, 17, 16, 16, 16, 16, 93, 93, 93, 152, 20, 20, 20, 17, 50, 141, 16, 50, -1, 50, -1, -1, 50, 50, 50, 85, 85, 85, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 16, -1, 24, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, 16 ); protected array $gotoBase = array( 0, 0, -303, 0, 0, 170, 280, 471, 543, 10, 0, 0, 136, 31, 22, -186, 111, 66, 164, 71, 95, 0, 148, 160, 235, 191, 214, 275, 155, 176, 0, 86, 0, 0, 0, -92, 0, 156, 0, 165, 0, 85, -1, 286, 0, 291, -270, 0, -558, 284, 579, 0, 0, 0, 0, 0, -33, 0, 0, 294, 0, 0, 341, 0, 184, 261, -237, 0, 0, 0, 0, 0, 0, -5, 0, 0, -32, 0, 0, 37, 172, 32, -3, -50, -167, 105, -444, 0, 0, -21, 0, 0, 161, 274, 0, 0, 101, -318, 0, 97, 0, 0, 0, 331, 381, 0, 0, -7, -38, 0, 131, 0, 0, 158, 90, 162, 0, 159, 39, -100, -83, 173, 0, 0, 0, 0, 0, 4, 0, 0, 522, 182, 0, 127, 169, 0, 99, 0, 0, 0, 0, -171, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 126, 0, 0, 0, 144, 141, 188, -255, 93, 0, 0, -138, 0, 202, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, -82, -74, 6, 143, 292, 168, 0, 0, 270, 0, -31, 319, 0, 332, 20, 0, 0 ); protected array $gotoDefault = array( -32768, 533, 768, 7, 769, 964, 844, 853, 597, 551, 729, 356, 648, 439, 1367, 940, 1180, 617, 872, 1310, 1316, 475, 875, 336, 755, 952, 923, 924, 415, 402, 888, 413, 672, 649, 514, 908, 471, 900, 506, 903, 470, 912, 167, 435, 530, 916, 6, 919, 579, 950, 1004, 403, 927, 404, 700, 929, 601, 931, 932, 410, 416, 417, 1185, 609, 645, 944, 261, 603, 945, 401, 946, 954, 406, 408, 710, 486, 525, 519, 428, 1146, 604, 632, 669, 464, 493, 643, 655, 642, 500, 451, 434, 335, 988, 996, 507, 484, 1010, 358, 1018, 763, 1193, 663, 509, 1026, 664, 1033, 1036, 552, 553, 498, 1048, 270, 1051, 510, 1061, 26, 690, 1066, 1067, 691, 665, 1089, 666, 692, 667, 1091, 483, 599, 1194, 482, 1106, 1112, 472, 1115, 1356, 473, 1119, 269, 1122, 286, 362, 385, 452, 1129, 1130, 12, 1136, 720, 721, 25, 280, 529, 1164, 711, 1170, 279, 1173, 469, 1192, 468, 1265, 1267, 580, 511, 1285, 321, 1288, 703, 526, 1293, 465, 1358, 466, 554, 494, 343, 555, 1401, 314, 365, 340, 571, 322, 366, 556, 495, 1364, 1372, 337, 34, 1391, 1402, 614, 637 ); protected array $ruleToNonTerminal = array( 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 50, 69, 69, 72, 72, 71, 70, 70, 63, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 80, 26, 26, 27, 27, 27, 27, 27, 88, 88, 90, 90, 83, 83, 91, 91, 92, 92, 92, 84, 84, 87, 87, 85, 85, 93, 94, 94, 57, 57, 65, 65, 68, 68, 68, 67, 95, 95, 96, 58, 58, 58, 58, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 55, 55, 51, 51, 105, 53, 53, 106, 52, 52, 54, 54, 64, 64, 64, 64, 81, 81, 109, 109, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 110, 110, 110, 115, 115, 115, 115, 89, 89, 118, 118, 118, 119, 119, 116, 116, 120, 120, 122, 122, 123, 123, 117, 124, 124, 121, 125, 125, 125, 125, 113, 113, 82, 82, 82, 20, 20, 20, 128, 128, 128, 128, 129, 129, 129, 127, 126, 126, 131, 131, 131, 130, 130, 60, 132, 132, 133, 61, 135, 135, 136, 136, 137, 137, 86, 138, 138, 138, 138, 138, 138, 138, 138, 144, 144, 145, 145, 146, 146, 146, 146, 146, 147, 148, 148, 143, 143, 139, 139, 142, 142, 150, 150, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 140, 151, 151, 153, 152, 152, 141, 141, 114, 114, 154, 154, 156, 156, 156, 155, 155, 62, 104, 157, 157, 56, 56, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 164, 165, 165, 166, 158, 158, 163, 163, 167, 168, 168, 169, 170, 171, 171, 171, 171, 19, 19, 73, 73, 73, 73, 159, 159, 159, 159, 173, 173, 162, 162, 162, 160, 160, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 180, 180, 180, 108, 182, 182, 182, 182, 161, 161, 161, 161, 161, 161, 161, 161, 59, 59, 176, 176, 176, 176, 176, 183, 183, 172, 172, 172, 172, 184, 184, 184, 184, 184, 74, 74, 66, 66, 66, 66, 134, 134, 134, 134, 187, 186, 175, 175, 175, 175, 175, 175, 174, 174, 174, 185, 185, 185, 185, 107, 181, 189, 189, 188, 188, 190, 190, 190, 190, 190, 190, 190, 190, 178, 178, 178, 178, 177, 192, 191, 191, 191, 191, 191, 191, 191, 191, 193, 193, 193, 193 ); protected array $ruleToLength = array( 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 4, 3, 5, 4, 3, 4, 1, 3, 4, 1, 1, 8, 7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 1, 1, 1, 1, 8, 9, 7, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 7, 9, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 2, 4, 4, 3, 3, 1, 3, 1, 1, 3, 2, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 7, 5, 6, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 0, 2, 0, 3, 5, 8, 1, 3, 3, 0, 2, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 2, 1, 1, 0, 4, 2, 1, 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1 ); protected function initReduceCallbacks(): void { $this->reduceCallbacks = [ 0 => null, 1 => static function ($self, $stackPos) { $self->semValue = $self->handleNamespaces($self->semStack[$stackPos-(1-1)]); }, 2 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];; }, 3 => static function ($self, $stackPos) { $self->semValue = array(); }, 4 => static function ($self, $stackPos) { $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);; if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 5 => null, 6 => null, 7 => null, 8 => null, 9 => null, 10 => null, 11 => null, 12 => null, 13 => null, 14 => null, 15 => null, 16 => null, 17 => null, 18 => null, 19 => null, 20 => null, 21 => null, 22 => null, 23 => null, 24 => null, 25 => null, 26 => null, 27 => null, 28 => null, 29 => null, 30 => null, 31 => null, 32 => null, 33 => null, 34 => null, 35 => null, 36 => null, 37 => null, 38 => null, 39 => null, 40 => null, 41 => null, 42 => null, 43 => null, 44 => null, 45 => null, 46 => null, 47 => null, 48 => null, 49 => null, 50 => null, 51 => null, 52 => null, 53 => null, 54 => null, 55 => null, 56 => null, 57 => null, 58 => null, 59 => null, 60 => null, 61 => null, 62 => null, 63 => null, 64 => null, 65 => null, 66 => null, 67 => null, 68 => null, 69 => null, 70 => null, 71 => null, 72 => null, 73 => null, 74 => null, 75 => null, 76 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; if ($self->semValue === "emitError(new Error('Cannot use "getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]))); }, 77 => null, 78 => null, 79 => null, 80 => null, 81 => null, 82 => null, 83 => null, 84 => null, 85 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 86 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 87 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 88 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 89 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 90 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 91 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 92 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 93 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 94 => null, 95 => static function ($self, $stackPos) { $self->semValue = new Name(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 96 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 97 => static function ($self, $stackPos) { /* nothing */ }, 98 => static function ($self, $stackPos) { /* nothing */ }, 99 => static function ($self, $stackPos) { /* nothing */ }, 100 => static function ($self, $stackPos) { $self->emitError(new Error('A trailing comma is not allowed here', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]))); }, 101 => null, 102 => null, 103 => static function ($self, $stackPos) { $self->semValue = new Node\Attribute($self->semStack[$stackPos-(1-1)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 104 => static function ($self, $stackPos) { $self->semValue = new Node\Attribute($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 105 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 106 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 107 => static function ($self, $stackPos) { $self->semValue = new Node\AttributeGroup($self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 108 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 109 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 110 => static function ($self, $stackPos) { $self->semValue = []; }, 111 => null, 112 => null, 113 => null, 114 => null, 115 => static function ($self, $stackPos) { $self->semValue = new Stmt\HaltCompiler($self->handleHaltCompiler(), $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 116 => static function ($self, $stackPos) { $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos-(3-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $self->checkNamespace($self->semValue); }, 117 => static function ($self, $stackPos) { $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $self->checkNamespace($self->semValue); }, 118 => static function ($self, $stackPos) { $self->semValue = new Stmt\Namespace_(null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $self->checkNamespace($self->semValue); }, 119 => static function ($self, $stackPos) { $self->semValue = new Stmt\Use_($self->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 120 => static function ($self, $stackPos) { $self->semValue = new Stmt\Use_($self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 121 => null, 122 => static function ($self, $stackPos) { $self->semValue = new Stmt\Const_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), []); }, 123 => static function ($self, $stackPos) { $self->semValue = new Stmt\Const_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(4-1)]); $self->checkConstantAttributes($self->semValue); }, 124 => static function ($self, $stackPos) { $self->semValue = Stmt\Use_::TYPE_FUNCTION; }, 125 => static function ($self, $stackPos) { $self->semValue = Stmt\Use_::TYPE_CONSTANT; }, 126 => static function ($self, $stackPos) { $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-6)], $self->semStack[$stackPos-(8-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 127 => static function ($self, $stackPos) { $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-5)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 128 => null, 129 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 130 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 131 => null, 132 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 133 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 134 => null, 135 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 136 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 137 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1)); }, 138 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3)); }, 139 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1)); }, 140 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3)); }, 141 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->semValue->type = Stmt\Use_::TYPE_NORMAL; }, 142 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; $self->semValue->type = $self->semStack[$stackPos-(2-1)]; }, 143 => null, 144 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 145 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 146 => static function ($self, $stackPos) { $self->semValue = new Node\Const_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 147 => null, 148 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 149 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 150 => static function ($self, $stackPos) { $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 151 => static function ($self, $stackPos) { $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 152 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];; }, 153 => static function ($self, $stackPos) { $self->semValue = array(); }, 154 => static function ($self, $stackPos) { $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);; if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 155 => null, 156 => null, 157 => null, 158 => static function ($self, $stackPos) { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 159 => static function ($self, $stackPos) { $self->semValue = new Stmt\Block($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 160 => static function ($self, $stackPos) { $self->semValue = new Stmt\If_($self->semStack[$stackPos-(7-3)], ['stmts' => $self->semStack[$stackPos-(7-5)], 'elseifs' => $self->semStack[$stackPos-(7-6)], 'else' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 161 => static function ($self, $stackPos) { $self->semValue = new Stmt\If_($self->semStack[$stackPos-(10-3)], ['stmts' => $self->semStack[$stackPos-(10-6)], 'elseifs' => $self->semStack[$stackPos-(10-7)], 'else' => $self->semStack[$stackPos-(10-8)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); }, 162 => static function ($self, $stackPos) { $self->semValue = new Stmt\While_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 163 => static function ($self, $stackPos) { $self->semValue = new Stmt\Do_($self->semStack[$stackPos-(7-5)], $self->semStack[$stackPos-(7-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 164 => static function ($self, $stackPos) { $self->semValue = new Stmt\For_(['init' => $self->semStack[$stackPos-(9-3)], 'cond' => $self->semStack[$stackPos-(9-5)], 'loop' => $self->semStack[$stackPos-(9-7)], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 165 => static function ($self, $stackPos) { $self->semValue = new Stmt\Switch_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 166 => static function ($self, $stackPos) { $self->semValue = new Stmt\Break_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 167 => static function ($self, $stackPos) { $self->semValue = new Stmt\Continue_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 168 => static function ($self, $stackPos) { $self->semValue = new Stmt\Return_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 169 => static function ($self, $stackPos) { $self->semValue = new Stmt\Global_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 170 => static function ($self, $stackPos) { $self->semValue = new Stmt\Static_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 171 => static function ($self, $stackPos) { $self->semValue = new Stmt\Echo_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 172 => static function ($self, $stackPos) { $self->semValue = new Stmt\InlineHTML($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('hasLeadingNewline', $self->inlineHtmlHasLeadingNewline($stackPos-(1-1))); }, 173 => static function ($self, $stackPos) { $self->semValue = new Stmt\Expression($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 174 => static function ($self, $stackPos) { $self->semValue = new Stmt\Unset_($self->semStack[$stackPos-(5-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 175 => static function ($self, $stackPos) { $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $self->semStack[$stackPos-(7-5)][1], 'stmts' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 176 => static function ($self, $stackPos) { $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-7)][0], ['keyVar' => $self->semStack[$stackPos-(9-5)], 'byRef' => $self->semStack[$stackPos-(9-7)][1], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 177 => static function ($self, $stackPos) { $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos-(6-3)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-4)], $self->tokenEndStack[$stackPos-(6-4)])), ['stmts' => $self->semStack[$stackPos-(6-6)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); }, 178 => static function ($self, $stackPos) { $self->semValue = new Stmt\Declare_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 179 => static function ($self, $stackPos) { $self->semValue = new Stmt\TryCatch($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->checkTryCatch($self->semValue); }, 180 => static function ($self, $stackPos) { $self->semValue = new Stmt\Goto_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 181 => static function ($self, $stackPos) { $self->semValue = new Stmt\Label($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 182 => static function ($self, $stackPos) { $self->semValue = null; /* means: no statement */ }, 183 => null, 184 => static function ($self, $stackPos) { $self->semValue = $self->maybeCreateNop($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]); }, 185 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; }; }, 186 => static function ($self, $stackPos) { $self->semValue = array(); }, 187 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 188 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 189 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 190 => static function ($self, $stackPos) { $self->semValue = new Stmt\Catch_($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-7)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 191 => static function ($self, $stackPos) { $self->semValue = null; }, 192 => static function ($self, $stackPos) { $self->semValue = new Stmt\Finally_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 193 => null, 194 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 195 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 196 => static function ($self, $stackPos) { $self->semValue = false; }, 197 => static function ($self, $stackPos) { $self->semValue = true; }, 198 => static function ($self, $stackPos) { $self->semValue = false; }, 199 => static function ($self, $stackPos) { $self->semValue = true; }, 200 => static function ($self, $stackPos) { $self->semValue = false; }, 201 => static function ($self, $stackPos) { $self->semValue = true; }, 202 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 203 => static function ($self, $stackPos) { $self->semValue = []; }, 204 => null, 205 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 206 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 207 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 208 => static function ($self, $stackPos) { $self->semValue = new Stmt\Function_($self->semStack[$stackPos-(8-3)], ['byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-5)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 209 => static function ($self, $stackPos) { $self->semValue = new Stmt\Function_($self->semStack[$stackPos-(9-4)], ['byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-6)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 210 => static function ($self, $stackPos) { $self->semValue = new Stmt\Class_($self->semStack[$stackPos-(7-2)], ['type' => $self->semStack[$stackPos-(7-1)], 'extends' => $self->semStack[$stackPos-(7-3)], 'implements' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); $self->checkClass($self->semValue, $stackPos-(7-2)); }, 211 => static function ($self, $stackPos) { $self->semValue = new Stmt\Class_($self->semStack[$stackPos-(8-3)], ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); $self->checkClass($self->semValue, $stackPos-(8-3)); }, 212 => static function ($self, $stackPos) { $self->semValue = new Stmt\Interface_($self->semStack[$stackPos-(7-3)], ['extends' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => $self->semStack[$stackPos-(7-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); $self->checkInterface($self->semValue, $stackPos-(7-3)); }, 213 => static function ($self, $stackPos) { $self->semValue = new Stmt\Trait_($self->semStack[$stackPos-(6-3)], ['stmts' => $self->semStack[$stackPos-(6-5)], 'attrGroups' => $self->semStack[$stackPos-(6-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); }, 214 => static function ($self, $stackPos) { $self->semValue = new Stmt\Enum_($self->semStack[$stackPos-(8-3)], ['scalarType' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); $self->checkEnum($self->semValue, $stackPos-(8-3)); }, 215 => static function ($self, $stackPos) { $self->semValue = null; }, 216 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 217 => static function ($self, $stackPos) { $self->semValue = null; }, 218 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 219 => static function ($self, $stackPos) { $self->semValue = 0; }, 220 => null, 221 => null, 222 => static function ($self, $stackPos) { $self->checkClassModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 223 => static function ($self, $stackPos) { $self->semValue = Modifiers::ABSTRACT; }, 224 => static function ($self, $stackPos) { $self->semValue = Modifiers::FINAL; }, 225 => static function ($self, $stackPos) { $self->semValue = Modifiers::READONLY; }, 226 => static function ($self, $stackPos) { $self->semValue = null; }, 227 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 228 => static function ($self, $stackPos) { $self->semValue = array(); }, 229 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 230 => static function ($self, $stackPos) { $self->semValue = array(); }, 231 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 232 => null, 233 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 234 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 235 => null, 236 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 237 => null, 238 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 239 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; }; }, 240 => static function ($self, $stackPos) { $self->semValue = null; }, 241 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 242 => null, 243 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 244 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 245 => static function ($self, $stackPos) { $self->semValue = new Node\DeclareItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 246 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 247 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-3)]; }, 248 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 249 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(5-3)]; }, 250 => static function ($self, $stackPos) { $self->semValue = array(); }, 251 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 252 => static function ($self, $stackPos) { $self->semValue = new Stmt\Case_($self->semStack[$stackPos-(4-2)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 253 => static function ($self, $stackPos) { $self->semValue = new Stmt\Case_(null, $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 254 => null, 255 => null, 256 => static function ($self, $stackPos) { $self->semValue = new Expr\Match_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 257 => static function ($self, $stackPos) { $self->semValue = []; }, 258 => null, 259 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 260 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 261 => static function ($self, $stackPos) { $self->semValue = new Node\MatchArm($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 262 => static function ($self, $stackPos) { $self->semValue = new Node\MatchArm(null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 263 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 264 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 265 => static function ($self, $stackPos) { $self->semValue = array(); }, 266 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 267 => static function ($self, $stackPos) { $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 268 => static function ($self, $stackPos) { $self->semValue = array(); }, 269 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 270 => static function ($self, $stackPos) { $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue); }, 271 => static function ($self, $stackPos) { $self->semValue = null; }, 272 => static function ($self, $stackPos) { $self->semValue = new Stmt\Else_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 273 => static function ($self, $stackPos) { $self->semValue = null; }, 274 => static function ($self, $stackPos) { $self->semValue = new Stmt\Else_($self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue); }, 275 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)], false); }, 276 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(2-2)], true); }, 277 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)], false); }, 278 => static function ($self, $stackPos) { $self->semValue = array($self->fixupArrayDestructuring($self->semStack[$stackPos-(1-1)]), false); }, 279 => null, 280 => static function ($self, $stackPos) { $self->semValue = array(); }, 281 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 282 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 283 => static function ($self, $stackPos) { $self->semValue = 0; }, 284 => static function ($self, $stackPos) { $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 285 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC; }, 286 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED; }, 287 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE; }, 288 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC_SET; }, 289 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED_SET; }, 290 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE_SET; }, 291 => static function ($self, $stackPos) { $self->semValue = Modifiers::READONLY; }, 292 => static function ($self, $stackPos) { $self->semValue = Modifiers::FINAL; }, 293 => static function ($self, $stackPos) { $self->semValue = new Node\Param($self->semStack[$stackPos-(7-6)], null, $self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-4)], $self->semStack[$stackPos-(7-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-1)], $self->semStack[$stackPos-(7-7)]); $self->checkParam($self->semValue); $self->addPropertyNameToHooks($self->semValue); }, 294 => static function ($self, $stackPos) { $self->semValue = new Node\Param($self->semStack[$stackPos-(9-6)], $self->semStack[$stackPos-(9-8)], $self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-4)], $self->semStack[$stackPos-(9-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(9-2)], $self->semStack[$stackPos-(9-1)], $self->semStack[$stackPos-(9-9)]); $self->checkParam($self->semValue); $self->addPropertyNameToHooks($self->semValue); }, 295 => static function ($self, $stackPos) { $self->semValue = new Node\Param(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])), null, $self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-4)], $self->semStack[$stackPos-(6-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-1)]); }, 296 => null, 297 => static function ($self, $stackPos) { $self->semValue = new Node\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 298 => static function ($self, $stackPos) { $self->semValue = new Node\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 299 => null, 300 => null, 301 => static function ($self, $stackPos) { $self->semValue = new Node\Name('static', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 302 => static function ($self, $stackPos) { $self->semValue = $self->handleBuiltinTypes($self->semStack[$stackPos-(1-1)]); }, 303 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier('array', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 304 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier('callable', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 305 => null, 306 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 307 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 308 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 309 => null, 310 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 311 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 312 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 313 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 314 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 315 => static function ($self, $stackPos) { $self->semValue = new Node\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 316 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 317 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 318 => static function ($self, $stackPos) { $self->semValue = new Node\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 319 => null, 320 => static function ($self, $stackPos) { $self->semValue = new Node\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 321 => static function ($self, $stackPos) { $self->semValue = new Node\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 322 => null, 323 => static function ($self, $stackPos) { $self->semValue = null; }, 324 => null, 325 => static function ($self, $stackPos) { $self->semValue = null; }, 326 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 327 => static function ($self, $stackPos) { $self->semValue = null; }, 328 => static function ($self, $stackPos) { $self->semValue = array(); }, 329 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 330 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-2)]); }, 331 => static function ($self, $stackPos) { $self->semValue = array(); }, 332 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 333 => static function ($self, $stackPos) { $self->semValue = array(new Node\Arg($self->semStack[$stackPos-(4-2)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]))); }, 334 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-2)]); }, 335 => static function ($self, $stackPos) { $self->semValue = array(new Node\Arg($self->semStack[$stackPos-(3-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)]); }, 336 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 337 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 338 => static function ($self, $stackPos) { $self->semValue = new Node\VariadicPlaceholder($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 339 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 340 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 341 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(2-2)], true, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 342 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(2-2)], false, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 343 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(3-3)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(3-1)]); }, 344 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(1-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 345 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 346 => null, 347 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 348 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 349 => null, 350 => null, 351 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 352 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 353 => static function ($self, $stackPos) { $self->semValue = new Node\StaticVar($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 354 => static function ($self, $stackPos) { $self->semValue = new Node\StaticVar($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 355 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; } else { $self->semValue = $self->semStack[$stackPos-(2-1)]; } }, 356 => static function ($self, $stackPos) { $self->semValue = array(); }, 357 => static function ($self, $stackPos) { $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);; if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 358 => static function ($self, $stackPos) { $self->semValue = new Stmt\Property($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-1)]); }, 359 => static function ($self, $stackPos) { $self->semValue = new Stmt\Property($self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-1)], $self->semStack[$stackPos-(7-6)]); $self->checkPropertyHooksForMultiProperty($self->semValue, $stackPos-(7-5)); $self->checkEmptyPropertyHookList($self->semStack[$stackPos-(7-6)], $stackPos-(7-5)); $self->addPropertyNameToHooks($self->semValue); }, 360 => static function ($self, $stackPos) { $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-1)]); $self->checkClassConst($self->semValue, $stackPos-(5-2)); }, 361 => static function ($self, $stackPos) { $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-1)], $self->semStack[$stackPos-(6-4)]); $self->checkClassConst($self->semValue, $stackPos-(6-2)); }, 362 => static function ($self, $stackPos) { $self->semValue = new Stmt\ClassMethod($self->semStack[$stackPos-(10-5)], ['type' => $self->semStack[$stackPos-(10-2)], 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-7)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); $self->checkClassMethod($self->semValue, $stackPos-(10-2)); }, 363 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUse($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 364 => static function ($self, $stackPos) { $self->semValue = new Stmt\EnumCase($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 365 => static function ($self, $stackPos) { $self->semValue = null; /* will be skipped */ }, 366 => static function ($self, $stackPos) { $self->semValue = array(); }, 367 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 368 => static function ($self, $stackPos) { $self->semValue = array(); }, 369 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 370 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Precedence($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 371 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(5-1)][0], $self->semStack[$stackPos-(5-1)][1], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 372 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 373 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 374 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 375 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 376 => null, 377 => static function ($self, $stackPos) { $self->semValue = array(null, $self->semStack[$stackPos-(1-1)]); }, 378 => static function ($self, $stackPos) { $self->semValue = null; }, 379 => null, 380 => null, 381 => static function ($self, $stackPos) { $self->semValue = 0; }, 382 => static function ($self, $stackPos) { $self->semValue = 0; }, 383 => null, 384 => null, 385 => static function ($self, $stackPos) { $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 386 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC; }, 387 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED; }, 388 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE; }, 389 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC_SET; }, 390 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED_SET; }, 391 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE_SET; }, 392 => static function ($self, $stackPos) { $self->semValue = Modifiers::STATIC; }, 393 => static function ($self, $stackPos) { $self->semValue = Modifiers::ABSTRACT; }, 394 => static function ($self, $stackPos) { $self->semValue = Modifiers::FINAL; }, 395 => static function ($self, $stackPos) { $self->semValue = Modifiers::READONLY; }, 396 => null, 397 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 398 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 399 => static function ($self, $stackPos) { $self->semValue = new Node\VarLikeIdentifier(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 400 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyItem($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 401 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 402 => static function ($self, $stackPos) { $self->semValue = []; }, 403 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 404 => static function ($self, $stackPos) { $self->semValue = []; }, 405 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; $self->checkEmptyPropertyHookList($self->semStack[$stackPos-(3-2)], $stackPos-(3-1)); }, 406 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyHook($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-5)], ['flags' => $self->semStack[$stackPos-(5-2)], 'byRef' => $self->semStack[$stackPos-(5-3)], 'params' => [], 'attrGroups' => $self->semStack[$stackPos-(5-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); $self->checkPropertyHook($self->semValue, null); }, 407 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyHook($self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-8)], ['flags' => $self->semStack[$stackPos-(8-2)], 'byRef' => $self->semStack[$stackPos-(8-3)], 'params' => $self->semStack[$stackPos-(8-6)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); $self->checkPropertyHook($self->semValue, $stackPos-(8-5)); }, 408 => static function ($self, $stackPos) { $self->semValue = null; }, 409 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 410 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 411 => static function ($self, $stackPos) { $self->semValue = 0; }, 412 => static function ($self, $stackPos) { $self->checkPropertyHookModifiers($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 413 => null, 414 => null, 415 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 416 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 417 => static function ($self, $stackPos) { $self->semValue = array(); }, 418 => null, 419 => null, 420 => static function ($self, $stackPos) { $self->semValue = new Expr\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 421 => static function ($self, $stackPos) { $self->semValue = new Expr\Assign($self->fixupArrayDestructuring($self->semStack[$stackPos-(3-1)]), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 422 => static function ($self, $stackPos) { $self->semValue = new Expr\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 423 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 424 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); if (!$self->phpVersion->allowsAssignNewByReference()) { $self->emitError(new Error('Cannot assign new by reference', $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]))); } }, 425 => null, 426 => null, 427 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall(new Node\Name($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos-(2-1)])), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 428 => static function ($self, $stackPos) { $self->semValue = new Expr\Clone_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 429 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 430 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 431 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 432 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 433 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 434 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 435 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 436 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 437 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 438 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 439 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 440 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 441 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 442 => static function ($self, $stackPos) { $self->semValue = new Expr\PostInc($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 443 => static function ($self, $stackPos) { $self->semValue = new Expr\PreInc($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 444 => static function ($self, $stackPos) { $self->semValue = new Expr\PostDec($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 445 => static function ($self, $stackPos) { $self->semValue = new Expr\PreDec($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 446 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BooleanOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 447 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BooleanAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 448 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\LogicalOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 449 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\LogicalAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 450 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\LogicalXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 451 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 452 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 453 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 454 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 455 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 456 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 457 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 458 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 459 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 460 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 461 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 462 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 463 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 464 => static function ($self, $stackPos) { $self->semValue = new Expr\UnaryPlus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 465 => static function ($self, $stackPos) { $self->semValue = new Expr\UnaryMinus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 466 => static function ($self, $stackPos) { $self->semValue = new Expr\BooleanNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 467 => static function ($self, $stackPos) { $self->semValue = new Expr\BitwiseNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 468 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Identical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 469 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\NotIdentical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 470 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Equal($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 471 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\NotEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 472 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Spaceship($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 473 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Smaller($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 474 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\SmallerOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 475 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Greater($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 476 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\GreaterOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 477 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Pipe($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkPipeOperatorParentheses($self->semStack[$stackPos-(3-3)]); }, 478 => static function ($self, $stackPos) { $self->semValue = new Expr\Instanceof_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 479 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; if ($self->semValue instanceof Expr\ArrowFunction) { $self->parenthesizedArrowFunctions->offsetSet($self->semValue); } }, 480 => static function ($self, $stackPos) { $self->semValue = new Expr\Ternary($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 481 => static function ($self, $stackPos) { $self->semValue = new Expr\Ternary($self->semStack[$stackPos-(4-1)], null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 482 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 483 => static function ($self, $stackPos) { $self->semValue = new Expr\Isset_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 484 => static function ($self, $stackPos) { $self->semValue = new Expr\Empty_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 485 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 486 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 487 => static function ($self, $stackPos) { $self->semValue = new Expr\Eval_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 488 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 489 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 490 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getIntCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos-(2-2)], $attrs); }, 491 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\Double($self->semStack[$stackPos-(2-2)], $attrs); }, 492 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getStringCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\String_($self->semStack[$stackPos-(2-2)], $attrs); }, 493 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Array_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 494 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Object_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 495 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getBoolCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos-(2-2)], $attrs); }, 496 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Unset_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 497 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Void_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 498 => static function ($self, $stackPos) { $self->semValue = $self->createExitExpr($self->semStack[$stackPos-(2-1)], $stackPos-(2-1), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 499 => static function ($self, $stackPos) { $self->semValue = new Expr\ErrorSuppress($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 500 => null, 501 => static function ($self, $stackPos) { $self->semValue = new Expr\ShellExec($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 502 => static function ($self, $stackPos) { $self->semValue = new Expr\Print_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 503 => static function ($self, $stackPos) { $self->semValue = new Expr\Yield_(null, null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 504 => static function ($self, $stackPos) { $self->semValue = new Expr\Yield_($self->semStack[$stackPos-(2-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 505 => static function ($self, $stackPos) { $self->semValue = new Expr\Yield_($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 506 => static function ($self, $stackPos) { $self->semValue = new Expr\YieldFrom($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 507 => static function ($self, $stackPos) { $self->semValue = new Expr\Throw_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 508 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'returnType' => $self->semStack[$stackPos-(8-6)], 'expr' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 509 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 510 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'uses' => $self->semStack[$stackPos-(8-6)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 511 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 512 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 513 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'returnType' => $self->semStack[$stackPos-(10-8)], 'expr' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); }, 514 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 515 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'uses' => $self->semStack[$stackPos-(10-8)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); }, 516 => static function ($self, $stackPos) { $self->semValue = array(new Stmt\Class_(null, ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])), $self->semStack[$stackPos-(8-3)]); $self->checkClass($self->semValue[0], -1); }, 517 => static function ($self, $stackPos) { $self->semValue = new Expr\New_($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 518 => static function ($self, $stackPos) { list($class, $ctorArgs) = $self->semStack[$stackPos-(2-2)]; $self->semValue = new Expr\New_($class, $ctorArgs, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 519 => static function ($self, $stackPos) { $self->semValue = new Expr\New_($self->semStack[$stackPos-(2-2)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 520 => null, 521 => null, 522 => static function ($self, $stackPos) { $self->semValue = array(); }, 523 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-3)]; }, 524 => null, 525 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 526 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 527 => static function ($self, $stackPos) { $self->semValue = new Node\ClosureUse($self->semStack[$stackPos-(2-2)], $self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 528 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 529 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 530 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 531 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 532 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 533 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 534 => null, 535 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 536 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 537 => static function ($self, $stackPos) { $self->semValue = new Name\FullyQualified(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 538 => static function ($self, $stackPos) { $self->semValue = new Name\Relative(substr($self->semStack[$stackPos-(1-1)], 10), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 539 => null, 540 => null, 541 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 542 => static function ($self, $stackPos) { $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 543 => null, 544 => null, 545 => static function ($self, $stackPos) { $self->semValue = array(); }, 546 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); foreach ($self->semValue as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } }; }, 547 => static function ($self, $stackPos) { foreach ($self->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 548 => static function ($self, $stackPos) { $self->semValue = array(); }, 549 => null, 550 => static function ($self, $stackPos) { $self->semValue = new Expr\ConstFetch($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 551 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Line($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 552 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\File($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 553 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Dir($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 554 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Class_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 555 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Trait_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 556 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Method($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 557 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Function_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 558 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Namespace_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 559 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Property($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 560 => static function ($self, $stackPos) { $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 561 => static function ($self, $stackPos) { $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 562 => static function ($self, $stackPos) { $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos-(3-1)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(3-3)], $self->tokenEndStack[$stackPos-(3-3)])), $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 563 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_SHORT; $self->semValue = new Expr\Array_($self->semStack[$stackPos-(3-2)], $attrs); }, 564 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_LONG; $self->semValue = new Expr\Array_($self->semStack[$stackPos-(4-3)], $attrs); $self->createdArrays->offsetSet($self->semValue); }, 565 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->createdArrays->offsetSet($self->semValue); }, 566 => static function ($self, $stackPos) { $self->semValue = Scalar\String_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->supportsUnicodeEscapes()); }, 567 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($self->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = new Scalar\InterpolatedString($self->semStack[$stackPos-(3-2)], $attrs); }, 568 => static function ($self, $stackPos) { $self->semValue = $self->parseLNumber($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->allowsInvalidOctals()); }, 569 => static function ($self, $stackPos) { $self->semValue = Scalar\Float_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 570 => null, 571 => null, 572 => null, 573 => static function ($self, $stackPos) { $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)], $self->tokenEndStack[$stackPos-(3-3)]), true); }, 574 => static function ($self, $stackPos) { $self->semValue = $self->parseDocString($self->semStack[$stackPos-(2-1)], '', $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(2-2)], $self->tokenEndStack[$stackPos-(2-2)]), true); }, 575 => static function ($self, $stackPos) { $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)], $self->tokenEndStack[$stackPos-(3-3)]), true); }, 576 => static function ($self, $stackPos) { $self->semValue = null; }, 577 => null, 578 => null, 579 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 580 => null, 581 => null, 582 => null, 583 => null, 584 => null, 585 => null, 586 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 587 => null, 588 => null, 589 => null, 590 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 591 => null, 592 => static function ($self, $stackPos) { $self->semValue = new Expr\MethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 593 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafeMethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 594 => static function ($self, $stackPos) { $self->semValue = null; }, 595 => null, 596 => null, 597 => null, 598 => static function ($self, $stackPos) { $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 599 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 600 => null, 601 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 602 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 603 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])), $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 604 => static function ($self, $stackPos) { $var = $self->semStack[$stackPos-(1-1)]->name; $self->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])) : $var; }, 605 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 606 => null, 607 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 608 => static function ($self, $stackPos) { $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 609 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 610 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 611 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 612 => null, 613 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 614 => null, 615 => null, 616 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 617 => null, 618 => static function ($self, $stackPos) { $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 619 => static function ($self, $stackPos) { $self->semValue = new Expr\List_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Expr\List_::KIND_LIST); $self->postprocessList($self->semValue); }, 620 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; $end = count($self->semValue)-1; if ($self->semValue[$end]->value instanceof Expr\Error) array_pop($self->semValue); }, 621 => null, 622 => static function ($self, $stackPos) { /* do nothing -- prevent default action of $$=$self->semStack[$1]. See $551. */ }, 623 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 624 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 625 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 626 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(2-2)], null, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 627 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 628 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 629 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-1)], true, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 630 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 631 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(2-2)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), true); }, 632 => static function ($self, $stackPos) { /* Create an Error node now to remember the position. We'll later either report an error, or convert this into a null element, depending on whether this is a creation or destructuring context. */ $attrs = $self->createEmptyElemAttributes($self->tokenPos); $self->semValue = new Node\ArrayItem(new Expr\Error($attrs), null, false, $attrs); }, 633 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 634 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 635 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 636 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)]); }, 637 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]); $attrs['rawValue'] = $self->semStack[$stackPos-(1-1)]; $self->semValue = new Node\InterpolatedStringPart($self->semStack[$stackPos-(1-1)], $attrs); }, 638 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 639 => null, 640 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 641 => static function ($self, $stackPos) { $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 642 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 643 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 644 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 645 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); }, 646 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 647 => static function ($self, $stackPos) { $self->semValue = new Scalar\String_($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 648 => static function ($self, $stackPos) { $self->semValue = $self->parseNumString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 649 => static function ($self, $stackPos) { $self->semValue = $self->parseNumString('-' . $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 650 => null, ]; } } '", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_PUBLIC_SET", "T_PROTECTED_SET", "T_PRIVATE_SET", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_PROPERTY_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'('", "')'", "'{'", "'}'", "'`'", "'\"'", "'$'" ); protected array $tokenToSymbol = array( 0, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 57, 171, 173, 172, 56, 173, 173, 166, 167, 54, 51, 9, 52, 53, 55, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 32, 164, 45, 17, 47, 31, 69, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 71, 173, 165, 37, 173, 170, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 168, 36, 169, 59, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 46, 48, 49, 50, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163 ); protected array $action = array( 133, 134, 135, 575, 136, 137, 1049, 766, 767, 768, 138, 41, 850, -341, 495, 1390,-32766,-32766,-32766, 1008, 841, 1145, 1146, 1147, 1141, 1140, 1139, 1148, 1142, 1143, 1144,-32766,-32766,-32766, -195, 760, 759,-32766, -194,-32766, -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, -32767, 0,-32766, 3, 4, 769, 1145, 1146, 1147, 1141, 1140, 1139, 1148, 1142, 1143, 1144, 388, 389, 448, 272, 53, 391, 773, 774, 775, 776, 433, 5, 434, 571, 337, 39, 254, 29, 298, 830, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 806, 576, 807, 808, 809, 810, 798, 799, 353, 354, 801, 802, 787, 788, 789, 791, 792, 793, 364, 833, 834, 835, 836, 837, 577, -382, 306, -382, 794, 795, 578, 579, 244, 818, 816, 817, 829, 813, 814, 1313, 38, 580, 581, 812, 582, 583, 584, 585, 1325, 586, 587, 481, 482, -628, 496, 1009, 815, 588, 589, 140, 139, -628, 133, 134, 135, 575, 136, 137, 1085, 766, 767, 768, 138, 41, -32766, -341, 1046, 1041, 1040, 1039, 1045, 1042, 1043, 1044, -32766,-32766,-32766,-32767,-32767,-32767,-32767, 106, 107, 108, 109, 110, -195, 760, 759, 1058, -194,-32766,-32766,-32766, 149,-32766, 852,-32766,-32766,-32766,-32766,-32766,-32766,-32766, 936, 303, 257, 769,-32766,-32766,-32766, 850,-32766, 297, -32766,-32766,-32766,-32766,-32766, 1371, 1355, 272, 53, 391, 773, 774, 775, 776, -625,-32766, 434,-32766,-32766,-32766, -32766, 730, -625, 830, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 806, 576, 807, 808, 809, 810, 798, 799, 353, 354, 801, 802, 787, 788, 789, 791, 792, 793, 364, 833, 834, 835, 836, 837, 577, -579, -275, 317, 794, 795, 578, 579, -577, 818, 816, 817, 829, 813, 814, 957, 926, 580, 581, 812, 582, 583, 584, 585, 144, 586, 587, 841, 336,-32766,-32766,-32766, 815, 588, 589, -628, 139, -628, 133, 134, 135, 575, 136, 137, 1082, 766, 767, 768, 138, 41,-32766, 1375, -32766,-32766,-32766,-32766,-32766,-32766,-32766, 1374, 629, 388, 389,-32766,-32766,-32766,-32766,-32766, -579, -579, 1081, 433, 321, 760, 759, -577, -577,-32766, 1293,-32766,-32766, 111, 112, 113, -579, 282, 843, 851, 623, 1400, 936, -577, 1401, 769, 333, 938, -585, 114, -579, 725, 294, 298, 1119, -584, 349, -577, 752, 272, 53, 391, 773, 774, 775, 776, 145, 86, 434, 306, 336, 336, -625, 731, -625, 830, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 806, 576, 807, 808, 809, 810, 798, 799, 353, 354, 801, 802, 787, 788, 789, 791, 792, 793, 364, 833, 834, 835, 836, 837, 577, -576, 850, -578, 794, 795, 578, 579, 845, 818, 816, 817, 829, 813, 814, 727, 926, 580, 581, 812, 582, 583, 584, 585, 740, 586, 587, 243, 1055,-32766,-32766, -85, 815, 588, 589, 878, 152, 879, 133, 134, 135, 575, 136, 137, 1087, 766, 767, 768, 138, 41, 350, 961, 960, 1058, 1058, 1058,-32766,-32766,-32766, 841,-32766, 131, 977, 978, 400, 1055, 10, 979, -576, -576, -578, -578, 378, 760, 759, 936, 973, 290, 297, 297,-32766, 846, 936, 154, -576, 79, -578, 382, 849, 936, 1058, 336, 878, 769, 879, 938, -583, -85, -576, 725, -578, 959, 108, 109, 110, 1058, 732, 272, 53, 391, 773, 774, 775, 776, 290, 155, 434, 470, 471, 472, 735, 760, 759, 830, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 806, 576, 807, 808, 809, 810, 798, 799, 353, 354, 801, 802, 787, 788, 789, 791, 792, 793, 364, 833, 834, 835, 836, 837, 577, 926, 434, 847, 794, 795, 578, 579, 926, 818, 816, 817, 829, 813, 814, 926, 398, 580, 581, 812, 582, 583, 584, 585, 452, 586, 587, 157, 87, 88, 89, 453, 815, 588, 589, 454, 152, 790, 761, 762, 763, 764, 765, 158, 766, 767, 768, 803, 804, 40, 27, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 1134, 282, 1055, 455,-32766, 994, 1288, 1287, 1289, 725, 390, 389, 938, 114, 856, 1120, 725, 769, 159, 938, 433, 672, 23, 725, 1118, 691, 692, 1058,-32766, 153, 416, 770, 771, 772, 773, 774, 775, 776, -78, -619, 839, -619, -581, 386, 387, 392, 393, 830, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 806, 828, 807, 808, 809, 810, 798, 799, 800, 827, 801, 802, 787, 788, 789, 791, 792, 793, 832, 833, 834, 835, 836, 837, 838, 161, 663, 664, 794, 795, 796, 797, 36, 818, 816, 817, 829, 813, 814, -58, -57, 805, 811, 812, 819, 820, 822, 821, -87, 823, 824, -581, -581, 128, 129, 141, 815, 826, 825, 54, 55, 56, 57, 527, 58, 59, 142, -110, 148, 162, 60, 61, -110, 62, -110, 936, 163, 164, 165, 313, 166, -581, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, 1293, -84, 953, -78, -73, -72, -71, -70, -69, -68, -67, -66, -65, 742, -46, 63, 64, -18, -575, 1286, 146, 65, 51, 66, 251, 252, 67, 68, 69, 70, 71, 72, 73, 74, 281, 31, 273, 47, 450, 528, 291, -357, 741, 1319, 1320, 529, 744, 850, 935, 151, 295, 1317, 45, 22, 530, 1284, 531, -309, 532, -305, 533, 286, 936, 534, 535, 287, 926, 292, 48, 49, 456, 385, 384, 293, 50, 536, 342, 296, 282, 1057, 376, 348, 850, 299, 300, -575, -575, 1279, 114, 307, 308, 701, 538, 539, 540, 150, 841,-32766, 1288, 1287, 1289, -575, 850, 294, 542, 543, 1402, 1305, 1306, 1307, 1308, 1310, 1302, 1303, 305, -575, 716, -110, -110, 130, 1309, 1304, -110, 593, 1288, 1287, 1289, 306, 13, 673, 75, -110, 1152, 678, 331, 332, 336, -154, -154, -154, -32766, 718, 694, -4, 936, 938, 926, 314, 478, 725, 506, 1324, -154, 705, -154, 679, -154, 695, -154, 974, 1326, -541, 306, 312, 311, 79, 849, 661, 383, 43, 320, 336, 37, 1252, 0, 0, 52, 0, 0, 977, 978, 0, 760, 759, 537,-32766, 0, 0, 0, 706, 0, 0, 912, 973, -110, -110, -110, 35, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, -531, 11, 707, 708, 31, 274, 30, 380, 955, 599, -613, 306, 627, 0, 938, 0, 850, 926, 725, -154, 1317, 1288, 1287, 1289, 44, -612, 749, 290, 750, 1194, 1196, 869, 309, 310, 917, 1018, 995, 1002, 992, 383, -575, 446, 1003, 915, 990, 1123, 304, 1126, 381, 1127, 977, 978, 1124, 1125, 1131, 537, 1279, 1314, 861, 330, 760, 759, 132, 541, 973, -110, -110, -110, 1341, 1359, 1393, 1293, 666, 542, 543, -611, 1305, 1306, 1307, 1308, 1310, 1302, 1303, -585, -584, -583, -582, 21, -525, 1309, 1304, 1, 32, 760, 759, 33, 938,-32766, -278, 77, 725, -4, -16, 1286, 332, 336, 42, -575, -575, 46,-32766,-32766,-32766, 76,-32766, 80,-32766, 81,-32766, 82, 83,-32766, 84, -575, 85, 147,-32766,-32766,-32766, 156,-32766, 160,-32766,-32766, 249, 379, 1286, -575,-32766, 430, 31, 273, 338,-32766,-32766,-32766, 365,-32766, 366, -32766,-32766,-32766, 850, 850,-32766, 367, 1317, 368, 369, -32766,-32766,-32766, 370, 371, 372,-32766,-32766, 373, 374, 375, 377,-32766, 430, 447, 570, 31, 274, -276, -275, 15, 16, 78, 17,-32766, 18, 20, 414, 850, -110, -110, 497, 1317, 1279, -110, 498, 505, 508, 509, 510, 511, 515, 516, -110, 517, 525, 604, 711, 1088, 1084, 1234, 543,-32766, 1305, 1306, 1307, 1308, 1310, 1302, 1303, 1315, 1086, 1083, -50, 1064, 1274, 1309, 1304, 1279, 1060, -280, -102, 14, 19, 306, 24, 77, 79, 415, 303, 413, 332, 336, 336, 618, 624, 543, 652, 1305, 1306, 1307, 1308, 1310, 1302, 1303, 717, 143, 1238, 1292, 1235, 1372, 1309, 1304, 726, 729, 733,-32766, 734, 736, 737, 738, 77, 1286, 419, 739, 743, 332, 336, 728,-32766, -32766,-32766, 746,-32766, 913,-32766, 1397,-32766, 1399, 872, -32766, 871, 967, 1010, 1398,-32766,-32766,-32766, 966,-32766, 964,-32766,-32766, 965, 968, 1286, 1267,-32766, 430, 946, 956, 944,-32766,-32766,-32766, 1000,-32766, 1001,-32766,-32766, -32766, 650, 1396,-32766, 1353, 1342, 1360, 1369,-32766,-32766, -32766, 1318,-32766, 336,-32766,-32766, 936, 0, 1286, 0, -32766, 430, 0, 0, 0,-32766,-32766,-32766, 0,-32766, 0,-32766,-32766,-32766, 0, 0,-32766, 0, 0, 936, 0,-32766,-32766,-32766, 0,-32766, 0,-32766,-32766, 0, 0, 1286, 0,-32766, 430, 0, 0, 0,-32766,-32766, -32766, 0,-32766, 0,-32766,-32766,-32766, 0, 0,-32766, 0, 0, 0, 501,-32766,-32766,-32766, 0,-32766, 0, -32766,-32766, 0, 0, 1286, 606,-32766, 430, 0, 0, 0,-32766,-32766,-32766, 0,-32766, 0,-32766,-32766,-32766, 926, 0,-32766, 2, 0, 0, 0,-32766,-32766,-32766, 0, 0, 0,-32766,-32766, 0, -253, -253, -253,-32766, 430, 0, 383, 926, 0, 0, 0, 0, 0, 0, 0,-32766, 0, 977, 978, 0, 0, 0, 537, -252, -252, -252, 0, 0, 0, 383, 912, 973, -110, -110, -110, 0, 0, 0, 0, 0, 977, 978, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 912, 973, -110, -110, -110,-32766, 0, 0, 0, 0, 938, 1286, 0, 0, 725, -253, 0, 0,-32766,-32766,-32766, 0,-32766, 0,-32766, 0,-32766, 0, 0,-32766, 0, 0, 0, 938,-32766,-32766,-32766, 725, -252, 0,-32766, -32766, 0, 0, 0, 0,-32766, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-32766 ); protected array $actionCheck = array( 3, 4, 5, 6, 7, 8, 1, 10, 11, 12, 13, 14, 83, 9, 32, 86, 10, 11, 12, 32, 81, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 10, 11, 12, 9, 38, 39, 31, 9, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 0, 31, 9, 9, 58, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 107, 108, 109, 72, 73, 74, 75, 76, 77, 78, 117, 9, 81, 86, 71, 152, 153, 9, 31, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 107, 163, 109, 127, 128, 129, 130, 15, 132, 133, 134, 135, 136, 137, 1, 9, 140, 141, 142, 143, 144, 145, 146, 151, 148, 149, 138, 139, 1, 168, 164, 155, 156, 157, 9, 159, 9, 3, 4, 5, 6, 7, 8, 167, 10, 11, 12, 13, 14, 117, 167, 119, 120, 121, 122, 123, 124, 125, 126, 10, 11, 12, 45, 46, 47, 48, 49, 50, 51, 52, 53, 167, 38, 39, 142, 167, 10, 11, 12, 9, 31, 1, 33, 34, 35, 36, 37, 38, 39, 1, 167, 9, 58, 10, 11, 12, 83, 31, 166, 33, 34, 35, 36, 37, 1, 1, 72, 73, 74, 75, 76, 77, 78, 1, 31, 81, 33, 34, 35, 36, 32, 9, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 71, 167, 9, 127, 128, 129, 130, 71, 132, 133, 134, 135, 136, 137, 1, 85, 140, 141, 142, 143, 144, 145, 146, 168, 148, 149, 81, 172, 10, 11, 12, 155, 156, 157, 165, 159, 167, 3, 4, 5, 6, 7, 8, 167, 10, 11, 12, 13, 14, 31, 1, 33, 34, 35, 10, 10, 11, 12, 9, 52, 107, 108, 10, 11, 12, 10, 11, 138, 139, 1, 117, 9, 38, 39, 138, 139, 31, 1, 33, 34, 54, 55, 56, 154, 58, 81, 164, 1, 81, 1, 154, 84, 58, 9, 164, 166, 70, 168, 168, 31, 31, 164, 166, 9, 168, 168, 72, 73, 74, 75, 76, 77, 78, 168, 168, 81, 163, 172, 172, 165, 32, 167, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 71, 83, 71, 127, 128, 129, 130, 161, 132, 133, 134, 135, 136, 137, 168, 85, 140, 141, 142, 143, 144, 145, 146, 168, 148, 149, 98, 117, 117, 117, 32, 155, 156, 157, 107, 159, 109, 3, 4, 5, 6, 7, 8, 167, 10, 11, 12, 13, 14, 9, 73, 74, 142, 142, 142, 10, 11, 12, 81, 141, 15, 118, 119, 107, 117, 109, 123, 138, 139, 138, 139, 9, 38, 39, 1, 132, 166, 166, 166, 117, 81, 1, 15, 154, 166, 154, 9, 160, 1, 142, 172, 107, 58, 109, 164, 166, 98, 168, 168, 168, 123, 51, 52, 53, 142, 32, 72, 73, 74, 75, 76, 77, 78, 166, 15, 81, 133, 134, 135, 32, 38, 39, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 85, 81, 161, 127, 128, 129, 130, 85, 132, 133, 134, 135, 136, 137, 85, 9, 140, 141, 142, 143, 144, 145, 146, 9, 148, 149, 15, 10, 11, 12, 9, 155, 156, 157, 9, 159, 3, 4, 5, 6, 7, 8, 15, 10, 11, 12, 13, 14, 31, 102, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 127, 58, 117, 9, 117, 164, 160, 161, 162, 168, 107, 108, 164, 70, 9, 169, 168, 58, 15, 164, 117, 76, 77, 168, 1, 76, 77, 142, 141, 102, 103, 72, 73, 74, 75, 76, 77, 78, 17, 165, 81, 167, 71, 107, 108, 107, 108, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 15, 112, 113, 127, 128, 129, 130, 15, 132, 133, 134, 135, 136, 137, 17, 17, 140, 141, 142, 143, 144, 145, 146, 32, 148, 149, 138, 139, 17, 17, 17, 155, 156, 157, 2, 3, 4, 5, 6, 7, 8, 17, 102, 17, 17, 13, 14, 107, 16, 109, 1, 17, 17, 17, 114, 17, 168, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1, 32, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 51, 52, 32, 71, 81, 32, 57, 71, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 32, 71, 72, 73, 74, 75, 32, 169, 32, 79, 80, 81, 32, 83, 32, 32, 38, 87, 88, 89, 90, 117, 92, 36, 94, 36, 96, 36, 1, 99, 100, 36, 85, 36, 104, 105, 106, 107, 108, 36, 110, 111, 36, 38, 58, 141, 116, 117, 83, 38, 38, 138, 139, 123, 70, 138, 139, 78, 128, 129, 130, 71, 81, 86, 160, 161, 162, 154, 83, 31, 140, 141, 84, 143, 144, 145, 146, 147, 148, 149, 150, 168, 81, 118, 119, 168, 156, 157, 123, 90, 160, 161, 162, 163, 98, 91, 166, 132, 83, 97, 170, 171, 172, 76, 77, 78, 141, 93, 95, 0, 1, 164, 85, 115, 98, 168, 98, 151, 91, 81, 93, 101, 95, 101, 97, 132, 151, 154, 163, 137, 136, 166, 160, 114, 107, 164, 136, 172, 168, 170, -1, -1, 71, -1, -1, 118, 119, -1, 38, 39, 123, 141, -1, -1, -1, 117, -1, -1, 131, 132, 133, 134, 135, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 154, 154, 141, 142, 71, 72, 154, 154, 159, 158, 166, 163, 158, -1, 164, -1, 83, 85, 168, 169, 87, 160, 161, 162, 164, 166, 164, 166, 164, 60, 61, 164, 138, 139, 164, 164, 164, 164, 164, 107, 71, 109, 164, 164, 164, 164, 114, 164, 154, 164, 118, 119, 164, 164, 164, 123, 123, 165, 165, 168, 38, 39, 168, 131, 132, 133, 134, 135, 165, 165, 165, 1, 165, 140, 141, 166, 143, 144, 145, 146, 147, 148, 149, 166, 166, 166, 166, 155, 166, 156, 157, 166, 166, 38, 39, 166, 164, 75, 167, 166, 168, 169, 32, 81, 171, 172, 166, 138, 139, 166, 88, 89, 90, 166, 92, 166, 94, 166, 96, 166, 166, 99, 166, 154, 166, 166, 104, 105, 106, 166, 75, 166, 110, 111, 166, 168, 81, 168, 116, 117, 71, 72, 166, 88, 89, 90, 166, 92, 166, 94, 128, 96, 83, 83, 99, 166, 87, 166, 166, 104, 105, 106, 166, 166, 166, 110, 111, 166, 166, 166, 166, 116, 117, 166, 166, 71, 72, 167, 167, 167, 167, 159, 167, 128, 167, 167, 167, 83, 118, 119, 167, 87, 123, 123, 167, 167, 167, 167, 167, 167, 167, 167, 132, 167, 167, 167, 167, 167, 167, 167, 141, 141, 143, 144, 145, 146, 147, 148, 149, 167, 167, 167, 32, 167, 167, 156, 157, 123, 167, 167, 167, 167, 167, 163, 167, 166, 166, 169, 167, 167, 171, 172, 172, 167, 167, 141, 167, 143, 144, 145, 146, 147, 148, 149, 167, 32, 167, 167, 167, 167, 156, 157, 168, 168, 168, 75, 168, 168, 168, 168, 166, 81, 169, 168, 168, 171, 172, 168, 88, 89, 90, 169, 92, 169, 94, 169, 96, 169, 169, 99, 169, 169, 169, 169, 104, 105, 106, 169, 75, 169, 110, 111, 169, 169, 81, 169, 116, 117, 169, 169, 169, 88, 89, 90, 169, 92, 169, 94, 128, 96, 169, 169, 99, 169, 169, 169, 169, 104, 105, 106, 171, 75, 172, 110, 111, 1, -1, 81, -1, 116, 117, -1, -1, -1, 88, 89, 90, -1, 92, -1, 94, 128, 96, -1, -1, 99, -1, -1, 1, -1, 104, 105, 106, -1, 75, -1, 110, 111, -1, -1, 81, -1, 116, 117, -1, -1, -1, 88, 89, 90, -1, 92, -1, 94, 128, 96, -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, -1, 75, -1, 110, 111, -1, -1, 81, 82, 116, 117, -1, -1, -1, 88, 89, 90, -1, 92, -1, 94, 128, 96, 85, -1, 99, 166, -1, -1, -1, 104, 105, 106, -1, -1, -1, 110, 111, -1, 101, 102, 103, 116, 117, -1, 107, 85, -1, -1, -1, -1, -1, -1, -1, 128, -1, 118, 119, -1, -1, -1, 123, 101, 102, 103, -1, -1, -1, 107, 131, 132, 133, 134, 135, -1, -1, -1, -1, -1, 118, 119, -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, -1, 131, 132, 133, 134, 135, 75, -1, -1, -1, -1, 164, 81, -1, -1, 168, 169, -1, -1, 88, 89, 90, -1, 92, -1, 94, -1, 96, -1, -1, 99, -1, -1, -1, 164, 104, 105, 106, 168, 169, -1, 110, 111, -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 128 ); protected array $actionBase = array( 0, 155, -3, 313, 471, 471, 881, 963, 1365, 1388, 892, 134, 515, -61, 367, 524, 524, 801, 524, 209, 510, 283, 517, 517, 517, 920, 855, 628, 628, 855, 628, 1053, 1053, 1053, 1053, 1086, 1086, 1320, 1320, 1353, 1254, 1221, 1449, 1449, 1449, 1449, 1449, 1287, 1449, 1449, 1449, 1449, 1449, 1287, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 201, -13, 44, 365, 744, 1102, 1120, 1107, 1121, 1096, 1095, 1103, 1108, 1122, 1183, 1185, 837, 1186, 1187, 1182, 1188, 1110, 938, 1098, 1118, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 323, 482, 334, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 964, 964, 21, 21, 21, 324, 1135, 1100, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 297, 204, 1000, 187, 170, 170, 6, 6, 6, 6, 6, 692, 53, 1101, 819, 819, 138, 138, 138, 138, 542, 14, 347, 355, -41, 348, 232, 384, 384, 487, 487, 554, 554, 349, 349, 554, 554, 554, 399, 399, 399, 399, 208, 215, 366, 364, -7, 864, 224, 224, 224, 224, 864, 864, 864, 864, 829, 1190, 864, 1011, 1027, 864, 864, 368, 767, 767, 925, 305, 305, 305, 767, 421, -71, -71, 421, 380, -71, 225, 286, 556, 847, 572, 543, 556, 640, 771, 233, 148, 826, 605, 826, 1094, 831, 831, 802, 792, 921, 1140, 1123, 874, 1176, 876, 1178, 420, 9, 791, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1191, 519, 1094, 436, 1191, 1191, 1191, 519, 519, 519, 519, 519, 519, 519, 519, 805, 519, 519, 641, 436, 614, 618, 436, 860, 519, 877, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, -18, 201, 201, -13, 292, 292, 201, 216, 5, 292, 292, 292, 292, 201, 201, 201, 201, 605, 840, 882, 607, 435, 885, 29, 840, 840, 840, 4, 113, 25, 841, 843, 393, 835, 835, 835, 869, 956, 956, 835, 839, 835, 869, 835, 835, 956, 956, 879, 956, 146, 609, 373, 514, 616, 956, 272, 835, 835, 835, 835, 854, 956, 45, 68, 620, 835, 203, 191, 835, 835, 854, 848, 828, 846, 956, 956, 956, 854, 499, 846, 846, 846, 893, 895, 873, 822, 363, 341, 674, 127, 783, 822, 822, 835, 601, 873, 822, 873, 822, 880, 822, 822, 822, 873, 822, 839, 477, 822, 779, 786, 663, 74, 822, 51, 978, 980, 743, 982, 971, 984, 1038, 985, 987, 1125, 953, 999, 974, 989, 1039, 960, 957, 836, 763, 764, 878, 827, 951, 838, 838, 838, 948, 949, 838, 838, 838, 838, 838, 838, 838, 838, 763, 923, 884, 853, 1013, 765, 776, 1069, 820, 1145, 823, 1011, 978, 987, 789, 974, 989, 960, 957, 800, 799, 797, 798, 796, 795, 793, 794, 808, 1071, 1072, 990, 825, 778, 1049, 1020, 1143, 922, 1022, 1023, 1050, 1073, 898, 1083, 1147, 844, 1149, 1150, 924, 1028, 1126, 838, 940, 875, 934, 1027, 950, 763, 935, 1084, 1085, 1043, 824, 1054, 1058, 998, 870, 842, 936, 1152, 1029, 1032, 1033, 1127, 1129, 891, 1044, 962, 1059, 872, 1099, 1060, 1061, 1062, 1063, 1130, 1153, 1131, 890, 1132, 901, 858, 1041, 856, 1154, 504, 851, 857, 866, 1035, 536, 1007, 1136, 1134, 1155, 1064, 1065, 1067, 1159, 1161, 994, 902, 1046, 867, 1048, 1042, 903, 904, 606, 865, 1087, 845, 849, 859, 622, 672, 1164, 1165, 1167, 996, 830, 833, 905, 909, 1088, 832, 1092, 1170, 737, 910, 1171, 1070, 787, 788, 690, 750, 749, 790, 868, 1137, 883, 852, 850, 1034, 788, 834, 911, 1172, 912, 914, 916, 1068, 919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 784, 784, 784, 784, 784, 784, 784, 784, 784, 628, 628, 628, 628, 784, 784, 784, 784, 784, 784, 784, 628, 784, 784, 784, 628, 628, 0, 0, 628, 0, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 758, 758, 612, 612, 612, 612, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 612, 612, 0, 612, 612, 612, 612, 612, 612, 612, 612, 879, 758, 758, 758, 758, 305, 305, 305, 305, -96, -96, 758, 758, 380, 758, 380, 758, 758, 305, 305, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 0, 0, 0, 436, -71, 758, 839, 839, 839, 839, 758, 758, 758, 758, -71, -71, 758, 414, 414, 758, 758, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 436, 0, 0, 839, 839, 758, 380, 879, 328, 758, 0, 0, 0, 0, 436, 839, 436, 519, -71, -71, 519, 519, 292, 201, 328, 596, 596, 596, 596, 0, 0, 605, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 839, 0, 879, 0, 839, 839, 839, 0, 0, 0, 0, 0, 0, 0, 0, 956, 0, 0, 0, 0, 0, 0, 0, 839, 0, 956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 838, 870, 0, 0, 870, 0, 838, 838, 838, 0, 0, 0, 865, 832 ); protected array $actionDefault = array( 3,32767,32767,32767, 102, 102,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 100, 32767, 631, 631, 631, 631,32767,32767, 257, 102,32767, 32767, 500, 415, 415, 415,32767,32767,32767, 573, 573, 573, 573, 573, 17,32767,32767,32767,32767,32767,32767, 32767, 500,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 36, 7, 8, 10, 11, 49, 338, 100,32767,32767,32767,32767,32767,32767,32767,32767, 102, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767, 624,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 403, 494, 504, 482, 483, 485, 486, 414, 574, 630, 344, 627, 342, 413, 146, 354, 343, 245, 261, 505, 262, 506, 509, 510, 218, 400, 150, 151, 446, 501, 448, 499, 503, 447, 420, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 418, 419, 502,32767,32767, 479, 478, 477, 444,32767, 32767,32767,32767,32767,32767,32767,32767, 102,32767, 445, 449, 417, 452, 450, 451, 468, 469, 466, 467, 470, 32767, 323,32767,32767,32767, 471, 472, 473, 474, 381, 379,32767,32767, 111, 323, 111,32767,32767, 459, 460, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767, 517, 567, 476,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767, 102,32767,32767, 32767, 100, 569, 441, 443, 537, 454, 455, 453, 421, 32767, 542,32767, 102,32767, 544,32767,32767,32767,32767, 32767,32767,32767, 568,32767, 575, 575,32767, 530, 100, 196,32767, 543, 196, 196,32767,32767,32767,32767,32767, 32767,32767,32767, 638, 530, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,32767, 196, 110,32767, 32767,32767, 100, 196, 196, 196, 196, 196, 196, 196, 196, 545, 196, 196, 191,32767, 271, 273, 102, 592, 196, 547,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 530, 464, 139,32767, 532, 139, 575, 456, 457, 458, 575, 575, 575, 319, 296,32767,32767,32767,32767,32767, 545, 545, 100, 100, 100, 100,32767,32767,32767,32767, 111, 516, 99, 99, 99, 99, 99, 103, 101,32767, 32767,32767,32767, 226,32767, 101, 101, 99,32767, 101, 101,32767,32767, 226, 228, 215, 230,32767, 596, 597, 226, 101, 230, 230, 230, 250, 250, 519, 325, 101, 99, 101, 101, 198, 325, 325,32767, 101, 519, 325, 519, 325, 200, 325, 325, 325, 519, 325,32767, 101, 325, 217, 403, 99, 99, 325,32767,32767,32767, 532, 32767,32767,32767,32767,32767,32767,32767, 225,32767,32767, 32767,32767,32767,32767,32767,32767, 562,32767, 580, 594, 462, 463, 465, 579, 577, 487, 488, 489, 490, 491, 492, 493, 496, 626,32767, 536,32767,32767,32767, 353, 32767, 636,32767,32767,32767, 9, 74, 525, 42, 43, 51, 57, 551, 552, 553, 554, 548, 549, 555, 550, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767, 637,32767, 575,32767, 32767,32767,32767, 461, 557, 602,32767,32767, 576, 629, 32767,32767,32767,32767,32767,32767,32767,32767, 139,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 562, 32767, 137,32767,32767,32767,32767,32767,32767,32767,32767, 558,32767,32767,32767, 575,32767,32767,32767,32767, 321, 318,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767, 575,32767,32767, 32767,32767,32767, 298,32767, 315,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767, 399, 532, 301, 303, 304,32767, 32767,32767,32767, 375,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767, 153, 153, 3, 3, 356, 153, 153, 153, 356, 356, 153, 356, 356, 356, 153, 153, 153, 153, 153, 153, 283, 186, 265, 268, 250, 250, 153, 367, 153 ); protected array $goto = array( 202, 169, 202, 202, 202, 1056, 842, 712, 359, 670, 671, 598, 688, 689, 690, 748, 653, 655, 591, 929, 675, 930, 1090, 721, 699, 702, 1028, 710, 719, 1024, 171, 171, 171, 171, 226, 203, 199, 199, 181, 183, 221, 199, 199, 199, 199, 199, 1180, 200, 200, 200, 200, 200, 1180, 193, 194, 195, 196, 197, 198, 223, 221, 224, 550, 551, 431, 552, 555, 556, 557, 558, 559, 560, 561, 562, 172, 173, 174, 201, 175, 176, 177, 170, 178, 179, 180, 182, 220, 222, 225, 245, 248, 259, 260, 262, 263, 264, 265, 266, 267, 268, 269, 275, 276, 277, 278, 288, 289, 326, 327, 328, 437, 438, 439, 613, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 184, 242, 185, 194, 195, 196, 197, 198, 223, 204, 205, 206, 207, 246, 186, 187, 208, 188, 209, 205, 189, 247, 204, 168, 210, 211, 190, 212, 213, 214, 191, 215, 216, 192, 217, 218, 219, 285, 283, 285, 285, 870, 1089, 1091, 1094, 615, 255, 255, 255, 255, 255, 441, 677, 614, 1130, 884, 867, 436, 329, 323, 324, 345, 608, 440, 346, 442, 654, 724, 492, 521, 715, 896, 1128, 993, 883, 494, 253, 253, 253, 253, 250, 256, 489, 1361, 1362, 1386, 1386, 925, 920, 921, 934, 876, 922, 873, 923, 924, 874, 877, 363, 928, 881, 480, 480, 868, 880, 1386, 848, 474, 363, 363, 480, 1117, 1112, 1113, 1114, 1229, 351, 362, 362, 362, 362, 1389, 1389, 429, 363, 363, 1017, 902, 363, 989, 1403, 747, 360, 361, 566, 1026, 1021, 1056, 1285, 1285, 1285, 569, 352, 351, 363, 363, 605, 1056, 1285, 848, 1056, 848, 1056, 1056, 1137, 1138, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 357, 1261, 962, 637, 674, 1285, 1262, 1265, 963, 1266, 1285, 1285, 1285, 1285, 1376, 435, 1285, 628, 402, 1285, 1285, 1368, 1368, 1368, 1368, 1347, 574, 567, 1062, 1061, 1059, 1059, 958, 958, 697, 970, 1014, 942, 1051, 1067, 1068, 943, 565, 565, 565, 603, 513, 522, 514, 863, 676, 863, 565, 709, 520, 1176, 318, 567, 574, 600, 601, 319, 611, 617, 844, 633, 634, 1080, 8, 709, 9, 449, 709, 28, 1065, 1066, 467, 335, 316, 569, 698, 987, 987, 987, 987, 1363, 1364, 467, 639, 639, 981, 988, 609, 631, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1335, 1335, 863, 469, 682, 469, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 347, 258, 258, 626, 640, 643, 644, 645, 646, 667, 668, 669, 723, 632, 460, 860, 460, 460, 460, 1358, 1358, 1358, 553, 553, 1278, 985, 420, 720, 553, 1358, 553, 553, 553, 553, 553, 553, 553, 553, 451, 889, 568, 595, 568, 647, 649, 651, 568, 976, 595, 411, 405, 473, 886, 1276, 1370, 1370, 1370, 1370, 909, 866, 909, 909, 1036, 483, 612, 484, 485, 751, 563, 563, 563, 563, 894, 619, 1101, 1394, 1395, 412, 1332, 1332, 898, 490, 1151, 1354, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 279, 1105, 334, 334, 334, 998, 892, 0, 1280, 1047, 0, 0, 863, 0, 0, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 0, 0, 460, 1103, 554, 554, 0, 1356, 1356, 1103, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 621, 622, 417, 418, 947, 1166, 0, 686, 0, 687, 0, 422, 423, 424, 0, 700, 1033, 0, 425, 1281, 1282, 0, 1268, 355, 888, 0, 680, 1012, 858, 0, 0, 0, 882, 443, 0, 1268, 0, 897, 885, 1100, 1104, 0, 0, 0, 1275, 0, 443, 0, 1283, 1344, 1345, 996, 0, 0, 1063, 1063, 0, 0, 0, 681, 1074, 1070, 1071, 404, 407, 616, 620, 0, 0, 0, 0, 0, 0, 0, 986, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1149, 901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1031, 1031 ); protected array $gotoCheck = array( 42, 42, 42, 42, 42, 73, 6, 73, 97, 86, 86, 48, 86, 86, 86, 48, 48, 48, 127, 65, 48, 65, 131, 9, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 23, 23, 23, 23, 15, 130, 130, 130, 134, 5, 5, 5, 5, 5, 66, 66, 8, 8, 35, 26, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 8, 84, 8, 8, 35, 8, 49, 35, 84, 5, 5, 5, 5, 5, 5, 185, 185, 185, 191, 191, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 157, 157, 27, 15, 191, 12, 159, 14, 14, 157, 15, 15, 15, 15, 159, 177, 24, 24, 24, 24, 191, 191, 43, 14, 14, 50, 45, 14, 50, 14, 50, 97, 97, 50, 50, 50, 73, 73, 73, 73, 14, 177, 177, 14, 14, 181, 73, 73, 12, 73, 12, 73, 73, 148, 148, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 188, 79, 79, 56, 56, 73, 79, 79, 79, 79, 73, 73, 73, 73, 190, 13, 73, 13, 62, 73, 73, 9, 9, 9, 9, 14, 76, 76, 119, 119, 89, 89, 9, 9, 89, 89, 103, 73, 89, 89, 89, 73, 19, 19, 19, 104, 163, 14, 163, 22, 64, 22, 19, 7, 163, 158, 76, 76, 76, 76, 76, 76, 76, 76, 7, 76, 76, 115, 46, 7, 46, 113, 7, 76, 120, 120, 19, 178, 178, 14, 117, 19, 19, 19, 19, 187, 187, 19, 108, 108, 19, 19, 2, 2, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 179, 179, 22, 83, 121, 83, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 29, 5, 5, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 80, 23, 18, 23, 23, 23, 134, 134, 134, 165, 165, 14, 93, 93, 93, 165, 134, 165, 165, 165, 165, 165, 165, 165, 165, 83, 39, 9, 9, 9, 85, 85, 85, 9, 92, 9, 28, 9, 9, 37, 169, 134, 134, 134, 134, 25, 25, 25, 25, 110, 9, 9, 9, 9, 99, 107, 107, 107, 107, 9, 107, 133, 9, 9, 31, 180, 180, 41, 160, 151, 134, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 24, 136, 24, 24, 24, 96, 9, -1, 20, 114, -1, -1, 22, -1, -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, 23, 134, 182, 182, -1, 134, 134, 134, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 17, 17, 82, 82, 17, 17, -1, 82, -1, 82, -1, 82, 82, 82, -1, 82, 17, -1, 82, 20, 20, -1, 20, 82, 17, -1, 17, 17, 20, -1, -1, -1, 17, 118, -1, 20, -1, 16, 16, 16, 16, -1, -1, -1, 17, -1, 118, -1, 20, 20, 20, 16, -1, -1, 118, 118, -1, -1, -1, 118, 118, 118, 118, 59, 59, 59, 59, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, 107 ); protected array $gotoBase = array( 0, 0, -339, 0, 0, 174, -7, 339, 171, 10, 0, 0, -69, -36, -78, -186, 130, 81, 114, 66, 117, 0, 62, 160, 240, 468, 178, 225, 118, 112, 0, 45, 0, 0, 0, -195, 0, 119, 0, 122, 0, 44, -1, 226, 0, 227, -387, 0, -715, 182, 241, 0, 0, 0, 0, 0, 256, 0, 0, 570, 0, 0, 269, 0, 102, 3, -63, 0, 0, 0, 0, 0, 0, -5, 0, 0, -31, 0, 0, -120, 110, 53, 54, 120, -286, -33, -724, 0, 0, 40, 0, 0, 124, 129, 0, 0, 61, -488, 0, 67, 0, 0, 0, 294, 295, 0, 0, 453, 141, 0, 100, 0, 0, 83, -3, 82, 0, 86, 318, 38, 78, 107, 0, 0, 0, 0, 0, 16, 0, 0, 168, 20, 0, 108, 163, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 43, 0, 0, 0, 0, 0, 193, 101, -38, 46, 0, 0, -166, 0, 195, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, -60, 42, 157, 251, 243, 297, 0, 0, -97, 0, 1, 263, 0, 276, -101, 0, 0 ); protected array $gotoDefault = array( -32768, 526, 755, 7, 756, 951, 831, 840, 590, 544, 722, 356, 641, 432, 1352, 927, 1165, 610, 859, 1294, 1300, 468, 862, 340, 745, 939, 910, 911, 408, 395, 875, 406, 665, 642, 507, 895, 464, 887, 499, 890, 463, 899, 167, 428, 524, 903, 6, 906, 572, 937, 991, 396, 914, 397, 693, 916, 594, 918, 919, 403, 409, 410, 1170, 602, 638, 931, 261, 596, 932, 394, 933, 941, 399, 401, 703, 479, 518, 512, 421, 1132, 597, 625, 662, 457, 486, 636, 648, 635, 493, 444, 426, 339, 975, 983, 500, 477, 997, 358, 1005, 753, 1178, 656, 502, 1013, 657, 1020, 1023, 545, 546, 491, 1035, 271, 1038, 503, 1048, 26, 683, 1053, 1054, 684, 658, 1076, 659, 685, 660, 1078, 476, 592, 1179, 475, 1093, 1099, 465, 1102, 1340, 466, 1106, 270, 1109, 284, 427, 445, 1115, 1116, 12, 1122, 713, 714, 25, 280, 523, 1150, 704,-32768,-32768,-32768,-32768, 462, 1177, 461, 1249, 1251, 573, 504, 1269, 301, 1272, 696, 519, 1277, 458, 1343, 459, 547, 487, 325, 548, 1387, 315, 343, 322, 564, 302, 344, 549, 488, 1349, 1357, 341, 34, 1377, 1388, 607, 630 ); protected array $ruleToNonTerminal = array( 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 50, 69, 69, 72, 72, 71, 70, 70, 63, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 80, 26, 26, 27, 27, 27, 27, 27, 88, 88, 90, 90, 83, 83, 91, 91, 92, 92, 92, 84, 84, 87, 87, 85, 85, 93, 94, 94, 57, 57, 65, 65, 68, 68, 68, 67, 95, 95, 96, 58, 58, 58, 58, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 55, 55, 51, 51, 105, 53, 53, 106, 52, 52, 54, 54, 64, 64, 64, 64, 81, 81, 109, 109, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 110, 110, 110, 115, 115, 115, 115, 89, 89, 118, 118, 118, 119, 119, 116, 116, 120, 120, 122, 122, 123, 123, 117, 124, 124, 121, 125, 125, 125, 125, 113, 113, 82, 82, 82, 20, 20, 20, 128, 128, 128, 128, 129, 129, 129, 127, 126, 126, 131, 131, 131, 130, 130, 60, 132, 132, 133, 61, 135, 135, 136, 136, 137, 137, 86, 138, 138, 138, 138, 138, 138, 138, 143, 143, 144, 144, 145, 145, 145, 145, 145, 146, 147, 147, 142, 142, 139, 139, 141, 141, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 140, 150, 150, 152, 151, 151, 153, 153, 114, 154, 154, 156, 156, 156, 155, 155, 62, 104, 157, 157, 56, 56, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 164, 165, 165, 166, 158, 158, 163, 163, 167, 168, 168, 169, 170, 171, 171, 171, 171, 19, 19, 73, 73, 73, 73, 159, 159, 159, 159, 173, 173, 162, 162, 162, 160, 160, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 180, 180, 180, 108, 182, 182, 182, 182, 161, 161, 161, 161, 161, 161, 161, 161, 59, 59, 176, 176, 176, 176, 176, 183, 183, 172, 172, 172, 172, 184, 184, 184, 184, 184, 184, 74, 74, 66, 66, 66, 66, 134, 134, 134, 134, 187, 186, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 185, 185, 185, 185, 107, 181, 189, 189, 188, 188, 190, 190, 190, 190, 190, 190, 190, 190, 178, 178, 178, 178, 177, 192, 191, 191, 191, 191, 191, 191, 191, 191, 193, 193, 193, 193 ); protected array $ruleToLength = array( 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 4, 3, 5, 4, 3, 4, 1, 3, 4, 1, 1, 8, 7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 1, 1, 1, 1, 8, 9, 7, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 7, 9, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 2, 4, 4, 3, 3, 1, 3, 1, 1, 3, 2, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 6, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 0, 2, 0, 5, 8, 1, 3, 3, 0, 2, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 2, 1, 1, 0, 4, 2, 1, 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1 ); protected function initReduceCallbacks(): void { $this->reduceCallbacks = [ 0 => null, 1 => static function ($self, $stackPos) { $self->semValue = $self->handleNamespaces($self->semStack[$stackPos-(1-1)]); }, 2 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];; }, 3 => static function ($self, $stackPos) { $self->semValue = array(); }, 4 => static function ($self, $stackPos) { $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);; if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 5 => null, 6 => null, 7 => null, 8 => null, 9 => null, 10 => null, 11 => null, 12 => null, 13 => null, 14 => null, 15 => null, 16 => null, 17 => null, 18 => null, 19 => null, 20 => null, 21 => null, 22 => null, 23 => null, 24 => null, 25 => null, 26 => null, 27 => null, 28 => null, 29 => null, 30 => null, 31 => null, 32 => null, 33 => null, 34 => null, 35 => null, 36 => null, 37 => null, 38 => null, 39 => null, 40 => null, 41 => null, 42 => null, 43 => null, 44 => null, 45 => null, 46 => null, 47 => null, 48 => null, 49 => null, 50 => null, 51 => null, 52 => null, 53 => null, 54 => null, 55 => null, 56 => null, 57 => null, 58 => null, 59 => null, 60 => null, 61 => null, 62 => null, 63 => null, 64 => null, 65 => null, 66 => null, 67 => null, 68 => null, 69 => null, 70 => null, 71 => null, 72 => null, 73 => null, 74 => null, 75 => null, 76 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; if ($self->semValue === "emitError(new Error('Cannot use "getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]))); }, 77 => null, 78 => null, 79 => null, 80 => null, 81 => null, 82 => null, 83 => null, 84 => null, 85 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 86 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 87 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 88 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 89 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 90 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 91 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 92 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 93 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 94 => null, 95 => static function ($self, $stackPos) { $self->semValue = new Name(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 96 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 97 => static function ($self, $stackPos) { /* nothing */ }, 98 => static function ($self, $stackPos) { /* nothing */ }, 99 => static function ($self, $stackPos) { /* nothing */ }, 100 => static function ($self, $stackPos) { $self->emitError(new Error('A trailing comma is not allowed here', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]))); }, 101 => null, 102 => null, 103 => static function ($self, $stackPos) { $self->semValue = new Node\Attribute($self->semStack[$stackPos-(1-1)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 104 => static function ($self, $stackPos) { $self->semValue = new Node\Attribute($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 105 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 106 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 107 => static function ($self, $stackPos) { $self->semValue = new Node\AttributeGroup($self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 108 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 109 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 110 => static function ($self, $stackPos) { $self->semValue = []; }, 111 => null, 112 => null, 113 => null, 114 => null, 115 => static function ($self, $stackPos) { $self->semValue = new Stmt\HaltCompiler($self->handleHaltCompiler(), $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 116 => static function ($self, $stackPos) { $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos-(3-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $self->checkNamespace($self->semValue); }, 117 => static function ($self, $stackPos) { $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $self->checkNamespace($self->semValue); }, 118 => static function ($self, $stackPos) { $self->semValue = new Stmt\Namespace_(null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $self->checkNamespace($self->semValue); }, 119 => static function ($self, $stackPos) { $self->semValue = new Stmt\Use_($self->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 120 => static function ($self, $stackPos) { $self->semValue = new Stmt\Use_($self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 121 => null, 122 => static function ($self, $stackPos) { $self->semValue = new Stmt\Const_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), []); }, 123 => static function ($self, $stackPos) { $self->semValue = new Stmt\Const_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(4-1)]); $self->checkConstantAttributes($self->semValue); }, 124 => static function ($self, $stackPos) { $self->semValue = Stmt\Use_::TYPE_FUNCTION; }, 125 => static function ($self, $stackPos) { $self->semValue = Stmt\Use_::TYPE_CONSTANT; }, 126 => static function ($self, $stackPos) { $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-6)], $self->semStack[$stackPos-(8-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 127 => static function ($self, $stackPos) { $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-5)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 128 => null, 129 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 130 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 131 => null, 132 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 133 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 134 => null, 135 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 136 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 137 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1)); }, 138 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3)); }, 139 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1)); }, 140 => static function ($self, $stackPos) { $self->semValue = new Node\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3)); }, 141 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->semValue->type = Stmt\Use_::TYPE_NORMAL; }, 142 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; $self->semValue->type = $self->semStack[$stackPos-(2-1)]; }, 143 => null, 144 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 145 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 146 => static function ($self, $stackPos) { $self->semValue = new Node\Const_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 147 => null, 148 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 149 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 150 => static function ($self, $stackPos) { $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 151 => static function ($self, $stackPos) { $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 152 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];; }, 153 => static function ($self, $stackPos) { $self->semValue = array(); }, 154 => static function ($self, $stackPos) { $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);; if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 155 => null, 156 => null, 157 => null, 158 => static function ($self, $stackPos) { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 159 => static function ($self, $stackPos) { $self->semValue = new Stmt\Block($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 160 => static function ($self, $stackPos) { $self->semValue = new Stmt\If_($self->semStack[$stackPos-(7-3)], ['stmts' => $self->semStack[$stackPos-(7-5)], 'elseifs' => $self->semStack[$stackPos-(7-6)], 'else' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 161 => static function ($self, $stackPos) { $self->semValue = new Stmt\If_($self->semStack[$stackPos-(10-3)], ['stmts' => $self->semStack[$stackPos-(10-6)], 'elseifs' => $self->semStack[$stackPos-(10-7)], 'else' => $self->semStack[$stackPos-(10-8)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); }, 162 => static function ($self, $stackPos) { $self->semValue = new Stmt\While_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 163 => static function ($self, $stackPos) { $self->semValue = new Stmt\Do_($self->semStack[$stackPos-(7-5)], $self->semStack[$stackPos-(7-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 164 => static function ($self, $stackPos) { $self->semValue = new Stmt\For_(['init' => $self->semStack[$stackPos-(9-3)], 'cond' => $self->semStack[$stackPos-(9-5)], 'loop' => $self->semStack[$stackPos-(9-7)], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 165 => static function ($self, $stackPos) { $self->semValue = new Stmt\Switch_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 166 => static function ($self, $stackPos) { $self->semValue = new Stmt\Break_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 167 => static function ($self, $stackPos) { $self->semValue = new Stmt\Continue_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 168 => static function ($self, $stackPos) { $self->semValue = new Stmt\Return_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 169 => static function ($self, $stackPos) { $self->semValue = new Stmt\Global_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 170 => static function ($self, $stackPos) { $self->semValue = new Stmt\Static_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 171 => static function ($self, $stackPos) { $self->semValue = new Stmt\Echo_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 172 => static function ($self, $stackPos) { $self->semValue = new Stmt\InlineHTML($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('hasLeadingNewline', $self->inlineHtmlHasLeadingNewline($stackPos-(1-1))); }, 173 => static function ($self, $stackPos) { $self->semValue = new Stmt\Expression($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 174 => static function ($self, $stackPos) { $self->semValue = new Stmt\Unset_($self->semStack[$stackPos-(5-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 175 => static function ($self, $stackPos) { $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $self->semStack[$stackPos-(7-5)][1], 'stmts' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 176 => static function ($self, $stackPos) { $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-7)][0], ['keyVar' => $self->semStack[$stackPos-(9-5)], 'byRef' => $self->semStack[$stackPos-(9-7)][1], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 177 => static function ($self, $stackPos) { $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos-(6-3)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-4)], $self->tokenEndStack[$stackPos-(6-4)])), ['stmts' => $self->semStack[$stackPos-(6-6)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); }, 178 => static function ($self, $stackPos) { $self->semValue = new Stmt\Declare_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 179 => static function ($self, $stackPos) { $self->semValue = new Stmt\TryCatch($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->checkTryCatch($self->semValue); }, 180 => static function ($self, $stackPos) { $self->semValue = new Stmt\Goto_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 181 => static function ($self, $stackPos) { $self->semValue = new Stmt\Label($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 182 => static function ($self, $stackPos) { $self->semValue = null; /* means: no statement */ }, 183 => null, 184 => static function ($self, $stackPos) { $self->semValue = $self->maybeCreateNop($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]); }, 185 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; }; }, 186 => static function ($self, $stackPos) { $self->semValue = array(); }, 187 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 188 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 189 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 190 => static function ($self, $stackPos) { $self->semValue = new Stmt\Catch_($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-7)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 191 => static function ($self, $stackPos) { $self->semValue = null; }, 192 => static function ($self, $stackPos) { $self->semValue = new Stmt\Finally_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 193 => null, 194 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 195 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 196 => static function ($self, $stackPos) { $self->semValue = false; }, 197 => static function ($self, $stackPos) { $self->semValue = true; }, 198 => static function ($self, $stackPos) { $self->semValue = false; }, 199 => static function ($self, $stackPos) { $self->semValue = true; }, 200 => static function ($self, $stackPos) { $self->semValue = false; }, 201 => static function ($self, $stackPos) { $self->semValue = true; }, 202 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 203 => static function ($self, $stackPos) { $self->semValue = []; }, 204 => null, 205 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 206 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 207 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 208 => static function ($self, $stackPos) { $self->semValue = new Stmt\Function_($self->semStack[$stackPos-(8-3)], ['byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-5)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 209 => static function ($self, $stackPos) { $self->semValue = new Stmt\Function_($self->semStack[$stackPos-(9-4)], ['byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-6)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 210 => static function ($self, $stackPos) { $self->semValue = new Stmt\Class_($self->semStack[$stackPos-(7-2)], ['type' => $self->semStack[$stackPos-(7-1)], 'extends' => $self->semStack[$stackPos-(7-3)], 'implements' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); $self->checkClass($self->semValue, $stackPos-(7-2)); }, 211 => static function ($self, $stackPos) { $self->semValue = new Stmt\Class_($self->semStack[$stackPos-(8-3)], ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); $self->checkClass($self->semValue, $stackPos-(8-3)); }, 212 => static function ($self, $stackPos) { $self->semValue = new Stmt\Interface_($self->semStack[$stackPos-(7-3)], ['extends' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => $self->semStack[$stackPos-(7-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); $self->checkInterface($self->semValue, $stackPos-(7-3)); }, 213 => static function ($self, $stackPos) { $self->semValue = new Stmt\Trait_($self->semStack[$stackPos-(6-3)], ['stmts' => $self->semStack[$stackPos-(6-5)], 'attrGroups' => $self->semStack[$stackPos-(6-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); }, 214 => static function ($self, $stackPos) { $self->semValue = new Stmt\Enum_($self->semStack[$stackPos-(8-3)], ['scalarType' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); $self->checkEnum($self->semValue, $stackPos-(8-3)); }, 215 => static function ($self, $stackPos) { $self->semValue = null; }, 216 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 217 => static function ($self, $stackPos) { $self->semValue = null; }, 218 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 219 => static function ($self, $stackPos) { $self->semValue = 0; }, 220 => null, 221 => null, 222 => static function ($self, $stackPos) { $self->checkClassModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 223 => static function ($self, $stackPos) { $self->semValue = Modifiers::ABSTRACT; }, 224 => static function ($self, $stackPos) { $self->semValue = Modifiers::FINAL; }, 225 => static function ($self, $stackPos) { $self->semValue = Modifiers::READONLY; }, 226 => static function ($self, $stackPos) { $self->semValue = null; }, 227 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 228 => static function ($self, $stackPos) { $self->semValue = array(); }, 229 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 230 => static function ($self, $stackPos) { $self->semValue = array(); }, 231 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 232 => null, 233 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 234 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 235 => null, 236 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 237 => null, 238 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 239 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; }; }, 240 => static function ($self, $stackPos) { $self->semValue = null; }, 241 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 242 => null, 243 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 244 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 245 => static function ($self, $stackPos) { $self->semValue = new Node\DeclareItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 246 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 247 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-3)]; }, 248 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 249 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(5-3)]; }, 250 => static function ($self, $stackPos) { $self->semValue = array(); }, 251 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 252 => static function ($self, $stackPos) { $self->semValue = new Stmt\Case_($self->semStack[$stackPos-(4-2)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 253 => static function ($self, $stackPos) { $self->semValue = new Stmt\Case_(null, $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 254 => null, 255 => null, 256 => static function ($self, $stackPos) { $self->semValue = new Expr\Match_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos])); }, 257 => static function ($self, $stackPos) { $self->semValue = []; }, 258 => null, 259 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 260 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 261 => static function ($self, $stackPos) { $self->semValue = new Node\MatchArm($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 262 => static function ($self, $stackPos) { $self->semValue = new Node\MatchArm(null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 263 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 264 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 265 => static function ($self, $stackPos) { $self->semValue = array(); }, 266 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 267 => static function ($self, $stackPos) { $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 268 => static function ($self, $stackPos) { $self->semValue = array(); }, 269 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 270 => static function ($self, $stackPos) { $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue); }, 271 => static function ($self, $stackPos) { $self->semValue = null; }, 272 => static function ($self, $stackPos) { $self->semValue = new Stmt\Else_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 273 => static function ($self, $stackPos) { $self->semValue = null; }, 274 => static function ($self, $stackPos) { $self->semValue = new Stmt\Else_($self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue); }, 275 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)], false); }, 276 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(2-2)], true); }, 277 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)], false); }, 278 => static function ($self, $stackPos) { $self->semValue = array($self->fixupArrayDestructuring($self->semStack[$stackPos-(1-1)]), false); }, 279 => null, 280 => static function ($self, $stackPos) { $self->semValue = array(); }, 281 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 282 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 283 => static function ($self, $stackPos) { $self->semValue = 0; }, 284 => static function ($self, $stackPos) { $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 285 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC; }, 286 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED; }, 287 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE; }, 288 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC_SET; }, 289 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED_SET; }, 290 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE_SET; }, 291 => static function ($self, $stackPos) { $self->semValue = Modifiers::READONLY; }, 292 => static function ($self, $stackPos) { $self->semValue = Modifiers::FINAL; }, 293 => static function ($self, $stackPos) { $self->semValue = new Node\Param($self->semStack[$stackPos-(7-6)], null, $self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-4)], $self->semStack[$stackPos-(7-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-1)], $self->semStack[$stackPos-(7-7)]); $self->checkParam($self->semValue); $self->addPropertyNameToHooks($self->semValue); }, 294 => static function ($self, $stackPos) { $self->semValue = new Node\Param($self->semStack[$stackPos-(9-6)], $self->semStack[$stackPos-(9-8)], $self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-4)], $self->semStack[$stackPos-(9-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(9-2)], $self->semStack[$stackPos-(9-1)], $self->semStack[$stackPos-(9-9)]); $self->checkParam($self->semValue); $self->addPropertyNameToHooks($self->semValue); }, 295 => static function ($self, $stackPos) { $self->semValue = new Node\Param(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])), null, $self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-4)], $self->semStack[$stackPos-(6-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-1)]); }, 296 => null, 297 => static function ($self, $stackPos) { $self->semValue = new Node\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 298 => static function ($self, $stackPos) { $self->semValue = new Node\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 299 => null, 300 => null, 301 => static function ($self, $stackPos) { $self->semValue = new Node\Name('static', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 302 => static function ($self, $stackPos) { $self->semValue = $self->handleBuiltinTypes($self->semStack[$stackPos-(1-1)]); }, 303 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier('array', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 304 => static function ($self, $stackPos) { $self->semValue = new Node\Identifier('callable', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 305 => null, 306 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 307 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 308 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 309 => null, 310 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 311 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 312 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 313 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 314 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 315 => static function ($self, $stackPos) { $self->semValue = new Node\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 316 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 317 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 318 => static function ($self, $stackPos) { $self->semValue = new Node\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 319 => null, 320 => static function ($self, $stackPos) { $self->semValue = new Node\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 321 => static function ($self, $stackPos) { $self->semValue = new Node\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 322 => null, 323 => static function ($self, $stackPos) { $self->semValue = null; }, 324 => null, 325 => static function ($self, $stackPos) { $self->semValue = null; }, 326 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(2-2)]; }, 327 => static function ($self, $stackPos) { $self->semValue = null; }, 328 => static function ($self, $stackPos) { $self->semValue = array(); }, 329 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 330 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-2)]); }, 331 => static function ($self, $stackPos) { $self->semValue = array(); }, 332 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-2)]; }, 333 => static function ($self, $stackPos) { $self->semValue = array(new Node\Arg($self->semStack[$stackPos-(4-2)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]))); }, 334 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-2)]); }, 335 => static function ($self, $stackPos) { $self->semValue = array(new Node\Arg($self->semStack[$stackPos-(3-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)]); }, 336 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 337 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 338 => static function ($self, $stackPos) { $self->semValue = new Node\VariadicPlaceholder($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 339 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 340 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 341 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(2-2)], true, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 342 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(2-2)], false, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 343 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(3-3)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(3-1)]); }, 344 => static function ($self, $stackPos) { $self->semValue = new Node\Arg($self->semStack[$stackPos-(1-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 345 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 346 => null, 347 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 348 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 349 => null, 350 => null, 351 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 352 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 353 => static function ($self, $stackPos) { $self->semValue = new Node\StaticVar($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 354 => static function ($self, $stackPos) { $self->semValue = new Node\StaticVar($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 355 => static function ($self, $stackPos) { if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; } else { $self->semValue = $self->semStack[$stackPos-(2-1)]; } }, 356 => static function ($self, $stackPos) { $self->semValue = array(); }, 357 => static function ($self, $stackPos) { $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);; if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 358 => static function ($self, $stackPos) { $self->semValue = new Stmt\Property($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-1)]); }, 359 => static function ($self, $stackPos) { $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-1)]); $self->checkClassConst($self->semValue, $stackPos-(5-2)); }, 360 => static function ($self, $stackPos) { $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-1)], $self->semStack[$stackPos-(6-4)]); $self->checkClassConst($self->semValue, $stackPos-(6-2)); }, 361 => static function ($self, $stackPos) { $self->semValue = new Stmt\ClassMethod($self->semStack[$stackPos-(10-5)], ['type' => $self->semStack[$stackPos-(10-2)], 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-7)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); $self->checkClassMethod($self->semValue, $stackPos-(10-2)); }, 362 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUse($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 363 => static function ($self, $stackPos) { $self->semValue = new Stmt\EnumCase($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 364 => static function ($self, $stackPos) { $self->semValue = null; /* will be skipped */ }, 365 => static function ($self, $stackPos) { $self->semValue = array(); }, 366 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 367 => static function ($self, $stackPos) { $self->semValue = array(); }, 368 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 369 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Precedence($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 370 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(5-1)][0], $self->semStack[$stackPos-(5-1)][1], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 371 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 372 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 373 => static function ($self, $stackPos) { $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 374 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]); }, 375 => null, 376 => static function ($self, $stackPos) { $self->semValue = array(null, $self->semStack[$stackPos-(1-1)]); }, 377 => static function ($self, $stackPos) { $self->semValue = null; }, 378 => null, 379 => null, 380 => static function ($self, $stackPos) { $self->semValue = 0; }, 381 => static function ($self, $stackPos) { $self->semValue = 0; }, 382 => null, 383 => null, 384 => static function ($self, $stackPos) { $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 385 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC; }, 386 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED; }, 387 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE; }, 388 => static function ($self, $stackPos) { $self->semValue = Modifiers::PUBLIC_SET; }, 389 => static function ($self, $stackPos) { $self->semValue = Modifiers::PROTECTED_SET; }, 390 => static function ($self, $stackPos) { $self->semValue = Modifiers::PRIVATE_SET; }, 391 => static function ($self, $stackPos) { $self->semValue = Modifiers::STATIC; }, 392 => static function ($self, $stackPos) { $self->semValue = Modifiers::ABSTRACT; }, 393 => static function ($self, $stackPos) { $self->semValue = Modifiers::FINAL; }, 394 => static function ($self, $stackPos) { $self->semValue = Modifiers::READONLY; }, 395 => null, 396 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 397 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 398 => static function ($self, $stackPos) { $self->semValue = new Node\VarLikeIdentifier(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 399 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyItem($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 400 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 401 => static function ($self, $stackPos) { $self->semValue = []; }, 402 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 403 => static function ($self, $stackPos) { $self->semValue = []; }, 404 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyHook($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-5)], ['flags' => $self->semStack[$stackPos-(5-2)], 'byRef' => $self->semStack[$stackPos-(5-3)], 'params' => [], 'attrGroups' => $self->semStack[$stackPos-(5-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); $self->checkPropertyHook($self->semValue, null); }, 405 => static function ($self, $stackPos) { $self->semValue = new Node\PropertyHook($self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-8)], ['flags' => $self->semStack[$stackPos-(8-2)], 'byRef' => $self->semStack[$stackPos-(8-3)], 'params' => $self->semStack[$stackPos-(8-6)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); $self->checkPropertyHook($self->semValue, $stackPos-(8-5)); }, 406 => static function ($self, $stackPos) { $self->semValue = null; }, 407 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 408 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 409 => static function ($self, $stackPos) { $self->semValue = 0; }, 410 => static function ($self, $stackPos) { $self->checkPropertyHookModifiers($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)]; }, 411 => null, 412 => null, 413 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 414 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 415 => static function ($self, $stackPos) { $self->semValue = array(); }, 416 => null, 417 => null, 418 => static function ($self, $stackPos) { $self->semValue = new Expr\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 419 => static function ($self, $stackPos) { $self->semValue = new Expr\Assign($self->fixupArrayDestructuring($self->semStack[$stackPos-(3-1)]), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 420 => static function ($self, $stackPos) { $self->semValue = new Expr\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 421 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 422 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); if (!$self->phpVersion->allowsAssignNewByReference()) { $self->emitError(new Error('Cannot assign new by reference', $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]))); } }, 423 => null, 424 => null, 425 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall(new Node\Name($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos-(2-1)])), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 426 => static function ($self, $stackPos) { $self->semValue = new Expr\Clone_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 427 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 428 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 429 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 430 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 431 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 432 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 433 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 434 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 435 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 436 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 437 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 438 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 439 => static function ($self, $stackPos) { $self->semValue = new Expr\AssignOp\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 440 => static function ($self, $stackPos) { $self->semValue = new Expr\PostInc($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 441 => static function ($self, $stackPos) { $self->semValue = new Expr\PreInc($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 442 => static function ($self, $stackPos) { $self->semValue = new Expr\PostDec($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 443 => static function ($self, $stackPos) { $self->semValue = new Expr\PreDec($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 444 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BooleanOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 445 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BooleanAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 446 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\LogicalOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 447 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\LogicalAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 448 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\LogicalXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 449 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 450 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 451 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 452 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 453 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 454 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 455 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 456 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 457 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 458 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 459 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 460 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 461 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 462 => static function ($self, $stackPos) { $self->semValue = new Expr\UnaryPlus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 463 => static function ($self, $stackPos) { $self->semValue = new Expr\UnaryMinus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 464 => static function ($self, $stackPos) { $self->semValue = new Expr\BooleanNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 465 => static function ($self, $stackPos) { $self->semValue = new Expr\BitwiseNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 466 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Identical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 467 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\NotIdentical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 468 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Equal($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 469 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\NotEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 470 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Spaceship($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 471 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Smaller($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 472 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\SmallerOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 473 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Greater($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 474 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\GreaterOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 475 => static function ($self, $stackPos) { $self->semValue = new Expr\Instanceof_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 476 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; if ($self->semValue instanceof Expr\ArrowFunction) { $self->parenthesizedArrowFunctions->offsetSet($self->semValue); } }, 477 => static function ($self, $stackPos) { $self->semValue = new Expr\Ternary($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 478 => static function ($self, $stackPos) { $self->semValue = new Expr\Ternary($self->semStack[$stackPos-(4-1)], null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 479 => static function ($self, $stackPos) { $self->semValue = new Expr\BinaryOp\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 480 => static function ($self, $stackPos) { $self->semValue = new Expr\Isset_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 481 => static function ($self, $stackPos) { $self->semValue = new Expr\Empty_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 482 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 483 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 484 => static function ($self, $stackPos) { $self->semValue = new Expr\Eval_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 485 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 486 => static function ($self, $stackPos) { $self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 487 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getIntCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos-(2-2)], $attrs); }, 488 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\Double($self->semStack[$stackPos-(2-2)], $attrs); }, 489 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getStringCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\String_($self->semStack[$stackPos-(2-2)], $attrs); }, 490 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Array_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 491 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Object_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 492 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = $self->getBoolCastKind($self->semStack[$stackPos-(2-1)]); $self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos-(2-2)], $attrs); }, 493 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Unset_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 494 => static function ($self, $stackPos) { $self->semValue = new Expr\Cast\Void_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 495 => static function ($self, $stackPos) { $self->semValue = $self->createExitExpr($self->semStack[$stackPos-(2-1)], $stackPos-(2-1), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 496 => static function ($self, $stackPos) { $self->semValue = new Expr\ErrorSuppress($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 497 => null, 498 => static function ($self, $stackPos) { $self->semValue = new Expr\ShellExec($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 499 => static function ($self, $stackPos) { $self->semValue = new Expr\Print_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 500 => static function ($self, $stackPos) { $self->semValue = new Expr\Yield_(null, null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 501 => static function ($self, $stackPos) { $self->semValue = new Expr\Yield_($self->semStack[$stackPos-(2-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 502 => static function ($self, $stackPos) { $self->semValue = new Expr\Yield_($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 503 => static function ($self, $stackPos) { $self->semValue = new Expr\YieldFrom($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 504 => static function ($self, $stackPos) { $self->semValue = new Expr\Throw_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 505 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'returnType' => $self->semStack[$stackPos-(8-6)], 'expr' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 506 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 507 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'uses' => $self->semStack[$stackPos-(8-6)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])); }, 508 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 509 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 510 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'returnType' => $self->semStack[$stackPos-(10-8)], 'expr' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); }, 511 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos])); }, 512 => static function ($self, $stackPos) { $self->semValue = new Expr\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'uses' => $self->semStack[$stackPos-(10-8)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos])); }, 513 => static function ($self, $stackPos) { $self->semValue = array(new Stmt\Class_(null, ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])), $self->semStack[$stackPos-(8-3)]); $self->checkClass($self->semValue[0], -1); }, 514 => static function ($self, $stackPos) { $self->semValue = new Expr\New_($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 515 => static function ($self, $stackPos) { list($class, $ctorArgs) = $self->semStack[$stackPos-(2-2)]; $self->semValue = new Expr\New_($class, $ctorArgs, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 516 => static function ($self, $stackPos) { $self->semValue = new Expr\New_($self->semStack[$stackPos-(2-2)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 517 => null, 518 => null, 519 => static function ($self, $stackPos) { $self->semValue = array(); }, 520 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(4-3)]; }, 521 => null, 522 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 523 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 524 => static function ($self, $stackPos) { $self->semValue = new Node\ClosureUse($self->semStack[$stackPos-(2-2)], $self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 525 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 526 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 527 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 528 => static function ($self, $stackPos) { $self->semValue = new Expr\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 529 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 530 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 531 => null, 532 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 533 => static function ($self, $stackPos) { $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 534 => static function ($self, $stackPos) { $self->semValue = new Name\FullyQualified(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 535 => static function ($self, $stackPos) { $self->semValue = new Name\Relative(substr($self->semStack[$stackPos-(1-1)], 10), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 536 => null, 537 => null, 538 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 539 => static function ($self, $stackPos) { $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 540 => null, 541 => null, 542 => static function ($self, $stackPos) { $self->semValue = array(); }, 543 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); foreach ($self->semValue as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } }; }, 544 => static function ($self, $stackPos) { foreach ($self->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = $self->semStack[$stackPos-(1-1)]; }, 545 => static function ($self, $stackPos) { $self->semValue = array(); }, 546 => null, 547 => static function ($self, $stackPos) { $self->semValue = new Expr\ConstFetch($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 548 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Line($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 549 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\File($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 550 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Dir($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 551 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Class_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 552 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Trait_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 553 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Method($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 554 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Function_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 555 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Namespace_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 556 => static function ($self, $stackPos) { $self->semValue = new Scalar\MagicConst\Property($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 557 => static function ($self, $stackPos) { $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 558 => static function ($self, $stackPos) { $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos])); }, 559 => static function ($self, $stackPos) { $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos-(3-1)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(3-3)], $self->tokenEndStack[$stackPos-(3-3)])), $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 560 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_SHORT; $self->semValue = new Expr\Array_($self->semStack[$stackPos-(3-2)], $attrs); }, 561 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_LONG; $self->semValue = new Expr\Array_($self->semStack[$stackPos-(4-3)], $attrs); $self->createdArrays->offsetSet($self->semValue); }, 562 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->createdArrays->offsetSet($self->semValue); }, 563 => static function ($self, $stackPos) { $self->semValue = Scalar\String_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->supportsUnicodeEscapes()); }, 564 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($self->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = new Scalar\InterpolatedString($self->semStack[$stackPos-(3-2)], $attrs); }, 565 => static function ($self, $stackPos) { $self->semValue = $self->parseLNumber($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->allowsInvalidOctals()); }, 566 => static function ($self, $stackPos) { $self->semValue = Scalar\Float_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 567 => null, 568 => null, 569 => null, 570 => static function ($self, $stackPos) { $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)], $self->tokenEndStack[$stackPos-(3-3)]), true); }, 571 => static function ($self, $stackPos) { $self->semValue = $self->parseDocString($self->semStack[$stackPos-(2-1)], '', $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(2-2)], $self->tokenEndStack[$stackPos-(2-2)]), true); }, 572 => static function ($self, $stackPos) { $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)], $self->tokenEndStack[$stackPos-(3-3)]), true); }, 573 => static function ($self, $stackPos) { $self->semValue = null; }, 574 => null, 575 => null, 576 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 577 => null, 578 => null, 579 => null, 580 => null, 581 => null, 582 => null, 583 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 584 => null, 585 => null, 586 => null, 587 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 588 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 589 => null, 590 => static function ($self, $stackPos) { $self->semValue = new Expr\MethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 591 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafeMethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 592 => static function ($self, $stackPos) { $self->semValue = null; }, 593 => null, 594 => null, 595 => null, 596 => static function ($self, $stackPos) { $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 597 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 598 => null, 599 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 600 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 601 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])), $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 602 => static function ($self, $stackPos) { $var = $self->semStack[$stackPos-(1-1)]->name; $self->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])) : $var; }, 603 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 604 => null, 605 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 606 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 607 => static function ($self, $stackPos) { $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 608 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 609 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 610 => static function ($self, $stackPos) { $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 611 => null, 612 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 613 => null, 614 => null, 615 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 616 => null, 617 => static function ($self, $stackPos) { $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2; }, 618 => static function ($self, $stackPos) { $self->semValue = new Expr\List_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Expr\List_::KIND_LIST); $self->postprocessList($self->semValue); }, 619 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(1-1)]; $end = count($self->semValue)-1; if ($self->semValue[$end]->value instanceof Expr\Error) array_pop($self->semValue); }, 620 => null, 621 => static function ($self, $stackPos) { /* do nothing -- prevent default action of $$=$self->semStack[$1]. See $551. */ }, 622 => static function ($self, $stackPos) { $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)]; }, 623 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 624 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 625 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(2-2)], null, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 626 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 627 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 628 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-1)], true, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 629 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 630 => static function ($self, $stackPos) { $self->semValue = new Node\ArrayItem($self->semStack[$stackPos-(2-2)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), true); }, 631 => static function ($self, $stackPos) { /* Create an Error node now to remember the position. We'll later either report an error, or convert this into a null element, depending on whether this is a creation or destructuring context. */ $attrs = $self->createEmptyElemAttributes($self->tokenPos); $self->semValue = new Node\ArrayItem(new Expr\Error($attrs), null, false, $attrs); }, 632 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 633 => static function ($self, $stackPos) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; }, 634 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(1-1)]); }, 635 => static function ($self, $stackPos) { $self->semValue = array($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)]); }, 636 => static function ($self, $stackPos) { $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]); $attrs['rawValue'] = $self->semStack[$stackPos-(1-1)]; $self->semValue = new Node\InterpolatedStringPart($self->semStack[$stackPos-(1-1)], $attrs); }, 637 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 638 => null, 639 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); }, 640 => static function ($self, $stackPos) { $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 641 => static function ($self, $stackPos) { $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 642 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 643 => static function ($self, $stackPos) { $self->semValue = new Expr\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); }, 644 => static function ($self, $stackPos) { $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); }, 645 => static function ($self, $stackPos) { $self->semValue = $self->semStack[$stackPos-(3-2)]; }, 646 => static function ($self, $stackPos) { $self->semValue = new Scalar\String_($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 647 => static function ($self, $stackPos) { $self->semValue = $self->parseNumString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); }, 648 => static function ($self, $stackPos) { $self->semValue = $self->parseNumString('-' . $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); }, 649 => null, ]; } } $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * NodeVisitor::REMOVE_NODE * => $node is removed from the parent array * * NodeVisitor::REPLACE_WITH_NULL * => $node is replaced with null * * NodeVisitor::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is * * NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN * => Further visitors for the current node are skipped, and its children are not * traversed. $node stays as-is. * * NodeVisitor::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return null|int|Node|Node[] Replacement node (or special return value) */ public function enterNode(Node $node); /** * Called when leaving a node. * * Return value semantics: * * null * => $node stays as-is * * NodeVisitor::REMOVE_NODE * => $node is removed from the parent array * * NodeVisitor::REPLACE_WITH_NULL * => $node is replaced with null * * NodeVisitor::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return null|int|Node|Node[] Replacement node (or special return value) */ public function leaveNode(Node $node); /** * Called once after traversal. * * Return value semantics: * * null: $nodes stays as-is * * otherwise: $nodes is set to the return value * * @param Node[] $nodes Array of nodes * * @return null|Node[] Array of nodes */ public function afterTraverse(array $nodes); } args($args) ); } /** * Creates a namespace builder. * * @param null|string|Node\Name $name Name of the namespace * * @return Builder\Namespace_ The created namespace builder */ public function namespace($name): Builder\Namespace_ { return new Builder\Namespace_($name); } /** * Creates a class builder. * * @param string $name Name of the class * * @return Builder\Class_ The created class builder */ public function class(string $name): Builder\Class_ { return new Builder\Class_($name); } /** * Creates an interface builder. * * @param string $name Name of the interface * * @return Builder\Interface_ The created interface builder */ public function interface(string $name): Builder\Interface_ { return new Builder\Interface_($name); } /** * Creates a trait builder. * * @param string $name Name of the trait * * @return Builder\Trait_ The created trait builder */ public function trait(string $name): Builder\Trait_ { return new Builder\Trait_($name); } /** * Creates an enum builder. * * @param string $name Name of the enum * * @return Builder\Enum_ The created enum builder */ public function enum(string $name): Builder\Enum_ { return new Builder\Enum_($name); } /** * Creates a trait use builder. * * @param Node\Name|string ...$traits Trait names * * @return Builder\TraitUse The created trait use builder */ public function useTrait(...$traits): Builder\TraitUse { return new Builder\TraitUse(...$traits); } /** * Creates a trait use adaptation builder. * * @param Node\Name|string|null $trait Trait name * @param Node\Identifier|string $method Method name * * @return Builder\TraitUseAdaptation The created trait use adaptation builder */ public function traitUseAdaptation($trait, $method = null): Builder\TraitUseAdaptation { if ($method === null) { $method = $trait; $trait = null; } return new Builder\TraitUseAdaptation($trait, $method); } /** * Creates a method builder. * * @param string $name Name of the method * * @return Builder\Method The created method builder */ public function method(string $name): Builder\Method { return new Builder\Method($name); } /** * Creates a parameter builder. * * @param string $name Name of the parameter * * @return Builder\Param The created parameter builder */ public function param(string $name): Builder\Param { return new Builder\Param($name); } /** * Creates a property builder. * * @param string $name Name of the property * * @return Builder\Property The created property builder */ public function property(string $name): Builder\Property { return new Builder\Property($name); } /** * Creates a function builder. * * @param string $name Name of the function * * @return Builder\Function_ The created function builder */ public function function(string $name): Builder\Function_ { return new Builder\Function_($name); } /** * Creates a namespace/class use builder. * * @param Node\Name|string $name Name of the entity (namespace or class) to alias * * @return Builder\Use_ The created use builder */ public function use($name): Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_NORMAL); } /** * Creates a function use builder. * * @param Node\Name|string $name Name of the function to alias * * @return Builder\Use_ The created use function builder */ public function useFunction($name): Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_FUNCTION); } /** * Creates a constant use builder. * * @param Node\Name|string $name Name of the const to alias * * @return Builder\Use_ The created use const builder */ public function useConst($name): Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_CONSTANT); } /** * Creates a class constant builder. * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return Builder\ClassConst The created use const builder */ public function classConst($name, $value): Builder\ClassConst { return new Builder\ClassConst($name, $value); } /** * Creates an enum case builder. * * @param string|Identifier $name Name * * @return Builder\EnumCase The created use const builder */ public function enumCase($name): Builder\EnumCase { return new Builder\EnumCase($name); } /** * Creates node a for a literal value. * * @param Expr|bool|null|int|float|string|array|\UnitEnum $value $value */ public function val($value): Expr { return BuilderHelpers::normalizeValue($value); } /** * Creates variable node. * * @param string|Expr $name Name */ public function var($name): Expr\Variable { if (!\is_string($name) && !$name instanceof Expr) { throw new \LogicException('Variable name must be string or Expr'); } return new Expr\Variable($name); } /** * Normalizes an argument list. * * Creates Arg nodes for all arguments and converts literal values to expressions. * * @param array $args List of arguments to normalize * * @return list */ public function args(array $args): array { $normalizedArgs = []; foreach ($args as $key => $arg) { if (!($arg instanceof Arg)) { $arg = new Arg(BuilderHelpers::normalizeValue($arg)); } if (\is_string($key)) { $arg->name = BuilderHelpers::normalizeIdentifier($key); } $normalizedArgs[] = $arg; } return $normalizedArgs; } /** * Creates a function call node. * * @param string|Name|Expr $name Function name * @param array $args Function arguments */ public function funcCall($name, array $args = []): Expr\FuncCall { return new Expr\FuncCall( BuilderHelpers::normalizeNameOrExpr($name), $this->args($args) ); } /** * Creates a method call node. * * @param Expr $var Variable the method is called on * @param string|Identifier|Expr $name Method name * @param array $args Method arguments */ public function methodCall(Expr $var, $name, array $args = []): Expr\MethodCall { return new Expr\MethodCall( $var, BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args) ); } /** * Creates a static method call node. * * @param string|Name|Expr $class Class name * @param string|Identifier|Expr $name Method name * @param array $args Method arguments */ public function staticCall($class, $name, array $args = []): Expr\StaticCall { return new Expr\StaticCall( BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args) ); } /** * Creates an object creation node. * * @param string|Name|Expr $class Class name * @param array $args Constructor arguments */ public function new($class, array $args = []): Expr\New_ { return new Expr\New_( BuilderHelpers::normalizeNameOrExpr($class), $this->args($args) ); } /** * Creates a constant fetch node. * * @param string|Name $name Constant name */ public function constFetch($name): Expr\ConstFetch { return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); } /** * Creates a property fetch node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Property name */ public function propertyFetch(Expr $var, $name): Expr\PropertyFetch { return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); } /** * Creates a class constant fetch node. * * @param string|Name|Expr $class Class name * @param string|Identifier|Expr $name Constant name */ public function classConstFetch($class, $name): Expr\ClassConstFetch { return new Expr\ClassConstFetch( BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifierOrExpr($name) ); } /** * Creates nested Concat nodes from a list of expressions. * * @param Expr|string ...$exprs Expressions or literal strings */ public function concat(...$exprs): Concat { $numExprs = count($exprs); if ($numExprs < 2) { throw new \LogicException('Expected at least two expressions'); } $lastConcat = $this->normalizeStringExpr($exprs[0]); for ($i = 1; $i < $numExprs; $i++) { $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); } return $lastConcat; } /** * @param string|Expr $expr */ private function normalizeStringExpr($expr): Expr { if ($expr instanceof Expr) { return $expr; } if (\is_string($expr)) { return new String_($expr); } throw new \LogicException('Expected string or Expr'); } } errors[] = $error; } /** * Get collected errors. * * @return Error[] */ public function getErrors(): array { return $this->errors; } /** * Check whether there are any errors. */ public function hasErrors(): bool { return !empty($this->errors); } /** * Reset/clear collected errors. */ public function clearErrors(): void { $this->errors = []; } } serializeToString($manifest); ```
Output ```shell object(PharIo\Manifest\Manifest)#14 (6) { ["name":"PharIo\Manifest\Manifest":private]=> object(PharIo\Manifest\ApplicationName)#10 (1) { ["name":"PharIo\Manifest\ApplicationName":private]=> string(12) "some/library" } ["version":"PharIo\Manifest\Manifest":private]=> object(PharIo\Version\Version)#12 (5) { ["originalVersionString":"PharIo\Version\Version":private]=> string(5) "1.0.0" ["major":"PharIo\Version\Version":private]=> object(PharIo\Version\VersionNumber)#13 (1) { ["value":"PharIo\Version\VersionNumber":private]=> int(1) } ["minor":"PharIo\Version\Version":private]=> object(PharIo\Version\VersionNumber)#23 (1) { ["value":"PharIo\Version\VersionNumber":private]=> int(0) } ["patch":"PharIo\Version\Version":private]=> object(PharIo\Version\VersionNumber)#22 (1) { ["value":"PharIo\Version\VersionNumber":private]=> int(0) } ["preReleaseSuffix":"PharIo\Version\Version":private]=> NULL } ["type":"PharIo\Manifest\Manifest":private]=> object(PharIo\Manifest\Library)#6 (0) { } ["copyrightInformation":"PharIo\Manifest\Manifest":private]=> object(PharIo\Manifest\CopyrightInformation)#19 (2) { ["authors":"PharIo\Manifest\CopyrightInformation":private]=> object(PharIo\Manifest\AuthorCollection)#9 (1) { ["authors":"PharIo\Manifest\AuthorCollection":private]=> array(1) { [0]=> object(PharIo\Manifest\Author)#15 (2) { ["name":"PharIo\Manifest\Author":private]=> string(13) "Reiner Zufall" ["email":"PharIo\Manifest\Author":private]=> object(PharIo\Manifest\Email)#16 (1) { ["email":"PharIo\Manifest\Email":private]=> string(16) "reiner@zufall.de" } } } } ["license":"PharIo\Manifest\CopyrightInformation":private]=> object(PharIo\Manifest\License)#11 (2) { ["name":"PharIo\Manifest\License":private]=> string(12) "BSD-3-Clause" ["url":"PharIo\Manifest\License":private]=> object(PharIo\Manifest\Url)#18 (1) { ["url":"PharIo\Manifest\Url":private]=> string(26) "https://domain.tld/LICENSE" } } } ["requirements":"PharIo\Manifest\Manifest":private]=> object(PharIo\Manifest\RequirementCollection)#17 (1) { ["requirements":"PharIo\Manifest\RequirementCollection":private]=> array(1) { [0]=> object(PharIo\Manifest\PhpVersionRequirement)#20 (1) { ["versionConstraint":"PharIo\Manifest\PhpVersionRequirement":private]=> object(PharIo\Version\SpecificMajorAndMinorVersionConstraint)#24 (3) { ["originalValue":"PharIo\Version\AbstractVersionConstraint":private]=> string(3) "7.0" ["major":"PharIo\Version\SpecificMajorAndMinorVersionConstraint":private]=> int(7) ["minor":"PharIo\Version\SpecificMajorAndMinorVersionConstraint":private]=> int(0) } } } } ["bundledComponents":"PharIo\Manifest\Manifest":private]=> object(PharIo\Manifest\BundledComponentCollection)#8 (1) { ["bundledComponents":"PharIo\Manifest\BundledComponentCollection":private]=> array(0) { } } } ```
### Create via API ```php $bundled = new \PharIo\Manifest\BundledComponentCollection(); $bundled->add( new \PharIo\Manifest\BundledComponent('vendor/packageA', new \PharIo\Version\Version('1.2.3-dev') ) ); $manifest = new PharIo\Manifest\Manifest( new \PharIo\Manifest\ApplicationName('vendor/package'), new \PharIo\Version\Version('1.0.0'), new \PharIo\Manifest\Library(), new \PharIo\Manifest\CopyrightInformation( new \PharIo\Manifest\AuthorCollection(), new \PharIo\Manifest\License( 'BSD-3-Clause', new \PharIo\Manifest\Url('https://spdx.org/licenses/BSD-3-Clause.html') ) ), new \PharIo\Manifest\RequirementCollection(), $bundled ); echo (new ManifestSerializer)->serializeToString($manifest); ```
Output ```xml ```
This file is part of PharIo\Manifest. Copyright (c) Arne Blankerts , Sebastian Heuer , Sebastian Bergmann and contributors For the full copyright and license information, please view the LICENSE file that was distributed with this source code. isTokenKindFound(T_DOC_COMMENT); } public function isRisky(): bool { return false; } public function fix(\SplFileInfo $file, Tokens $tokens): void { foreach($tokens as $index => $token) { if (!$token->isGivenKind(T_DOC_COMMENT)) { continue; } if (\stripos($token->getContent(), '@var') === false) { continue; } if (preg_match('#^/\*\*[\s\*]+(@var[^\r\n]+)[\s\*]*\*\/$#u', $token->getContent(), $matches) !== 1) { continue; } $newContent = '/** ' . \rtrim($matches[1]) . ' */'; if ($newContent === $token->getContent()) { continue; } $tokens[$index] = new Token([T_DOC_COMMENT, $newContent]); } } public function getPriority(): int { return 0; } public function getName(): string { return 'PharIo/phpdoc_single_line_var_fixer'; } public function supports(\SplFileInfo $file): bool { return true; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\AnyVersionConstraint; use PharIo\Version\Version; use PharIo\Version\VersionConstraint; use XMLWriter; use function count; use function file_put_contents; use function str_repeat; /** @psalm-suppress MissingConstructor */ class ManifestSerializer { /** @var XMLWriter */ private $xmlWriter; public function serializeToFile(Manifest $manifest, string $filename): void { file_put_contents( $filename, $this->serializeToString($manifest) ); } public function serializeToString(Manifest $manifest): string { $this->startDocument(); $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); $this->addCopyright($manifest->getCopyrightInformation()); $this->addRequirements($manifest->getRequirements()); $this->addBundles($manifest->getBundledComponents()); return $this->finishDocument(); } private function startDocument(): void { $xmlWriter = new XMLWriter(); $xmlWriter->openMemory(); $xmlWriter->setIndent(true); $xmlWriter->setIndentString(str_repeat(' ', 4)); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->startElement('phar'); $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); $this->xmlWriter = $xmlWriter; } private function finishDocument(): string { $this->xmlWriter->endElement(); $this->xmlWriter->endDocument(); return $this->xmlWriter->outputMemory(); } private function addContains(ApplicationName $name, Version $version, Type $type): void { $this->xmlWriter->startElement('contains'); $this->xmlWriter->writeAttribute('name', $name->asString()); $this->xmlWriter->writeAttribute('version', $version->getVersionString()); switch (true) { case $type->isApplication(): { $this->xmlWriter->writeAttribute('type', 'application'); break; } case $type->isLibrary(): { $this->xmlWriter->writeAttribute('type', 'library'); break; } case $type->isExtension(): { $this->xmlWriter->writeAttribute('type', 'extension'); /* @var $type Extension */ $this->addExtension( $type->getApplicationName(), $type->getVersionConstraint() ); break; } default: { $this->xmlWriter->writeAttribute('type', 'custom'); } } $this->xmlWriter->endElement(); } private function addCopyright(CopyrightInformation $copyrightInformation): void { $this->xmlWriter->startElement('copyright'); foreach ($copyrightInformation->getAuthors() as $author) { $this->xmlWriter->startElement('author'); $this->xmlWriter->writeAttribute('name', $author->getName()); $this->xmlWriter->writeAttribute('email', $author->getEmail()->asString()); $this->xmlWriter->endElement(); } $license = $copyrightInformation->getLicense(); $this->xmlWriter->startElement('license'); $this->xmlWriter->writeAttribute('type', $license->getName()); $this->xmlWriter->writeAttribute('url', $license->getUrl()->asString()); $this->xmlWriter->endElement(); $this->xmlWriter->endElement(); } private function addRequirements(RequirementCollection $requirementCollection): void { $phpRequirement = new AnyVersionConstraint(); $extensions = []; foreach ($requirementCollection as $requirement) { if ($requirement instanceof PhpVersionRequirement) { $phpRequirement = $requirement->getVersionConstraint(); continue; } if ($requirement instanceof PhpExtensionRequirement) { $extensions[] = $requirement->asString(); } } $this->xmlWriter->startElement('requires'); $this->xmlWriter->startElement('php'); $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); foreach ($extensions as $extension) { $this->xmlWriter->startElement('ext'); $this->xmlWriter->writeAttribute('name', $extension); $this->xmlWriter->endElement(); } $this->xmlWriter->endElement(); $this->xmlWriter->endElement(); } private function addBundles(BundledComponentCollection $bundledComponentCollection): void { if (count($bundledComponentCollection) === 0) { return; } $this->xmlWriter->startElement('bundles'); foreach ($bundledComponentCollection as $bundledComponent) { $this->xmlWriter->startElement('component'); $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); $this->xmlWriter->endElement(); } $this->xmlWriter->endElement(); } private function addExtension(ApplicationName $applicationName, VersionConstraint $versionConstraint): void { $this->xmlWriter->startElement('extension'); $this->xmlWriter->writeAttribute('for', $applicationName->asString()); $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); $this->xmlWriter->endElement(); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class AuthorElementCollection extends ElementCollection { public function current(): AuthorElement { return new AuthorElement( $this->getCurrentElement() ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class LicenseElement extends ManifestElement { public function getType(): string { return $this->getAttributeValue('type'); } public function getUrl(): string { return $this->getAttributeValue('url'); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ExtElementCollection extends ElementCollection { public function current(): ExtElement { return new ExtElement( $this->getCurrentElement() ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use DOMElement; use DOMNodeList; use Iterator; use ReturnTypeWillChange; use function count; use function get_class; use function sprintf; /** @template-implements Iterator */ abstract class ElementCollection implements Iterator { /** @var DOMElement[] */ private $nodes = []; /** @var int */ private $position; public function __construct(DOMNodeList $nodeList) { $this->position = 0; $this->importNodes($nodeList); } #[ReturnTypeWillChange] abstract public function current(); public function next(): void { $this->position++; } public function key(): int { return $this->position; } public function valid(): bool { return $this->position < count($this->nodes); } public function rewind(): void { $this->position = 0; } protected function getCurrentElement(): DOMElement { return $this->nodes[$this->position]; } private function importNodes(DOMNodeList $nodeList): void { foreach ($nodeList as $node) { if (!$node instanceof DOMElement) { throw new ElementCollectionException( sprintf('\DOMElement expected, got \%s', get_class($node)) ); } $this->nodes[] = $node; } } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ExtElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class RequiresElement extends ManifestElement { public function getPHPElement(): PhpElement { return new PhpElement( $this->getChildByName('php') ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ContainsElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } public function getVersion(): string { return $this->getAttributeValue('version'); } public function getType(): string { return $this->getAttributeValue('type'); } public function getExtensionElement(): ExtensionElement { return new ExtensionElement( $this->getChildByName('extension') ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ComponentElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } public function getVersion(): string { return $this->getAttributeValue('version'); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ComponentElementCollection extends ElementCollection { public function current(): ComponentElement { return new ComponentElement( $this->getCurrentElement() ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class AuthorElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } public function getEmail(): string { return $this->getAttributeValue('email'); } public function hasEMail(): bool { return $this->hasAttribute('email'); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class BundlesElement extends ManifestElement { public function getComponentElements(): ComponentElementCollection { return new ComponentElementCollection( $this->getChildrenByName('component') ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ExtensionElement extends ManifestElement { public function getFor(): string { return $this->getAttributeValue('for'); } public function getCompatible(): string { return $this->getAttributeValue('compatible'); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use DOMDocument; use DOMElement; use Throwable; use function count; use function file_get_contents; use function is_file; use function libxml_clear_errors; use function libxml_get_errors; use function libxml_use_internal_errors; use function sprintf; class ManifestDocument { public const XMLNS = 'https://phar.io/xml/manifest/1.0'; /** @var DOMDocument */ private $dom; public static function fromFile(string $filename): ManifestDocument { if (!is_file($filename)) { throw new ManifestDocumentException( sprintf('File "%s" not found', $filename) ); } return self::fromString( file_get_contents($filename) ); } public static function fromString(string $xmlString): ManifestDocument { $prev = libxml_use_internal_errors(true); libxml_clear_errors(); try { $dom = new DOMDocument(); $dom->loadXML($xmlString); $errors = libxml_get_errors(); libxml_use_internal_errors($prev); } catch (Throwable $t) { throw new ManifestDocumentException($t->getMessage(), 0, $t); } if (count($errors) !== 0) { throw new ManifestDocumentLoadingException($errors); } return new self($dom); } private function __construct(DOMDocument $dom) { $this->ensureCorrectDocumentType($dom); $this->dom = $dom; } public function getContainsElement(): ContainsElement { return new ContainsElement( $this->fetchElementByName('contains') ); } public function getCopyrightElement(): CopyrightElement { return new CopyrightElement( $this->fetchElementByName('copyright') ); } public function getRequiresElement(): RequiresElement { return new RequiresElement( $this->fetchElementByName('requires') ); } public function hasBundlesElement(): bool { return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; } public function getBundlesElement(): BundlesElement { return new BundlesElement( $this->fetchElementByName('bundles') ); } private function ensureCorrectDocumentType(DOMDocument $dom): void { $root = $dom->documentElement; if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { throw new ManifestDocumentException('Not a phar.io manifest document'); } } private function fetchElementByName(string $elementName): DOMElement { $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); if (!$element instanceof DOMElement) { throw new ManifestDocumentException( sprintf('Element %s missing', $elementName) ); } return $element; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class PhpElement extends ManifestElement { public function getVersion(): string { return $this->getAttributeValue('version'); } public function hasExtElements(): bool { return $this->hasChild('ext'); } public function getExtElements(): ExtElementCollection { return new ExtElementCollection( $this->getChildrenByName('ext') ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use DOMElement; use DOMNodeList; use function sprintf; class ManifestElement { public const XMLNS = 'https://phar.io/xml/manifest/1.0'; /** @var DOMElement */ private $element; public function __construct(DOMElement $element) { $this->element = $element; } protected function getAttributeValue(string $name): string { if (!$this->element->hasAttribute($name)) { throw new ManifestElementException( sprintf( 'Attribute %s not set on element %s', $name, $this->element->localName ) ); } return $this->element->getAttribute($name); } protected function hasAttribute(string $name): bool { return $this->element->hasAttribute($name); } protected function getChildByName(string $elementName): DOMElement { $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); if (!$element instanceof DOMElement) { throw new ManifestElementException( sprintf('Element %s missing', $elementName) ); } return $element; } protected function getChildrenByName(string $elementName): DOMNodeList { $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); if ($elementList->length === 0) { throw new ManifestElementException( sprintf('Element(s) %s missing', $elementName) ); } return $elementList; } protected function hasChild(string $elementName): bool { return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class CopyrightElement extends ManifestElement { public function getAuthorElements(): AuthorElementCollection { return new AuthorElementCollection( $this->getChildrenByName('author') ); } public function getLicenseElement(): LicenseElement { return new LicenseElement( $this->getChildByName('license') ); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\Exception as VersionException; use PharIo\Version\Version; use PharIo\Version\VersionConstraintParser; use Throwable; use function sprintf; class ManifestDocumentMapper { public function map(ManifestDocument $document): Manifest { try { $contains = $document->getContainsElement(); $type = $this->mapType($contains); $copyright = $this->mapCopyright($document->getCopyrightElement()); $requirements = $this->mapRequirements($document->getRequiresElement()); $bundledComponents = $this->mapBundledComponents($document); return new Manifest( new ApplicationName($contains->getName()), new Version($contains->getVersion()), $type, $copyright, $requirements, $bundledComponents ); } catch (Throwable $e) { throw new ManifestDocumentMapperException($e->getMessage(), (int)$e->getCode(), $e); } } private function mapType(ContainsElement $contains): Type { switch ($contains->getType()) { case 'application': return Type::application(); case 'library': return Type::library(); case 'extension': return $this->mapExtension($contains->getExtensionElement()); } throw new ManifestDocumentMapperException( sprintf('Unsupported type %s', $contains->getType()) ); } private function mapCopyright(CopyrightElement $copyright): CopyrightInformation { $authors = new AuthorCollection(); foreach ($copyright->getAuthorElements() as $authorElement) { $authors->add( new Author( $authorElement->getName(), $authorElement->hasEMail() ? new Email($authorElement->getEmail()) : null ) ); } $licenseElement = $copyright->getLicenseElement(); $license = new License( $licenseElement->getType(), new Url($licenseElement->getUrl()) ); return new CopyrightInformation( $authors, $license ); } private function mapRequirements(RequiresElement $requires): RequirementCollection { $collection = new RequirementCollection(); $phpElement = $requires->getPHPElement(); $parser = new VersionConstraintParser; try { $versionConstraint = $parser->parse($phpElement->getVersion()); } catch (VersionException $e) { throw new ManifestDocumentMapperException( sprintf('Unsupported version constraint - %s', $e->getMessage()), (int)$e->getCode(), $e ); } $collection->add( new PhpVersionRequirement( $versionConstraint ) ); if (!$phpElement->hasExtElements()) { return $collection; } foreach ($phpElement->getExtElements() as $extElement) { $collection->add( new PhpExtensionRequirement($extElement->getName()) ); } return $collection; } private function mapBundledComponents(ManifestDocument $document): BundledComponentCollection { $collection = new BundledComponentCollection(); if (!$document->hasBundlesElement()) { return $collection; } foreach ($document->getBundlesElement()->getComponentElements() as $componentElement) { $collection->add( new BundledComponent( $componentElement->getName(), new Version( $componentElement->getVersion() ) ) ); } return $collection; } private function mapExtension(ExtensionElement $extension): Extension { try { $versionConstraint = (new VersionConstraintParser)->parse($extension->getCompatible()); return Type::extension( new ApplicationName($extension->getFor()), $versionConstraint ); } catch (VersionException $e) { throw new ManifestDocumentMapperException( sprintf('Unsupported version constraint - %s', $e->getMessage()), (int)$e->getCode(), $e ); } } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use InvalidArgumentException; class NoEmailAddressException extends InvalidArgumentException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Throwable; interface Exception extends Throwable { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use RuntimeException; class ManifestElementException extends RuntimeException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use InvalidArgumentException; class InvalidUrlException extends InvalidArgumentException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class ManifestLoaderException extends \Exception implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use RuntimeException; class ManifestDocumentMapperException extends RuntimeException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use InvalidArgumentException; class ElementCollectionException extends InvalidArgumentException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use LibXMLError; use function sprintf; class ManifestDocumentLoadingException extends \Exception implements Exception { /** @var LibXMLError[] */ private $libxmlErrors; /** * ManifestDocumentLoadingException constructor. * * @param LibXMLError[] $libxmlErrors */ public function __construct(array $libxmlErrors) { $this->libxmlErrors = $libxmlErrors; $first = $this->libxmlErrors[0]; parent::__construct( sprintf( '%s (Line: %d / Column: %d / File: %s)', $first->message, $first->line, $first->column, $first->file ), $first->code ); } /** * @return LibXMLError[] */ public function getLibxmlErrors(): array { return $this->libxmlErrors; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use InvalidArgumentException; class InvalidApplicationNameException extends InvalidArgumentException implements Exception { public const InvalidFormat = 2; } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use RuntimeException; class ManifestDocumentException extends RuntimeException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use InvalidArgumentException; class InvalidEmailException extends InvalidArgumentException implements Exception { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use function sprintf; class ManifestLoader { public static function fromFile(string $filename): Manifest { try { return (new ManifestDocumentMapper())->map( ManifestDocument::fromFile($filename) ); } catch (Exception $e) { throw new ManifestLoaderException( sprintf('Loading %s failed.', $filename), (int)$e->getCode(), $e ); } } public static function fromPhar(string $filename): Manifest { return self::fromFile('phar://' . $filename . '/manifest.xml'); } public static function fromString(string $manifest): Manifest { try { return (new ManifestDocumentMapper())->map( ManifestDocument::fromString($manifest) ); } catch (Exception $e) { throw new ManifestLoaderException( 'Processing string failed', (int)$e->getCode(), $e ); } } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Countable; use IteratorAggregate; use function count; /** @template-implements IteratorAggregate */ class RequirementCollection implements Countable, IteratorAggregate { /** @var Requirement[] */ private $requirements = []; public function add(Requirement $requirement): void { $this->requirements[] = $requirement; } /** * @return Requirement[] */ public function getRequirements(): array { return $this->requirements; } public function count(): int { return count($this->requirements); } public function getIterator(): RequirementCollectionIterator { return new RequirementCollectionIterator($this); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\Version; use PharIo\Version\VersionConstraint; class Extension extends Type { /** @var ApplicationName */ private $application; /** @var VersionConstraint */ private $versionConstraint; public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) { $this->application = $application; $this->versionConstraint = $versionConstraint; } public function getApplicationName(): ApplicationName { return $this->application; } public function getVersionConstraint(): VersionConstraint { return $this->versionConstraint; } public function isExtension(): bool { return true; } public function isExtensionFor(ApplicationName $name): bool { return $this->application->isEqual($name); } public function isCompatibleWith(ApplicationName $name, Version $version): bool { return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Countable; use IteratorAggregate; use function count; /** @template-implements IteratorAggregate */ class AuthorCollection implements Countable, IteratorAggregate { /** @var Author[] */ private $authors = []; public function add(Author $author): void { $this->authors[] = $author; } /** * @return Author[] */ public function getAuthors(): array { return $this->authors; } public function count(): int { return count($this->authors); } public function getIterator(): AuthorCollectionIterator { return new AuthorCollectionIterator($this); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class Library extends Type { public function isLibrary(): bool { return true; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use function sprintf; class Author { /** @var string */ private $name; /** @var null|Email */ private $email; public function __construct(string $name, ?Email $email = null) { $this->name = $name; $this->email = $email; } public function asString(): string { if (!$this->hasEmail()) { return $this->name; } return sprintf( '%s <%s>', $this->name, $this->email->asString() ); } public function getName(): string { return $this->name; } /** * @psalm-assert-if-true Email $this->email */ public function hasEmail(): bool { return $this->email !== null; } public function getEmail(): Email { if (!$this->hasEmail()) { throw new NoEmailAddressException(); } return $this->email; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; interface Requirement { } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\Version; class Manifest { /** @var ApplicationName */ private $name; /** @var Version */ private $version; /** @var Type */ private $type; /** @var CopyrightInformation */ private $copyrightInformation; /** @var RequirementCollection */ private $requirements; /** @var BundledComponentCollection */ private $bundledComponents; public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) { $this->name = $name; $this->version = $version; $this->type = $type; $this->copyrightInformation = $copyrightInformation; $this->requirements = $requirements; $this->bundledComponents = $bundledComponents; } public function getName(): ApplicationName { return $this->name; } public function getVersion(): Version { return $this->version; } public function getType(): Type { return $this->type; } public function getCopyrightInformation(): CopyrightInformation { return $this->copyrightInformation; } public function getRequirements(): RequirementCollection { return $this->requirements; } public function getBundledComponents(): BundledComponentCollection { return $this->bundledComponents; } public function isApplication(): bool { return $this->type->isApplication(); } public function isLibrary(): bool { return $this->type->isLibrary(); } public function isExtension(): bool { return $this->type->isExtension(); } public function isExtensionFor(ApplicationName $application, ?Version $version = null): bool { if (!$this->isExtension()) { return false; } /** @var Extension $type */ $type = $this->type; if ($version !== null) { return $type->isCompatibleWith($application, $version); } return $type->isExtensionFor($application); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class PhpExtensionRequirement implements Requirement { /** @var string */ private $extension; public function __construct(string $extension) { $this->extension = $extension; } public function asString(): string { return $this->extension; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use const FILTER_VALIDATE_URL; use function filter_var; class Url { /** @var string */ private $url; public function __construct(string $url) { $this->ensureUrlIsValid($url); $this->url = $url; } public function asString(): string { return $this->url; } /** * @throws InvalidUrlException */ private function ensureUrlIsValid(string $url): void { if (filter_var($url, FILTER_VALIDATE_URL) === false) { throw new InvalidUrlException; } } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\Version; class BundledComponent { /** @var string */ private $name; /** @var Version */ private $version; public function __construct(string $name, Version $version) { $this->name = $name; $this->version = $version; } public function getName(): string { return $this->name; } public function getVersion(): Version { return $this->version; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class License { /** @var string */ private $name; /** @var Url */ private $url; public function __construct(string $name, Url $url) { $this->name = $name; $this->url = $url; } public function getName(): string { return $this->name; } public function getUrl(): Url { return $this->url; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\VersionConstraint; class PhpVersionRequirement implements Requirement { /** @var VersionConstraint */ private $versionConstraint; public function __construct(VersionConstraint $versionConstraint) { $this->versionConstraint = $versionConstraint; } public function getVersionConstraint(): VersionConstraint { return $this->versionConstraint; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Countable; use IteratorAggregate; use function count; /** @template-implements IteratorAggregate */ class BundledComponentCollection implements Countable, IteratorAggregate { /** @var BundledComponent[] */ private $bundledComponents = []; public function add(BundledComponent $bundledComponent): void { $this->bundledComponents[] = $bundledComponent; } /** * @return BundledComponent[] */ public function getBundledComponents(): array { return $this->bundledComponents; } public function count(): int { return count($this->bundledComponents); } public function getIterator(): BundledComponentCollectionIterator { return new BundledComponentCollectionIterator($this); } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use PharIo\Version\VersionConstraint; abstract class Type { public static function application(): Application { return new Application; } public static function library(): Library { return new Library; } public static function extension(ApplicationName $application, VersionConstraint $versionConstraint): Extension { return new Extension($application, $versionConstraint); } /** @psalm-assert-if-true Application $this */ public function isApplication(): bool { return false; } /** @psalm-assert-if-true Library $this */ public function isLibrary(): bool { return false; } /** @psalm-assert-if-true Extension $this */ public function isExtension(): bool { return false; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use function preg_match; use function sprintf; class ApplicationName { /** @var string */ private $name; public function __construct(string $name) { $this->ensureValidFormat($name); $this->name = $name; } public function asString(): string { return $this->name; } public function isEqual(ApplicationName $name): bool { return $this->name === $name->name; } private function ensureValidFormat(string $name): void { if (!preg_match('#\w/\w#', $name)) { throw new InvalidApplicationNameException( sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), InvalidApplicationNameException::InvalidFormat ); } } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class Application extends Type { public function isApplication(): bool { return true; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; class CopyrightInformation { /** @var AuthorCollection */ private $authors; /** @var License */ private $license; public function __construct(AuthorCollection $authors, License $license) { $this->authors = $authors; $this->license = $license; } public function getAuthors(): AuthorCollection { return $this->authors; } public function getLicense(): License { return $this->license; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use const FILTER_VALIDATE_EMAIL; use function filter_var; class Email { /** @var string */ private $email; public function __construct(string $email) { $this->ensureEmailIsValid($email); $this->email = $email; } public function asString(): string { return $this->email; } private function ensureEmailIsValid(string $url): void { if (filter_var($url, FILTER_VALIDATE_EMAIL) === false) { throw new InvalidEmailException; } } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Iterator; use function count; /** @template-implements Iterator */ class BundledComponentCollectionIterator implements Iterator { /** @var BundledComponent[] */ private $bundledComponents; /** @var int */ private $position = 0; public function __construct(BundledComponentCollection $bundledComponents) { $this->bundledComponents = $bundledComponents->getBundledComponents(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->bundledComponents); } public function key(): int { return $this->position; } public function current(): BundledComponent { return $this->bundledComponents[$this->position]; } public function next(): void { $this->position++; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Iterator; use function count; /** @template-implements Iterator */ class AuthorCollectionIterator implements Iterator { /** @var Author[] */ private $authors; /** @var int */ private $position = 0; public function __construct(AuthorCollection $authors) { $this->authors = $authors->getAuthors(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->authors); } public function key(): int { return $this->position; } public function current(): Author { return $this->authors[$this->position]; } public function next(): void { $this->position++; } } , Sebastian Heuer , Sebastian Bergmann and contributors * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace PharIo\Manifest; use Iterator; use function count; /** @template-implements Iterator */ class RequirementCollectionIterator implements Iterator { /** @var Requirement[] */ private $requirements; /** @var int */ private $position = 0; public function __construct(RequirementCollection $requirements) { $this->requirements = $requirements->getRequirements(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->requirements); } public function key(): int { return $this->position; } public function current(): Requirement { return $this->requirements[$this->position]; } public function next(): void { $this->position++; } } Phar.io - Manifest Copyright (c) 2016-2019 Arne Blankerts , Sebastian Heuer , Sebastian Bergmann , and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Arne Blankerts nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "279b3c4fe44357abd924fdcc0cfa5664", "packages": [ { "name": "phar-io/version", "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", "source": "https://github.com/phar-io/version/tree/3.2.1" }, "time": "2022-02-21T01:04:05+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.2 || ^8.0", "ext-dom": "*", "ext-phar": "*", "ext-libxml": "*", "ext-xmlwriter": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0" } # Changelog All notable changes to phar-io/version are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [3.2.1] - 2022-02-21 ### Fixed - Have ExactVersionConstraint honor build metadata (added in 3.2.0) ## [3.2.0] - 2022-02-21 ### Added - Build metadata is now supported and considered for equality checks only ## [3.1.1] - 2022-02-07 ### Fixed - [#28](https://github.com/phar-io/version/issues/28): `VersionConstraintParser` does not support logical OR represented by single pipe (|) (Thanks @llaville) ## [3.1.0] - 2021-02-23 ### Changed - Internal Refactoring - More scalar types ### Added - [#24](https://github.com/phar-io/version/issues/24): `Version::getOriginalString()` added (Thanks @addshore) - Version constraints using the caret operator (`^`) now honor pre-1.0 releases, e.g. `^0.3` translates to `0.3.*`) - Various integration tests for version constraint processing ### Fixed - [#23](https://github.com/phar-io/version/pull/23): Tilde operator without patch level ## [3.0.4] - 14.12.2020 ### Fixed - [#22](https://github.com/phar-io/version/pull/22): make dev suffix rank works for uppercase too ## [3.0.3] - 30.11.2020 ### Added - Comparator method `Version::equals()` added ## [3.0.2] - 27.06.2020 This release now supports PHP 7.2+ and PHP ^8.0. No other changes included. ## [3.0.1] - 09.05.2020 __Potential BC Break Notice:__ `Version::getVersionString()` no longer returns `v` prefixes in case the "input" string contained one. These are not part of the semver specs (see https://semver.org/#is-v123-a-semantic-version) and get stripped out. As of Version 3.1.0 `Version::getOriginalString()` can be used to still retrieve it as given. ### Changed - Internal Refactoring - More scalar types ### Fixed - Fixed Constraint processing Regression for ^1.2 and ~1.2 ## [3.0.0] - 05.05.2020 ### Changed - Require PHP 7.2+ - All code now uses strict mode - Scalar types have been added as needed ### Added - The technically invalid format using 'v' prefix ("v1.2.3") is now properly supported ## [2.0.1] - 08.07.2018 ### Fixed - Versions without a pre-release suffix are now always considered greater than versions with a pre-release suffix. Example: `3.0.0 > 3.0.0-alpha.1` ## [2.0.0] - 23.06.2018 Changes to public API: - `PreReleaseSuffix::construct()`: optional parameter `$number` removed - `PreReleaseSuffix::isGreaterThan()`: introduced - `Version::hasPreReleaseSuffix()`: introduced ### Added - [#11](https://github.com/phar-io/version/issues/11): Added support for pre-release version suffixes. Supported values are: - `dev` - `beta` (also abbreviated form `b`) - `rc` - `alpha` (also abbreviated form `a`) - `patch` (also abbreviated form `p`) All values can be followed by a number, e.g. `beta3`. When comparing versions, the pre-release suffix is taken into account. Example: `1.5.0 > 1.5.0-beta1 > 1.5.0-alpha3 > 1.5.0-alpha2 > 1.5.0-dev11` ### Changed - reorganized the source directories ### Fixed - [#10](https://github.com/phar-io/version/issues/10): Version numbers containing a numeric suffix as seen in Debian packages are now supported. [3.1.0]: https://github.com/phar-io/version/compare/3.0.4...3.1.0 [3.0.4]: https://github.com/phar-io/version/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/phar-io/version/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/phar-io/version/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/phar-io/version/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/phar-io/version/compare/2.0.1...3.0.0 [2.0.1]: https://github.com/phar-io/version/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/phar-io/version/compare/1.0.1...2.0.0 { "name": "phar-io/version", "description": "Library for handling version information and constraints", "license": "BSD-3-Clause", "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "support": { "issues": "https://github.com/phar-io/version/issues" }, "require": { "php": "^7.2 || ^8.0" }, "autoload": { "classmap": [ "src/" ] } } # Version Library for handling version information and constraints [![Build Status](https://travis-ci.org/phar-io/version.svg?branch=master)](https://travis-ci.org/phar-io/version) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require phar-io/version If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev phar-io/version ## Version constraints A Version constraint describes a range of versions or a discrete version number. The format of version numbers follows the schema of [semantic versioning](http://semver.org): `..`. A constraint might contain an operator that describes the range. Beside the typical mathematical operators like `<=`, `>=`, there are two special operators: *Caret operator*: `^1.0` can be written as `>=1.0.0 <2.0.0` and read as »every Version within major version `1`«. *Tilde operator*: `~1.0.0` can be written as `>=1.0.0 <1.1.0` and read as »every version within minor version `1.1`. The behavior of tilde operator depends on whether a patch level version is provided or not. If no patch level is provided, tilde operator behaves like the caret operator: `~1.0` is identical to `^1.0`. ## Usage examples Parsing version constraints and check discrete versions for compliance: ```php use PharIo\Version\Version; use PharIo\Version\VersionConstraintParser; $parser = new VersionConstraintParser(); $caret_constraint = $parser->parse( '^7.0' ); $caret_constraint->complies( new Version( '7.0.17' ) ); // true $caret_constraint->complies( new Version( '7.1.0' ) ); // true $caret_constraint->complies( new Version( '6.4.34' ) ); // false $tilde_constraint = $parser->parse( '~1.1.0' ); $tilde_constraint->complies( new Version( '1.1.4' ) ); // true $tilde_constraint->complies( new Version( '1.2.0' ) ); // false ``` As of version 2.0.0, pre-release labels are supported and taken into account when comparing versions: ```php $leftVersion = new PharIo\Version\Version('3.0.0-alpha.1'); $rightVersion = new PharIo\Version\Version('3.0.0-alpha.2'); $leftVersion->isGreaterThan($rightVersion); // false $rightVersion->isGreaterThan($leftVersion); // true ``` , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class VersionConstraintParser { /** * @throws UnsupportedVersionConstraintException */ public function parse(string $value): VersionConstraint { if (\strpos($value, '|') !== false) { return $this->handleOrGroup($value); } if (!\preg_match('/^[\^~*]?v?[\d.*]+(?:-.*)?$/i', $value)) { throw new UnsupportedVersionConstraintException( \sprintf('Version constraint %s is not supported.', $value) ); } switch ($value[0]) { case '~': return $this->handleTildeOperator($value); case '^': return $this->handleCaretOperator($value); } $constraint = new VersionConstraintValue($value); if ($constraint->getMajor()->isAny()) { return new AnyVersionConstraint(); } if ($constraint->getMinor()->isAny()) { return new SpecificMajorVersionConstraint( $constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0 ); } if ($constraint->getPatch()->isAny()) { return new SpecificMajorAndMinorVersionConstraint( $constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0, $constraint->getMinor()->getValue() ?? 0 ); } return new ExactVersionConstraint($constraint->getVersionString()); } private function handleOrGroup(string $value): OrVersionConstraintGroup { $constraints = []; foreach (\preg_split('{\s*\|\|?\s*}', \trim($value)) as $groupSegment) { $constraints[] = $this->parse(\trim($groupSegment)); } return new OrVersionConstraintGroup($value, $constraints); } private function handleTildeOperator(string $value): AndVersionConstraintGroup { $constraintValue = new VersionConstraintValue(\substr($value, 1)); if ($constraintValue->getPatch()->isAny()) { return $this->handleCaretOperator($value); } $constraints = [ new GreaterThanOrEqualToVersionConstraint( $value, new Version(\substr($value, 1)) ), new SpecificMajorAndMinorVersionConstraint( $value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0 ) ]; return new AndVersionConstraintGroup($value, $constraints); } private function handleCaretOperator(string $value): AndVersionConstraintGroup { $constraintValue = new VersionConstraintValue(\substr($value, 1)); $constraints = [ new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1))) ]; if ($constraintValue->getMajor()->getValue() === 0) { $constraints[] = new SpecificMajorAndMinorVersionConstraint( $value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0 ); } else { $constraints[] = new SpecificMajorVersionConstraint( $value, $constraintValue->getMajor()->getValue() ?? 0 ); } return new AndVersionConstraintGroup( $value, $constraints ); } } versionString = $versionString; $this->parseVersion($versionString); } public function getLabel(): string { return $this->label; } public function getBuildMetaData(): string { return $this->buildMetaData; } public function getVersionString(): string { return $this->versionString; } public function getMajor(): VersionNumber { return $this->major; } public function getMinor(): VersionNumber { return $this->minor; } public function getPatch(): VersionNumber { return $this->patch; } private function parseVersion(string $versionString): void { $this->extractBuildMetaData($versionString); $this->extractLabel($versionString); $this->stripPotentialVPrefix($versionString); $versionSegments = \explode('.', $versionString); $this->major = new VersionNumber(\is_numeric($versionSegments[0]) ? (int)$versionSegments[0] : null); $minorValue = isset($versionSegments[1]) && \is_numeric($versionSegments[1]) ? (int)$versionSegments[1] : null; $patchValue = isset($versionSegments[2]) && \is_numeric($versionSegments[2]) ? (int)$versionSegments[2] : null; $this->minor = new VersionNumber($minorValue); $this->patch = new VersionNumber($patchValue); } private function extractBuildMetaData(string &$versionString): void { if (\preg_match('/\+(.*)/', $versionString, $matches) === 1) { $this->buildMetaData = $matches[1]; $versionString = \str_replace($matches[0], '', $versionString); } } private function extractLabel(string &$versionString): void { if (\preg_match('/-(.*)/', $versionString, $matches) === 1) { $this->label = $matches[1]; $versionString = \str_replace($matches[0], '', $versionString); } } private function stripPotentialVPrefix(string &$versionString): void { if ($versionString[0] !== 'v') { return; } $versionString = \substr($versionString, 1); } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class BuildMetaData { /** @var string */ private $value; public function __construct(string $value) { $this->value = $value; } public function asString(): string { return $this->value; } public function equals(BuildMetaData $other): bool { return $this->asString() === $other->asString(); } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint { /** @var int */ private $major; /** @var int */ private $minor; public function __construct(string $originalValue, int $major, int $minor) { parent::__construct($originalValue); $this->major = $major; $this->minor = $minor; } public function complies(Version $version): bool { if ($version->getMajor()->getValue() !== $this->major) { return false; } return $version->getMinor()->getValue() === $this->minor; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class SpecificMajorVersionConstraint extends AbstractVersionConstraint { /** @var int */ private $major; public function __construct(string $originalValue, int $major) { parent::__construct($originalValue); $this->major = $major; } public function complies(Version $version): bool { return $version->getMajor()->getValue() === $this->major; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint { /** @var Version */ private $minimalVersion; public function __construct(string $originalValue, Version $minimalVersion) { parent::__construct($originalValue); $this->minimalVersion = $minimalVersion; } public function complies(Version $version): bool { return $version->getVersionString() === $this->minimalVersion->getVersionString() || $version->isGreaterThan($this->minimalVersion); } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class AndVersionConstraintGroup extends AbstractVersionConstraint { /** @var VersionConstraint[] */ private $constraints = []; /** * @param VersionConstraint[] $constraints */ public function __construct(string $originalValue, array $constraints) { parent::__construct($originalValue); $this->constraints = $constraints; } public function complies(Version $version): bool { foreach ($this->constraints as $constraint) { if (!$constraint->complies($version)) { return false; } } return true; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; abstract class AbstractVersionConstraint implements VersionConstraint { /** @var string */ private $originalValue; public function __construct(string $originalValue) { $this->originalValue = $originalValue; } public function asString(): string { return $this->originalValue; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class AnyVersionConstraint implements VersionConstraint { public function complies(Version $version): bool { return true; } public function asString(): string { return '*'; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; interface VersionConstraint { public function complies(Version $version): bool; public function asString(): string; } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class ExactVersionConstraint extends AbstractVersionConstraint { public function complies(Version $version): bool { $other = $version->getVersionString(); if ($version->hasBuildMetaData()) { $other .= '+' . $version->getBuildMetaData()->asString(); } return $this->asString() === $other; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class OrVersionConstraintGroup extends AbstractVersionConstraint { /** @var VersionConstraint[] */ private $constraints = []; /** * @param string $originalValue * @param VersionConstraint[] $constraints */ public function __construct($originalValue, array $constraints) { parent::__construct($originalValue); $this->constraints = $constraints; } public function complies(Version $version): bool { foreach ($this->constraints as $constraint) { if ($constraint->complies($version)) { return true; } } return false; } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; use Throwable; interface Exception extends Throwable { } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception { } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class Version { /** @var string */ private $originalVersionString; /** @var VersionNumber */ private $major; /** @var VersionNumber */ private $minor; /** @var VersionNumber */ private $patch; /** @var null|PreReleaseSuffix */ private $preReleaseSuffix; /** @var null|BuildMetaData */ private $buildMetadata; public function __construct(string $versionString) { $this->ensureVersionStringIsValid($versionString); $this->originalVersionString = $versionString; } /** * @throws NoPreReleaseSuffixException */ public function getPreReleaseSuffix(): PreReleaseSuffix { if ($this->preReleaseSuffix === null) { throw new NoPreReleaseSuffixException('No pre-release suffix set'); } return $this->preReleaseSuffix; } public function getOriginalString(): string { return $this->originalVersionString; } public function getVersionString(): string { $str = \sprintf( '%d.%d.%d', $this->getMajor()->getValue() ?? 0, $this->getMinor()->getValue() ?? 0, $this->getPatch()->getValue() ?? 0 ); if (!$this->hasPreReleaseSuffix()) { return $str; } return $str . '-' . $this->getPreReleaseSuffix()->asString(); } public function hasPreReleaseSuffix(): bool { return $this->preReleaseSuffix !== null; } public function equals(Version $other): bool { if ($this->getVersionString() !== $other->getVersionString()) { return false; } if ($this->hasBuildMetaData() !== $other->hasBuildMetaData()) { return false; } if ($this->hasBuildMetaData() && $other->hasBuildMetaData() && !$this->getBuildMetaData()->equals($other->getBuildMetaData())) { return false; } return true; } public function isGreaterThan(Version $version): bool { if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { return false; } if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { return true; } if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { return false; } if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { return true; } if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { return false; } if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { return true; } if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { return false; } if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { return true; } if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { return false; } return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); } public function getMajor(): VersionNumber { return $this->major; } public function getMinor(): VersionNumber { return $this->minor; } public function getPatch(): VersionNumber { return $this->patch; } /** * @psalm-assert-if-true BuildMetaData $this->buildMetadata * @psalm-assert-if-true BuildMetaData $this->getBuildMetaData() */ public function hasBuildMetaData(): bool { return $this->buildMetadata !== null; } /** * @throws NoBuildMetaDataException */ public function getBuildMetaData(): BuildMetaData { if (!$this->hasBuildMetaData()) { throw new NoBuildMetaDataException('No build metadata set'); } return $this->buildMetadata; } /** * @param string[] $matches * * @throws InvalidPreReleaseSuffixException */ private function parseVersion(array $matches): void { $this->major = new VersionNumber((int)$matches['Major']); $this->minor = new VersionNumber((int)$matches['Minor']); $this->patch = isset($matches['Patch']) ? new VersionNumber((int)$matches['Patch']) : new VersionNumber(0); if (isset($matches['PreReleaseSuffix']) && $matches['PreReleaseSuffix'] !== '') { $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); } if (isset($matches['BuildMetadata'])) { $this->buildMetadata = new BuildMetaData($matches['BuildMetadata']); } } /** * @param string $version * * @throws InvalidVersionException */ private function ensureVersionStringIsValid($version): void { $regex = '/^v? (?P0|[1-9]\d*) \\. (?P0|[1-9]\d*) (\\. (?P0|[1-9]\d*) )? (?: - (?(?:(dev|beta|b|rc|alpha|a|patch|p|pl)\.?\d*)) )? (?: \\+ (?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-@]+)*) )? $/xi'; if (\preg_match($regex, $version, $matches) !== 1) { throw new InvalidVersionException( \sprintf("Version string '%s' does not follow SemVer semantics", $version) ); } $this->parseVersion($matches); } } 0, 'a' => 1, 'alpha' => 1, 'b' => 2, 'beta' => 2, 'rc' => 3, 'p' => 4, 'pl' => 4, 'patch' => 4, ]; /** @var string */ private $value; /** @var int */ private $valueScore; /** @var int */ private $number = 0; /** @var string */ private $full; /** * @throws InvalidPreReleaseSuffixException */ public function __construct(string $value) { $this->parseValue($value); } public function asString(): string { return $this->full; } public function getValue(): string { return $this->value; } public function getNumber(): ?int { return $this->number; } public function isGreaterThan(PreReleaseSuffix $suffix): bool { if ($this->valueScore > $suffix->valueScore) { return true; } if ($this->valueScore < $suffix->valueScore) { return false; } return $this->getNumber() > $suffix->getNumber(); } private function mapValueToScore(string $value): int { $value = \strtolower($value); return self::valueScoreMap[$value]; } private function parseValue(string $value): void { $regex = '/-?((dev|beta|b|rc|alpha|a|patch|p|pl)\.?(\d*)).*$/i'; if (\preg_match($regex, $value, $matches) !== 1) { throw new InvalidPreReleaseSuffixException(\sprintf('Invalid label %s', $value)); } $this->full = $matches[1]; $this->value = $matches[2]; if ($matches[3] !== '') { $this->number = (int)$matches[3]; } $this->valueScore = $this->mapValueToScore($matches[2]); } } , Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class VersionNumber { /** @var ?int */ private $value; public function __construct(?int $value) { $this->value = $value; } public function isAny(): bool { return $this->value === null; } public function getValue(): ?int { return $this->value; } } Copyright (c) 2016-2017 Arne Blankerts , Sebastian Heuer and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { "name": "php-di/invoker", "description": "Generic and extensible callable invoker", "keywords": ["invoker", "dependency-injection", "dependency", "injection", "callable", "invoke"], "homepage": "https://github.com/PHP-DI/Invoker", "license": "MIT", "type": "library", "autoload": { "psr-4": { "Invoker\\": "src/" } }, "autoload-dev": { "psr-4": { "Invoker\\Test\\": "tests/" } }, "require": { "php": ">=7.3", "psr/container": "^1.0|^2.0" }, "require-dev": { "phpunit/phpunit": "^9.0 || ^10 || ^11 || ^12", "athletic/athletic": "~0.1.8", "mnapoli/hard-mode": "~0.3.0" }, "config": { "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true } } } # Invoker Generic and extensible callable invoker. [![CI](https://github.com/PHP-DI/Invoker/actions/workflows/ci.yml/badge.svg)](https://github.com/PHP-DI/Invoker/actions/workflows/ci.yml) [![Latest Version](https://img.shields.io/github/release/PHP-DI/invoker.svg?style=flat-square)](https://packagist.org/packages/PHP-DI/invoker) [![Total Downloads](https://img.shields.io/packagist/dt/php-di/invoker.svg?style=flat-square)](https://packagist.org/packages/php-di/invoker) ## Why? Who doesn't need an over-engineered `call_user_func()`? ### Named parameters Does this [Silex](https://github.com/silexphp/Silex#readme) example look familiar: ```php $app->get('/project/{project}/issue/{issue}', function ($project, $issue) { // ... }); ``` Or this command defined with [Silly](https://github.com/mnapoli/silly#usage): ```php $app->command('greet [name] [--yell]', function ($name, $yell) { // ... }); ``` Same pattern in [Slim](https://www.slimframework.com): ```php $app->get('/hello/:name', function ($name) { // ... }); ``` You get the point. These frameworks invoke the controller/command/handler using something akin to named parameters: whatever the order of the parameters, they are matched by their name. **This library allows to invoke callables with named parameters in a generic and extensible way.** ### Dependency injection Anyone familiar with AngularJS is familiar with how dependency injection is performed: ```js angular.controller('MyController', ['dep1', 'dep2', function(dep1, dep2) { // ... }]); ``` In PHP we find this pattern again in some frameworks and DI containers with partial to full support. For example in Silex you can type-hint the application to get it injected, but it only works with `Silex\Application`: ```php $app->get('/hello/{name}', function (Silex\Application $app, $name) { // ... }); ``` In Silly, it only works with `OutputInterface` to inject the application output: ```php $app->command('greet [name]', function ($name, OutputInterface $output) { // ... }); ``` [PHP-DI](https://php-di.org/doc/container.html) provides a way to invoke a callable and resolve all dependencies from the container using type-hints: ```php $container->call(function (Logger $logger, EntityManager $em) { // ... }); ``` **This library provides clear extension points to let frameworks implement any kind of dependency injection support they want.** ### TL/DR In short, this library is meant to be a base building block for calling a function with named parameters and/or dependency injection. ## Installation ```sh $ composer require PHP-DI/invoker ``` ## Usage ### Default behavior By default the `Invoker` can call using named parameters: ```php $invoker = new Invoker\Invoker; $invoker->call(function () { echo 'Hello world!'; }); // Simple parameter array $invoker->call(function ($name) { echo 'Hello ' . $name; }, ['John']); // Named parameters $invoker->call(function ($name) { echo 'Hello ' . $name; }, [ 'name' => 'John' ]); // Use the default value $invoker->call(function ($name = 'world') { echo 'Hello ' . $name; }); // Invoke any PHP callable $invoker->call(['MyClass', 'myStaticMethod']); // Using Class::method syntax $invoker->call('MyClass::myStaticMethod'); ``` Dependency injection in parameters is supported but needs to be configured with your container. Read on or jump to [*Built-in support for dependency injection*](#built-in-support-for-dependency-injection) if you are impatient. Additionally, callables can also be resolved from your container. Read on or jump to [*Resolving callables from a container*](#resolving-callables-from-a-container) if you are impatient. ### Parameter resolvers Extending the behavior of the `Invoker` is easy and is done by implementing a [`ParameterResolver`](https://github.com/PHP-DI/Invoker/blob/master/src/ParameterResolver/ParameterResolver.php). This is explained in details the [Parameter resolvers documentation](doc/parameter-resolvers.md). #### Built-in support for dependency injection Rather than have you re-implement support for dependency injection with different containers every time, this package ships with 2 optional resolvers: - [`TypeHintContainerResolver`](https://github.com/PHP-DI/Invoker/blob/master/src/ParameterResolver/Container/TypeHintContainerResolver.php) This resolver will inject container entries by searching for the class name using the type-hint: ```php $invoker->call(function (Psr\Logger\LoggerInterface $logger) { // ... }); ``` In this example it will `->get('Psr\Logger\LoggerInterface')` from the container and inject it. This resolver is only useful if you store objects in your container using the class (or interface) name. Silex or Symfony for example store services under a custom name (e.g. `twig`, `db`, etc.) instead of the class name: in that case use the resolver shown below. - [`ParameterNameContainerResolver`](https://github.com/PHP-DI/Invoker/blob/master/src/ParameterResolver/Container/ParameterNameContainerResolver.php) This resolver will inject container entries by searching for the name of the parameter: ```php $invoker->call(function ($twig) { // ... }); ``` In this example it will `->get('twig')` from the container and inject it. These resolvers can work with any dependency injection container compliant with [PSR-11](http://www.php-fig.org/psr/psr-11/). Setting up those resolvers is simple: ```php // $container must be an instance of Psr\Container\ContainerInterface $container = ... $containerResolver = new TypeHintContainerResolver($container); // or $containerResolver = new ParameterNameContainerResolver($container); $invoker = new Invoker\Invoker; // Register it before all the other parameter resolvers $invoker->getParameterResolver()->prependResolver($containerResolver); ``` You can also register both resolvers at the same time if you wish by prepending both. Implementing support for more tricky things is easy and up to you! ### Resolving callables from a container The `Invoker` can be wired to your DI container to resolve the callables. For example with an invokable class: ```php class MyHandler { public function __invoke() { // ... } } // By default this doesn't work: an instance of the class should be provided $invoker->call('MyHandler'); // If we set up the container to use $invoker = new Invoker\Invoker(null, $container); // Now 'MyHandler' is resolved using the container! $invoker->call('MyHandler'); ``` The same works for a class method: ```php class WelcomeController { public function home() { // ... } } // By default this doesn't work: home() is not a static method $invoker->call(['WelcomeController', 'home']); // If we set up the container to use $invoker = new Invoker\Invoker(null, $container); // Now 'WelcomeController' is resolved using the container! $invoker->call(['WelcomeController', 'home']); // Alternatively we can use the Class::method syntax $invoker->call('WelcomeController::home'); ``` That feature can be used as the base building block for a framework's dispatcher. Again, any [PSR-11](https://www.php-fig.org/psr/psr-11/) compliant container can be provided. parameterResolver = $parameterResolver ?: $this->createParameterResolver(); $this->container = $container; if ($container) { $this->callableResolver = new CallableResolver($container); } } /** * {@inheritdoc} */ public function call($callable, array $parameters = []) { if ($this->callableResolver) { $callable = $this->callableResolver->resolve($callable); } if (! is_callable($callable)) { throw new NotCallableException(sprintf( '%s is not a callable', is_object($callable) ? 'Instance of ' . get_class($callable) : var_export($callable, true) )); } $callableReflection = CallableReflection::create($callable); $args = $this->parameterResolver->getParameters($callableReflection, $parameters, []); // Sort by array key because call_user_func_array ignores numeric keys ksort($args); // Check all parameters are resolved $diff = array_diff_key($callableReflection->getParameters(), $args); $parameter = reset($diff); if ($parameter && \assert($parameter instanceof ReflectionParameter) && ! $parameter->isVariadic()) { throw new NotEnoughParametersException(sprintf( 'Unable to invoke the callable because no value was given for parameter %d ($%s)', $parameter->getPosition() + 1, $parameter->name )); } return call_user_func_array($callable, $args); } /** * Create the default parameter resolver. */ private function createParameterResolver(): ParameterResolver { return new ResolverChain([ new NumericArrayResolver, new AssociativeArrayResolver, new DefaultValueResolver, ]); } /** * @return ParameterResolver By default it's a ResolverChain */ public function getParameterResolver(): ParameterResolver { return $this->parameterResolver; } public function getContainer(): ?ContainerInterface { return $this->container; } /** * @return CallableResolver|null Returns null if no container was given in the constructor. */ public function getCallableResolver(): ?CallableResolver { return $this->callableResolver; } } getParameters(); // Skip parameters already resolved if (! empty($resolvedParameters)) { $parameters = array_diff_key($parameters, $resolvedParameters); } foreach ($parameters as $index => $parameter) { $parameterType = $parameter->getType(); if (! $parameterType) { // No type continue; } if (! $parameterType instanceof ReflectionNamedType) { // Union types are not supported continue; } if ($parameterType->isBuiltin()) { // Primitive types are not supported continue; } $parameterClass = $parameterType->getName(); if ($parameterClass === 'self') { $parameterClass = $parameter->getDeclaringClass()->getName(); } if (array_key_exists($parameterClass, $providedParameters)) { $resolvedParameters[$index] = $providedParameters[$parameterClass]; } } return $resolvedParameters; } } call($callable, ['foo', 'bar'])` will simply resolve the parameters * to `['foo', 'bar']`. * * Parameters that are not indexed by a number (i.e. parameter position) * will be ignored. */ class NumericArrayResolver implements ParameterResolver { public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters ): array { // Skip parameters already resolved if (! empty($resolvedParameters)) { $providedParameters = array_diff_key($providedParameters, $resolvedParameters); } foreach ($providedParameters as $key => $value) { if (is_int($key)) { $resolvedParameters[$key] = $value; } } return $resolvedParameters; } } call($callable, ['foo' => 'bar'])` will inject the string `'bar'` * in the parameter named `$foo`. * * Parameters that are not indexed by a string are ignored. */ class AssociativeArrayResolver implements ParameterResolver { public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters ): array { $parameters = $reflection->getParameters(); // Skip parameters already resolved if (! empty($resolvedParameters)) { $parameters = array_diff_key($parameters, $resolvedParameters); } foreach ($parameters as $index => $parameter) { if (array_key_exists($parameter->name, $providedParameters)) { $resolvedParameters[$index] = $providedParameters[$parameter->name]; } } return $resolvedParameters; } } getParameters(); // Skip parameters already resolved if (! empty($resolvedParameters)) { $parameters = array_diff_key($parameters, $resolvedParameters); } foreach ($parameters as $index => $parameter) { \assert($parameter instanceof \ReflectionParameter); if ($parameter->isDefaultValueAvailable()) { try { $resolvedParameters[$index] = $parameter->getDefaultValue(); } catch (ReflectionException $e) { // Can't get default values from PHP internal classes and functions } } else { $parameterType = $parameter->getType(); if ($parameterType && $parameterType->allowsNull()) { $resolvedParameters[$index] = null; } } } return $resolvedParameters; } } container = $container; } public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters ): array { $parameters = $reflection->getParameters(); // Skip parameters already resolved if (! empty($resolvedParameters)) { $parameters = array_diff_key($parameters, $resolvedParameters); } foreach ($parameters as $index => $parameter) { $parameterType = $parameter->getType(); if (! $parameterType) { // No type continue; } if (! $parameterType instanceof ReflectionNamedType) { // Union types are not supported continue; } if ($parameterType->isBuiltin()) { // Primitive types are not supported continue; } $parameterClass = $parameterType->getName(); if ($parameterClass === 'self') { $parameterClass = $parameter->getDeclaringClass()->getName(); } if ($this->container->has($parameterClass)) { $resolvedParameters[$index] = $this->container->get($parameterClass); } } return $resolvedParameters; } } container = $container; } public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters ): array { $parameters = $reflection->getParameters(); // Skip parameters already resolved if (! empty($resolvedParameters)) { $parameters = array_diff_key($parameters, $resolvedParameters); } foreach ($parameters as $index => $parameter) { $name = $parameter->name; if ($name && $this->container->has($name)) { $resolvedParameters[$index] = $this->container->get($name); } } return $resolvedParameters; } } resolvers = $resolvers; } public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters ): array { $reflectionParameters = $reflection->getParameters(); foreach ($this->resolvers as $resolver) { $resolvedParameters = $resolver->getParameters( $reflection, $providedParameters, $resolvedParameters ); $diff = array_diff_key($reflectionParameters, $resolvedParameters); if (empty($diff)) { // Stop traversing: all parameters are resolved return $resolvedParameters; } } return $resolvedParameters; } /** * Push a parameter resolver after the ones already registered. */ public function appendResolver(ParameterResolver $resolver): void { $this->resolvers[] = $resolver; } /** * Insert a parameter resolver before the ones already registered. */ public function prependResolver(ParameterResolver $resolver): void { array_unshift($this->resolvers, $resolver); } } container = $container; } /** * Resolve the given callable into a real PHP callable. * * @param callable|string|array $callable * @return callable Real PHP callable. * @throws NotCallableException|ReflectionException */ public function resolve($callable): callable { if (is_string($callable) && strpos($callable, '::') !== false) { $callable = explode('::', $callable, 2); } $callable = $this->resolveFromContainer($callable); if (! is_callable($callable)) { throw NotCallableException::fromInvalidCallable($callable, true); } return $callable; } /** * @param callable|string|array $callable * @return callable|mixed * @throws NotCallableException|ReflectionException */ private function resolveFromContainer($callable) { // Shortcut for a very common use case if ($callable instanceof Closure) { return $callable; } // If it's already a callable there is nothing to do if (is_callable($callable)) { // TODO with PHP 8 that should not be necessary to check this anymore if (! $this->isStaticCallToNonStaticMethod($callable)) { return $callable; } } // The callable is a container entry name if (is_string($callable)) { try { return $this->container->get($callable); } catch (NotFoundExceptionInterface $e) { if ($this->container->has($callable)) { throw $e; } throw NotCallableException::fromInvalidCallable($callable, true); } } // The callable is an array whose first item is a container entry name // e.g. ['some-container-entry', 'methodToCall'] if (is_array($callable) && is_string($callable[0])) { try { // Replace the container entry name by the actual object $callable[0] = $this->container->get($callable[0]); return $callable; } catch (NotFoundExceptionInterface $e) { if ($this->container->has($callable[0])) { throw $e; } throw new NotCallableException(sprintf( 'Cannot call %s() on %s because it is not a class nor a valid container entry', $callable[1], $callable[0] )); } } // Unrecognized stuff, we let it fail later return $callable; } /** * Check if the callable represents a static call to a non-static method. * * @param mixed $callable * @throws ReflectionException */ private function isStaticCallToNonStaticMethod($callable): bool { if (is_array($callable) && is_string($callable[0])) { [$class, $method] = $callable; if (! method_exists($class, $method)) { return false; } $reflection = new ReflectionMethod($class, $method); return ! $reflection->isStatic(); } return false; } } =8.0", "psr/container": "^1.1 || ^2.0", "php-di/invoker": "^2.0", "laravel/serializable-closure": "^1.0 || ^2.0" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^10 || ^11", "mnapoli/phpunit-easymock": "^1.3", "friendsofphp/proxy-manager-lts": "^1", "friendsofphp/php-cs-fixer": "^3", "vimeo/psalm": "^5|^6" }, "provide": { "psr/container-implementation": "^1.0" }, "suggest": { "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" } } --- layout: home --- [![](doc/img.png)](https://php-di.org/) [![Downloads per months](https://img.shields.io/packagist/dm/PHP-DI/PHP-DI.svg?style=flat-square)](https://packagist.org/packages/PHP-DI/PHP-DI) [![Total downloads](https://img.shields.io/packagist/dt/PHP-DI/PHP-DI.svg?style=flat-square)](https://packagist.org/packages/PHP-DI/PHP-DI) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/PHP-DI/PHP-DI.svg)](http://isitmaintained.com/project/PHP-DI/PHP-DI "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/PHP-DI/PHP-DI.svg)](http://isitmaintained.com/project/PHP-DI/PHP-DI "Percentage of issues still open") PHP-DI is a dependency injection container meant to be practical, powerful, and framework-agnostic. Read more on the website: **[php-di.org](https://php-di.org)** ## For Enterprise *Available as part of the Tidelift Subscription* The maintainers of php-di/php-di and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-php-di-php-di?utm_source=packagist-php-di-php-di&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) */ class AutowireDefinition extends ObjectDefinition { } */ class FactoryDefinition implements Definition { /** * Entry name. */ private string $name; /** * Callable that returns the value. * @var callable */ private $factory; /** * Factory parameters. * @var mixed[] */ private array $parameters; /** * @param string $name Entry name * @param callable|array|string $factory Callable that returns the value associated to the entry name. * @param array $parameters Parameters to be passed to the callable */ public function __construct(string $name, callable|array|string $factory, array $parameters = []) { $this->name = $name; $this->factory = $factory; $this->parameters = $parameters; } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } /** * @return callable|array|string Callable that returns the value associated to the entry name. */ public function getCallable() : callable|array|string { return $this->factory; } /** * @return array Array containing the parameters to be passed to the callable, indexed by name. */ public function getParameters() : array { return $this->parameters; } public function replaceNestedDefinitions(callable $replacer) : void { $this->parameters = array_map($replacer, $this->parameters); } public function __toString() : string { return 'Factory'; } } */ class ParameterResolver { /** * @param DefinitionResolver $definitionResolver Will be used to resolve nested definitions. */ public function __construct( private DefinitionResolver $definitionResolver, ) { } /** * @return array Parameters to use to call the function. * @throws InvalidDefinition A parameter has no value defined or guessable. */ public function resolveParameters( ?MethodInjection $definition = null, ?ReflectionMethod $method = null, array $parameters = [], ) : array { $args = []; if (! $method) { return $args; } $definitionParameters = $definition ? $definition->getParameters() : []; foreach ($method->getParameters() as $index => $parameter) { if (array_key_exists($parameter->getName(), $parameters)) { // Look in the $parameters array $value = &$parameters[$parameter->getName()]; } elseif (array_key_exists($index, $definitionParameters)) { // Look in the definition $value = &$definitionParameters[$index]; } else { // If the parameter is optional and wasn't specified, we take its default value if ($parameter->isDefaultValueAvailable() || $parameter->isOptional()) { $args[] = $this->getParameterDefaultValue($parameter, $method); continue; } throw new InvalidDefinition(sprintf( 'Parameter $%s of %s has no value defined or guessable', $parameter->getName(), $this->getFunctionName($method) )); } // Nested definitions if ($value instanceof Definition) { // If the container cannot produce the entry, we can use the default parameter value if ($parameter->isOptional() && ! $this->definitionResolver->isResolvable($value)) { $value = $this->getParameterDefaultValue($parameter, $method); } else { $value = $this->definitionResolver->resolve($value); } } $args[] = &$value; } return $args; } /** * Returns the default value of a function parameter. * * @throws InvalidDefinition Can't get default values from PHP internal classes and functions */ private function getParameterDefaultValue(ReflectionParameter $parameter, ReflectionMethod $function) : mixed { try { return $parameter->getDefaultValue(); } catch (\ReflectionException) { throw new InvalidDefinition(sprintf( 'The parameter "%s" of %s has no type defined or guessable. It has a default value, ' . 'but the default value can\'t be read through Reflection because it is a PHP internal class.', $parameter->getName(), $this->getFunctionName($function) )); } } private function getFunctionName(ReflectionMethod $method) : string { return $method->getName() . '()'; } } * * @since 5.0 * @author Matthieu Napoli */ class InstanceInjector extends ObjectCreator implements DefinitionResolver { /** * Injects dependencies on an existing instance. * * @param InstanceDefinition $definition * @psalm-suppress ImplementedParamTypeMismatch */ public function resolve(Definition $definition, array $parameters = []) : ?object { /** @psalm-suppress InvalidCatch */ try { $this->injectMethodsAndProperties($definition->getInstance(), $definition->getObjectDefinition()); } catch (NotFoundExceptionInterface $e) { $message = sprintf( 'Error while injecting dependencies into %s: %s', get_class($definition->getInstance()), $e->getMessage() ); throw new DependencyException($message, 0, $e); } return $definition; } public function isResolvable(Definition $definition, array $parameters = []) : bool { return true; } } * * @template T of Definition */ interface DefinitionResolver { /** * Resolve a definition to a value. * * @param Definition $definition Object that defines how the value should be obtained. * @psalm-param T $definition * @param array $parameters Optional parameters to use to build the entry. * @return mixed Value obtained from the definition. * * @throws InvalidDefinition If the definition cannot be resolved. * @throws DependencyException */ public function resolve(Definition $definition, array $parameters = []) : mixed; /** * Check if a definition can be resolved. * * @param Definition $definition Object that defines how the value should be obtained. * @psalm-param T $definition * @param array $parameters Optional parameters to use to build the entry. */ public function isResolvable(Definition $definition, array $parameters = []) : bool; } * * @since 4.0 * @author Matthieu Napoli */ class FactoryResolver implements DefinitionResolver { private ?Invoker $invoker = null; /** * The resolver needs a container. This container will be passed to the factory as a parameter * so that the factory can access other entries of the container. */ public function __construct( private ContainerInterface $container, private DefinitionResolver $resolver, ) { } /** * Resolve a factory definition to a value. * * This will call the callable of the definition. * * @param FactoryDefinition $definition */ public function resolve(Definition $definition, array $parameters = []) : mixed { if (! $this->invoker) { $parameterResolver = new ResolverChain([ new AssociativeArrayResolver, new FactoryParameterResolver($this->container), new NumericArrayResolver, new DefaultValueResolver, ]); $this->invoker = new Invoker($parameterResolver, $this->container); } $callable = $definition->getCallable(); try { $providedParams = [$this->container, $definition]; $extraParams = $this->resolveExtraParams($definition->getParameters()); $providedParams = array_merge($providedParams, $extraParams, $parameters); return $this->invoker->call($callable, $providedParams); } catch (NotCallableException $e) { // Custom error message to help debugging if (is_string($callable) && class_exists($callable) && method_exists($callable, '__invoke')) { throw new InvalidDefinition(sprintf( 'Entry "%s" cannot be resolved: factory %s. Invokable classes cannot be automatically resolved if autowiring is disabled on the container, you need to enable autowiring or define the entry manually.', $definition->getName(), $e->getMessage() )); } throw new InvalidDefinition(sprintf( 'Entry "%s" cannot be resolved: factory %s', $definition->getName(), $e->getMessage() )); } catch (NotEnoughParametersException $e) { throw new InvalidDefinition(sprintf( 'Entry "%s" cannot be resolved: %s', $definition->getName(), $e->getMessage() )); } } public function isResolvable(Definition $definition, array $parameters = []) : bool { return true; } private function resolveExtraParams(array $params) : array { $resolved = []; foreach ($params as $key => $value) { // Nested definitions if ($value instanceof Definition) { $value = $this->resolver->resolve($value); } $resolved[$key] = $value; } return $resolved; } } * * @since 4.0 * @author Matthieu Napoli */ class ObjectCreator implements DefinitionResolver { private ParameterResolver $parameterResolver; /** * @param DefinitionResolver $definitionResolver Used to resolve nested definitions. * @param ProxyFactoryInterface $proxyFactory Used to create proxies for lazy injections. */ public function __construct( private DefinitionResolver $definitionResolver, private ProxyFactoryInterface $proxyFactory, ) { $this->parameterResolver = new ParameterResolver($definitionResolver); } /** * Resolve a class definition to a value. * * This will create a new instance of the class using the injections points defined. * * @param ObjectDefinition $definition */ public function resolve(Definition $definition, array $parameters = []) : ?object { // Lazy? if ($definition->isLazy()) { return $this->createProxy($definition, $parameters); } return $this->createInstance($definition, $parameters); } /** * The definition is not resolvable if the class is not instantiable (interface or abstract) * or if the class doesn't exist. * * @param ObjectDefinition $definition */ public function isResolvable(Definition $definition, array $parameters = []) : bool { return $definition->isInstantiable(); } /** * Returns a proxy instance. */ private function createProxy(ObjectDefinition $definition, array $parameters) : object { /** @var class-string $className */ $className = $definition->getClassName(); return $this->proxyFactory->createProxy( $className, function () use ($definition, $parameters) { return $this->createInstance($definition, $parameters); } ); } /** * Creates an instance of the class and injects dependencies.. * * @param array $parameters Optional parameters to use to create the instance. * * @throws DependencyException * @throws InvalidDefinition */ private function createInstance(ObjectDefinition $definition, array $parameters) : object { // Check that the class is instantiable if (! $definition->isInstantiable()) { // Check that the class exists if (! $definition->classExists()) { throw InvalidDefinition::create($definition, sprintf( 'Entry "%s" cannot be resolved: the class doesn\'t exist', $definition->getName() )); } throw InvalidDefinition::create($definition, sprintf( 'Entry "%s" cannot be resolved: the class is not instantiable', $definition->getName() )); } /** @psalm-var class-string $classname */ $classname = $definition->getClassName(); $classReflection = new ReflectionClass($classname); $constructorInjection = $definition->getConstructorInjection(); /** @psalm-suppress InvalidCatch */ try { $args = $this->parameterResolver->resolveParameters( $constructorInjection, $classReflection->getConstructor(), $parameters ); $object = new $classname(...$args); $this->injectMethodsAndProperties($object, $definition); } catch (NotFoundExceptionInterface $e) { throw new DependencyException(sprintf( 'Error while injecting dependencies into %s: %s', $classReflection->getName(), $e->getMessage() ), 0, $e); } catch (InvalidDefinition $e) { throw InvalidDefinition::create($definition, sprintf( 'Entry "%s" cannot be resolved: %s', $definition->getName(), $e->getMessage() )); } return $object; } protected function injectMethodsAndProperties(object $object, ObjectDefinition $objectDefinition) : void { // Property injections foreach ($objectDefinition->getPropertyInjections() as $propertyInjection) { $this->injectProperty($object, $propertyInjection); } // Method injections foreach ($objectDefinition->getMethodInjections() as $methodInjection) { $methodReflection = new \ReflectionMethod($object, $methodInjection->getMethodName()); $args = $this->parameterResolver->resolveParameters($methodInjection, $methodReflection); $methodReflection->invokeArgs($object, $args); } } /** * Inject dependencies into properties. * * @param object $object Object to inject dependencies into * @param PropertyInjection $propertyInjection Property injection definition * * @throws DependencyException */ private function injectProperty(object $object, PropertyInjection $propertyInjection) : void { $propertyName = $propertyInjection->getPropertyName(); $value = $propertyInjection->getValue(); if ($value instanceof Definition) { try { $value = $this->definitionResolver->resolve($value); } catch (DependencyException $e) { throw $e; } catch (Exception $e) { throw new DependencyException(sprintf( 'Error while injecting in %s::%s. %s', $object::class, $propertyName, $e->getMessage() ), 0, $e); } } self::setPrivatePropertyValue($propertyInjection->getClassName(), $object, $propertyName, $value); } public static function setPrivatePropertyValue(?string $className, $object, string $propertyName, mixed $propertyValue) : void { $className = $className ?: $object::class; $property = new ReflectionProperty($className, $propertyName); if (! $property->isPublic() && \PHP_VERSION_ID < 80100) { $property->setAccessible(true); } $property->setValue($object, $propertyValue); } } * * @psalm-suppress MissingTemplateParam */ class ResolverDispatcher implements DefinitionResolver { private ?ArrayResolver $arrayResolver = null; private ?FactoryResolver $factoryResolver = null; private ?DecoratorResolver $decoratorResolver = null; private ?ObjectCreator $objectResolver = null; private ?InstanceInjector $instanceResolver = null; private ?EnvironmentVariableResolver $envVariableResolver = null; public function __construct( private ContainerInterface $container, private ProxyFactoryInterface $proxyFactory, ) { } /** * Resolve a definition to a value. * * @param Definition $definition Object that defines how the value should be obtained. * @param array $parameters Optional parameters to use to build the entry. * * @return mixed Value obtained from the definition. * @throws InvalidDefinition If the definition cannot be resolved. */ public function resolve(Definition $definition, array $parameters = []) : mixed { // Special case, tested early for speed if ($definition instanceof SelfResolvingDefinition) { return $definition->resolve($this->container); } $definitionResolver = $this->getDefinitionResolver($definition); return $definitionResolver->resolve($definition, $parameters); } public function isResolvable(Definition $definition, array $parameters = []) : bool { // Special case, tested early for speed if ($definition instanceof SelfResolvingDefinition) { return $definition->isResolvable($this->container); } $definitionResolver = $this->getDefinitionResolver($definition); return $definitionResolver->isResolvable($definition, $parameters); } /** * Returns a resolver capable of handling the given definition. * * @throws \RuntimeException No definition resolver was found for this type of definition. */ private function getDefinitionResolver(Definition $definition) : DefinitionResolver { switch (true) { case $definition instanceof ObjectDefinition: if (! $this->objectResolver) { $this->objectResolver = new ObjectCreator($this, $this->proxyFactory); } return $this->objectResolver; case $definition instanceof DecoratorDefinition: if (! $this->decoratorResolver) { $this->decoratorResolver = new DecoratorResolver($this->container, $this); } return $this->decoratorResolver; case $definition instanceof FactoryDefinition: if (! $this->factoryResolver) { $this->factoryResolver = new FactoryResolver($this->container, $this); } return $this->factoryResolver; case $definition instanceof ArrayDefinition: if (! $this->arrayResolver) { $this->arrayResolver = new ArrayResolver($this); } return $this->arrayResolver; case $definition instanceof EnvironmentVariableDefinition: if (! $this->envVariableResolver) { $this->envVariableResolver = new EnvironmentVariableResolver($this); } return $this->envVariableResolver; case $definition instanceof InstanceDefinition: if (! $this->instanceResolver) { $this->instanceResolver = new InstanceInjector($this, $this->proxyFactory); } return $this->instanceResolver; default: throw new \RuntimeException('No definition resolver was configured for definition of type ' . $definition::class); } } } * * @author James Harris */ class EnvironmentVariableResolver implements DefinitionResolver { /** @var callable */ private $variableReader; public function __construct( private DefinitionResolver $definitionResolver, $variableReader = null, ) { $this->variableReader = $variableReader ?? [$this, 'getEnvVariable']; } /** * Resolve an environment variable definition to a value. * * @param EnvironmentVariableDefinition $definition */ public function resolve(Definition $definition, array $parameters = []) : mixed { $value = call_user_func($this->variableReader, $definition->getVariableName()); if (false !== $value) { return $value; } if (!$definition->isOptional()) { throw new InvalidDefinition(sprintf( "The environment variable '%s' has not been defined", $definition->getVariableName() )); } $value = $definition->getDefaultValue(); // Nested definition if ($value instanceof Definition) { return $this->definitionResolver->resolve($value); } return $value; } public function isResolvable(Definition $definition, array $parameters = []) : bool { return true; } protected function getEnvVariable(string $variableName) { return $_ENV[$variableName] ?? $_SERVER[$variableName] ?? getenv($variableName); } } * * @since 5.0 * @author Matthieu Napoli */ class ArrayResolver implements DefinitionResolver { /** * @param DefinitionResolver $definitionResolver Used to resolve nested definitions. */ public function __construct( private DefinitionResolver $definitionResolver, ) { } /** * {@inheritDoc} * * Resolve an array definition to a value. * * An array definition can contain simple values or references to other entries. * * @param ArrayDefinition $definition */ public function resolve(Definition $definition, array $parameters = []) : array { $values = $definition->getValues(); // Resolve nested definitions array_walk_recursive($values, function (& $value, $key) use ($definition) { if ($value instanceof Definition) { $value = $this->resolveDefinition($value, $definition, $key); } }); return $values; } public function isResolvable(Definition $definition, array $parameters = []) : bool { return true; } /** * @throws DependencyException */ private function resolveDefinition(Definition $value, ArrayDefinition $definition, int|string $key) : mixed { try { return $this->definitionResolver->resolve($value); } catch (DependencyException $e) { throw $e; } catch (Exception $e) { throw new DependencyException(sprintf( 'Error while resolving %s[%s]. %s', $definition->getName(), $key, $e->getMessage() ), 0, $e); } } } * * @since 5.0 * @author Matthieu Napoli */ class DecoratorResolver implements DefinitionResolver { /** * The resolver needs a container. This container will be passed to the factory as a parameter * so that the factory can access other entries of the container. * * @param DefinitionResolver $definitionResolver Used to resolve nested definitions. */ public function __construct( private ContainerInterface $container, private DefinitionResolver $definitionResolver, ) { } /** * Resolve a decorator definition to a value. * * This will call the callable of the definition and pass it the decorated entry. * * @param DecoratorDefinition $definition */ public function resolve(Definition $definition, array $parameters = []) : mixed { $callable = $definition->getCallable(); if (! is_callable($callable)) { throw new InvalidDefinition(sprintf( 'The decorator "%s" is not callable', $definition->getName() )); } $decoratedDefinition = $definition->getDecoratedDefinition(); if (! $decoratedDefinition instanceof Definition) { if (! $definition->getName()) { throw new InvalidDefinition('Decorators cannot be nested in another definition'); } throw new InvalidDefinition(sprintf( 'Entry "%s" decorates nothing: no previous definition with the same name was found', $definition->getName() )); } $decorated = $this->definitionResolver->resolve($decoratedDefinition, $parameters); return $callable($decorated, $this->container); } public function isResolvable(Definition $definition, array $parameters = []) : bool { return true; } } */ class SourceChain implements DefinitionSource, MutableDefinitionSource { private ?MutableDefinitionSource $mutableSource; /** * @param list $sources */ public function __construct( private array $sources, ) { } /** * @param int $startIndex Use this parameter to start looking from a specific * point in the source chain. */ public function getDefinition(string $name, int $startIndex = 0) : ?Definition { $count = count($this->sources); for ($i = $startIndex; $i < $count; ++$i) { $source = $this->sources[$i]; $definition = $source->getDefinition($name); if ($definition) { if ($definition instanceof ExtendsPreviousDefinition) { $this->resolveExtendedDefinition($definition, $i); } return $definition; } } return null; } public function getDefinitions() : array { $allDefinitions = array_merge(...array_map(fn ($source) => $source->getDefinitions(), $this->sources)); /** @var string[] $allNames */ $allNames = array_keys($allDefinitions); $allValues = array_filter(array_map(fn ($name) => $this->getDefinition($name), $allNames)); return array_combine($allNames, $allValues); } public function addDefinition(Definition $definition) : void { if (! $this->mutableSource) { throw new \LogicException("The container's definition source has not been initialized correctly"); } $this->mutableSource->addDefinition($definition); } private function resolveExtendedDefinition(ExtendsPreviousDefinition $definition, int $currentIndex) { // Look in the next sources only (else infinite recursion, and we can only extend // entries defined in the previous definition files - a previous == next here because // the array was reversed ;) ) $subDefinition = $this->getDefinition($definition->getName(), $currentIndex + 1); if ($subDefinition) { $definition->setExtendedDefinition($subDefinition); } } public function setMutableDefinitionSource(MutableDefinitionSource $mutableSource) : void { $this->mutableSource = $mutableSource; array_unshift($this->sources, $mutableSource); } } */ class ReflectionBasedAutowiring implements DefinitionSource, Autowiring { public function autowire(string $name, ?ObjectDefinition $definition = null) : ?ObjectDefinition { $className = $definition ? $definition->getClassName() : $name; if (!class_exists($className) && !interface_exists($className)) { return $definition; } $definition = $definition ?: new ObjectDefinition($name); // Constructor $class = new \ReflectionClass($className); $constructor = $class->getConstructor(); if ($constructor && $constructor->isPublic()) { $constructorInjection = MethodInjection::constructor($this->getParametersDefinition($constructor)); $definition->completeConstructorInjection($constructorInjection); } return $definition; } public function getDefinition(string $name) : ?ObjectDefinition { return $this->autowire($name); } /** * Autowiring cannot guess all existing definitions. */ public function getDefinitions() : array { return []; } /** * Read the type-hinting from the parameters of the function. */ private function getParametersDefinition(\ReflectionFunctionAbstract $constructor) : array { $parameters = []; foreach ($constructor->getParameters() as $index => $parameter) { // Skip optional parameters if ($parameter->isOptional()) { continue; } $parameterType = $parameter->getType(); if (!$parameterType) { // No type continue; } if (!$parameterType instanceof ReflectionNamedType) { // Union types are not supported continue; } if ($parameterType->isBuiltin()) { // Primitive types are not supported continue; } $parameters[$index] = new Reference($parameterType->getName()); } return $parameters; } } */ interface Autowiring { /** * Autowire the given definition. * * @throws InvalidDefinition An invalid definition was found. */ public function autowire(string $name, ?ObjectDefinition $definition = null) : ?ObjectDefinition; } */ class DefinitionArray implements DefinitionSource, MutableDefinitionSource { public const WILDCARD = '*'; /** * Matches anything except "\". */ private const WILDCARD_PATTERN = '([^\\\\]+)'; /** DI definitions in a PHP array. */ private array $definitions; /** Cache of wildcard definitions. */ private ?array $wildcardDefinitions = null; private DefinitionNormalizer $normalizer; public function __construct(array $definitions = [], ?Autowiring $autowiring = null) { if (isset($definitions[0])) { throw new \Exception('The PHP-DI definition is not indexed by an entry name in the definition array'); } $this->definitions = $definitions; $this->normalizer = new DefinitionNormalizer($autowiring ?: new NoAutowiring); } /** * @param array $definitions DI definitions in a PHP array indexed by the definition name. */ public function addDefinitions(array $definitions) : void { if (isset($definitions[0])) { throw new \Exception('The PHP-DI definition is not indexed by an entry name in the definition array'); } // The newly added data prevails // "for keys that exist in both arrays, the elements from the left-hand array will be used" $this->definitions = $definitions + $this->definitions; // Clear cache $this->wildcardDefinitions = null; } public function addDefinition(Definition $definition) : void { $this->definitions[$definition->getName()] = $definition; // Clear cache $this->wildcardDefinitions = null; } public function getDefinition(string $name) : ?Definition { // Look for the definition by name if (array_key_exists($name, $this->definitions)) { $definition = $this->definitions[$name]; return $this->normalizer->normalizeRootDefinition($definition, $name); } // Build the cache of wildcard definitions if ($this->wildcardDefinitions === null) { $this->wildcardDefinitions = []; foreach ($this->definitions as $key => $definition) { if (str_contains($key, self::WILDCARD)) { $this->wildcardDefinitions[$key] = $definition; } } } // Look in wildcards definitions foreach ($this->wildcardDefinitions as $key => $definition) { // Turn the pattern into a regex $key = preg_quote($key, '#'); $key = '#^' . str_replace('\\' . self::WILDCARD, self::WILDCARD_PATTERN, $key) . '#'; if (preg_match($key, $name, $matches) === 1) { array_shift($matches); return $this->normalizer->normalizeRootDefinition($definition, $name, $matches); } } return null; } public function getDefinitions() : array { // Return all definitions except wildcard definitions $definitions = []; foreach ($this->definitions as $key => $definition) { if (! str_contains($key, self::WILDCARD)) { $definitions[$key] = $definition; } } return $definitions; } } */ class DefinitionFile extends DefinitionArray { private bool $initialized = false; /** * @param string $file File in which the definitions are returned as an array. */ public function __construct( private string $file, ?Autowiring $autowiring = null, ) { // Lazy-loading to improve performances parent::__construct([], $autowiring); } public function getDefinition(string $name) : ?Definition { $this->initialize(); return parent::getDefinition($name); } public function getDefinitions() : array { $this->initialize(); return parent::getDefinitions(); } /** * Lazy-loading of the definitions. */ private function initialize() : void { if ($this->initialized === true) { return; } $definitions = require $this->file; if (! is_array($definitions)) { throw new \Exception("File $this->file should return an array of definitions"); } $this->addDefinitions($definitions); $this->initialized = true; } } */ interface DefinitionSource { /** * Returns the DI definition for the entry name. * * @throws InvalidDefinition An invalid definition was found. */ public function getDefinition(string $name) : ?Definition; /** * @return array Definitions indexed by their name. */ public function getDefinitions() : array; } */ class DefinitionNormalizer { public function __construct( private Autowiring $autowiring, ) { } /** * Normalize a definition that is *not* nested in another one. * * This is usually a definition declared at the root of a definition array. * * @param string $name The definition name. * @param string[] $wildcardsReplacements Replacements for wildcard definitions. * * @throws InvalidDefinition */ public function normalizeRootDefinition(mixed $definition, string $name, ?array $wildcardsReplacements = null) : Definition { if ($definition instanceof DefinitionHelper) { $definition = $definition->getDefinition($name); } elseif (is_array($definition)) { $definition = new ArrayDefinition($definition); } elseif ($definition instanceof \Closure) { $definition = new FactoryDefinition($name, $definition); } elseif (! $definition instanceof Definition) { $definition = new ValueDefinition($definition); } // For a class definition, we replace * in the class name with the matches // *Interface -> *Impl => FooInterface -> FooImpl if ($wildcardsReplacements && $definition instanceof ObjectDefinition) { $definition->replaceWildcards($wildcardsReplacements); } if ($definition instanceof AutowireDefinition) { /** @var AutowireDefinition $definition */ $definition = $this->autowiring->autowire($name, $definition); } $definition->setName($name); try { $definition->replaceNestedDefinitions([$this, 'normalizeNestedDefinition']); } catch (InvalidDefinition $e) { throw InvalidDefinition::create($definition, sprintf( 'Definition "%s" contains an error: %s', $definition->getName(), $e->getMessage() ), $e); } return $definition; } /** * Normalize a definition that is nested in another one. * * @throws InvalidDefinition */ public function normalizeNestedDefinition(mixed $definition) : mixed { $name = ''; if ($definition instanceof DefinitionHelper) { $definition = $definition->getDefinition($name); } elseif (is_array($definition)) { $definition = new ArrayDefinition($definition); } elseif ($definition instanceof \Closure) { $definition = new FactoryDefinition($name, $definition); } if ($definition instanceof DecoratorDefinition) { throw new InvalidDefinition('Decorators cannot be nested in another definition'); } if ($definition instanceof AutowireDefinition) { $definition = $this->autowiring->autowire($name, $definition); } if ($definition instanceof Definition) { $definition->setName($name); // Recursively traverse nested definitions $definition->replaceNestedDefinitions([$this, 'normalizeNestedDefinition']); } return $definition; } } */ interface MutableDefinitionSource extends DefinitionSource { public function addDefinition(Definition $definition) : void; } */ class AttributeBasedAutowiring implements DefinitionSource, Autowiring { /** * @throws InvalidAttribute */ public function autowire(string $name, ?ObjectDefinition $definition = null) : ?ObjectDefinition { $className = $definition ? $definition->getClassName() : $name; if (!class_exists($className) && !interface_exists($className)) { return $definition; } $definition = $definition ?: new ObjectDefinition($name); $class = new ReflectionClass($className); $this->readInjectableAttribute($class, $definition); // Browse the class properties looking for annotated properties $this->readProperties($class, $definition); // Browse the object's methods looking for annotated methods $this->readMethods($class, $definition); return $definition; } /** * @throws InvalidAttribute * @throws InvalidArgumentException The class doesn't exist */ public function getDefinition(string $name) : ?ObjectDefinition { return $this->autowire($name); } /** * Autowiring cannot guess all existing definitions. */ public function getDefinitions() : array { return []; } /** * Browse the class properties looking for annotated properties. */ private function readProperties(ReflectionClass $class, ObjectDefinition $definition) : void { foreach ($class->getProperties() as $property) { $this->readProperty($property, $definition); } // Read also the *private* properties of the parent classes /** @noinspection PhpAssignmentInConditionInspection */ while ($class = $class->getParentClass()) { foreach ($class->getProperties(ReflectionProperty::IS_PRIVATE) as $property) { $this->readProperty($property, $definition, $class->getName()); } } } /** * @throws InvalidAttribute */ private function readProperty(ReflectionProperty $property, ObjectDefinition $definition, ?string $classname = null) : void { if ($property->isStatic() || $property->isPromoted()) { return; } // Look for #[Inject] attribute try { $attribute = $property->getAttributes(Inject::class)[0] ?? null; if (! $attribute) { return; } /** @var Inject $inject */ $inject = $attribute->newInstance(); } catch (Throwable $e) { throw new InvalidAttribute(sprintf( '#[Inject] annotation on property %s::%s is malformed. %s', $property->getDeclaringClass()->getName(), $property->getName(), $e->getMessage() ), 0, $e); } // Try to #[Inject("name")] or look for the property type $entryName = $inject->getName(); // Try using typed properties $propertyType = $property->getType(); if ($entryName === null && $propertyType instanceof ReflectionNamedType) { if (! class_exists($propertyType->getName()) && ! interface_exists($propertyType->getName())) { throw new InvalidAttribute(sprintf( '#[Inject] found on property %s::%s but unable to guess what to inject, the type of the property does not look like a valid class or interface name', $property->getDeclaringClass()->getName(), $property->getName() )); } $entryName = $propertyType->getName(); } if ($entryName === null) { throw new InvalidAttribute(sprintf( '#[Inject] found on property %s::%s but unable to guess what to inject, please add a type to the property', $property->getDeclaringClass()->getName(), $property->getName() )); } $definition->addPropertyInjection( new PropertyInjection($property->getName(), new Reference($entryName), $classname) ); } /** * Browse the object's methods looking for annotated methods. */ private function readMethods(ReflectionClass $class, ObjectDefinition $objectDefinition) : void { // This will look in all the methods, including those of the parent classes foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { if ($method->isStatic()) { continue; } $methodInjection = $this->getMethodInjection($method); if (! $methodInjection) { continue; } if ($method->isConstructor()) { $objectDefinition->completeConstructorInjection($methodInjection); } else { $objectDefinition->completeFirstMethodInjection($methodInjection); } } } private function getMethodInjection(ReflectionMethod $method) : ?MethodInjection { // Look for #[Inject] attribute $attribute = $method->getAttributes(Inject::class)[0] ?? null; if ($attribute) { /** @var Inject $inject */ $inject = $attribute->newInstance(); $annotationParameters = $inject->getParameters(); } elseif ($method->isConstructor()) { // #[Inject] on constructor is implicit, we continue $annotationParameters = []; } else { return null; } $parameters = []; foreach ($method->getParameters() as $index => $parameter) { $entryName = $this->getMethodParameter($index, $parameter, $annotationParameters); if ($entryName !== null) { $parameters[$index] = new Reference($entryName); } } if ($method->isConstructor()) { return MethodInjection::constructor($parameters); } return new MethodInjection($method->getName(), $parameters); } /** * @return string|null Entry name or null if not found. */ private function getMethodParameter(int $parameterIndex, ReflectionParameter $parameter, array $annotationParameters) : ?string { // Let's check if this parameter has an #[Inject] attribute $attribute = $parameter->getAttributes(Inject::class)[0] ?? null; if ($attribute) { /** @var Inject $inject */ $inject = $attribute->newInstance(); return $inject->getName(); } // #[Inject] has definition for this parameter (by index, or by name) if (isset($annotationParameters[$parameterIndex])) { return $annotationParameters[$parameterIndex]; } if (isset($annotationParameters[$parameter->getName()])) { return $annotationParameters[$parameter->getName()]; } // Skip optional parameters if not explicitly defined if ($parameter->isOptional()) { return null; } // Look for the property type $parameterType = $parameter->getType(); if ($parameterType instanceof ReflectionNamedType && !$parameterType->isBuiltin()) { return $parameterType->getName(); } return null; } /** * @throws InvalidAttribute */ private function readInjectableAttribute(ReflectionClass $class, ObjectDefinition $definition) : void { try { $attribute = $class->getAttributes(Injectable::class)[0] ?? null; if (! $attribute) { return; } $attribute = $attribute->newInstance(); } catch (Throwable $e) { throw new InvalidAttribute(sprintf( 'Error while reading #[Injectable] on %s: %s', $class->getName(), $e->getMessage() ), 0, $e); } if ($attribute->isLazy() !== null) { $definition->setLazy($attribute->isLazy()); } } } */ class NoAutowiring implements Autowiring { public function autowire(string $name, ?ObjectDefinition $definition = null) : ?ObjectDefinition { throw new InvalidDefinition(sprintf( 'Cannot autowire entry "%s" because autowiring is disabled', $name )); } } */ class SourceCache implements DefinitionSource, MutableDefinitionSource { public const CACHE_KEY = 'php-di.definitions.'; public function __construct( private DefinitionSource $cachedSource, private string $cacheNamespace = '', ) { } public function getDefinition(string $name) : ?Definition { $definition = apcu_fetch($this->getCacheKey($name)); if ($definition === false) { $definition = $this->cachedSource->getDefinition($name); // Update the cache if ($this->shouldBeCached($definition)) { apcu_store($this->getCacheKey($name), $definition); } } return $definition; } /** * Used only for the compilation so we can skip the cache safely. */ public function getDefinitions() : array { return $this->cachedSource->getDefinitions(); } public static function isSupported() : bool { return function_exists('apcu_fetch') && ini_get('apc.enabled') && ! ('cli' === \PHP_SAPI && ! ini_get('apc.enable_cli')); } public function getCacheKey(string $name) : string { return self::CACHE_KEY . $this->cacheNamespace . $name; } public function addDefinition(Definition $definition) : void { throw new \LogicException('You cannot set a definition at runtime on a container that has caching enabled. Doing so would risk caching the definition for the next execution, where it might be different. You can either put your definitions in a file, remove the cache or ->set() a raw value directly (PHP object, string, int, ...) instead of a PHP-DI definition.'); } private function shouldBeCached(?Definition $definition = null) : bool { return // Cache missing definitions ($definition === null) // Object definitions are used with `make()` || ($definition instanceof ObjectDefinition) // Autowired definitions cannot be all compiled and are used with `make()` || ($definition instanceof AutowireDefinition); } } */ class ArrayDefinitionExtension extends ArrayDefinition implements ExtendsPreviousDefinition { private ?ArrayDefinition $subDefinition = null; public function getValues() : array { if (! $this->subDefinition) { return parent::getValues(); } return array_merge($this->subDefinition->getValues(), parent::getValues()); } public function setExtendedDefinition(Definition $definition) : void { if (! $definition instanceof ArrayDefinition) { throw new InvalidDefinition(sprintf( 'Definition %s tries to add array entries but the previous definition is not an array', $this->getName() )); } $this->subDefinition = $definition; } } */ class InstanceDefinition implements Definition { /** * @param object $instance Instance on which to inject dependencies. */ public function __construct( private object $instance, private ObjectDefinition $objectDefinition, ) { } public function getName() : string { // Name are superfluous for instance definitions return ''; } public function setName(string $name) : void { // Name are superfluous for instance definitions } public function getInstance() : object { return $this->instance; } public function getObjectDefinition() : ObjectDefinition { return $this->objectDefinition; } public function replaceNestedDefinitions(callable $replacer) : void { $this->objectDefinition->replaceNestedDefinitions($replacer); } public function __toString() : string { return 'Instance'; } } */ interface ExtendsPreviousDefinition extends Definition { public function setExtendedDefinition(Definition $definition) : void; } */ class ValueDefinition implements Definition, SelfResolvingDefinition { /** * Entry name. */ private string $name = ''; public function __construct( private mixed $value, ) { } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } public function getValue() : mixed { return $this->value; } public function resolve(ContainerInterface $container) : mixed { return $this->getValue(); } public function isResolvable(ContainerInterface $container) : bool { return true; } public function replaceNestedDefinitions(callable $replacer) : void { // no nested definitions } public function __toString() : string { return sprintf('Value (%s)', var_export($this->value, true)); } } */ class InvalidAttribute extends InvalidDefinition { } */ class InvalidDefinition extends \Exception implements ContainerExceptionInterface { public static function create(Definition $definition, string $message, ?\Exception $previous = null) : self { return new self(sprintf( '%s' . \PHP_EOL . 'Full definition:' . \PHP_EOL . '%s', $message, (string) $definition ), 0, $previous); } } */ class ObjectDefinition implements Definition { /** * Entry name (most of the time, same as $classname). */ private string $name; /** * Class name (if null, then the class name is $name). */ protected ?string $className = null; protected ?MethodInjection $constructorInjection = null; protected array $propertyInjections = []; /** * Method calls. * @var MethodInjection[][] */ protected array $methodInjections = []; protected ?bool $lazy = null; /** * Store if the class exists. Storing it (in cache) avoids recomputing this. */ private bool $classExists; /** * Store if the class is instantiable. Storing it (in cache) avoids recomputing this. */ private bool $isInstantiable; /** * @param string $name Entry name */ public function __construct(string $name, ?string $className = null) { $this->name = $name; $this->setClassName($className); } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } public function setClassName(?string $className) : void { $this->className = $className; $this->updateCache(); } public function getClassName() : string { return $this->className ?? $this->name; } public function getConstructorInjection() : ?MethodInjection { return $this->constructorInjection; } public function setConstructorInjection(MethodInjection $constructorInjection) : void { $this->constructorInjection = $constructorInjection; } public function completeConstructorInjection(MethodInjection $injection) : void { if ($this->constructorInjection !== null) { // Merge $this->constructorInjection->merge($injection); } else { // Set $this->constructorInjection = $injection; } } /** * @return PropertyInjection[] Property injections */ public function getPropertyInjections() : array { return $this->propertyInjections; } public function addPropertyInjection(PropertyInjection $propertyInjection) : void { $className = $propertyInjection->getClassName(); if ($className) { // Index with the class name to avoid collisions between parent and // child private properties with the same name $key = $className . '::' . $propertyInjection->getPropertyName(); } else { $key = $propertyInjection->getPropertyName(); } $this->propertyInjections[$key] = $propertyInjection; } /** * @return MethodInjection[] Method injections */ public function getMethodInjections() : array { // Return array leafs $injections = []; array_walk_recursive($this->methodInjections, function ($injection) use (&$injections) { $injections[] = $injection; }); return $injections; } public function addMethodInjection(MethodInjection $methodInjection) : void { $method = $methodInjection->getMethodName(); if (! isset($this->methodInjections[$method])) { $this->methodInjections[$method] = []; } $this->methodInjections[$method][] = $methodInjection; } public function completeFirstMethodInjection(MethodInjection $injection) : void { $method = $injection->getMethodName(); if (isset($this->methodInjections[$method][0])) { // Merge $this->methodInjections[$method][0]->merge($injection); } else { // Set $this->addMethodInjection($injection); } } public function setLazy(?bool $lazy = null) : void { $this->lazy = $lazy; } public function isLazy() : bool { if ($this->lazy !== null) { return $this->lazy; } // Default value return false; } public function classExists() : bool { return $this->classExists; } public function isInstantiable() : bool { return $this->isInstantiable; } public function replaceNestedDefinitions(callable $replacer) : void { array_walk($this->propertyInjections, function (PropertyInjection $propertyInjection) use ($replacer) { $propertyInjection->replaceNestedDefinition($replacer); }); $this->constructorInjection?->replaceNestedDefinitions($replacer); array_walk($this->methodInjections, function ($injectionArray) use ($replacer) { array_walk($injectionArray, function (MethodInjection $methodInjection) use ($replacer) { $methodInjection->replaceNestedDefinitions($replacer); }); }); } /** * Replaces all the wildcards in the string with the given replacements. * * @param string[] $replacements */ public function replaceWildcards(array $replacements) : void { $className = $this->getClassName(); foreach ($replacements as $replacement) { $pos = strpos($className, DefinitionArray::WILDCARD); if ($pos !== false) { $className = substr_replace($className, $replacement, $pos, 1); } } $this->setClassName($className); } public function __toString() : string { return (new ObjectDefinitionDumper)->dump($this); } private function updateCache() : void { $className = $this->getClassName(); $this->classExists = class_exists($className) || interface_exists($className); if (! $this->classExists) { $this->isInstantiable = false; return; } /** @var class-string $className */ $class = new ReflectionClass($className); $this->isInstantiable = $class->isInstantiable(); } } */ interface Definition extends RequestedEntry, \Stringable { /** * Returns the name of the entry in the container. */ public function getName() : string; /** * Set the name of the entry in the container. */ public function setName(string $name) : void; /** * Apply a callable that replaces the definitions nested in this definition. */ public function replaceNestedDefinitions(callable $replacer) : void; /** * Definitions can be cast to string for debugging information. */ public function __toString() : string; } */ class StringDefinition implements Definition, SelfResolvingDefinition { /** Entry name. */ private string $name = ''; public function __construct( private string $expression, ) { } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } public function getExpression() : string { return $this->expression; } public function resolve(ContainerInterface $container) : string { return self::resolveExpression($this->name, $this->expression, $container); } public function isResolvable(ContainerInterface $container) : bool { return true; } public function replaceNestedDefinitions(callable $replacer) : void { // no nested definitions } public function __toString() : string { return $this->expression; } /** * Resolve a string expression. */ public static function resolveExpression( string $entryName, string $expression, ContainerInterface $container, ) : string { $callback = function (array $matches) use ($entryName, $container) { /** @psalm-suppress InvalidCatch */ try { return $container->get($matches[1]); } catch (NotFoundExceptionInterface $e) { throw new DependencyException(sprintf( "Error while parsing string expression for entry '%s': %s", $entryName, $e->getMessage() ), 0, $e); } }; $result = preg_replace_callback('#\{([^{}]+)}#', $callback, $expression); if ($result === null) { throw new \RuntimeException(sprintf('An unknown error occurred while parsing the string definition: \'%s\'', $expression)); } return $result; } } */ class ObjectDefinitionDumper { /** * Returns the definition as string representation. */ public function dump(ObjectDefinition $definition) : string { $className = $definition->getClassName(); $classExist = class_exists($className) || interface_exists($className); // Class if (! $classExist) { $warning = '#UNKNOWN# '; } else { $class = new \ReflectionClass($className); $warning = $class->isInstantiable() ? '' : '#NOT INSTANTIABLE# '; } $str = sprintf(' class = %s%s', $warning, $className); // Lazy $str .= \PHP_EOL . ' lazy = ' . var_export($definition->isLazy(), true); if ($classExist) { // Constructor $str .= $this->dumpConstructor($className, $definition); // Properties $str .= $this->dumpProperties($definition); // Methods $str .= $this->dumpMethods($className, $definition); } return sprintf('Object (' . \PHP_EOL . '%s' . \PHP_EOL . ')', $str); } /** * @param class-string $className */ private function dumpConstructor(string $className, ObjectDefinition $definition) : string { $str = ''; $constructorInjection = $definition->getConstructorInjection(); if ($constructorInjection !== null) { $parameters = $this->dumpMethodParameters($className, $constructorInjection); $str .= sprintf(\PHP_EOL . ' __construct(' . \PHP_EOL . ' %s' . \PHP_EOL . ' )', $parameters); } return $str; } private function dumpProperties(ObjectDefinition $definition) : string { $str = ''; foreach ($definition->getPropertyInjections() as $propertyInjection) { $value = $propertyInjection->getValue(); $valueStr = $value instanceof Definition ? (string) $value : var_export($value, true); $str .= sprintf(\PHP_EOL . ' $%s = %s', $propertyInjection->getPropertyName(), $valueStr); } return $str; } /** * @param class-string $className */ private function dumpMethods(string $className, ObjectDefinition $definition) : string { $str = ''; foreach ($definition->getMethodInjections() as $methodInjection) { $parameters = $this->dumpMethodParameters($className, $methodInjection); $str .= sprintf(\PHP_EOL . ' %s(' . \PHP_EOL . ' %s' . \PHP_EOL . ' )', $methodInjection->getMethodName(), $parameters); } return $str; } /** * @param class-string $className */ private function dumpMethodParameters(string $className, MethodInjection $methodInjection) : string { $methodReflection = new \ReflectionMethod($className, $methodInjection->getMethodName()); $args = []; $definitionParameters = $methodInjection->getParameters(); foreach ($methodReflection->getParameters() as $index => $parameter) { if (array_key_exists($index, $definitionParameters)) { $value = $definitionParameters[$index]; $valueStr = $value instanceof Definition ? (string) $value : var_export($value, true); $args[] = sprintf('$%s = %s', $parameter->getName(), $valueStr); continue; } // If the parameter is optional and wasn't specified, we take its default value if ($parameter->isOptional()) { try { $value = $parameter->getDefaultValue(); $args[] = sprintf( '$%s = (default value) %s', $parameter->getName(), var_export($value, true) ); continue; } catch (ReflectionException) { // The default value can't be read through Reflection because it is a PHP internal class } } $args[] = sprintf('$%s = #UNDEFINED#', $parameter->getName()); } return implode(\PHP_EOL . ' ', $args); } } */ class DecoratorDefinition extends FactoryDefinition implements Definition, ExtendsPreviousDefinition { private ?Definition $decorated = null; public function setExtendedDefinition(Definition $definition) : void { $this->decorated = $definition; } public function getDecoratedDefinition() : ?Definition { return $this->decorated; } public function replaceNestedDefinitions(callable $replacer) : void { // no nested definitions } public function __toString() : string { return 'Decorate(' . $this->getName() . ')'; } } */ class Reference implements Definition, SelfResolvingDefinition { /** Entry name. */ private string $name = ''; /** * @param string $targetEntryName Name of the target entry */ public function __construct( private string $targetEntryName, ) { } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } public function getTargetEntryName() : string { return $this->targetEntryName; } public function resolve(ContainerInterface $container) : mixed { return $container->get($this->getTargetEntryName()); } public function isResolvable(ContainerInterface $container) : bool { return $container->has($this->getTargetEntryName()); } public function replaceNestedDefinitions(callable $replacer) : void { // no nested definitions } public function __toString() : string { return sprintf( 'get(%s)', $this->targetEntryName ); } } */ class EnvironmentVariableDefinition implements Definition { /** Entry name. */ private string $name = ''; /** * @param string $variableName The name of the environment variable * @param bool $isOptional Whether or not the environment variable definition is optional. If true and the environment variable given by $variableName has not been defined, $defaultValue is used. * @param mixed $defaultValue The default value to use if the environment variable is optional and not provided */ public function __construct( private string $variableName, private bool $isOptional = false, private mixed $defaultValue = null, ) { } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } /** * @return string The name of the environment variable */ public function getVariableName() : string { return $this->variableName; } /** * @return bool Whether or not the environment variable definition is optional */ public function isOptional() : bool { return $this->isOptional; } /** * @return mixed The default value to use if the environment variable is optional and not provided */ public function getDefaultValue() : mixed { return $this->defaultValue; } public function replaceNestedDefinitions(callable $replacer) : void { $this->defaultValue = $replacer($this->defaultValue); } public function __toString() : string { $str = ' variable = ' . $this->variableName . \PHP_EOL . ' optional = ' . ($this->isOptional ? 'yes' : 'no'); if ($this->isOptional) { if ($this->defaultValue instanceof Definition) { $nestedDefinition = (string) $this->defaultValue; $defaultValueStr = str_replace(\PHP_EOL, \PHP_EOL . ' ', $nestedDefinition); } else { $defaultValueStr = var_export($this->defaultValue, true); } $str .= \PHP_EOL . ' default = ' . $defaultValueStr; } return sprintf('Environment variable (' . \PHP_EOL . '%s' . \PHP_EOL . ')', $str); } } */ class AutowireDefinitionHelper extends CreateDefinitionHelper { public const DEFINITION_CLASS = AutowireDefinition::class; /** * Defines a value for a specific argument of the constructor. * * This method is usually used together with attributes or autowiring, when a parameter * is not (or cannot be) type-hinted. Using this method instead of constructor() allows to * avoid defining all the parameters (letting them being resolved using attributes or autowiring) * and only define one. * * @param string|int $parameter Parameter name of position for which the value will be given. * @param mixed $value Value to give to this parameter. * * @return $this */ public function constructorParameter(string|int $parameter, mixed $value) : self { $this->constructor[$parameter] = $value; return $this; } /** * Defines a method to call and a value for a specific argument. * * This method is usually used together with attributes or autowiring, when a parameter * is not (or cannot be) type-hinted. Using this method instead of method() allows to * avoid defining all the parameters (letting them being resolved using attributes or * autowiring) and only define one. * * If multiple calls to the method have been configured already (e.g. in a previous definition) * then this method only overrides the parameter for the *first* call. * * @param string $method Name of the method to call. * @param string|int $parameter Parameter name of position for which the value will be given. * @param mixed $value Value to give to this parameter. * * @return $this */ public function methodParameter(string $method, string|int $parameter, mixed $value) : self { // Special case for the constructor if ($method === '__construct') { $this->constructor[$parameter] = $value; return $this; } if (! isset($this->methods[$method])) { $this->methods[$method] = [0 => []]; } $this->methods[$method][0][$parameter] = $value; return $this; } } */ class CreateDefinitionHelper implements DefinitionHelper { private const DEFINITION_CLASS = ObjectDefinition::class; private ?string $className; private ?bool $lazy = null; /** * Array of constructor parameters. */ protected array $constructor = []; /** * Array of properties and their value. */ private array $properties = []; /** * Array of methods and their parameters. */ protected array $methods = []; /** * Helper for defining an object. * * @param string|null $className Class name of the object. * If null, the name of the entry (in the container) will be used as class name. */ public function __construct(?string $className = null) { $this->className = $className; } /** * Define the entry as lazy. * * A lazy entry is created only when it is used, a proxy is injected instead. * * @return $this */ public function lazy() : self { $this->lazy = true; return $this; } /** * Defines the arguments to use to call the constructor. * * This method takes a variable number of arguments, example: * ->constructor($param1, $param2, $param3) * * @param mixed ...$parameters Parameters to use for calling the constructor of the class. * * @return $this */ public function constructor(mixed ...$parameters) : self { $this->constructor = $parameters; return $this; } /** * Defines a value to inject in a property of the object. * * @param string $property Entry in which to inject the value. * @param mixed $value Value to inject in the property. * * @return $this */ public function property(string $property, mixed $value) : self { $this->properties[$property] = $value; return $this; } /** * Defines a method to call and the arguments to use. * * This method takes a variable number of arguments after the method name, example: * * ->method('myMethod', $param1, $param2) * * Can be used multiple times to declare multiple calls. * * @param string $method Name of the method to call. * @param mixed ...$parameters Parameters to use for calling the method. * * @return $this */ public function method(string $method, mixed ...$parameters) : self { if (! isset($this->methods[$method])) { $this->methods[$method] = []; } $this->methods[$method][] = $parameters; return $this; } public function getDefinition(string $entryName) : ObjectDefinition { $class = $this::DEFINITION_CLASS; /** @var ObjectDefinition $definition */ $definition = new $class($entryName, $this->className); if ($this->lazy !== null) { $definition->setLazy($this->lazy); } if (! empty($this->constructor)) { $parameters = $this->fixParameters($definition, '__construct', $this->constructor); $constructorInjection = MethodInjection::constructor($parameters); $definition->setConstructorInjection($constructorInjection); } if (! empty($this->properties)) { foreach ($this->properties as $property => $value) { $definition->addPropertyInjection( new PropertyInjection($property, $value) ); } } if (! empty($this->methods)) { foreach ($this->methods as $method => $calls) { foreach ($calls as $parameters) { $parameters = $this->fixParameters($definition, $method, $parameters); $methodInjection = new MethodInjection($method, $parameters); $definition->addMethodInjection($methodInjection); } } } return $definition; } /** * Fixes parameters indexed by the parameter name -> reindex by position. * * This is necessary so that merging definitions between sources is possible. * * @throws InvalidDefinition */ private function fixParameters(ObjectDefinition $definition, string $method, array $parameters) : array { $fixedParameters = []; foreach ($parameters as $index => $parameter) { // Parameter indexed by the parameter name, we reindex it with its position if (is_string($index)) { $callable = [$definition->getClassName(), $method]; try { $reflectionParameter = new \ReflectionParameter($callable, $index); } catch (\ReflectionException $e) { throw InvalidDefinition::create($definition, sprintf("Parameter with name '%s' could not be found. %s.", $index, $e->getMessage())); } $index = $reflectionParameter->getPosition(); } $fixedParameters[$index] = $parameter; } return $fixedParameters; } } */ class FactoryDefinitionHelper implements DefinitionHelper { /** * @var callable */ private $factory; private bool $decorate; private array $parameters = []; /** * @param bool $decorate Is the factory decorating a previous definition? */ public function __construct(callable|array|string $factory, bool $decorate = false) { $this->factory = $factory; $this->decorate = $decorate; } public function getDefinition(string $entryName) : FactoryDefinition { if ($this->decorate) { return new DecoratorDefinition($entryName, $this->factory, $this->parameters); } return new FactoryDefinition($entryName, $this->factory, $this->parameters); } /** * Defines arguments to pass to the factory. * * Because factory methods do not yet support attributes or autowiring, this method * should be used to define all parameters except the ContainerInterface and RequestedEntry. * * Multiple calls can be made to the method to override individual values. * * @param string $parameter Name or index of the parameter for which the value will be given. * @param mixed $value Value to give to this parameter. * * @return $this */ public function parameter(string $parameter, mixed $value) : self { $this->parameters[$parameter] = $value; return $this; } } */ interface DefinitionHelper { /** * @param string $entryName Container entry name */ public function getDefinition(string $entryName) : Definition; } */ interface SelfResolvingDefinition { /** * Resolve the definition and return the resulting value. */ public function resolve(ContainerInterface $container) : mixed; /** * Check if a definition can be resolved. */ public function isResolvable(ContainerInterface $container) : bool; } */ class ArrayDefinition implements Definition { /** Entry name. */ private string $name = ''; public function __construct( private array $values, ) { } public function getName() : string { return $this->name; } public function setName(string $name) : void { $this->name = $name; } public function getValues() : array { return $this->values; } public function replaceNestedDefinitions(callable $replacer) : void { $this->values = array_map($replacer, $this->values); } public function __toString() : string { $str = '[' . \PHP_EOL; foreach ($this->values as $key => $value) { if (is_string($key)) { $key = "'" . $key . "'"; } $str .= ' ' . $key . ' => '; if ($value instanceof Definition) { $str .= str_replace(\PHP_EOL, \PHP_EOL . ' ', (string) $value); } else { $str .= var_export($value, true); } $str .= ',' . \PHP_EOL; } return $str . ']'; } } */ class MethodInjection implements Definition { /** * @param mixed[] $parameters */ public function __construct( private string $methodName, private array $parameters = [], ) { } public static function constructor(array $parameters = []) : self { return new self('__construct', $parameters); } public function getMethodName() : string { return $this->methodName; } /** * @return mixed[] */ public function getParameters() : array { return $this->parameters; } /** * Replace the parameters of the definition by a new array of parameters. */ public function replaceParameters(array $parameters) : void { $this->parameters = $parameters; } public function merge(self $definition) : void { // In case of conflicts, the current definition prevails. $this->parameters += $definition->parameters; } public function getName() : string { return ''; } public function setName(string $name) : void { // The name does not matter for method injections } public function replaceNestedDefinitions(callable $replacer) : void { $this->parameters = array_map($replacer, $this->parameters); } public function __toString() : string { return sprintf('method(%s)', $this->methodName); } } */ class PropertyInjection { private string $propertyName; /** * Value that should be injected in the property. */ private mixed $value; /** * Use for injecting in properties of parent classes: the class name * must be the name of the parent class because private properties * can be attached to the parent classes, not the one we are resolving. */ private ?string $className; /** * @param string $propertyName Property name * @param mixed $value Value that should be injected in the property */ public function __construct(string $propertyName, mixed $value, ?string $className = null) { $this->propertyName = $propertyName; $this->value = $value; $this->className = $className; } public function getPropertyName() : string { return $this->propertyName; } /** * @return mixed Value that should be injected in the property */ public function getValue() : mixed { return $this->value; } public function getClassName() : ?string { return $this->className; } public function replaceNestedDefinition(callable $replacer) : void { $this->value = $replacer($this->value); } } */ interface FactoryInterface { /** * Resolves an entry by its name. If given a class name, it will return a new instance of that class. * * @param string $name Entry name or a class name. * @param array $parameters Optional parameters to use to build the entry. Use this to force specific * parameters to specific values. Parameters not defined in this array will * be automatically resolved. * * @throws \InvalidArgumentException The name parameter must be of type string. * @throws DependencyException Error while resolving the entry. * @throws NotFoundException No entry or class found for the given name. */ public function make(string $name, array $parameters = []) : mixed; } * @author Matthieu Napoli */ class FactoryParameterResolver implements ParameterResolver { public function __construct( private ContainerInterface $container, ) { } public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters, ) : array { $parameters = $reflection->getParameters(); // Skip parameters already resolved if (! empty($resolvedParameters)) { $parameters = array_diff_key($parameters, $resolvedParameters); } foreach ($parameters as $index => $parameter) { $parameterType = $parameter->getType(); if (!$parameterType) { // No type continue; } if (!$parameterType instanceof ReflectionNamedType) { // Union types are not supported continue; } if ($parameterType->isBuiltin()) { // Primitive types are not supported continue; } $parameterClass = $parameterType->getName(); if ($parameterClass === 'Psr\Container\ContainerInterface') { $resolvedParameters[$index] = $this->container; } elseif ($parameterClass === 'DI\Factory\RequestedEntry') { // By convention the second parameter is the definition $resolvedParameters[$index] = $providedParameters[1]; } elseif ($this->container->has($parameterClass)) { $resolvedParameters[$index] = $this->container->get($parameterClass); } } return $resolvedParameters; } } */ class DefinitionParameterResolver implements ParameterResolver { public function __construct( private DefinitionResolver $definitionResolver, ) { } public function getParameters( ReflectionFunctionAbstract $reflection, array $providedParameters, array $resolvedParameters, ) : array { // Skip parameters already resolved if (! empty($resolvedParameters)) { $providedParameters = array_diff_key($providedParameters, $resolvedParameters); } foreach ($providedParameters as $key => $value) { if ($value instanceof DefinitionHelper) { $value = $value->getDefinition(''); } if (! $value instanceof Definition) { continue; } $value = $this->definitionResolver->resolve($value); if (is_int($key)) { // Indexed by position $resolvedParameters[$key] = $value; } else { // Indexed by parameter name // TODO optimize? $reflectionParameters = $reflection->getParameters(); foreach ($reflectionParameters as $reflectionParameter) { if ($key === $reflectionParameter->name) { $resolvedParameters[$reflectionParameter->getPosition()] = $value; } } } } return $resolvedParameters; } } build(); * * @api * * @since 3.2 * @author Matthieu Napoli * * @psalm-template ContainerClass of Container */ class ContainerBuilder { /** * Name of the container class, used to create the container. * @var class-string * @psalm-var class-string */ private string $containerClass; /** * Name of the container parent class, used on compiled container. * @var class-string * @psalm-var class-string */ private string $containerParentClass; private bool $useAutowiring = true; private bool $useAttributes = false; /** * If set, write the proxies to disk in this directory to improve performances. */ private ?string $proxyDirectory = null; /** * If PHP-DI is wrapped in another container, this references the wrapper. */ private ?ContainerInterface $wrapperContainer = null; /** * @var DefinitionSource[]|string[]|array[] */ private array $definitionSources = []; /** * Whether the container has already been built. */ private bool $locked = false; private ?string $compileToDirectory = null; private bool $sourceCache = false; protected string $sourceCacheNamespace = ''; /** * @param class-string $containerClass Name of the container class, used to create the container. * @psalm-param class-string $containerClass */ public function __construct(string $containerClass = Container::class) { $this->containerClass = $containerClass; } /** * Build and return a container. * * @return Container * @psalm-return ContainerClass */ public function build() { $sources = array_reverse($this->definitionSources); if ($this->useAttributes) { $autowiring = new AttributeBasedAutowiring; $sources[] = $autowiring; } elseif ($this->useAutowiring) { $autowiring = new ReflectionBasedAutowiring; $sources[] = $autowiring; } else { $autowiring = new NoAutowiring; } $sources = array_map(function ($definitions) use ($autowiring) { if (is_string($definitions)) { // File return new DefinitionFile($definitions, $autowiring); } if (is_array($definitions)) { return new DefinitionArray($definitions, $autowiring); } return $definitions; }, $sources); $source = new SourceChain($sources); // Mutable definition source $source->setMutableDefinitionSource(new DefinitionArray([], $autowiring)); if ($this->sourceCache) { if (!SourceCache::isSupported()) { throw new \Exception('APCu is not enabled, PHP-DI cannot use it as a cache'); } // Wrap the source with the cache decorator $source = new SourceCache($source, $this->sourceCacheNamespace); } $proxyFactory = (\PHP_VERSION_ID >= 80400) ? new NativeProxyFactory() : new ProxyFactory($this->proxyDirectory); $this->locked = true; $containerClass = $this->containerClass; if ($this->compileToDirectory) { $compiler = new Compiler($proxyFactory); $compiledContainerFile = $compiler->compile( $source, $this->compileToDirectory, $containerClass, $this->containerParentClass, $this->useAutowiring ); // Only load the file if it hasn't been already loaded // (the container can be created multiple times in the same process) if (!class_exists($containerClass, false)) { require $compiledContainerFile; } } return new $containerClass($source, $proxyFactory, $this->wrapperContainer); } /** * Compile the container for optimum performances. * * Be aware that the container is compiled once and never updated! * * Therefore: * * - in production you should clear that directory every time you deploy * - in development you should not compile the container * * @see https://php-di.org/doc/performances.html * * @psalm-template T of CompiledContainer * * @param string $directory Directory in which to put the compiled container. * @param string $containerClass Name of the compiled class. Customize only if necessary. * @param class-string $containerParentClass Name of the compiled container parent class. Customize only if necessary. * @psalm-param class-string $containerParentClass * * @psalm-return self */ public function enableCompilation( string $directory, string $containerClass = 'CompiledContainer', string $containerParentClass = CompiledContainer::class, ) : self { $this->ensureNotLocked(); $this->compileToDirectory = $directory; $this->containerClass = $containerClass; $this->containerParentClass = $containerParentClass; return $this; } /** * Enable or disable the use of autowiring to guess injections. * * Enabled by default. * * @return $this */ public function useAutowiring(bool $bool) : self { $this->ensureNotLocked(); $this->useAutowiring = $bool; return $this; } /** * Enable or disable the use of PHP 8 attributes to configure injections. * * Disabled by default. * * @return $this */ public function useAttributes(bool $bool) : self { $this->ensureNotLocked(); $this->useAttributes = $bool; return $this; } /** * Configure the proxy generation. * * For dev environment, use `writeProxiesToFile(false)` (default configuration) * For production environment, use `writeProxiesToFile(true, 'tmp/proxies')` * * @see https://php-di.org/doc/lazy-injection.html * * @param bool $writeToFile If true, write the proxies to disk to improve performances * @param string|null $proxyDirectory Directory where to write the proxies * @return $this * @throws InvalidArgumentException when writeToFile is set to true and the proxy directory is null */ public function writeProxiesToFile(bool $writeToFile, ?string $proxyDirectory = null) : self { $this->ensureNotLocked(); if ($writeToFile && $proxyDirectory === null) { throw new InvalidArgumentException( 'The proxy directory must be specified if you want to write proxies on disk' ); } $this->proxyDirectory = $writeToFile ? $proxyDirectory : null; return $this; } /** * If PHP-DI's container is wrapped by another container, we can * set this so that PHP-DI will use the wrapper rather than itself for building objects. * * @return $this */ public function wrapContainer(ContainerInterface $otherContainer) : self { $this->ensureNotLocked(); $this->wrapperContainer = $otherContainer; return $this; } /** * Add definitions to the container. * * @param string|array|DefinitionSource ...$definitions Can be an array of definitions, the * name of a file containing definitions * or a DefinitionSource object. * @return $this */ public function addDefinitions(string|array|DefinitionSource ...$definitions) : self { $this->ensureNotLocked(); foreach ($definitions as $definition) { $this->definitionSources[] = $definition; } return $this; } /** * Enables the use of APCu to cache definitions. * * You must have APCu enabled to use it. * * Before using this feature, you should try these steps first: * - enable compilation if not already done (see `enableCompilation()`) * - if you use autowiring or attributes, add all the classes you are using into your configuration so that * PHP-DI knows about them and compiles them * Once this is done, you can try to optimize performances further with APCu. It can also be useful if you use * `Container::make()` instead of `get()` (`make()` calls cannot be compiled so they are not optimized). * * Remember to clear APCu on each deploy else your application will have a stale cache. Do not enable the cache * in development environment: any change you will make to the code will be ignored because of the cache. * * @see https://php-di.org/doc/performances.html * * @param string $cacheNamespace use unique namespace per container when sharing a single APC memory pool to prevent cache collisions * @return $this */ public function enableDefinitionCache(string $cacheNamespace = '') : self { $this->ensureNotLocked(); $this->sourceCache = true; $this->sourceCacheNamespace = $cacheNamespace; return $this; } /** * Are we building a compiled container? */ public function isCompilationEnabled() : bool { return (bool) $this->compileToDirectory; } private function ensureNotLocked() : void { if ($this->locked) { throw new \LogicException('The ContainerBuilder cannot be modified after the container has been built'); } } } */ abstract class CompiledContainer extends Container { /** * This const is overridden in child classes (compiled containers). * @var array */ protected const METHOD_MAPPING = []; private ?InvokerInterface $factoryInvoker = null; public function get(string $id) : mixed { // Try to find the entry in the singleton map if (isset($this->resolvedEntries[$id]) || array_key_exists($id, $this->resolvedEntries)) { return $this->resolvedEntries[$id]; } /** @psalm-suppress UndefinedConstant */ $method = static::METHOD_MAPPING[$id] ?? null; // If it's a compiled entry, then there is a method in this class if ($method !== null) { // Check if we are already getting this entry -> circular dependency if (isset($this->entriesBeingResolved[$id])) { $idList = implode(' -> ', [...array_keys($this->entriesBeingResolved), $id]); throw new DependencyException("Circular dependency detected while trying to resolve entry '$id': Dependencies: " . $idList); } $this->entriesBeingResolved[$id] = true; try { $value = $this->$method(); } finally { unset($this->entriesBeingResolved[$id]); } // Store the entry to always return it without recomputing it $this->resolvedEntries[$id] = $value; return $value; } return parent::get($id); } public function has(string $id) : bool { // The parent method is overridden to check in our array, it avoids resolving definitions /** @psalm-suppress UndefinedConstant */ if (isset(static::METHOD_MAPPING[$id])) { return true; } return parent::has($id); } protected function setDefinition(string $name, Definition $definition) : void { // It needs to be forbidden because that would mean get() must go through the definitions // every time, which kinds of defeats the performance gains of the compiled container throw new \LogicException('You cannot set a definition at runtime on a compiled container. You can either put your definitions in a file, disable compilation or ->set() a raw value directly (PHP object, string, int, ...) instead of a PHP-DI definition.'); } /** * Invoke the given callable. */ protected function resolveFactory($callable, $entryName, array $extraParameters = []) : mixed { // Initialize the factory resolver if (! $this->factoryInvoker) { $parameterResolver = new ResolverChain([ new AssociativeArrayResolver, new FactoryParameterResolver($this->delegateContainer), new NumericArrayResolver, new DefaultValueResolver, ]); $this->factoryInvoker = new Invoker($parameterResolver, $this->delegateContainer); } $parameters = [$this->delegateContainer, new RequestedEntryHolder($entryName)]; $parameters = array_merge($parameters, $extraParameters); try { return $this->factoryInvoker->call($callable, $parameters); } catch (NotCallableException $e) { throw new InvalidDefinition("Entry \"$entryName\" cannot be resolved: factory " . $e->getMessage()); } catch (NotEnoughParametersException $e) { throw new InvalidDefinition("Entry \"$entryName\" cannot be resolved: " . $e->getMessage()); } } } decorate(function ($foo, $container) { * return new CachedFoo($foo, $container->get('cache')); * }) * * @param callable $callable The callable takes the decorated object as first parameter and * the container as second. */ function decorate(callable|array|string $callable) : FactoryDefinitionHelper { return new FactoryDefinitionHelper($callable, true); } } if (! function_exists('DI\get')) { /** * Helper for referencing another container entry in an object definition. */ function get(string $entryName) : Reference { return new Reference($entryName); } } if (! function_exists('DI\env')) { /** * Helper for referencing environment variables. * * @param string $variableName The name of the environment variable. * @param mixed $defaultValue The default value to be used if the environment variable is not defined. */ function env(string $variableName, mixed $defaultValue = null) : EnvironmentVariableDefinition { // Only mark as optional if the default value was *explicitly* provided. $isOptional = 2 === func_num_args(); return new EnvironmentVariableDefinition($variableName, $isOptional, $defaultValue); } } if (! function_exists('DI\add')) { /** * Helper for extending another definition. * * Example: * * 'log.backends' => DI\add(DI\get('My\Custom\LogBackend')) * * or: * * 'log.backends' => DI\add([ * DI\get('My\Custom\LogBackend') * ]) * * @param mixed|array $values A value or an array of values to add to the array. * * @since 5.0 */ function add($values) : ArrayDefinitionExtension { if (! is_array($values)) { $values = [$values]; } return new ArrayDefinitionExtension($values); } } if (! function_exists('DI\string')) { /** * Helper for concatenating strings. * * Example: * * 'log.filename' => DI\string('{app.path}/app.log') * * @param string $expression A string expression. Use the `{}` placeholders to reference other container entries. * * @since 5.0 */ function string(string $expression) : StringDefinition { return new StringDefinition($expression); } } * @author Matthieu Napoli */ #[Attribute(Attribute::TARGET_CLASS)] class Injectable { /** * @param bool|null $lazy Should the object be lazy-loaded. */ public function __construct( private ?bool $lazy = null, ) { } public function isLazy() : ?bool { return $this->lazy; } } */ #[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_METHOD | Attribute::TARGET_PARAMETER)] class Inject { /** * Entry name. */ private ?string $name = null; /** * Parameters, indexed by the parameter number (index) or name. * * Used if the attribute is set on a method */ private array $parameters = []; /** * @throws InvalidAttribute */ public function __construct(string|array|null $name = null) { // #[Inject('foo')] or #[Inject(name: 'foo')] if (is_string($name)) { $this->name = $name; } // #[Inject([...])] on a method if (is_array($name)) { foreach ($name as $key => $value) { if (! is_string($value)) { throw new InvalidAttribute(sprintf( "#[Inject(['param' => 'value'])] expects \"value\" to be a string, %s given.", json_encode($value, \JSON_THROW_ON_ERROR) )); } $this->parameters[$key] = $value; } } } /** * @return string|null Name of the entry to inject */ public function getName() : ?string { return $this->name; } /** * @return array Parameters, indexed by the parameter number (index) or name */ public function getParameters() : array { return $this->parameters; } } */ interface RequestedEntry { /** * Returns the name of the entry that was requested by the container. */ public function getName() : string; } */ interface ProxyFactoryInterface { /** * Creates a new lazy proxy instance of the given class with * the given initializer. * * @param class-string $className name of the class to be proxied * @param \Closure $createFunction initializer to be passed to the proxy initializer to be passed to the proxy */ public function createProxy(string $className, \Closure $createFunction) : object; /** * If the proxy generator depends on a filesystem component, * this step writes the proxy for that class to file. Otherwise, * it is a no-op. * * @param class-string $className name of the class to be proxied */ public function generateProxyClass(string $className) : void; } */ class NativeProxyFactory implements ProxyFactoryInterface { /** * Creates a new lazy proxy instance of the given class with * the given initializer. * * {@inheritDoc} */ public function createProxy(string $className, \Closure $createFunction) : object { if (\PHP_VERSION_ID < 80400) { throw new LogicException('Lazy loading proxies require PHP 8.4 or higher.'); } $reflector = new \ReflectionClass($className); return $reflector->newLazyProxy($createFunction); } public function generateProxyClass(string $className) : void { // Noop for this type. } } */ class ProxyFactory implements ProxyFactoryInterface { private ?LazyLoadingValueHolderFactory $proxyManager = null; /** * @param string|null $proxyDirectory If set, write the proxies to disk in this directory to improve performances. */ public function __construct( private ?string $proxyDirectory = null, ) { } /** * Creates a new lazy proxy instance of the given class with * the given initializer. * * {@inheritDoc} */ public function createProxy(string $className, \Closure $createFunction): object { return $this->proxyManager()->createProxy( $className, function (& $wrappedObject, $proxy, $method, $params, & $initializer) use ($createFunction) { $wrappedObject = $createFunction(); $initializer = null; // turning off further lazy initialization return true; } ); } /** * Generates and writes the proxy class to file. * * @param class-string $className name of the class to be proxied */ public function generateProxyClass(string $className) : void { // If proxy classes a written to file then we pre-generate the class // If they are not written to file then there is no point to do this if ($this->proxyDirectory) { $this->createProxy($className, function () {}); } } private function proxyManager() : LazyLoadingValueHolderFactory { if ($this->proxyManager === null) { if (! class_exists(Configuration::class)) { throw new \RuntimeException('The ocramius/proxy-manager library is not installed. Lazy injection requires that library to be installed with Composer in order to work. Run "composer require ocramius/proxy-manager:~2.0".'); } $config = new Configuration(); if ($this->proxyDirectory) { $config->setProxiesTargetDir($this->proxyDirectory); $config->setGeneratorStrategy(new FileWriterGeneratorStrategy(new FileLocator($this->proxyDirectory))); // @phpstan-ignore-next-line spl_autoload_register($config->getProxyAutoloader()); } else { $config->setGeneratorStrategy(new EvaluatingGeneratorStrategy()); } $this->proxyManager = new LazyLoadingValueHolderFactory($config); } return $this->proxyManager; } } */ class Compiler { private string $containerClass; private string $containerParentClass; /** * Definitions indexed by the entry name. The value can be null if the definition needs to be fetched. * * Keys are strings, values are `Definition` objects or null. */ private \ArrayIterator $entriesToCompile; /** * Progressive counter for definitions. * * Each key in $entriesToCompile is defined as 'SubEntry' + counter * and each definition has always the same key in the CompiledContainer * if PHP-DI configuration does not change. */ private int $subEntryCounter = 0; /** * Progressive counter for CompiledContainer get methods. * * Each CompiledContainer method name is defined as 'get' + counter * and remains the same after each recompilation * if PHP-DI configuration does not change. */ private int $methodMappingCounter = 0; /** * Map of entry names to method names. * * @var string[] */ private array $entryToMethodMapping = []; /** * @var string[] */ private array $methods = []; private bool $autowiringEnabled; public function __construct( private ProxyFactoryInterface $proxyFactory, ) { } public function getProxyFactory() : ProxyFactoryInterface { return $this->proxyFactory; } /** * Compile the container. * * @return string The compiled container file name. */ public function compile( DefinitionSource $definitionSource, string $directory, string $className, string $parentClassName, bool $autowiringEnabled, ) : string { $fileName = rtrim($directory, '/') . '/' . $className . '.php'; if (file_exists($fileName)) { // The container is already compiled return $fileName; } $this->autowiringEnabled = $autowiringEnabled; // Validate that a valid class name was provided $validClassName = preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $className); if (!$validClassName) { throw new InvalidArgumentException("The container cannot be compiled: `$className` is not a valid PHP class name"); } $this->entriesToCompile = new \ArrayIterator($definitionSource->getDefinitions()); // We use an ArrayIterator so that we can keep adding new items to the list while we compile entries foreach ($this->entriesToCompile as $entryName => $definition) { $silenceErrors = false; // This is an entry found by reference during autowiring if (!$definition) { $definition = $definitionSource->getDefinition($entryName); // We silence errors for those entries because type-hints may reference interfaces/abstract classes // which could later be defined, or even not used (we don't want to block the compilation for those) $silenceErrors = true; } if (!$definition) { // We do not throw a `NotFound` exception here because the dependency // could be defined at runtime continue; } // Check that the definition can be compiled $errorMessage = $this->isCompilable($definition); if ($errorMessage !== true) { continue; } try { $this->compileDefinition($entryName, $definition); } catch (InvalidDefinition $e) { if ($silenceErrors) { // forget the entry unset($this->entryToMethodMapping[$entryName]); } else { throw $e; } } } $this->containerClass = $className; $this->containerParentClass = $parentClassName; ob_start(); require __DIR__ . '/Template.php'; $fileContent = ob_get_clean(); $fileContent = "createCompilationDirectory(dirname($fileName)); $this->writeFileAtomic($fileName, $fileContent); return $fileName; } private function writeFileAtomic(string $fileName, string $content) : void { $tmpFile = @tempnam(dirname($fileName), 'swap-compile'); if ($tmpFile === false) { throw new InvalidArgumentException( sprintf('Error while creating temporary file in %s', dirname($fileName)) ); } @chmod($tmpFile, 0666); $written = file_put_contents($tmpFile, $content); if ($written === false) { @unlink($tmpFile); throw new InvalidArgumentException(sprintf('Error while writing to %s', $tmpFile)); } @chmod($tmpFile, 0666); $renamed = @rename($tmpFile, $fileName); if (!$renamed) { @unlink($tmpFile); throw new InvalidArgumentException(sprintf('Error while renaming %s to %s', $tmpFile, $fileName)); } } /** * @return string The method name * @throws DependencyException * @throws InvalidDefinition */ private function compileDefinition(string $entryName, Definition $definition) : string { // Generate a unique method name $methodName = 'get' . (++$this->methodMappingCounter); $this->entryToMethodMapping[$entryName] = $methodName; switch (true) { case $definition instanceof ValueDefinition: $value = $definition->getValue(); $code = 'return ' . $this->compileValue($value) . ';'; break; case $definition instanceof Reference: $targetEntryName = $definition->getTargetEntryName(); $code = 'return $this->delegateContainer->get(' . $this->compileValue($targetEntryName) . ');'; // If this method is not yet compiled we store it for compilation if (!isset($this->entriesToCompile[$targetEntryName])) { $this->entriesToCompile[$targetEntryName] = null; } break; case $definition instanceof StringDefinition: $entryName = $this->compileValue($definition->getName()); $expression = $this->compileValue($definition->getExpression()); $code = 'return \DI\Definition\StringDefinition::resolveExpression(' . $entryName . ', ' . $expression . ', $this->delegateContainer);'; break; case $definition instanceof EnvironmentVariableDefinition: $variableName = $this->compileValue($definition->getVariableName()); $isOptional = $this->compileValue($definition->isOptional()); $defaultValue = $this->compileValue($definition->getDefaultValue()); $code = <<getVariableName()}' has not been defined"); } return $defaultValue; PHP; break; case $definition instanceof ArrayDefinition: try { $code = 'return ' . $this->compileValue($definition->getValues()) . ';'; } catch (\Exception $e) { throw new DependencyException(sprintf( 'Error while compiling %s. %s', $definition->getName(), $e->getMessage() ), 0, $e); } break; case $definition instanceof ObjectDefinition: $compiler = new ObjectCreationCompiler($this); $code = $compiler->compile($definition); $code .= "\n return \$object;"; break; case $definition instanceof DecoratorDefinition: $decoratedDefinition = $definition->getDecoratedDefinition(); if (! $decoratedDefinition instanceof Definition) { if (! $definition->getName()) { throw new InvalidDefinition('Decorators cannot be nested in another definition'); } throw new InvalidDefinition(sprintf( 'Entry "%s" decorates nothing: no previous definition with the same name was found', $definition->getName() )); } $code = sprintf( 'return call_user_func(%s, %s, $this->delegateContainer);', $this->compileValue($definition->getCallable()), $this->compileValue($decoratedDefinition) ); break; case $definition instanceof FactoryDefinition: $value = $definition->getCallable(); // Custom error message to help debugging $isInvokableClass = is_string($value) && class_exists($value) && method_exists($value, '__invoke'); if ($isInvokableClass && !$this->autowiringEnabled) { throw new InvalidDefinition(sprintf( 'Entry "%s" cannot be compiled. Invokable classes cannot be automatically resolved if autowiring is disabled on the container, you need to enable autowiring or define the entry manually.', $entryName )); } $definitionParameters = ''; if (!empty($definition->getParameters())) { $definitionParameters = ', ' . $this->compileValue($definition->getParameters()); } $code = sprintf( 'return $this->resolveFactory(%s, %s%s);', $this->compileValue($value), var_export($entryName, true), $definitionParameters ); break; default: // This case should not happen (so it cannot be tested) throw new \Exception('Cannot compile definition of type ' . $definition::class); } $this->methods[$methodName] = $code; return $methodName; } public function compileValue(mixed $value) : string { // Check that the value can be compiled $errorMessage = $this->isCompilable($value); if ($errorMessage !== true) { throw new InvalidDefinition($errorMessage); } if ($value instanceof Definition) { // Give it an arbitrary unique name $subEntryName = 'subEntry' . (++$this->subEntryCounter); // Compile the sub-definition in another method $methodName = $this->compileDefinition($subEntryName, $value); // The value is now a method call to that method (which returns the value) return "\$this->$methodName()"; } if (is_array($value)) { $value = array_map(function ($value, $key) { $compiledValue = $this->compileValue($value); $key = var_export($key, true); return " $key => $compiledValue,\n"; }, $value, array_keys($value)); $value = implode('', $value); return "[\n$value ]"; } if ($value instanceof \Closure) { return $this->compileClosure($value); } return var_export($value, true); } private function createCompilationDirectory(string $directory) : void { if (!is_dir($directory) && !@mkdir($directory, 0777, true) && !is_dir($directory)) { throw new InvalidArgumentException(sprintf('Compilation directory does not exist and cannot be created: %s.', $directory)); } if (!is_writable($directory)) { throw new InvalidArgumentException(sprintf('Compilation directory is not writable: %s.', $directory)); } } /** * @return string|true If true is returned that means that the value is compilable. */ private function isCompilable($value) : string|bool { if ($value instanceof ValueDefinition) { return $this->isCompilable($value->getValue()); } if (($value instanceof DecoratorDefinition) && empty($value->getName())) { return 'Decorators cannot be nested in another definition'; } // All other definitions are compilable if ($value instanceof Definition) { return true; } if ($value instanceof \Closure) { return true; } /** @psalm-suppress UndefinedClass */ if ((\PHP_VERSION_ID >= 80100) && ($value instanceof \UnitEnum)) { return true; } if (is_object($value)) { return 'An object was found but objects cannot be compiled'; } if (is_resource($value)) { return 'A resource was found but resources cannot be compiled'; } return true; } /** * @throws InvalidDefinition */ private function compileClosure(\Closure $closure) : string { $reflector = new ReflectionClosure($closure); if ($reflector->getUseVariables()) { throw new InvalidDefinition('Cannot compile closures which import variables using the `use` keyword'); } if ($reflector->isBindingRequired() || $reflector->isScopeRequired()) { throw new InvalidDefinition('Cannot compile closures which use $this or self/static/parent references'); } // Force all closures to be static (add the `static` keyword), i.e. they can't use // $this, which makes sense since their code is copied into another class. $code = ($reflector->isStatic() ? '' : 'static ') . $reflector->getCode(); return trim($code, "\t\n\r;"); } } */ class ObjectCreationCompiler { public function __construct( private Compiler $compiler, ) { } public function compile(ObjectDefinition $definition) : string { $this->assertClassIsNotAnonymous($definition); $this->assertClassIsInstantiable($definition); /** @var class-string $className At this point we have checked the class is valid */ $className = $definition->getClassName(); // Lazy? if ($definition->isLazy()) { return $this->compileLazyDefinition($definition); } try { $classReflection = new ReflectionClass($className); $constructorArguments = $this->resolveParameters($definition->getConstructorInjection(), $classReflection->getConstructor()); $dumpedConstructorArguments = array_map(function ($value) { return $this->compiler->compileValue($value); }, $constructorArguments); $code = []; $code[] = sprintf( '$object = new %s(%s);', $className, implode(', ', $dumpedConstructorArguments) ); // Property injections foreach ($definition->getPropertyInjections() as $propertyInjection) { $value = $propertyInjection->getValue(); $value = $this->compiler->compileValue($value); $propertyClassName = $propertyInjection->getClassName() ?: $className; $property = new ReflectionProperty($propertyClassName, $propertyInjection->getPropertyName()); if ($property->isPublic() && !(\PHP_VERSION_ID >= 80100 && $property->isReadOnly())) { $code[] = sprintf('$object->%s = %s;', $propertyInjection->getPropertyName(), $value); } else { // Private/protected/readonly property $code[] = sprintf( '\DI\Definition\Resolver\ObjectCreator::setPrivatePropertyValue(%s, $object, \'%s\', %s);', var_export($propertyInjection->getClassName(), true), $propertyInjection->getPropertyName(), $value ); } } // Method injections foreach ($definition->getMethodInjections() as $methodInjection) { $methodReflection = new ReflectionMethod($className, $methodInjection->getMethodName()); $parameters = $this->resolveParameters($methodInjection, $methodReflection); $dumpedParameters = array_map(function ($value) { return $this->compiler->compileValue($value); }, $parameters); $code[] = sprintf( '$object->%s(%s);', $methodInjection->getMethodName(), implode(', ', $dumpedParameters) ); } } catch (InvalidDefinition $e) { throw InvalidDefinition::create($definition, sprintf( 'Entry "%s" cannot be compiled: %s', $definition->getName(), $e->getMessage() )); } return implode("\n ", $code); } public function resolveParameters(?MethodInjection $definition, ?ReflectionMethod $method) : array { $args = []; if (! $method) { return $args; } $definitionParameters = $definition ? $definition->getParameters() : []; foreach ($method->getParameters() as $index => $parameter) { if (array_key_exists($index, $definitionParameters)) { // Look in the definition $value = &$definitionParameters[$index]; } elseif ($parameter->isOptional()) { // If the parameter is optional and wasn't specified, we take its default value $args[] = $this->getParameterDefaultValue($parameter, $method); continue; } else { throw new InvalidDefinition(sprintf( 'Parameter $%s of %s has no value defined or guessable', $parameter->getName(), $this->getFunctionName($method) )); } $args[] = &$value; } return $args; } private function compileLazyDefinition(ObjectDefinition $definition) : string { $subDefinition = clone $definition; $subDefinition->setLazy(false); $subDefinition = $this->compiler->compileValue($subDefinition); /** @var class-string $className At this point we have checked the class is valid */ $className = $definition->getClassName(); $this->compiler->getProxyFactory()->generateProxyClass($className); return <<proxyFactory->createProxy( '{$definition->getClassName()}', function () { return $subDefinition; } ); STR; } /** * Returns the default value of a function parameter. * * @throws InvalidDefinition Can't get default values from PHP internal classes and functions */ private function getParameterDefaultValue(ReflectionParameter $parameter, ReflectionMethod $function) : mixed { try { return $parameter->getDefaultValue(); } catch (\ReflectionException) { throw new InvalidDefinition(sprintf( 'The parameter "%s" of %s has no type defined or guessable. It has a default value, ' . 'but the default value can\'t be read through Reflection because it is a PHP internal class.', $parameter->getName(), $this->getFunctionName($function) )); } } private function getFunctionName(ReflectionMethod $method) : string { return $method->getName() . '()'; } private function assertClassIsNotAnonymous(ObjectDefinition $definition) : void { if (str_contains($definition->getClassName(), '@')) { throw InvalidDefinition::create($definition, sprintf( 'Entry "%s" cannot be compiled: anonymous classes cannot be compiled', $definition->getName() )); } } private function assertClassIsInstantiable(ObjectDefinition $definition) : void { if ($definition->isInstantiable()) { return; } $message = ! $definition->classExists() ? 'Entry "%s" cannot be compiled: the class doesn\'t exist' : 'Entry "%s" cannot be compiled: the class is not instantiable'; throw InvalidDefinition::create($definition, sprintf($message, $definition->getName())); } } /** * This class has been auto-generated by PHP-DI. */ class containerClass; ?> extends containerParentClass; ?> { const METHOD_MAPPING = entryToMethodMapping); ?>; methods as $methodName => $methodContent) { ?> protected function () { } } */ class RequestedEntryHolder implements RequestedEntry { public function __construct( private string $name, ) { } public function getName() : string { return $this->name; } } */ class Container implements ContainerInterface, FactoryInterface, InvokerInterface { /** * Map of entries that are already resolved. */ protected array $resolvedEntries = []; private MutableDefinitionSource $definitionSource; private DefinitionResolver $definitionResolver; /** * Map of definitions that are already fetched (local cache). * * @var array */ private array $fetchedDefinitions = []; /** * Array of entries being resolved. Used to avoid circular dependencies and infinite loops. */ protected array $entriesBeingResolved = []; private ?InvokerInterface $invoker = null; /** * Container that wraps this container. If none, points to $this. */ protected ContainerInterface $delegateContainer; protected ProxyFactoryInterface $proxyFactory; public static function create( array $definitions, ) : static { $source = new SourceChain([new ReflectionBasedAutowiring]); $source->setMutableDefinitionSource(new DefinitionArray($definitions, new ReflectionBasedAutowiring)); return new static($definitions); } /** * Use `$container = new Container()` if you want a container with the default configuration. * * If you want to customize the container's behavior, you are discouraged to create and pass the * dependencies yourself, the ContainerBuilder class is here to help you instead. * * @see ContainerBuilder * * @param ContainerInterface $wrapperContainer If the container is wrapped by another container. */ public function __construct( array|MutableDefinitionSource $definitions = [], ?ProxyFactoryInterface $proxyFactory = null, ?ContainerInterface $wrapperContainer = null, ) { if (is_array($definitions)) { $this->definitionSource = $this->createDefaultDefinitionSource($definitions); } else { $this->definitionSource = $definitions; } $this->delegateContainer = $wrapperContainer ?: $this; if ($proxyFactory === null) { $proxyFactory = (\PHP_VERSION_ID >= 80400) ? new NativeProxyFactory : new ProxyFactory; } $this->proxyFactory = $proxyFactory; $this->definitionResolver = new ResolverDispatcher($this->delegateContainer, $this->proxyFactory); // Auto-register the container $this->resolvedEntries = [ self::class => $this, ContainerInterface::class => $this->delegateContainer, FactoryInterface::class => $this, InvokerInterface::class => $this, ]; } /** * Returns an entry of the container by its name. * * @template T * @param string|class-string $id Entry name or a class name. * * @return mixed|T * @throws DependencyException Error while resolving the entry. * @throws NotFoundException No entry found for the given name. */ public function get(string $id) : mixed { // If the entry is already resolved we return it if (isset($this->resolvedEntries[$id]) || array_key_exists($id, $this->resolvedEntries)) { return $this->resolvedEntries[$id]; } $definition = $this->getDefinition($id); if (! $definition) { throw new NotFoundException("No entry or class found for '$id'"); } $value = $this->resolveDefinition($definition); $this->resolvedEntries[$id] = $value; return $value; } private function getDefinition(string $name) : ?Definition { // Local cache that avoids fetching the same definition twice if (!array_key_exists($name, $this->fetchedDefinitions)) { $this->fetchedDefinitions[$name] = $this->definitionSource->getDefinition($name); } return $this->fetchedDefinitions[$name]; } /** * Build an entry of the container by its name. * * This method behave like get() except resolves the entry again every time. * For example if the entry is a class then a new instance will be created each time. * * This method makes the container behave like a factory. * * @template T * @param string|class-string $name Entry name or a class name. * @param array $parameters Optional parameters to use to build the entry. Use this to force * specific parameters to specific values. Parameters not defined in this * array will be resolved using the container. * * @return mixed|T * @throws InvalidArgumentException The name parameter must be of type string. * @throws DependencyException Error while resolving the entry. * @throws NotFoundException No entry found for the given name. */ public function make(string $name, array $parameters = []) : mixed { $definition = $this->getDefinition($name); if (! $definition) { // If the entry is already resolved we return it if (array_key_exists($name, $this->resolvedEntries)) { return $this->resolvedEntries[$name]; } throw new NotFoundException("No entry or class found for '$name'"); } return $this->resolveDefinition($definition, $parameters); } public function has(string $id) : bool { if (array_key_exists($id, $this->resolvedEntries)) { return true; } $definition = $this->getDefinition($id); if ($definition === null) { return false; } return $this->definitionResolver->isResolvable($definition); } /** * Inject all dependencies on an existing instance. * * @template T * @param object|T $instance Object to perform injection upon * @return object|T $instance Returns the same instance * @throws InvalidArgumentException * @throws DependencyException Error while injecting dependencies */ public function injectOn(object $instance) : object { $className = $instance::class; // If the class is anonymous, don't cache its definition // Checking for anonymous classes is cleaner via Reflection, but also slower $objectDefinition = str_contains($className, '@anonymous') ? $this->definitionSource->getDefinition($className) : $this->getDefinition($className); if (! $objectDefinition instanceof ObjectDefinition) { return $instance; } $definition = new InstanceDefinition($instance, $objectDefinition); $this->definitionResolver->resolve($definition); return $instance; } /** * Call the given function using the given parameters. * * Missing parameters will be resolved from the container. * * @param callable|array|string $callable Function to call. * @param array $parameters Parameters to use. Can be indexed by the parameter names * or not indexed (same order as the parameters). * The array can also contain DI definitions, e.g. DI\get(). * * @return mixed Result of the function. */ public function call($callable, array $parameters = []) : mixed { return $this->getInvoker()->call($callable, $parameters); } /** * Define an object or a value in the container. * * @param string $name Entry name * @param mixed|DefinitionHelper $value Value, use definition helpers to define objects */ public function set(string $name, mixed $value) : void { if ($value instanceof DefinitionHelper) { $value = $value->getDefinition($name); } elseif ($value instanceof \Closure) { $value = new FactoryDefinition($name, $value); } if ($value instanceof ValueDefinition) { $this->resolvedEntries[$name] = $value->getValue(); } elseif ($value instanceof Definition) { $value->setName($name); $this->setDefinition($name, $value); } else { $this->resolvedEntries[$name] = $value; } } /** * Get defined container entries. * * @return string[] */ public function getKnownEntryNames() : array { $entries = array_unique(array_merge( array_keys($this->definitionSource->getDefinitions()), array_keys($this->resolvedEntries) )); sort($entries); return $entries; } /** * Get entry debug information. * * @param string $name Entry name * * @throws InvalidDefinition * @throws NotFoundException */ public function debugEntry(string $name) : string { $definition = $this->definitionSource->getDefinition($name); if ($definition instanceof Definition) { return (string) $definition; } if (array_key_exists($name, $this->resolvedEntries)) { return $this->getEntryType($this->resolvedEntries[$name]); } throw new NotFoundException("No entry or class found for '$name'"); } /** * Get formatted entry type. */ private function getEntryType(mixed $entry) : string { if (is_object($entry)) { return sprintf("Object (\n class = %s\n)", $entry::class); } if (is_array($entry)) { return preg_replace(['/^array \(/', '/\)$/'], ['[', ']'], var_export($entry, true)); } if (is_string($entry)) { return sprintf('Value (\'%s\')', $entry); } if (is_bool($entry)) { return sprintf('Value (%s)', $entry === true ? 'true' : 'false'); } return sprintf('Value (%s)', is_scalar($entry) ? (string) $entry : ucfirst(gettype($entry))); } /** * Resolves a definition. * * Checks for circular dependencies while resolving the definition. * * @throws DependencyException Error while resolving the entry. */ private function resolveDefinition(Definition $definition, array $parameters = []) : mixed { $entryName = $definition->getName(); // Check if we are already getting this entry -> circular dependency if (isset($this->entriesBeingResolved[$entryName])) { $entryList = implode(' -> ', [...array_keys($this->entriesBeingResolved), $entryName]); throw new DependencyException("Circular dependency detected while trying to resolve entry '$entryName': Dependencies: " . $entryList); } $this->entriesBeingResolved[$entryName] = true; // Resolve the definition try { $value = $this->definitionResolver->resolve($definition, $parameters); } finally { unset($this->entriesBeingResolved[$entryName]); } return $value; } protected function setDefinition(string $name, Definition $definition) : void { // Clear existing entry if it exists if (array_key_exists($name, $this->resolvedEntries)) { unset($this->resolvedEntries[$name]); } $this->fetchedDefinitions = []; // Completely clear this local cache $this->definitionSource->addDefinition($definition); } private function getInvoker() : InvokerInterface { if (! $this->invoker) { $parameterResolver = new ResolverChain([ new DefinitionParameterResolver($this->definitionResolver), new NumericArrayResolver, new AssociativeArrayResolver, new DefaultValueResolver, new TypeHintContainerResolver($this->delegateContainer), ]); $this->invoker = new Invoker($parameterResolver, $this); } return $this->invoker; } private function createDefaultDefinitionSource(array $definitions) : SourceChain { $autowiring = new ReflectionBasedAutowiring; $source = new SourceChain([$autowiring]); $source->setMutableDefinitionSource(new DefinitionArray($definitions, $autowiring)); return $source; } } # Change log ## 6.1.0 - [#791](https://github.com/PHP-DI/PHP-DI/issues/791) Support PHP 8.1, remove support for PHP 7.2 ## 6.0.2 - Fix potential regression introduced when fixing [#582](https://github.com/PHP-DI/PHP-DI/issues/582) ## 6.0.1 - Fix [#526](https://github.com/PHP-DI/PHP-DI/issues/526): Support optional parameters in factories - [#585](https://github.com/PHP-DI/PHP-DI/issues/585) Add support for PHP-Parser 4.0 - [#582](https://github.com/PHP-DI/PHP-DI/issues/582) Register `ContainerInterface` to point to the wrapper container if it was defined ## 6.0 This is the complete change log. You can also read the [migration guide](doc/migration/6.0.md) for upgrading or the [blog article](news/22-php-di-6-0-released.md) to see what's new. Improvements: - [#494](https://github.com/PHP-DI/PHP-DI/pull/494) The container can now be compiled for optimum performances in production - [#294](https://github.com/PHP-DI/PHP-DI/issues/294), [#349](https://github.com/PHP-DI/PHP-DI/issues/349), [#449](https://github.com/PHP-DI/PHP-DI/pull/449): `DI\object()` has been replaced by more specific and less ambiguous helpers: - `DI\create()` creates an object, overrides autowiring and previous definitions - `DI\autowire()` autowires an object and allows to override specific constructor and method parameters - The container can now be built without parameters: `new Container()` - Definitions can be nested: - [#490](https://github.com/PHP-DI/PHP-DI/issues/490) Definitions can be nested in arrays (by [@yuloh](https://github.com/yuloh)) - [#501](https://github.com/PHP-DI/PHP-DI/issues/501) & [#540](https://github.com/PHP-DI/PHP-DI/issues/540) Autowire definitions can be nested in other definitions - [#487](https://github.com/PHP-DI/PHP-DI/issues/487) & [#540](https://github.com/PHP-DI/PHP-DI/issues/540) Closures are now handled as factories when they are nested in other definitions - [#487](https://github.com/PHP-DI/PHP-DI/issues/487) Closures in the config are now always interpreted as factories, even when nested inside other definitions - [#242](https://github.com/PHP-DI/PHP-DI/issues/242) Error in case a definition is not indexed by a string - [#505](https://github.com/PHP-DI/PHP-DI/pull/505) Debug container entries - [#564](https://github.com/PHP-DI/PHP-DI/pull/564) Caching was made almost entirely obsolete by the container compilation, however there is still a caching system entirely rebuilt over APCu for covering the last cases that compilation could not address (see [php-di.org/doc/performances.html](https://php-di.org/doc/performances.html)) Fixes: - [#499](https://github.com/PHP-DI/PHP-DI/issues/499) & [#488](https://github.com/PHP-DI/PHP-DI/issues/488) Standardize resolution of nested definitions everywhere. In PHP-DI 5, definitions could be nested in some places (e.g. use a get() in an object definition, etc.). However it did not behave everywhere the same, for example it didn't work for sub-definitions in arrays. Now in PHP-DI 6 all nested definitions will all be recognized and resolved correctly everywhere. Since #494 (compiled container) performance will not be affected so we can implement a more robust behavior. - [#343](https://github.com/PHP-DI/PHP-DI/issues/343) Autowiring and Annotations do not work for `object()` inside arrays: it now works with the new `create()` and `autowire()` helpers BC breaks: - PHP 7 or greater is required and HHVM is no longer supported - `DI\object()` has been removed, use `DI\create()` or `DI\autowire()` instead - [#409](https://github.com/PHP-DI/PHP-DI/issues/409): Scopes are removed, read more in the [scopes](doc/scopes.md) documentation. - Caching was replaced by compiling the container: `ContainerBuilder::setDefinitionCache()` was removed, use `ContainerBuilder::enableCompilation()` instead. - [#463](https://github.com/PHP-DI/PHP-DI/issues/463) & [#485](https://github.com/PHP-DI/PHP-DI/issues/485): Container-interop support was removed, PSR-11 is used instead (by [@juliangut](https://github.com/juliangut)) - The deprecated `DI\link()` helper was removed, used `DI\get()` instead - [#484](https://github.com/PHP-DI/PHP-DI/pull/484) The deprecated `\DI\Debug` class has been removed. Definitions can be cast to string directly - The exception `DI\Definition\Exception\DefinitionException` was renamed to `DI\Definition\Exception\InvalidDefinition` - The exception `DI\Definition\Exception\AnnotationException` was renamed to `DI\Definition\Exception\InvalidAnnotation` - [#516](https://github.com/PHP-DI/PHP-DI/issues/516) `DI\InvokerInterface` was removed in favor of `Invoker\InvokerInterface`. Be also aware that internal classes or interfaces may have changed. ## 5.4.6 - Fix [#554](https://github.com/PHP-DI/PHP-DI/issues/554): `Container::make()` fails when combined with `decorate()`. ## 5.4.5 Fixup of 5.4.4. - [#531](https://github.com/PHP-DI/PHP-DI/issues/531): performance improvement. ## 5.4.4 This release was broken because it was tagged against the wrong branch. - [#531](https://github.com/PHP-DI/PHP-DI/issues/531): performance improvement. ## 5.4.3 - [#467](https://github.com/PHP-DI/PHP-DI/issues/467): register the container against the PSR ContainerInterface ## 5.4.2 - Minor patch to add the `provide: psr/container-implementation` to `composer.json`. ## 5.4.1 - [PSR-11](http://www.php-fig.org/psr/) compliance Note that PHP-DI was already compliant with PSR-11 because it was implementing container-interop, and container-interop 1.2 extends PSR-11. This new version just makes it more explicit and will allow to drop container-interop support in the next major versions. ## 5.4 Read the [news entry](news/20-php-di-5-4-released.md). New features: - [#362](https://github.com/PHP-DI/PHP-DI/issues/362) implemented in [#428](https://github.com/PHP-DI/PHP-DI/pull/428), [#430](https://github.com/PHP-DI/PHP-DI/pull/430), [#431](https://github.com/PHP-DI/PHP-DI/pull/431) and [#432](https://github.com/PHP-DI/PHP-DI/pull/432): factory parameters can now be configured, for example: ```php return [ 'Database' => DI\factory(function ($host) {...}) ->parameter('host', DI\get('db.host')), ]; ``` Read the [factories documentation](https://php-di.org/doc/php-definitions.html#factories) to learn more. Feature implemented by [@predakanga](https://github.com/predakanga). Improvements: - [#429](https://github.com/PHP-DI/PHP-DI/pull/429): performance improvements in definition resolution (by [@mnapoli](https://github.com/mnapoli)) - [#421](https://github.com/PHP-DI/PHP-DI/issues/421): once a `ContainerBuilder` has built a container, it is locked to prevent confusion when adding new definitions to it (by [@mnapoli](https://github.com/mnapoli)) - [#423](https://github.com/PHP-DI/PHP-DI/pull/423): improved exception messages (by [@mnapoli](https://github.com/mnapoli)) ## 5.3 Read the [news entry](news/19-php-di-5-3-released.md). - release of the [2.0 version](https://github.com/PHP-DI/Symfony-Bridge/releases/tag/2.0.0) of the Symfony bridge (by [@mnapoli](https://github.com/mnapoli)) - PHP 5.5 or above is now required - a lot of documentation improvements by 9 different contributors - [#389](https://github.com/PHP-DI/PHP-DI/pull/389): exception message improvement by [@mopahle](https://github.com/mopahle) - [#359](https://github.com/PHP-DI/PHP-DI/issues/359), [#411](https://github.com/PHP-DI/PHP-DI/issues/411), [#414](https://github.com/PHP-DI/PHP-DI/pull/414), [#412](https://github.com/PHP-DI/PHP-DI/pull/412): compatibility with ProxyManager 1.* and 2.* (by [@holtkamp](https://github.com/holtkamp) and [@mnapoli](https://github.com/mnapoli)) - [#416](https://github.com/PHP-DI/PHP-DI/pull/416): dumping definitions was refactored into a more lightweight and simple solution; definition "dumpers" have been removed (internal classes), definitions can now be cast to string directly (by [@mnapoli](https://github.com/mnapoli)) ## 5.2 Read the [news entry](news/17-php-di-5-2-released.md). Improvements: - [#347](https://github.com/PHP-DI/PHP-DI/pull/347) (includes [#333](https://github.com/PHP-DI/PHP-DI/pull/333) and [#345](https://github.com/PHP-DI/PHP-DI/pull/345)): by [@jdreesen](https://github.com/jdreesen), [@quimcalpe](https://github.com/quimcalpe) and [@mnapoli](https://github.com/mnapoli) - Allow injection of any container object as factory parameter via type hinting - Allow injection of a `DI\Factory\RequestedEntry` object to get the requested entry name - [#272](https://github.com/PHP-DI/PHP-DI/issues/272): Support `"Class::method""` syntax for callables (by [@jdreesen](https://github.com/jdreesen)) - [#332](https://github.com/PHP-DI/PHP-DI/issues/332): IDE support (plugin and documentation) (by [@pulyaevskiy](https://github.com/pulyaevskiy), [@avant1](https://github.com/avant1) and [@mnapoli](https://github.com/mnapoli)) - [#326](https://github.com/PHP-DI/PHP-DI/pull/326): Exception messages are simpler and more consistent (by [@mnapoli](https://github.com/mnapoli)) - [#325](https://github.com/PHP-DI/PHP-DI/pull/325): Add a "Edit this page" button in the website to encourage users to improve the documentation (by [@jdreesen](https://github.com/jdreesen)) Bugfixes: - [#321](https://github.com/PHP-DI/PHP-DI/pull/321): Allow factory definitions to reference arbitrary container entries as callables (by [@jdreesen](https://github.com/jdreesen)) - [#335](https://github.com/PHP-DI/PHP-DI/issues/335): Class imports in traits are now considered when parsing annotations (by [@thebigb](https://github.com/thebigb)) ## 5.1 Read the [news entry](news/16-php-di-5-1-released.md). Improvements: - [Zend Framework 2 integration](https://github.com/PHP-DI/ZF2-Bridge) (by @Rastusik) - [#308](https://github.com/PHP-DI/PHP-DI/pull/308): Instantiate factories using the container (`DI\factory(['FooFactory', 'create'])`) - Many performances improvements - some benchmarks show up to 35% performance improvements, real results may vary of course - Many documentation improvements (@jdreesen, @mindplay-dk, @mnapoli, @holtkamp, @Rastusik) - [#296](https://github.com/PHP-DI/PHP-DI/issues/296): Provide a faster `ArrayCache` implementation, mostly useful in micro-benchmarks Bugfixes: - [#257](https://github.com/PHP-DI/PHP-DI/issues/257) & [#274](https://github.com/PHP-DI/PHP-DI/issues/274): Private properties of parent classes are not injected when using annotations - [#300](https://github.com/PHP-DI/PHP-DI/pull/300): Exception if object definition extends an incompatible definition - [#306](https://github.com/PHP-DI/PHP-DI/issues/306): Errors when using parameters passed by reference (fixed by @bradynpoulsen) - [#318](https://github.com/PHP-DI/PHP-DI/issues/318): `Container::call()` ignores parameter's default value Internal changes: - [#276](https://github.com/PHP-DI/PHP-DI/pull/276): Tests now pass on Windows (@bgaillard) ## 5.0 This is the complete change log. You can also read the [migration guide](doc/migration/5.0.md) for upgrading, or [the news article](news/15-php-di-5-0-released.md) for a nicer introduction to this new version. Improvements: - Moved to an organization on GitHub: [github.com/PHP-DI/PHP-DI](https://github.com/PHP-DI/PHP-DI) - The package has been renamed to: from `mnapoli/php-di` to [`php-di/php-di`](https://packagist.org/packages/php-di/php-di) - New [Silex integration](doc/frameworks/silex.md) - Lighter package: from 10 to 3 Composer dependencies! - [#235](https://github.com/PHP-DI/PHP-DI/issues/235): `DI\link()` is now deprecated in favor of `DI\get()`. There is no BC break as `DI\link()` still works. - [#207](https://github.com/PHP-DI/PHP-DI/issues/207): Support for `DI\link()` in arrays - [#203](https://github.com/PHP-DI/PHP-DI/issues/203): New `DI\string()` helper ([documentation](doc/php-definitions.md)) - [#208](https://github.com/PHP-DI/PHP-DI/issues/208): Support for nested definitions - [#226](https://github.com/PHP-DI/PHP-DI/pull/226): `DI\factory()` can now be omitted with closures: ```php // before 'My\Class' => DI\factory(function () { ... }) // now (optional shortcut) 'My\Class' => function () { ... } ``` - [#193](https://github.com/PHP-DI/PHP-DI/issues/193): `DI\object()->method()` now supports calling the same method twice (or more). - [#248](https://github.com/PHP-DI/PHP-DI/issues/248): New `DI\decorate()` helper to decorate a previously defined entry ([documentation](doc/definition-overriding.md)) - [#215](https://github.com/PHP-DI/PHP-DI/pull/215): New `DI\add()` helper to add entries to an existing array ([documentation](doc/definition-overriding.md)) - [#218](https://github.com/PHP-DI/PHP-DI/issues/218): `ContainerBuilder::addDefinitions()` can now take an array of definitions - [#211](https://github.com/PHP-DI/PHP-DI/pull/211): `ContainerBuilder::addDefinitions()` is now fluent (return `$this`) - [#250](https://github.com/PHP-DI/PHP-DI/issues/250): `Container::call()` now also accepts parameters not indexed by name as well as embedded definitions ([documentation](doc/container.md)) - Various performance improvements, e.g. lower the number of files loaded, simpler architecture, … BC breaks: - PHP-DI now requires a version of PHP >= 5.4.0 - The package is lighter by default: - [#251](https://github.com/PHP-DI/PHP-DI/issues/251): Annotations are disabled by default, if you use annotations enable them with `$containerBuilder->useAnnotations(true)`. Additionally the `doctrine/annotations` package isn't required by default anymore, so you also need to run `composer require doctrine/annotations`. - `doctrine/cache` is not installed by default anymore, you need to require it in `composer.json` (`~1.0`) if you want to configure a cache for PHP-DI - [#198](https://github.com/PHP-DI/PHP-DI/issues/198): `ocramius/proxy-manager` is not installed by default anymore, you need to require it in `composer.json` (`~1.0`) if you want to use **lazy injection** - Closures are now converted into factory definitions automatically. If you ever defined a closure as a value (e.g. to have the closure injected in a class), you need to wrap the closure with the new `DI\value()` helper. - [#223](https://github.com/PHP-DI/PHP-DI/issues/223): `DI\ContainerInterface` was deprecated since v4.1 and has been removed Internal changes in case you were replacing/extending some parts: - the definition sources architecture has been refactored, if you defined custom definition sources you will need to update your code (it should be much easier now) - [#252](https://github.com/PHP-DI/PHP-DI/pull/252): `DI\Scope` internal implementation has changed. You are encouraged to use the constants (`DI\Scope::SINGLETON` and `DI\Scope::PROTOTYPE`) instead of the static methods, but backward compatibility is kept (static methods still work). - [#241](https://github.com/PHP-DI/PHP-DI/issues/241): `Container::call()` now uses the *Invoker* external library ## 4.4 Read the [news entry](news/13-php-di-4-4-released.md). - [#185](https://github.com/PHP-DI/PHP-DI/issues/185) Support for invokable objects in `Container::call()` - [#192](https://github.com/PHP-DI/PHP-DI/pull/192) Support for invokable classes in `Container::call()` (will instantiate the class) - [#184](https://github.com/PHP-DI/PHP-DI/pull/184) Option to ignore phpdoc errors ## 4.3 Read the [news entry](news/11-php-di-4-3-released.md). - [#176](https://github.com/PHP-DI/PHP-DI/pull/176) New definition type for reading environment variables: `DI\env()` - [#181](https://github.com/PHP-DI/PHP-DI/pull/181) `DI\FactoryInterface` and `DI\InvokerInterface` are now auto-registered inside the container so that you can inject them without any configuration needed - [#173](https://github.com/PHP-DI/PHP-DI/pull/173) `$container->call(['MyClass', 'method]);` will get `MyClass` from the container if `method()` is not a static method ## 4.2.2 - Fixed [#180](https://github.com/PHP-DI/PHP-DI/pull/180): `Container::call()` with object methods (`[$object, 'method']`) is now supported ## 4.2.1 - Support for PHP 5.3.3, which was previously incomplete because of a bug in the reflection (there is now a workaround for this bug) But if you can, seriously avoid this (really old) PHP version and upgrade. ## 4.2 Read the [news entry](news/10-php-di-4-2-released.md). **Minor BC-break**: Optional parameters (that were not configured) were injected, they are now ignored, which is what naturally makes sense since they are optional. Example: ```php public function __construct(Bar $bar = null) { $this->bar = $bar ?: $this->createDefaultBar(); } ``` Before 4.2, PHP-DI would try to inject a `Bar` instance. From 4.2 and onwards, it will inject `null`. Of course, you can still explicitly define an injection for the optional parameters and that will work. All changes: * [#162](https://github.com/PHP-DI/PHP-DI/pull/162) Added `Container::call()` to call functions with dependency injection * [#156](https://github.com/PHP-DI/PHP-DI/issues/156) Wildcards (`*`) in definitions * [#164](https://github.com/PHP-DI/PHP-DI/issues/164) Prototype scope is now available for `factory()` definitions too * FIXED [#168](https://github.com/PHP-DI/PHP-DI/pull/168) `Container::has()` now returns false for interfaces and abstract classes that are not mapped in the definitions * FIXED [#171](https://github.com/PHP-DI/PHP-DI/issues/171) Optional parameters are now ignored (not injected) if not set in the definitions (see the BC-break warning above) ## 4.1 Read the [news entry](news/09-php-di-4-1-released.md). BC-breaks: None. * [#138](https://github.com/PHP-DI/PHP-DI/issues/138) [Container-interop](https://github.com/container-interop/container-interop) compliance * [#143](https://github.com/PHP-DI/PHP-DI/issues/143) Much more explicit exception messages * [#157](https://github.com/PHP-DI/PHP-DI/issues/157) HHVM support * [#158](https://github.com/PHP-DI/PHP-DI/issues/158) Improved the documentation for [Symfony 2 integration](https://php-di.org/doc/frameworks/symfony2.html) ## 4.0 Major changes: * The configuration format has changed ([read more here to understand why](news/06-php-di-4-0-new-definitions.md)) Read the migration guide if you are using 3.x: [Migration guide from 3.x to 4.0](doc/migration/4.0.md). BC-breaks: * YAML, XML and JSON definitions have been removed, and the PHP definition format has changed (see above) * `ContainerSingleton` has been removed * You cannot configure an injection as lazy anymore, you can only configure a container entry as lazy * The Container constructor now takes mandatory parameters. Use the ContainerBuilder to create a Container. * Removed `ContainerBuilder::setDefinitionsValidation()` (no definition validation anymore) * `ContainerBuilder::useReflection()` is now named: `ContainerBuilder::useAutowiring()` * `ContainerBuilder::addDefinitionsFromFile()` is now named: `ContainerBuilder::addDefinitions()` * The `$proxy` parameter in `Container::get($name, $proxy = true)` hase been removed. To get a proxy, you now need to define an entry as "lazy". Other changes: * Added `ContainerInterface` and `FactoryInterface`, both implemented by the container. * [#115](https://github.com/PHP-DI/PHP-DI/issues/115) Added `Container::has()` * [#142](https://github.com/PHP-DI/PHP-DI/issues/142) Added `Container::make()` to resolve an entry * [#127](https://github.com/PHP-DI/PHP-DI/issues/127) Added support for cases where PHP-DI is wrapped by another container (like Acclimate): PHP-DI can now use the wrapping container to perform injections * [#128](https://github.com/PHP-DI/PHP-DI/issues/128) Configure entry aliases * [#110](https://github.com/PHP-DI/PHP-DI/issues/110) XML definitions are not supported anymore * [#122](https://github.com/PHP-DI/PHP-DI/issues/122) JSON definitions are not supported anymore * `ContainerSingleton` has finally been removed * Added `ContainerBuilder::buildDevContainer()` to get started with a default container very easily. * [#99](https://github.com/PHP-DI/PHP-DI/issues/99) Fixed "`@param` with PHP internal type throws exception" ## 3.5.1 * FIXED [#126](https://github.com/PHP-DI/PHP-DI/issues/126): `Container::set` without effect if a value has already been set and retrieved ## 3.5 Read the [news entry](news/05-php-di-3-5.md). * Importing `@Inject` and `@Injectable` annotations is now optional! It means that you don't have to write `use DI\Annotation\Inject` anymore * FIXED [#124](https://github.com/PHP-DI/PHP-DI/issues/124): `@Injects` annotation conflicts with other annotations ## 3.4 Read the [news entry](news/04-php-di-3-4.md). * [#106](https://github.com/PHP-DI/PHP-DI/pull/106) You can now define arrays of values (in YAML, PHP, …) thanks to [@unkind](https://github.com/unkind) * [#98](https://github.com/PHP-DI/PHP-DI/issues/98) `ContainerBuilder` is now fluent thanks to [@drdamour](https://github.com/drdamour) * [#101](https://github.com/PHP-DI/PHP-DI/pull/101) Optional parameters are now supported: if you don't define a value to inject, their default value will be used * XML definitions have been deprecated, there weren't even documented and were not maintained. They will be removed in 4.0. * FIXED [#100](https://github.com/PHP-DI/PHP-DI/issues/100): bug for lazy injection in constructors ## 3.3 Read the [news entry](news/03-php-di-3-3.md). * Inject dependencies on an existing instance with `Container::injectOn` (work from [Jeff Flitton](https://github.com/jflitton): [#89](https://github.com/PHP-DI/PHP-DI/pull/89)). * [#86](https://github.com/PHP-DI/PHP-DI/issues/86): Optimized definition lookup (faster) * FIXED [#87](https://github.com/PHP-DI/PHP-DI/issues/87): Rare bug in the `PhpDocParser`, fixed by [drdamour](https://github.com/drdamour) ## 3.2 Read the [news entry](news/02-php-di-3-2.md). Small BC-break: PHP-DI 3.0 and 3.1 injected properties before calling the constructor. This was confusing and [not supported for internal classes](https://github.com/PHP-DI/PHP-DI/issues/74). From 3.2 and on, properties are injected after calling the constructor. * **[Lazy injection](doc/lazy-injection.md)**: it is now possible to use lazy injection on properties and methods (setters and constructors). * Lazy dependencies are now proxies that extend the class they proxy, so type-hinting works. * Addition of the **`ContainerBuilder`** object, that helps to [create and configure a `Container`](doc/container-configuration.md). * Some methods for configuring the Container have gone **deprecated** in favor of the `ContainerBuilder`. Fear not, these deprecated methods will remain until next major version (4.0). * `Container::useReflection`, use ContainerBuilder::useReflection instead * `Container::useAnnotations`, use ContainerBuilder::useAnnotations instead * `Container::setDefinitionCache`, use ContainerBuilder::setDefinitionCache instead * `Container::setDefinitionsValidation`, use ContainerBuilder::setDefinitionsValidation instead * The container is now auto-registered (as 'DI\Container'). You can now inject the container without registering it. ## 3.1.1 * Value definitions (`$container->set('foo', 80)`) are not cached anymore * FIXED [#82](https://github.com/PHP-DI/PHP-DI/issues/82): Serialization error when using a cache ## 3.1 Read the [news entry](news/01-php-di-3-1.md). * Zend Framework 1 integration through the [PHP-DI-ZF1 project](https://github.com/PHP-DI/PHP-DI-ZF1) * Fixed the order of priorities when you mix different definition sources (reflection, annotations, files, …). See [Definition overriding](doc/definition-overriding.md) * Now possible to define null values with `$container->set('foo', null)` (see [#79](https://github.com/PHP-DI/PHP-DI/issues/79)). * Deprecated usage of `ContainerSingleton`, will be removed in next major version (4.0) ## 3.0.6 * FIXED [#76](https://github.com/PHP-DI/PHP-DI/issues/76): Definition conflict when setting a closure for a class name ## 3.0.5 * FIXED [#70](https://github.com/PHP-DI/PHP-DI/issues/70): Definition conflict when setting a value for a class name ## 3.0.4 * FIXED [#69](https://github.com/PHP-DI/PHP-DI/issues/69): YamlDefinitionFileLoader crashes if YAML file is empty ## 3.0.3 * Fixed over-restrictive dependencies in composer.json ## 3.0.2 * [#64](https://github.com/PHP-DI/PHP-DI/issues/64): Non PHP-DI exceptions are not captured-rethrown anymore when injecting dependencies (cleaner stack trace) ## 3.0.1 * [#62](https://github.com/PHP-DI/PHP-DI/issues/62): When using aliases, definitions are now merged ## 3.0 Major compatibility breaks with 2.x. * The container is no longer a Singleton (but `ContainerSingleton::getInstance()` is available for fools who like it) * Setter injection * Constructor injection * Scopes: singleton (share the same instance of the class) or prototype (create a new instance each time it is fetched). Defined at class level. * Configuration is reworked from scratch. Now every configuration backend can do 100% of the job. * Provided configuration backends: * Reflection * Annotations: @Inject, @Injectable * PHP code (`Container::set()`) * PHP array * YAML file * As a consequence, annotations are not mandatory anymore, all functionalities can be used with or without annotations. * Renamed `DI\Annotations\` to `DI\Annotation\` * `Container` no longer implements ArrayAccess, use only `$container->get($key)` now * ZF1 integration broken and removed (work in progress for next releases) * Code now follows PSR1 and PSR2 coding styles * FIXED: [#58](https://github.com/PHP-DI/PHP-DI/issues/58) Getting a proxy of an alias didn't work ## 2.1 * `use` statements to import classes from other namespaces are now taken into account with the `@var` annotation * Updated and lightened the dependencies : `doctrine/common` has been replaced with more specific `doctrine/annotations` and `doctrine/cache` ## 2.0 Major compatibility breaks with 1.x. * `Container::resolveDependencies()` has been renamed to `Container::injectAll()` * Dependencies are now injected **before** the constructor is called, and thus are available in the constructor * Merged `@Value` annotation with `@Inject`: no difference between value and bean injection anymore * Container implements ArrayAccess for get() and set() (`$container['db.host'] = 'localhost';`) * Ini configuration files removed: configuration is done in PHP * Allow to define beans within closures for lazy-loading * Switched to MIT License Warning: * If you use PHP 5.3 and __wakeup() methods, they will be called when PHP-DI creates new instances of those classes. ## 1.1 * Caching of annotations based on Doctrine caches ## 1.0 * DependencyManager renamed to Container * Refactored basic Container usage with `get` and `set` * Allow named injection `@Inject(name="")` * Zend Framework integration --- layout: documentation current_menu: enterprise-support title: Enterprise support for PHP-DI --- # PHP-DI for Enterprise > *Available as part of the Tidelift Subscription* Tidelift is working with the maintainers of PHP-DI and thousands of other open source projects to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. #### [Learn more](https://tidelift.com/subscription/pkg/packagist-php-di-php-di?utm_source=packagist-php-di-php-di&utm_medium=referral&utm_campaign=enterprise) | [**Request a demo**](https://tidelift.com/subscription/request-a-demo?utm_source=packagist-php-di-php-di&utm_medium=referral&utm_campaign=enterprise) ## Enterprise-ready open source software—managed for you The Tidelift Subscription is a managed open source subscription for application dependencies covering millions of open source projects across JavaScript, Python, Java, PHP, Ruby, .NET, and more. Your subscription includes: - **Security updates** Tidelift’s security response team coordinates patches for new breaking security vulnerabilities and alerts immediately through a private channel, so your software supply chain is always secure. - **Licensing verification and indemnification** Tidelift verifies license information to enable easy policy enforcement and adds intellectual property indemnification to cover creators and users in case something goes wrong. You always have a 100% up-to-date bill of materials for your dependencies to share with your legal team, customers, or partners. - **Maintenance and code improvement** Tidelift ensures the software you rely on keeps working as long as you need it to work. Your managed dependencies are actively maintained and we recruit additional maintainers where required. - **Package selection and version guidance** We help you choose the best open source packages from the start—and then guide you through updates to stay on the best releases as new issues arise. - **Roadmap input** Take a seat at the table with the creators behind the software you use. Tidelift’s participating maintainers earn more income as their software is used by more subscribers, so they’re interested in knowing what you need. - **Tooling and cloud integration** Tidelift works with GitHub, GitLab, BitBucket, and more. We support every cloud platform (and other deployment targets, too). The end result? All of the capabilities you expect from commercial-grade software, for the full breadth of open source you use. That means less time grappling with esoteric open source trivia, and more time building your own applications—and your business. [Learn more](https://tidelift.com/subscription/pkg/packagist-php-di-php-di?utm_source=packagist-php-di-php-di&utm_medium=referral&utm_campaign=enterprise) | [**Request a demo**](https://tidelift.com/subscription/request-a-demo?utm_source=packagist-php-di-php-di&utm_medium=referral&utm_campaign=enterprise) The MIT License (MIT) Copyright (c) Matthieu Napoli 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. { "name": "phpstan/phpdoc-parser", "description": "PHPDoc parser with support for nullable, intersection and generic types", "license": "MIT", "require": { "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "config": { "platform": { "php": "7.4.6" }, "sort-packages": true, "allow-plugins": { "phpstan/extension-installer": true } }, "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ "src/" ] } }, "autoload-dev": { "psr-4": { "PHPStan\\PhpDocParser\\": [ "tests/PHPStan" ] } }, "minimum-stability": "dev", "prefer-stable": true }

PHPDoc Parser for PHPStan

Build Status Latest Stable Version License PHPStan Enabled

This library `phpstan/phpdoc-parser` represents PHPDocs with an AST (Abstract Syntax Tree). It supports parsing and modifying PHPDocs. For the complete list of supported PHPDoc features check out PHPStan documentation. PHPStan is the main (but not the only) user of this library. * [PHPDoc Basics](https://phpstan.org/writing-php-code/phpdocs-basics) (list of PHPDoc tags) * [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) (list of PHPDoc types) * [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/2.3.x/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc. This parser also supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.1.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). ## Installation ``` composer require phpstan/phpdoc-parser ``` ## Basic usage ```php tokenize('/** @param Lorem $a */')); $phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode $paramTags = $phpDocNode->getParamTagValues(); // ParamTagValueNode[] echo $paramTags[0]->parameterName; // '$a' echo $paramTags[0]->type; // IdentifierTypeNode - 'Lorem' ``` ### Format-preserving printer This component can be used to modify the AST and print it again as close as possible to the original. It's heavily inspired by format-preserving printer component in [nikic/PHP-Parser](https://github.com/nikic/PHP-Parser). ```php true, 'indexes' => true, 'comments' => true]); $lexer = new Lexer($config); $constExprParser = new ConstExprParser($config); $typeParser = new TypeParser($config, $constExprParser); $phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); $tokens = new TokenIterator($lexer->tokenize('/** @param Lorem $a */')); $phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode $cloningTraverser = new NodeTraverser([new CloningVisitor()]); /** @var PhpDocNode $newPhpDocNode */ [$newPhpDocNode] = $cloningTraverser->traverse([$phpDocNode]); // change something in $newPhpDocNode $newPhpDocNode->getParamTagValues()[0]->type = new IdentifierTypeNode('Ipsum'); // print changed PHPDoc $printer = new Printer(); $newPhpDoc = $printer->printFormatPreserving($newPhpDocNode, $phpDocNode, $tokens); echo $newPhpDoc; // '/** @param Ipsum $a */' ``` ## Code of Conduct This project adheres to a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code. ## Building Initially you need to run `composer install`, or `composer update` in case you aren't working in a folder which was built before. Afterwards you can either run the whole build including linting and coding standards using make or run only tests using make tests Upgrading from phpstan/phpdoc-parser 1.x to 2.0 ================================= ### PHP version requirements phpstan/phpdoc-parser now requires PHP 7.4 or newer to run. ### Changed constructors of parser classes Instead of different arrays and boolean values passed into class constructors during setup, parser classes now share a common ParserConfig object. Before: ```php use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\TypeParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; $usedAttributes = ['lines' => true, 'indexes' => true]; $lexer = new Lexer(); $constExprParser = new ConstExprParser(true, true, $usedAttributes); $typeParser = new TypeParser($constExprParser, true, $usedAttributes); $phpDocParser = new PhpDocParser($typeParser, $constExprParser, true, true, $usedAttributes); ``` After: ```php use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\PhpDocParser\ParserConfig; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\TypeParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; $config = new ParserConfig(usedAttributes: ['lines' => true, 'indexes' => true]); $lexer = new Lexer($config); $constExprParser = new ConstExprParser($config); $typeParser = new TypeParser($config, $constExprParser); $phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); ``` The point of ParserConfig is that over the course of phpstan/phpdoc-parser 2.x development series it's most likely going to gain new optional parameters akin to PHPStan's [bleeding edge](https://phpstan.org/blog/what-is-bleeding-edge). These parameters will allow opting in to new behaviour which will become the default in 3.0. With ParserConfig object, it's now going to be impossible to configure parser classes inconsistently. Which [happened to users](https://github.com/phpstan/phpdoc-parser/issues/251#issuecomment-2333927959) when they were separate boolean values. ### Support for parsing Doctrine annotations This parser now supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes representing Doctrine Annotations live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.0.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). ### Whitespace before description is required phpdoc-parser 1.x sometimes silently consumed invalid part of a PHPDoc type as description: ```php /** @return \Closure(...int, string): string */ ``` This became `IdentifierTypeNode` of `\Closure` and with `(...int, string): string` as description. (Valid callable syntax is: `\Closure(int ...$u, string): string`.) Another example: ```php /** @return array{foo: int}} */ ``` The extra `}` also became description. Both of these examples are now InvalidTagValueNode. If these parts are supposed to be PHPDoc descriptions, you need to put whitespace between the type and the description text: ```php /** @return \Closure (...int, string): string */ /** @return array{foo: int} } */ ``` ### Type aliases with invalid types are preserved In phpdoc-parser 1.x, invalid type alias syntax was represented as [`InvalidTagValueNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.InvalidTagValueNode.html), losing information about a type alias being present. ```php /** * @phpstan-type TypeAlias */ ``` This `@phpstan-type` is missing the actual type to alias. In phpdoc-parser 2.0 this is now represented as [`TypeAliasTagValueNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.TypeAliasTagValueNode.html) (instead of `InvalidTagValueNode`) with [`InvalidTypeNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.Type.InvalidTypeNode.html) in place of the type. ### Removal of QuoteAwareConstExprStringNode The class [QuoteAwareConstExprStringNode](https://phpstan.github.io/phpdoc-parser/1.23.x/PHPStan.PhpDocParser.Ast.ConstExpr.QuoteAwareConstExprStringNode.html) has been removed. Instead, [ConstExprStringNode](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.ConstExpr.ConstExprStringNode.html) gained information about the kind of quotes being used. ### Removed 2nd parameter of `ConstExprParser::parse()` (`$trimStrings`) `ConstExprStringNode::$value` now contains unescaped values without surrounding `''` or `""` quotes. Use `ConstExprStringNode::__toString()` or [`Printer`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Printer.Printer.html) to get the escaped value along with surrounding quotes. ### Text between tags always belongs to description Multi-line descriptions between tags were previously represented as separate [PhpDocTextNode](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.PhpDocTextNode.html): ```php /** * @param Foo $foo 1st multi world description * some text in the middle * @param Bar $bar 2nd multi world description */ ``` The line with `some text in the middle` in phpdoc-parser 2.0 is now part of the description of the first `@param` tag. ### `ArrayShapeNode` construction changes `ArrayShapeNode` constructor made private, added public static methods `createSealed()` and `createUnsealed()`. ### Minor BC breaks * Constructor parameter `$isEquality` in `AssertTag*ValueNode` made required * Constructor parameter `$templateTypes` in `MethodTagValueNode` made required * Constructor parameter `$isReference` in `ParamTagValueNode` made required * Constructor parameter `$isReference` in `TypelessParamTagValueNode` made required * Constructor parameter `$templateTypes` in `CallableTypeNode` made required * Constructor parameters `$expectedTokenValue` and `$currentTokenLine` in `ParserException` made required * `ArrayShapeItemNode` and `ObjectShapeItemNode` are not standalone TypeNode, just Node useLinesAttributes = $usedAttributes['lines'] ?? false; $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; $this->useCommentsAttributes = $usedAttributes['comments'] ?? false; } } '\'&\'', self::TOKEN_UNION => '\'|\'', self::TOKEN_INTERSECTION => '\'&\'', self::TOKEN_NULLABLE => '\'?\'', self::TOKEN_NEGATED => '\'!\'', self::TOKEN_OPEN_PARENTHESES => '\'(\'', self::TOKEN_CLOSE_PARENTHESES => '\')\'', self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', self::TOKEN_OPEN_CURLY_BRACKET => '\'{\'', self::TOKEN_CLOSE_CURLY_BRACKET => '\'}\'', self::TOKEN_COMMA => '\',\'', self::TOKEN_COMMENT => '\'//\'', self::TOKEN_COLON => '\':\'', self::TOKEN_VARIADIC => '\'...\'', self::TOKEN_DOUBLE_COLON => '\'::\'', self::TOKEN_DOUBLE_ARROW => '\'=>\'', self::TOKEN_ARROW => '\'->\'', self::TOKEN_EQUAL => '\'=\'', self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', self::TOKEN_DOCTRINE_TAG => 'TOKEN_DOCTRINE_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', self::TOKEN_DOCTRINE_ANNOTATION_STRING => 'TOKEN_DOCTRINE_ANNOTATION_STRING', self::TOKEN_IDENTIFIER => 'type', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'variable', self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', self::TOKEN_OTHER => 'TOKEN_OTHER', self::TOKEN_END => 'TOKEN_END', self::TOKEN_WILDCARD => '*', ]; public const VALUE_OFFSET = 0; public const TYPE_OFFSET = 1; public const LINE_OFFSET = 2; private ParserConfig $config; // @phpstan-ignore property.onlyWritten private ?string $regexp = null; public function __construct(ParserConfig $config) { $this->config = $config; } /** * @return list */ public function tokenize(string $s): array { if ($this->regexp === null) { $this->regexp = $this->generateRegexp(); } preg_match_all($this->regexp, $s, $matches, PREG_SET_ORDER); $tokens = []; $line = 1; foreach ($matches as $match) { $type = (int) $match['MARK']; $tokens[] = [$match[0], $type, $line]; if ($type !== self::TOKEN_PHPDOC_EOL) { continue; } $line++; } $tokens[] = ['', self::TOKEN_END, $line]; return $tokens; } private function generateRegexp(): string { $patterns = [ self::TOKEN_HORIZONTAL_WS => '[\\x09\\x20]++', self::TOKEN_IDENTIFIER => '(?:[\\\\]?+[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF-]*+)++', self::TOKEN_THIS_VARIABLE => '\\$this(?![0-9a-z_\\x80-\\xFF])', self::TOKEN_VARIABLE => '\\$[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF]*+', // '&' followed by TOKEN_VARIADIC, TOKEN_VARIABLE, TOKEN_EQUAL, TOKEN_EQUAL or TOKEN_CLOSE_PARENTHESES self::TOKEN_REFERENCE => '&(?=\\s*+(?:[.,=)]|(?:\\$(?!this(?![0-9a-z_\\x80-\\xFF])))))', self::TOKEN_UNION => '\\|', self::TOKEN_INTERSECTION => '&', self::TOKEN_NULLABLE => '\\?', self::TOKEN_NEGATED => '!', self::TOKEN_OPEN_PARENTHESES => '\\(', self::TOKEN_CLOSE_PARENTHESES => '\\)', self::TOKEN_OPEN_ANGLE_BRACKET => '<', self::TOKEN_CLOSE_ANGLE_BRACKET => '>', self::TOKEN_OPEN_SQUARE_BRACKET => '\\[', self::TOKEN_CLOSE_SQUARE_BRACKET => '\\]', self::TOKEN_OPEN_CURLY_BRACKET => '\\{', self::TOKEN_CLOSE_CURLY_BRACKET => '\\}', self::TOKEN_COMMA => ',', self::TOKEN_COMMENT => '\/\/[^\\r\\n]*(?=\n|\r|\*/)', self::TOKEN_VARIADIC => '\\.\\.\\.', self::TOKEN_DOUBLE_COLON => '::', self::TOKEN_DOUBLE_ARROW => '=>', self::TOKEN_ARROW => '->', self::TOKEN_EQUAL => '=', self::TOKEN_COLON => ':', self::TOKEN_OPEN_PHPDOC => '/\\*\\*(?=\\s)\\x20?+', self::TOKEN_CLOSE_PHPDOC => '\\*/', self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+', self::TOKEN_DOCTRINE_TAG => '@[a-z_\\\\][a-z0-9_\:\\\\]*[a-z_][a-z0-9_]*', self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?', self::TOKEN_FLOAT => '[+\-]?(?:(?:[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]++(_[0-9]++)*e[+\-]?[0-9]++(_[0-9]++)*))', self::TOKEN_INTEGER => '[+\-]?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))', self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'', self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"', self::TOKEN_DOCTRINE_ANNOTATION_STRING => '"(?:""|[^"])*+"', self::TOKEN_WILDCARD => '\\*', // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL self::TOKEN_OTHER => '(?:(?!\\*/)[^\\s])++', ]; foreach ($patterns as $type => &$pattern) { $pattern = '(?:' . $pattern . ')(*MARK:' . $type . ')'; } return '~' . implode('|', $patterns) . '~Asi'; } } */ private array $attributes = []; /** * @param mixed $value */ public function setAttribute(string $key, $value): void { if ($value === null) { unset($this->attributes[$key]); return; } $this->attributes[$key] = $value; } public function hasAttribute(string $key): bool { return array_key_exists($key, $this->attributes); } /** * @return mixed */ public function getAttribute(string $key) { if ($this->hasAttribute($key)) { return $this->attributes[$key]; } return null; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } annotation = $annotation; $this->description = $description; } public function __toString(): string { return trim("{$this->annotation} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['annotation'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } */ public array $items; /** * @param list $items */ public function __construct(array $items) { $this->items = $items; } public function __toString(): string { $items = implode(', ', $this->items); return '{' . $items . '}'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['items']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } key = $key; $this->value = $value; } public function __toString(): string { if ($this->key === null) { return (string) $this->value; } return $this->key . '=' . $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['key'], $properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } key = $key; $this->value = $value; } public function __toString(): string { if ($this->key === null) { return (string) $this->value; } return $this->key . '=' . $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['key'], $properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } */ public array $arguments; /** * @param list $arguments */ public function __construct(string $name, array $arguments) { $this->name = $name; $this->arguments = $arguments; } public function __toString(): string { $arguments = implode(', ', $this->arguments); return $this->name . '(' . $arguments . ')'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['name'], $properties['arguments']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->parameter = $parameter; $this->isNegated = $isNegated; $this->isEquality = $isEquality; $this->description = $description; } public function __toString(): string { $isNegated = $this->isNegated ? '!' : ''; $isEquality = $this->isEquality ? '=' : ''; return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['parameter'], $properties['isNegated'], $properties['description'], $properties['isEquality']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } name = $name; $this->value = $value; } public function __toString(): string { if ($this->value instanceof DoctrineTagValueNode) { return (string) $this->value; } return trim("{$this->name} {$this->value}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['name'], $properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->description = $description; } public function __toString(): string { $reference = $this->isReference ? '&' : ''; $variadic = $this->isVariadic ? '...' : ''; return trim("{$this->type} {$reference}{$variadic}{$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['isVariadic'], $properties['parameterName'], $properties['description'], $properties['isReference']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->variableName = $variableName; $this->description = $description; } public function __toString(): string { return trim("$this->type " . trim("{$this->variableName} {$this->description}")); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['variableName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } value = $value; $this->exceptionArgs = [ $exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine(), ]; } public function __get(string $name): ?ParserException { if ($name !== 'exception') { trigger_error(sprintf('Undefined property: %s::$%s', self::class, $name), E_USER_WARNING); return null; } return new ParserException(...$this->exceptionArgs); } public function __toString(): string { return $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $exception = new ParserException(...$properties['exceptionArgs']); $instance = new self($properties['value'], $exception); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim($this->type . ' ' . $this->description); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->parameterName = $parameterName; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['parameterName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } description = $description; } public function __toString(): string { return trim($this->description); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } isStatic = $isStatic; $this->returnType = $returnType; $this->methodName = $methodName; $this->parameters = $parameters; $this->description = $description; $this->templateTypes = $templateTypes; } public function __toString(): string { $static = $this->isStatic ? 'static ' : ''; $returnType = $this->returnType !== null ? "{$this->returnType} " : ''; $parameters = implode(', ', $this->parameters); $description = $this->description !== '' ? " {$this->description}" : ''; $templateTypes = count($this->templateTypes) > 0 ? '<' . implode(', ', $this->templateTypes) . '>' : ''; return "{$static}{$returnType}{$this->methodName}{$templateTypes}({$parameters}){$description}"; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['isStatic'], $properties['returnType'], $properties['methodName'], $properties['parameters'], $properties['description'], $properties['templateTypes']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } value = $value; } public function __toString(): string { return $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->description = $description; } public function __toString(): string { $reference = $this->isReference ? '&' : ''; $variadic = $this->isVariadic ? '...' : ''; return trim("{$reference}{$variadic}{$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['isVariadic'], $properties['parameterName'], $properties['description'], $properties['isReference']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } name = $name; $this->bound = $bound; $this->lowerBound = $lowerBound; $this->default = $default; $this->description = $description; } public function __toString(): string { $upperBound = $this->bound !== null ? " of {$this->bound}" : ''; $lowerBound = $this->lowerBound !== null ? " super {$this->lowerBound}" : ''; $default = $this->default !== null ? " = {$this->default}" : ''; return trim("{$this->name}{$upperBound}{$lowerBound}{$default} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['name'], $properties['bound'], $properties['description'], $properties['default'] ?? null, $properties['lowerBound'] ?? null); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } importedAlias = $importedAlias; $this->importedFrom = $importedFrom; $this->importedAs = $importedAs; } public function __toString(): string { return trim( "{$this->importedAlias} from {$this->importedFrom}" . ($this->importedAs !== null ? " as {$this->importedAs}" : ''), ); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['importedAlias'], $properties['importedFrom'], $properties['importedAs']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } text = $text; } public function __toString(): string { return $this->text; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['text']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->parameter = $parameter; $this->property = $property; $this->isNegated = $isNegated; $this->isEquality = $isEquality; $this->description = $description; } public function __toString(): string { $isNegated = $this->isNegated ? '!' : ''; $isEquality = $this->isEquality ? '=' : ''; return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->property} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['parameter'], $properties['property'], $properties['isNegated'], $properties['description'], $properties['isEquality']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } parameterName = $parameterName; $this->description = $description; } public function __toString(): string { return trim("{$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['parameterName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } parameterName = $parameterName; $this->description = $description; } public function __toString(): string { return trim("{$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['parameterName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } parameterName = $parameterName; $this->description = $description; } public function __toString(): string { return trim("{$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['parameterName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } children = $children; } /** * @return PhpDocTagNode[] */ public function getTags(): array { return array_filter($this->children, static fn (PhpDocChildNode $child): bool => $child instanceof PhpDocTagNode); } /** * @return PhpDocTagNode[] */ public function getTagsByName(string $tagName): array { return array_filter($this->getTags(), static fn (PhpDocTagNode $tag): bool => $tag->name === $tagName); } /** * @return VarTagValueNode[] */ public function getVarTagValues(string $tagName = '@var'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof VarTagValueNode, ); } /** * @return ParamTagValueNode[] */ public function getParamTagValues(string $tagName = '@param'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ParamTagValueNode, ); } /** * @return TypelessParamTagValueNode[] */ public function getTypelessParamTagValues(string $tagName = '@param'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof TypelessParamTagValueNode, ); } /** * @return ParamImmediatelyInvokedCallableTagValueNode[] */ public function getParamImmediatelyInvokedCallableTagValues(string $tagName = '@param-immediately-invoked-callable'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ParamImmediatelyInvokedCallableTagValueNode, ); } /** * @return ParamLaterInvokedCallableTagValueNode[] */ public function getParamLaterInvokedCallableTagValues(string $tagName = '@param-later-invoked-callable'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ParamLaterInvokedCallableTagValueNode, ); } /** * @return ParamClosureThisTagValueNode[] */ public function getParamClosureThisTagValues(string $tagName = '@param-closure-this'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ParamClosureThisTagValueNode, ); } /** * @return PureUnlessCallableIsImpureTagValueNode[] */ public function getPureUnlessCallableIsImpureTagValues(string $tagName = '@pure-unless-callable-is-impure'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof PureUnlessCallableIsImpureTagValueNode, ); } /** * @return TemplateTagValueNode[] */ public function getTemplateTagValues(string $tagName = '@template'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof TemplateTagValueNode, ); } /** * @return ExtendsTagValueNode[] */ public function getExtendsTagValues(string $tagName = '@extends'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ExtendsTagValueNode, ); } /** * @return ImplementsTagValueNode[] */ public function getImplementsTagValues(string $tagName = '@implements'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ImplementsTagValueNode, ); } /** * @return UsesTagValueNode[] */ public function getUsesTagValues(string $tagName = '@use'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof UsesTagValueNode, ); } /** * @return ReturnTagValueNode[] */ public function getReturnTagValues(string $tagName = '@return'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ReturnTagValueNode, ); } /** * @return ThrowsTagValueNode[] */ public function getThrowsTagValues(string $tagName = '@throws'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ThrowsTagValueNode, ); } /** * @return MixinTagValueNode[] */ public function getMixinTagValues(string $tagName = '@mixin'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof MixinTagValueNode, ); } /** * @return RequireExtendsTagValueNode[] */ public function getRequireExtendsTagValues(string $tagName = '@phpstan-require-extends'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof RequireExtendsTagValueNode, ); } /** * @return RequireImplementsTagValueNode[] */ public function getRequireImplementsTagValues(string $tagName = '@phpstan-require-implements'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof RequireImplementsTagValueNode, ); } /** * @return SealedTagValueNode[] */ public function getSealedTagValues(string $tagName = '@phpstan-sealed'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof SealedTagValueNode, ); } /** * @return DeprecatedTagValueNode[] */ public function getDeprecatedTagValues(): array { return array_filter( array_column($this->getTagsByName('@deprecated'), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof DeprecatedTagValueNode, ); } /** * @return PropertyTagValueNode[] */ public function getPropertyTagValues(string $tagName = '@property'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof PropertyTagValueNode, ); } /** * @return PropertyTagValueNode[] */ public function getPropertyReadTagValues(string $tagName = '@property-read'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof PropertyTagValueNode, ); } /** * @return PropertyTagValueNode[] */ public function getPropertyWriteTagValues(string $tagName = '@property-write'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof PropertyTagValueNode, ); } /** * @return MethodTagValueNode[] */ public function getMethodTagValues(string $tagName = '@method'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof MethodTagValueNode, ); } /** * @return TypeAliasTagValueNode[] */ public function getTypeAliasTagValues(string $tagName = '@phpstan-type'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof TypeAliasTagValueNode, ); } /** * @return TypeAliasImportTagValueNode[] */ public function getTypeAliasImportTagValues(string $tagName = '@phpstan-import-type'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof TypeAliasImportTagValueNode, ); } /** * @return AssertTagValueNode[] */ public function getAssertTagValues(string $tagName = '@phpstan-assert'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof AssertTagValueNode, ); } /** * @return AssertTagPropertyValueNode[] */ public function getAssertPropertyTagValues(string $tagName = '@phpstan-assert'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof AssertTagPropertyValueNode, ); } /** * @return AssertTagMethodValueNode[] */ public function getAssertMethodTagValues(string $tagName = '@phpstan-assert'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof AssertTagMethodValueNode, ); } /** * @return SelfOutTagValueNode[] */ public function getSelfOutTypeTagValues(string $tagName = '@phpstan-this-out'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof SelfOutTagValueNode, ); } /** * @return ParamOutTagValueNode[] */ public function getParamOutTypeTagValues(string $tagName = '@param-out'): array { return array_filter( array_column($this->getTagsByName($tagName), 'value'), static fn (PhpDocTagValueNode $value): bool => $value instanceof ParamOutTagValueNode, ); } public function __toString(): string { $children = array_map( static function (PhpDocChildNode $child): string { $s = (string) $child; return $s === '' ? '' : ' ' . $s; }, $this->children, ); return "/**\n *" . implode("\n *", $children) . "\n */"; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['children']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->parameterName = $parameterName; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->parameterName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['parameterName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->parameter = $parameter; $this->method = $method; $this->isNegated = $isNegated; $this->isEquality = $isEquality; $this->description = $description; } public function __toString(): string { $isNegated = $this->isNegated ? '!' : ''; $isEquality = $this->isEquality ? '=' : ''; return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->method}() {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['parameter'], $properties['method'], $properties['isNegated'], $properties['description'], $properties['isEquality']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->defaultValue = $defaultValue; } public function __toString(): string { $type = $this->type !== null ? "{$this->type} " : ''; $isReference = $this->isReference ? '&' : ''; $isVariadic = $this->isVariadic ? '...' : ''; $default = $this->defaultValue !== null ? " = {$this->defaultValue}" : ''; return "{$type}{$isReference}{$isVariadic}{$this->parameterName}{$default}"; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['isReference'], $properties['isVariadic'], $properties['parameterName'], $properties['defaultValue']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->propertyName = $propertyName; $this->description = $description; } public function __toString(): string { return trim("{$this->type} {$this->propertyName} {$this->description}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['propertyName'], $properties['description']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } alias = $alias; $this->type = $type; } public function __toString(): string { return trim("{$this->alias} {$this->type}"); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['alias'], $properties['type']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } value = $value; } public function __toString(): string { return self::escape($this->value); } public static function unescape(string $value): string { // from https://github.com/doctrine/annotations/blob/a9ec7af212302a75d1f92fa65d3abfbd16245a2a/lib/Doctrine/Common/Annotations/DocLexer.php#L103-L107 return str_replace('""', '"', substr($value, 1, strlen($value) - 2)); } private static function escape(string $value): string { // from https://github.com/phpstan/phpdoc-parser/issues/205#issuecomment-1662323656 return sprintf('"%s"', str_replace('"', '""', $value)); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } value = $value; } public function __toString(): string { return $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } $properties */ public static function __set_state(array $properties): self { $instance = new self(); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } items = $items; } public function __toString(): string { return '[' . implode(', ', $this->items) . ']'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['items']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } value = $value; $this->quoteType = $quoteType; } public function __toString(): string { if ($this->quoteType === self::SINGLE_QUOTED) { // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 return sprintf("'%s'", addcslashes($this->value, '\'\\')); } // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 return sprintf('"%s"', $this->escapeDoubleQuotedString()); } private function escapeDoubleQuotedString(): string { $quote = '"'; $escaped = addcslashes($this->value, "\n\r\t\f\v$" . $quote . '\\'); // Escape control characters and non-UTF-8 characters. // Regex based on https://stackoverflow.com/a/11709412/385378. $regex = '/( [\x00-\x08\x0E-\x1F] # Control characters | [\xC0-\xC1] # Invalid UTF-8 Bytes | [\xF5-\xFF] # Invalid UTF-8 Bytes | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle | (? $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['value'], $properties['quoteType']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } className = $className; $this->name = $name; } public function __toString(): string { if ($this->className === '') { return $this->name; } return "{$this->className}::{$this->name}"; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['className'], $properties['name']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } value = $value; } public function __toString(): string { return $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } key = $key; $this->value = $value; } public function __toString(): string { if ($this->key !== null) { return sprintf('%s => %s', $this->key, $this->value); } return (string) $this->value; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['key'], $properties['value']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } $properties */ public static function __set_state(array $properties): self { $instance = new self(); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } $properties */ public static function __set_state(array $properties): self { $instance = new self(); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } text = $text; $this->startLine = $startLine; $this->startIndex = $startIndex; } public function getReformattedText(): string { return trim($this->text); } /** * @param array $properties */ public static function __set_state(array $properties): self { return new self($properties['text'], $properties['startLine'], $properties['startIndex']); } } setAttribute(Attribute::ORIGINAL_NODE, $originalNode); return $node; } } Visitors */ private array $visitors = []; /** @var bool Whether traversal should be stopped */ private bool $stopTraversal; /** * @param list $visitors */ public function __construct(array $visitors) { $this->visitors = $visitors; } /** * Traverses an array of nodes using the registered visitors. * * @param Node[] $nodes Array of nodes * * @return Node[] Traversed array of nodes */ public function traverse(array $nodes): array { $this->stopTraversal = false; foreach ($this->visitors as $visitor) { $return = $visitor->beforeTraverse($nodes); if ($return === null) { continue; } $nodes = $return; } $nodes = $this->traverseArray($nodes); foreach ($this->visitors as $visitor) { $return = $visitor->afterTraverse($nodes); if ($return === null) { continue; } $nodes = $return; } return $nodes; } /** * Recursively traverse a node. * * @param Node $node Node to traverse. * * @return Node Result of traversal (may be original node or new one) */ private function traverseNode(Node $node): Node { $subNodeNames = array_keys(get_object_vars($node)); foreach ($subNodeNames as $name) { $subNode =& $node->$name; if (is_array($subNode)) { $subNode = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } } elseif ($subNode instanceof Node) { $traverseChildren = true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if ($return === null) { continue; } if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { $traverseChildren = false; } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { $traverseChildren = false; $breakVisitorIndex = $visitorIndex; break; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = true; break 2; } else { throw new LogicException( 'enterNode() returned invalid value of type ' . gettype($return), ); } } if ($traverseChildren) { $subNode = $this->traverseNode($subNode); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($subNode); if ($return !== null) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = true; break 2; } elseif (is_array($return)) { throw new LogicException( 'leaveNode() may only return an array ' . 'if the parent structure is an array', ); } else { throw new LogicException( 'leaveNode() returned invalid value of type ' . gettype($return), ); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } } return $node; } /** * Recursively traverse array (usually of nodes). * * @param mixed[] $nodes Array to traverse * * @return mixed[] Result of traversal (may be original array or changed one) */ private function traverseArray(array $nodes): array { $doNodes = []; foreach ($nodes as $i => &$node) { if ($node instanceof Node) { $traverseChildren = true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if ($return === null) { continue; } if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (is_array($return)) { $doNodes[] = [$i, $return]; continue 2; } elseif ($return === self::REMOVE_NODE) { $doNodes[] = [$i, []]; continue 2; } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { $traverseChildren = false; } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { $traverseChildren = false; $breakVisitorIndex = $visitorIndex; break; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = true; break 2; } else { throw new LogicException( 'enterNode() returned invalid value of type ' . gettype($return), ); } } if ($traverseChildren) { $node = $this->traverseNode($node); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($node); if ($return !== null) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (is_array($return)) { $doNodes[] = [$i, $return]; break; } elseif ($return === self::REMOVE_NODE) { $doNodes[] = [$i, []]; break; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = true; break 2; } else { throw new LogicException( 'leaveNode() returned invalid value of type ' . gettype($return), ); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } elseif (is_array($node)) { throw new LogicException('Invalid node structure: Contains nested arrays'); } } if (count($doNodes) > 0) { while ([$i, $replace] = array_pop($doNodes)) { array_splice($nodes, $i, 1, $replace); } } return $nodes; } private function ensureReplacementReasonable(Node $old, Node $new): void { if ($old instanceof TypeNode && !$new instanceof TypeNode) { throw new LogicException(sprintf('Trying to replace TypeNode with %s', get_class($new))); } if ($old instanceof ConstExprNode && !$new instanceof ConstExprNode) { throw new LogicException(sprintf('Trying to replace ConstExprNode with %s', get_class($new))); } if ($old instanceof PhpDocChildNode && !$new instanceof PhpDocChildNode) { throw new LogicException(sprintf('Trying to replace PhpDocChildNode with %s', get_class($new))); } if ($old instanceof PhpDocTagValueNode && !$new instanceof PhpDocTagValueNode) { throw new LogicException(sprintf('Trying to replace PhpDocTagValueNode with %s', get_class($new))); } } } $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * NodeTraverser::REMOVE_NODE * => $node is removed from the parent array * * NodeTraverser::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is * * NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN * => Further visitors for the current node are skipped, and its children are not * traversed. $node stays as-is. * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return Node|Node[]|NodeTraverser::*|null Replacement node (or special return value) */ public function enterNode(Node $node); /** * Called when leaving a node. * * Return value semantics: * * null * => $node stays as-is * * NodeTraverser::REMOVE_NODE * => $node is removed from the parent array * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return Node|Node[]|NodeTraverser::REMOVE_NODE|NodeTraverser::STOP_TRAVERSAL|null Replacement node (or special return value) */ public function leaveNode(Node $node); /** * Called once after traversal. * * Return value semantics: * * null: $nodes stays as-is * * otherwise: $nodes is set to the return value * * @param Node[] $nodes Array of nodes * * @return Node[]|null Array of nodes */ public function afterTraverse(array $nodes): ?array; } $properties */ public static function __set_state(array $properties): self { $instance = new self(); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } parameterName = $parameterName; $this->targetType = $targetType; $this->if = $if; $this->else = $else; $this->negated = $negated; } public function __toString(): string { return sprintf( '(%s %s %s ? %s : %s)', $this->parameterName, $this->negated ? 'is not' : 'is', $this->targetType, $this->if, $this->else, ); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['parameterName'], $properties['targetType'], $properties['if'], $properties['else'], $properties['negated']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } subjectType = $subjectType; $this->targetType = $targetType; $this->if = $if; $this->else = $else; $this->negated = $negated; } public function __toString(): string { return sprintf( '(%s %s %s ? %s : %s)', $this->subjectType, $this->negated ? 'is not' : 'is', $this->targetType, $this->if, $this->else, ); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['subjectType'], $properties['targetType'], $properties['if'], $properties['else'], $properties['negated']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->genericTypes = $genericTypes; $this->variances = $variances; } public function __toString(): string { $genericTypes = []; foreach ($this->genericTypes as $index => $type) { $variance = $this->variances[$index] ?? self::VARIANCE_INVARIANT; if ($variance === self::VARIANCE_INVARIANT) { $genericTypes[] = (string) $type; } elseif ($variance === self::VARIANCE_BIVARIANT) { $genericTypes[] = '*'; } else { $genericTypes[] = sprintf('%s %s', $variance, $type); } } return $this->type . '<' . implode(', ', $genericTypes) . '>'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['genericTypes'], $properties['variances'] ?? []); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; } public function __toString(): string { return '?' . $this->type; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } constExpr = $constExpr; } public function __toString(): string { return $this->constExpr->__toString(); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['constExpr']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; } public function __toString(): string { if ( $this->type instanceof CallableTypeNode || $this->type instanceof ConstTypeNode || $this->type instanceof NullableTypeNode ) { return '(' . $this->type . ')[]'; } return $this->type . '[]'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->isOptional = $isOptional; } public function __toString(): string { $type = "{$this->type} "; $isReference = $this->isReference ? '&' : ''; $isVariadic = $this->isVariadic ? '...' : ''; $isOptional = $this->isOptional ? '=' : ''; return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $isOptional; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['isReference'], $properties['isVariadic'], $properties['parameterName'], $properties['isOptional']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } exceptionArgs = [ $exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine(), ]; } public function getException(): ParserException { return new ParserException(...$this->exceptionArgs); } public function __toString(): string { return '*Invalid type*'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $exception = new ParserException(...$properties['exceptionArgs']); $instance = new self($exception); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } types = $types; } public function __toString(): string { return '(' . implode(' & ', array_map(static function (TypeNode $type): string { if ($type instanceof NullableTypeNode) { return '(' . $type . ')'; } return (string) $type; }, $this->types)) . ')'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['types']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } name = $name; } public function __toString(): string { return $this->name; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['name']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } keyName = $keyName; $this->optional = $optional; $this->valueType = $valueType; } public function __toString(): string { if ($this->keyName !== null) { return sprintf( '%s%s: %s', (string) $this->keyName, $this->optional ? '?' : '', (string) $this->valueType, ); } return (string) $this->valueType; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['keyName'], $properties['optional'], $properties['valueType']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } type = $type; $this->offset = $offset; } public function __toString(): string { if ( $this->type instanceof CallableTypeNode || $this->type instanceof NullableTypeNode ) { return '(' . $this->type . ')[' . $this->offset . ']'; } return $this->type . '[' . $this->offset . ']'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['type'], $properties['offset']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } items = $items; $this->sealed = $sealed; $this->unsealedType = $unsealedType; $this->kind = $kind; } /** * @param ArrayShapeItemNode[] $items * @param self::KIND_* $kind */ public static function createSealed(array $items, string $kind = self::KIND_ARRAY): self { return new self($items, true, null, $kind); } /** * @param ArrayShapeItemNode[] $items * @param self::KIND_* $kind */ public static function createUnsealed(array $items, ?ArrayShapeUnsealedTypeNode $unsealedType, string $kind = self::KIND_ARRAY): self { return new self($items, false, $unsealedType, $kind); } public function __toString(): string { $items = $this->items; if (! $this->sealed) { $items[] = '...' . $this->unsealedType; } return $this->kind . '{' . implode(', ', $items) . '}'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['items'], $properties['sealed'], $properties['unsealedType'], $properties['kind']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } types = $types; } public function __toString(): string { return '(' . implode(' | ', array_map(static function (TypeNode $type): string { if ($type instanceof NullableTypeNode) { return '(' . $type . ')'; } return (string) $type; }, $this->types)) . ')'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['types']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } identifier = $identifier; $this->parameters = $parameters; $this->returnType = $returnType; $this->templateTypes = $templateTypes; } public function __toString(): string { $returnType = $this->returnType; if ($returnType instanceof self) { $returnType = "({$returnType})"; } $template = $this->templateTypes !== [] ? '<' . implode(', ', $this->templateTypes) . '>' : ''; $parameters = implode(', ', $this->parameters); return "{$this->identifier}{$template}({$parameters}): {$returnType}"; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['identifier'], $properties['parameters'], $properties['returnType'], $properties['templateTypes']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } keyName = $keyName; $this->optional = $optional; $this->valueType = $valueType; } public function __toString(): string { if ($this->keyName !== null) { return sprintf( '%s%s: %s', (string) $this->keyName, $this->optional ? '?' : '', (string) $this->valueType, ); } return (string) $this->valueType; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['keyName'], $properties['optional'], $properties['valueType']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } valueType = $valueType; $this->keyType = $keyType; } public function __toString(): string { if ($this->keyType !== null) { return sprintf('<%s, %s>', $this->keyType, $this->valueType); } return sprintf('<%s>', $this->valueType); } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['valueType'], $properties['keyType']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } items = $items; } public function __toString(): string { $items = $this->items; return 'object{' . implode(', ', $items) . '}'; } /** * @param array $properties */ public static function __set_state(array $properties): self { $instance = new self($properties['items']); if (isset($properties['attributes'])) { foreach ($properties['attributes'] as $key => $value) { $instance->setAttribute($key, $value); } } return $instance; } } config = $config; $this->parseDoctrineStrings = false; } /** * @internal */ public function toDoctrine(): self { $self = new self($this->config); $self->parseDoctrineStrings = true; return $self; } public function parse(TokenIterator $tokens): Ast\ConstExpr\ConstExprNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_FLOAT)) { $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprFloatNode(str_replace('_', '', $value)), $startLine, $startIndex, ); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $value)), $startLine, $startIndex, ); } if ($this->parseDoctrineStrings && $tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($value)), $startLine, $startIndex, ); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { if ($this->parseDoctrineStrings) { if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { throw new ParserException( $tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_DOUBLE_QUOTED_STRING, null, $tokens->currentTokenLine(), ); } $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes( $tokens, $this->parseDoctrineString($value, $tokens), $startLine, $startIndex, ); } $value = StringUnescaper::unescapeString($tokens->currentTokenValue()); $type = $tokens->currentTokenType(); $tokens->next(); return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprStringNode( $value, $type === Lexer::TOKEN_SINGLE_QUOTED_STRING ? Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED : Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED, ), $startLine, $startIndex, ); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $identifier = $tokens->currentTokenValue(); $tokens->next(); switch (strtolower($identifier)) { case 'true': return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprTrueNode(), $startLine, $startIndex, ); case 'false': return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprFalseNode(), $startLine, $startIndex, ); case 'null': return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprNullNode(), $startLine, $startIndex, ); case 'array': $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $classConstantName = ''; $lastType = null; while (true) { if ($lastType !== Lexer::TOKEN_IDENTIFIER && $tokens->currentTokenType() === Lexer::TOKEN_IDENTIFIER) { $classConstantName .= $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $lastType = Lexer::TOKEN_IDENTIFIER; continue; } if ($lastType !== Lexer::TOKEN_WILDCARD && $tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { $classConstantName .= '*'; $lastType = Lexer::TOKEN_WILDCARD; if ($tokens->getSkippedHorizontalWhiteSpaceIfAny() !== '') { break; } continue; } if ($lastType === null) { // trigger parse error if nothing valid was consumed $tokens->consumeTokenType(Lexer::TOKEN_WILDCARD); } break; } return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName), $startLine, $startIndex, ); } return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstFetchNode('', $identifier), $startLine, $startIndex, ); } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET, $startIndex); } throw new ParserException( $tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine(), ); } private function parseArray(TokenIterator $tokens, int $endToken, int $startIndex): Ast\ConstExpr\ConstExprArrayNode { $items = []; $startLine = $tokens->currentTokenLine(); if (!$tokens->tryConsumeTokenType($endToken)) { do { $items[] = $this->parseArrayItem($tokens); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA) && !$tokens->isCurrentTokenType($endToken)); $tokens->consumeTokenType($endToken); } return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprArrayNode($items), $startLine, $startIndex, ); } /** * This method is supposed to be called with TokenIterator after reading TOKEN_DOUBLE_QUOTED_STRING and shifting * to the next token. */ public function parseDoctrineString(string $text, TokenIterator $tokens): Ast\ConstExpr\DoctrineConstExprStringNode { // Because of how Lexer works, a valid Doctrine string // can consist of a sequence of TOKEN_DOUBLE_QUOTED_STRING and TOKEN_DOCTRINE_ANNOTATION_STRING while ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING, Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { $text .= $tokens->currentTokenValue(); $tokens->next(); } return new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($text)); } private function parseArrayItem(TokenIterator $tokens): Ast\ConstExpr\ConstExprArrayItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $expr = $this->parse($tokens); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_ARROW)) { $key = $expr; $value = $this->parse($tokens); } else { $key = null; $value = $expr; } return $this->enrichWithAttributes( $tokens, new Ast\ConstExpr\ConstExprArrayItemNode($key, $value), $startLine, $startIndex, ); } /** * @template T of Ast\ConstExpr\ConstExprNode * @param T $node * @return T */ private function enrichWithAttributes(TokenIterator $tokens, Ast\ConstExpr\ConstExprNode $node, int $startLine, int $startIndex): Ast\ConstExpr\ConstExprNode { if ($this->config->useLinesAttributes) { $node->setAttribute(Ast\Attribute::START_LINE, $startLine); $node->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } if ($this->config->useIndexAttributes) { $node->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $node->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } return $node; } } '\\', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1B", ]; public static function unescapeString(string $string): string { $quote = $string[0]; if ($quote === '\'') { return str_replace( ['\\\\', '\\\''], ['\\', '\''], substr($string, 1, -1), ); } return self::parseEscapeSequences(substr($string, 1, -1), '"'); } /** * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L90-L130 */ private static function parseEscapeSequences(string $str, string $quote): string { $str = str_replace('\\' . $quote, $quote, $str); return preg_replace_callback( '~\\\\([\\\\nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\{([0-9a-fA-F]+)\})~', static function ($matches) { $str = $matches[1]; if (isset(self::REPLACEMENTS[$str])) { return self::REPLACEMENTS[$str]; } if ($str[0] === 'x' || $str[0] === 'X') { return chr((int) hexdec(substr($str, 1))); } if ($str[0] === 'u') { if (!isset($matches[2])) { throw new ShouldNotHappenException(); } return self::codePointToUtf8((int) hexdec($matches[2])); } return chr((int) octdec($str)); }, $str, ); } /** * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L132-L154 */ private static function codePointToUtf8(int $num): string { if ($num <= 0x7F) { return chr($num); } if ($num <= 0x7FF) { return chr(($num >> 6) + 0xC0) . chr(($num & 0x3F) + 0x80); } if ($num <= 0xFFFF) { return chr(($num >> 12) + 0xE0) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); } if ($num <= 0x1FFFFF) { return chr(($num >> 18) + 0xF0) . chr((($num >> 12) & 0x3F) + 0x80) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); } // Invalid UTF-8 codepoint escape sequence: Codepoint too large return "\xef\xbf\xbd"; } } */ private array $tokens; private int $index; /** @var list */ private array $comments = []; /** @var list}> */ private array $savePoints = []; /** @var list */ private array $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; private ?string $newline = null; /** * @param list $tokens */ public function __construct(array $tokens, int $index = 0) { $this->tokens = $tokens; $this->index = $index; $this->skipIrrelevantTokens(); } /** * @return list */ public function getTokens(): array { return $this->tokens; } public function getContentBetween(int $startPos, int $endPos): string { if ($startPos < 0 || $endPos > count($this->tokens)) { throw new LogicException(); } $content = ''; for ($i = $startPos; $i < $endPos; $i++) { $content .= $this->tokens[$i][Lexer::VALUE_OFFSET]; } return $content; } public function getTokenCount(): int { return count($this->tokens); } public function currentTokenValue(): string { return $this->tokens[$this->index][Lexer::VALUE_OFFSET]; } public function currentTokenType(): int { return $this->tokens[$this->index][Lexer::TYPE_OFFSET]; } public function currentTokenOffset(): int { $offset = 0; for ($i = 0; $i < $this->index; $i++) { $offset += strlen($this->tokens[$i][Lexer::VALUE_OFFSET]); } return $offset; } public function currentTokenLine(): int { return $this->tokens[$this->index][Lexer::LINE_OFFSET]; } public function currentTokenIndex(): int { return $this->index; } public function endIndexOfLastRelevantToken(): int { $endIndex = $this->currentTokenIndex(); $endIndex--; while (in_array($this->tokens[$endIndex][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, true)) { if (!isset($this->tokens[$endIndex - 1])) { break; } $endIndex--; } return $endIndex; } public function isCurrentTokenValue(string $tokenValue): bool { return $this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue; } public function isCurrentTokenType(int ...$tokenType): bool { return in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, true); } public function isPrecededByHorizontalWhitespace(): bool { return ($this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] ?? -1) === Lexer::TOKEN_HORIZONTAL_WS; } /** * @throws ParserException */ public function consumeTokenType(int $tokenType): void { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { $this->throwError($tokenType); } if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { if ($this->newline === null) { $this->detectNewline(); } } $this->next(); } /** * @throws ParserException */ public function consumeTokenValue(int $tokenType, string $tokenValue): void { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { $this->throwError($tokenType, $tokenValue); } $this->next(); } /** @phpstan-impure */ public function tryConsumeTokenValue(string $tokenValue): bool { if ($this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { return false; } $this->next(); return true; } /** * @return list */ public function flushComments(): array { $res = $this->comments; $this->comments = []; return $res; } /** @phpstan-impure */ public function tryConsumeTokenType(int $tokenType): bool { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { return false; } if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { if ($this->newline === null) { $this->detectNewline(); } } $this->next(); return true; } /** * @deprecated Use skipNewLineTokensAndConsumeComments instead (when parsing a type) */ public function skipNewLineTokens(): void { if (!$this->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { return; } do { $foundNewLine = $this->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); } while ($foundNewLine === true); } public function skipNewLineTokensAndConsumeComments(): void { if ($this->currentTokenType() === Lexer::TOKEN_COMMENT) { $this->comments[] = new Comment($this->currentTokenValue(), $this->currentTokenLine(), $this->currentTokenIndex()); $this->next(); } if (!$this->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { return; } do { $foundNewLine = $this->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); if ($this->currentTokenType() !== Lexer::TOKEN_COMMENT) { continue; } $this->comments[] = new Comment($this->currentTokenValue(), $this->currentTokenLine(), $this->currentTokenIndex()); $this->next(); } while ($foundNewLine === true); } private function detectNewline(): void { $value = $this->currentTokenValue(); if (substr($value, 0, 2) === "\r\n") { $this->newline = "\r\n"; } elseif (substr($value, 0, 1) === "\n") { $this->newline = "\n"; } } public function getSkippedHorizontalWhiteSpaceIfAny(): string { if ($this->index > 0 && $this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { return $this->tokens[$this->index - 1][Lexer::VALUE_OFFSET]; } return ''; } /** @phpstan-impure */ public function joinUntil(int ...$tokenType): string { $s = ''; while (!in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, true)) { $s .= $this->tokens[$this->index++][Lexer::VALUE_OFFSET]; } return $s; } public function next(): void { $this->index++; $this->skipIrrelevantTokens(); } private function skipIrrelevantTokens(): void { if (!isset($this->tokens[$this->index])) { return; } while (in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, true)) { if (!isset($this->tokens[$this->index + 1])) { break; } $this->index++; } } public function addEndOfLineToSkippedTokens(): void { $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL]; } public function removeEndOfLineFromSkippedTokens(): void { $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; } /** @phpstan-impure */ public function forwardToTheEnd(): void { $lastToken = count($this->tokens) - 1; $this->index = $lastToken; } public function pushSavePoint(): void { $this->savePoints[] = [$this->index, $this->comments]; } public function dropSavePoint(): void { array_pop($this->savePoints); } public function rollback(): void { $savepoint = array_pop($this->savePoints); assert($savepoint !== null); [$this->index, $this->comments] = $savepoint; } /** * @throws ParserException */ private function throwError(int $expectedTokenType, ?string $expectedTokenValue = null): void { throw new ParserException( $this->currentTokenValue(), $this->currentTokenType(), $this->currentTokenOffset(), $expectedTokenType, $expectedTokenValue, $this->currentTokenLine(), ); } /** * Check whether the position is directly preceded by a certain token type. * * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped */ public function hasTokenImmediatelyBefore(int $pos, int $expectedTokenType): bool { $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { $token = $tokens[$pos]; $type = $token[Lexer::TYPE_OFFSET]; if ($type === $expectedTokenType) { return true; } if (!in_array($type, [ Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL, ], true)) { break; } } return false; } /** * Check whether the position is directly followed by a certain token type. * * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped */ public function hasTokenImmediatelyAfter(int $pos, int $expectedTokenType): bool { $tokens = $this->tokens; $pos++; for ($c = count($tokens); $pos < $c; $pos++) { $token = $tokens[$pos]; $type = $token[Lexer::TYPE_OFFSET]; if ($type === $expectedTokenType) { return true; } if (!in_array($type, [ Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL, ], true)) { break; } } return false; } public function getDetectedNewline(): ?string { return $this->newline; } /** * Whether the given position is immediately surrounded by parenthesis. */ public function hasParentheses(int $startPos, int $endPos): bool { return $this->hasTokenImmediatelyBefore($startPos, Lexer::TOKEN_OPEN_PARENTHESES) && $this->hasTokenImmediatelyAfter($endPos, Lexer::TOKEN_CLOSE_PARENTHESES); } } currentTokenValue = $currentTokenValue; $this->currentTokenType = $currentTokenType; $this->currentOffset = $currentOffset; $this->expectedTokenType = $expectedTokenType; $this->expectedTokenValue = $expectedTokenValue; $this->currentTokenLine = $currentTokenLine; parent::__construct(sprintf( 'Unexpected token %s, expected %s%s at offset %d%s', $this->formatValue($currentTokenValue), Lexer::TOKEN_LABELS[$expectedTokenType], $expectedTokenValue !== null ? sprintf(' (%s)', $this->formatValue($expectedTokenValue)) : '', $currentOffset, $currentTokenLine === null ? '' : sprintf(' on line %d', $currentTokenLine), )); } public function getCurrentTokenValue(): string { return $this->currentTokenValue; } public function getCurrentTokenType(): int { return $this->currentTokenType; } public function getCurrentOffset(): int { return $this->currentOffset; } public function getExpectedTokenType(): int { return $this->expectedTokenType; } public function getExpectedTokenValue(): ?string { return $this->expectedTokenValue; } public function getCurrentTokenLine(): ?int { return $this->currentTokenLine; } private function formatValue(string $value): string { $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE); assert($json !== false); return $json; } } config = $config; $this->typeParser = $typeParser; $this->constantExprParser = $constantExprParser; $this->doctrineConstantExprParser = $constantExprParser->toDoctrine(); } public function parse(TokenIterator $tokens): Ast\PhpDoc\PhpDocNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PHPDOC); $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); $children = []; if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { $lastChild = $this->parseChild($tokens); $children[] = $lastChild; while (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { if ( $lastChild instanceof Ast\PhpDoc\PhpDocTagNode && ( $lastChild->value instanceof Doctrine\DoctrineTagValueNode || $lastChild->value instanceof Ast\PhpDoc\GenericTagValueNode ) ) { $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { break; } $lastChild = $this->parseChild($tokens); $children[] = $lastChild; continue; } if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL)) { break; } if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { break; } $lastChild = $this->parseChild($tokens); $children[] = $lastChild; } } try { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PHPDOC); } catch (ParserException $e) { $name = ''; $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if (count($children) > 0) { $lastChild = $children[count($children) - 1]; if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode) { $name = $lastChild->name; $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); } } $tag = new Ast\PhpDoc\PhpDocTagNode( $name, $this->enrichWithAttributes( $tokens, new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e), $startLine, $startIndex, ), ); $tokens->forwardToTheEnd(); $comments = $tokens->flushComments(); if ($comments !== []) { throw new LogicException('Comments should already be flushed'); } return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode([$this->enrichWithAttributes($tokens, $tag, $startLine, $startIndex)]), 1, 0); } $comments = $tokens->flushComments(); if ($comments !== []) { throw new LogicException('Comments should already be flushed'); } return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode($children), 1, 0); } /** @phpstan-impure */ private function parseChild(TokenIterator $tokens): Ast\PhpDoc\PhpDocChildNode { if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes($tokens, $this->parseTag($tokens), $startLine, $startIndex); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_TAG)) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tag = $tokens->currentTokenValue(); $tokens->next(); $tagStartLine = $tokens->currentTokenLine(); $tagStartIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocTagNode( $tag, $this->enrichWithAttributes( $tokens, $this->parseDoctrineTagValue($tokens, $tag), $tagStartLine, $tagStartIndex, ), ), $startLine, $startIndex); } $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $text = $this->parseText($tokens); return $this->enrichWithAttributes($tokens, $text, $startLine, $startIndex); } /** * @template T of Ast\Node * @param T $tag * @return T */ private function enrichWithAttributes(TokenIterator $tokens, Ast\Node $tag, int $startLine, int $startIndex): Ast\Node { if ($this->config->useLinesAttributes) { $tag->setAttribute(Ast\Attribute::START_LINE, $startLine); $tag->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } if ($this->config->useIndexAttributes) { $tag->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $tag->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } return $tag; } private function parseText(TokenIterator $tokens): Ast\PhpDoc\PhpDocTextNode { $text = ''; $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; $savepoint = false; // if the next token is EOL, everything below is skipped and empty string is returned while (true) { $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); $text .= $tmpText; // stop if we're not at EOL - meaning it's the end of PHPDoc if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC)) { break; } if (!$savepoint) { $tokens->pushSavePoint(); $savepoint = true; } elseif ($tmpText !== '') { $tokens->dropSavePoint(); $tokens->pushSavePoint(); } $tokens->pushSavePoint(); $tokens->next(); // if we're at EOL, check what's next // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { $tokens->rollback(); break; } // otherwise if the next is text, continue building the description string $tokens->dropSavePoint(); $text .= $tokens->getDetectedNewline() ?? "\n"; } if ($savepoint) { $tokens->rollback(); $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); } return new Ast\PhpDoc\PhpDocTextNode(trim($text, " \t")); } private function parseOptionalDescriptionAfterDoctrineTag(TokenIterator $tokens): string { $text = ''; $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; $savepoint = false; // if the next token is EOL, everything below is skipped and empty string is returned while (true) { $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); $text .= $tmpText; // stop if we're not at EOL - meaning it's the end of PHPDoc if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC)) { if (!$tokens->isPrecededByHorizontalWhitespace()) { return trim($text . $this->parseText($tokens)->text, " \t"); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { $tokens->pushSavePoint(); $child = $this->parseChild($tokens); if ($child instanceof Ast\PhpDoc\PhpDocTagNode) { if ( $child->value instanceof Ast\PhpDoc\GenericTagValueNode || $child->value instanceof Doctrine\DoctrineTagValueNode ) { $tokens->rollback(); break; } if ($child->value instanceof Ast\PhpDoc\InvalidTagValueNode) { $tokens->rollback(); $tokens->pushSavePoint(); $tokens->next(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->rollback(); break; } $tokens->rollback(); return trim($text . $this->parseText($tokens)->text, " \t"); } } $tokens->rollback(); return trim($text . $this->parseText($tokens)->text, " \t"); } break; } if (!$savepoint) { $tokens->pushSavePoint(); $savepoint = true; } elseif ($tmpText !== '') { $tokens->dropSavePoint(); $tokens->pushSavePoint(); } $tokens->pushSavePoint(); $tokens->next(); // if we're at EOL, check what's next // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { $tokens->rollback(); break; } // otherwise if the next is text, continue building the description string $tokens->dropSavePoint(); $text .= $tokens->getDetectedNewline() ?? "\n"; } if ($savepoint) { $tokens->rollback(); $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); } return trim($text, " \t"); } public function parseTag(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagNode { $tag = $tokens->currentTokenValue(); $tokens->next(); $value = $this->parseTagValue($tokens, $tag); return new Ast\PhpDoc\PhpDocTagNode($tag, $value); } public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\PhpDocTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); switch ($tag) { case '@param': case '@phpstan-param': case '@psalm-param': case '@phan-param': $tagValue = $this->parseParamTagValue($tokens); break; case '@param-immediately-invoked-callable': case '@phpstan-param-immediately-invoked-callable': $tagValue = $this->parseParamImmediatelyInvokedCallableTagValue($tokens); break; case '@param-later-invoked-callable': case '@phpstan-param-later-invoked-callable': $tagValue = $this->parseParamLaterInvokedCallableTagValue($tokens); break; case '@param-closure-this': case '@phpstan-param-closure-this': $tagValue = $this->parseParamClosureThisTagValue($tokens); break; case '@pure-unless-callable-is-impure': case '@phpstan-pure-unless-callable-is-impure': $tagValue = $this->parsePureUnlessCallableIsImpureTagValue($tokens); break; case '@var': case '@phpstan-var': case '@psalm-var': case '@phan-var': $tagValue = $this->parseVarTagValue($tokens); break; case '@return': case '@phpstan-return': case '@psalm-return': case '@phan-return': case '@phan-real-return': $tagValue = $this->parseReturnTagValue($tokens); break; case '@throws': case '@phpstan-throws': $tagValue = $this->parseThrowsTagValue($tokens); break; case '@mixin': case '@phan-mixin': $tagValue = $this->parseMixinTagValue($tokens); break; case '@psalm-require-extends': case '@phpstan-require-extends': $tagValue = $this->parseRequireExtendsTagValue($tokens); break; case '@psalm-require-implements': case '@phpstan-require-implements': $tagValue = $this->parseRequireImplementsTagValue($tokens); break; case '@psalm-inheritors': case '@phpstan-sealed': $tagValue = $this->parseSealedTagValue($tokens); break; case '@deprecated': $tagValue = $this->parseDeprecatedTagValue($tokens); break; case '@property': case '@property-read': case '@property-write': case '@phpstan-property': case '@phpstan-property-read': case '@phpstan-property-write': case '@psalm-property': case '@psalm-property-read': case '@psalm-property-write': case '@phan-property': case '@phan-property-read': case '@phan-property-write': $tagValue = $this->parsePropertyTagValue($tokens); break; case '@method': case '@phpstan-method': case '@psalm-method': case '@phan-method': $tagValue = $this->parseMethodTagValue($tokens); break; case '@template': case '@phpstan-template': case '@psalm-template': case '@phan-template': case '@template-covariant': case '@phpstan-template-covariant': case '@psalm-template-covariant': case '@template-contravariant': case '@phpstan-template-contravariant': case '@psalm-template-contravariant': $tagValue = $this->typeParser->parseTemplateTagValue( $tokens, fn ($tokens) => $this->parseOptionalDescription($tokens, true), ); break; case '@extends': case '@phpstan-extends': case '@phan-extends': case '@phan-inherits': case '@template-extends': $tagValue = $this->parseExtendsTagValue('@extends', $tokens); break; case '@implements': case '@phpstan-implements': case '@template-implements': $tagValue = $this->parseExtendsTagValue('@implements', $tokens); break; case '@use': case '@phpstan-use': case '@template-use': $tagValue = $this->parseExtendsTagValue('@use', $tokens); break; case '@phpstan-type': case '@psalm-type': case '@phan-type': $tagValue = $this->parseTypeAliasTagValue($tokens); break; case '@phpstan-import-type': case '@psalm-import-type': $tagValue = $this->parseTypeAliasImportTagValue($tokens); break; case '@phpstan-assert': case '@phpstan-assert-if-true': case '@phpstan-assert-if-false': case '@psalm-assert': case '@psalm-assert-if-true': case '@psalm-assert-if-false': case '@phan-assert': case '@phan-assert-if-true': case '@phan-assert-if-false': $tagValue = $this->parseAssertTagValue($tokens); break; case '@phpstan-this-out': case '@phpstan-self-out': case '@psalm-this-out': case '@psalm-self-out': $tagValue = $this->parseSelfOutTagValue($tokens); break; case '@param-out': case '@phpstan-param-out': case '@psalm-param-out': $tagValue = $this->parseParamOutTagValue($tokens); break; default: if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tagValue = $this->parseDoctrineTagValue($tokens, $tag); } else { $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescriptionAfterDoctrineTag($tokens)); } break; } $tokens->dropSavePoint(); } catch (ParserException $e) { $tokens->rollback(); $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens, false), $e); } return $this->enrichWithAttributes($tokens, $tagValue, $startLine, $startIndex); } private function parseDoctrineTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\PhpDocTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return new Doctrine\DoctrineTagValueNode( $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineAnnotation($tag, $this->parseDoctrineArguments($tokens, false)), $startLine, $startIndex, ), $this->parseOptionalDescriptionAfterDoctrineTag($tokens), ); } /** * @return list */ private function parseDoctrineArguments(TokenIterator $tokens, bool $deep): array { if (!$tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { return []; } if (!$deep) { $tokens->addEndOfLineToSkippedTokens(); } $arguments = []; try { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); do { if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { break; } $arguments[] = $this->parseDoctrineArgument($tokens); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); } finally { if (!$deep) { $tokens->removeEndOfLineFromSkippedTokens(); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); return $arguments; } private function parseDoctrineArgument(TokenIterator $tokens): Doctrine\DoctrineArgument { if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex, ); } $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); $currentValue = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $key = $this->enrichWithAttributes( $tokens, new IdentifierTypeNode($currentValue), $startLine, $startIndex, ); $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); $value = $this->parseDoctrineArgumentValue($tokens); $tokens->dropSavePoint(); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineArgument($key, $value), $startLine, $startIndex, ); } catch (ParserException $e) { $tokens->rollback(); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex, ); } } /** * @return DoctrineValueType */ private function parseDoctrineArgumentValue(TokenIterator $tokens) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG)) { $name = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineAnnotation($name, $this->parseDoctrineArguments($tokens, true)), $startLine, $startIndex, ); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET)) { $items = []; do { if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { break; } $items[] = $this->parseDoctrineArrayItem($tokens); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineArray($items), $startLine, $startIndex, ); } $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $identifier = $this->enrichWithAttributes( $tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex, ); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); return $identifier; } $tokens->rollback(); // because of ConstFetchNode } else { $tokens->dropSavePoint(); // because of ConstFetchNode } $currentTokenValue = $tokens->currentTokenValue(); $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { $constExpr = $this->doctrineConstantExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new ParserException( $currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine, ); } return $constExpr; } catch (LogicException $e) { throw new ParserException( $currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine, ); } } private function parseDoctrineArrayItem(TokenIterator $tokens): Doctrine\DoctrineArrayItem { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); $key = $this->parseDoctrineArrayKey($tokens); if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COLON)) { $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); // will throw exception } } $value = $this->parseDoctrineArgumentValue($tokens); $tokens->dropSavePoint(); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineArrayItem($key, $value), $startLine, $startIndex, ); } catch (ParserException $e) { $tokens->rollback(); return $this->enrichWithAttributes( $tokens, new Doctrine\DoctrineArrayItem(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex, ); } } /** * @return ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|ConstFetchNode */ private function parseDoctrineArrayKey(TokenIterator $tokens) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { $key = $this->doctrineConstantExprParser->parseDoctrineString($tokens->currentTokenValue(), $tokens); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $value = $tokens->currentTokenValue(); $tokens->next(); $key = $this->doctrineConstantExprParser->parseDoctrineString($value, $tokens); } else { $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $tokens->dropSavePoint(); throw new ParserException( $tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine(), ); } if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); return $this->enrichWithAttributes( $tokens, new IdentifierTypeNode($currentTokenValue), $startLine, $startIndex, ); } $tokens->rollback(); $constExpr = $this->doctrineConstantExprParser->parse($tokens); if (!$constExpr instanceof Ast\ConstExpr\ConstFetchNode) { throw new ParserException( $tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine(), ); } return $constExpr; } return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } /** * @return Ast\PhpDoc\ParamTagValueNode|Ast\PhpDoc\TypelessParamTagValueNode */ private function parseParamTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode { if ( $tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE, Lexer::TOKEN_VARIADIC, Lexer::TOKEN_VARIABLE) ) { $type = null; } else { $type = $this->typeParser->parse($tokens); } $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); if ($type !== null) { return new Ast\PhpDoc\ParamTagValueNode($type, $isVariadic, $parameterName, $description, $isReference); } return new Ast\PhpDoc\TypelessParamTagValueNode($isVariadic, $parameterName, $description, $isReference); } private function parseParamImmediatelyInvokedCallableTagValue(TokenIterator $tokens): Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode($parameterName, $description); } private function parseParamLaterInvokedCallableTagValue(TokenIterator $tokens): Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode($parameterName, $description); } private function parseParamClosureThisTagValue(TokenIterator $tokens): Ast\PhpDoc\ParamClosureThisTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\ParamClosureThisTagValueNode($type, $parameterName, $description); } private function parsePureUnlessCallableIsImpureTagValue(TokenIterator $tokens): Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode($parameterName, $description); } private function parseVarTagValue(TokenIterator $tokens): Ast\PhpDoc\VarTagValueNode { $type = $this->typeParser->parse($tokens); $variableName = $this->parseOptionalVariableName($tokens); $description = $this->parseOptionalDescription($tokens, $variableName === ''); return new Ast\PhpDoc\VarTagValueNode($type, $variableName, $description); } private function parseReturnTagValue(TokenIterator $tokens): Ast\PhpDoc\ReturnTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\ReturnTagValueNode($type, $description); } private function parseThrowsTagValue(TokenIterator $tokens): Ast\PhpDoc\ThrowsTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\ThrowsTagValueNode($type, $description); } private function parseMixinTagValue(TokenIterator $tokens): Ast\PhpDoc\MixinTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\MixinTagValueNode($type, $description); } private function parseRequireExtendsTagValue(TokenIterator $tokens): Ast\PhpDoc\RequireExtendsTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\RequireExtendsTagValueNode($type, $description); } private function parseRequireImplementsTagValue(TokenIterator $tokens): Ast\PhpDoc\RequireImplementsTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\RequireImplementsTagValueNode($type, $description); } private function parseSealedTagValue(TokenIterator $tokens): Ast\PhpDoc\SealedTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\SealedTagValueNode($type, $description); } private function parseDeprecatedTagValue(TokenIterator $tokens): Ast\PhpDoc\DeprecatedTagValueNode { $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\DeprecatedTagValueNode($description); } private function parsePropertyTagValue(TokenIterator $tokens): Ast\PhpDoc\PropertyTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\PropertyTagValueNode($type, $parameterName, $description); } private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTagValueNode { $staticKeywordOrReturnTypeOrMethodName = $this->typeParser->parse($tokens); if ($staticKeywordOrReturnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode && $staticKeywordOrReturnTypeOrMethodName->name === 'static') { $isStatic = true; $returnTypeOrMethodName = $this->typeParser->parse($tokens); } else { $isStatic = false; $returnTypeOrMethodName = $staticKeywordOrReturnTypeOrMethodName; } if ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $returnType = $returnTypeOrMethodName; $methodName = $tokens->currentTokenValue(); $tokens->next(); } elseif ($returnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode) { $returnType = $isStatic ? $staticKeywordOrReturnTypeOrMethodName : null; $methodName = $returnTypeOrMethodName->name; $isStatic = false; } else { $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); // will throw exception exit; } $templateTypes = []; if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { do { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $templateTypes[] = $this->enrichWithAttributes( $tokens, $this->typeParser->parseTemplateTagValue($tokens), $startLine, $startIndex, ); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); } $parameters = []; $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { $parameters[] = $this->parseMethodTagValueParameter($tokens); while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $parameters[] = $this->parseMethodTagValueParameter($tokens); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\MethodTagValueNode($isStatic, $returnType, $methodName, $parameters, $description, $templateTypes); } private function parseMethodTagValueParameter(TokenIterator $tokens): Ast\PhpDoc\MethodTagValueParameterNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); switch ($tokens->currentTokenType()) { case Lexer::TOKEN_IDENTIFIER: case Lexer::TOKEN_OPEN_PARENTHESES: case Lexer::TOKEN_NULLABLE: $parameterType = $this->typeParser->parse($tokens); break; default: $parameterType = null; } $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); $parameterName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { $defaultValue = $this->constantExprParser->parse($tokens); } else { $defaultValue = null; } return $this->enrichWithAttributes( $tokens, new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue), $startLine, $startIndex, ); } private function parseExtendsTagValue(string $tagName, TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $type = $this->typeParser->parseGeneric( $tokens, $this->typeParser->enrichWithAttributes($tokens, $baseType, $startLine, $startIndex), ); $description = $this->parseOptionalDescription($tokens, true); switch ($tagName) { case '@extends': return new Ast\PhpDoc\ExtendsTagValueNode($type, $description); case '@implements': return new Ast\PhpDoc\ImplementsTagValueNode($type, $description); case '@use': return new Ast\PhpDoc\UsesTagValueNode($type, $description); } throw new ShouldNotHappenException(); } private function parseTypeAliasTagValue(TokenIterator $tokens): Ast\PhpDoc\TypeAliasTagValueNode { $alias = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); // support phan-type/psalm-type syntax $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $type = $this->typeParser->parse($tokens); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { throw new ParserException( $tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_PHPDOC_EOL, null, $tokens->currentTokenLine(), ); } } return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); } catch (ParserException $e) { $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\TypeAliasTagValueNode( $alias, $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex), ); } } private function parseTypeAliasImportTagValue(TokenIterator $tokens): Ast\PhpDoc\TypeAliasImportTagValueNode { $importedAlias = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'from'); $identifierStartLine = $tokens->currentTokenLine(); $identifierStartIndex = $tokens->currentTokenIndex(); $importedFrom = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $importedFromType = $this->enrichWithAttributes( $tokens, new IdentifierTypeNode($importedFrom), $identifierStartLine, $identifierStartIndex, ); $importedAs = null; if ($tokens->tryConsumeTokenValue('as')) { $importedAs = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, $importedFromType, $importedAs); } /** * @return Ast\PhpDoc\AssertTagValueNode|Ast\PhpDoc\AssertTagPropertyValueNode|Ast\PhpDoc\AssertTagMethodValueNode */ private function parseAssertTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode { $isNegated = $tokens->tryConsumeTokenType(Lexer::TOKEN_NEGATED); $isEquality = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); $type = $this->typeParser->parse($tokens); $parameter = $this->parseAssertParameter($tokens); $description = $this->parseOptionalDescription($tokens, false); if (array_key_exists('method', $parameter)) { return new Ast\PhpDoc\AssertTagMethodValueNode($type, $parameter['parameter'], $parameter['method'], $isNegated, $description, $isEquality); } elseif (array_key_exists('property', $parameter)) { return new Ast\PhpDoc\AssertTagPropertyValueNode($type, $parameter['parameter'], $parameter['property'], $isNegated, $description, $isEquality); } return new Ast\PhpDoc\AssertTagValueNode($type, $parameter['parameter'], $isNegated, $description, $isEquality); } /** * @return array{parameter: string}|array{parameter: string, property: string}|array{parameter: string, method: string} */ private function parseAssertParameter(TokenIterator $tokens): array { if ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $parameter = '$this'; $tokens->next(); } else { $parameter = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_ARROW)) { $tokens->consumeTokenType(Lexer::TOKEN_ARROW); $propertyOrMethod = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); return ['parameter' => $parameter, 'method' => $propertyOrMethod]; } return ['parameter' => $parameter, 'property' => $propertyOrMethod]; } return ['parameter' => $parameter]; } private function parseSelfOutTagValue(TokenIterator $tokens): Ast\PhpDoc\SelfOutTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, true); return new Ast\PhpDoc\SelfOutTagValueNode($type, $description); } private function parseParamOutTagValue(TokenIterator $tokens): Ast\PhpDoc\ParamOutTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, false); return new Ast\PhpDoc\ParamOutTagValueNode($type, $parameterName, $description); } private function parseOptionalVariableName(TokenIterator $tokens): string { if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { $parameterName = $tokens->currentTokenValue(); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $parameterName = '$this'; $tokens->next(); } else { $parameterName = ''; } return $parameterName; } private function parseRequiredVariableName(TokenIterator $tokens): string { $parameterName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); return $parameterName; } /** * @param bool $limitStartToken true should be used when the description immediately follows a parsed type */ private function parseOptionalDescription(TokenIterator $tokens, bool $limitStartToken): string { if ($limitStartToken) { foreach (self::DISALLOWED_DESCRIPTION_START_TOKENS as $disallowedStartToken) { if (!$tokens->isCurrentTokenType($disallowedStartToken)) { continue; } $tokens->consumeTokenType(Lexer::TOKEN_OTHER); // will throw exception } if ( !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END) && !$tokens->isPrecededByHorizontalWhitespace() ) { $tokens->consumeTokenType(Lexer::TOKEN_HORIZONTAL_WS); // will throw exception } } return $this->parseText($tokens)->text; } } config = $config; $this->constExprParser = $constExprParser; } /** @phpstan-impure */ public function parse(TokenIterator $tokens): Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { $type = $this->parseNullable($tokens); } else { $type = $this->parseAtomic($tokens); $tokens->pushSavePoint(); $tokens->skipNewLineTokensAndConsumeComments(); try { $enrichedType = $this->enrichTypeOnUnionOrIntersection($tokens, $type); } catch (ParserException $parserException) { $enrichedType = null; } if ($enrichedType !== null) { $type = $enrichedType; $tokens->dropSavePoint(); } else { $tokens->rollback(); $type = $this->enrichTypeOnUnionOrIntersection($tokens, $type) ?? $type; } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } /** @phpstan-impure */ private function enrichTypeOnUnionOrIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type): ?Ast\Type\TypeNode { if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { return $this->parseUnion($tokens, $type); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { return $this->parseIntersection($tokens, $type); } return null; } /** * @internal * @template T of Ast\Node * @param T $type * @return T */ public function enrichWithAttributes(TokenIterator $tokens, Ast\Node $type, int $startLine, int $startIndex): Ast\Node { if ($this->config->useLinesAttributes) { $type->setAttribute(Ast\Attribute::START_LINE, $startLine); $type->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } $comments = $tokens->flushComments(); if ($this->config->useCommentsAttributes) { $type->setAttribute(Ast\Attribute::COMMENTS, $comments); } if ($this->config->useIndexAttributes) { $type->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $type->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } return $type; } /** @phpstan-impure */ private function subParse(TokenIterator $tokens): Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { $type = $this->parseNullable($tokens); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { $type = $this->parseConditionalForParameter($tokens, $tokens->currentTokenValue()); } else { $type = $this->parseAtomic($tokens); if ($tokens->isCurrentTokenValue('is')) { $type = $this->parseConditional($tokens, $type); } else { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { $type = $this->subParseUnion($tokens, $type); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { $type = $this->subParseIntersection($tokens, $type); } } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } /** @phpstan-impure */ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->skipNewLineTokensAndConsumeComments(); $type = $this->subParse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $type = $this->enrichWithAttributes($tokens, new Ast\Type\ThisTypeNode(), $startLine, $startIndex); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $type = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); // because of ConstFetchNode if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { $tokens->pushSavePoint(); $isHtml = $this->isHtml($tokens); $tokens->rollback(); if ($isHtml) { return $type; } $origType = $type; $type = $this->tryParseCallable($tokens, $type, true); if ($type === $origType) { $type = $this->parseGeneric($tokens, $type); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } } } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $type = $this->tryParseCallable($tokens, $type, false); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } elseif (in_array($type->name, [ Ast\Type\ArrayShapeNode::KIND_ARRAY, Ast\Type\ArrayShapeNode::KIND_LIST, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST, 'object', ], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { if ($type->name === 'object') { $type = $this->parseObjectShape($tokens); } else { $type = $this->parseArrayShape($tokens, $type, $type->name); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess( $tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex), ); } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } else { $tokens->rollback(); // because of ConstFetchNode } } else { $tokens->dropSavePoint(); // because of ConstFetchNode } $currentTokenValue = $tokens->currentTokenValue(); $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { $constExpr = $this->constExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new ParserException( $currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine, ); } $type = $this->enrichWithAttributes( $tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex, ); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $type; } catch (LogicException $e) { throw new ParserException( $currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine, ); } } /** @phpstan-impure */ private function parseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { $types[] = $this->parseAtomic($tokens); $tokens->pushSavePoint(); $tokens->skipNewLineTokensAndConsumeComments(); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { $tokens->rollback(); break; } $tokens->dropSavePoint(); } return new Ast\Type\UnionTypeNode($types); } /** @phpstan-impure */ private function subParseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { $tokens->skipNewLineTokensAndConsumeComments(); $types[] = $this->parseAtomic($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } return new Ast\Type\UnionTypeNode($types); } /** @phpstan-impure */ private function parseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { $types[] = $this->parseAtomic($tokens); $tokens->pushSavePoint(); $tokens->skipNewLineTokensAndConsumeComments(); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { $tokens->rollback(); break; } $tokens->dropSavePoint(); } return new Ast\Type\IntersectionTypeNode($types); } /** @phpstan-impure */ private function subParseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { $tokens->skipNewLineTokensAndConsumeComments(); $types[] = $this->parseAtomic($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } return new Ast\Type\IntersectionTypeNode($types); } /** @phpstan-impure */ private function parseConditional(TokenIterator $tokens, Ast\Type\TypeNode $subjectType): Ast\Type\TypeNode { $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $negated = false; if ($tokens->isCurrentTokenValue('not')) { $negated = true; $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } $targetType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->skipNewLineTokensAndConsumeComments(); $ifType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $tokens->skipNewLineTokensAndConsumeComments(); $elseType = $this->subParse($tokens); return new Ast\Type\ConditionalTypeNode($subjectType, $targetType, $ifType, $elseType, $negated); } /** @phpstan-impure */ private function parseConditionalForParameter(TokenIterator $tokens, string $parameterName): Ast\Type\TypeNode { $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'is'); $negated = false; if ($tokens->isCurrentTokenValue('not')) { $negated = true; $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } $targetType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->skipNewLineTokensAndConsumeComments(); $ifType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $tokens->skipNewLineTokensAndConsumeComments(); $elseType = $this->subParse($tokens); return new Ast\Type\ConditionalTypeForParameterNode($parameterName, $targetType, $ifType, $elseType, $negated); } /** @phpstan-impure */ private function parseNullable(TokenIterator $tokens): Ast\Type\TypeNode { $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); $type = $this->parseAtomic($tokens); return new Ast\Type\NullableTypeNode($type); } /** @phpstan-impure */ public function isHtml(TokenIterator $tokens): bool { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { return false; } $htmlTagName = $tokens->currentTokenValue(); $tokens->next(); if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { return false; } $endTag = ''; $endTagSearchOffset = - strlen($endTag); while (!$tokens->isCurrentTokenType(Lexer::TOKEN_END)) { if ( ( $tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET) && strpos($tokens->currentTokenValue(), '/' . $htmlTagName . '>') !== false ) || substr_compare($tokens->currentTokenValue(), $endTag, $endTagSearchOffset) === 0 ) { return true; } $tokens->next(); } return false; } /** @phpstan-impure */ public function parseGeneric(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $baseType): Ast\Type\GenericTypeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $tokens->skipNewLineTokensAndConsumeComments(); $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); $genericTypes = []; $variances = []; $isFirst = true; while ( $isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA) ) { $tokens->skipNewLineTokensAndConsumeComments(); // trailing comma case if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { break; } $isFirst = false; [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $type; } /** * @phpstan-impure * @return array{Ast\Type\TypeNode, Ast\Type\GenericTypeNode::VARIANCE_*} */ public function parseGenericTypeArgument(TokenIterator $tokens): array { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { return [ $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('mixed'), $startLine, $startIndex), Ast\Type\GenericTypeNode::VARIANCE_BIVARIANT, ]; } if ($tokens->tryConsumeTokenValue('contravariant')) { $variance = Ast\Type\GenericTypeNode::VARIANCE_CONTRAVARIANT; } elseif ($tokens->tryConsumeTokenValue('covariant')) { $variance = Ast\Type\GenericTypeNode::VARIANCE_COVARIANT; } else { $variance = Ast\Type\GenericTypeNode::VARIANCE_INVARIANT; } $type = $this->parse($tokens); return [$type, $variance]; } /** * @throws ParserException * @param ?callable(TokenIterator): string $parseDescription */ public function parseTemplateTagValue( TokenIterator $tokens, ?callable $parseDescription = null ): TemplateTagValueNode { $name = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $upperBound = $lowerBound = null; if ($tokens->tryConsumeTokenValue('of') || $tokens->tryConsumeTokenValue('as')) { $upperBound = $this->parse($tokens); } if ($tokens->tryConsumeTokenValue('super')) { $lowerBound = $this->parse($tokens); } if ($tokens->tryConsumeTokenValue('=')) { $default = $this->parse($tokens); } else { $default = null; } if ($parseDescription !== null) { $description = $parseDescription($tokens); } else { $description = ''; } if ($name === '') { throw new LogicException('Template tag name cannot be empty.'); } return new Ast\PhpDoc\TemplateTagValueNode($name, $upperBound, $description, $default, $lowerBound); } /** @phpstan-impure */ private function parseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier, bool $hasTemplate): Ast\Type\TypeNode { $templates = $hasTemplate ? $this->parseCallableTemplates($tokens) : []; $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); $tokens->skipNewLineTokensAndConsumeComments(); $parameters = []; if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { $parameters[] = $this->parseCallableParameter($tokens); $tokens->skipNewLineTokensAndConsumeComments(); while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { break; } $parameters[] = $this->parseCallableParameter($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $returnType = $this->enrichWithAttributes($tokens, $this->parseCallableReturnType($tokens), $startLine, $startIndex); return new Ast\Type\CallableTypeNode($identifier, $parameters, $returnType, $templates); } /** * @return Ast\PhpDoc\TemplateTagValueNode[] * * @phpstan-impure */ private function parseCallableTemplates(TokenIterator $tokens): array { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $templates = []; $isFirst = true; while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); // trailing comma case if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { break; } $isFirst = false; $templates[] = $this->parseCallableTemplateArgument($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $templates; } private function parseCallableTemplateArgument(TokenIterator $tokens): Ast\PhpDoc\TemplateTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes( $tokens, $this->parseTemplateTagValue($tokens), $startLine, $startIndex, ); } /** @phpstan-impure */ private function parseCallableParameter(TokenIterator $tokens): Ast\Type\CallableTypeParameterNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $type = $this->parse($tokens); $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { $parameterName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); } else { $parameterName = ''; } $isOptional = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); return $this->enrichWithAttributes( $tokens, new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional), $startLine, $startIndex, ); } /** @phpstan-impure */ private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { return $this->parseNullable($tokens); } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $type = $this->subParse($tokens); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $type; } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $type = new Ast\Type\ThisTypeNode(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, )); } return $type; } else { $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $type = new Ast\Type\IdentifierTypeNode($currentTokenValue); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { $type = $this->parseGeneric( $tokens, $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, ), ); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, )); } } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, )); } elseif (in_array($type->name, [ Ast\Type\ArrayShapeNode::KIND_ARRAY, Ast\Type\ArrayShapeNode::KIND_LIST, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST, 'object', ], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { if ($type->name === 'object') { $type = $this->parseObjectShape($tokens); } else { $type = $this->parseArrayShape($tokens, $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, ), $type->name); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, )); } } return $type; } else { $tokens->rollback(); // because of ConstFetchNode } } else { $tokens->dropSavePoint(); // because of ConstFetchNode } } $currentTokenValue = $tokens->currentTokenValue(); $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { $constExpr = $this->constExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new ParserException( $currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine, ); } $type = $this->enrichWithAttributes( $tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex, ); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $type; } catch (LogicException $e) { throw new ParserException( $currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine, ); } } /** @phpstan-impure */ private function tryParseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier, bool $hasTemplate): Ast\Type\TypeNode { try { $tokens->pushSavePoint(); $type = $this->parseCallable($tokens, $identifier, $hasTemplate); $tokens->dropSavePoint(); } catch (ParserException $e) { $tokens->rollback(); $type = $identifier; } return $type; } /** @phpstan-impure */ private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode { $startLine = $type->getAttribute(Ast\Attribute::START_LINE); $startIndex = $type->getAttribute(Ast\Attribute::START_INDEX); try { while ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $tokens->pushSavePoint(); $canBeOffsetAccessType = !$tokens->isPrecededByHorizontalWhitespace(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET); if ($canBeOffsetAccessType && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET)) { $offset = $this->parse($tokens); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); $tokens->dropSavePoint(); $type = new Ast\Type\OffsetAccessTypeNode($type, $offset); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, ); } } else { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); $tokens->dropSavePoint(); $type = new Ast\Type\ArrayTypeNode($type); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes( $tokens, $type, $startLine, $startIndex, ); } } } } catch (ParserException $e) { $tokens->rollback(); } return $type; } /** * @phpstan-impure * @param Ast\Type\ArrayShapeNode::KIND_* $kind */ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type, string $kind): Ast\Type\ArrayShapeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); $items = []; $sealed = true; $unsealedType = null; $done = false; do { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { return Ast\Type\ArrayShapeNode::createSealed($items, $kind); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC)) { $sealed = false; $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { if ($kind === Ast\Type\ArrayShapeNode::KIND_ARRAY) { $unsealedType = $this->parseArrayShapeUnsealedType($tokens); } else { $unsealedType = $this->parseListShapeUnsealedType($tokens); } $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA); break; } $items[] = $this->parseArrayShapeItem($tokens); $tokens->skipNewLineTokensAndConsumeComments(); if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $done = true; } if ($tokens->currentTokenType() !== Lexer::TOKEN_COMMENT) { continue; } $tokens->next(); } while (!$done); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); if ($sealed) { return Ast\Type\ArrayShapeNode::createSealed($items, $kind); } return Ast\Type\ArrayShapeNode::createUnsealed($items, $unsealedType, $kind); } /** @phpstan-impure */ private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShapeItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); // parse any comments above the item $tokens->skipNewLineTokensAndConsumeComments(); try { $tokens->pushSavePoint(); $key = $this->parseArrayShapeKey($tokens); $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $value = $this->parse($tokens); $tokens->dropSavePoint(); return $this->enrichWithAttributes( $tokens, new Ast\Type\ArrayShapeItemNode($key, $optional, $value), $startLine, $startIndex, ); } catch (ParserException $e) { $tokens->rollback(); $value = $this->parse($tokens); return $this->enrichWithAttributes( $tokens, new Ast\Type\ArrayShapeItemNode(null, false, $value), $startLine, $startIndex, ); } } /** * @phpstan-impure * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\ConstExpr\ConstFetchNode|Ast\Type\IdentifierTypeNode */ private function parseArrayShapeKey(TokenIterator $tokens) { $startIndex = $tokens->currentTokenIndex(); $startLine = $tokens->currentTokenLine(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED); $tokens->next(); } else { $identifier = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $classConstantName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $key = new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName); } else { $key = new Ast\Type\IdentifierTypeNode($identifier); } } return $this->enrichWithAttributes( $tokens, $key, $startLine, $startIndex, ); } /** * @phpstan-impure */ private function parseArrayShapeUnsealedType(TokenIterator $tokens): Ast\Type\ArrayShapeUnsealedTypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $tokens->skipNewLineTokensAndConsumeComments(); $valueType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $keyType = null; if ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); $keyType = $valueType; $valueType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $this->enrichWithAttributes( $tokens, new Ast\Type\ArrayShapeUnsealedTypeNode($valueType, $keyType), $startLine, $startIndex, ); } /** * @phpstan-impure */ private function parseListShapeUnsealedType(TokenIterator $tokens): Ast\Type\ArrayShapeUnsealedTypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $tokens->skipNewLineTokensAndConsumeComments(); $valueType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $this->enrichWithAttributes( $tokens, new Ast\Type\ArrayShapeUnsealedTypeNode($valueType, null), $startLine, $startIndex, ); } /** * @phpstan-impure */ private function parseObjectShape(TokenIterator $tokens): Ast\Type\ObjectShapeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); $items = []; do { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { return new Ast\Type\ObjectShapeNode($items); } $items[] = $this->parseObjectShapeItem($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); return new Ast\Type\ObjectShapeNode($items); } /** @phpstan-impure */ private function parseObjectShapeItem(TokenIterator $tokens): Ast\Type\ObjectShapeItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->skipNewLineTokensAndConsumeComments(); $key = $this->parseObjectShapeKey($tokens); $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $value = $this->parse($tokens); return $this->enrichWithAttributes( $tokens, new Ast\Type\ObjectShapeItemNode($key, $optional, $value), $startLine, $startIndex, ); } /** * @phpstan-impure * @return Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode */ private function parseObjectShapeKey(TokenIterator $tokens) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED); $tokens->next(); } else { $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } } */ private Differ $differ; /** * Map From "{$class}->{$subNode}" to string that should be inserted * between elements of this list subnode * * @var array */ private array $listInsertionMap = [ PhpDocNode::class . '->children' => "\n * ", UnionTypeNode::class . '->types' => '|', IntersectionTypeNode::class . '->types' => '&', ArrayShapeNode::class . '->items' => ', ', ObjectShapeNode::class . '->items' => ', ', CallableTypeNode::class . '->parameters' => ', ', CallableTypeNode::class . '->templateTypes' => ', ', GenericTypeNode::class . '->genericTypes' => ', ', ConstExprArrayNode::class . '->items' => ', ', MethodTagValueNode::class . '->parameters' => ', ', DoctrineArray::class . '->items' => ', ', DoctrineAnnotation::class . '->arguments' => ', ', ]; /** * [$find, $extraLeft, $extraRight] * * @var array */ private array $emptyListInsertionMap = [ CallableTypeNode::class . '->parameters' => ['(', '', ''], ArrayShapeNode::class . '->items' => ['{', '', ''], ObjectShapeNode::class . '->items' => ['{', '', ''], DoctrineArray::class . '->items' => ['{', '', ''], DoctrineAnnotation::class . '->arguments' => ['(', '', ''], ]; /** @var array>> */ private array $parenthesesMap = [ CallableTypeNode::class . '->returnType' => [ CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ], ArrayTypeNode::class . '->type' => [ CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ConstTypeNode::class, NullableTypeNode::class, ], OffsetAccessTypeNode::class . '->type' => [ CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, NullableTypeNode::class, ], ]; /** @var array>> */ private array $parenthesesListMap = [ IntersectionTypeNode::class . '->types' => [ IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class, ], UnionTypeNode::class . '->types' => [ IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class, ], ]; public function printFormatPreserving(PhpDocNode $node, PhpDocNode $originalNode, TokenIterator $originalTokens): string { $this->differ = new Differ(static function ($a, $b) { if ($a instanceof Node && $b instanceof Node) { return $a === $b->getAttribute(Attribute::ORIGINAL_NODE); } return false; }); $tokenIndex = 0; $result = $this->printArrayFormatPreserving( $node->children, $originalNode->children, $originalTokens, $tokenIndex, PhpDocNode::class, 'children', ); if ($result !== null) { return $result . $originalTokens->getContentBetween($tokenIndex, $originalTokens->getTokenCount()); } return $this->print($node); } public function print(Node $node): string { if ($node instanceof PhpDocNode) { return "/**\n *" . implode("\n *", array_map( function (PhpDocChildNode $child): string { $s = $this->print($child); return $s === '' ? '' : ' ' . $s; }, $node->children, )) . "\n */"; } if ($node instanceof PhpDocTextNode) { return $node->text; } if ($node instanceof PhpDocTagNode) { if ($node->value instanceof DoctrineTagValueNode) { return $this->print($node->value); } return trim(sprintf('%s %s', $node->name, $this->print($node->value))); } if ($node instanceof PhpDocTagValueNode) { return $this->printTagValue($node); } if ($node instanceof TypeNode) { return $this->printType($node); } if ($node instanceof ConstExprNode) { return $this->printConstExpr($node); } if ($node instanceof MethodTagValueParameterNode) { $type = $node->type !== null ? $this->print($node->type) . ' ' : ''; $isReference = $node->isReference ? '&' : ''; $isVariadic = $node->isVariadic ? '...' : ''; $default = $node->defaultValue !== null ? ' = ' . $this->print($node->defaultValue) : ''; return "{$type}{$isReference}{$isVariadic}{$node->parameterName}{$default}"; } if ($node instanceof CallableTypeParameterNode) { $type = $this->print($node->type) . ' '; $isReference = $node->isReference ? '&' : ''; $isVariadic = $node->isVariadic ? '...' : ''; $isOptional = $node->isOptional ? '=' : ''; return trim("{$type}{$isReference}{$isVariadic}{$node->parameterName}") . $isOptional; } if ($node instanceof ArrayShapeUnsealedTypeNode) { if ($node->keyType !== null) { return sprintf('<%s, %s>', $this->printType($node->keyType), $this->printType($node->valueType)); } return sprintf('<%s>', $this->printType($node->valueType)); } if ($node instanceof DoctrineAnnotation) { return (string) $node; } if ($node instanceof DoctrineArgument) { return (string) $node; } if ($node instanceof DoctrineArray) { return (string) $node; } if ($node instanceof DoctrineArrayItem) { return (string) $node; } if ($node instanceof ArrayShapeItemNode) { if ($node->keyName !== null) { return sprintf( '%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType), ); } return $this->printType($node->valueType); } if ($node instanceof ObjectShapeItemNode) { if ($node->keyName !== null) { return sprintf( '%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType), ); } return $this->printType($node->valueType); } throw new LogicException(sprintf('Unknown node type %s', get_class($node))); } private function printTagValue(PhpDocTagValueNode $node): string { // only nodes that contain another node are handled here // the rest falls back on (string) $node if ($node instanceof AssertTagMethodValueNode) { $isNegated = $node->isNegated ? '!' : ''; $isEquality = $node->isEquality ? '=' : ''; $type = $this->printType($node->type); return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->method}() {$node->description}"); } if ($node instanceof AssertTagPropertyValueNode) { $isNegated = $node->isNegated ? '!' : ''; $isEquality = $node->isEquality ? '=' : ''; $type = $this->printType($node->type); return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->property} {$node->description}"); } if ($node instanceof AssertTagValueNode) { $isNegated = $node->isNegated ? '!' : ''; $isEquality = $node->isEquality ? '=' : ''; $type = $this->printType($node->type); return trim("{$isNegated}{$isEquality}{$type} {$node->parameter} {$node->description}"); } if ($node instanceof ExtendsTagValueNode || $node instanceof ImplementsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof MethodTagValueNode) { $static = $node->isStatic ? 'static ' : ''; $returnType = $node->returnType !== null ? $this->printType($node->returnType) . ' ' : ''; $parameters = implode(', ', array_map(fn (MethodTagValueParameterNode $parameter): string => $this->print($parameter), $node->parameters)); $description = $node->description !== '' ? " {$node->description}" : ''; $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(fn (TemplateTagValueNode $templateTag): string => $this->print($templateTag), $node->templateTypes)) . '>' : ''; return "{$static}{$returnType}{$node->methodName}{$templateTypes}({$parameters}){$description}"; } if ($node instanceof MixinTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof RequireExtendsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof RequireImplementsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof SealedTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof ParamOutTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->parameterName} {$node->description}"); } if ($node instanceof ParamTagValueNode) { $reference = $node->isReference ? '&' : ''; $variadic = $node->isVariadic ? '...' : ''; $type = $this->printType($node->type); return trim("{$type} {$reference}{$variadic}{$node->parameterName} {$node->description}"); } if ($node instanceof ParamImmediatelyInvokedCallableTagValueNode) { return trim("{$node->parameterName} {$node->description}"); } if ($node instanceof ParamLaterInvokedCallableTagValueNode) { return trim("{$node->parameterName} {$node->description}"); } if ($node instanceof ParamClosureThisTagValueNode) { return trim("{$node->type} {$node->parameterName} {$node->description}"); } if ($node instanceof PureUnlessCallableIsImpureTagValueNode) { return trim("{$node->parameterName} {$node->description}"); } if ($node instanceof PropertyTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->propertyName} {$node->description}"); } if ($node instanceof ReturnTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof SelfOutTagValueNode) { $type = $this->printType($node->type); return trim($type . ' ' . $node->description); } if ($node instanceof TemplateTagValueNode) { $upperBound = $node->bound !== null ? ' of ' . $this->printType($node->bound) : ''; $lowerBound = $node->lowerBound !== null ? ' super ' . $this->printType($node->lowerBound) : ''; $default = $node->default !== null ? ' = ' . $this->printType($node->default) : ''; return trim("{$node->name}{$upperBound}{$lowerBound}{$default} {$node->description}"); } if ($node instanceof ThrowsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof TypeAliasImportTagValueNode) { return trim( "{$node->importedAlias} from " . $this->printType($node->importedFrom) . ($node->importedAs !== null ? " as {$node->importedAs}" : ''), ); } if ($node instanceof TypeAliasTagValueNode) { $type = $this->printType($node->type); return trim("{$node->alias} {$type}"); } if ($node instanceof UsesTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof VarTagValueNode) { $type = $this->printType($node->type); return trim("{$type} " . trim("{$node->variableName} {$node->description}")); } return (string) $node; } private function printType(TypeNode $node): string { if ($node instanceof ArrayShapeNode) { $items = array_map(fn (ArrayShapeItemNode $item): string => $this->print($item), $node->items); if (! $node->sealed) { $items[] = '...' . ($node->unsealedType === null ? '' : $this->print($node->unsealedType)); } return $node->kind . '{' . implode(', ', $items) . '}'; } if ($node instanceof ArrayTypeNode) { return $this->printOffsetAccessType($node->type) . '[]'; } if ($node instanceof CallableTypeNode) { if ($node->returnType instanceof CallableTypeNode || $node->returnType instanceof UnionTypeNode || $node->returnType instanceof IntersectionTypeNode) { $returnType = $this->wrapInParentheses($node->returnType); } else { $returnType = $this->printType($node->returnType); } $template = $node->templateTypes !== [] ? '<' . implode(', ', array_map(fn (TemplateTagValueNode $templateNode): string => $this->print($templateNode), $node->templateTypes)) . '>' : ''; $parameters = implode(', ', array_map(fn (CallableTypeParameterNode $parameterNode): string => $this->print($parameterNode), $node->parameters)); return "{$node->identifier}{$template}({$parameters}): {$returnType}"; } if ($node instanceof ConditionalTypeForParameterNode) { return sprintf( '(%s %s %s ? %s : %s)', $node->parameterName, $node->negated ? 'is not' : 'is', $this->printType($node->targetType), $this->printType($node->if), $this->printType($node->else), ); } if ($node instanceof ConditionalTypeNode) { return sprintf( '(%s %s %s ? %s : %s)', $this->printType($node->subjectType), $node->negated ? 'is not' : 'is', $this->printType($node->targetType), $this->printType($node->if), $this->printType($node->else), ); } if ($node instanceof ConstTypeNode) { return $this->printConstExpr($node->constExpr); } if ($node instanceof GenericTypeNode) { $genericTypes = []; foreach ($node->genericTypes as $index => $type) { $variance = $node->variances[$index] ?? GenericTypeNode::VARIANCE_INVARIANT; if ($variance === GenericTypeNode::VARIANCE_INVARIANT) { $genericTypes[] = $this->printType($type); } elseif ($variance === GenericTypeNode::VARIANCE_BIVARIANT) { $genericTypes[] = '*'; } else { $genericTypes[] = sprintf('%s %s', $variance, $this->print($type)); } } return $node->type . '<' . implode(', ', $genericTypes) . '>'; } if ($node instanceof IdentifierTypeNode) { return $node->name; } if ($node instanceof IntersectionTypeNode || $node instanceof UnionTypeNode) { $items = []; foreach ($node->types as $type) { if ( $type instanceof IntersectionTypeNode || $type instanceof UnionTypeNode || $type instanceof NullableTypeNode ) { $items[] = $this->wrapInParentheses($type); continue; } $items[] = $this->printType($type); } return implode($node instanceof IntersectionTypeNode ? '&' : '|', $items); } if ($node instanceof InvalidTypeNode) { return (string) $node; } if ($node instanceof NullableTypeNode) { if ($node->type instanceof IntersectionTypeNode || $node->type instanceof UnionTypeNode) { return '?(' . $this->printType($node->type) . ')'; } return '?' . $this->printType($node->type); } if ($node instanceof ObjectShapeNode) { $items = array_map(fn (ObjectShapeItemNode $item): string => $this->print($item), $node->items); return 'object{' . implode(', ', $items) . '}'; } if ($node instanceof OffsetAccessTypeNode) { return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; } if ($node instanceof ThisTypeNode) { return (string) $node; } throw new LogicException(sprintf('Unknown node type %s', get_class($node))); } private function wrapInParentheses(TypeNode $node): string { return '(' . $this->printType($node) . ')'; } private function printOffsetAccessType(TypeNode $type): string { if ( $type instanceof CallableTypeNode || $type instanceof UnionTypeNode || $type instanceof IntersectionTypeNode || $type instanceof NullableTypeNode ) { return $this->wrapInParentheses($type); } return $this->printType($type); } private function printConstExpr(ConstExprNode $node): string { // this is fine - ConstExprNode classes do not contain nodes that need smart printer logic return (string) $node; } /** * @param Node[] $nodes * @param Node[] $originalNodes */ private function printArrayFormatPreserving(array $nodes, array $originalNodes, TokenIterator $originalTokens, int &$tokenIndex, string $parentNodeClass, string $subNodeName): ?string { $diff = $this->differ->diffWithReplacements($originalNodes, $nodes); $mapKey = $parentNodeClass . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $result = ''; $beforeFirstKeepOrReplace = true; $delayedAdd = []; $insertNewline = false; [$isMultiline, $beforeAsteriskIndent, $afterAsteriskIndent] = $this->isMultiline($tokenIndex, $originalNodes, $originalTokens); if ($insertStr === "\n * ") { $insertStr = sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; $arrItem = $diffElem->new; $origArrayItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = false; if (!$arrItem instanceof Node || !$origArrayItem instanceof Node) { return null; } /** @var int $itemStartPos */ $itemStartPos = $origArrayItem->getAttribute(Attribute::START_INDEX); /** @var int $itemEndPos */ $itemEndPos = $origArrayItem->getAttribute(Attribute::END_INDEX); if ($itemStartPos < 0 || $itemEndPos < 0 || $itemStartPos < $tokenIndex) { throw new LogicException(); } $comments = $arrItem->getAttribute(Attribute::COMMENTS) ?? []; $origComments = $origArrayItem->getAttribute(Attribute::COMMENTS) ?? []; $commentStartPos = count($origComments) > 0 ? $origComments[0]->startIndex : $itemStartPos; assert($commentStartPos >= 0); $result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos); if (count($delayedAdd) > 0) { foreach ($delayedAdd as $delayedAddNode) { $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($delayedAddNode), $this->parenthesesListMap[$mapKey], true); if ($parenthesesNeeded) { $result .= '('; } if ($insertNewline) { $delayedAddComments = $delayedAddNode->getAttribute(Attribute::COMMENTS) ?? []; if (count($delayedAddComments) > 0) { $result .= $this->printComments($delayedAddComments, $beforeAsteriskIndent, $afterAsteriskIndent); $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } } $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); if ($parenthesesNeeded) { $result .= ')'; } if ($insertNewline) { $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } else { $result .= $insertStr; } } $delayedAdd = []; } $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($arrItem), $this->parenthesesListMap[$mapKey], true) && !in_array(get_class($origArrayItem), $this->parenthesesListMap[$mapKey], true); $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($itemStartPos, $itemEndPos); if ($addParentheses) { $result .= '('; } if ($comments !== $origComments) { if (count($comments) > 0) { $result .= $this->printComments($comments, $beforeAsteriskIndent, $afterAsteriskIndent); $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } } $result .= $this->printNodeFormatPreserving($arrItem, $originalTokens); if ($addParentheses) { $result .= ')'; } $tokenIndex = $itemEndPos + 1; } elseif ($diffType === DiffElem::TYPE_ADD) { if ($insertStr === null) { return null; } if (!$arrItem instanceof Node) { return null; } if ($insertStr === ', ' && $isMultiline || count($arrItem->getAttribute(Attribute::COMMENTS) ?? []) > 0) { $insertStr = ','; $insertNewline = true; } if ($beforeFirstKeepOrReplace) { // Will be inserted at the next "replace" or "keep" element $delayedAdd[] = $arrItem; continue; } /** @var int $itemEndPos */ $itemEndPos = $tokenIndex - 1; if ($insertNewline) { $comments = $arrItem->getAttribute(Attribute::COMMENTS) ?? []; $result .= $insertStr; if (count($comments) > 0) { $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); $result .= $this->printComments($comments, $beforeAsteriskIndent, $afterAsteriskIndent); } $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } else { $result .= $insertStr; } $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($arrItem), $this->parenthesesListMap[$mapKey], true); if ($parenthesesNeeded) { $result .= '('; } $result .= $this->printNodeFormatPreserving($arrItem, $originalTokens); if ($parenthesesNeeded) { $result .= ')'; } $tokenIndex = $itemEndPos + 1; } elseif ($diffType === DiffElem::TYPE_REMOVE) { if (!$origArrayItem instanceof Node) { return null; } /** @var int $itemStartPos */ $itemStartPos = $origArrayItem->getAttribute(Attribute::START_INDEX); /** @var int $itemEndPos */ $itemEndPos = $origArrayItem->getAttribute(Attribute::END_INDEX); if ($itemStartPos < 0 || $itemEndPos < 0) { throw new LogicException(); } if ($i === 0) { // If we're removing from the start, keep the tokens before the node and drop those after it, // instead of the other way around. $originalTokensArray = $originalTokens->getTokens(); for ($j = $tokenIndex; $j < $itemStartPos; $j++) { if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) { break; } $result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET]; } } $tokenIndex = $itemEndPos + 1; } } if (count($delayedAdd) > 0) { if (!isset($this->emptyListInsertionMap[$mapKey])) { return null; } [$findToken, $extraLeft, $extraRight] = $this->emptyListInsertionMap[$mapKey]; if ($findToken !== null) { $originalTokensArray = $originalTokens->getTokens(); for (; $tokenIndex < count($originalTokensArray); $tokenIndex++) { $result .= $originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET]; if ($originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET] !== $findToken) { continue; } $tokenIndex++; break; } } $first = true; $result .= $extraLeft; foreach ($delayedAdd as $delayedAddNode) { if (!$first) { $result .= $insertStr; if ($insertNewline) { $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } } $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); $first = false; } $result .= $extraRight; } return $result; } /** * @param list $comments */ private function printComments(array $comments, string $beforeAsteriskIndent, string $afterAsteriskIndent): string { $formattedComments = []; foreach ($comments as $comment) { $formattedComments[] = str_replace("\n", "\n" . $beforeAsteriskIndent . '*' . $afterAsteriskIndent, $comment->getReformattedText()); } return implode("\n$beforeAsteriskIndent*$afterAsteriskIndent", $formattedComments); } /** * @param array $nodes * @return array{bool, string, string} */ private function isMultiline(int $initialIndex, array $nodes, TokenIterator $originalTokens): array { $isMultiline = count($nodes) > 1; $pos = $initialIndex; $allText = ''; /** @var Node|null $node */ foreach ($nodes as $node) { if (!$node instanceof Node) { continue; } $endPos = $node->getAttribute(Attribute::END_INDEX) + 1; $text = $originalTokens->getContentBetween($pos, $endPos); $allText .= $text; if (strpos($text, "\n") === false) { // We require that a newline is present between *every* item. If the formatting // is inconsistent, with only some items having newlines, we don't consider it // as multiline $isMultiline = false; } $pos = $endPos; } $c = preg_match_all('~\n(?[\\x09\\x20]*)\*(?\\x20*)~', $allText, $matches, PREG_SET_ORDER); if ($c === 0) { return [$isMultiline, ' ', ' ']; } $before = ''; $after = ''; foreach ($matches as $match) { if (strlen($match['before']) > strlen($before)) { $before = $match['before']; } if (strlen($match['after']) <= strlen($after)) { continue; } $after = $match['after']; } $before = strlen($before) === 0 ? ' ' : $before; $after = strlen($after) === 0 ? ' ' : $after; return [$isMultiline, $before, $after]; } private function printNodeFormatPreserving(Node $node, TokenIterator $originalTokens): string { /** @var Node|null $originalNode */ $originalNode = $node->getAttribute(Attribute::ORIGINAL_NODE); if ($originalNode === null) { return $this->print($node); } $class = get_class($node); if ($class !== get_class($originalNode)) { throw new LogicException(); } $startPos = $originalNode->getAttribute(Attribute::START_INDEX); $endPos = $originalNode->getAttribute(Attribute::END_INDEX); if ($startPos < 0 || $endPos < 0) { throw new LogicException(); } $result = ''; $pos = $startPos; $subNodeNames = array_keys(get_object_vars($node)); foreach ($subNodeNames as $subNodeName) { $subNode = $node->$subNodeName; $origSubNode = $originalNode->$subNodeName; if ( (!$subNode instanceof Node && $subNode !== null) || (!$origSubNode instanceof Node && $origSubNode !== null) ) { if ($subNode === $origSubNode) { // Unchanged, can reuse old code continue; } if (is_array($subNode) && is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it $listResult = $this->printArrayFormatPreserving( $subNode, $origSubNode, $originalTokens, $pos, $class, $subNodeName, ); if ($listResult === null) { return $this->print($node); } $result .= $listResult; continue; } return $this->print($node); } if ($origSubNode === null) { if ($subNode === null) { // Both null, nothing to do continue; } return $this->print($node); } $subStartPos = $origSubNode->getAttribute(Attribute::START_INDEX); $subEndPos = $origSubNode->getAttribute(Attribute::END_INDEX); if ($subStartPos < 0 || $subEndPos < 0) { throw new LogicException(); } if ($subEndPos < $subStartPos) { return $this->print($node); } if ($subNode === null) { return $this->print($node); } $result .= $originalTokens->getContentBetween($pos, $subStartPos); $mapKey = get_class($node) . '->' . $subNodeName; $parenthesesNeeded = isset($this->parenthesesMap[$mapKey]) && in_array(get_class($subNode), $this->parenthesesMap[$mapKey], true); if ($subNode->getAttribute(Attribute::ORIGINAL_NODE) !== null) { $parenthesesNeeded = $parenthesesNeeded && !in_array(get_class($subNode->getAttribute(Attribute::ORIGINAL_NODE)), $this->parenthesesMap[$mapKey], true); } $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($subStartPos, $subEndPos); if ($addParentheses) { $result .= '('; } $result .= $this->printNodeFormatPreserving($subNode, $originalTokens); if ($addParentheses) { $result .= ')'; } $pos = $subEndPos + 1; } return $result . $originalTokens->getContentBetween($pos, $endPos + 1); } } type = $type; $this->old = $old; $this->new = $new; } } isEqual = $isEqual; } /** * Calculate diff (edit script) from $old to $new. * * @param T[] $old Original array * @param T[] $new New array * * @return DiffElem[] Diff (edit script) */ public function diff(array $old, array $new): array { [$trace, $x, $y] = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } /** * Calculate diff, including "replace" operations. * * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * * @param T[] $old Original array * @param T[] $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ public function diffWithReplacements(array $old, array $new): array { return $this->coalesceReplacements($this->diff($old, $new)); } /** * @param T[] $old * @param T[] $new * @return array{array>, int, int} */ private function calculateTrace(array $old, array $new): array { $n = count($old); $m = count($new); $max = $n + $m; $v = [1 => 0]; $trace = []; for ($d = 0; $d <= $max; $d++) { $trace[] = $v; for ($k = -$d; $k <= $d; $k += 2) { if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { $x = $v[$k + 1]; } else { $x = $v[$k - 1] + 1; } $y = $x - $k; while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { $x++; $y++; } $v[$k] = $x; if ($x >= $n && $y >= $m) { return [$trace, $x, $y]; } } } throw new Exception('Should not happen'); } /** * @param array> $trace * @param T[] $old * @param T[] $new * @return DiffElem[] */ private function extractDiff(array $trace, int $x, int $y, array $old, array $new): array { $result = []; for ($d = count($trace) - 1; $d >= 0; $d--) { $v = $trace[$d]; $k = $x - $y; if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { $prevK = $k + 1; } else { $prevK = $k - 1; } $prevX = $v[$prevK]; $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); $x--; $y--; } if ($d === 0) { break; } while ($x > $prevX) { $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); $x--; } while ($y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); $y--; } } return array_reverse($result); } /** * Coalesce equal-length sequences of remove+add into a replace operation. * * @param DiffElem[] $diff * @return DiffElem[] */ private function coalesceReplacements(array $diff): array { $newDiff = []; $c = count($diff); for ($i = 0; $i < $c; $i++) { $diffType = $diff[$i]->type; if ($diffType !== DiffElem::TYPE_REMOVE) { $newDiff[] = $diff[$i]; continue; } $j = $i; while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { $j++; } $k = $j; while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { $k++; } if ($j - $i === $k - $j) { $len = $j - $i; for ($n = 0; $n < $len; $n++) { $newDiff[] = new DiffElem( DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new, ); } } else { for (; $i < $k; $i++) { $newDiff[] = $diff[$i]; } } $i = $k - 1; } return $newDiff; } } MIT License Copyright (c) 2016 Ondřej Mirtes Copyright (c) 2025 PHPStan s.r.o. 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. loadClass($class); return; } if (strpos($class, 'PHPStan\\') !== 0 || strpos($class, 'PHPStan\\PhpDocParser\\') === 0) { return; } if (!in_array('phar', stream_get_wrappers(), true)) { throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.'); } if (!self::$polyfillsLoaded) { self::$polyfillsLoaded = true; if ( PHP_VERSION_ID < 80000 && empty($GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e']) && !class_exists(\Symfony\Polyfill\Php80\Php80::class, false) ) { $GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e'] = true; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/Php80.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/bootstrap.php'; } if ( empty($GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a']) && !class_exists(\Symfony\Polyfill\Mbstring\Mbstring::class, false) ) { $GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a'] = true; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/Mbstring.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/bootstrap.php'; } if ( empty($GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38']) && !class_exists(\Symfony\Polyfill\Intl\Normalizer\Normalizer::class, false) ) { $GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38'] = true; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/Normalizer.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/bootstrap.php'; } if ( PHP_VERSION_ID < 70300 && empty($GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d']) && !class_exists(\Symfony\Polyfill\Php73\Php73::class, false) ) { $GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d'] = true; // already loaded by bootstrap inside the hrtime condition // require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/Php73.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/bootstrap.php'; } if ( PHP_VERSION_ID < 70400 && empty($GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634']) && !class_exists(\Symfony\Polyfill\Php74\Php74::class, false) ) { $GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634'] = true; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/Php74.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/bootstrap.php'; } if ( !extension_loaded('intl') && empty($GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8']) && !class_exists(\Symfony\Polyfill\Intl\Grapheme\Grapheme::class, false) ) { $GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8'] = true; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/Grapheme.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/bootstrap.php'; } if ( PHP_VERSION_ID < 80100 && empty ($GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f']) && !class_exists(\Symfony\Polyfill\Php81\Php81::class, false) ) { $GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f'] = true; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/Php81.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/bootstrap.php'; } } $filename = str_replace('\\', DIRECTORY_SEPARATOR, $class); if (strpos($class, 'PHPStan\\BetterReflection\\') === 0) { $filename = substr($filename, strlen('PHPStan\\BetterReflection\\')); $filepath = 'phar://' . __DIR__ . '/phpstan.phar/vendor/ondrejmirtes/better-reflection/src/' . $filename . '.php'; } else { $filename = substr($filename, strlen('PHPStan\\')); $filepath = 'phar://' . __DIR__ . '/phpstan.phar/src/' . $filename . '.php'; } if (!file_exists($filepath)) { return; } require $filepath; } } spl_autoload_register([PharAutoloader::class, 'loadClass']); { "name": "phpstan/phpstan", "description": "PHPStan - PHP Static Analysis Tool", "license": ["MIT"], "keywords": ["dev", "static analysis"], "require": { "php": "^7.2|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" }, "bin": [ "phpstan", "phpstan.phar" ], "autoload": { "files": ["bootstrap.php"] }, "source": { "type": "", "url": "", "reference": "" }, "support": { "issues": "https://github.com/phpstan/phpstan/issues", "forum": "https://github.com/phpstan/phpstan/discussions", "source": "https://github.com/phpstan/phpstan-src", "docs": "https://phpstan.org/user-guide/getting-started", "security": "https://github.com/phpstan/phpstan/security/policy" } }

PHPStan - PHP Static Analysis Tool

PHPStan

Build Status Latest Stable Version Total Downloads License PHPStan Enabled

------ PHPStan focuses on finding errors in your code without actually running it. It catches whole classes of bugs even before you write tests for the code. It moves PHP closer to compiled languages in the sense that the correctness of each line of the code can be checked before you run the actual line. **[Read more about PHPStan »](https://phpstan.org/)** **[Try out PHPStan on the on-line playground! »](https://phpstan.org/try)** ## Sponsors TheCodingMachine     Private Packagist
CDN77     Blackfire.io
iO     Fame Helsinki
ShipMonk     Togetter
RightCapital     ContentKing
ZOL     EdgeNext
Shopware     Craft CMS
Worksome     campoint AG
Crisp.nl     Inviqa
GetResponse     Shoptet
Route4Me: Route Optimizer and Route Planner Software     TicketSwap [**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes) Does GitHub already have your 💳? Do you use PHPStan to find 🐛 before they reach production? [Send a couple of 💸 a month my way too.](https://github.com/sponsors/ondrejmirtes) Thank you! One-time donations [through Revolut.me](https://revolut.me/ondrejmirtes) are also accepted. To request an invoice, [contact me](mailto:ondrej@mirtes.cz) through e-mail. ## Documentation All the documentation lives on the [phpstan.org website](https://phpstan.org/): * [Getting Started & User Guide](https://phpstan.org/user-guide/getting-started) * [Config Reference](https://phpstan.org/config-reference) * [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) * [Extension Library](https://phpstan.org/user-guide/extension-library) * [Developing Extensions](https://phpstan.org/developing-extensions/extension-types) * [API Reference](https://apiref.phpstan.org/) ## PHPStan Pro PHPStan Pro is a paid add-on on top of open-source PHPStan Static Analysis Tool with these premium features: * Web UI for browsing found errors, you can click and open your editor of choice on the offending line. * Continuous analysis (watch mode): scans changed files in the background, refreshes the UI automatically. Try it on PHPStan 0.12.45 or later by running it with the `--pro` option. You can create an account either by following the on-screen instructions, or by visiting [account.phpstan.com](https://account.phpstan.com/). After 30-day free trial period it costs 7 EUR for individuals monthly, 70 EUR for teams (up to 25 members). By paying for PHPStan Pro, you're supporting the development of open-source PHPStan. You can read more about it on [PHPStan's website](https://phpstan.org/blog/introducing-phpstan-pro). ## Code of Conduct This project adheres to a [Contributor Code of Conduct](https://github.com/phpstan/phpstan/blob/master/CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code. ## Contributing Any contributions are welcome. PHPStan's source code open to pull requests lives at [`phpstan/phpstan-src`](https://github.com/phpstan/phpstan-src). #!/usr/bin/env php  preload.phpOitconf/config.levelmax.neon!Oi!hconf/config.level5.neonBOiBO'conf/config.level2.neonOi <conf/config.level9.neonHOiHuconf/config.level8.neonDOiDsJcconf/config.level6.neonOi?~conf/config.level3.neonF OiF D~conf/config.level7.neonYOiY^bZconf/config.level0.neonp+Oip+Uf(conf/bleedingEdge.neonOiDconf/config.level4.neon-Oi-'ϟconf/config.stubValidator.neon-Oi-kconf/parametersSchema.neonOixconf/config.neonOiDLconf/config.level1.neonOi?$stubs/socket_select.stubOif/stubs/Countable.stubdOid䞤stubs/dom.stubMOiMM =stubs/ReflectionMethod.stubOiästubs/ext-ds.stubw8Oiw8 &stubs/ReflectionParameter.stubOi5Τstubs/WeakReference.stub`Oi``stubs/date.stubOifastubs/ReflectionProperty.stubOiXڛڤstubs/ReflectionAttribute.stub Oi qstubs/json_validate.stubOivRstubs/ibm_db2.stubOicҤstubs/ArrayObject.stubOijMstubs/ImagickPixel.stubpOip+stubs/SplObjectStorage.stubOi+qstubs/iterable.stub#Oi#)kstubs/mysqli.stubXOiX FVstubs/socket_select_php8.stubOi٤stubs/ReflectionClass.stubOiڤstubs/PDOStatement.stubOistubs/arrayFunctions.stub5Oi5."stubs/ReflectionClassConstant.stubOiDxdstubs/zip.stub4Oi4#stubs/core.stub"Oi">!stubs/bleedingEdge/Countable.stuboOio Ustubs/bleedingEdge/Rule.stubOiߤ stubs/ReflectionEnum.stubhOihݠFߤstubs/Exception.stub- Oi- Wmstubs/runtime/Attribute.php9Oi9Qۊstubs/runtime/Enum/UnitEnum.phpOi/stubs/runtime/Enum/ReflectionEnumBackedCase.phpOi;7y-stubs/runtime/Enum/ReflectionEnumUnitCase.phpOi!stubs/runtime/Enum/BackedEnum.php Oi M%stubs/runtime/Enum/ReflectionEnum.phpOimG%stubs/runtime/ReflectionUnionType.phpOiD=%stubs/runtime/ReflectionAttribute.phpOi=",stubs/runtime/ReflectionIntersectionType.phpOi; stubs/typeCheckingFunctions.stub^Oi^U5 ¤stubs/spl.stub/Oi/ %stubs/ReflectionFunctionAbstract.stubOiVcȤ"vendor/evenement/evenement/LICENSE Oi {I=4vendor/evenement/evenement/src/EventEmitterTrait.phpYOiY-/vendor/evenement/evenement/src/EventEmitter.phprOirl8vendor/evenement/evenement/src/EventEmitterInterface.phpOinB̤#vendor/composer/autoload_static.phpNOiN" !vendor/composer/autoload_real.phpOiD5vendor/composer/installed.phpOi({e&vendor/composer/xdebug-handler/LICENSE)Oi)#;^0vendor/composer/xdebug-handler/src/PhpConfig.phpOiMA 4vendor/composer/xdebug-handler/src/XdebugHandler.php}TOi}TF.vendor/composer/xdebug-handler/src/Process.phpn Oin -vendor/composer/xdebug-handler/src/Status.phpeOie* Ѥvendor/composer/ClassLoader.php?Oi?2@uvendor/composer/LICENSE.Oi. #vendor/composer/pcre/extension.neonFOiF(vendor/composer/pcre/LICENSEOihg^*vendor/composer/pcre/src/ReplaceResult.phpOi:6vendor/composer/pcre/src/MatchAllWithOffsetsResult.phpOi* Y7vendor/composer/pcre/src/MatchAllStrictGroupsResult.phpOiOs4vendor/composer/pcre/src/MatchStrictGroupsResult.phpOi3vendor/composer/pcre/src/MatchWithOffsetsResult.phpOi@i*vendor/composer/pcre/src/PcreException.phpOi#+vendor/composer/pcre/src/MatchAllResult.phpOi@3vendor/composer/pcre/src/PHPStan/PregMatchFlags.phpdOidI;Gvendor/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php?Oi?wP<vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php=Oi=/#?vendor/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.phpa Oia aLvendor/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php Oi ]MEvendor/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php Oi (vendor/composer/pcre/src/MatchResult.phpOi-`Ϥ"vendor/composer/pcre/src/Regex.phpOi!vendor/composer/pcre/src/Preg.phpUEOiUE=9vendor/composer/pcre/src/UnexpectedNullMatchException.phpOiӤ!vendor/composer/autoload_psr4.phpOi0_%vendor/composer/autoload_classmap.phpOi?Q%vendor/composer/InstalledVersions.phpCOiC94vendor/jetbrains/phpstorm-stubs/openssl/openssl.stubOiФ:vendor/jetbrains/phpstorm-stubs/LuaSandbox/LuaSandbox.stubEOiE.vendor/jetbrains/phpstorm-stubs/tidy/tidy.stubLOiLדN4vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php" Oi" _*vendor/jetbrains/phpstorm-stubs/pq/pq.stub+Oi+0vendor/jetbrains/phpstorm-stubs/ctype/ctype.stubROiRP8vendor/jetbrains/phpstorm-stubs/mapscript/mapscript.stubOi{|K9vendor/jetbrains/phpstorm-stubs/Zend OPcache/OPcache.stubm Oim Im,vendor/jetbrains/phpstorm-stubs/fpm/fpm.stubOiB:vendor/jetbrains/phpstorm-stubs/couchbase_v2/toplevel.stubWOiWa->;vendor/jetbrains/phpstorm-stubs/couchbase_v2/couchbase.stubOidz >vendor/jetbrains/phpstorm-stubs/ZendDebugger/ZendDebugger.stubOiw!Svendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Consumer.stubWOiW]vendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Metadata/Partition.stubOig^vendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Metadata/Collection.stub Oi Zvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Metadata/Broker.stub9Oi9uo`Yvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Metadata/Topic.stubSOiS\Svendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Metadata.stub9Oi9!aRvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Message.stubOikXvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Configuration.stubxOixռvSvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Producer.stubOiИ^vendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/KafkaErrorException.stubOii',Pvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Topic.stubOi Tvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/Exception.stubdOidYvYvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient/TopicPartition.stub&Oi&>~Jvendor/jetbrains/phpstorm-stubs/simple_kafka_client/SimpleKafkaClient.stubOi!Bvendor/jetbrains/phpstorm-stubs/simple_kafka_client/functions.stubOiBQ?vendor/jetbrains/phpstorm-stubs/meta/attributes/ArrayShape.stubVOiVO7=vendor/jetbrains/phpstorm-stubs/meta/attributes/NoReturn.stubOi4@vendor/jetbrains/phpstorm-stubs/meta/attributes/ObjectShape.stubOik pCvendor/jetbrains/phpstorm-stubs/meta/attributes/ExpectedValues.stubOiђ~Kvendor/jetbrains/phpstorm-stubs/meta/attributes/internal/TentativeType.stubOi()Pvendor/jetbrains/phpstorm-stubs/meta/attributes/internal/ReturnTypeContract.stubhOih< xTvendor/jetbrains/phpstorm-stubs/meta/attributes/internal/LanguageLevelTypeAware.stuboOio%[vendor/jetbrains/phpstorm-stubs/meta/attributes/internal/PhpStormStubsElementAvailable.stubOie3?vendor/jetbrains/phpstorm-stubs/meta/attributes/Deprecated.stubOik^>vendor/jetbrains/phpstorm-stubs/meta/attributes/Immutable.stubOia'=vendor/jetbrains/phpstorm-stubs/meta/attributes/Language.stubOiMJ9vendor/jetbrains/phpstorm-stubs/meta/attributes/Pure.stubOi;Ś8vendor/jetbrains/phpstorm-stubs/interbase/interbase.stubOi4vendor/jetbrains/phpstorm-stubs/sysvshm/sysvshm.stub>Oi> 9vendor/jetbrains/phpstorm-stubs/Parle/LexerException.stubwOiw^Ut1vendor/jetbrains/phpstorm-stubs/Parle/Parser.stub,Oi,1vendor/jetbrains/phpstorm-stubs/Parle/RLexer.stubOi w0vendor/jetbrains/phpstorm-stubs/Parle/Token.stubOiN0vendor/jetbrains/phpstorm-stubs/Parle/Stack.stubAOiA.>o_2vendor/jetbrains/phpstorm-stubs/Parle/RParser.stubOiɥФ0vendor/jetbrains/phpstorm-stubs/Parle/Lexer.stub*Oi*; :vendor/jetbrains/phpstorm-stubs/Parle/ParserException.stubxOixL4vendor/jetbrains/phpstorm-stubs/Parle/ErrorInfo.stubAOiA0vendor/jetbrains/phpstorm-stubs/oauth/oauth.stubb Oib bp,vendor/jetbrains/phpstorm-stubs/xsl/xsl.stub;Oi;$Ȥ0vendor/jetbrains/phpstorm-stubs/event/event.stubOizI6vendor/jetbrains/phpstorm-stubs/fileinfo/fileinfo.stubr!Oir!WY14vendor/jetbrains/phpstorm-stubs/sockets/sockets.stub=Oi=`p8vendor/jetbrains/phpstorm-stubs/zookeeper/zookeeper.stub")Oi") ޛ0vendor/jetbrains/phpstorm-stubs/mysql/mysql.stub|Oi|0{.vendor/jetbrains/phpstorm-stubs/ssh2/ssh2.stubZOiZo<vendor/jetbrains/phpstorm-stubs/elastic_apm/elastic_apm.stub~Oi~2vendor/jetbrains/phpstorm-stubs/bcmath/bcmath.stub#Oi#b8vendor/jetbrains/phpstorm-stubs/xlswriter/xlswriter.stub'>Oi'>@4vendor/jetbrains/phpstorm-stubs/gmagick/gmagick.stubjOijY\ 0vendor/jetbrains/phpstorm-stubs/relay/Relay.stub;Oi;3vendor/jetbrains/phpstorm-stubs/relay/Sentinel.stubOi&vY2vendor/jetbrains/phpstorm-stubs/relay/Cluster.stub?Oi?_p0vendor/jetbrains/phpstorm-stubs/relay/Table.stubrOirGͤ1vendor/jetbrains/phpstorm-stubs/relay/Events.stubOi)4vendor/jetbrains/phpstorm-stubs/relay/Exception.stubcOicr!0vendor/jetbrains/phpstorm-stubs/relay/Event.stubOi,7A2vendor/jetbrains/phpstorm-stubs/relay/KeyType.stubOiۼ8vendor/jetbrains/phpstorm-stubs/aerospike/aerospike.stub24Oi24ٸe4vendor/jetbrains/phpstorm-stubs/aerospike/Bytes.stub Oi ʍ'vendor/jetbrains/phpstorm-stubs/LICENSEW,OiW,M̤8vendor/jetbrains/phpstorm-stubs/couchbase/couchbase.stubOiCƤ8vendor/jetbrains/phpstorm-stubs/memcached/memcached.stubOiH@@vendor/jetbrains/phpstorm-stubs/mosquitto-php/mosquitto-php.stubq5Oiq5H^.vendor/jetbrains/phpstorm-stubs/ldap/ldap.stubOi0vendor/jetbrains/phpstorm-stubs/ldap/Result.stubDOiDvZ5vendor/jetbrains/phpstorm-stubs/ldap/ResultEntry.stubIOiIPx_4vendor/jetbrains/phpstorm-stubs/ldap/Connection.stubHOiH0vendor/jetbrains/phpstorm-stubs/xdiff/xdiff.stub"(Oi"(2vendor/jetbrains/phpstorm-stubs/xcache/xcache.stubOi^)2vendor/jetbrains/phpstorm-stubs/SQLite/SQLite.stublOil L8vendor/jetbrains/phpstorm-stubs/SimpleXML/SimpleXML.stubQLOiQLO2vendor/jetbrains/phpstorm-stubs/recode/recode.stubOiO6vendor/jetbrains/phpstorm-stubs/yaf/yaf_namespace.stub^[Oi^[vD,vendor/jetbrains/phpstorm-stubs/yaf/yaf.stub`Oi`k@vendor/jetbrains/phpstorm-stubs/mysql_xdevapi/mysql_xdevapi.stubOi^,vendor/jetbrains/phpstorm-stubs/yar/yar.stubOiۤ6vendor/jetbrains/phpstorm-stubs/newrelic/newrelic.stubOiϤ2vendor/jetbrains/phpstorm-stubs/libxml/libxml.stub$Oi$V9*vendor/jetbrains/phpstorm-stubs/Ev/Ev.stubOir8vendor/jetbrains/phpstorm-stubs/blackfire/blackfire.stubHOiHZ4?vendor/jetbrains/phpstorm-stubs/superglobals/_superglobals.stubOiFe.vendor/jetbrains/phpstorm-stubs/fann/fann.stubhOiha*.vendor/jetbrains/phpstorm-stubs/uopz/uopz.stub&Oi&-#.vendor/jetbrains/phpstorm-stubs/pcre/pcre.stubzPOizPY.vendor/jetbrains/phpstorm-stubs/oci8/oci8.stuboOioh!p0vendor/jetbrains/phpstorm-stubs/oci8/oci8v3.stubE9OiE9,vendor/jetbrains/phpstorm-stubs/lzf/lzf.stubOiƤ2vendor/jetbrains/phpstorm-stubs/expect/expect.stub Oi I.Ȥ+vendor/jetbrains/phpstorm-stubs/qodana.yaml Oi 'JX;5vendor/jetbrains/phpstorm-stubs/sybase/sybase_ct.stub7Oi7#!.vendor/jetbrains/phpstorm-stubs/dio/dio_d.stubOiC,vendor/jetbrains/phpstorm-stubs/dio/dio.stub%Oi%'&.vendor/jetbrains/phpstorm-stubs/imap/imap.stub;Oi;Е4vendor/jetbrains/phpstorm-stubs/imap/Connection.stubHOiHF?8vendor/jetbrains/phpstorm-stubs/mailparse/mailparse.stubwOiwr0vendor/jetbrains/phpstorm-stubs/posix/posix.stubTkOiTkd 4vendor/jetbrains/phpstorm-stubs/sysvmsg/sysvmsg.stub&Oi&jΤ,vendor/jetbrains/phpstorm-stubs/rrd/rrd.stub0Oi0Τ.vendor/jetbrains/phpstorm-stubs/wddx/wddx.stub Oi [L2vendor/jetbrains/phpstorm-stubs/xdebug/xdebug.stub3Oi3^Ȥ4vendor/jetbrains/phpstorm-stubs/leveldb/LevelDB.stubOi;2vendor/jetbrains/phpstorm-stubs/pdflib/PDFlib.stub/TOi/T5% K.vendor/jetbrains/phpstorm-stubs/zstd/zstd.stubOiLV:vendor/jetbrains/phpstorm-stubs/libsodium/libsodium_f.stubOiړ+:vendor/jetbrains/phpstorm-stubs/libsodium/libsodium_d.stub@Oi@+Ƥ8vendor/jetbrains/phpstorm-stubs/libsodium/libsodium.stube<Oie<`-8vendor/jetbrains/phpstorm-stubs/ZendCache/ZendCache.stub Oi ab2vendor/jetbrains/phpstorm-stubs/mcrypt/mcrypt.stub_Oi_iXV8vendor/jetbrains/phpstorm-stubs/xmlreader/xmlreader.stubsDOisD+{ˤ,vendor/jetbrains/phpstorm-stubs/zip/zip.stub Oi C9,vendor/jetbrains/phpstorm-stubs/ast/ast.stub [Oi [nΤ2vendor/jetbrains/phpstorm-stubs/phpdbg/phpdbg.stubgOigAȾO2vendor/jetbrains/phpstorm-stubs/sodium/sodium.stubOi D.vendor/jetbrains/phpstorm-stubs/v8js/v8js.stubOiU96vendor/jetbrains/phpstorm-stubs/mqseries/mqseries.stubOi1%:vendor/jetbrains/phpstorm-stubs/frankenphp/frankenphp.stubOix8vendor/jetbrains/phpstorm-stubs/xmlwriter/xmlwriter.stubOiO< 4vendor/jetbrains/phpstorm-stubs/suhosin/suhosin.stubOiQ,vendor/jetbrains/phpstorm-stubs/dom/dom.stubyOiy9.vendor/jetbrains/phpstorm-stubs/dom/dom_c.stub_Oi_.vendor/jetbrains/phpstorm-stubs/dom/dom_n.stub Oi ~6vendor/jetbrains/phpstorm-stubs/parallel/parallel.stubOiz>vendor/jetbrains/phpstorm-stubs/parallel/parallel/Runtime.stubOi0ˤMvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Error/Existence.stubfOifRbKvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Error/Timeout.stubdOidJ6Hvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Event/Type.stub.Oi.ϞZ>Ivendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Event/Error.stubPOiPRSvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Input/Error/Existence.stubrOir7oVvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Input/Error/IllegalValue.stubuOiuiIvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Input/Error.stubPOiP?Cvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Error.stubJOiJžCvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Input.stub0Oi0>Cvendor/jetbrains/phpstorm-stubs/parallel/parallel/Events/Event.stubOì8=vendor/jetbrains/phpstorm-stubs/parallel/parallel/Future.stub`Oi`.?DäNvendor/jetbrains/phpstorm-stubs/parallel/parallel/Sync/Error/IllegalValue.stubeOie> wAvendor/jetbrains/phpstorm-stubs/parallel/parallel/Sync/Error.stubHOiHbOvendor/jetbrains/phpstorm-stubs/parallel/parallel/Runtime/Type/Unavailable.stub>Oi>^Tvendor/jetbrains/phpstorm-stubs/parallel/parallel/Runtime/Error/IllegalFunction.stubnOin Nvendor/jetbrains/phpstorm-stubs/parallel/parallel/Runtime/Error/Bootstrap.stubhOihUvendor/jetbrains/phpstorm-stubs/parallel/parallel/Channel.stub(Oi(&Nvendor/jetbrains/phpstorm-stubs/parallel/parallel/Channel/Error/Existence.stubhOihyäQvendor/jetbrains/phpstorm-stubs/parallel/parallel/Channel/Error/IllegalValue.stubkOikKvendor/jetbrains/phpstorm-stubs/parallel/parallel/Channel/Error/Closed.stubeOiez Dvendor/jetbrains/phpstorm-stubs/parallel/parallel/Channel/Error.stubKOiK%=vendor/jetbrains/phpstorm-stubs/parallel/parallel/Events.stub Oi ܤKvendor/jetbrains/phpstorm-stubs/parallel/parallel/Future/Error/Foreign.stub]Oi]}Jvendor/jetbrains/phpstorm-stubs/parallel/parallel/Future/Error/Killed.stub\Oi\< Mvendor/jetbrains/phpstorm-stubs/parallel/parallel/Future/Error/Cancelled.stub_Oi_Cvendor/jetbrains/phpstorm-stubs/parallel/parallel/Future/Error.stubJOiJb<vendor/jetbrains/phpstorm-stubs/parallel/parallel/Error.stub:Oi:{;vendor/jetbrains/phpstorm-stubs/parallel/parallel/Sync.stubOi4R.vendor/jetbrains/phpstorm-stubs/geos/geos.stubAOiAU.vendor/jetbrains/phpstorm-stubs/hash/hash.stubEOiE̠4vendor/jetbrains/phpstorm-stubs/session/session.stubiGOiiGޤ;vendor/jetbrains/phpstorm-stubs/session/SessionHandler.stub[(Oi[(mf2vendor/jetbrains/phpstorm-stubs/cubrid/cubrid.stubtOit ~8vendor/jetbrains/phpstorm-stubs/standard/standard_6.stubOibQ8vendor/jetbrains/phpstorm-stubs/standard/standard_7.stubOi.Ť4vendor/jetbrains/phpstorm-stubs/standard/_types.stubHOiHW9vendor/jetbrains/phpstorm-stubs/standard/standard_10.stubOi@G>vendor/jetbrains/phpstorm-stubs/standard/_standard_manual.stub)Oi)ػD8vendor/jetbrains/phpstorm-stubs/standard/standard_5.stubÄOiÄ 48vendor/jetbrains/phpstorm-stubs/standard/standard_3.stubyyOiyynN6vendor/jetbrains/phpstorm-stubs/standard/password.stub'Oi'Ou8vendor/jetbrains/phpstorm-stubs/standard/standard_0.stub$Oi$>>vendor/jetbrains/phpstorm-stubs/standard/standard_defines.stub Oi ~۞8vendor/jetbrains/phpstorm-stubs/standard/standard_1.stublOilO8vendor/jetbrains/phpstorm-stubs/standard/standard_8.stubOi=N8vendor/jetbrains/phpstorm-stubs/standard/standard_9.stubOi/c;/8vendor/jetbrains/phpstorm-stubs/standard/standard_4.stubOigR8vendor/jetbrains/phpstorm-stubs/standard/standard_2.stub"Oi"-Qʤ3vendor/jetbrains/phpstorm-stubs/standard/basic.stub,Oi,ND4vendor/jetbrains/phpstorm-stubs/sysvsem/sysvsem.stub Oi zX2vendor/jetbrains/phpstorm-stubs/sqlsrv/sqlsrv.stub~Oi~i<vendor/jetbrains/phpstorm-stubs/mongodb/CursorInterface.stubOi Avendor/jetbrains/phpstorm-stubs/mongodb/BSON/MaxKeyInterface.stubOi#;vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Undefined.stubOOiOU:vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Document.stubOihbT:vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Iterator.stubOi :vendor/jetbrains/phpstorm-stubs/mongodb/BSON/ObjectId.stubOitl?6vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Type.stubOi'J-;vendor/jetbrains/phpstorm-stubs/mongodb/BSON/functions.stub^ Oi^ 9Fvendor/jetbrains/phpstorm-stubs/mongodb/BSON/UTCDateTimeInterface.stub+Oi+2,Avendor/jetbrains/phpstorm-stubs/mongodb/BSON/MinKeyInterface.stubOiGu;vendor/jetbrains/phpstorm-stubs/mongodb/BSON/DBPointer.stubOi77vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Regex.stubVOiVukEvendor/jetbrains/phpstorm-stubs/mongodb/BSON/Decimal128Interface.stub8Oi8L=p@vendor/jetbrains/phpstorm-stubs/mongodb/BSON/RegexInterface.stubeOiem;vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Timestamp.stubq Oiq gH<vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Javascript.stubOi#<Ѥ=vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Persistable.stubOi!t@vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Unserializable.stubOi"t_8vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Binary.stub Oi ?8vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Symbol.stub/Oi/RCvendor/jetbrains/phpstorm-stubs/mongodb/BSON/ObjectIdInterface.stubOiC_Evendor/jetbrains/phpstorm-stubs/mongodb/BSON/JavascriptInterface.stubOi]O؇=vendor/jetbrains/phpstorm-stubs/mongodb/BSON/UTCDateTime.stubN OiN d=vendor/jetbrains/phpstorm-stubs/mongodb/BSON/PackedArray.stubOiפ<vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Decimal128.stubOiWϤ8vendor/jetbrains/phpstorm-stubs/mongodb/BSON/MinKey.stubOi 7vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Int64.stubOOiO$Dvendor/jetbrains/phpstorm-stubs/mongodb/BSON/TimestampInterface.stubOiE p>vendor/jetbrains/phpstorm-stubs/mongodb/BSON/Serializable.stubOi@}8vendor/jetbrains/phpstorm-stubs/mongodb/BSON/MaxKey.stubOiWAvendor/jetbrains/phpstorm-stubs/mongodb/BSON/BinaryInterface.stubOi0>F4vendor/jetbrains/phpstorm-stubs/mongodb/Manager.stub*Oi*dk4vendor/jetbrains/phpstorm-stubs/mongodb/Session.stubTOiTڸ7Pvendor/jetbrains/phpstorm-stubs/mongodb/Exception/ExecutionTimeoutException.stubHOiHAEvendor/jetbrains/phpstorm-stubs/mongodb/Exception/LogicException.stubOiZŤLvendor/jetbrains/phpstorm-stubs/mongodb/Exception/WriteConcernException.stubyOiyQvendor/jetbrains/phpstorm-stubs/mongodb/Exception/ConnectionTimeoutException.stubdOid -;Ivendor/jetbrains/phpstorm-stubs/mongodb/Exception/BulkWriteException.stubOiEvendor/jetbrains/phpstorm-stubs/mongodb/Exception/WriteException.stubOiGgNvendor/jetbrains/phpstorm-stubs/mongodb/Exception/AuthenticationException.stub5Oi5KJvendor/jetbrains/phpstorm-stubs/mongodb/Exception/EncryptionException.stub,Oi, 5Mvendor/jetbrains/phpstorm-stubs/mongodb/Exception/SSLConnectionException.stub2Oi2Ovendor/jetbrains/phpstorm-stubs/mongodb/Exception/UnexpectedValueException.stubjOijMmOvendor/jetbrains/phpstorm-stubs/mongodb/Exception/InvalidArgumentException.stubSOiS5k:Gvendor/jetbrains/phpstorm-stubs/mongodb/Exception/CommandException.stub Oi K*Jvendor/jetbrains/phpstorm-stubs/mongodb/Exception/ConnectionException.stubGOiGAl@vendor/jetbrains/phpstorm-stubs/mongodb/Exception/Exception.stub:Oi:MGvendor/jetbrains/phpstorm-stubs/mongodb/Exception/RuntimeException.stubFOiFEFvendor/jetbrains/phpstorm-stubs/mongodb/Exception/ServerException.stubOi`3vendor/jetbrains/phpstorm-stubs/mongodb/Server.stub'Oi';d4vendor/jetbrains/phpstorm-stubs/mongodb/mongodb.stubFOiF.8vendor/jetbrains/phpstorm-stubs/mongodb/WriteResult.stubd Oid ݚ;vendor/jetbrains/phpstorm-stubs/mongodb/ReadPreference.stubDOiDϣ=vendor/jetbrains/phpstorm-stubs/mongodb/ClientEncryption.stubfOif8DZ92vendor/jetbrains/phpstorm-stubs/mongodb/Query.stubOiԶǤ5vendor/jetbrains/phpstorm-stubs/mongodb/CursorId.stubwOiw:?8vendor/jetbrains/phpstorm-stubs/mongodb/ReadConcern.stub Oi w>vendor/jetbrains/phpstorm-stubs/mongodb/ServerDescription.stubOi.>vendor/jetbrains/phpstorm-stubs/mongodb/WriteConcernError.stubOiVZ9vendor/jetbrains/phpstorm-stubs/mongodb/WriteConcern.stubE OiE S6vendor/jetbrains/phpstorm-stubs/mongodb/ServerApi.stubOi֤@vendor/jetbrains/phpstorm-stubs/mongodb/TopologyDescription.stubOi,3vendor/jetbrains/phpstorm-stubs/mongodb/Cursor.stubOiHFvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/SDAMSubscriber.stub Oi ƐKvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/CommandStartedEvent.stubOiTAvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/functions.stubuOiuƽgEvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/LogSubscriber.stubOin̅Rvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/ServerHeartbeatFailedEvent.stub]Oi]5Jvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/ServerChangedEvent.stubOipJvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/ServerOpeningEvent.stubvOiv62Ivendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/CommandSubscriber.stubOi;OIvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/ServerClosedEvent.stubrOir:SBvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/Subscriber.stubOiJvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/CommandFailedEvent.stubOic됒Svendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/ServerHeartbeatStartedEvent.stubxOixxLvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/TopologyOpeningEvent.stubOiYWuUvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/ServerHeartbeatSucceededEvent.stubUOiU2y{Mvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/CommandSucceededEvent.stubOiuKvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/TopologyClosedEvent.stubOi89Lvendor/jetbrains/phpstorm-stubs/mongodb/Monitoring/TopologyChangedEvent.stubOie46vendor/jetbrains/phpstorm-stubs/mongodb/BulkWrite.stub Oi #Z7vendor/jetbrains/phpstorm-stubs/mongodb/WriteError.stub`Oi`__K4vendor/jetbrains/phpstorm-stubs/mongodb/Command.stubOi޾d,vendor/jetbrains/phpstorm-stubs/gmp/gmp.stubuOiuO+vendor/jetbrains/phpstorm-stubs/PATCHES.txtEOiEZΤ,vendor/jetbrains/phpstorm-stubs/eio/eio.stubfyOify2vendor/jetbrains/phpstorm-stubs/filter/filter.stub;Oi;v2֬=vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Consumer.stubOiTY>vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/TopicConf.stub Oi x9vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Conf.stubqOiq8Gvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Metadata/Partition.stubOiHvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Metadata/Collection.stubOiLDvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Metadata/Broker.stubOiIQuRCvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Metadata/Topic.stubOic=vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Metadata.stubOiώGvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/KafkaConsumerTopic.stubOiC٤<vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Message.stubrOirbWBvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/ProducerTopic.stubaOia:vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Queue.stubOihhBvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/KafkaConsumer.stubq Oiq F!=vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Producer.stub9Oi9߲Hvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/KafkaErrorException.stubOiQBvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/ConsumerTopic.stubOi>:vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Topic.stub{Oi{t{=>vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/Exception.stubAOiAD/QCvendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka/TopicPartition.stub!Oi!9<6vendor/jetbrains/phpstorm-stubs/rdkafka/functions.stubOi4vendor/jetbrains/phpstorm-stubs/rdkafka/RdKafka.stubqOiq;Ҥ6vendor/jetbrains/phpstorm-stubs/rdkafka/constants.stub#Oi# ,vendor/jetbrains/phpstorm-stubs/rar/rar.stub_Oi_EQ`.vendor/jetbrains/phpstorm-stubs/odbc/odbc.stubyOiy4vendor/jetbrains/phpstorm-stubs/decimal/decimal.stub<<Oi<<zy<vendor/jetbrains/phpstorm-stubs/libvirt-php/libvirt-php.stub9Oi9:`.vendor/jetbrains/phpstorm-stubs/zlib/zlib.stubKOiKZԤ2vendor/jetbrains/phpstorm-stubs/xmlrpc/xmlrpc.stubOi4vendor/jetbrains/phpstorm-stubs/meminfo/meminfo.stubOirbɤ.vendor/jetbrains/phpstorm-stubs/grpc/grpc.stubYOiYXK٤4vendor/jetbrains/phpstorm-stubs/ncurses/ncurses.stubOi*֩0vendor/jetbrains/phpstorm-stubs/mongo/mongo.stubOi;n6vendor/jetbrains/phpstorm-stubs/mbstring/mbstring.stubOiK MJvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionIntersectionType.stubOi6c8Cvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionReference.stubOi؆5Cvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionNamedType.stubpOip'@vendor/jetbrains/phpstorm-stubs/Reflection/ReflectionMethod.stubU*OiU*Cvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionParameter.stub'Oi'EO@vendor/jetbrains/phpstorm-stubs/Reflection/PropertyHookType.stub3Oi3FBvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionFunction.stubOibBvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionConstant.stubOi|Cvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionUnionType.stub Oi ˜Bvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionProperty.stuba.Oia. -Cvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionAttribute.stubOiז>vendor/jetbrains/phpstorm-stubs/Reflection/ReflectionType.stubOiR@vendor/jetbrains/phpstorm-stubs/Reflection/ReflectionObject.stubOi0:vendor/jetbrains/phpstorm-stubs/Reflection/Reflection.stubOiCCvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionGenerator.stubL OiL +K9vendor/jetbrains/phpstorm-stubs/Reflection/Reflector.stubOiT?vendor/jetbrains/phpstorm-stubs/Reflection/ReflectionClass.stub\Oi\ۆ$Cvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionException.stubOi#5?vendor/jetbrains/phpstorm-stubs/Reflection/ReflectionFiber.stubOi*aCvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionExtension.stub2Oi2~Hvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionEnumBackedCase.stubPOiPgGvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionClassConstant.stub4Oi4|Fvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionEnumUnitCase.stubOiE;>vendor/jetbrains/phpstorm-stubs/Reflection/ReflectionEnum.stubOiNGvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionZendExtension.stub Oi b{`Jvendor/jetbrains/phpstorm-stubs/Reflection/ReflectionFunctionAbstract.stubh(Oih(#,vendor/jetbrains/phpstorm-stubs/FFI/FFI.stubMOiMt4vendor/jetbrains/phpstorm-stubs/sqlite3/sqlite3.stubfOifԽ.vendor/jetbrains/phpstorm-stubs/ming/ming.stubr"Oir"2: ,vendor/jetbrains/phpstorm-stubs/dba/dba.stubE0OiE0Nԣ3vendor/jetbrains/phpstorm-stubs/dba/Connection.stubGOiGo@36vendor/jetbrains/phpstorm-stubs/memcache/memcache.stub$ROi$RU*.vendor/jetbrains/phpstorm-stubs/snmp/snmp.stubOi8vendor/jetbrains/phpstorm-stubs/cassandra/cassandra.stub Oi 3Ԥ2vendor/jetbrains/phpstorm-stubs/xhprof/xhprof.stubOig"դ0vendor/jetbrains/phpstorm-stubs/soap/soap_n.stubOiu.vendor/jetbrains/phpstorm-stubs/soap/soap.stubGOiGZ,vendor/jetbrains/phpstorm-stubs/ftp/ftp.stubiOiiy("3vendor/jetbrains/phpstorm-stubs/ftp/Connection.stubGOiG!>vendor/jetbrains/phpstorm-stubs/win32service/win32service.stubEcOiEcRۤ4vendor/jetbrains/phpstorm-stubs/msgpack/msgpack.stubXOiX2d\0vendor/jetbrains/phpstorm-stubs/shmop/shmop.stubOi2ɤ4vendor/jetbrains/phpstorm-stubs/rpminfo/rpminfo.stub-Oi-2vendor/jetbrains/phpstorm-stubs/crypto/crypto.stub1?Oi1?ګפ4vendor/jetbrains/phpstorm-stubs/gearman/gearman.stubOiଉEvendor/jetbrains/phpstorm-stubs/solr/Documents/SolrDocumentField.stubOi \@vendor/jetbrains/phpstorm-stubs/solr/Documents/SolrDocument.stub/Oi/F&Evendor/jetbrains/phpstorm-stubs/solr/Documents/SolrInputDocument.stub&Oi&?J :vendor/jetbrains/phpstorm-stubs/solr/Utils/SolrObject.stub Oi t 9vendor/jetbrains/phpstorm-stubs/solr/Utils/SolrUtils.stub Oi O4vendor/jetbrains/phpstorm-stubs/solr/SolrClient.stubMOiMC|3vendor/jetbrains/phpstorm-stubs/solr/functions.stubOiAAAvendor/jetbrains/phpstorm-stubs/solr/Queries/SolrDisMaxQuery.stub-Oi-I!Fvendor/jetbrains/phpstorm-stubs/solr/Queries/SolrCollapseFunction.stubOiE <vendor/jetbrains/phpstorm-stubs/solr/Queries/SolrParams.stubOi(DFvendor/jetbrains/phpstorm-stubs/solr/Queries/SolrModifiableParams.stubkOik%;vendor/jetbrains/phpstorm-stubs/solr/Queries/SolrQuery.stubs>Ois>[vendor/jetbrains/phpstorm-stubs/solr/Exceptions/SolrMissingMandatoryParameterException.stubOinRvendor/jetbrains/phpstorm-stubs/solr/Exceptions/SolrIllegalOperationException.stubOi-N%Hvendor/jetbrains/phpstorm-stubs/solr/Exceptions/SolrClientException.stubsOisGPQvendor/jetbrains/phpstorm-stubs/solr/Exceptions/SolrIllegalArgumentException.stubOi)4Bvendor/jetbrains/phpstorm-stubs/solr/Exceptions/SolrException.stubOi&Hvendor/jetbrains/phpstorm-stubs/solr/Exceptions/SolrServerException.stubyOiyC$@vendor/jetbrains/phpstorm-stubs/solr/Responses/SolrResponse.stubOi/I%Fvendor/jetbrains/phpstorm-stubs/solr/Responses/SolrUpdateResponse.stub%Oi%>H٤Evendor/jetbrains/phpstorm-stubs/solr/Responses/SolrQueryResponse.stubOiɤDvendor/jetbrains/phpstorm-stubs/solr/Responses/SolrPingResponse.stubOiޡޤGvendor/jetbrains/phpstorm-stubs/solr/Responses/SolrGenericResponse.stub+Oi+3vendor/jetbrains/phpstorm-stubs/solr/constants.stubDOiD c6vendor/jetbrains/phpstorm-stubs/simdjson/simdjson.stub/Oi/P^/vendor/jetbrains/phpstorm-stubs/http/http3.stub]Oi]<.vendor/jetbrains/phpstorm-stubs/http/http.stubOi0vendor/jetbrains/phpstorm-stubs/stats/stats.stub"HOi"He8vendor/jetbrains/phpstorm-stubs/tokenizer/tokenizer.stubOi&7vendor/jetbrains/phpstorm-stubs/tokenizer/PhpToken.stubOi&0vendor/jetbrains/phpstorm-stubs/gnupg/gnupg.stubZIOiZI 34vendor/jetbrains/phpstorm-stubs/SplType/SplType.stub Oi o2vendor/jetbrains/phpstorm-stubs/mysqli/mysqli.stub2Oi2?6vendor/jetbrains/phpstorm-stubs/calendar/calendar.stub&Oi&fxݤ2vendor/jetbrains/phpstorm-stubs/radius/radius.stubGOiG4g,vendor/jetbrains/phpstorm-stubs/xml/xml.stubZOiZ]!6vendor/jetbrains/phpstorm-stubs/igbinary/igbinary.stubOio/0vendor/jetbrains/phpstorm-stubs/uuid/uuid_c.stub Oi }j2vendor/jetbrains/phpstorm-stubs/random/random.stubOi^5+vendor/jetbrains/phpstorm-stubs/runTests.sh`Oi`Rz10vendor/jetbrains/phpstorm-stubs/date/date_c.stubšOiš?Ao.vendor/jetbrains/phpstorm-stubs/date/date.stub+Oi+s0vendor/jetbrains/phpstorm-stubs/date/date_d.stub"Oi"e*vendor/jetbrains/phpstorm-stubs/gd/gd.stubOi.vendor/jetbrains/phpstorm-stubs/gd/GdFont.stub3Oi3`I=.vendor/jetbrains/phpstorm-stubs/json/json.stub4Oi4tA.vendor/jetbrains/phpstorm-stubs/Phar/Phar.stub(Oi(6KBvendor/jetbrains/phpstorm-stubs/uploadprogress/uploadprogress.stub Oi r݋0vendor/jetbrains/phpstorm-stubs/mssql/mssql.stub6MOi6MW˟5vendor/jetbrains/phpstorm-stubs/swoole/functions.stub8"Oi8"6|@vendor/jetbrains/phpstorm-stubs/swoole/Swoole/ExitException.stub Oi _>vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Http/Server.stub`Oi`Y?vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Http/Request.stubOi],@vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Http/Response.stubOic9vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server.stubq&Oiq&EĤ:vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Runtime.stubOi:vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Process.stubOi8<ڋ>vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Atomic/Long.stubOi8vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Timer.stub{Oi{UBvendor/jetbrains/phpstorm-stubs/swoole/Swoole/WebSocket/Frame.stubOiDGvendor/jetbrains/phpstorm-stubs/swoole/Swoole/WebSocket/CloseFrame.stubOi%Cvendor/jetbrains/phpstorm-stubs/swoole/Swoole/WebSocket/Server.stubOi!Af?vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Process/Pool.stubOiL4!Dvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server/StatusInfo.stubOi.@vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server/Packet.stubOi+Evendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server/PipeMessage.stubOivD>vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server/Port.stubOi_{Dvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server/TaskResult.stubOiK>vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Server/Task.stubOieZSvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine/Http2/Client/Exception.stubxOixP Dvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine/Channel.stubOiOhMvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine/Socket/Exception.stubrOir-| Cvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine/Socket.stubaOiaMCvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine/Client.stubOipծBvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine/Redis.stubmOim%T7vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Lock.stubOi.n?vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Redis/Server.stub Oi ?9vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Atomic.stubOieKͤ@vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Http2/Request.stubOiH1Avendor/jetbrains/phpstorm-stubs/swoole/Swoole/Http2/Response.stubOiiFvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Connection/Iterator.stubOifoƤ8vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Table.stubOiƂwդ9vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Client.stub Oi ѤAvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Timer/Iterator.stubOig8'Cvendor/jetbrains/phpstorm-stubs/swoole/Swoole/Client/Exception.stubhOih;8vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Error.stubROiRT<vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Exception.stubZOiZ8vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Event.stubOiw<vendor/jetbrains/phpstorm-stubs/swoole/Swoole/Coroutine.stubOiNˤ5vendor/jetbrains/phpstorm-stubs/swoole/constants.stubAOiA@y3vendor/jetbrains/phpstorm-stubs/swoole/aliases.stubX OiX ᕤ,vendor/jetbrains/phpstorm-stubs/bz2/bz2.stubqOiq4 .vendor/jetbrains/phpstorm-stubs/curl/curl.stubsOis8vendor/jetbrains/phpstorm-stubs/curl/CURLStringFile.stubOi@b0vendor/jetbrains/phpstorm-stubs/curl/curl_d.stubNOiNr.W?0vendor/jetbrains/phpstorm-stubs/xxtea/xxtea.stubOi$nڤ,vendor/jetbrains/phpstorm-stubs/pam/pam.stubOis]72vendor/jetbrains/phpstorm-stubs/brotli/brotli.stubOip<5ʤ.vendor/jetbrains/phpstorm-stubs/sync/sync.stubi7Oii7VB0vendor/jetbrains/phpstorm-stubs/zend/zend_f.stub.Oi.6x0vendor/jetbrains/phpstorm-stubs/zend/zend_d.stubOi-|j.vendor/jetbrains/phpstorm-stubs/zend/zend.stubXOiXB *vendor/jetbrains/phpstorm-stubs/ds/ds.stubOiRE0vendor/jetbrains/phpstorm-stubs/geoip/geoip.stub$Oi$6;vendor/fidry/cpu-core-counter/src/ParallelisationResult.phpOijn/vendor/fidry/cpu-core-counter/src/Diagnoser.php{Oi{/U4vendor/fidry/cpu-core-counter/src/CpuCoreCounter.php!Oi!!ˤ:vendor/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php Oi +8N?vendor/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.phpMOiMGDvendor/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.phpOi^#9>vendor/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.phpOiG2=vendor/fidry/cpu-core-counter/src/Finder/NProcessorFinder.phpOioC:vendor/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php Oi g<vendor/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.phpvOiv+1>vendor/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.phpOi ŤAvendor/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.phpOiR̤?vendor/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.phpAOiA*Ivendor/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.phpxOixO?vendor/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.phpOi Ф>vendor/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.phpOib@vendor/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php Oi פ>vendor/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.phpOi;vendor/fidry/cpu-core-counter/src/Finder/FinderRegistry.phpOiZ@vendor/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.phpxOix=Avendor/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.phpOi†ĤCvendor/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.phpOiɼ8vendor/fidry/cpu-core-counter/src/Finder/NProcFinder.phpOi ?m=vendor/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.phpzOizhCvendor/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.phpOiz?vendor/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.phpOik>vendor/fidry/cpu-core-counter/src/Executor/ProcessExecutor.phpOih=vendor/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php$Oi$1-vendor/fidry/cpu-core-counter/bin/execute.phpkOik +vendor/fidry/cpu-core-counter/bin/trace.phpBOiBe~(.vendor/fidry/cpu-core-counter/bin/diagnose.phpOi=Ť8vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.phpOi 5vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.phpD OiD CD5vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phphOihyKvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.phptOitkڤMvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php]Oi] Bvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php&Oi&6Dvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.phpOi!FDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.phplOil=*Ivendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.phpOi+/vendor/nikic/php-parser/lib/PhpParser/Lexer.php&[Oi&[=%9vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php"Oi"LQc]vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.phpeOieNeVSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php[Oi[_'Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.phpOiKOvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.phpOi*3Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.phpOipLOvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.phpOi%dWvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.phpOiV&z[vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.phpOipXPvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.phpOi6~%Kvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.phpmOimmzGSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.phpOivendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.phpwOiwp<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.phpOi%6`Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.phpSOiS3ͤ>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.phpOi$<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.phpOi@ˤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php{Oi{:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php~Oi~?(9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php{Oi{~Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.phpOiM :vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php(Oi(93':vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php{Oi{Ly0;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php~Oi~J=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.phpOii$=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.phpOi'(:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.phpNOiNoP:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php{Oi{Y;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php~Oi~4Q<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.phpOiOJ8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php1Oi1k;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php Oi vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php<Oi<8>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.phpJOiJ?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.phpIOiI>lפ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.phpOiճŤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.phpOix ,=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php8Oi8)<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php_Oi_4ACvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.phpOiAʤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.phpOi =;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.phpOiHAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.phpOij77>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.phpOi9>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.phpOi+288vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.phpxOixP<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php0Oi0,fS>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.phpOi l =vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.phpiOiinT<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.phpOip Ф9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.phpOi2?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.phpOikO#ͤ@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.phpOim3?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.phpOi8)J]=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.phpOio=@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.phpOi`̤>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.phpOid?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.phpOi@:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php~Oi~۵@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php3Oi39VDvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php:Oi:Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php7Oi7(Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php=Oi=:Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.phpIOiIK@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php2Oi2̒_Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.phpAOiA(Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.phpBOiBاFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php?Oi? 72Ivendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.phpFOiF1Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php@Oi@.?Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php@Oi@LK Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php:Oi:KGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php@Oi@ݞBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php6Oi6߉Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.phpIOiI#tFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php?Oi?d;xAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php4Oi4~i1@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php2Oi2iaCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php8Oi8"ɼFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php?Oi?эEvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php=Oi=5p6Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php>Oi>Η0Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.phpAOiArL0Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.phpBOiBGpFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php@Oi@@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php2Oi21@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.phpOi|Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.phpOiQ@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.phpOicGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.phpOixGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.phpOi( fBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.phpOiUAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.phpOi B@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.phpOiU#`ɤCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.phpOiFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.phpOiwúFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.phpOi.Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.phpOi7F@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.phpOiǒ߿Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.phpOiDGAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php>Oi>09vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.phpOiIvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.phpOiĤ3vendor/nikic/php-parser/lib/PhpParser/Node/Expr.phpOi:;vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.phpOi{8vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php@Oi@`7vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.phpOij,q=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.phpYOiY28Dvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php=Oi=)GGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.phpFOiF3Evendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php@Oi@g¤Jvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.phpMOiMfAEvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php@Oi@&Q&Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.phpDOiD+0 Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.phpDOiDCKvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.phpPOiPt=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.phpi Oii 1Hvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.phpOi՝>vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.phpOid@vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.phpSOiSix=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.phpOi^TBvendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.phpOi!<vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.phpOiħJ@vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php Oi T.;vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.phpOi,O4vendor/nikic/php-parser/lib/PhpParser/Node/Param.phpsOisbN5vendor/nikic/php-parser/lib/PhpParser/Node/Const_.phpOi<Ѥ?vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.phpOiaD=vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.phpOiUPR8vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.phpOi3vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.phpOiEt12vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php9Oi9[;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.phpOi:9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php\Oi\XEuFvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php Oi !<>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.phpOii9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.phpBOiB~Ȥ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.phpaOia958vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php.Oi.cW:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.phpeOie#>@vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.phpOi )<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.phpOi_:ǤBvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.phpOiץ1;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.phpOi¤?vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.phpxOix5;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php%Oi%ߩ'=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.phpOi$Uq9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.phpOiwC9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.phpOiyh<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php Oi / 8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php\Oi\,:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php5Oi5^?9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.phpOi+<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.phpOi!;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php9Oi9t7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php0Oi0cL :vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.phpOiQvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpJOiJ:`Lvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php1Oi1Q9Dvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.phpOin7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php*Oi*=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.phpOiU;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.phpOiJ}<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php*Oi* =vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php Oi ܄h:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.phpOiF=eL:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.phpOic%:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.phpOi 9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.phpOici<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.phpOiYƤ<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.phpOiQM:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.phprOirŠ=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php Oi >7<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php_Oi_h>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.phpOixR:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.phpOip/7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php2Oi2?>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.phpOiFHod>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.phpOi+[<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.phpwOiw ,>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php Oi GU3vendor/nikic/php-parser/lib/PhpParser/Node/Name.phpOiV55vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phpsOisuQ9vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.phpOim{Bvendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.phpOiE 8vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php%Oi%w=vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.phpOi81vendor/nikic/php-parser/lib/PhpParser/Comment.phpOii@vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.phpOiJ7vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php'Oi'k?vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.phpnOinZAMAvendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php|Oi|.vendor/nikic/php-parser/lib/PhpParser/Node.phpOieȊԤ6vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php2Oi2L>vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php#Oi#*tY ;vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php/Oi/Lvendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.phpzOiz56Z9vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.phpOi'>;7vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpD OiD S1vendor/nikic/php-parser/lib/PhpParser/Builder.phpOi<vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.phpv%Oiv%4vendor/nikic/php-parser/lib/PhpParser/NodeDumper.phpVOiV?vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.phpOi /vendor/nikic/php-parser/lib/PhpParser/Error.phpOi%b&6vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php~Oi~[W{8vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php,Oi,ODvendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.phpbOiba7vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.phpg Oig koä:vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php.Oi.(:vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php<Oi<L6vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.phpOiixL8vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php{Oi{a,;#>vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.phpOi7vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php[Oi[\P5;vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php1Oi1(jL=vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.phpOi?{:vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php/Oi/G8vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.phpOi<vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php Oi w8vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.phpOi6ۤ<vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php%Oi%<vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.phpOiż05vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.phpOiY5vendor/nikic/php-parser/lib/PhpParser/NameContext.php%Oi%|m0vendor/nikic/php-parser/lib/PhpParser/Parser.phpOiC2Ӥvendor/nikic/php-parser/LICENSEOi*vendor/hoa/ustring/Ustring.phpeOie !vendor/hoa/ustring/Bin/Tocode.php Oi #vendor/hoa/ustring/Bin/Fromcode.php Oi ;m-vendor/hoa/ustring/Documentation/Fr/Index.xylEnOiEnFp-vendor/hoa/ustring/Documentation/En/Index.xylhOihvvendor/hoa/ustring/Search.php Oi   vendor/hoa/ustring/Exception.phpOiPRvendor/hoa/regex/Grammar.pp Oi ALvendor/hoa/regex/Exception.phpOi &vendor/hoa/regex/Visitor/Isotropic.php>$Oi>$CId;vendor/hoa/exception/Group.phpZOiZf$ vendor/hoa/exception/PATCHES.txtOi`on"vendor/hoa/exception/Exception.phpO OiO vendor/hoa/exception/Idle.phpOi=vendor/hoa/exception/Error.phpH OiH *b&vendor/hoa/visitor/Visit.phpOi5vendor/hoa/visitor/Element.phpOiebvendor/hoa/file/Link/Link.phpROiRMvendor/hoa/file/Link/Write.phpOiG"vendor/hoa/file/Link/ReadWrite.php"Oi"ͤvendor/hoa/file/Link/Read.phpPOiPX<6'vendor/hoa/file/Exception/Exception.phpOiU墕.vendor/hoa/file/Exception/FileDoesNotExist.phpOiKivendor/hoa/file/Directory.phpOiVvendor/hoa/file/Generic.php44Oi44W\/vendor/hoa/file/Write.phpOi0Mvendor/hoa/file/Finder.php%DOi%Dސvendor/hoa/file/ReadWrite.php"Oi"vendor/hoa/file/File.php%Oi%W vendor/hoa/file/PATCHES.txtOi)vendor/hoa/file/Watcher.phpOiċvvendor/hoa/file/SplFileInfo.php Oi RKvendor/hoa/file/Read.phpAOiA$#vendor/hoa/file/Temporary/Write.phpOiF6'vendor/hoa/file/Temporary/ReadWrite.php"Oi"'vendor/hoa/file/Temporary/Temporary.phpOi09"vendor/hoa/file/Temporary/Read.phpmOim3vendor/hoa/event/Bucket.phpD OiD 4u*vendor/hoa/event/Listenable.phpOiGOvendor/hoa/event/Listens.php Oi #vvendor/hoa/event/Event.phpOiGṳvendor/hoa/event/Exception.phpOi=vendor/hoa/event/Source.php_Oi_vendor/hoa/event/Listener.phpOiݤ"vendor/hoa/consistency/Prelude.phpOiY`i%vendor/hoa/consistency/Autoloader.phpaOia&vendor/hoa/consistency/Consistency.php~ Oi~ J$vendor/hoa/consistency/Xcallable.phpt Oit t"vendor/hoa/consistency/PATCHES.txtOioV?$vendor/hoa/consistency/Exception.phpOimX.vendor/hoa/compiler/Exception/IllegalToken.php Oi EW 'vendor/hoa/compiler/Exception/Lexer.phpOi=vendor/hoa/compiler/Exception/FinalStateHasNotBeenReached.phpOibsϤ+vendor/hoa/compiler/Exception/Exception.php Oi ?1vendor/hoa/compiler/Exception/UnexpectedToken.phpOi/3vendor/hoa/compiler/Exception/UnrecognizedToken.php Oi wؤ&vendor/hoa/compiler/Exception/Rule.phpOi5<@vendor/hoa/compiler/Bin/Pp.phpOi%.vendor/hoa/compiler/Documentation/Fr/Index.xyltOitE.vendor/hoa/compiler/Documentation/En/Index.xylOid/vendor/hoa/compiler/PATCHES.txt;Oi;Ts!vendor/hoa/compiler/Llk/Lexer.phpOi|Ovendor/hoa/compiler/Llk/Llk.pp Oi Gr$vendor/hoa/compiler/Llk/TreeNode.phpOiIC\ۤ5vendor/hoa/compiler/Llk/Sampler/BoundedExhaustive.php&Oi&Uo+vendor/hoa/compiler/Llk/Sampler/Uniform.php"Oi"+vendor/hoa/compiler/Llk/Sampler/Sampler.phpOik<*,vendor/hoa/compiler/Llk/Sampler/Coverage.php{FOi{FCC-vendor/hoa/compiler/Llk/Sampler/Exception.phpOik'vendor/hoa/compiler/Llk/Rule/Choice.phpeOieOᙤ&vendor/hoa/compiler/Llk/Rule/Ekzit.phpoOioV|+vendor/hoa/compiler/Llk/Rule/Repetition.php Oi T1&&vendor/hoa/compiler/Llk/Rule/Entry.phphOih+ͤ.vendor/hoa/compiler/Llk/Rule/Concatenation.phpzOiz_oP&vendor/hoa/compiler/Llk/Rule/Token.php=Oi=i/)vendor/hoa/compiler/Llk/Rule/Analyzer.php"4Oi"4xF%vendor/hoa/compiler/Llk/Rule/Rule.php"Oi"hg7+vendor/hoa/compiler/Llk/Rule/Invocation.phpLOiLᙤvendor/hoa/compiler/Llk/Llk.php.Oi.&"vendor/hoa/compiler/Llk/Parser.php QOi QJ($vendor/hoa/compiler/Visitor/Dump.php? Oi? L护vendor/hoa/compiler/Ll1.php`kOi`k1vendor/hoa/protocol/Wrapper.php&FOi&F[ ZC#vendor/hoa/protocol/Bin/Resolve.phpOiAM!vendor/hoa/protocol/Node/Node.php&Oi&z$vendor/hoa/protocol/Node/Library.php Oi 7 vendor/hoa/protocol/Protocol.phpOiHvendor/hoa/protocol/PATCHES.txtOiP!vendor/hoa/protocol/Exception.phpOi6\&vendor/hoa/zformat/Parameterizable.phpOiKn vendor/hoa/zformat/Parameter.phpGOiG? vendor/hoa/zformat/Exception.phpOiNf"vendor/hoa/iterator/Lookbehind.php4Oi4*4vendor/hoa/iterator/Append.php^Oi^{F+vendor/hoa/iterator/Recursive/Directory.phpOi6FY+vendor/hoa/iterator/Recursive/Recursive.phpOiZr (vendor/hoa/iterator/Recursive/Filter.phpOi҅0vendor/hoa/iterator/Recursive/CallbackFilter.phpOi&vendor/hoa/iterator/Recursive/Mock.phpoOiow*vendor/hoa/iterator/Recursive/Iterator.phpOis3vendor/hoa/iterator/Recursive/RegularExpression.phpOilֲ%vendor/hoa/iterator/Recursive/Map.php|Oi|PX:!vendor/hoa/iterator/Directory.phpOi~!vendor/hoa/iterator/Aggregate.phpvOivˤ vendor/hoa/iterator/NoRewind.phpfOif7Z/} vendor/hoa/iterator/Multiple.php Oi  "vendor/hoa/iterator/FileSystem.php Oi vendor/hoa/iterator/Counter.phpOi6՟vendor/hoa/iterator/Buffer.phpOiMtʤvendor/hoa/iterator/Glob.phpVOiVǻvendor/hoa/iterator/Filter.phpgOigiһ&vendor/hoa/iterator/CallbackFilter.php~Oi~Lvendor/hoa/iterator/Mock.phpXOiX|!!vendor/hoa/iterator/Lookahead.phpqOiq_vendor/hoa/iterator/PATCHES.txtOi2!vendor/hoa/iterator/Exception.phpOi>T vendor/hoa/iterator/Repeater.php5Oi5q)vendor/hoa/iterator/CallbackGenerator.php Oi 6H9%vendor/hoa/iterator/Demultiplexer.phpOi: + vendor/hoa/iterator/Iterator.phpOi" vendor/hoa/iterator/Infinite.phpfOif* vendor/hoa/iterator/Seekable.phpqOiqפvendor/hoa/iterator/Limit.phpZOiZ!x##vendor/hoa/iterator/SplFileInfo.phphOihol)vendor/hoa/iterator/RegularExpression.php!Oi!^Iuvendor/hoa/iterator/Outer.phpfOif񽲤vendor/hoa/iterator/Map.phpVOiVw(vendor/hoa/iterator/IteratorIterator.phpvOiviÃ#vendor/hoa/stream/Bucket.phpOie%vendor/hoa/stream/Wrapper/Wrapper.phpOiLQ/vendor/hoa/stream/Wrapper/IWrapper/IWrapper.phpOi?+vendor/hoa/stream/Wrapper/IWrapper/File.phpOi݉=-vendor/hoa/stream/Wrapper/IWrapper/Stream.php0(Oi0(_S'vendor/hoa/stream/Wrapper/Exception.phpOiXevendor/hoa/stream/Composite.php Oi ¯~vendor/hoa/stream/Context.phpeOielp&vendor/hoa/stream/IStream/Lockable.phph Oih !vendor/hoa/stream/IStream/Out.php Oi ǟΤ(vendor/hoa/stream/IStream/Structural.phpOiq~'vendor/hoa/stream/IStream/Touchable.phpOi-6&vendor/hoa/stream/IStream/Pathable.phpsOisI7 vendor/hoa/stream/IStream/In.phpnOinT (vendor/hoa/stream/IStream/Bufferable.php Oi Yq$vendor/hoa/stream/IStream/Stream.phpOig'vendor/hoa/stream/IStream/Pointable.php Oi gq&vendor/hoa/stream/IStream/Statable.php Oi ivendor/hoa/stream/Stream.phpAOiA]vendor/hoa/stream/PATCHES.txtOiaQvendor/hoa/stream/Exception.phpOie3)vendor/hoa/stream/Filter/LateComputed.phpcOic4G"vendor/hoa/stream/Filter/Basic.phpOix#vendor/hoa/stream/Filter/Filter.phpOiY&:&vendor/hoa/stream/Filter/Exception.phpOi-vendor/hoa/math/Exception/UnknownConstant.phpOiq-vendor/hoa/math/Exception/UnknownFunction.phpOi䒤'vendor/hoa/math/Exception/Exception.phpOi -vendor/hoa/math/Exception/UnknownVariable.phpOi*4vendor/hoa/math/Exception/AlreadyDefinedConstant.phpOi=vendor/hoa/math/Arithmetic.pp Oi ٤vendor/hoa/math/Context.php Oi J/vendor/hoa/math/Bin/Calc.phpOi&~"vendor/hoa/math/Sampler/Random.php Oi P%#vendor/hoa/math/Sampler/Sampler.php!Oi!M3vendor/hoa/math/Combinatorics/Combination/Gamma.php?Oi?ʤ>vendor/hoa/math/Combinatorics/Combination/CartesianProduct.phpOi9vendor/hoa/math/Combinatorics/Combination/Combination.php Oi  K-vendor/hoa/math/Combinatorics/Arrangement.phpOisY7*vendor/hoa/math/Combinatorics/Counting.phpOisY7+vendor/hoa/math/Combinatorics/FiniteSet.phpOisY7-vendor/hoa/math/Combinatorics/Permutation.phpOisY7&vendor/hoa/math/Visitor/Arithmetic.phpG'OiG'-}ڤvendor/hoa/math/Util.phpYOiYc] "vendor/phpstan/php-8-stubs/LICENSE/Oi/#ȤHvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_get_error.stubYOiYiJMvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_set_ordering.stubmOimKvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_list_dicts.stubdOidlSԤCvendor/phpstan/php-8-stubs/stubs/ext/enchant/EnchantDictionary.stub)Oi)u.=^Jvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_free_dict.stubfOif Evendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_free.stubYOiY}Ivendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_describe.stubbOibEvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_init.stub@Oi@:Nvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_set_dict_path.stub{Oi{OPvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_store_replacement.stub~Oi~EJvULvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_dict_exists.stubZOiZG;פGvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_is_added.stub^Oi^8<Mvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_request_dict.stuboOio$_ Qvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_request_pwl_dict.stubxOix{*N7Jvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_quick_check.stubOirAFvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_suggest.stubuOiu4Dvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_check.stub[Oi[uLvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_is_in_session.stubOiTJvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_get_error.stubSOiS;ӤMvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_add_to_session.stubdOidYNvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_broker_get_dict_path.stubuOiux kNvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_add_to_personal.stubOiʹ?vendor/phpstan/php-8-stubs/stubs/ext/enchant/EnchantBroker.stubGOiG!Gvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_describe.stubhOihj}Bvendor/phpstan/php-8-stubs/stubs/ext/enchant/enchant_dict_add.stubYOiY'W\:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lowrite.stub>Oi>ITe=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_num_fields.stubOi Avendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_type_oid.stubOimRkAvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_clientencoding.stub>Oi>b:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_execute.stubOi^w?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_errormessage.stub0Oi0z:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_connect.stubOi9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_loopen.stubOio<>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_last_notice.stubOiWnX9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_insert.stubxOix1(>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_read_all.stubOipH@Avendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_unescape_bytea.stub>Oi>} T>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_array.stubYOiYmyƤ8vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_query.stubCOiC>[:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_untrace.stub/Oi/<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_create.stubhOih8.Bvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_change_password.stubOi-9[:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_numrows.stubOix<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_row.stubSOiSVnBvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_client_encoding.stubOi9 @vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_escape_string.stub2Oi2I?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_prtlen.stubOi'4<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_all.stubOi14>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_assoc.stub)Oi)Dl灤=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_type.stubOiD1;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_last_oid.stubOiSb<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_import.stubOi̮=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_name.stubOia;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_put_line.stubOiƤ7vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_host.stubOiݤpm:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_convert.stubeOie%˯>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_socket_poll.stubOi@{Cvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_connection_reset.stubOiMW;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_end_copy.stubOing9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_update.stubyOiy<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fieldname.stubOit;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_num_rows.stubOi}h76vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_tty.stubOiM ݤ<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_meta_data.stub[Oi[8vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_flush.stubOi'[?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_send_execute.stubOiRHvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_set_chunked_rows_size.stubOij/7vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_exec.stubXOiXR9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_loread.stub"Oi"Bp@vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_result_status.stub Oi 4JEvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_result_memory_size.stubyOiyڤDvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_send_query_params.stub Oi 7/Fvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_set_error_verbosity.stub+Oi+#9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_select.stubOi]KJ<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fieldsize.stubOi8bx:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_get_pid.stubOigr >vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fieldisnull.stubOiy >vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fieldprtlen.stubOi ʤ:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_open.stubOiHT9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_result.stubOi\:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_tell.stubOiN;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_loimport.stubOi` <vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_cmdtuples.stubOi; <vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fieldtype.stubOiv=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_get_notify.stub:Oi:%Bvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_connection_busy.stubOiQ;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lounlink.stubwOiw 7vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_ping.stubOiG;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_pconnect.stubOiBĤDvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_escape_identifier.stubFOiF;l^8vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_trace.stubOi%;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_locreate.stubOi:"?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_send_prepare.stubOi\*@vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_put_copy_data.stubgOigg:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_prepare.stubwOiwt<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_loreadall.stubOie4@vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_affected_rows.stubOih+?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_put_copy_end.stubpOipܳפ@vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_is_null.stubOi6<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/PgSql/Result.stubtOitK}@vendor/phpstan/php-8-stubs/stubs/ext/pgsql/PgSql/Connection.stubxOixZ@ 19vendor/phpstan/php-8-stubs/stubs/ext/pgsql/PgSql/Lob.stubqOiqEvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_transaction_status.stubOi3 =vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_size.stubOi¤>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_result_seek.stubOiƼIFvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_set_client_encoding.stub)Oi)H)=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_send_query.stubOikl:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_copy_to.stubOi@<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_copy_from.stubdOiddSf7vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_port.stubOiƤ;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fieldnum.stubOiogǤ6vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_jit.stubOif?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_result.stubOi.:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_loclose.stubOię@vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_consume_input.stubOiEe:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_read.stubOidO 9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_delete.stub[Oi[H_%?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_escape_bytea.stub0Oi0WmI;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_loexport.stubOivendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_table.stub Oi F:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_options.stubOiwfS;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_write.stubOi uEvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_result_error_field.stub Oi ~Z:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_seek.stubOiW9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_dbname.stubOi)^6?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_cancel_query.stubOi)2T>vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_truncate.stubOi@IOvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_set_error_context_visibility.stubOiz뇤=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_freeresult.stubOiעCvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_parameter_status.stub@Oi@ϧݤ8vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_close.stub)Oi)jIDvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_all_columns.stubOiE?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_query_params.stubOiF;vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_close.stubOiY%$=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_getlastoid.stubOi{ 9vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_socket.stubOiГ<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_numfields.stubOiXDvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_connection_status.stubOiy;<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_unlink.stub-Oi-[VNg=vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_get_result.stubOivendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_free_result.stubOiD?vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_fetch_object.stubiOiip,ؤ:vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_version.stub Oi  !<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_lo_export.stubOiAvendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_escape_literal.stub@Oi@yȤ<vendor/phpstan/php-8-stubs/stubs/ext/pgsql/pg_field_num.stubOi8,Evendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_signal_dispatch.stub2Oi2:"Avendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_sigwaitinfo.stubOi"O@vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wifstopped.stub8Oi8pDvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_getcpuaffinity.stubOiIn>vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wstopsig.stub;Oi; tuCvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_async_signals.stubDOiD>8Avendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wexitstatus.stub>Oi>Ӑ !;vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_rfork.stublOil Bvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_sigtimedwait.stubOiiAvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_setpriority.stubOi9:vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_exec.stub[Oi[ʤAvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_getpriority.stub|Oi|;vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_setns.stubOiG;vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_alarm.stub3Oi3u>Avendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wifsignaled.stub@Oi@Bvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_setqos_class.stubtOitDbBvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_getqos_class.stub|Oi|%;vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_forkx.stub[Oi[1ߤ>vendor/phpstan/php-8-stubs/stubs/ext/pcntl/Pcntl/QosClass.stubOiitV>vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wtermsig.stub;Oi;LQ=vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_unshare.stubHOiHk5>vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_strerror.stubCOiCfVDvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_setcpuaffinity.stubnOin~=ƤBvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wifcontinued.stubQOiQh:vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wait.stubOitM?vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_wifexited.stubEOiE4 5:vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_fork.stubHOiHҤ;vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_errno.stubJOiJ6~Dvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_get_last_error.stub0Oi0h1<vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_signal.stubOi<vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_getcpu.stubYOiY2Hvendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_signal_get_handler.stubVOiV%Avendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_sigprocmask.stubOiv<vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_waitid.stubOiܸ =vendor/phpstan/php-8-stubs/stubs/ext/pcntl/pcntl_waitpid.stubOiAGvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_personal.stubOi0 ۤEvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_clear_session.stubOioΤCvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_repl.stubOi S,Dvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_new_personal.stub|Oi|p|Bvendor/phpstan/php-8-stubs/stubs/ext/pspell/PSpell/Dictionary.stubyOiyS>vendor/phpstan/php-8-stubs/stubs/ext/pspell/PSpell/Config.stubuOiuFFGvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_add_to_personal.stubOiz&y?vendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_suggest.stubOi|=vendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_check.stubOi8ϤGvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_data_dir.stubOij<_Gvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_dict_dir.stubOitXFvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_add_to_session.stubOi(Evendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_save_wordlist.stubOi[WOEvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_create.stub,Oi,(Hvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_save_repl.stubOiFIvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_store_replacement.stubOi;vendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_new.stubhOih?Cvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_mode.stubOiA2aBvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_new_config.stubOiJvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_runtogether.stubOiwEvendor/phpstan/php-8-stubs/stubs/ext/pspell/pspell_config_ignore.stubOi`S Cvendor/phpstan/php-8-stubs/stubs/ext/pdo_firebird/Pdo/Firebird.stubOiA_g1vendor/phpstan/php-8-stubs/stubs/ext/ffi/FFI.stub Oi CgAvendor/phpstan/php-8-stubs/stubs/ext/ffi/FFI/ParserException.stubNOiN2q 07vendor/phpstan/php-8-stubs/stubs/ext/ffi/FFI/CData.stub-Oi-;vendor/phpstan/php-8-stubs/stubs/ext/ffi/FFI/Exception.stub:Oi:ڧ7vendor/phpstan/php-8-stubs/stubs/ext/ffi/FFI/CType.stubF+OiF+xAvendor/phpstan/php-8-stubs/stubs/ext/pdo_pgsql/PDO_PGSql_Ext.stubgOig=vendor/phpstan/php-8-stubs/stubs/ext/pdo_pgsql/Pdo/Pgsql.stub[Oi[}3$=vendor/phpstan/php-8-stubs/stubs/ext/exif/exif_read_data.stubOi~&=vendor/phpstan/php-8-stubs/stubs/ext/exif/exif_thumbnail.stubOi-);vendor/phpstan/php-8-stubs/stubs/ext/exif/exif_tagname.stub]Oi]J)f=vendor/phpstan/php-8-stubs/stubs/ext/exif/exif_imagetype.stub@Oi@vYSvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_callback_handler_remove.stub=Oi=yIvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_clear_history.stub3Oi3$Hvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_read_history.stubQOiQ$7ФGvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_add_history.stub?Oi?fՁ;vendor/phpstan/php-8-stubs/stubs/ext/readline/readline.stubeOie%ؤNvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_callback_read_char.stub8Oi8~qeIvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_write_history.stubKOiK@bREvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_redisplay.stub/Oi/''Ovendor/phpstan/php-8-stubs/stubs/ext/readline/readline_completion_function.stubKOiKqR@vendor/phpstan/php-8-stubs/stubs/ext/readline/readline_info.stubOiGGvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_on_new_line.stubIOiItȸHvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_list_history.stubcOic%Tvendor/phpstan/php-8-stubs/stubs/ext/readline/readline_callback_handler_install.stubOi7#<vendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_strlen.stubxOixBvendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_set_encoding.stubMOiM۱=vendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_strrpos.stubiOiia25vendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv.stubdOidzޱ<vendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_substr.stub{Oi{'6Bvendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_get_encoding.stubhOihW<vendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_strpos.stubyOiy2h*Avendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_mime_encode.stubrOirx Ivendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_mime_decode_headers.stubOiz\믤Avendor/phpstan/php-8-stubs/stubs/ext/iconv/iconv_mime_decode.stubmOim:>vendor/phpstan/php-8-stubs/stubs/ext/intl/intl_is_failure.stub:Oi:{yDvendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle_create.stubOikAvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_is_lenient.stubFOiFsFLqHvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_display_script.stubkOikdkAvendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_str_split.stubfOif-sqAvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_is_weekend.stub`Oi`c)Fvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_timezone_id.stubYOiYkBvendor/phpstan/php-8-stubs/stubs/ext/intl/common/IntlIterator.stubiOiiXAIvendor/phpstan/php-8-stubs/stubs/ext/intl/msgformat/MessageFormatter.stubOiLAvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_iana_id.stub|Oi|`Svendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_skipped_wall_time_option.stubOiJ:vendor/phpstan/php-8-stubs/stubs/ext/intl/idn_to_utf8.stubOiJu@vendor/phpstan/php-8-stubs/stubs/ext/intl/collator/Collator.stubF OiF CT{@vendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_symbol.stub^Oi^ACvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_calendar.stubSOiS{эKvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_id_for_windows_id.stubkOikR-Avendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_locale.stubtOit:LԤ<vendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_create.stubgOigb>vendor/phpstan/php-8-stubs/stubs/ext/intl/intl_error_name.stub<Oi<vz1Avendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_is_lenient.stubLOiLGԤ<vendor/phpstan/php-8-stubs/stubs/ext/intl/locale/Locale.stuboOioAvendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_get_pattern.stubSOiSu@vendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_localtime.stubOieƤ;vendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_parse.stubsOisخ0Cvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_datetype.stubSOiSyKvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_day_of_week_type.stubeOie2?vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_stristr.stubqOiqԺUHvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_error_message.stubUOiUFvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_create_instance.stubOi<|Dvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_get_sort_key.stub[Oi[KTvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_repeated_wall_time_option.stubOi^`l=vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_equals.stubXOiXeWDvendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_format_message.stubhOihCvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_set_calendar.stubpOipW)`Evendor/phpstan/php-8-stubs/stubs/ext/intl/intl_get_error_message.stub5Oi5C;$Lvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_get_error_code.stub^Oi^*`?vendor/phpstan/php-8-stubs/stubs/ext/intl/collator_compare.stubeOie<=RDvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_windows_id.stubnOin{$ŋKvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_transliterate.stubOi!nrCvendor/phpstan/php-8-stubs/stubs/ext/intl/normalizer_normalize.stubxOix'Fvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_display_name.stubiOii8դFvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_get_error_code.stubJOiJ.ȤSvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_skipped_wall_time_option.stubWOiWyMvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_weekend_transition.stubgOigwr=vendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_format.stubOi4<vendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_create.stubzOiz5ڈtGvendor/phpstan/php-8-stubs/stubs/ext/intl/intlgregcal_is_leap_year.stub`Oi`Uvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_minimal_days_in_first_week.stub_Oi_F@Gvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_error_message.stubROiR:vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get.stubPOiP@D Bvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_maximum.stubXOiX{Dvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_time_zone.stubOi Kvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_greatest_minimum.stubaOia1zGvendor/phpstan/php-8-stubs/stubs/ext/intl/normalizer_is_normalized.stubcOic|;vendor/phpstan/php-8-stubs/stubs/ext/intl/locale_parse.stub9Oi9p@vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_strripos.stubdOid='?vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_type.stubFOiF|Fvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_accept_from_http.stubJOiJg׽Avendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle_get.stub2Oi2O>Evendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle_locales.stub_Oi_O_}Gvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_error_message.stubTOiTyCvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_attribute.stubgOig{Cvendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle_count.stubGOiGBvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_minimum.stubXOiXB(Hvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_error_message.stubUOiUDoIvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_actual_maximum.stub_Oi_'zyHvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_set_text_attribute.stubpOipaEvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_from_date_time.stuboOioJKGvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_to_date_time_zone.stub[Oi[}KDvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_get_strength.stubBOiB4[Ivendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_display_variant.stublOil2T[Hvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_create_enumeration.stubOi5Jvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_display_language.stubmOim׫Fvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_list_ids.stubROiR."9Dvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_has_same_rules.stubfOif Cvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_timetype.stubSOiS`PHvendor/phpstan/php-8-stubs/stubs/ext/intl/spoofchecker/Spoofchecker.stubOidaOvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_create_from_rules.stubOiw4=vendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_create.stubcOic/u:vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set.stubOi&ʵCHvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_text_attribute.stubiOii@vendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_offset.stubOiqs(ɤ?vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_extract.stubOi恤@vendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_region.stubHOiHW_̤;vendor/phpstan/php-8-stubs/stubs/ext/intl/idn_to_ascii.stubOi3H<vendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_id.stubIOiIABvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_set_lenient.stub\Oi\n*w@vendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_set_symbol.stubeOie I٤Dvendor/phpstan/php-8-stubs/stubs/ext/intl/normalizer/Normalizer.stub Oi hOvendor/phpstan/php-8-stubs/stubs/ext/intl/intlgregcal_set_gregorian_change.stuboOio<}Jvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_primary_language.stubIOiI@~Uvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_create_time_zone_id_enumeration.stubOi:;vendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_parse.stubOiҤDvendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_get_error_code.stubMOiMwυ@vendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_region.stub?Oi?Gvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_equivalent_id.stub\Oi\5Evendor/phpstan/php-8-stubs/stubs/ext/intl/collator_set_attribute.stub`Oi`Lvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator/Transliterator.stubOiOvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_get_error_message.stubdOid"K@vendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_get_locale.stubLOiL+ >vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_strpos.stubbOib9hⓤOvendor/phpstan/php-8-stubs/stubs/ext/intl/normalizer_get_raw_decomposition.stubOi½Lvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_available_locales.stubROiR*e?Cvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_to_date_time.stubSOiS!=r?vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_time.stubVOiVsEvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_dst_savings.stubIOiICತ<vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_clear.stubOiVʤAvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_pattern.stubROiRKHvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_display_region.stubkOik+_Cvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_set_timezone.stubJOiJ݆Avendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_default.stub>Oi>FPEvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_format_currency.stubwOiwMdIvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_tz_data_version.stub?Oi?KU^>@vendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_script.stub?Oi?Fʿ>vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_substr.stubdOidTvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_keyword_values_for_locale.stubOiOvendor/phpstan/php-8-stubs/stubs/ext/intl/intlgregcal_get_gregorian_change.stub^Oi^dƤ?vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_stripos.stubcOic Dvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_set_strength.stubOiІpIvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_actual_minimum.stub_Oi_%B@Cvendor/phpstan/php-8-stubs/stubs/ext/intl/converter/UConverter.stub(1Oi(1Avendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_set_pattern.stub\Oi\Bvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_canonicalize.stubAOiA::vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_add.stubWOiWy;zCvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_timezone.stub]Oi]^=Jvendor/phpstan/php-8-stubs/stubs/ext/intl/intlgregcal_create_instance.stubOiioMAvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_set_default.stubOi=dDvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_error_code.stubLOiL$Gvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_in_daylight_time.stubLOiLBvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_keywords.stubaOiaϹnDvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_error_code.stubNOiNU<vendor/phpstan/php-8-stubs/stubs/ext/intl/IntlException.stubTOiTc;vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_roll.stubrOirFeGvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_use_daylight_time.stubLOiLҤ>vendor/phpstan/php-8-stubs/stubs/ext/intl/collator_create.stubOOiO `=vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_before.stubXOiX3TKvendor/phpstan/php-8-stubs/stubs/ext/intl/dateformat/IntlDateFormatter.stubOi~a4Rvendor/phpstan/php-8-stubs/stubs/ext/intl/dateformat/IntlDatePatternGenerator.stubNOiNޒ!Gvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_is_equivalent_to.stubbOibqr?vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_strrpos.stubcOicDҤDvendor/phpstan/php-8-stubs/stubs/ext/intl/timezone/IntlTimeZone.stubOiW=vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_is_set.stubNOiNi=<vendor/phpstan/php-8-stubs/stubs/ext/intl/locale_lookup.stubOirqDvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_filter_matches.stubrOir<vendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_parse.stubOi7Lvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_first_day_of_week.stubVOiVPC̤Ivendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_from_date_time_zone.stubXOiXtEAvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_set_pattern.stub[Oi[$դ<vendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_format.stubOiCZCvendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_parse_message.stubOiAHvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_least_maximum.stub^Oi^Rv>vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_strstr.stubpOip(5Tvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_repeated_wall_time_option.stubXOiXBvendor/phpstan/php-8-stubs/stubs/ext/intl/intl_get_error_code.stub<Oi<Q/>vendor/phpstan/php-8-stubs/stubs/ext/intl/grapheme_strlen.stubSOiS 4=vendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_gmt.stub4Oi4Dvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_raw_offset.stubHOiHDHvendor/phpstan/php-8-stubs/stubs/ext/intl/formatter/NumberFormatter.stub\Oi\ҤJvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_calendar_object.stubiOiiV*+}Fvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_canonical_id.stubOi7@vendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_get_locale.stubqOiqJ>vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_now.stub-Oi-Z2<vendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_format.stub]Oi]X/_=vendor/phpstan/php-8-stubs/stubs/ext/intl/collator_asort.stubpOip^RDvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_parse_currency.stubOiˤAvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_unknown.stub8Oi8Gvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_field_difference.stuboOio?Bvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_pattern.stubUOiUSX?vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_time.stubKOiK]Dvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_create_default.stub;Oi;9BEvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_get_attribute.stubYOiY'C $Mvendor/phpstan/php-8-stubs/stubs/ext/intl/calendar/IntlGregorianCalendar.stubOi`TDvendor/phpstan/php-8-stubs/stubs/ext/intl/calendar/IntlCalendar.stubFOiF8+Dvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_create.stubOiw%Bvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_set_pattern.stub^Oi^C-Fvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_get_display_name.stubOihWGvendor/phpstan/php-8-stubs/stubs/ext/intl/msgfmt_get_error_message.stubSOiSVYEvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_error_code.stubOOiO,%室Lvendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle/ResourceBundle.stubhOih+Avendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_locale.stubYOiY Jvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_count_equivalent_ids.stub^Oi^$'Ivendor/phpstan/php-8-stubs/stubs/ext/intl/collator_get_error_message.stubPOiP]#=vendor/phpstan/php-8-stubs/stubs/ext/intl/uchar/IntlChar.stubJOiJD Lvendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle_get_error_code.stubPOiP9e<vendor/phpstan/php-8-stubs/stubs/ext/intl/collator_sort.stuboOioǍFvendor/phpstan/php-8-stubs/stubs/ext/intl/locale_get_all_variants.stubDOiDlKvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_sort_with_sort_keys.stubYOiY$r_Lvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_first_day_of_week.stubOitUvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_minimal_days_in_first_week.stubOiM=Bvendor/phpstan/php-8-stubs/stubs/ext/intl/collator_get_locale.stubTOiT/<Cvendor/phpstan/php-8-stubs/stubs/ext/intl/numfmt_set_attribute.stubnOin XROvendor/phpstan/php-8-stubs/stubs/ext/intl/resourcebundle_get_error_message.stubVOiV6Bvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_set_lenient.stubOi\Dvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_format_object.stubOi2wFvendor/phpstan/php-8-stubs/stubs/ext/intl/intltz_create_time_zone.stubPOiP{ФWvendor/phpstan/php-8-stubs/stubs/ext/intl/breakiterator/IntlCodePointBreakIterator.stubOi?Nvendor/phpstan/php-8-stubs/stubs/ext/intl/breakiterator/IntlBreakIterator.stubLOiLp WqWvendor/phpstan/php-8-stubs/stubs/ext/intl/breakiterator/IntlRuleBasedBreakIterator.stubOif,Nvendor/phpstan/php-8-stubs/stubs/ext/intl/breakiterator/IntlPartsIterator.stub@Oi@m6Dvendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_get_time_zone.stubXOiXC<vendor/phpstan/php-8-stubs/stubs/ext/intl/intlcal_after.stubWOiWULvendor/phpstan/php-8-stubs/stubs/ext/intl/transliterator_create_inverse.stubeOie~1KEvendor/phpstan/php-8-stubs/stubs/ext/intl/datefmt_get_error_code.stubOOiO4.=vendor/phpstan/php-8-stubs/stubs/ext/intl/locale_compose.stubAOiA~`Ф;vendor/phpstan/php-8-stubs/stubs/ext/gettext/dcgettext.stubVOiVr-T;vendor/phpstan/php-8-stubs/stubs/ext/gettext/dngettext.stubOiO9vendor/phpstan/php-8-stubs/stubs/ext/gettext/gettext.stub5Oi5R9ג:vendor/phpstan/php-8-stubs/stubs/ext/gettext/dgettext.stubFOiF;:vendor/phpstan/php-8-stubs/stubs/ext/gettext/ngettext.stubhOihٵ<vendor/phpstan/php-8-stubs/stubs/ext/gettext/dcngettext.stubOi@vendor/phpstan/php-8-stubs/stubs/ext/gettext/bindtextdomain.stubOihIvendor/phpstan/php-8-stubs/stubs/ext/gettext/bind_textdomain_codeset.stubCOiCEމ<vendor/phpstan/php-8-stubs/stubs/ext/gettext/textdomain.stubOiǕ3vendor/phpstan/php-8-stubs/stubs/ext/gettext/_.stubEOiEhﳀ@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_fix.stub8Oi8F?vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_or.stubDOiDSBvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_round.stubJOiJ.Cvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_event_sink.stub{Oi{B0ԅEvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_load_typelib.stub[Oi[g@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_cmp.stubxOix?Avendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_cast.stubIOiI*Evendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_set_type.stubIOiIkjoEvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_message_pump.stubJOiJ@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_eqv.stubEOiE=@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_int.stub8Oi8(?^Hvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_safearray_proxy.stubCOiCj<vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant.stubOi4b@pNvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_date_to_timestamp.stubGOiG뾤@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_cat.stubEOiEj@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_imp.stubEOiE26W@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_mod.stubEOiEYBvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_exception.stub?Oi?Pf8vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com.stubOiKϯ@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_abs.stub8Oi8<դ@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_mul.stubEOiE5[@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_neg.stub8Oi8ox;vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/dotnet.stubOi`*Gvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_print_typeinfo.stubOi?oEvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/COMPersistHelper.stubOi찤@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_not.stub8Oi8FPvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_date_from_timestamp.stubJOiJz@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_pow.stubEOiEWgDvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_create_guid.stub4Oi4\B#Evendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_get_type.stub=Oi=ND@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_xor.stubEOiE؏+@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_sub.stubEOiEAg3@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_div.stubEOiEAvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_idiv.stubFOiFh@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_set.stubiOii @vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_and.stubEOiE{wqJvendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/com_get_active_object.stub\Oi\)ˤ@vendor/phpstan/php-8-stubs/stubs/ext/com_dotnet/variant_add.stubEOiE'Z5Avendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_csr_new.stubOia^ARvendor/phpstan/php-8-stubs/stubs/ext/openssl/OpenSSLCertificateSigningRequest.stub8Oi8wmWBvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_csr_sign.stubOiäOvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs12_export_to_file.stubOi4bFvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs7_verify.stubOiդBvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_new.stubZOiZNHvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_dh_compute_key.stubqOiq 6Evendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_spki_verify.stub<Oi<NJvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_fingerprint.stubOiA>vendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_open.stubOi1̽tJvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cipher_iv_length.stubMOiM~Jvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_get_details.stubmOimDLvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_csr_export_to_file.stubOi;!sMvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_random_pseudo_bytes.stubOi%Kp%Bvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cms_read.stubuOiu(oDvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cms_verify.stub(Oi(ۤAvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_encrypt.stubOilS8@vendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_verify.stubOi8o>vendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_seal.stubOiKJvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_get_private.stubOi*oEvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cms_encrypt.stubVOiV0ΤHvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_get_privatekey.stubOiNdPvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_check_private_key.stubOi LHvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_get_md_methods.stub`Oi` IEvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs12_read.stubOiIvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_private_decrypt.stubOi{Mvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_export_to_file.stubOiC m>vendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_sign.stubOiȤGvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs7_encrypt.stub Oi h+ !@vendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_digest.stubqOiq~ՒBvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cms_sign.stub]Oi]Yh8Cvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_read.stubjOijb({eIvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_password_verify.stubOiB;(Lvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_get_cipher_methods.stubdOid$Evendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_spki_export.stubDOiD]ȤLvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_csr_get_public_key.stubOiOXϤDvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_parse.stubOi%Kvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cipher_key_length.stub_Oi_HFvendor/phpstan/php-8-stubs/stubs/ext/openssl/OpenSSLAsymmetricKey.stub,Oi,{ՔMvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_export_to_file.stubOiw#Cvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_free.stub[Oi[[jGvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_password_hash.stubOilz3Fvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_error_string.stub9Oi97G1Ivendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_get_curve_names.stubjOij⡤Evendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_derive.stubOiIGIvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_csr_get_subject.stubOi+sEvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_export.stubOi[Dvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs7_sign.stubDOiD%Kvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_checkpurpose.stubOiLvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_get_cert_locations.stubOOiO?Gvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_get_publickey.stubOiUDvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_csr_export.stubOiiBvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_free_key.stubzOiz\҅Cvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_free.stubaOia.MIԤDvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs7_read.stubmOimzGvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs12_export.stubOi=IWIvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_get_public.stubOi`@vendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pbkdf2.stubOisHvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_public_decrypt.stubOiBvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_spki_new.stubOi].Avendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_decrypt.stub~Oi~8Dvendor/phpstan/php-8-stubs/stubs/ext/openssl/OpenSSLCertificate.stubLOiLLYZHvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_public_encrypt.stubOi'Evendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_x509_verify.stubOikMEvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkey_export.stubOiOkyIvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_private_encrypt.stubOi ZGvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_pkcs7_decrypt.stubOi.ͤEvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_cms_decrypt.stub4Oi4CzOvendor/phpstan/php-8-stubs/stubs/ext/openssl/openssl_spki_export_challenge.stubNOiNAvendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_repair_string.stubOic 7vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidyNode.stubOiѲޤ>vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_status.stub6Oi6731@vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_parse_string.stubOif*H<vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_is_xhtml.stub5Oi5>0<vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_body.stub;Oi;)>vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_parse_file.stubOi_xN>vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_output.stub9Oi9J<vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_diagnose.stub5Oi5¤@vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_html_ver.stub8Oi8?vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_repair_file.stubOi絲?vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_opt_doc.stubjOij-@vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_access_count.stub8Oi8<vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_html.stub;Oi;g53vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy.stubY OiY q?vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_release.stub/Oi/[6GAvendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_warning_count.stub9Oi9>vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_config.stub?Oi?=:vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_is_xml.stub3Oi3դ@vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_config_count.stub8Oi8ŗ<vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_root.stub;Oi;I@vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_clean_repair.stub9Oi9c]:vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_getopt.stubNOiN\T-?vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_error_count.stub7Oi7Å@Dvendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_error_buffer.stubEOiE&+<vendor/phpstan/php-8-stubs/stubs/ext/tidy/tidy_get_head.stub;Oi;{`;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_punct.stub3Oi3!^;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_print.stub3Oi3Ë&;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_space.stub3Oi36 ;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_alpha.stub3Oi3;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_cntrl.stub3Oi3Ҥ;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_digit.stub3Oi3簤<vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_xdigit.stub4Oi4u;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_lower.stub3Oi3̤;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_graph.stub3Oi3_r;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_upper.stub3Oi3mM;vendor/phpstan/php-8-stubs/stubs/ext/ctype/ctype_alnum.stubUOiU=4c7=vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_put_var.stubVOiV¾=vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_has_var.stubHOiH9<vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_attach.stubnOin I!Bvendor/phpstan/php-8-stubs/stubs/ext/sysvshm/SysvSharedMemory.stubJOiJI_+<vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_remove.stub=Oi=BE<vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_detach.stub=Oi=:Pā=vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_get_var.stubIOiIu@vendor/phpstan/php-8-stubs/stubs/ext/sysvshm/shm_remove_var.stubKOiK)q?vendor/phpstan/php-8-stubs/stubs/ext/pdo_sqlite/Pdo/Sqlite.stubmOim Cvendor/phpstan/php-8-stubs/stubs/ext/pdo_sqlite/PDO_SQLite_Ext.stubOiW;vendor/phpstan/php-8-stubs/stubs/ext/xsl/XSLTProcessor.stubOi_YBvendor/phpstan/php-8-stubs/stubs/ext/fileinfo/finfo_set_flags.stub Oi +6%?vendor/phpstan/php-8-stubs/stubs/ext/fileinfo/finfo_buffer.stubOi6 rH8vendor/phpstan/php-8-stubs/stubs/ext/fileinfo/finfo.stub>Oi> =vendor/phpstan/php-8-stubs/stubs/ext/fileinfo/finfo_open.stubOi<*Dvendor/phpstan/php-8-stubs/stubs/ext/fileinfo/mime_content_type.stubkOik}.=vendor/phpstan/php-8-stubs/stubs/ext/fileinfo/finfo_file.stubOivz>vendor/phpstan/php-8-stubs/stubs/ext/fileinfo/finfo_close.stubOiޠ8;vendor/phpstan/php-8-stubs/stubs/ext/pdo_odbc/Pdo/Odbc.stubBOiBj?vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_select.stubOiZOޤ?vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_setopt.stubOiĉ @vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_recvmsg.stub`Oi`ۓ=vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_recv.stub}Oi}>Bvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_set_block.stub<Oi<vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_write.stub`Oi`)>vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_close.stub8Oi88vendor/phpstan/php-8-stubs/stubs/ext/sockets/Socket.stub@Oi@Ro?vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_sendto.stubOi6qDvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_create_pair.stubOi lHvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_addrinfo_lookup.stubOi\urDvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_clear_error.stubFOiF_{ZCvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_last_error.stubKOiKAvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_shutdown.stubfOifPvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_wsaprotocol_info_import.stubSOiSDvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_getpeername.stubOix=vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_send.stubcOicN.[4Fvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_create_listen.stubOi7=vendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_read.stubiOiiqbFvendor/phpstan/php-8-stubs/stubs/ext/sockets/socket_import_stream.stub`Oi`R7Ť7vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcsqrt.stubDOiD=M6vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcsub.stubROiRrjD>vendor/phpstan/php-8-stubs/stubs/ext/bcmath/BcMath/Number.stub6Oi6]9vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcpowmod.stubiOii"?58vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcfloor.stubUOiU8vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcround.stubOi6vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcadd.stubtOit˯8vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcscale.stub5Oi5<6vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcmul.stubROiRf=7vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcceil.stubTOiT9vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcdivmod.stubOic786vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcpow.stubUOiUzä6vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcdiv.stubROiR 7vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bccomp.stubPOiPt 6vendor/phpstan/php-8-stubs/stubs/ext/bcmath/bcmod.stubROiR5P=vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_start_tls.stubOigBvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_get_values_len.stubmOim.)ͤ:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_rename.stubOi;>vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_next_entry.stubOi$9?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_mod_replace.stubOi=q㧤:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_delete.stubOipQ@vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_exop_refresh.stub)Oi)Cvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_mod_replace_ext.stubAOiA/:vendor/phpstan/php-8-stubs/stubs/ext/ldap/LDAP/Result.stubsOisA7=?vendor/phpstan/php-8-stubs/stubs/ext/ldap/LDAP/ResultEntry.stubxOixoq(>vendor/phpstan/php-8-stubs/stubs/ext/ldap/LDAP/Connection.stubwOiw;ըѤ;vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_add_ext.stub1Oi1)f9vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_close.stubOi6jAvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_count_entries.stubOi7D@vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_parse_result.stubOiXCCvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_first_attribute.stubOi6 Bvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_get_attributes.stub;Oi;\4y?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_t61_to_8859.stubYOiY :vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_search.stubpOipZ[HդCvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_set_rebind_proc.stubOif8vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_read.stubzOiz~3:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_dn2ufn.stub:Oi:bŤ>vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_delete_ext.stubOi~w;vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_compare.stub;Oi;|?٤?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_exop_passwd.stubOi%0<vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_bind_ext.stub[Oi[̖Cvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_parse_reference.stubOiHΤ8vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_exop.stubOiҝT:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_modify.stubGOiGҙ8?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_mod_del_ext.stub9Oi9>vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_rename_ext.stubOi4le;vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_mod_del.stub Oi 6L?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_free_result.stubOiM[:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_escape.stubcOicD[Gt>vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_set_option.stub1Oi1h6MCvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_first_reference.stubOi3>:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_get_dn.stubOi}0?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_first_entry.stubOiS@vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_modify_batch.stub/Oi/g?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_exop_whoami.stubOi*9vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_error.stubOilM;vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_mod_add.stub Oi oQv;vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_connect.stubOiŤBvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_connect_wallet.stubOi5DBvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_next_reference.stubOimy=vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_exop_sync.stubLOiL)/ >vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_get_values.stubOiD`>vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_explode_dn.stubfOif&">vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_parse_exop.stub)Oi)a">vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_get_option.stub1Oi1 0Dvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_count_references.stubOiR';vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_err2str.stub5Oi5:3ސ=vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_sasl_bind.stub!Oi!й?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_mod_add_ext.stub9Oi9}8vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_list.stublOile%8vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_bind.stubOiʸBvendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_next_attribute.stubOi75\<7vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_add.stubOibS:vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_unbind.stubOisɤ9vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_errno.stubOi;?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_get_entries.stub>Oi> (|?vendor/phpstan/php-8-stubs/stubs/ext/ldap/ldap_8859_to_t61.stubBOiB-ARvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_set_external_entity_loader.stubZOiZfrlFvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_get_last_error.stub@Oi@)Rvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_get_external_entity_loader.stubTOiTaABvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_get_errors.stub/Oi/Kvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_use_internal_errors.stubOOiOnu8<vendor/phpstan/php-8-stubs/stubs/ext/libxml/LibXMLError.stub?Oi?Mvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_disable_entity_loader.stub`Oi`Kvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_set_streams_context.stub_Oi_pu+Dvendor/phpstan/php-8-stubs/stubs/ext/libxml/libxml_clear_errors.stub0Oi0'Fvendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_compile_file.stubAOiA:ÑҤGvendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_jit_blacklist.stubTOiTֹKvendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_get_configuration.stubTOiTz?vendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_reset.stubLOiLuJvendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_is_script_cached.stubEOiEd%Dvendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_invalidate.stubTOiT1Dvendor/phpstan/php-8-stubs/stubs/ext/opcache/opcache_get_status.stubiOiiZH"9vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_match.stubOi +9vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_split.stubOi}XBvendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_last_error_msg.stub2Oi2tK=vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_match_all.stubOix^Dvendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_replace_callback.stubOiόѤ9vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_quote.stubOOiO-8vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_grep.stubZOiZJvendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_replace_callback_array.stubOi?3>vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_last_error.stub+Oi+9{j :vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_filter.stubOi`FH;vendor/phpstan/php-8-stubs/stubs/ext/pcre/preg_replace.stubOi<:vendor/phpstan/php-8-stubs/stubs/ext/pdo/PDOException.stubZOiZ44vendor/phpstan/php-8-stubs/stubs/ext/pdo/PDORow.stubOiӪ!21vendor/phpstan/php-8-stubs/stubs/ext/pdo/PDO.stubbZOibZ-09vendor/phpstan/php-8-stubs/stubs/ext/pdo/pdo_drivers.stub@Oi@C:vendor/phpstan/php-8-stubs/stubs/ext/pdo/PDOStatement.stubK OiK xҤ8vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocilogoff.stub|Oi|Ĭ0yHvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_client_identifier.stubwOiwsBvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_size.stubOOiOX>vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_edition.stub;Oi;?r7vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocilogon.stubOi{c2=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_type.stubwOiwGAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_server_version.stubeOieBvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_free_descriptor.stub<Oi<# >vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocidefinebyname.stubOi@vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicollassignelem.stubOi KVAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_free_statement.stub[Oi[+6+8vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicancel.stubzOizV_;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_save.stubTOiTyD*;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_copy.stubXOiXۅњ9vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociloadlob.stubiOii#e=:vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocirowcount.stubOiԧ9vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocisavelob.stubOi%y<@vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociwritelobtofile.stubOiѯ8vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociresult.stubOiM;9vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_result.stubhOihG%Ȥ?vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_fetch_object.stubOiVLWͤ>vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_free_cursor.stubyOiysQ>vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_scale.stubqOiq:vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocirollback.stubOi9vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_commit.stubUOiU&Ф8vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocinlogon.stubOid \Bvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_free_collection.stubJOiJM|y8vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_close.stubUOiU'^N<vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_erase.stubeOie7vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifetch.stubxOixHvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_register_taf_callback.stubyOiyN Evendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_bind_array_by_name.stubOi^$;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_load.stub=Oi=Avendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumnprecision.stubOi/m?vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_truncate.stubJOiJ:vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_connect.stubOib]m9vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicollmax.stubzOiz,?vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifreestatement.stubOie <vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_fetch_all.stubOi(?1?vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocistatementtype.stubOiaÅBvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_client_info.stubwOiwJ8=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_rewind.stub7Oi7T6R=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_new_cursor.stubqOiq ʤAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_type_raw.stubtOit+k?vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_is_equal.stubIOiISYAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_define_by_name.stubOi^٬=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_action.stubiOiiDà֤:vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicollsize.stub|Oi|;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_tell.stub:Oi:yKBvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_precision.stubuOiuڙAvendor/phpstan/php-8-stubs/stubs/ext/oci8/ocigetbufferinglob.stub;Oi;dȤ<vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_fetch_row.stub]Oi]ҺޤAvendor/phpstan/php-8-stubs/stubs/ext/oci8/ocisetbufferinglob.stubGOiGPD0Ф>vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumnisnull.stubOiׄAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_statement_type.stubcOici%HAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_new_collection.stubOi4 >vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_new_connect.stubOiqH>vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_fetch_assoc.stub_Oi_i?vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociserverversion.stubOih=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_import.stubIOiI95֤;vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocinewcursor.stubOitգ=vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocisavelobfile.stubyOiySp<vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocibindbyname.stubOiܸt:vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolltrim.stubOi@vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_is_null.stubnOinJ<vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumntype.stubOiF ;vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifetchinto.stubOi%8vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_error.stubOiYDvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_append.stub[Oi[Bvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_module_name.stublOilog;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_read.stubJOiJ=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_name.stubsOis%ɤ;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_num_rows.stubZOiZ Ƥ@vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifreecollection.stub}Oi}~aLvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_element_assign.stuboOioAÀ@vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifetchstatement.stubOi ex5vendor/phpstan/php-8-stubs/stubs/ext/oci8/OCILob.stub< Oi< ĤCvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_call_timeout.stubmOim2?vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocinewcollection.stubOi=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_num_fields.stubVOiVTw8vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_fetch.stubROiR&դ?vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_prefetch.stubdOidק=vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicollgetelem.stubOi"8vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_parse.stubyOiyä=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_field_size.stubpOipH3ΤAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_new_descriptor.stub|Oi|C"<vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifreecursor.stubOi`Y'Jvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_unregister_taf_callback.stubfOifƤ7vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociparse.stubOiW[=vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumnscale.stubOiEF7vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocierror.stubOi__?vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumntyperaw.stubOiHuä;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_size.stub:Oi:!0:9vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocinumcols.stub~Oi~NY;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_pconnect.stubOi+v:vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_execute.stubwOiwHj<vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumnname.stubOi::vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_eof.stub4Oi4D,n<vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicollappend.stubOi15@vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocipasswordchange.stubOi<vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_flush.stubEOiEţ<vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_write.stub^Oi^8kDvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_assign.stubZOiZIvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_get_implicit_resultset.stub{Oi{9vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_cancel.stubSOiS8vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociplogon.stubOi<Cvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_db_operation.stuboOio,}b?vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocinewdescriptor.stubOiʆHAvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_client_version.stub1Oi1Cvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_set_prefetch_lob.stubOi <?vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_bind_by_name.stubOiZ=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_export.stubsOisH>8vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicommit.stub|Oi|Ҥ<vendor/phpstan/php-8-stubs/stubs/ext/oci8/OCICollection.stubOiqX];vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_seek.stub^Oi^5ݤ>vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_fetch_array.stubOiQBvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_trim.stubTOiT+S=vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocisetprefetch.stubOi9:vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocifreedesc.stubiOiitD(Avendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_max.stubNOiNpo;vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_rollback.stubWOiWUD]=vendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_lob_append.stubEOiEҒ<9vendor/phpstan/php-8-stubs/stubs/ext/oci8/ociexecute.stubOiuBvendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_password_change.stubOiP<vendor/phpstan/php-8-stubs/stubs/ext/oci8/ocicolumnsize.stubOi0Ivendor/phpstan/php-8-stubs/stubs/ext/oci8/oci_collection_element_get.stubpOip >vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_num_recent.stubOiE678vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_scan.stubOOiO^BeM=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_fetchtext.stub-Oi-er:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_search.stub-Oi-R-vendor/phpstan/php-8-stubs/stubs/ext/imap/IMAP/Connection.stubwOiw̑^f:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_qprint.stub>Oi>9vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_close.stub-Oi-J]Avendor/phpstan/php-8-stubs/stubs/ext/imap/imap_deletemailbox.stubOi*ɧ=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_fetchbody.stubOi$7vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_uid.stubOi*8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_lsub.stubOi ݤAvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_get_quotaroot.stubOiž>vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_headerinfo.stubCOiC}V@:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_binary.stub>Oi>s;vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_headers.stubOia :vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_status.stubOi(%2?vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_scanmailbox.stub]Oi]?;vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_timeout.stubQOiQϔnФFvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mime_header_decode.stubPOiPplr=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mail_copy.stubOitBvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_clearflag_full.stubOicڤ9vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_msgno.stubOi^7.:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_thread.stubOivW?vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_utf7_decode.stubCOiCb5Bvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_listsubscribed.stub9Oi9?9::vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_rename.stubOiX֤=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_fetchmime.stubOi":vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_getacl.stubOik?vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_listmailbox.stub3Oi3hk8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_open.stubOiD<vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_listscan.stubOi!Iۤ8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_sort.stub}Oi}-?ܤ:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_delete.stubrOirǖ{=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mail_move.stubOi)Ԥ@vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_setflag_full.stubOiqhABvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_fetch_overview.stubOi+=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_get_quota.stubIOiIR<8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_body.stubOi@vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_getmailboxes.stubOiӤAvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_renamemailbox.stubOi8P8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mail.stubOicp|Avendor/phpstan/php-8-stubs/stubs/ext/imap/imap_createmailbox.stubOi#%Hvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_rfc822_parse_adrlist.stub_Oi_c@vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mail_compose.stubTOiT0:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_reopen.stub Oi 7:o8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_8bit.stub<Oi<W=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_set_quota.stubOiBvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mailboxmsginfo.stubOi28?vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_unsubscribe.stubOi'{J9vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_check.stubOi?8Hvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_rfc822_parse_headers.stubpOipó>vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_last_error.stub4Oi4<vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_savebody.stubuOiuQp<vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_undelete.stubxOix>$:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_errors.stub/Oi/r8vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_ping.stubOiI@@?vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_fetchheader.stubOi>vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_bodystruct.stubOi Z:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_setacl.stubOi9v:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_base64.stub>Oi>T':vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_append.stubUOiU(^:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_alerts.stub/Oi/;vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_num_msg.stubOib16vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_gc.stubOi!װAvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_mutf7_to_utf8.stubEOiE:ܤAvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_utf8_to_mutf7.stub\Oi\h;vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_expunge.stubOiΡAvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_getsubscribed.stubOi?vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_utf7_encode.stub=Oi=N Hvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_rfc822_write_address.stubqOiqٹ=vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_subscribe.stubOi-fBvendor/phpstan/php-8-stubs/stubs/ext/imap/imap_fetchstructure.stub Oi `:vendor/phpstan/php-8-stubs/stubs/ext/imap/imap_create.stubOie6<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_access.stubPOiPi=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_sysconf.stubMOiMX>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getlogin.stubOOiO^dH>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getpwnam.stubYOiYk8P=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getpgid.stubROiR 4e@vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_initgroups.stubcOicYW<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getpid.stub(Oi(!=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_setpgid.stubWOiW%N=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_eaccess.stuboOioTk'<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_setsid.stub;Oi;:|<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getcwd.stub1Oi1I[?vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_fpathconf.stubOi<&?vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getrlimit.stubOi+>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_pathconf.stubmOimLb+<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getsid.stubWOiWxx;vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_uname.stubMOiM"hr?vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_setrlimit.stubxOixhp =vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_ttyname.stubuOiuQ:vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_kill.stubeOien1=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getppid.stub)Oi)֤=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_geteuid.stub)Oi)Pޘ%;vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_errno.stubJOiJǤ>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_strerror.stub<Oi<.<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getuid.stub(Oi(0>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getgrgid.stubVOiV)?vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getgroups.stubgOigfK=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_ctermid.stubFOiFQoM=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_setegid.stubKOiKrK=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_seteuid.stubJOiJwppDvendor/phpstan/php-8-stubs/stubs/ext/posix/posix_get_last_error.stub7Oi7C7<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_isatty.stubeOieN;vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_mknod.stub}Oi}4>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getpwuid.stubUOiU;ߖ<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_setgid.stub6Oi6ht>vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getgrnam.stubUOiU"y=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getegid.stub)Oi)&D<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_mkfifo.stub^Oi^y=vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getpgrp.stub0Oi0x;vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_times.stubFOiF_v<vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_setuid.stub5Oi5><vendor/phpstan/php-8-stubs/stubs/ext/posix/posix_getgid.stub/Oi/fIE?vendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_set_queue.stubOOiOޕ>=vendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_receive.stub"Oi"s-?vendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_get_queue.stub^Oi^+u.:vendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_send.stubOi,Bvendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_queue_exists.stub5Oi5zl@vendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_stat_queue.stubJOiJ~Bvendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/msg_remove_queue.stubEOiEBvendor/phpstan/php-8-stubs/stubs/ext/sysvmsg/SysvMessageQueue.stubJOiJ[6M?vendor/phpstan/php-8-stubs/stubs/ext/spl/DirectoryIterator.stub!Oi!iEC:vendor/phpstan/php-8-stubs/stubs/ext/spl/spl_autoload.stubWOiW5=8vendor/phpstan/php-8-stubs/stubs/ext/spl/class_uses.stubOiC<vendor/phpstan/php-8-stubs/stubs/ext/spl/ParentIterator.stub7Oi7ml;vendor/phpstan/php-8-stubs/stubs/ext/spl/ArrayIterator.stubOiuPFvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveCachingIterator.stubOi):vendor/phpstan/php-8-stubs/stubs/ext/spl/GlobIterator.stubcOic ;vendor/phpstan/php-8-stubs/stubs/ext/spl/SplFixedArray.stubOi}1m?vendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveIterator.stubOiۤ<vendor/phpstan/php-8-stubs/stubs/ext/spl/LogicException.stubcOicU;6vendor/phpstan/php-8-stubs/stubs/ext/spl/SplStack.stub7Oi7>Avendor/phpstan/php-8-stubs/stubs/ext/spl/SplDoublyLinkedList.stubrOir6vendor/phpstan/php-8-stubs/stubs/ext/spl/SplQueue.stubOitVEvendor/phpstan/php-8-stubs/stubs/ext/spl/spl_autoload_unregister.stubFOiFW;vendor/phpstan/php-8-stubs/stubs/ext/spl/class_parents.stubOiLwHMvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveCallbackFilterIterator.stub Oi :ir&9vendor/phpstan/php-8-stubs/stubs/ext/spl/SplFileInfo.stubOiY?vendor/phpstan/php-8-stubs/stubs/ext/spl/SplTempFileObject.stubOihv>vendor/phpstan/php-8-stubs/stubs/ext/spl/SeekableIterator.stubOi֤8vendor/phpstan/php-8-stubs/stubs/ext/spl/SplSubject.stubjOijrϤ?vendor/phpstan/php-8-stubs/stubs/ext/spl/iterator_to_array.stubOi:6YؤBvendor/phpstan/php-8-stubs/stubs/ext/spl/OutOfBoundsException.stubQOiQ$"=vendor/phpstan/php-8-stubs/stubs/ext/spl/DomainException.stubJOiJ|HR;vendor/phpstan/php-8-stubs/stubs/ext/spl/EmptyIterator.stubjOijGځݤ=vendor/phpstan/php-8-stubs/stubs/ext/spl/spl_object_hash.stub<Oi<x~5vendor/phpstan/php-8-stubs/stubs/ext/spl/SplHeap.stubZOiZ4Y`<vendor/phpstan/php-8-stubs/stubs/ext/spl/AppendIterator.stubOiYT>vendor/phpstan/php-8-stubs/stubs/ext/spl/MultipleIterator.stubi Oii cX䌤9vendor/phpstan/php-8-stubs/stubs/ext/spl/ArrayObject.stub]Oi]_>vendor/phpstan/php-8-stubs/stubs/ext/spl/IteratorIterator.stub,Oi,h絤>vendor/phpstan/php-8-stubs/stubs/ext/spl/SplObjectStorage.stubX OiX ɤ>vendor/phpstan/php-8-stubs/stubs/ext/spl/NoRewindIterator.stubOiKm=vendor/phpstan/php-8-stubs/stubs/ext/spl/CachingIterator.stub Oi Evendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveFilterIterator.stubOi;vendor/phpstan/php-8-stubs/stubs/ext/spl/LimitIterator.stubOi>vendor/phpstan/php-8-stubs/stubs/ext/spl/SplPriorityQueue.stub Oi x^=vendor/phpstan/php-8-stubs/stubs/ext/spl/LengthException.stubJOiJ2?Hvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveDirectoryIterator.stubOit6Fvendor/phpstan/php-8-stubs/stubs/ext/spl/UnexpectedValueException.stubUOiUh9vendor/phpstan/php-8-stubs/stubs/ext/spl/SplObserver.stubOiMƵ?vendor/phpstan/php-8-stubs/stubs/ext/spl/OverflowException.stubNOiNƤ?vendor/phpstan/php-8-stubs/stubs/ext/spl/spl_autoload_call.stub;Oi;{ń";vendor/phpstan/php-8-stubs/stubs/ext/spl/OuterIterator.stubOi==8vendor/phpstan/php-8-stubs/stubs/ext/spl/SplMinHeap.stubOi];vendor/phpstan/php-8-stubs/stubs/ext/spl/spl_object_id.stub7Oi7[ 3@vendor/phpstan/php-8-stubs/stubs/ext/spl/FilesystemIterator.stubIOiI$Dvendor/phpstan/php-8-stubs/stubs/ext/spl/CallbackFilterIterator.stubOi Dvendor/phpstan/php-8-stubs/stubs/ext/spl/BadMethodCallException.stub[Oi[&Cvendor/phpstan/php-8-stubs/stubs/ext/spl/spl_autoload_register.stubwOiwn{8vendor/phpstan/php-8-stubs/stubs/ext/spl/SplMaxHeap.stubOiC0Fvendor/phpstan/php-8-stubs/stubs/ext/spl/InvalidArgumentException.stubSOiSW<vendor/phpstan/php-8-stubs/stubs/ext/spl/RangeException.stubKOiK7gͤ<vendor/phpstan/php-8-stubs/stubs/ext/spl/iterator_apply.stubiOii;vendor/phpstan/php-8-stubs/stubs/ext/spl/SplFileObject.stubOizDvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveRegexIterator.stubOi6&Cvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveTreeIterator.stubV OiV 41?Evendor/phpstan/php-8-stubs/stubs/ext/spl/spl_autoload_extensions.stubUOiUc ;vendor/phpstan/php-8-stubs/stubs/ext/spl/RegexIterator.stub Oi 1>vendor/phpstan/php-8-stubs/stubs/ext/spl/class_implements.stubOiqNl@Gvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveIteratorIterator.stub Oi _TqAvendor/phpstan/php-8-stubs/stubs/ext/spl/OutOfRangeException.stubNOiN"8@vendor/phpstan/php-8-stubs/stubs/ext/spl/UnderflowException.stubOOiOA<vendor/phpstan/php-8-stubs/stubs/ext/spl/FilterIterator.stubOiŹ>vendor/phpstan/php-8-stubs/stubs/ext/spl/RuntimeException.stubFOiFGDvendor/phpstan/php-8-stubs/stubs/ext/spl/spl_autoload_functions.stub4Oi4mpi9vendor/phpstan/php-8-stubs/stubs/ext/spl/spl_classes.stub@Oi@n;Dvendor/phpstan/php-8-stubs/stubs/ext/spl/RecursiveArrayIterator.stubqOiqZ)#ޤFvendor/phpstan/php-8-stubs/stubs/ext/spl/BadFunctionCallException.stubSOiS7}Ҥ>vendor/phpstan/php-8-stubs/stubs/ext/spl/InfiniteIterator.stubOi3VH<vendor/phpstan/php-8-stubs/stubs/ext/spl/iterator_count.stubOiS4=vendor/phpstan/php-8-stubs/stubs/ext/xmlreader/XMLReader.stub'Oi't=y6vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_open.stubOiC>6vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_read.stublOilJ=vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_close.stubkOikj5<vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_read.stubOi/8vendor/phpstan/php-8-stubs/stubs/ext/zip/ZipArchive.stubOiFvendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_compressedsize.stubyOiyN<vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_open.stubOiSyIvendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_compressionmethod.stubOi|䆤@vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_filesize.stubsOis yr<vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_entry_name.stubrOirES7vendor/phpstan/php-8-stubs/stubs/ext/zip/zip_close.stubYOiYb$\vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_chacha20poly1305_decrypt.stubOiy'oKvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign_keypair.stub9Oi9ۥ^vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_pwhash_scryptsalsa208sha256_str.stubzOizgUvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_aegis128l_encrypt.stubOiځVvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_stream_xchacha20_xor_ic.stubOi:8Uvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_aes256gcm_decrypt.stubOiཤ;vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_pad.stubHOiHZO[Ivendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kdf_keygen.stub7Oi7IǤVvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_pwhash_str_needs_rehash.stubOiq{WDLvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_stream_keygen.stub:Oi:/sפ;vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_add.stubHOiHE=vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_unpad.stubJOiJBvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_bin2base64.stubmOimfߤTvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_aegis256_decrypt.stubOiZvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_aes256gcm_is_available.stubhOih<bvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_xchacha20poly1305_ietf_decrypt.stubOih\LUvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kx_client_session_keys.stubmOim#,[vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_scalar_sub.stubnOinKm[vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_box_publickey_from_secretkey.stub[Oi[`ȧUvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kx_server_session_keys.stubxOix%d\vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign_publickey_from_secretkey.stub\Oi\(Kvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kx_publickey.stubIOiI7M[Tvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_sub.stubgOigo:[vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_scalarmult_ristretto255_base.stubcOic-ُ~[vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_chacha20poly1305_keygen.stubIOiIm?vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_compare.stubJOiJ(gILvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_box_seal_open.stubdOidgUvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_aes256gcm_encrypt.stubOir^vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_scalar_random.stub]Oi]fzNvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_scalarmult_base.stubOiYL!?vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_bin2hex.stub;Oi;[,gvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_secretstream_xchacha20poly1305_init_push.stub_Oi_7$m%Bvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_base642bin.stub\Oi\GΒGvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_box_open.stubnOin{A^vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_scalar_invert.stubfOifwIvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_stream_xor.stubbOib[Qvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_generichash_update.stubOiVˤHvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_shorthash.stubYOiYxˁHvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign_open.stubfOifY\?vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_hex2bin.stubPOiP$54Mvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_secretbox_open.stuboOio07(Tvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_aegis256_encrypt.stubOimRvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kdf_derive_from_key.stubOi"aΤ>vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_memcmp.stubIOiI+H Vvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_scalarmult_ristretto255.stubOiWhEvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_pwhash.stubOi/Ivendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kx_keypair.stub7Oi7;&avendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_xchacha20poly1305_ietf_keygen.stubOOiO6Hvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_secretbox.stubaOia nVvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_stream_xchacha20_keygen.stubUOiUëCvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign.stubTOiT;Kvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_kx_secretkey.stubIOiIgS}avendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_chacha20poly1305_ietf_decrypt.stubOiTmӤZvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_from_hash.stubbOibฤOvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_box_seed_keypair.stubIOiI]MIvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_pwhash_str.stubeOies Qvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_generichash_keygen.stub?Oi? aOvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_generichash_init.stub|Oi|UD8sLvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_box_secretkey.stubJOiJQZvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_pwhash_scryptsalsa208sha256.stubOio`vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_chacha20poly1305_ietf_keygen.stubNOiNuSvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_stream_xchacha20_xor.stub}Oi}kUbvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_scalar_complement.stubjOijyFMvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign_secretkey.stubKOiK*Ovendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_stream_xchacha20.stubOiz_vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_is_valid_point.stubeOie18Svendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign_verify_detached.stubuOiu"R\vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_sign_ed25519_pk_to_curve25519.stub\Oi\AJvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_generichash.stubOiפLvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_box_publickey.stubJOiJВ3\vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_chacha20poly1305_encrypt.stubOi'vcvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_secretstream_xchacha20poly1305_rekey.stub]Oi] 9bvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_aead_xchacha20poly1305_ietf_encrypt.stubOis^vendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_core_ristretto255_scalar_negate.stubfOifUĤJvendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_auth_verify.stub_Oi_W#@vendor/phpstan/php-8-stubs/stubs/ext/sodium/SodiumException.stub4Oi4\Ovendor/phpstan/php-8-stubs/stubs/ext/sodium/sodium_crypto_shorthash_keygen.stub=Oi=]N̤3vendor/phpstan/php-8-stubs/stubs/ext/phar/Phar.stube+Oie+Vפ<vendor/phpstan/php-8-stubs/stubs/ext/phar/PharException.stubTOiTvO7vendor/phpstan/php-8-stubs/stubs/ext/phar/PharData.stub.(Oi.(2T/;vendor/phpstan/php-8-stubs/stubs/ext/phar/PharFileInfo.stubOi!yiOvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionIntersectionType.stubOioQHvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionReference.stubbOib^8Hvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionNamedType.stubOiLQEvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionMethod.stub Oi 6Hvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionParameter.stub Oi Q*6Evendor/phpstan/php-8-stubs/stubs/ext/reflection/PropertyHookType.stubgOig`פGvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionFunction.stubOiDnGvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionConstant.stubOi$KHvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionUnionType.stuboOioGvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionProperty.stub"Oi"GHvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionAttribute.stubOi:Cvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionType.stubOi9Evendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionObject.stubwOiw?vendor/phpstan/php-8-stubs/stubs/ext/reflection/Reflection.stubOiHvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionGenerator.stubOiQ>vendor/phpstan/php-8-stubs/stubs/ext/reflection/Reflector.stub3Oi3Dvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionClass.stubG$OiG$ҸդHvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionException.stubZOiZ&Dvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionFiber.stubOiHvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionExtension.stubOiT1Mvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionEnumBackedCase.stubOi^hLvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionClassConstant.stub. Oi. I Kvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionEnumUnitCase.stub~Oi~D%Cvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionEnum.stub4Oi4q6ϤLvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionZendExtension.stubOiOvendor/phpstan/php-8-stubs/stubs/ext/reflection/ReflectionFunctionAbstract.stubOi|ҤGvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_dtd.stubOioPvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_attribute_ns.stub~Oi~zFvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_pi.stubbOibVOvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_dtd_attlist.stubiOii"hKvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_element.stubmOimLvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_dtd_entity.stubGOiG&m%Mvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_attribute.stubeOieϤOvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_dtd_element.stubiOii Jvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_document.stubEOiEFkuNvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_dtd_entity.stubfOifd=vendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/XMLWriter.stub:Oi:TX Cvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_flush.stubXOiXnŤGvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_raw.stubSOiSkˤNvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_dtd_entity.stubOitd+ʤMvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_attribute.stubVOiV+$UBvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_text.stubNOiNR=kޤPvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_attribute_ns.stubOiVOvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_set_indent_string.stub_Oi__pOvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_dtd_element.stubaOia&htKvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_attribute.stubFOiF Kvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_element.stubTOiT,dIvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_element.stubDOiD򉯤Lvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_document.stubOi.wӤKvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_output_memory.stub\Oi\<-5Gvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_dtd.stubOixN`Ivendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_cdata.stubUOiUIvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_cdata.stubDOiDQ܋2Ovendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_dtd_attlist.stubXOiXKvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_comment.stubFOiFb~oHvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_set_indent.stubQOiQ bHIvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_comment.stubDOiDVFvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_pi.stubQOiQCEvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_dtd.stub@Oi@U|Nvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_full_end_element.stubIOiI `\Mvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_dtd_element.stubHOiH JHzIvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_open_memory.stub>Oi>۽Kvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_comment.stubWOiWdFvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_open_uri.stubhOihsNvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_start_element_ns.stub|Oi|ǚ>Mvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_dtd_attlist.stubHOiHYJ.Gvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_cdata.stubBOiBW@Dvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_end_pi.stub?Oi?C0Nvendor/phpstan/php-8-stubs/stubs/ext/xmlwriter/xmlwriter_write_element_ns.stubOi#6vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMXPath.stubOiI=vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMNamedNodeMap.stubOi:vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMChildNode.stubIOiIheL:vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMException.stub7Oi7wH@vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMEntityReference.stuboOio*9vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMNotation.stub.Oi.cFvendor/phpstan/php-8-stubs/stubs/ext/dom/DOMProcessingInstruction.stubOiBȤ5vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMNode.stub Oi q'>vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/DocumentType.stub(Oi((y:vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Document.stubOi ={8vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Entity.stub<Oi<}]lBvendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/import_simplexml.stubiOii*E@vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Implementation.stubOi;vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/ChildNode.stubOi Ť?vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/CharacterData.stub+Oi+Avendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/DtdNamedNodeMap.stubUOiUd 6vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Text.stubOiA􆕤>vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/CDATASection.stubQOiQfƤ9vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Comment.stubOiӜ>vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/NamedNodeMap.stub%Oi%C (Avendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/EntityReference.stubTOiTn݁6vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Attr.stub=Oi=e@vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/HTMLCollection.stub7Oi7h+Z?vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/NamespaceInfo.stubCOiC\*xBvendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/AdjacentPosition.stubOiб+:vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/NodeList.stubOi) >vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/HTMLDocument.stubOiq7vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/XPath.stubOi;vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/TokenList.stubOi͵ȤBvendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/DocumentFragment.stubOi\+@m9vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Element.stubOi%ܤ6vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Node.stub'Oi'HRvפ<vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/ParentNode.stubyOiycqGvendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/ProcessingInstruction.stubOiMiH:vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/Notation.stubOigL=vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/HTMLElement.stubSOiSd7z=vendor/phpstan/php-8-stubs/stubs/ext/dom/Dom/XMLDocument.stubOiR?vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMImplementation.stub.Oi. Z>vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMNameSpaceNode.stubOiPHۤ9vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMNodeList.stubCOiCGQ8vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMComment.stubuOiup=15vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMText.stubOi8葰=vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMCdataSection.stublOil =vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMDocumentType.stubTOiToW=9vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMDocument.stubOi㖑5vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMAttr.stubOiAvendor/phpstan/php-8-stubs/stubs/ext/dom/DOMDocumentFragment.stub7Oi7 Τ7vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMEntity.stub,Oi,v8vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMElement.stubOis>vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMCharacterData.stub$Oi$!2Bvendor/phpstan/php-8-stubs/stubs/ext/dom/dom_import_simplexml.stubKOiKE;vendor/phpstan/php-8-stubs/stubs/ext/dom/DOMParentNode.stubAOiA:vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_equals.stubQOiQݍ9vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_final.stubTOiT+i4vendor/phpstan/php-8-stubs/stubs/ext/hash/mhash.stubVOiV `9vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_algos.stubUOiU78vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_copy.stubCOiCjAvendor/phpstan/php-8-stubs/stubs/ext/hash/hash_update_stream.stub}Oi}WZ3vendor/phpstan/php-8-stubs/stubs/ext/hash/hash.stub*Oi*N:vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_pbkdf2.stub_Oi_DѤBvendor/phpstan/php-8-stubs/stubs/ext/hash/mhash_get_hash_name.stubAOiA3n8vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_hkdf.stubxOix>vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_hmac_algos.stubZOiZMU8vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_file.stubOiT58vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_init.stubOiP8?vendor/phpstan/php-8-stubs/stubs/ext/hash/mhash_keygen_s2k.stubkOikڣ?vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_update_file.stubOi\:vendor/phpstan/php-8-stubs/stubs/ext/hash/HashContext.stubOi :vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_update.stubOid8=vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_hmac_file.stubtOitm:vendor/phpstan/php-8-stubs/stubs/ext/hash/mhash_count.stub'Oi'v Cvendor/phpstan/php-8-stubs/stubs/ext/hash/mhash_get_block_size.stubSOiSx8vendor/phpstan/php-8-stubs/stubs/ext/hash/hash_hmac.stubeOieZ饤Hvendor/phpstan/php-8-stubs/stubs/ext/simplexml/simplexml_import_dom.stub#Oi#u֤Dvendor/phpstan/php-8-stubs/stubs/ext/simplexml/SimpleXMLElement.stub Oi Gvendor/phpstan/php-8-stubs/stubs/ext/simplexml/simplexml_load_file.stubOiIvendor/phpstan/php-8-stubs/stubs/ext/simplexml/simplexml_load_string.stubOis,Evendor/phpstan/php-8-stubs/stubs/ext/simplexml/SimpleXMLIterator.stub=Oi= Cvendor/phpstan/php-8-stubs/stubs/ext/session/session_create_id.stubIOiI)iKvendor/phpstan/php-8-stubs/stubs/ext/session/session_set_cookie_params.stubOi4?vendor/phpstan/php-8-stubs/stubs/ext/session/session_abort.stub*Oi*]ĤKvendor/phpstan/php-8-stubs/stubs/ext/session/session_register_shutdown.stub6Oi6KS@vendor/phpstan/php-8-stubs/stubs/ext/session/session_status.stub*Oi*Qe?vendor/phpstan/php-8-stubs/stubs/ext/session/session_unset.stub*Oi* P%Dvendor/phpstan/php-8-stubs/stubs/ext/session/SessionIdInterface.stubOibᣤEvendor/phpstan/php-8-stubs/stubs/ext/session/session_module_name.stubNOiNrQCvendor/phpstan/php-8-stubs/stubs/ext/session/session_save_path.stubJOiJ.ZIvendor/phpstan/php-8-stubs/stubs/ext/session/SessionHandlerInterface.stubOi&)Kvendor/phpstan/php-8-stubs/stubs/ext/session/session_get_cookie_params.stubNOiN:\aJvendor/phpstan/php-8-stubs/stubs/ext/session/session_set_save_handler.stubOi_ӤEvendor/phpstan/php-8-stubs/stubs/ext/session/session_write_close.stub0Oi0H8@vendor/phpstan/php-8-stubs/stubs/ext/session/session_encode.stub3Oi3 o4?vendor/phpstan/php-8-stubs/stubs/ext/session/session_start.stub=Oi=1TAvendor/phpstan/php-8-stubs/stubs/ext/session/session_destroy.stub,Oi,NGvendor/phpstan/php-8-stubs/stubs/ext/session/session_cache_limiter.stubOOiOV>vendor/phpstan/php-8-stubs/stubs/ext/session/session_name.stubgOigC;<vendor/phpstan/php-8-stubs/stubs/ext/session/session_id.stubAOiA󁬤@vendor/phpstan/php-8-stubs/stubs/ext/session/session_decode.stub7Oi7쭤Fvendor/phpstan/php-8-stubs/stubs/ext/session/session_cache_expire.stubHOiHGvendor/phpstan/php-8-stubs/stubs/ext/session/session_regenerate_id.stubROiRMchXvendor/phpstan/php-8-stubs/stubs/ext/session/SessionUpdateTimestampHandlerInterface.stub+Oi+B@vendor/phpstan/php-8-stubs/stubs/ext/session/session_commit.stubMOiMn =<vendor/phpstan/php-8-stubs/stubs/ext/session/session_gc.stub,Oi,?vendor/phpstan/php-8-stubs/stubs/ext/session/session_reset.stub*Oi*l@vendor/phpstan/php-8-stubs/stubs/ext/session/SessionHandler.stubOi6vendor/phpstan/php-8-stubs/stubs/ext/standard/end.stub5Oi5e:vendor/phpstan/php-8-stubs/stubs/ext/standard/deg2rad.stub/Oi/C~9vendor/phpstan/php-8-stubs/stubs/ext/standard/krsort.stubOibK;vendor/phpstan/php-8-stubs/stubs/ext/standard/filetype.stub=Oi=L6vendor/phpstan/php-8-stubs/stubs/ext/standard/min.stub?Oi?ԤAvendor/phpstan/php-8-stubs/stubs/ext/standard/array_find_key.stub]Oi]x#;vendor/phpstan/php-8-stubs/stubs/ext/standard/is_float.stub1Oi1ʛ7vendor/phpstan/php-8-stubs/stubs/ext/standard/ceil.stub0Oi0R>@vendor/phpstan/php-8-stubs/stubs/ext/standard/array_product.stub;Oi;q-9vendor/phpstan/php-8-stubs/stubs/ext/standard/header.stubpOip7^Lvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_set_option.stubOiK Avendor/phpstan/php-8-stubs/stubs/ext/standard/AssertionError.stub@Oi@6¤Jvendor/phpstan/php-8-stubs/stubs/ext/standard/memory_reset_peak_usage.stubEOiE4?8vendor/phpstan/php-8-stubs/stubs/ext/standard/crypt.stubNOiN7;vendor/phpstan/php-8-stubs/stubs/ext/standard/in_array.stubYOiY(1äJvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_wrapper_register.stubOiK$>vendor/phpstan/php-8-stubs/stubs/ext/standard/array_merge.stub9Oi9dEvendor/phpstan/php-8-stubs/stubs/ext/standard/move_uploaded_file.stubGOiGU*@vendor/phpstan/php-8-stubs/stubs/ext/standard/base64_encode.stubIOiI<vendor/phpstan/php-8-stubs/stubs/ext/standard/filectime.stub;Oi;38vendor/phpstan/php-8-stubs/stubs/ext/standard/popen.stubWOiWo.=vendor/phpstan/php-8-stubs/stubs/ext/standard/key_exists.stubvOiv@);9vendor/phpstan/php-8-stubs/stubs/ext/standard/strpos.stubYOiYO?<vendor/phpstan/php-8-stubs/stubs/ext/standard/lcg_value.stub3Oi3r*;vendor/phpstan/php-8-stubs/stubs/ext/standard/readlink.stubvOivHP=vendor/phpstan/php-8-stubs/stubs/ext/standard/dns_get_mx.stubOi%<vendor/phpstan/php-8-stubs/stubs/ext/standard/inet_ntop.stubUOiUYt٤:vendor/phpstan/php-8-stubs/stubs/ext/standard/implode.stubSOiSq?V9vendor/phpstan/php-8-stubs/stubs/ext/standard/strspn.stubjOijx>vendor/phpstan/php-8-stubs/stubs/ext/standard/count_chars.stubzOiz7n7vendor/phpstan/php-8-stubs/stubs/ext/standard/glob.stuboOioѤGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_filter_remove.stubeOie8m%Bvendor/phpstan/php-8-stubs/stubs/ext/standard/ob_get_contents.stub4Oi4 p>R>vendor/phpstan/php-8-stubs/stubs/ext/standard/str_replace.stubOi9vendor/phpstan/php-8-stubs/stubs/ext/standard/hebrev.stubPOiPJ=I>vendor/phpstan/php-8-stubs/stubs/ext/standard/ini_get_all.stubuOiṳMvendor/phpstan/php-8-stubs/stubs/ext/standard/register_shutdown_function.stubOiJK?vendor/phpstan/php-8-stubs/stubs/ext/standard/str_ireplace.stubOiY9?vendor/phpstan/php-8-stubs/stubs/ext/standard/htmlentities.stub]Oi]Ri~?vendor/phpstan/php-8-stubs/stubs/ext/standard/setrawcookie.stubOi$؃9vendor/phpstan/php-8-stubs/stubs/ext/standard/syslog.stubOix>vendor/phpstan/php-8-stubs/stubs/ext/standard/array_slice.stubtOitAvendor/phpstan/php-8-stubs/stubs/ext/standard/substr_replace.stubOi[[;vendor/phpstan/php-8-stubs/stubs/ext/standard/basename.stubHOiH]aפCvendor/phpstan/php-8-stubs/stubs/ext/standard/dns_check_record.stubOiAvendor/phpstan/php-8-stubs/stubs/ext/standard/str_word_count.stubOiw}Cvendor/phpstan/php-8-stubs/stubs/ext/standard/array_uintersect.stubgOigVś>vendor/phpstan/php-8-stubs/stubs/ext/standard/utf8_decode.stub8Oi8{,=vendor/phpstan/php-8-stubs/stubs/ext/standard/strip_tags.stub_Oi_fAvendor/phpstan/php-8-stubs/stubs/ext/standard/get_debug_type.stub9Oi91&DJvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_set_write_buffer.stubdOidCvendor/phpstan/php-8-stubs/stubs/ext/standard/convert_uuencode.stubNOiN~?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_unique.stubPOiP|3JFvendor/phpstan/php-8-stubs/stubs/ext/standard/array_intersect_key.stubOOiO 釤Avendor/phpstan/php-8-stubs/stubs/ext/standard/call_user_func.stubNOiN>vendor/phpstan/php-8-stubs/stubs/ext/standard/nl_langinfo.stubNOiNvendor/phpstan/php-8-stubs/stubs/ext/standard/gethostname.stub[Oi[1)9vendor/phpstan/php-8-stubs/stubs/ext/standard/fclose.stubIOiIp|@vendor/phpstan/php-8-stubs/stubs/ext/standard/array_combine.stubEOiEc`Dvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_bucket_new.stubOi6놞:vendor/phpstan/php-8-stubs/stubs/ext/standard/openlog.stubOi&r`>vendor/phpstan/php-8-stubs/stubs/ext/standard/get_browser.stubOi/.Fvendor/phpstan/php-8-stubs/stubs/ext/standard/forward_static_call.stubSOiS6vendor/phpstan/php-8-stubs/stubs/ext/standard/ord.stub0Oi02a/9vendor/phpstan/php-8-stubs/stubs/ext/standard/pclose.stubHOiH=t<vendor/phpstan/php-8-stubs/stubs/ext/standard/Directory.stubOitw]<vendor/phpstan/php-8-stubs/stubs/ext/standard/inet_pton.stubUOiUɔ>vendor/phpstan/php-8-stubs/stubs/ext/standard/array_shift.stub6Oi60S:vendor/phpstan/php-8-stubs/stubs/ext/standard/ini_set.stubOiP;vendor/phpstan/php-8-stubs/stubs/ext/standard/readfile.stubOi:vendor/phpstan/php-8-stubs/stubs/ext/standard/opendir.stubOi#`r8vendor/phpstan/php-8-stubs/stubs/ext/standard/expm1.stub-Oi-Bf=vendor/phpstan/php-8-stubs/stubs/ext/standard/checkdnsrr.stubkOikHvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_create.stubqOiqR5R:vendor/phpstan/php-8-stubs/stubs/ext/standard/fputcsv.stubOi^@";vendor/phpstan/php-8-stubs/stubs/ext/standard/closelog.stubeOieI:vendor/phpstan/php-8-stubs/stubs/ext/standard/mt_rand.stubIOiI:8vendor/phpstan/php-8-stubs/stubs/ext/standard/flush.stub"Oi"E@vendor/phpstan/php-8-stubs/stubs/ext/standard/getservbyname.stubgOigAvendor/phpstan/php-8-stubs/stubs/ext/standard/password_algos.stub,Oi,פ8vendor/phpstan/php-8-stubs/stubs/ext/standard/log10.stub-Oi-nɤBvendor/phpstan/php-8-stubs/stubs/ext/standard/str_starts_with.stubLOiLY6vendor/phpstan/php-8-stubs/stubs/ext/standard/max.stub?Oi?<vendor/phpstan/php-8-stubs/stubs/ext/standard/is_double.stubIOiI8vendor/phpstan/php-8-stubs/stubs/ext/standard/ltrim.stubXOiX;-Lvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_get_params.stubrOirtDvendor/phpstan/php-8-stubs/stubs/ext/standard/socket_get_status.stubxOixդ>vendor/phpstan/php-8-stubs/stubs/ext/standard/unserialize.stubJOiJɒ;vendor/phpstan/php-8-stubs/stubs/ext/standard/constant.stubJOiJk,@vendor/phpstan/php-8-stubs/stubs/ext/standard/str_decrement.stubKOiKzR8vendor/phpstan/php-8-stubs/stubs/ext/standard/srand.stubOiv N?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_search.stubiOiiaiIvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_set_read_buffer.stubcOicmAvendor/phpstan/php-8-stubs/stubs/ext/standard/substr_compare.stubOiИGAvendor/phpstan/php-8-stubs/stubs/ext/standard/clearstatcache.stubkOik?8vendor/phpstan/php-8-stubs/stubs/ext/standard/strtr.stubZOiZ<8vendor/phpstan/php-8-stubs/stubs/ext/standard/usort.stubOi6vendor/phpstan/php-8-stubs/stubs/ext/standard/sin.stub+Oi+֊Evendor/phpstan/php-8-stubs/stubs/ext/standard/connection_aborted.stub.Oi.77vendor/phpstan/php-8-stubs/stubs/ext/standard/atan.stub,Oi,ͤ:vendor/phpstan/php-8-stubs/stubs/ext/standard/settype.stub=Oi==vendor/phpstan/php-8-stubs/stubs/ext/standard/array_flip.stubaOia%菤Hvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_set_chunk_size.stubiOii@)Ivendor/phpstan/php-8-stubs/stubs/ext/standard/array_intersect_uassoc.stubmOim=:|Ivendor/phpstan/php-8-stubs/stubs/ext/standard/__PHP_Incomplete_Class.stub^Oi^LG8HGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_supports_lock.stubWOiWx ĤIvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_filter_register.stubUOiU-nJvendor/phpstan/php-8-stubs/stubs/ext/standard/image_type_to_extension.stubeOiecIvendor/phpstan/php-8-stubs/stubs/ext/standard/register_tick_function.stub\Oi\n(6vendor/phpstan/php-8-stubs/stubs/ext/standard/md5.stubROiR)Fvendor/phpstan/php-8-stubs/stubs/ext/standard/realpath_cache_size.stub/Oi/zl7vendor/phpstan/php-8-stubs/stubs/ext/standard/ftok.stubfOif/'6vendor/phpstan/php-8-stubs/stubs/ext/standard/pos.stubJOiJ9vendor/phpstan/php-8-stubs/stubs/ext/standard/uksort.stubOiDĄ@vendor/phpstan/php-8-stubs/stubs/ext/standard/header_remove.stub>Oi>}<vendor/phpstan/php-8-stubs/stubs/ext/standard/parse_str.stubZOiZȇPIIvendor/phpstan/php-8-stubs/stubs/ext/standard/array_uintersect_assoc.stubmOimM)w:vendor/phpstan/php-8-stubs/stubs/ext/standard/dirname.stubCOiC!jФCvendor/phpstan/php-8-stubs/stubs/ext/standard/get_include_path.stub5Oi5ha8vendor/phpstan/php-8-stubs/stubs/ext/standard/fopen.stubOi;vendor/phpstan/php-8-stubs/stubs/ext/standard/linkinfo.stub6Oi6ݍIvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_shutdown.stubyOiy" >vendor/phpstan/php-8-stubs/stubs/ext/standard/is_readable.stub8Oi8[Kz=vendor/phpstan/php-8-stubs/stubs/ext/standard/phpversion.stubHOiHL=vendor/phpstan/php-8-stubs/stubs/ext/standard/str_repeat.stubCOiC+;vendor/phpstan/php-8-stubs/stubs/ext/standard/mt_srand.stubOi'Avendor/phpstan/php-8-stubs/stubs/ext/standard/time_nanosleep.stubyOiy0:vendor/phpstan/php-8-stubs/stubs/ext/standard/strcspn.stubkOik~Cvendor/phpstan/php-8-stubs/stubs/ext/standard/http_build_query.stubOi9vendor/phpstan/php-8-stubs/stubs/ext/standard/uasort.stubOiVnH;vendor/phpstan/php-8-stubs/stubs/ext/standard/strripos.stub[Oi[Ҥ8vendor/phpstan/php-8-stubs/stubs/ext/standard/rtrim.stubXOiXt159vendor/phpstan/php-8-stubs/stubs/ext/standard/fwrite.stubqOiq8vendor/phpstan/php-8-stubs/stubs/ext/standard/nl2br.stubJOiJ;WtBFvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_cp_set.stubeOieNv[8vendor/phpstan/php-8-stubs/stubs/ext/standard/fsync.stubYOiY+ 7vendor/phpstan/php-8-stubs/stubs/ext/standard/asin.stub,Oi,+9Hvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_get_transports.stubJOiJǤ;vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_clean.stub%Oi%MҤ6vendor/phpstan/php-8-stubs/stubs/ext/standard/key.stub>Oi>{ܠ7vendor/phpstan/php-8-stubs/stubs/ext/standard/sqrt.stub,Oi,<vendor/phpstan/php-8-stubs/stubs/ext/standard/ini_alter.stubOig}٤>vendor/phpstan/php-8-stubs/stubs/ext/standard/is_callable.stubOi(@vendor/phpstan/php-8-stubs/stubs/ext/standard/array_reverse.stubTOiT¼)0:vendor/phpstan/php-8-stubs/stubs/ext/standard/shuffle.stub}Oi}ʓc~;vendor/phpstan/php-8-stubs/stubs/ext/standard/pathinfo.stubkOik6[Ĥ;vendor/phpstan/php-8-stubs/stubs/ext/standard/is_array.stub1Oi1曤Evendor/phpstan/php-8-stubs/stubs/ext/standard/array_udiff_uassoc.stubiOiiBJӤ9vendor/phpstan/php-8-stubs/stubs/ext/standard/unlink.stubiOiiȤ7vendor/phpstan/php-8-stubs/stubs/ext/standard/copy.stuboOioK=6vendor/phpstan/php-8-stubs/stubs/ext/standard/exp.stub+Oi+ۤCvendor/phpstan/php-8-stubs/stubs/ext/standard/highlight_string.stubOikbGvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_cp_conv.stubvOivI]=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_find.stubYOiYn<:vendor/phpstan/php-8-stubs/stubs/ext/standard/is_long.stubEOiEH8vendor/phpstan/php-8-stubs/stubs/ext/standard/reset.stub7Oi7?_:vendor/phpstan/php-8-stubs/stubs/ext/standard/boolval.stub0Oi0#AGvendor/phpstan/php-8-stubs/stubs/ext/standard/call_user_func_array.stubQOiQ+w8vendor/phpstan/php-8-stubs/stubs/ext/standard/floor.stub1Oi1opZJvendor/phpstan/php-8-stubs/stubs/ext/standard/image_type_to_mime_type.stubSOiS1{Τ@vendor/phpstan/php-8-stubs/stubs/ext/standard/php_sapi_name.stub2Oi2Y9vendor/phpstan/php-8-stubs/stubs/ext/standard/decoct.stub-Oi-+<vendor/phpstan/php-8-stubs/stubs/ext/standard/ftruncate.stubWOiWӌӣEvendor/phpstan/php-8-stubs/stubs/ext/standard/ini_parse_quantity.stubPOiP3 Fvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_cp_get.stub@Oi@9@vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_get_status.stub[Oi[ӁW&Bvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_get_line.stub|Oi|Bvendor/phpstan/php-8-stubs/stubs/ext/standard/array_intersect.stubKOiK]7vendor/phpstan/php-8-stubs/stubs/ext/standard/sha1.stubTOiT ¤<vendor/phpstan/php-8-stubs/stubs/ext/standard/fileinode.stub;Oi;l6"MBvendor/phpstan/php-8-stubs/stubs/ext/standard/version_compare.stubOiZ5g@vendor/phpstan/php-8-stubs/stubs/ext/standard/array_is_list.stubGOiG89vendor/phpstan/php-8-stubs/stubs/ext/standard/unpack.stubOiS}T٤Cvendor/phpstan/php-8-stubs/stubs/ext/standard/convert_uudecode.stubCOiC6b9vendor/phpstan/php-8-stubs/stubs/ext/standard/sscanf.stubsOis ]@vendor/phpstan/php-8-stubs/stubs/ext/standard/gethostbyaddr.stubCOiC@vendor/phpstan/php-8-stubs/stubs/ext/standard/is_executable.stub:Oi:HpGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_server.stub-Oi-gYHvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_bucket_prepend.stubOiqm=vendor/phpstan/php-8-stubs/stubs/ext/standard/getrandmax.stubBOiBlaDvendor/phpstan/php-8-stubs/stubs/ext/standard/password_get_info.stubcOic :vendor/phpstan/php-8-stubs/stubs/ext/standard/strcoll.stubJOiJ0Avendor/phpstan/php-8-stubs/stubs/ext/standard/set_time_limit.stubkOik,mz>vendor/phpstan/php-8-stubs/stubs/ext/standard/get_headers.stubOi CC=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_push.stubSOiS^;Lvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_wrapper_unregister.stubFOiFy<vendor/phpstan/php-8-stubs/stubs/ext/standard/urlencode.stub6Oi6zeAvendor/phpstan/php-8-stubs/stubs/ext/standard/gethostbynamel.stubYOiY{Cvendor/phpstan/php-8-stubs/stubs/ext/standard/array_key_exists.stub]Oi]^2:vendor/phpstan/php-8-stubs/stubs/ext/standard/tmpfile.stub<Oi<?<vendor/phpstan/php-8-stubs/stubs/ext/standard/filegroup.stub;Oi;4:vendor/phpstan/php-8-stubs/stubs/ext/standard/readdir.stubfOif97<vendor/phpstan/php-8-stubs/stubs/ext/standard/array_map.stubZOiZKcܤ9vendor/phpstan/php-8-stubs/stubs/ext/standard/strval.stub1Oi1Bvendor/phpstan/php-8-stubs/stubs/ext/standard/password_verify.stubJOiJ:vendor/phpstan/php-8-stubs/stubs/ext/standard/hex2bin.stub:Oi:@Q\1;vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_start.stubrOir}<7vendor/phpstan/php-8-stubs/stubs/ext/standard/fdiv.stub:Oi:]Jvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_cp_is_utf8.stub4Oi4VЋ8vendor/phpstan/php-8-stubs/stubs/ext/standard/chdir.stub3Oi3{RQNvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_enable_crypto.stubOi|j"?vendor/phpstan/php-8-stubs/stubs/ext/standard/getimagesize.stubOi8vendor/phpstan/php-8-stubs/stubs/ext/standard/fgets.stubeOieπ29vendor/phpstan/php-8-stubs/stubs/ext/standard/hexdec.stub:Oi:AT@vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_get_length.stub/Oi/ ם;vendor/phpstan/php-8-stubs/stubs/ext/standard/getmyuid.stub;Oi;4G <vendor/phpstan/php-8-stubs/stubs/ext/standard/proc_nice.stubDOiD?vendor/phpstan/php-8-stubs/stubs/ext/standard/rawurlencode.stub9Oi9Cvendor/phpstan/php-8-stubs/stubs/ext/standard/get_current_user.stub6Oi6RFvendor/phpstan/php-8-stubs/stubs/ext/standard/socket_set_blocking.stubOi @~;vendor/phpstan/php-8-stubs/stubs/ext/standard/vfprintf.stubiOiiAɤPvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_set_ctrl_handler.stub^Oi^|?vendor/phpstan/php-8-stubs/stubs/ext/standard/base_convert.stubTOiTY!t<vendor/phpstan/php-8-stubs/stubs/ext/standard/quotemeta.stub6Oi6V 9vendor/phpstan/php-8-stubs/stubs/ext/standard/assert.stubxOix͢Mo7vendor/phpstan/php-8-stubs/stubs/ext/standard/rand.stubFOiFGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_client.stub1Oi1sxGvendor/phpstan/php-8-stubs/stubs/ext/standard/array_walk_recursive.stubOic2?vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_end_flush.stub)Oi)Ҥ?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_values.stubTOiTSvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_generate_ctrl_event.stubUOiU`Hvendor/phpstan/php-8-stubs/stubs/ext/standard/array_change_key_case.stubWOiWQQvendor/phpstan/php-8-stubs/stubs/ext/standard/http_get_last_response_headers.stubNOiN=Ĥ8vendor/phpstan/php-8-stubs/stubs/ext/standard/count.stubROiRGFvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_set_blocking.stubdOidu>vendor/phpstan/php-8-stubs/stubs/ext/standard/utf8_encode.stub8Oi8_?<vendor/phpstan/php-8-stubs/stubs/ext/standard/array_any.stubWOiWD:vendor/phpstan/php-8-stubs/stubs/ext/standard/bin2hex.stubCOiCFۤOvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_bucket_make_writeable.stub'Oi'PΤ?vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_get_clean.stub1Oi1zդ<vendor/phpstan/php-8-stubs/stubs/ext/standard/array_pop.stub4Oi4mߤ:vendor/phpstan/php-8-stubs/stubs/ext/standard/ini_get.stub:Oi:Avendor/phpstan/php-8-stubs/stubs/ext/standard/sys_getloadavg.stubgOig{dv<vendor/phpstan/php-8-stubs/stubs/ext/standard/fileowner.stub;Oi;Oh>vendor/phpstan/php-8-stubs/stubs/ext/standard/natcasesort.stubOiAi?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_column.stubvOiv%Dvendor/phpstan/php-8-stubs/stubs/ext/standard/ob_implicit_flush.stubAOiA9vendor/phpstan/php-8-stubs/stubs/ext/standard/chroot.stubtOit?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_reduce.stubaOia A@vendor/phpstan/php-8-stubs/stubs/ext/standard/str_ends_with.stubJOiJJO;vendor/phpstan/php-8-stubs/stubs/ext/standard/wordwrap.stubzOizcEb8vendor/phpstan/php-8-stubs/stubs/ext/standard/rmdir.stubiOiipO#<vendor/phpstan/php-8-stubs/stubs/ext/standard/serialize.stub4Oi4פGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_accept.stubOi(_=vendor/phpstan/php-8-stubs/stubs/ext/standard/shell_exec.stubCOiCW=vendor/phpstan/php-8-stubs/stubs/ext/standard/is_integer.stubHOiH ?vendor/phpstan/php-8-stubs/stubs/ext/standard/similar_text.stubwOiw<Jvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_register_wrapper.stubOiE<vendor/phpstan/php-8-stubs/stubs/ext/standard/is_object.stub2Oi2*jBvendor/phpstan/php-8-stubs/stubs/ext/standard/array_fill_keys.stubFOiFm@vendor/phpstan/php-8-stubs/stubs/ext/standard/array_unshift.stubHOiHb`>vendor/phpstan/php-8-stubs/stubs/ext/standard/is_iterable.stub4Oi48ŝAvendor/phpstan/php-8-stubs/stubs/ext/standard/proc_terminate.stubeOieuO6vendor/phpstan/php-8-stubs/stubs/ext/standard/cos.stub+Oi+YF*8vendor/phpstan/php-8-stubs/stubs/ext/standard/fstat.stubbOibh7Cvendor/phpstan/php-8-stubs/stubs/ext/standard/ob_list_handlers.stubEOiEDT e<vendor/phpstan/php-8-stubs/stubs/ext/standard/getrusage.stubnOin<:vendor/phpstan/php-8-stubs/stubs/ext/standard/vprintf.stub@Oi@^A<vendor/phpstan/php-8-stubs/stubs/ext/standard/sha1_file.stubTOiTdEW":vendor/phpstan/php-8-stubs/stubs/ext/standard/str_pad.stubzOize!5vendor/phpstan/php-8-stubs/stubs/ext/standard/dl.stub9Oi9-U~=vendor/phpstan/php-8-stubs/stubs/ext/standard/random_int.stub8Oi8#sFvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_get_contents.stubOi0$Fvendor/phpstan/php-8-stubs/stubs/ext/standard/php_ini_loaded_file.stub8Oi80 Gvendor/phpstan/php-8-stubs/stubs/ext/standard/array_intersect_ukey.stubkOik|<vendor/phpstan/php-8-stubs/stubs/ext/standard/is_string.stub2Oi2x6vendor/phpstan/php-8-stubs/stubs/ext/standard/pow.stubGOiG\4Ϥ:vendor/phpstan/php-8-stubs/stubs/ext/standard/compact.stubOizؤCvendor/phpstan/php-8-stubs/stubs/ext/standard/htmlspecialchars.stubOiW֤9vendor/phpstan/php-8-stubs/stubs/ext/standard/sizeof.stubgOigDBvendor/phpstan/php-8-stubs/stubs/ext/standard/array_multisort.stubOinla8vendor/phpstan/php-8-stubs/stubs/ext/standard/round.stubOip|mq<vendor/phpstan/php-8-stubs/stubs/ext/standard/proc_open.stubOi <vendor/phpstan/php-8-stubs/stubs/ext/standard/is_scalar.stub2Oi22m<vendor/phpstan/php-8-stubs/stubs/ext/standard/str_split.stubdOidͤ8vendor/phpstan/php-8-stubs/stubs/ext/standard/sleep.stub-Oi-3cL:vendor/phpstan/php-8-stubs/stubs/ext/standard/stripos.stubZOiZBSAѤ<vendor/phpstan/php-8-stubs/stubs/ext/standard/strnatcmp.stubEOiEhL9vendor/phpstan/php-8-stubs/stubs/ext/standard/system.stuboOio7қBvendor/phpstan/php-8-stubs/stubs/ext/standard/debug_zval_dump.stubJOiJd5͉9vendor/phpstan/php-8-stubs/stubs/ext/standard/is_int.stub/Oi/^;vendor/phpstan/php-8-stubs/stubs/ext/standard/floatval.stub2Oi22?vendor/phpstan/php-8-stubs/stubs/ext/standard/is_countable.stub5Oi5sEvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_get_filters.stubGOiG4, `Evendor/phpstan/php-8-stubs/stubs/ext/standard/http_response_code.stubIOiIyg >vendor/phpstan/php-8-stubs/stubs/ext/standard/addcslashes.stubLOiLaq8vendor/phpstan/php-8-stubs/stubs/ext/standard/log1p.stub-Oi-`95vendor/phpstan/php-8-stubs/stubs/ext/standard/pi.stub Oi _loͤ7vendor/phpstan/php-8-stubs/stubs/ext/standard/prev.stub6Oi6l>vendor/phpstan/php-8-stubs/stubs/ext/standard/is_infinite.stub2Oi2ko:vendor/phpstan/php-8-stubs/stubs/ext/standard/phpinfo.stubOiߒ<vendor/phpstan/php-8-stubs/stubs/ext/standard/str_rot13.stub6Oi6谛;9vendor/phpstan/php-8-stubs/stubs/ext/standard/usleep.stub4Oi4Bvendor/phpstan/php-8-stubs/stubs/ext/standard/array_diff_ukey.stubfOif7 Cvendor/phpstan/php-8-stubs/stubs/ext/standard/set_include_path.stubIOiI=vendor/phpstan/php-8-stubs/stubs/ext/standard/strtoupper.stub7Oi79Z+Cvendor/phpstan/php-8-stubs/stubs/ext/standard/memory_get_usage.stubDOiDEN@vendor/phpstan/php-8-stubs/stubs/ext/standard/base64_decode.stubVOiV5lQ:vendor/phpstan/php-8-stubs/stubs/ext/standard/tempnam.stubMOiM>{$9vendor/phpstan/php-8-stubs/stubs/ext/standard/intdiv.stub6Oi6]aФ:vendor/phpstan/php-8-stubs/stubs/ext/standard/fprintf.stubkOikU6vendor/phpstan/php-8-stubs/stubs/ext/standard/dir.stubsOis?7vendor/phpstan/php-8-stubs/stubs/ext/standard/cosh.stub,Oi,geCvendor/phpstan/php-8-stubs/stubs/ext/standard/sys_get_temp_dir.stub6Oi6Qq:vendor/phpstan/php-8-stubs/stubs/ext/standard/is_null.stub0Oi0E8:vendor/phpstan/php-8-stubs/stubs/ext/standard/strrpos.stubZOiZG} 9vendor/phpstan/php-8-stubs/stubs/ext/standard/uniqid.stub|Oi|=7?vendor/phpstan/php-8-stubs/stubs/ext/standard/substr_count.stubnOinHBvendor/phpstan/php-8-stubs/stubs/ext/standard/array_key_first.stubCOiCHrʷ@vendor/phpstan/php-8-stubs/stubs/ext/standard/str_increment.stubKOiKtIvendor/phpstan/php-8-stubs/stubs/ext/standard/output_add_rewrite_var.stubNOiN]4<vendor/phpstan/php-8-stubs/stubs/ext/standard/metaphone.stubfOifФ8vendor/phpstan/php-8-stubs/stubs/ext/standard/fseek.stublOil>vendor/phpstan/php-8-stubs/stubs/ext/standard/ini_restore.stub6Oi6ikAvendor/phpstan/php-8-stubs/stubs/ext/standard/escapeshellcmd.stub<Oi<E-_Cvendor/phpstan/php-8-stubs/stubs/ext/standard/array_diff_assoc.stubLOiLB?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_filter.stubaOia8vendor/phpstan/php-8-stubs/stubs/ext/standard/flock.stubOi)-&9vendor/phpstan/php-8-stubs/stubs/ext/standard/fflush.stubIOiId$_`Evendor/phpstan/php-8-stubs/stubs/ext/standard/net_get_interfaces.stubOit19vendor/phpstan/php-8-stubs/stubs/ext/standard/putenv.stubHOiH+V:vendor/phpstan/php-8-stubs/stubs/ext/standard/ucfirst.stub4Oi4 ܤ9vendor/phpstan/php-8-stubs/stubs/ext/standard/strchr.stub}Oi}F?vendor/phpstan/php-8-stubs/stubs/ext/standard/headers_list.stubAOiAgŤ@vendor/phpstan/php-8-stubs/stubs/ext/standard/stripcslashes.stub:Oi:N_X:vendor/phpstan/php-8-stubs/stubs/ext/standard/fnmatch.stubiOiib9vendor/phpstan/php-8-stubs/stubs/ext/standard/is_nan.stub-Oi-#"7vendor/phpstan/php-8-stubs/stubs/ext/standard/file.stubOiK:vendor/phpstan/php-8-stubs/stubs/ext/standard/explode.stubOiҤ(M=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_walk.stubOiZ=vendor/phpstan/php-8-stubs/stubs/ext/standard/pfsockopen.stubOi{[h7vendor/phpstan/php-8-stubs/stubs/ext/standard/trim.stubWOiW+<vendor/phpstan/php-8-stubs/stubs/ext/standard/is_finite.stub0Oi0ArEvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_set_timeout.stubOiiه:vendor/phpstan/php-8-stubs/stubs/ext/standard/is_file.stub4Oi4J9vendor/phpstan/php-8-stubs/stubs/ext/standard/rename.stubqOiq@vendor/phpstan/php-8-stubs/stubs/ext/standard/getservbyport.stubkOikFW=vendor/phpstan/php-8-stubs/stubs/ext/standard/phpcredits.stubOi @vendor/phpstan/php-8-stubs/stubs/ext/standard/array_replace.stubOOiO|7cEvendor/phpstan/php-8-stubs/stubs/ext/standard/request_parse_body.stubOi[+=vendor/phpstan/php-8-stubs/stubs/ext/standard/localeconv.stub?Oi?{Avendor/phpstan/php-8-stubs/stubs/ext/standard/parse_ini_file.stubOi e9vendor/phpstan/php-8-stubs/stubs/ext/standard/rewind.stubIOiIBӐAvendor/phpstan/php-8-stubs/stubs/ext/standard/dns_get_record.stubOia[89vendor/phpstan/php-8-stubs/stubs/ext/standard/intval.stub>Oi>Y8vendor/phpstan/php-8-stubs/stubs/ext/standard/crc32.stub=Oi=@=vendor/phpstan/php-8-stubs/stubs/ext/standard/getmyinode.stub,Oi,$hEvendor/phpstan/php-8-stubs/stubs/ext/standard/realpath_cache_get.stubGOiG֧Dvendor/phpstan/php-8-stubs/stubs/ext/standard/array_udiff_assoc.stubhOihPjHvendor/phpstan/php-8-stubs/stubs/ext/standard/memory_get_peak_usage.stubIOiI)*9vendor/phpstan/php-8-stubs/stubs/ext/standard/printf.stubBOiB(Gvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_bucket_append.stubOikCvendor/phpstan/php-8-stubs/stubs/ext/standard/time_sleep_until.stub=Oi=hECvendor/phpstan/php-8-stubs/stubs/ext/standard/error_clear_last.stub-Oi-sq87vendor/phpstan/php-8-stubs/stubs/ext/standard/sinh.stub,Oi,+.8vendor/phpstan/php-8-stubs/stubs/ext/standard/lstat.stubPOiP:vendor/phpstan/php-8-stubs/stubs/ext/standard/symlink.stub@Oi@/j:vendor/phpstan/php-8-stubs/stubs/ext/standard/is_bool.stub0Oi0;vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_flush.stub%Oi%$EGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_sendto.stubOig;vendor/phpstan/php-8-stubs/stubs/ext/standard/strptime.stubOi~9vendor/phpstan/php-8-stubs/stubs/ext/standard/strtok.stubPOiPGLAvendor/phpstan/php-8-stubs/stubs/ext/standard/error_get_last.stubDOiDU1̤<vendor/phpstan/php-8-stubs/stubs/ext/standard/iptcparse.stubVOiVהEvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_pair.stubOiXyEvendor/phpstan/php-8-stubs/stubs/ext/standard/socket_set_timeout.stubOiUR9vendor/phpstan/php-8-stubs/stubs/ext/standard/lchgrp.stubFOiFa;Evendor/phpstan/php-8-stubs/stubs/ext/standard/html_entity_decode.stubOiR{7vendor/phpstan/php-8-stubs/stubs/ext/standard/next.stub6Oi6UP?vendor/phpstan/php-8-stubs/stubs/ext/standard/stripslashes.stub9Oi9m@vendor/phpstan/php-8-stubs/stubs/ext/standard/stream_isatty.stubPOiPkAvendor/phpstan/php-8-stubs/stubs/ext/standard/getprotobyname.stub_Oi_q;vendor/phpstan/php-8-stubs/stubs/ext/standard/getmygid.stub*Oi*5?vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_get_level.stub(Oi(y,6vendor/phpstan/php-8-stubs/stubs/ext/standard/log.stub>Oi>G?vendor/phpstan/php-8-stubs/stubs/ext/standard/rawurldecode.stub9Oi96<vendor/phpstan/php-8-stubs/stubs/ext/standard/fsockopen.stubOi/A?vendor/phpstan/php-8-stubs/stubs/ext/standard/StreamBucket.stub Oi "i7>vendor/phpstan/php-8-stubs/stubs/ext/standard/is_resource.stub4Oi4U8vendor/phpstan/php-8-stubs/stubs/ext/standard/umask.stub2Oi2&MMvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_get_options.stubxOixໄGvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_filter_append.stubOi;;vendor/phpstan/php-8-stubs/stubs/ext/standard/var_dump.stubOOiO}@vendor/phpstan/php-8-stubs/stubs/ext/standard/mt_getrandmax.stub)Oi)ag6vendor/phpstan/php-8-stubs/stubs/ext/standard/chr.stub0Oi04nSvendor/phpstan/php-8-stubs/stubs/ext/standard/http_clear_last_response_headers.stubNOiNA#Dvendor/phpstan/php-8-stubs/stubs/ext/standard/connection_status.stub-Oi-n 9vendor/phpstan/php-8-stubs/stubs/ext/standard/octdec.stub<Oi<9;vendor/phpstan/php-8-stubs/stubs/ext/standard/closedir.stub_Oi_DyJ>vendor/phpstan/php-8-stubs/stubs/ext/standard/str_shuffle.stub8Oi87jHvendor/phpstan/php-8-stubs/stubs/ext/standard/password_needs_rehash.stubjOij7O;vendor/phpstan/php-8-stubs/stubs/ext/standard/filesize.stub:Oi:<vendor/phpstan/php-8-stubs/stubs/ext/standard/php_uname.stub:Oi:<vendor/phpstan/php-8-stubs/stubs/ext/standard/setcookie.stubOiN~:vendor/phpstan/php-8-stubs/stubs/ext/standard/ucwords.stubXOiX|Τ@vendor/phpstan/php-8-stubs/stubs/ext/standard/number_format.stubOi4:vendor/phpstan/php-8-stubs/stubs/ext/standard/gettype.stubFOiF_Hvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_copy_to_stream.stubOi?K@vendor/phpstan/php-8-stubs/stubs/ext/standard/diskfreespace.stub`Oi`kKJvendor/phpstan/php-8-stubs/stubs/ext/standard/htmlspecialchars_decode.stubOi+8vendor/phpstan/php-8-stubs/stubs/ext/standard/range.stubOij%>7vendor/phpstan/php-8-stubs/stubs/ext/standard/link.stub=Oi= ?vendor/phpstan/php-8-stubs/stubs/ext/standard/str_contains.stubIOiIi:3ˤAvendor/phpstan/php-8-stubs/stubs/ext/standard/array_key_last.stubBOiBs7>vendor/phpstan/php-8-stubs/stubs/ext/standard/array_chunk.stub_Oi_ZǤ:vendor/phpstan/php-8-stubs/stubs/ext/standard/natsort.stub}Oi}*#8vendor/phpstan/php-8-stubs/stubs/ext/standard/touch.stubiOiiA<vendor/phpstan/php-8-stubs/stubs/ext/standard/array_pad.stubNOiN{~ =vendor/phpstan/php-8-stubs/stubs/ext/standard/is_numeric.stub3Oi3r7vendor/phpstan/php-8-stubs/stubs/ext/standard/tanh.stub,Oi,שIvendor/phpstan/php-8-stubs/stubs/ext/standard/getimagesizefromstring.stubOiy9vendor/phpstan/php-8-stubs/stubs/ext/standard/bindec.stub=Oi=kXa8vendor/phpstan/php-8-stubs/stubs/ext/standard/mkdir.stubOi 7vendor/phpstan/php-8-stubs/stubs/ext/standard/join.stubfOifa)Avendor/phpstan/php-8-stubs/stubs/ext/standard/escapeshellarg.stub8Oi8 ܤBvendor/phpstan/php-8-stubs/stubs/ext/standard/disk_free_space.stubDOiD,T:vendor/phpstan/php-8-stubs/stubs/ext/standard/getmxrr.stubOi~ߤ?vendor/phpstan/php-8-stubs/stubs/ext/standard/gettimeofday.stub]Oi]q;?:vendor/phpstan/php-8-stubs/stubs/ext/standard/extract.stub|Oi|f?vendor/phpstan/php-8-stubs/stubs/ext/standard/array_splice.stubrOirÝ5@vendor/phpstan/php-8-stubs/stubs/ext/standard/strnatcasecmp.stubIOiIA_'8vendor/phpstan/php-8-stubs/stubs/ext/standard/atanh.stub-Oi-OY:vendor/phpstan/php-8-stubs/stubs/ext/standard/soundex.stubDOiD+/D7vendor/phpstan/php-8-stubs/stubs/ext/standard/acos.stub,Oi,t׽Mvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_set_options.stub Oi 'hĤCvendor/phpstan/php-8-stubs/stubs/ext/standard/disk_total_space.stubEOiEBx̤Hvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_filter_prepend.stubOi)6vendor/phpstan/php-8-stubs/stubs/ext/standard/tan.stub+Oi+*>BZDvendor/phpstan/php-8-stubs/stubs/ext/standard/ignore_user_abort.stubAOiA:vendor/phpstan/php-8-stubs/stubs/ext/standard/strrchr.stubOi vJvendor/phpstan/php-8-stubs/stubs/ext/standard/array_replace_recursive.stubYOiY>Y7vendor/phpstan/php-8-stubs/stubs/ext/standard/pack.stubWOiW1ݤMvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_get_default.stub_Oi_׬ؤ;vendor/phpstan/php-8-stubs/stubs/ext/standard/realpath.stub9Oi9/'~?vendor/phpstan/php-8-stubs/stubs/ext/standard/RoundingMode.stubOitIvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_recvfrom.stubOiUq5$>vendor/phpstan/php-8-stubs/stubs/ext/standard/array_udiff.stubbOibK:vendor/phpstan/php-8-stubs/stubs/ext/standard/lcfirst.stub4Oi4 ,9vendor/phpstan/php-8-stubs/stubs/ext/standard/getopt.stubOi8vendor/phpstan/php-8-stubs/stubs/ext/standard/atan2.stub5Oi5zA?vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_get_flush.stub1Oi1xLvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_set_params.stubOi9<>vendor/phpstan/php-8-stubs/stubs/ext/standard/file_exists.stub8Oi8^,Avendor/phpstan/php-8-stubs/stubs/ext/standard/assert_options.stubOOiO}dLvendor/phpstan/php-8-stubs/stubs/ext/standard/output_reset_rewrite_vars.stub6Oi6<vendor/phpstan/php-8-stubs/stubs/ext/standard/array_all.stubWOiW¤<vendor/phpstan/php-8-stubs/stubs/ext/standard/fdatasync.stub]Oi]@:vendor/phpstan/php-8-stubs/stubs/ext/standard/sprintf.stub^Oi^S?vendor/phpstan/php-8-stubs/stubs/ext/standard/ob_end_clean.stub)Oi)"?E<vendor/phpstan/php-8-stubs/stubs/ext/standard/doubleval.stubJOiJg(Avendor/phpstan/php-8-stubs/stubs/ext/standard/highlight_file.stubXOiXH:Bvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_is_local.stubYOiYI(Ѥ;vendor/phpstan/php-8-stubs/stubs/ext/standard/passthru.stubOiO^Mvendor/phpstan/php-8-stubs/stubs/ext/standard/sapi_windows_vt100_support.stubOi?=vendor/phpstan/php-8-stubs/stubs/ext/standard/var_export.stubLOiLk\}=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_rand.stubMOiMBQ8vendor/phpstan/php-8-stubs/stubs/ext/standard/ftell.stubMOiMT4Kvendor/phpstan/php-8-stubs/stubs/ext/standard/unregister_tick_function.stubGOiG{5Bvendor/phpstan/php-8-stubs/stubs/ext/standard/set_file_buffer.stubOiOK9vendor/phpstan/php-8-stubs/stubs/ext/standard/strrev.stub3Oi3=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_fill.stubROiRˤ:vendor/phpstan/php-8-stubs/stubs/ext/standard/current.stub8Oi8Nr9vendor/phpstan/php-8-stubs/stubs/ext/standard/strstr.stubhOih<Hvendor/phpstan/php-8-stubs/stubs/ext/standard/array_intersect_assoc.stubQOiQ³L>vendor/phpstan/php-8-stubs/stubs/ext/standard/get_cfg_var.stubDOiDA8vendor/phpstan/php-8-stubs/stubs/ext/standard/chgrp.stubEOiE* :vendor/phpstan/php-8-stubs/stubs/ext/standard/rad2deg.stub/Oi/dO-9vendor/phpstan/php-8-stubs/stubs/ext/standard/decbin.stub-Oi-!K8vendor/phpstan/php-8-stubs/stubs/ext/standard/fputs.stubOi' r9vendor/phpstan/php-8-stubs/stubs/ext/standard/dechex.stub-Oi-•UKvendor/phpstan/php-8-stubs/stubs/ext/standard/header_register_callback.stubYOiYq&Mvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_context_set_default.stubWOiWD<vendor/phpstan/php-8-stubs/stubs/ext/standard/fileperms.stub;Oi;FCvendor/phpstan/php-8-stubs/stubs/ext/standard/parse_ini_string.stubOi t9vendor/phpstan/php-8-stubs/stubs/ext/standard/arsort.stubOiD<vendor/phpstan/php-8-stubs/stubs/ext/standard/iptcembed.stubmOim/*9vendor/phpstan/php-8-stubs/stubs/ext/standard/getcwd.stub2Oi288Ǥ9vendor/phpstan/php-8-stubs/stubs/ext/standard/getenv.stubvOivq=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_keys.stubOi b8vendor/phpstan/php-8-stubs/stubs/ext/standard/fread.stub]Oi]kO?vendor/phpstan/php-8-stubs/stubs/ext/standard/headers_sent.stubOiHIvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_socket_get_name.stuboOio QQ=vendor/phpstan/php-8-stubs/stubs/ext/standard/array_diff.stubFOiFC6vendor/phpstan/php-8-stubs/stubs/ext/standard/abs.stub@Oi@D_fӤ@vendor/phpstan/php-8-stubs/stubs/ext/standard/stream_select.stubOOiOݤGvendor/phpstan/php-8-stubs/stubs/ext/standard/php_strip_whitespace.stubCOiC%`9vendor/phpstan/php-8-stubs/stubs/ext/standard/is_dir.stub3Oi3:vendor/phpstan/php-8-stubs/stubs/ext/standard/is_link.stub4Oi4<vendor/phpstan/php-8-stubs/stubs/ext/standard/setlocale.stubOi Ib=vendor/phpstan/php-8-stubs/stubs/ext/standard/getlastmod.stub,Oi,Ӥ=vendor/phpstan/php-8-stubs/stubs/ext/standard/addslashes.stub7Oi7PYӛ>vendor/phpstan/php-8-stubs/stubs/ext/standard/is_writable.stub8Oi8b>vendor/phpstan/php-8-stubs/stubs/ext/standard/chunk_split.stubfOif-j=vendor/phpstan/php-8-stubs/stubs/ext/standard/strtolower.stub7Oi7;vendor/phpstan/php-8-stubs/stubs/ext/standard/md5_file.stubSOiS&ۤDvendor/phpstan/php-8-stubs/stubs/ext/standard/file_get_contents.stubOiј7>vendor/phpstan/php-8-stubs/stubs/ext/standard/show_source.stubrOirv69vendor/phpstan/php-8-stubs/stubs/ext/standard/fscanf.stubOit[ :vendor/phpstan/php-8-stubs/stubs/ext/standard/print_r.stubOi"N;vendor/phpstan/php-8-stubs/stubs/ext/standard/getmypid.stub*Oi*o4Gvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_get_meta_data.stub\Oi\.>(<vendor/phpstan/php-8-stubs/stubs/ext/standard/urldecode.stub6Oi6qv7vendor/phpstan/php-8-stubs/stubs/ext/standard/stat.stubOOiO,`8vendor/phpstan/php-8-stubs/stubs/ext/standard/rsort.stubOi1>\EDvendor/phpstan/php-8-stubs/stubs/ext/standard/file_put_contents.stubOiFvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_get_wrappers.stubHOiH!:vendor/phpstan/php-8-stubs/stubs/ext/standard/stristr.stubiOiiOz8vendor/phpstan/php-8-stubs/stubs/ext/standard/asort.stubOiU!:vendor/phpstan/php-8-stubs/stubs/ext/standard/long2ip.stubOiQ@vendor/phpstan/php-8-stubs/stubs/ext/standard/gethostbyname.stub<Oi<?N7vendor/phpstan/php-8-stubs/stubs/ext/standard/chop.stubkOik7vendor/phpstan/php-8-stubs/stubs/ext/standard/exec.stubOi6?vendor/phpstan/php-8-stubs/stubs/ext/standard/is_writeable.stubSOiS8vendor/phpstan/php-8-stubs/stubs/ext/standard/asinh.stub-Oi-ޤCvendor/phpstan/php-8-stubs/stubs/ext/standard/getprotobynumber.stubcOic<vendor/phpstan/php-8-stubs/stubs/ext/standard/filemtime.stub;Oi;SJvendor/phpstan/php-8-stubs/stubs/ext/standard/quoted_printable_encode.stubDOiD0,<vendor/phpstan/php-8-stubs/stubs/ext/standard/microtime.stuboOiooĕBvendor/phpstan/php-8-stubs/stubs/ext/standard/proc_get_status.stubhOih_l]Avendor/phpstan/php-8-stubs/stubs/ext/standard/array_diff_key.stubJOiJ=+<vendor/phpstan/php-8-stubs/stubs/ext/standard/parse_url.stubOis+:vendor/phpstan/php-8-stubs/stubs/ext/standard/ip2long.stub3Oi39vendor/phpstan/php-8-stubs/stubs/ext/standard/lchown.stubUOiUY7vendor/phpstan/php-8-stubs/stubs/ext/standard/sort.stubOi(vYBvendor/phpstan/php-8-stubs/stubs/ext/standard/config_get_hash.stubSOiSV+Jvendor/phpstan/php-8-stubs/stubs/ext/standard/quoted_printable_decode.stub^Oi^nHvendor/phpstan/php-8-stubs/stubs/ext/standard/php_ini_scanned_files.stub:Oi:We=vendor/phpstan/php-8-stubs/stubs/ext/standard/proc_close.stubNOiNמJvendor/phpstan/php-8-stubs/stubs/ext/standard/array_uintersect_uassoc.stubnOin9vendor/phpstan/php-8-stubs/stubs/ext/standard/substr.stubUOiUE#<vendor/phpstan/php-8-stubs/stubs/ext/standard/fpassthru.stubKOiK;vendor/phpstan/php-8-stubs/stubs/ext/standard/vsprintf.stubDOiD?c<vendor/phpstan/php-8-stubs/stubs/ext/standard/rewinddir.stub`Oi`=@vendor/phpstan/php-8-stubs/stubs/ext/standard/password_hash.stubhOih4Y<vendor/phpstan/php-8-stubs/stubs/ext/standard/error_log.stubOi-Cvendor/phpstan/php-8-stubs/stubs/ext/standard/is_uploaded_file.stub=Oi=Էr27vendor/phpstan/php-8-stubs/stubs/ext/standard/fpow.stubiOii vHvendor/phpstan/php-8-stubs/stubs/ext/standard/array_merge_recursive.stubCOiC<Mvendor/phpstan/php-8-stubs/stubs/ext/standard/get_html_translation_table.stubOii>vendor/phpstan/php-8-stubs/stubs/ext/standard/levenshtein.stubOi=vendor/phpstan/php-8-stubs/stubs/ext/standard/str_getcsv.stubOi:7 9vendor/phpstan/php-8-stubs/stubs/ext/standard/hrtime.stubaOia2 7vendor/phpstan/php-8-stubs/stubs/ext/standard/fmod.stub:Oi:"-<vendor/phpstan/php-8-stubs/stubs/ext/standard/array_sum.stub7Oi7̮8vendor/phpstan/php-8-stubs/stubs/ext/standard/fgetc.stubPOiP̳kh8vendor/phpstan/php-8-stubs/stubs/ext/standard/chown.stubDOiDsNvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_resolve_include_path.stubPOiP'F^Lvendor/phpstan/php-8-stubs/stubs/ext/standard/forward_static_call_array.stubVOiVq;8vendor/phpstan/php-8-stubs/stubs/ext/standard/chmod.stubKOiK@vendor/phpstan/php-8-stubs/stubs/ext/standard/get_meta_tags.stubxOixRp8vendor/phpstan/php-8-stubs/stubs/ext/standard/hypot.stub5Oi5(4Bvendor/phpstan/php-8-stubs/stubs/ext/standard/php_user_filter.stubOib@kDvendor/phpstan/php-8-stubs/stubs/ext/standard/array_diff_uassoc.stubhOih8vendor/phpstan/php-8-stubs/stubs/ext/standard/acosh.stub-Oi-3:vendor/phpstan/php-8-stubs/stubs/ext/standard/fgetcsv.stubOi('8vendor/phpstan/php-8-stubs/stubs/ext/standard/ksort.stubOiUfIvendor/phpstan/php-8-stubs/stubs/ext/standard/stream_wrapper_restore.stubCOiCAe<vendor/phpstan/php-8-stubs/stubs/ext/sysvsem/sem_remove.stub@Oi@!9vendor/phpstan/php-8-stubs/stubs/ext/sysvsem/sem_get.stubOik=vendor/phpstan/php-8-stubs/stubs/ext/sysvsem/sem_acquire.stub]Oi]g?vendor/phpstan/php-8-stubs/stubs/ext/sysvsem/SysvSemaphore.stubGOiG|W=vendor/phpstan/php-8-stubs/stubs/ext/sysvsem/sem_release.stubAOiA$)"7vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_div_q.stubwOiww:vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_popcount.stub<Oi<=57vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_scan0.stubFOiFHV8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_jacobi.stubROiRj7vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_scan1.stubFOiF67vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_div_r.stubwOiwlo9?6vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_sqrt.stub9Oi92H5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_gcd.stubPOiP69vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_hamdist.stubSOiS0)"=vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_random_bits.stub5Oi58vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_div_qr.stubOi *5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_abs.stub8Oi8ܕp5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_com.stub8Oi8SԴ8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_clrbit.stub<Oi<-ؤ5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_and.stubPOiPcmΒ5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_sub.stubPOiPAi>vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_random_range.stubWOiW-=vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_random_seed.stubAOiA85vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_neg.stub8Oi86vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_root.stubCOiCF8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_setbit.stubPOiP +9vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_testbit.stubHOiHaOX8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_invert.stubYOiY^ 5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_mul.stubPOiPFF:vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_legendre.stubTOiTN:vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_binomial.stubCOiC <vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_prob_prime.stubUOiUY8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_strval.stubMOiMO-@vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_perfect_square.stubCOiCeE*05vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_div.stubOi>};vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_kronecker.stubUOiU#¤5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_mod.stubPOiPPZ:vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_divexact.stubUOiUj6vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_sign.stub8Oi8}4vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_or.stubOOiON45vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_pow.stubGOiG9vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_rootrem.stub^Oi^se`9vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_sqrtrem.stubTOiT^6vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_powm.stubnOinzR8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_import.stubwOiw[Y8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_intval.stub:Oi:Z5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_cmp.stubOOiOЃ8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_export.stubOit5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_lcm.stubPOiPZ%5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_add.stubPOiP<1vendor/phpstan/php-8-stubs/stubs/ext/gmp/GMP.stub<Oi<(5vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_xor.stubPOiPɐm;vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_nextprime.stub>Oi>?vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_perfect_power.stubBOiBIqΤ6vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_init.stubCOiC'¿J8vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_gcdext.stubkOik~?06vendor/phpstan/php-8-stubs/stubs/ext/gmp/gmp_fact.stub9Oi9B烤=vendor/phpstan/php-8-stubs/stubs/ext/filter/filter_input.stub{Oi{`@8Avendor/phpstan/php-8-stubs/stubs/ext/filter/filter_var_array.stubOi+{K<vendor/phpstan/php-8-stubs/stubs/ext/filter/filter_list.stub@Oi@V;vendor/phpstan/php-8-stubs/stubs/ext/filter/filter_var.stubjOijc:vendor/phpstan/php-8-stubs/stubs/ext/filter/filter_id.stub7Oi7Cvendor/phpstan/php-8-stubs/stubs/ext/filter/filter_input_array.stubOiKx?vendor/phpstan/php-8-stubs/stubs/ext/filter/filter_has_var.stubnOinu`>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_field_name.stubOi6vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_do.stub Oi Rvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_connection_string_should_quote.stub\Oi\q:vendor/phpstan/php-8-stubs/stubs/ext/odbc/Odbc/Result.stubmOimܕ>b>vendor/phpstan/php-8-stubs/stubs/ext/odbc/Odbc/Connection.stubqOiqWk?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_primarykeys.stub5Oi5!a<vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_rollback.stubOiN9vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_close.stubOiX`N <vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_num_rows.stubOiPȤ=vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_setoption.stubOip1>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_fetch_into.stubKOiK559vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_error.stubOi{ ?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_foreignkeys.stubOi?Bvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_specialcolumns.stubOig`g5=vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_field_len.stubOi^e:vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_cursor.stubOilKvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_connection_string_quote.stubWOiWA٤>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_num_fields.stubOi:}f>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_result_all.stubOilz<vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_errormsg.stubOiOi}>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_procedures.stubiOii9G,=vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_close_all.stubMOiM]j&?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_field_scale.stubOi bV<vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_pconnect.stubhOihSj=vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_fetch_row.stubOi);vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_binmode.stubOi9V?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_fetch_array.stubOi%\?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_free_result.stubOixDDvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_procedurecolumns.stubCOiCѳc;vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_prepare.stubOi㈤=vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_field_num.stubOipCvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_tableprivileges.stub Oi H?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_data_source.stubOi.:vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_result.stubOin|Cvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_field_precision.stubOiPؤ?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_longreadlen.stubOi:vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_tables.stubOiDvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_columnprivileges.stub_Oi_ Q7:vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_commit.stubOi|OC?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_gettypeinfo.stubOiQOvendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_connection_string_is_quoted.stubsOisPip?vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_next_result.stub Oi mK8vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_exec.stubOiJڮ>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_statistics.stubkOikf[>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_field_type.stubOiYi;vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_execute.stubOi_e>vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_autocommit.stubbOib(I;vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_columns.stubOiDl;vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_connect.stubfOif@vendor/phpstan/php-8-stubs/stubs/ext/odbc/odbc_fetch_object.stubFOiF\h=vendor/phpstan/php-8-stubs/stubs/ext/pdo_mysql/Pdo/Mysql.stubOi8vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzinflate.stubOOiO6ޤ:vendor/phpstan/php-8-stubs/stubs/ext/zlib/zlib_decode.stubQOiQB=vendor/phpstan/php-8-stubs/stubs/ext/zlib/InflateContext.stubHOiHI6vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzwrite.stubOiD8vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzdeflate.stubnOin{eq;vendor/phpstan/php-8-stubs/stubs/ext/zlib/inflate_init.stub\Oi\-Ǥ9vendor/phpstan/php-8-stubs/stubs/ext/zlib/readgzfile.stubWOiW1<3:vendor/phpstan/php-8-stubs/stubs/ext/zlib/zlib_encode.stub\Oi\dI7vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzdecode.stubNOiN]x9vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzcompress.stubsOiseֆ:vendor/phpstan/php-8-stubs/stubs/ext/zlib/inflate_add.stubyOiyu5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzopen.stubtOit67vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzrewind.stub`Oi` ~d]7vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzencode.stubnOinD9~5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzfile.stublOilۥ5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzgets.stubzOizEl5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzputs.stubOid;vendor/phpstan/php-8-stubs/stubs/ext/zlib/ob_gzhandler.stubIOiI F06vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzclose.stub_Oi_c9vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzpassthru.stubdOidjҤ4vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzeof.stub[Oi[9:l^Avendor/phpstan/php-8-stubs/stubs/ext/zlib/inflate_get_status.stubFOiFMsO;vendor/phpstan/php-8-stubs/stubs/ext/zlib/deflate_init.stub\Oi\<Cvendor/phpstan/php-8-stubs/stubs/ext/zlib/zlib_get_coding_type.stub9Oi9s):vendor/phpstan/php-8-stubs/stubs/ext/zlib/deflate_add.stubyOiy95vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzgetc.stubeOieZ5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gztell.stubbOib]gCvendor/phpstan/php-8-stubs/stubs/ext/zlib/inflate_get_read_len.stubHOiH8;vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzuncompress.stubROiR;nx5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzread.stubrOir=vendor/phpstan/php-8-stubs/stubs/ext/zlib/DeflateContext.stub&Oi&Ǭ5vendor/phpstan/php-8-stubs/stubs/ext/zlib/gzseek.stubOiFAvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search.stub[Oi[W<¤Dvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_check_encoding.stubgOigP?vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_str_split.stubcOic>nW<vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strstr.stubOiBDvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_list_encodings.stub/Oi/f-Gvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_encode_mimeheader.stubOie#Hvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search_getpos.stub1Oi1]5Jvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_substitute_character.stubkOik5sϤ<vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strlen.stubMOiM*jFvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_encoding_aliases.stubXOiXZ9vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ord.stubPOiP_>vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_language.stubiOiiq:vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg.stubrOir+d?vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_parse_str.stub]Oi]'&Cvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_eregi_replace.stubOi%7Gvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_regex_set_options.stubJOiJRޘ<vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strpos.stubvOivB=vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_stristr.stubOi3@vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_http_input.stubcOicG@vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strtolower.stubTOiTvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strwidth.stubOOiO*Gvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_convert_variables.stubOi}Z=vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_str_pad.stubOi 2Dvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_regex_encoding.stubaOiab%KDvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_output_handler.stubKOiKi0;vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_scrub.stubOOiO(RREvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search_pos.stub}Oi}AߤEvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_detect_encoding.stubOiE;vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_eregi.stubsOis@vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strimwidth.stubOicGJvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_decode_numericentity.stubjOij3䍤>vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strrichr.stubOiR<vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strcut.stubqOiqPIvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_preferred_mime_name.stubKOiK&Yj<vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_substr.stubqOiqWJvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_encode_numericentity.stub}Oi}iܛBvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_detect_order.stubkOikV;vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_split.stubsOis Fvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search_regs.stub~Oi~jAvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_http_output.stubJOiJT.;vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_rtrim.stub|Oi|@@vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strtoupper.stubTOiTBvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_replace.stubOiDIvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search_getregs.stubQOiQW:vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_trim.stub{Oi{?vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_send_mail.stubOiA>vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strripos.stubxOixȴFvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search_init.stubpOipS _Fvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_convert_encoding.stubOi)JvGvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_decode_mimeheader.stubAOiA׽>vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_get_info.stub/Oi/bߗ Bvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_convert_kana.stubkOikyQI~Bvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_convert_case.stubaOia7).=vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_strrpos.stubwOiwbiHvendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_search_setpos.stub=Oi=d^@vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ereg_match.stubbOib^=vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_ucfirst.stubbOibS~ۤ=vendor/phpstan/php-8-stubs/stubs/ext/mbstring/mb_lcfirst.stubbOibUOBvendor/phpstan/php-8-stubs/stubs/ext/sqlite3/SQLite3Exception.stubkOik*Y9vendor/phpstan/php-8-stubs/stubs/ext/sqlite3/SQLite3.stub9Oi9=7=vendor/phpstan/php-8-stubs/stubs/ext/sqlite3/SQLite3Stmt.stubOiLȤ?vendor/phpstan/php-8-stubs/stubs/ext/sqlite3/SQLite3Result.stub.Oi. 9vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_nextkey.stubOiT̤7vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_popen.stubOi% ޤ<vendor/phpstan/php-8-stubs/stubs/ext/dba/Dba/Connection.stubvOivh+6vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_open.stubkOikf:vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_handlers.stubXOiXN+b8vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_exists.stubKOiKl7vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_close.stubOiٻ6vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_sync.stubOi[8vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_insert.stubxOix9#$:vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_firstkey.stubOi;vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_key_split.stubGOiGP9vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_replace.stub{Oi{B7vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_fetch.stubOiIؤ:vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_optimize.stubOiR8vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_delete.stubKOiKmj,6vendor/phpstan/php-8-stubs/stubs/ext/dba/dba_list.stub&Oi&:vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmpwalkoid.stubOiJA̤3vendor/phpstan/php-8-stubs/stubs/ext/snmp/SNMP.stubOi}|$>vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp3_real_walk.stubOiC`7vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmpwalk.stubOiRS8vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp3_set.stub3Oi3x<vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp2_getnext.stubOiD|Fvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_get_valueretrieval.stub3Oi3K Z9vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp2_walk.stubOiuڤ:vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmpgetnext.stubOi38vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp2_get.stubOiK8vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp3_get.stub Oi -!L6vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmpget.stubOiWޤ9vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp3_walk.stubOi'|M8vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp2_set.stubOi"a6vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmpset.stubOiCvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_get_quick_print.stub1Oi1:<vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_read_mib.stub:Oi:nUCvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_set_quick_print.stubOi{Bvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_set_enum_print.stubOii<vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp3_getnext.stubOiZݤIvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_set_oid_numeric_print.stubOijΤFvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_set_valueretrieval.stubOiޤ<vendor/phpstan/php-8-stubs/stubs/ext/snmp/SNMPException.stub9Oi9=wIvendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp_set_oid_output_format.stubOi:`M;vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmprealwalk.stubOihƤ>vendor/phpstan/php-8-stubs/stubs/ext/snmp/snmp2_real_walk.stubOi}8vendor/phpstan/php-8-stubs/stubs/ext/soap/SoapFault.stubOi1Evendor/phpstan/php-8-stubs/stubs/ext/soap/use_soap_error_handler.stubhOihīd9vendor/phpstan/php-8-stubs/stubs/ext/soap/SoapClient.stubBOiBB<6vendor/phpstan/php-8-stubs/stubs/ext/soap/SoapVar.stubOiT|l7vendor/phpstan/php-8-stubs/stubs/ext/soap/Soap/Url.stubpOipR{7vendor/phpstan/php-8-stubs/stubs/ext/soap/Soap/Sdl.stubpOipWͤ9vendor/phpstan/php-8-stubs/stubs/ext/soap/SoapHeader.stubOiV<vendor/phpstan/php-8-stubs/stubs/ext/soap/is_soap_fault.stub7Oi7ת*9vendor/phpstan/php-8-stubs/stubs/ext/soap/SoapServer.stub&Oi&}Zn8vendor/phpstan/php-8-stubs/stubs/ext/soap/SoapParam.stubbOibd>8vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_nb_get.stubUOiU<vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_get_option.stubOiWU!6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_pasv.stubOia~9vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_nb_fget.stubqOiqBE6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_fput.stubmOim3y7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_close.stubOiƅV8vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_delete.stubOi_96vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_fget.stubmOim~F9vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_nb_fput.stubqOiq=vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_ssl_connect.stub*Oi*kv9vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_rawlist.stub@Oi@_6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_size.stubOi'E6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_mlsd.stubOi٬Ԥ5vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_raw.stubOi.Z8vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_rename.stubOi^❤9vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_connect.stubOi`q7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_mkdir.stubOiԵ17vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_login.stubOiB"<vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_set_option.stub Oi ^e5vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_get.stubKOiKŧ6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_mdtm.stubOi@ԅ=vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_nb_continue.stubOic Ǥ6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_exec.stubOiXB`9vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_systype.stubOin6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_site.stubOi8vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_append.stub/Oi/w8vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_nb_put.stub[Oi[dC#T6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_quit.stubOi_7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_nlist.stub Oi ]7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_chdir.stubOi0e6vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_cdup.stubOi"7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_rmdir.stubOi5vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_put.stubKOiK&ۤ5vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_pwd.stubOivEF<vendor/phpstan/php-8-stubs/stubs/ext/ftp/FTP/Connection.stubvOiv;p7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_alloc.stubOi*7vendor/phpstan/php-8-stubs/stubs/ext/ftp/ftp_chmod.stubOioG:vendor/phpstan/php-8-stubs/stubs/ext/shmop/shmop_read.stubNOiNRΤ<vendor/phpstan/php-8-stubs/stubs/ext/shmop/shmop_delete.stub6Oi6[5vendor/phpstan/php-8-stubs/stubs/ext/shmop/Shmop.stub?Oi?f+;vendor/phpstan/php-8-stubs/stubs/ext/shmop/shmop_close.stubHOiH1e%:vendor/phpstan/php-8-stubs/stubs/ext/shmop/shmop_open.stubbOib:;vendor/phpstan/php-8-stubs/stubs/ext/shmop/shmop_write.stubOOiOME&:vendor/phpstan/php-8-stubs/stubs/ext/shmop/shmop_size.stub3Oi3Avendor/phpstan/php-8-stubs/stubs/ext/tokenizer/token_get_all.stubiOii8L+>vendor/phpstan/php-8-stubs/stubs/ext/tokenizer/token_name.stub0Oi0$E<vendor/phpstan/php-8-stubs/stubs/ext/tokenizer/PhpToken.stubOi+n=vendor/phpstan/php-8-stubs/stubs/ext/pdo_dblib/Pdo/Dblib.stubQOiQM-uGvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_get_result.stubzOizZ}Gvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_dump_debug_info.stubAOiA+UGEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_sqlstate.stubJOiJ}K@vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_sqlstate.stub<Oi<A4Bvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_error.stubGOiG}*Dvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_real_connect.stubOio=vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_debug.stubOi+Fvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_data_seek.stubVOiVVqT=vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_errno.stub6Oi6깤@vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_num_rows.stubHOiHPDvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_execute.stubOi&2ԤJvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_real_escape_string.stubVOiV<1Lvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_connection_stats.stub~Oi~vDvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_object.stubOi'UHvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_next_result.stubKOiK'4<vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stat.stub>Oi>ۑJvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_character_set_name.stubFOiF6ěDvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_fields.stub^Oi^=vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_close.stubOiޤHvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_param_count.stubJOiJ܌FAvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_insert_id.stubAOiAƙs=vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_error.stub9Oi9H`Evendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_attr_get.stubWOiW}>Bvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_reset.stubEOiEoϤDvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_more_results.stub>Oi>yJvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_field_direct.stub`Oi`g`<vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt.stub8 Oi8 rdIvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_store_result.stubLOiL繽iEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_attr_set.stubdOid[?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_connect.stubOipGvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_client_info.stubKOiK2ܤGvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_error_list.stubbOibIgCvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_multi_query.stubLOiLR?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_set_opt.stubOi=?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_prepare.stub]Oi]ڤ>vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_result.stub% Oi% XoCvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_charset.stubGOiGwޤEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_connect_error.stub4Oi4x>vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_commit.stub^Oi^JCvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_field.stubMOiM щEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_num_rows.stubUOiUIGvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_server_info.stubCOiC6Hvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_field_count.stubJOiJKBvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_errno.stubDOiD2v6Hvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_free_result.stubKOiK,Dvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_warnings.stubOOiO|Avendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_all.stubOiJD{EEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_lengths.stubeOie{ܧ=vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_query.stub}Oi}v?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_warning.stubOi@`<Ivendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_release_savepoint.stubXOiX֮?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_options.stubnOin>vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_report.stubOipͦCvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_array.stubOi؇Cvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_set_charset.stubNOiN='6<vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_info.stub9Oi9nm?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_ssl_set.stubYOiYOYAvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_savepoint.stubIOiICvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_field_count.stub<Oi<FGVHvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_reap_async_query.stubqOiqK Avendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_thread_id.stub:Oi:YX?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_execute.stubOi=c?vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_refresh.stubEOiE٤Cvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_next_result.stub=Oi=OlIvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_more_results.stublOil#Avendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_init.stubIOiI-1*@vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_rollback.stub`Oi`Jvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_client_version.stub5Oi5DC7vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli.stub2Oi2aqJvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_affected_rows.stubSOiSMCvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_change_user.stubtOit<vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_poll.stubOieKvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_send_long_data.stublOilrCvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_thread_safe.stub/Oi/GĤEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_sql_exception.stubOi.Evendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_affected_rows.stubEOiEAvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_data_seek.stubPOiP}KBvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_close.stubOixLvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_result_metadata.stub_Oi_퀞٤Evendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_escape_string.stubyOiy0Hvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_client_stats.stubLOiL Bvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_real_query.stubKOiKlIvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_begin_transaction.stubiOiiwФ<vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_ping.stub6Oi6DFvBvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_autocommit.stubJOiJ>6Evendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_connect_errno.stub0Oi0S>Ivendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_get_warnings.stubdOid\'Bvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_field_tell.stubCOiC`Dvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_column.stubOi^EBvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_field_seek.stubOilEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_host_info.stubAOiA`Fvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_insert_id.stubOOiO9Dvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_prepare.stubVOiV`<vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_init.stub1Oi1xfέEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_execute_query.stubOi(iۤHvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_bind_result.stub\Oi\f[Gvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_bind_param.stubjOijuX̬Avendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_select_db.stubMOiM[Bvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_use_result.stubLOiL˞ Cvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_assoc.stubhOih[kEvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_warning_count.stub>Oi>Y!%>vendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_driver.stubGOiGAiBvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_error_list.stubTOiT6GQJvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_server_version.stubCOiC"Gvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_links_stats.stubKOiKs@-Bvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_stmt_fetch.stubFOiFzDvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_store_result.stub]Oi]qFvendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_get_proto_info.stub?Oi?0!Avendor/phpstan/php-8-stubs/stubs/ext/mysqli/mysqli_fetch_row.stubfOifDg=vendor/phpstan/php-8-stubs/stubs/ext/calendar/jewishtojd.stubEOiE;vendor/phpstan/php-8-stubs/stubs/ext/calendar/cal_info.stubOOiOVf@vendor/phpstan/php-8-stubs/stubs/ext/calendar/jdtogregorian.stub;Oi; =vendor/phpstan/php-8-stubs/stubs/ext/calendar/jdtofrench.stub8Oi8dV;vendor/phpstan/php-8-stubs/stubs/ext/calendar/jdtounix.stub3Oi3)&;vendor/phpstan/php-8-stubs/stubs/ext/calendar/unixtojd.stub@Oi@bv=vendor/phpstan/php-8-stubs/stubs/ext/calendar/jdtojulian.stub8Oi8ݝ<vendor/phpstan/php-8-stubs/stubs/ext/calendar/cal_to_jd.stubSOiSoY=vendor/phpstan/php-8-stubs/stubs/ext/calendar/frenchtojd.stubEOiEDvendor/phpstan/php-8-stubs/stubs/ext/calendar/cal_days_in_month.stubsOis V@vendor/phpstan/php-8-stubs/stubs/ext/calendar/gregoriantojd.stubHOiH%g^>vendor/phpstan/php-8-stubs/stubs/ext/calendar/easter_date.stubXOiXM=vendor/phpstan/php-8-stubs/stubs/ext/calendar/juliantojd.stubEOiE>vendor/phpstan/php-8-stubs/stubs/ext/calendar/cal_from_jd.stub^Oi^xա=vendor/phpstan/php-8-stubs/stubs/ext/calendar/jdtojewish.stub^Oi^zA>vendor/phpstan/php-8-stubs/stubs/ext/calendar/easter_days.stubXOiXTX2>vendor/phpstan/php-8-stubs/stubs/ext/calendar/jddayofweek.stubXOiXb>vendor/phpstan/php-8-stubs/stubs/ext/calendar/jdmonthname.stubDOiDtHvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_get_current_byte_index.stubHOiHqF=vendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parser_free.stub>Oi>X9ޤKvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_get_current_column_number.stubKOiKVJKvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_notation_decl_handler.stubOiEvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_default_handler.stub{Oi{Pvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_end_namespace_decl_handler.stubOiՇ-{@vendor/phpstan/php-8-stubs/stubs/ext/xml/xml_get_error_code.stub@Oi@m:Rvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_start_namespace_decl_handler.stubOi "?vendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parser_create.stubnOinkPTvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_processing_instruction_handler.stubOi{NQLvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_character_data_handler.stubOibQvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_external_entity_ref_handler.stubOiq>vendor/phpstan/php-8-stubs/stubs/ext/xml/xml_error_string.stub?Oi?wK7vendor/phpstan/php-8-stubs/stubs/ext/xml/XMLParser.stub!Oi!; A7vendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parse.stub]Oi] NCvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parser_get_option.stubOi=tCvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parser_set_option.stubOiI\xCvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parse_into_struct.stubeOieGRvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_unparsed_entity_decl_handler.stubOi||ߤIvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_get_current_line_number.stubIOiI< Bvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_parser_create_ns.stubhOihEvendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_element_handler.stub Oi ;a<vendor/phpstan/php-8-stubs/stubs/ext/xml/xml_set_object.stubOij:vendor/phpstan/php-8-stubs/stubs/ext/random/lcg_value.stub8Oi8=vendor/phpstan/php-8-stubs/stubs/ext/random/random_bytes.stubZOiZTPCvendor/phpstan/php-8-stubs/stubs/ext/random/Random/RandomError.stubnOinwYHvendor/phpstan/php-8-stubs/stubs/ext/random/Random/CryptoSafeEngine.stubaOia?>vendor/phpstan/php-8-stubs/stubs/ext/random/Random/Engine.stubhOih*Hvendor/phpstan/php-8-stubs/stubs/ext/random/Random/IntervalBoundary.stubEOiEIGvendor/phpstan/php-8-stubs/stubs/ext/random/Random/RandomException.stubvOivaQvendor/phpstan/php-8-stubs/stubs/ext/random/Random/Engine/Xoshiro256StarStar.stub"Oi"n !Fvendor/phpstan/php-8-stubs/stubs/ext/random/Random/Engine/Mt19937.stubOiRvendor/phpstan/php-8-stubs/stubs/ext/random/Random/Engine/PcgOneseq128XslRr64.stubOi|l!Evendor/phpstan/php-8-stubs/stubs/ext/random/Random/Engine/Secure.stubOiǥkBvendor/phpstan/php-8-stubs/stubs/ext/random/Random/Randomizer.stubOi e]Ovendor/phpstan/php-8-stubs/stubs/ext/random/Random/BrokenRandomEngineError.stubOii8vendor/phpstan/php-8-stubs/stubs/ext/random/mt_rand.stubZOiZݐ^6vendor/phpstan/php-8-stubs/stubs/ext/random/srand.stubOi6x<9vendor/phpstan/php-8-stubs/stubs/ext/random/mt_srand.stubOid;vendor/phpstan/php-8-stubs/stubs/ext/random/getrandmax.stubSOiS~Rw5vendor/phpstan/php-8-stubs/stubs/ext/random/rand.stubWOiW4!;vendor/phpstan/php-8-stubs/stubs/ext/random/random_int.stubIOiIY>vendor/phpstan/php-8-stubs/stubs/ext/random/mt_getrandmax.stub:Oi:g6vendor/phpstan/php-8-stubs/stubs/ext/date/getdate.stubROiR]Tp<Fvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_name_from_abbr.stubnOin7vendor/phpstan/php-8-stubs/stubs/ext/date/strftime.stubSOiSt>vendor/phpstan/php-8-stubs/stubs/ext/date/DateObjectError.stubcOicG\Kvendor/phpstan/php-8-stubs/stubs/ext/date/DateInvalidTimeZoneException.stubtOit~MHvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_identifiers_list.stubOi@vendor/phpstan/php-8-stubs/stubs/ext/date/timezone_name_get.stubEOiEJJvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_abbreviations_list.stubPOiPP698vendor/phpstan/php-8-stubs/stubs/ext/date/strtotime.stubyOiyIѤ8vendor/phpstan/php-8-stubs/stubs/ext/date/checkdate.stubEOiE&Avendor/phpstan/php-8-stubs/stubs/ext/date/date_timestamp_get.stubHOiH/a=Kvendor/phpstan/php-8-stubs/stubs/ext/date/DateMalformedStringException.stubtOittkwPvendor/phpstan/php-8-stubs/stubs/ext/date/date_create_immutable_from_format.stubOih7vendor/phpstan/php-8-stubs/stubs/ext/date/DateTime.stubOiҤ9vendor/phpstan/php-8-stubs/stubs/ext/date/gmstrftime.stubUOiU~_qCvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_version_get.stub3Oi3a1nj8vendor/phpstan/php-8-stubs/stubs/ext/date/date_diff.stubOiS~@vendor/phpstan/php-8-stubs/stubs/ext/date/DateTimeImmutable.stub Oi _s19vendor/phpstan/php-8-stubs/stubs/ext/date/date_parse.stubOOiO%-Hvendor/phpstan/php-8-stubs/stubs/ext/date/date_default_timezone_set.stubHOiH`e>vendor/phpstan/php-8-stubs/stubs/ext/date/date_offset_get.stubEOiEZ)Gvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_transitions_get.stubOi 9vendor/phpstan/php-8-stubs/stubs/ext/date/DatePeriod.stubOi@#ZQvendor/phpstan/php-8-stubs/stubs/ext/date/DateMalformedPeriodStringException.stubzOiz& TTvendor/phpstan/php-8-stubs/stubs/ext/date/date_interval_create_from_date_string.stubaOiaa׀ 3vendor/phpstan/php-8-stubs/stubs/ext/date/date.stubIOiIY:vendor/phpstan/php-8-stubs/stubs/ext/date/date_format.stubTOiTq(%Ӥ8vendor/phpstan/php-8-stubs/stubs/ext/date/DateError.stubYOiYCvendor/phpstan/php-8-stubs/stubs/ext/date/date_interval_format.stubXOiXD3vendor/phpstan/php-8-stubs/stubs/ext/date/time.stub Oi eDvendor/phpstan/php-8-stubs/stubs/ext/date/date_create_immutable.stubOiEvendor/phpstan/php-8-stubs/stubs/ext/date/date_parse_from_format.stubkOikMYu<vendor/phpstan/php-8-stubs/stubs/ext/date/DateException.stubaOiaf:vendor/phpstan/php-8-stubs/stubs/ext/date/date_create.stublOil/7vendor/phpstan/php-8-stubs/stubs/ext/date/gmmktime.stubOi˜@vendor/phpstan/php-8-stubs/stubs/ext/date/date_timezone_get.stubWOiW |5vendor/phpstan/php-8-stubs/stubs/ext/date/gmdate.stubKOiKe;vendor/phpstan/php-8-stubs/stubs/ext/date/DateInterval.stubOif@vendor/phpstan/php-8-stubs/stubs/ext/date/DateTimeInterface.stub Oi :vendor/phpstan/php-8-stubs/stubs/ext/date/date_sunset.stubOi`qgFvendor/phpstan/php-8-stubs/stubs/ext/date/date_create_from_format.stubOi4?vendor/phpstan/php-8-stubs/stubs/ext/date/date_isodate_set.stubmOimwl;vendor/phpstan/php-8-stubs/stubs/ext/date/date_sunrise.stubOiˠ4vendor/phpstan/php-8-stubs/stubs/ext/date/idate.stubMOiM185vendor/phpstan/php-8-stubs/stubs/ext/date/mktime.stubOiqd8vendor/phpstan/php-8-stubs/stubs/ext/date/localtime.stuboOio#v<vendor/phpstan/php-8-stubs/stubs/ext/date/date_date_set.stubaOiai&<vendor/phpstan/php-8-stubs/stubs/ext/date/date_sun_info.stubsOis&)Svendor/phpstan/php-8-stubs/stubs/ext/date/DateMalformedIntervalStringException.stub|Oi|oȗLvendor/phpstan/php-8-stubs/stubs/ext/date/DateInvalidOperationException.stubuOiu+`:vendor/phpstan/php-8-stubs/stubs/ext/date/date_modify.stubVOiV {UAvendor/phpstan/php-8-stubs/stubs/ext/date/date_timestamp_set.stubUOiU%=7vendor/phpstan/php-8-stubs/stubs/ext/date/date_sub.stubTOiTq}Hvendor/phpstan/php-8-stubs/stubs/ext/date/date_default_timezone_get.stub8Oi8 H6Cvendor/phpstan/php-8-stubs/stubs/ext/date/date_get_last_errors.stubOOiO֩[7vendor/phpstan/php-8-stubs/stubs/ext/date/date_add.stubTOiT57f@vendor/phpstan/php-8-stubs/stubs/ext/date/date_timezone_set.stub]Oi](;vendor/phpstan/php-8-stubs/stubs/ext/date/DateTimeZone.stubaOiaƲ<vendor/phpstan/php-8-stubs/stubs/ext/date/timezone_open.stubIOiI.Dvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_location_get.stubeOie:¤<vendor/phpstan/php-8-stubs/stubs/ext/date/date_time_set.stubOir@=vendor/phpstan/php-8-stubs/stubs/ext/date/DateRangeError.stubbOib(uBvendor/phpstan/php-8-stubs/stubs/ext/date/timezone_offset_get.stubbOib 6vendor/phpstan/php-8-stubs/stubs/ext/gd/imageflip.stub@Oi@k-Z ?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefrombmp.stub\Oi\DE;vendor/phpstan/php-8-stubs/stubs/ext/gd/imageinterlace.stubPOiP;Dvendor/phpstan/php-8-stubs/stubs/ext/gd/imagetruecolortopalette.stubbOib6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagechar.stubOiڅ<vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegrabscreen.stub6Oi6cO4vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegd.stubIOiI9v5vendor/phpstan/php-8-stubs/stubs/ext/gd/imagepng.stubOiXGC 6vendor/phpstan/php-8-stubs/stubs/ext/gd/imageline.stubeOiex>vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromgd.stubHOiH7r5vendor/phpstan/php-8-stubs/stubs/ext/gd/imagexbm.stubmOim/n?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromtga.stubcOic6>&?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromxbm.stubPOiPW;vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecopymerge.stubOi2\>@vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromavif.stubOiK@vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromwbmp.stubQOiQ 4vendor/phpstan/php-8-stubs/stubs/ext/gd/gd_info.stub<Oi<ՙG9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagedestroy.stub?Oi? ݪ@vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorsforindex.stubcOicO?6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefill.stubQOiQd=vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorstotal.stub;Oi;FpDvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorallocatealpha.stubuOiuX:vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesetstyle.stubGOiG]:vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesetbrush.stubJOiJs>?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromgd2.stubIOiI.7vendor/phpstan/php-8-stubs/stubs/ext/gd/imagetypes.stub&Oi&o JAvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatetruecolor.stubROiRޤCvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorresolvealpha.stubnOin1hV?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagealphablending.stubLOiLcCvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromgd2part.stubvOivH6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagejpeg.stubOiQfBvendor/phpstan/php-8-stubs/stubs/ext/gd/imagegetinterpolation.stub@Oi@W"u5vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegif.stubkOik 6vendor/phpstan/php-8-stubs/stubs/ext/gd/imageavif.stubOiJ(a7vendor/phpstan/php-8-stubs/stubs/ext/gd/imagescale.stub~Oi~F2|>?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefilledpolygon.stub{Oi{)E9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegetclip.stubPOiPrBդBvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolortransparent.stubTOiTϤ8vendor/phpstan/php-8-stubs/stubs/ext/gd/imagestring.stubOi@=vendor/phpstan/php-8-stubs/stubs/ext/gd/imagepalettecopy.stubIOiI\4Avendor/phpstan/php-8-stubs/stubs/ext/gd/imageaffinematrixget.stubOi{98vendor/phpstan/php-8-stubs/stubs/ext/gd/imagerotate.stubUOiUNvAvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorexactalpha.stublOil8vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefilter.stub~Oi~|&9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagettftext.stubOi*j<vendor/phpstan/php-8-stubs/stubs/ext/gd/imageresolution.stubOi)>vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorclosest.stub]Oi]xp=vendor/phpstan/php-8-stubs/stubs/ext/gd/imageistruecolor.stub<Oi< @f<vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolormatch.stubNOiN}LǤ6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecopy.stubOio8vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefttext.stubOi^ 4vendor/phpstan/php-8-stubs/stubs/ext/gd/GdImage.stubAOiA_n ¤Cvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorclosestalpha.stubnOinP9vendor/phpstan/php-8-stubs/stubs/ext/gd/imageellipse.stub{Oi{:5vendor/phpstan/php-8-stubs/stubs/ext/gd/imagearc.stubOi]sF=vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecopyresized.stubOibKܤ<vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefontheight.stubOiPjKK>vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorresolve.stub]Oi]#ޤ?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromgif.stubIOiIik7?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorallocate.stubdOidպ6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagewbmp.stubOiU?;vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefilledarc.stubOi/8vendor/phpstan/php-8-stubs/stubs/ext/gd/imageftbbox.stubOiM;vendor/phpstan/php-8-stubs/stubs/ext/gd/imagerectangle.stubjOij~C7=vendor/phpstan/php-8-stubs/stubs/ext/gd/imageconvolution.stubjOij$ݤ6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagewebp.stubOi%b=vendor/phpstan/php-8-stubs/stubs/ext/gd/imagelayereffect.stubIOiIf^9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagepolygon.stubuOiuC<vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorexact.stub[Oi[Avendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolordeallocate.stubLOiLGڤ@vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromjpeg.stub]Oi]x9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesettile.stubHOiH̤Dvendor/phpstan/php-8-stubs/stubs/ext/gd/imageaffinematrixconcat.stubpOipI.49vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesetclip.stub\Oi\:vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecropauto.stubOi-;vendor/phpstan/php-8-stubs/stubs/ext/gd/imageantialias.stubHOiHYT:vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorset.stubOi\y.5vendor/phpstan/php-8-stubs/stubs/ext/gd/imagebmp.stubOix+9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagettfbbox.stubOidQBvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromstring.stubHOiHc<vendor/phpstan/php-8-stubs/stubs/ext/gd/imagedashedline.stubkOikV?>vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesetthickness.stubMOiM݉5vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegd2.stubOifaBvendor/phpstan/php-8-stubs/stubs/ext/gd/imagesetinterpolation.stubcOic$m<vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegrabwindow.stubmOimp>vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefilltoborder.stublOilyb?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefilledellipse.stubOi7!ܤ8vendor/phpstan/php-8-stubs/stubs/ext/gd/imageaffine.stubeOie :vendor/phpstan/php-8-stubs/stubs/ext/gd/imagestringup.stubOiE4vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesy.stub2Oi2iJ䫤4vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesx.stub2Oi2(QhŤAvendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorclosesthwb.stub`Oi`-خ9vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecolorat.stubMOiMF&Avendor/phpstan/php-8-stubs/stubs/ext/gd/imagefilledrectangle.stubpOipVd0;vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesavealpha.stubHOiHF[8vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecharup.stubOiڤ=vendor/phpstan/php-8-stubs/stubs/ext/gd/imageopenpolygon.stubyOiyޅL?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecopyresampled.stubOiu8:vendor/phpstan/php-8-stubs/stubs/ext/gd/imageloadfont.stubOi"t禤@vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromwebp.stubeOieY 8vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreate.stubIOiI$6vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecrop.stubQOiQ ;vendor/phpstan/php-8-stubs/stubs/ext/gd/imagefontwidth.stubOid~ҤDvendor/phpstan/php-8-stubs/stubs/ext/gd/imagepalettetotruecolor.stubCOiCI3vendor/phpstan/php-8-stubs/stubs/ext/gd/GdFont.stubbOib+<?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecopymergegray.stubOi0cX>vendor/phpstan/php-8-stubs/stubs/ext/gd/imagegammacorrect.stubfOift?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefrompng.stubcOic?vendor/phpstan/php-8-stubs/stubs/ext/gd/imagecreatefromxpm.stub\Oi\:q:vendor/phpstan/php-8-stubs/stubs/ext/gd/imagesetpixel.stubUOiUBiW Bvendor/phpstan/php-8-stubs/stubs/ext/json/json_last_error_msg.stub2Oi2 :vendor/phpstan/php-8-stubs/stubs/ext/json/json_encode.stubOix褤<vendor/phpstan/php-8-stubs/stubs/ext/json/JsonException.stub2Oi2P'<vendor/phpstan/php-8-stubs/stubs/ext/json/json_validate.stubiOii?vendor/phpstan/php-8-stubs/stubs/ext/json/JsonSerializable.stubOiaH:vendor/phpstan/php-8-stubs/stubs/ext/json/json_decode.stubrOirh)>vendor/phpstan/php-8-stubs/stubs/ext/json/json_last_error.stub+Oi+ߏ,Ӥ5vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzwrite.stubOi1]5vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzerror.stubOi4vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzopen.stubOiDӤ:vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzdecompress.stub`Oi`V5vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzflush.stubfOif5vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzerrno.stubOi-+4vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzread.stub]Oi] ѤC5vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzclose.stubfOif\m6vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzerrstr.stubOiWǤ8vendor/phpstan/php-8-stubs/stubs/ext/bz2/bzcompress.stubdOid?Qmu9vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_error.stub<Oi<>ti9vendor/phpstan/php-8-stubs/stubs/ext/curl/CurlHandle.stubDOiD?vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_share_close.stubKOiK>n>vendor/phpstan/php-8-stubs/stubs/ext/curl/CurlMultiHandle.stub'Oi'`f`Bvendor/phpstan/php-8-stubs/stubs/ext/curl/curl_share_strerror.stubBOiBm29vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_pause.stubvOiv i;;vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_version.stubGOiG_F<vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_unescape.stubUOiU>vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_init.stub8Oi85Ƥ?vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_file_create.stub~Oi~1$j@vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_setopt_array.stubQOiQxgL<vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_strerror.stub<Oi<óq@vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_select.stubaOia`x>vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_exec.stub{Oi{ IJBvendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_strerror.stubBOiB:vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_setopt.stubVOiVb?vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_copy_handle.stubMOiM ?vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_close.stubKOiKD$)Gvendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_remove_handle.stubgOigm=vendor/phpstan/php-8-stubs/stubs/ext/curl/CURLStringFile.stubOi'VDvendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_add_handle.stubdOid8QA:@vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_share_setopt.stubgOig9vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_errno.stub9Oi98vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_exec.stubGOiGa7vendor/phpstan/php-8-stubs/stubs/ext/curl/CURLFile.stubOin7B:vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_upkeep.stubOij;vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_getinfo.stubROiR3@vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_setopt.stubgOig}ˤ9vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_reset.stubAOiAuL?vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_errno.stubJOiJ h:vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_escape.stubOi8vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_init.stubFOiFB4?vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_share_errno.stubJOiJuDvendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_getcontent.stubHOiH89vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_close.stub:Oi:09q>vendor/phpstan/php-8-stubs/stubs/ext/curl/CurlShareHandle.stub'Oi'4\4>vendor/phpstan/php-8-stubs/stubs/ext/curl/curl_share_init.stub8Oi8ZHɤCvendor/phpstan/php-8-stubs/stubs/ext/curl/curl_multi_info_read.stubOiԂ(vendor/phpstan/php-8-stubs/stubs/LICENSE Oi V5vendor/phpstan/php-8-stubs/stubs/Zend/gc_disable.stub'Oi'5vendor/phpstan/php-8-stubs/stubs/Zend/gc_enabled.stub'Oi'r}6vendor/phpstan/php-8-stubs/stubs/Zend/Traversable.stubCOiCł;vendor/phpstan/php-8-stubs/stubs/Zend/interface_exists.stubUOiUy<vendor/phpstan/php-8-stubs/stubs/Zend/set_error_handler.stub~Oi~SQ5vendor/phpstan/php-8-stubs/stubs/Zend/FiberError.stubpOipU34vendor/phpstan/php-8-stubs/stubs/Zend/get_class.stub@Oi@Ap:vendor/phpstan/php-8-stubs/stubs/Zend/property_exists.stub{Oi{y1vendor/phpstan/php-8-stubs/stubs/Zend/define.stubOin4vendor/phpstan/php-8-stubs/stubs/Zend/Countable.stub}Oi}ҿ;vendor/phpstan/php-8-stubs/stubs/Zend/get_parent_class.stub]Oi]8vendor/phpstan/php-8-stubs/stubs/Zend/func_get_args.stub+Oi+6;vendor/phpstan/php-8-stubs/stubs/Zend/get_defined_vars.stubEOiE[m?vendor/phpstan/php-8-stubs/stubs/Zend/ReturnTypeWillChange.stubkOikY3vendor/phpstan/php-8-stubs/stubs/Zend/Iterator.stubOi]燤;vendor/phpstan/php-8-stubs/stubs/Zend/InternalIterator.stubOi }1vendor/phpstan/php-8-stubs/stubs/Zend/strcmp.stubBOiB0:vendor/phpstan/php-8-stubs/stubs/Zend/get_resource_id.stubUOiU\ ߤ9vendor/phpstan/php-8-stubs/stubs/Zend/zend_thread_id.stubIOiI0o4vendor/phpstan/php-8-stubs/stubs/Zend/Attribute.stubOi{8vendor/phpstan/php-8-stubs/stubs/Zend/WeakReference.stubOiqq/vendor/phpstan/php-8-stubs/stubs/Zend/is_a.stubOiߤ2vendor/phpstan/php-8-stubs/stubs/Zend/WeakMap.stubDOiD-2vendor/phpstan/php-8-stubs/stubs/Zend/Closure.stubOiɵ(@vendor/phpstan/php-8-stubs/stubs/Zend/get_defined_functions.stubgOig^&4vendor/phpstan/php-8-stubs/stubs/Zend/TypeError.stub*Oi*֤9vendor/phpstan/php-8-stubs/stubs/Zend/ErrorException.stub Oi  m1vendor/phpstan/php-8-stubs/stubs/Zend/strlen.stub0Oi0<6vendor/phpstan/php-8-stubs/stubs/Zend/strncasecmp.stubTOiT*b Bvendor/phpstan/php-8-stubs/stubs/Zend/SensitiveParameterValue.stubOiCzO:vendor/phpstan/php-8-stubs/stubs/Zend/ArithmeticError.stub0Oi0ڏ<vendor/phpstan/php-8-stubs/stubs/Zend/IteratorAggregate.stubOi-E6vendor/phpstan/php-8-stubs/stubs/Zend/enum_exists.stub\Oi\ԩ 6vendor/phpstan/php-8-stubs/stubs/Zend/ArrayAccess.stub5Oi5&+;vendor/phpstan/php-8-stubs/stubs/Zend/get_called_class.stub/Oi/歉@vendor/phpstan/php-8-stubs/stubs/Zend/get_defined_constants.stubbOibVɤ=vendor/phpstan/php-8-stubs/stubs/Zend/SensitiveParameter.stubOiQ4vendor/phpstan/php-8-stubs/stubs/Zend/Generator.stub:Oi:>vendor/phpstan/php-8-stubs/stubs/Zend/DivisionByZeroError.stub>Oi>8դ3vendor/phpstan/php-8-stubs/stubs/Zend/Override.stubOi~}Ϥ5vendor/phpstan/php-8-stubs/stubs/Zend/ParseError.stub2Oi2!7vendor/phpstan/php-8-stubs/stubs/Zend/zend_version.stubMOiM吤5vendor/phpstan/php-8-stubs/stubs/Zend/ValueError.stub+Oi+&ȲBvendor/phpstan/php-8-stubs/stubs/Zend/get_declared_interfaces.stubLOiLu 5:vendor/phpstan/php-8-stubs/stubs/Zend/debug_backtrace.stubOiw|z:vendor/phpstan/php-8-stubs/stubs/Zend/error_reporting.stubCOiCATp5vendor/phpstan/php-8-stubs/stubs/Zend/BackedEnum.stubOiH+Dvendor/phpstan/php-8-stubs/stubs/Zend/restore_exception_handler.stubOiҤBvendor/phpstan/php-8-stubs/stubs/Zend/get_mangled_object_vars.stubCOiC2vendor/phpstan/php-8-stubs/stubs/Zend/defined.stub9Oi9n*b5vendor/phpstan/php-8-stubs/stubs/Zend/Stringable.stubJOiJ}ވ@vendor/phpstan/php-8-stubs/stubs/Zend/restore_error_handler.stubOi$P%)=vendor/phpstan/php-8-stubs/stubs/Zend/get_included_files.stubGOiGT <vendor/phpstan/php-8-stubs/stubs/Zend/gc_collect_cycles.stub-Oi-W>vendor/phpstan/php-8-stubs/stubs/Zend/get_declared_traits.stubHOiH{8 5vendor/phpstan/php-8-stubs/stubs/Zend/Deprecated.stub_Oi_2vendor/phpstan/php-8-stubs/stubs/Zend/strncmp.stubPOiP)4vendor/phpstan/php-8-stubs/stubs/Zend/gc_enable.stub&Oi&V/=vendor/phpstan/php-8-stubs/stubs/Zend/get_required_files.stubUOiULn=vendor/phpstan/php-8-stubs/stubs/Zend/ArgumentCountError.stub7Oi7f-5vendor/phpstan/php-8-stubs/stubs/Zend/user_error.stubOivendor/phpstan/php-8-stubs/stubs/Zend/UnhandledMatchError.stub4Oi4-A3vendor/phpstan/php-8-stubs/stubs/Zend/UnitEnum.stubyOiywGuפ5vendor/phpstan/php-8-stubs/stubs/Zend/strcasecmp.stubFOiFX8vendor/phpstan/php-8-stubs/stubs/Zend/gc_mem_caches.stub0Oi0c6vendor/phpstan/php-8-stubs/stubs/Zend/class_alias.stub[Oi[Ĥ<vendor/phpstan/php-8-stubs/stubs/Zend/get_resource_type.stubZOiZ(ˤ;vendor/phpstan/php-8-stubs/stubs/Zend/extension_loaded.stub>Oi>2[놤7vendor/phpstan/php-8-stubs/stubs/Zend/func_get_arg.stub7Oi77vendor/phpstan/php-8-stubs/stubs/Zend/class_exists.stubMOiM*CF7vendor/phpstan/php-8-stubs/stubs/Zend/Serializable.stubOii@vendor/phpstan/php-8-stubs/stubs/Zend/set_exception_handler.stubgOig#\%>vendor/phpstan/php-8-stubs/stubs/Zend/get_extension_funcs.stub_Oi_!S9vendor/phpstan/php-8-stubs/stubs/Zend/is_subclass_of.stubOi14vendor/phpstan/php-8-stubs/stubs/Zend/gc_status.stub>Oi>0OGvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/apache_get_modules.stub0Oi07ҤNvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/litespeed_request_headers.stubYOiY4SMvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/litespeed_finish_request.stub5Oi5gR,Kvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/apache_request_headers.stub\Oi\8Bvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/getallheaders.stubSOiSgLvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/apache_response_headers.stubdOidcLOvendor/phpstan/php-8-stubs/stubs/sapi/litespeed/litespeed_response_headers.stub>Oi>jDvendor/phpstan/php-8-stubs/stubs/sapi/cli/cli_get_process_title.stub5Oi5|}pDvendor/phpstan/php-8-stubs/stubs/sapi/cli/cli_set_process_title.stub?Oi?֤Evendor/phpstan/php-8-stubs/stubs/sapi/apache2handler/apache_note.stub]Oi]7dPvendor/phpstan/php-8-stubs/stubs/sapi/apache2handler/apache_request_headers.stub4Oi4DhH:Gvendor/phpstan/php-8-stubs/stubs/sapi/apache2handler/getallheaders.stubPOiP(Qvendor/phpstan/php-8-stubs/stubs/sapi/apache2handler/apache_response_headers.stub5Oi5Kvendor/phpstan/php-8-stubs/stubs/sapi/apache2handler/apache_lookup_uri.stubhOihkz-Evendor/phpstan/php-8-stubs/stubs/sapi/cgi/apache_child_terminate.stubUOiU ϤEvendor/phpstan/php-8-stubs/stubs/sapi/cgi/apache_request_headers.stub4Oi4DhH:<vendor/phpstan/php-8-stubs/stubs/sapi/cgi/getallheaders.stubPOiP(Fvendor/phpstan/php-8-stubs/stubs/sapi/cgi/apache_response_headers.stub5Oi5?vendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_prompt.stub8Oi85S=vendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_exec.stub>Oi>e>vendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_clear.stub)Oi)jwGvendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_get_executable.stubFOiF)FCvendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_break_file.stubEOiEr;cGvendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_break_function.stubBOiB{&Cvendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_break_next.stubPOiPdL,Evendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_break_method.stubMOiMJBvendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_end_oplog.stubBOiBoq>vendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_color.stubDOiDψDvendor/phpstan/php-8-stubs/stubs/sapi/phpdbg/phpdbg_start_oplog.stub/Oi/)N+vendor/phpstan/php-8-stubs/Php8StubsMap.phpOi*4ڤ$vendor/phpstan/phpdoc-parser/LICENSE.Oi.-6vendor/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.phpOi]ˤ;vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php?Oi?T<vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php$Oi$̤;vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.phpOiΞ@vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.phpOiԯGvendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.phpOi\6Bvendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php_Oi_HǤBvendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.phpFOiF76Hvendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php!Oi!Avendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.phpOiMvendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.phpAOiA>aAvendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.phpNOiN@=vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.phpSOiS@vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.phpOiF:vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php(Oi(+œ;vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.phpOi!.ߤ=vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.phpMOiMͥR=vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.phpROiRq`>vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.phpOi/,|>vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.phpOiK6ˤ2vendor/phpstan/phpdoc-parser/src/Ast/Attribute.php9Oi9Cvendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.phpOidEvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.phpOi Evendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php=Oi=P1w1Avendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.phpOi[eDvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php;Oi;ĉEIvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.phpOi4|ͤNvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.phpuOiu,wѤGvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.phpOiҳPvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.phpP OiP ]Evendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.phpFOiFDFvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.phpOič @vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.phpOi0KDvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php;Oi;g <vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.phpOi/6vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php*Oi*B,-vendor/phpstan/phpdoc-parser/src/Ast/Node.phpwOiw?S; 7vendor/phpstan/phpdoc-parser/src/Ast/NodeAttributes.phpOiYXTBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.phpOiHCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.phpOi&Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.phpOi6Vvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.phpOiZt:vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php65Oi65}nzCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.phpOiuE此?vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.phpBOiBkN-?vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.phpOiCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.phpOi2KAvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.phpOiAvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.phpOia[vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.phpOi5SUvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.phpOiOؼEvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.phpwOiw6&"!Cvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.phpOi>NIvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.phpOi<Fvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.phpOi2wLvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php:Oi:ęJvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.phpOiPoMvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.phpOi:EˤDvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php:Oi:UBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.phppOip>䍤Dvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php-Oi-Y?ŤJvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.phpOiB'>vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.phpOiNKvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php3Oi3뉤Kvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.phpOipк@vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.phpOiBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.phpOi9eHvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.phpOiĚd=vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php(Oi(XrDvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php2Oi2mBvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.phpOi4>ˤMvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.phpOi^Ivendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.phpOiLM*Jvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.phpLOiL0BKvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.phpOi(TͤFvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.phpTOiT|mFvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.phpOi?4vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php Oi o5vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.phpOiZ63vendor/phpstan/phpdoc-parser/src/Printer/Differ.phpOiRǀ4vendor/phpstan/phpdoc-parser/src/Printer/Printer.phpjOiji1M0vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.phpOi g;vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php> Oi> +t9;vendor/phpstan/phpdoc-parser/src/Parser/ParserException.phpg Oig u/g6vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.phpOiYդ;vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php<'Oi<'t8vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.phpYOiY=ߤ9vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php#Oi#G#|9vendor/nette/robot-loader/src/RobotLoader/RobotLoader.php@Oi@ځN1vendor/nette/utils/ncs.xmlOi,vendor/nette/utils/src/Utils/ObjectMixin.phpOi}X*vendor/nette/utils/src/Utils/ArrayList.php Oi ,U|'vendor/nette/utils/src/Utils/Random.phpOi[8פ*vendor/nette/utils/src/Utils/ArrayHash.phpNOiNh.*vendor/nette/utils/src/Utils/Paginator.phpOi=E'vendor/nette/utils/src/Utils/Floats.phpm Oim p؝&vendor/nette/utils/src/Utils/Image.php`Oi`*s*+vendor/nette/utils/src/Utils/exceptions.phpOiG ¤+vendor/nette/utils/src/Utils/Validators.php+Oi+'vendor/nette/utils/src/Utils/Arrays.php1Oi1W>Ȥ%vendor/nette/utils/src/Utils/Json.phpOiX+vendor/nette/utils/src/Utils/FileSystem.php Oi A%vendor/nette/utils/src/Utils/Html.phpZOiZKpe+vendor/nette/utils/src/Utils/Reflection.php{7Oi{7xǶ)vendor/nette/utils/src/Utils/DateTime.php_Oi_p(vendor/nette/utils/src/Utils/Helpers.php Oi Ӥ(vendor/nette/utils/src/Utils/Strings.phpqQOiqQݤ%vendor/nette/utils/src/Utils/Type.phpOi+n.vendor/nette/utils/src/Utils/ObjectHelpers.phpFOiFm)vendor/nette/utils/src/Utils/Callback.phpOiF-6vendor/nette/di/src/Bridges/DITracy/ContainerPanel.phpi Oii -(vendor/nette/finder/src/Utils/Finder.php*Oi*7 ߤvendor/nette/neon/PATCHES.txtOi0O(vendor/nette/neon/src/Neon/Traverser.phpjOij bͤ*vendor/nette/neon/src/Neon/TokenStream.php.Oi.p$vendor/nette/neon/src/Neon/Lexer.php Oi &%vendor/nette/neon/src/Neon/Entity.phpOicX$vendor/nette/neon/src/Neon/Token.php}Oi}! 3vendor/nette/neon/src/Neon/Node/EntityChainNode.phpOi߅.vendor/nette/neon/src/Neon/Node/StringNode.php Oi Ŭ23vendor/nette/neon/src/Neon/Node/InlineArrayNode.php_Oi_1vendor/nette/neon/src/Neon/Node/ArrayItemNode.phpOieF/vendor/nette/neon/src/Neon/Node/LiteralNode.phpE OiE Ĥ.vendor/nette/neon/src/Neon/Node/EntityNode.phpYOiY)GФ-vendor/nette/neon/src/Neon/Node/ArrayNode.phpOik2vendor/nette/neon/src/Neon/Node/BlockArrayNode.phpOiٖ&#vendor/nette/neon/src/Neon/Neon.phpOiޤ&vendor/nette/neon/src/Neon/Encoder.phph Oih ڤ#vendor/nette/neon/src/Neon/Node.phpOi}E1Ф(vendor/nette/neon/src/Neon/Exception.php7Oi7 &vendor/nette/neon/src/Neon/Decoder.phpOi/|T%vendor/nette/neon/src/Neon/Parser.php!Oi!I{vendor/nette/neon/bin/neon-lintKOiKULĤ9vendor/nette/php-generator/src/PhpGenerator/ClassType.phpF;OiF;.08vendor/nette/php-generator/src/PhpGenerator/EnumCase.phpOiW9vendor/nette/php-generator/src/PhpGenerator/Attribute.php_Oi_8vendor/nette/php-generator/src/PhpGenerator/Property.php Oi s,7vendor/nette/php-generator/src/PhpGenerator/Closure.phpOiGe8vendor/nette/php-generator/src/PhpGenerator/Constant.phpOio4`6vendor/nette/php-generator/src/PhpGenerator/Method.php Oi bz:vendor/nette/php-generator/src/PhpGenerator/PhpLiteral.phpOi)&9vendor/nette/php-generator/src/PhpGenerator/Parameter.php+ Oi+ t:vendor/nette/php-generator/src/PhpGenerator/PsrPrinter.phpOiEvendor/nette/php-generator/src/PhpGenerator/Traits/AttributeAware.phpOim@vendor/nette/php-generator/src/PhpGenerator/Traits/NameAware.phpOiJ Cvendor/nette/php-generator/src/PhpGenerator/Traits/CommentAware.phpOi=|Fvendor/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php<Oi<alCvendor/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php0Oi0QY9vendor/nette/php-generator/src/PhpGenerator/Extractor.php >Oi >w*Avendor/nette/php-generator/src/PhpGenerator/PromotedParameter.phpOi7vendor/nette/php-generator/src/PhpGenerator/Literal.php Oi =[7vendor/nette/php-generator/src/PhpGenerator/Helpers.phpOi@i]8vendor/nette/php-generator/src/PhpGenerator/TraitUse.phpOi\>vendor/nette/php-generator/src/PhpGenerator/GlobalFunction.phpOi;:p6vendor/nette/php-generator/src/PhpGenerator/Dumper.php8#Oi8#J<vendor/nette/php-generator/src/PhpGenerator/PhpNamespace.phpC'OiC'Q7vendor/nette/php-generator/src/PhpGenerator/Factory.php3Oi3B4vendor/nette/php-generator/src/PhpGenerator/Type.phpXOiXCۤ7vendor/nette/php-generator/src/PhpGenerator/PhpFile.phpOi%ۤ7vendor/nette/php-generator/src/PhpGenerator/Printer.php[4Oi[4+٤"vendor/nette/php-generator/ncs.php'Oi'R,vendor/nette/schema/src/Schema/Processor.php Oi 3vendor/nette/schema/src/Schema/DynamicParameter.phpOinӒf6vendor/nette/schema/src/Schema/ValidationException.phpOi^*vendor/nette/schema/src/Schema/Context.phpOiy18)vendor/nette/schema/src/Schema/Expect.php Oi j㷤)vendor/nette/schema/src/Schema/Schema.phpyOiyr1vendor/nette/schema/src/Schema/Elements/AnyOf.phpVOiV ٤5vendor/nette/schema/src/Schema/Elements/Structure.phpOiO0vendor/nette/schema/src/Schema/Elements/Base.phpOia䃤0vendor/nette/schema/src/Schema/Elements/Type.phpOiS*vendor/nette/schema/src/Schema/Helpers.php Oi ]*vendor/nette/schema/src/Schema/Message.php Oi BZ<5vendor/nette/bootstrap/src/Bootstrap/Configurator.php,Oi,#WҤFvendor/nette/bootstrap/src/Bootstrap/Extensions/ConstantsExtension.php)Oi)W5@vendor/nette/bootstrap/src/Bootstrap/Extensions/PhpExtension.phpQOiQШ+vendor/nette/bootstrap/src/Configurator.phpOiC82vendor/ondram/ci-detector/src/Ci/Continuousphp.phpiOii1vendor/ondram/ci-detector/src/Ci/AwsCodeBuild.phpOisH-vendor/ondram/ci-detector/src/Ci/AppVeyor.phpOilP2vendor/ondram/ci-detector/src/Ci/GitHubActions.phpOi/vendor/ondram/ci-detector/src/Ci/AbstractCi.phpOi_*vendor/ondram/ci-detector/src/Ci/Buddy.phpOi+vendor/ondram/ci-detector/src/Ci/Bamboo.php8Oi83bh-vendor/ondram/ci-detector/src/Ci/Codeship.phpOi}m+vendor/ondram/ci-detector/src/Ci/Circle.phpOi]_0vendor/ondram/ci-detector/src/Ci/CiInterface.phpOiSO5+vendor/ondram/ci-detector/src/Ci/Travis.phpOiTN,vendor/ondram/ci-detector/src/Ci/Wercker.php.Oi.q*vendor/ondram/ci-detector/src/Ci/Drone.php2Oi2=3E+vendor/ondram/ci-detector/src/Ci/GitLab.phpOi M|,vendor/ondram/ci-detector/src/Ci/Jenkins.phpOi13À-vendor/ondram/ci-detector/src/Ci/TeamCity.phpOiA7!7vendor/ondram/ci-detector/src/Ci/BitbucketPipelines.phpOi[Bvendor/ondram/ci-detector/src/Exception/CiNotDetectedException.phpOi%Ye,vendor/ondram/ci-detector/src/CiDetector.php Oi W:.vendor/ondram/ci-detector/src/TrinaryLogic.php?Oi?V%vendor/ondram/ci-detector/src/Env.phpOiښ6vendor/symfony/string/Inflector/InflectorInterface.phpVOiV҇(4vendor/symfony/string/Inflector/EnglishInflector.phpBOiBפ3vendor/symfony/string/Inflector/FrenchInflector.php$Oi$?T$vendor/symfony/string/ByteString.php<Oi<'vendor/symfony/string/UnicodeString.php2Oi246vendor/symfony/string/Exception/ExceptionInterface.phpcOice٤4vendor/symfony/string/Exception/RuntimeException.phpOi Ҥ<vendor/symfony/string/Exception/InvalidArgumentException.phpOiLO(vendor/symfony/string/AbstractString.phpOOiOݯvendor/symfony/string/LICENSE,Oi,զ_Ϥ-vendor/symfony/string/Resources/functions.phppOipu3<vendor/symfony/string/Resources/data/wcswidth_table_wide.phpOiq<vendor/symfony/string/Resources/data/wcswidth_table_zero.phpOi`$vendor/symfony/string/LazyString.phprOir.vendor/symfony/string/Slugger/AsciiSlugger.php3Oi3a/2vendor/symfony/string/Slugger/SluggerInterface.phpOiGH/vendor/symfony/string/AbstractUnicodeString.phpaiOiaiw)vendor/symfony/string/CodePointString.phpOiA65vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpg Oig E{-vendor/symfony/polyfill-intl-grapheme/LICENSE,Oi,H3vendor/symfony/polyfill-intl-grapheme/bootstrap.phpOi2vendor/symfony/polyfill-intl-grapheme/Grapheme.php8&Oi8&I7vendor/symfony/polyfill-intl-normalizer/bootstrap80.phpOi,6vendor/symfony/polyfill-intl-normalizer/Normalizer.phpd%Oid%u/vendor/symfony/polyfill-intl-normalizer/LICENSE,Oi,HLvendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.phpD5OiD5 Rvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.phpDOiD'CԤTvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php{Oi{jeXvendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.phpoOioc,Fvendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.phpOi%5vendor/symfony/polyfill-intl-normalizer/bootstrap.phpOi#p 'vendor/symfony/polyfill-php81/Php81.phpOi$%vendor/symfony/polyfill-php81/LICENSE,Oi,0@vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.phpOiJTFvendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.phpOi5++vendor/symfony/polyfill-php81/bootstrap.phpOi<P-vendor/symfony/process/Pipes/WindowsPipes.phpoOio M4&/vendor/symfony/process/Pipes/PipesInterface.phpOiϤ*vendor/symfony/process/Pipes/UnixPipes.phpOi:V.vendor/symfony/process/Pipes/AbstractPipes.phpOiX裤+vendor/symfony/process/ExecutableFinder.php Oi bT.vendor/symfony/process/PhpExecutableFinder.phpa Oia Dʤ;vendor/symfony/process/Exception/ProcessFailedException.phpIOiIxN=vendor/symfony/process/Exception/ProcessTimedOutException.php|Oi|wy7vendor/symfony/process/Exception/ExceptionInterface.phpOi[h5vendor/symfony/process/Exception/RuntimeException.phpOi6r=vendor/symfony/process/Exception/InvalidArgumentException.phpOi)&3vendor/symfony/process/Exception/LogicException.phpOivx.,=vendor/symfony/process/Exception/ProcessSignaledException.phpOi1 'vendor/symfony/process/ProcessUtils.php\Oi\1pZvendor/symfony/process/LICENSE,Oi,U&vendor/symfony/process/InputStream.php Oi C7%vendor/symfony/process/PhpProcess.php Oi L煇"vendor/symfony/process/Process.phpOi-vendor/symfony/polyfill-ctype/bootstrap80.phphOihf פ%vendor/symfony/polyfill-ctype/LICENSE,Oi,'vendor/symfony/polyfill-ctype/Ctype.phpOi2|t+vendor/symfony/polyfill-ctype/bootstrap.php,Oi,cդ%vendor/symfony/polyfill-php73/LICENSE,Oi,?vendor/symfony/polyfill-php73/Resources/stubs/JsonException.phpEOiE8S+vendor/symfony/polyfill-php73/bootstrap.phpOi|'vendor/symfony/polyfill-php73/Php73.phpbOibJ<9vendor/symfony/finder/Exception/AccessDeniedException.phpOinh>vendor/symfony/finder/Exception/DirectoryNotFoundException.phpOi6q#vendor/symfony/finder/Gitignore.php% Oi% G;I9vendor/symfony/finder/Iterator/FilenameFilterIterator.phpOi|<vendor/symfony/finder/Iterator/FilecontentFilterIterator.phpOiP;vendor/symfony/finder/Iterator/DepthRangeFilterIterator.phpOi"dԤ9vendor/symfony/finder/Iterator/FileTypeFilterIterator.phpOim,p5vendor/symfony/finder/Iterator/PathFilterIterator.phpOi¹=vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php Oi :vendor/symfony/finder/Iterator/SizeRangeFilterIterator.phpOi>yZ:vendor/symfony/finder/Iterator/DateRangeFilterIterator.phpOiDCAvendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php Oi F;^;vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.phpOi=Mh7vendor/symfony/finder/Iterator/CustomFilterIterator.php3Oi393vendor/symfony/finder/Iterator/SortableIterator.phpjOij93=vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.phpOiSK/vendor/symfony/finder/Iterator/LazyIterator.phpOivendor/symfony/finder/LICENSE,Oi,Uvendor/symfony/finder/Glob.phpJOiJ5vendor/symfony/finder/Comparator/NumberComparator.php Oi g\ 3vendor/symfony/finder/Comparator/DateComparator.phpOir/vendor/symfony/finder/Comparator/Comparator.php Oi [ vendor/symfony/finder/Finder.phpXOiX}%vendor/symfony/finder/SplFileInfo.php,Oi,0vendor/symfony/polyfill-mbstring/bootstrap80.php'Oi'L#\M(vendor/symfony/polyfill-mbstring/LICENSE,Oi,H@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.phpfOifPBvendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.phpa Oia |ⳤFvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php9Oi9>|zK@vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php_Oi_d-vendor/symfony/polyfill-mbstring/Mbstring.phpJOiJŮ.vendor/symfony/polyfill-mbstring/bootstrap.php!Oi!d,vendor/symfony/deprecation-contracts/LICENSE,Oi, K1vendor/symfony/deprecation-contracts/function.php2Oi20%vendor/symfony/polyfill-php74/LICENSE,Oi,զ_Ϥ+vendor/symfony/polyfill-php74/bootstrap.php%Oi% 'vendor/symfony/polyfill-php74/Php74.php Oi AV܀'vendor/symfony/polyfill-php80/Php80.php Oi cH%vendor/symfony/polyfill-php80/LICENSE,Oi, K;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.phpOiMK<<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php>Oi>g:vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.phpwOiw=7T8<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpOit]\ڤEvendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.phpGOiGֈ+*vendor/symfony/polyfill-php80/PhpToken.phpOi]f+vendor/symfony/polyfill-php80/bootstrap.phpOi.Ĥ3vendor/symfony/service-contracts/ResetInterface.phpOi@vendor/symfony/service-contracts/Attribute/SubscribedService.php:Oi:洤7vendor/symfony/service-contracts/Attribute/Required.phpOi,g<;vendor/symfony/service-contracts/ServiceSubscriberTrait.phpOik=vendor/symfony/service-contracts/ServiceProviderInterface.phpOiUn(vendor/symfony/service-contracts/LICENSE,Oi,?vendor/symfony/service-contracts/ServiceSubscriberInterface.phpOi|z8vendor/symfony/service-contracts/ServiceLocatorTrait.php Oi A(vendor/symfony/console/ConsoleEvents.phpOi0bä!vendor/symfony/console/Cursor.php?Oi?a0vendor/symfony/console/Output/BufferedOutput.phpcOic6vendor/symfony/console/Output/ConsoleSectionOutput.phpOiԤ(vendor/symfony/console/Output/Output.phpgOigݬ5vendor/symfony/console/Output/TrimmedBufferOutput.phpoOiohVU/vendor/symfony/console/Output/ConsoleOutput.php)Oi) |.vendor/symfony/console/Output/StreamOutput.phpOi.z-8vendor/symfony/console/Output/ConsoleOutputInterface.php1Oi1*HL1vendor/symfony/console/Output/OutputInterface.phpt Oit M4A,vendor/symfony/console/Output/NullOutput.php8 Oi8 ?.vendor/symfony/console/Attribute/AsCommand.phpNOiNM;vendor/symfony/console/Exception/InvalidOptionException.phpOiz?vendor/symfony/console/Exception/NamespaceNotFoundException.phpOiX#|7vendor/symfony/console/Exception/ExceptionInterface.phpOi[&5vendor/symfony/console/Exception/RuntimeException.phpOih:vendor/symfony/console/Exception/MissingInputException.phpOi.(=vendor/symfony/console/Exception/InvalidArgumentException.phpOi h3vendor/symfony/console/Exception/LogicException.phpOilФ=vendor/symfony/console/Exception/CommandNotFoundException.phpOi$+Ӥ2vendor/symfony/console/CI/GithubActionReporter.php# Oi# *Dvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.phpOieZz.vendor/symfony/console/Command/ListCommand.php Oi XOȤ=vendor/symfony/console/Command/SignalableCommandInterface.phpOi *vendor/symfony/console/Command/Command.phpPOiP2vendor/symfony/console/Command/CompleteCommand.php Oi R8vendor/symfony/console/Command/DumpCompletionCommand.phpOiu'0vendor/symfony/console/Command/LockableTrait.php$Oi$.vendor/symfony/console/Command/HelpCommand.php Oi F.vendor/symfony/console/Command/LazyCommand.phpFOiF5P8vendor/symfony/console/SignalRegistry/SignalRegistry.phpDOiDO6vendor/symfony/console/EventListener/ErrorListener.php^ Oi^ vendor/symfony/console/LICENSE,Oi,U0vendor/symfony/console/Resources/completion.bash Oi z(4vendor/symfony/console/Resources/bin/hiddeninput.exe$Oi$v/vendor/symfony/console/Logger/ConsoleLogger.phpOi44vendor/symfony/console/Event/ConsoleCommandEvent.php=Oi=Y 6vendor/symfony/console/Event/ConsoleTerminateEvent.phpjOij@-vendor/symfony/console/Event/ConsoleEvent.phpOiYh3vendor/symfony/console/Event/ConsoleSignalEvent.phpOiJ2vendor/symfony/console/Event/ConsoleErrorEvent.php"Oi" vendor/symfony/console/Color.phpZOiZsJ,vendor/symfony/console/Input/InputOption.php`Oi`J,{0vendor/symfony/console/Input/InputDefinition.phpT.OiT.ۤ,vendor/symfony/console/Input/StringInput.php Oi 9vendor/symfony/console/Input/StreamableInputInterface.phpzOizĊ4vendor/symfony/console/Input/InputAwareInterface.phpLOiLLǤ&vendor/symfony/console/Input/Input.php=Oi=+vendor/symfony/console/Input/ArrayInput.phpOiۤ/vendor/symfony/console/Input/InputInterface.phpOiLؤ.vendor/symfony/console/Input/InputArgument.php Oi |1*vendor/symfony/console/Input/ArgvInput.php0Oi0/vendor/symfony/console/Tester/CommandTester.phpJ OiJ /@vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.phpOi` 9vendor/symfony/console/Tester/CommandCompletionTester.phpLOiLTH-vendor/symfony/console/Tester/TesterTrait.phpOij#3vendor/symfony/console/Tester/ApplicationTester.php Oi v+vendor/symfony/console/Helper/TableRows.phpVOiVVդ'vendor/symfony/console/Helper/Table.phpsOisʤ6vendor/symfony/console/Helper/DebugFormatterHelper.php\ Oi\ o-2vendor/symfony/console/Helper/DescriptorHelper.php Oi ,vendor/symfony/console/Helper/TableStyle.php0Oi0o0vendor/symfony/console/Helper/TableSeparator.php%Oi%kĤ+vendor/symfony/console/Helper/HelperSet.phpE OiE +vendor/symfony/console/Helper/TableCell.phpOiĖˤ-vendor/symfony/console/Helper/ProgressBar.phpOHOiOHO1vendor/symfony/console/Helper/HelperInterface.php^Oi^D(vendor/symfony/console/Helper/Helper.phpOi/vendor/symfony/console/Helper/ProcessHelper.phpOi؝(vendor/symfony/console/Helper/Dumper.phpXOiX#0vendor/symfony/console/Helper/QuestionHelper.phpLOiL1vendor/symfony/console/Helper/FormatterHelper.php Oi Ť2vendor/symfony/console/Helper/InputAwareHelper.php!Oi!"Bvendor/symfony/console/Formatter/OutputFormatterStyleInterface.phpiOiiZ9vendor/symfony/console/Formatter/OutputFormatterStyle.php Oi 8vendor/symfony/console/Formatter/NullOutputFormatter.phpoOio^T봤4vendor/symfony/console/Formatter/OutputFormatter.php Oi 9cF>vendor/symfony/console/Formatter/OutputFormatterStyleStack.php+ Oi+ t(O=vendor/symfony/console/Formatter/OutputFormatterInterface.phpDOiD[Fvendor/symfony/console/Formatter/WrappableOutputFormatterInterface.phpOiZ=vendor/symfony/console/Formatter/NullOutputFormatterStyle.phpOi–Q0Avendor/symfony/console/Completion/Output/BashCompletionOutput.phpOiSǣaFvendor/symfony/console/Completion/Output/CompletionOutputInterface.phpOio U;vendor/symfony/console/Completion/CompletionSuggestions.phpnOinSA0vendor/symfony/console/Completion/Suggestion.phpOi5vendor/symfony/console/Completion/CompletionInput.php[ Oi[ 7K '&vendor/symfony/console/Application.phpOiKZ#vendor/symfony/console/Terminal.phpmOim?vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpOic?vendor/symfony/console/CommandLoader/ContainerCommandLoader.phpOiV=vendor/symfony/console/CommandLoader/FactoryCommandLoader.phpeOiew!,vendor/symfony/console/Style/OutputStyle.phpL OiL o/vendor/symfony/console/Style/StyleInterface.phpR OiR 3-vendor/symfony/console/Style/SymfonyStyle.php9Oi9ޤ vendor/clue/ndjson-react/LICENSE:Oi:DiG(vendor/clue/ndjson-react/src/Encoder.phpOiY(vendor/clue/ndjson-react/src/Decoder.phpOiCvendor/autoload.phpOiv֤$vendor/fig/http-message-util/LICENSE=Oi=?;vendor/fig/http-message-util/src/RequestMethodInterface.phpOiC>8vendor/fig/http-message-util/src/StatusCodeInterface.phpyOiy!-vendor/ondrejmirtes/better-reflection/LICENSE6Oi6WwXvendor/ondrejmirtes/better-reflection/src/NodeCompiler/Exception/UnableToCompileNode.phpOivNҺHvendor/ondrejmirtes/better-reflection/src/NodeCompiler/CompiledValue.phpOi_Mvendor/ondrejmirtes/better-reflection/src/NodeCompiler/CompileNodeToValue.php3Oi3TJvendor/ondrejmirtes/better-reflection/src/NodeCompiler/CompilerContext.php_Oi_ZW[vendor/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Exception/ParseToAstFailure.phpOiJ:Uvendor/ondrejmirtes/better-reflection/src/SourceLocator/Ast/FindReflectionsInTree.php0Oi0d Gvendor/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Locator.php( Oi( aVvendor/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Parser/MemoizingParser.phpOig Yvendor/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Strategy/NodeToReflection.php Oi |~^vendor/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Strategy/AstConversionStrategy.phpOiϜUvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidFileInfo.php+Oi+J"\vendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NoAnonymousClassOnLine.phpOi\Vvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidDirectory.phpOidTVvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NotInternalClass.phpOizׯ[vendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/TwoClosuresOnSameLine.phprOirӤbvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/EvaledClosureCannotBeLocated.php$Oi$dϤYvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidFileLocation.phpOiUvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NoClosureOnLine.phppOipGcvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/TwoAnonymousClassesOnSameLine.phpOiM/Wvendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/FunctionUndefined.phpVOiVN0ivendor/ondrejmirtes/better-reflection/src/SourceLocator/Exception/EvaledAnonymousClassCannotBeLocated.php3Oi36ǮVvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/AbstractSourceLocator.php= Oi= *Uvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/ClosureSourceLocator.php}Oi}M$ФWvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/AggregateSourceLocator.phpOiHlvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForComposerJson.phpOiL+pvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/MissingInstalledJson.phpOi"osvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/InvalidProjectDirectory.phpOi!4lovendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/MissingComposerJson.phpOiT_ʤevendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/Exception.phpOiZ\mvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/FailedToParseJson.phpOi'<|vendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForComposerJsonAndInstalledJson.phpo Oio :mvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForInstalledJson.phpOi#@Yvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Psr4Mapping.php Oi lvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Exception/InvalidPrefixMapping.phpsOis󴜤avendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Exception/Exception.phpOiYvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Psr0Mapping.phpGOiG'ebvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/PsrAutoloaderMapping.phpvOiv'֤^vendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/PsrAutoloaderLocator.php Oi X4mWvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/MemoizingSourceLocator.php Oi _ۤXvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/EvaledCodeSourceLocator.phpOiWvVvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/ComposerSourceLocator.phpOiҤNvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/SourceLocator.php+Oi+C=bvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/AnonymousClassObjectSourceLocator.phpDOiDNwYvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/DirectoriesSourceLocator.phpOi8QvYYvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/PhpInternalSourceLocator.php2 Oi2 pvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/AutoloadSourceLocator/FileReadTrapStreamWrapper.php~Oi~J`Vvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/AutoloadSourceLocator.php.Oi.ySTvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/StringSourceLocator.php1Oi1<>٤Zvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/FileIteratorSourceLocator.php Oi ʑqWXvendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/SingleFileSourceLocator.phpTOiTzE{G`vendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/AggregateSourceStubber.phpOi)avendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/ReflectionSourceStubber.php(zOi(zSa:mvendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/Exception/CouldNotFindPhpStormStubs.php0Oi0~fvendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubs/CachingVisitor.phptOitRvendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/StubData.phpOi$դWvendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/SourceStubber.phpOiϭdvendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php|Oi|GQvendor/ondrejmirtes/better-reflection/src/SourceLocator/Located/LocatedSource.php Oi SΤYvendor/ondrejmirtes/better-reflection/src/SourceLocator/Located/InternalLocatedSource.php Oi zWvendor/ondrejmirtes/better-reflection/src/SourceLocator/Located/EvaledLocatedSource.php4Oi4{rjZvendor/ondrejmirtes/better-reflection/src/SourceLocator/Located/AnonymousLocatedSource.phptOitm Vvendor/ondrejmirtes/better-reflection/src/SourceLocator/Located/AliasLocatedSource.phpOOiOGvendor/ondrejmirtes/better-reflection/src/SourceLocator/FileChecker.phpOi)MGvendor/ondrejmirtes/better-reflection/src/Identifier/IdentifierType.phpOilޤXvendor/ondrejmirtes/better-reflection/src/Identifier/Exception/InvalidIdentifierName.phpeOieZJCvendor/ondrejmirtes/better-reflection/src/Identifier/Identifier.phpOiqb!Kvendor/ondrejmirtes/better-reflection/src/Util/Exception/NoNodePosition.phpOi$Pvendor/ondrejmirtes/better-reflection/src/Util/Exception/InvalidNodePosition.phpVOiV>UݤHvendor/ondrejmirtes/better-reflection/src/Util/ClassExistenceChecker.php{Oi{JGvendor/ondrejmirtes/better-reflection/src/Util/FindReflectionOnLine.phpOiP5ˤ=vendor/ondrejmirtes/better-reflection/src/Util/FileHelper.phpf Oif AuLFvendor/ondrejmirtes/better-reflection/src/Util/ConstantNodeChecker.phpOi߸CLvendor/ondrejmirtes/better-reflection/src/Util/CalculateReflectionColumn.phpOi5_Dvendor/ondrejmirtes/better-reflection/src/Util/GetLastDocComment.phpOit>vendor/ondrejmirtes/better-reflection/src/BetterReflection.phpOiJSo3Gvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionType.phpV OiV =aPvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionClassConstant.php)Oi)axפKvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionConstant.php'Oi'\vendor/ondrejmirtes/better-reflection/src/Reflection/Attribute/ReflectionAttributeHelper.php3 Oi3 KZvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/MethodPrototypeNotFound.phpOi27VTvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/CircularReference.phpmOim"[vendor/ondrejmirtes/better-reflection/src/Reflection/Exception/ObjectNotInstanceOfClass.phpxOix wWvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/FunctionDoesNotExist.php{Oi{cSvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/NoObjectProvided.phpOi/Zvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidDefaultValueType.phpOiudBNvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/NotAnObject.phpOi_vendor/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidArrowFunctionBodyNode.php,Oi,pJͤVvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/CodeLocationMissing.phpOiVvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidConstantNode.phpOi ՗Vvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/PropertyIsNotStatic.php[Oi[Tvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/ClassDoesNotExist.phpOinWvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/PropertyDoesNotExist.php]Oi]/7i[Kvendor/ondrejmirtes/better-reflection/src/Reflection/Exception/NoParent.phpOiߤSvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionFunctionAbstract.phpj<Oij<LIvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionObject.php6Oi6PBeKvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionEnumCase.phpOi='Lvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionUnionType.php Oi XXvendor/ondrejmirtes/better-reflection/src/Reflection/Adapter/FakeReflectionAttribute.phpOir [vendor/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionIntersectionType.php1Oi1{wOvendor/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnum.phpSKOiSKWTvendor/ondrejmirtes/better-reflection/src/Reflection/Annotation/AnnotationHelper.php2Oi2i ˤHvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionClass.phpOi ZVvendor/ondrejmirtes/better-reflection/src/Reflection/Support/AlreadyVisitedClasses.php]Oi]%0avendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionAttributeStringCast.phpWOiWhW`vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionFunctionStringCast.php Oi F[3`vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionConstantStringCast.phpOip\vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionTypeStringCast.php:Oi:l1τavendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionParameterStringCast.phpeOie *^vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionMethodStringCast.phpyOiy+`vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionPropertyStringCast.phpJOiJ/]vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionClassStringCast.php(#Oi(#U`vendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionEnumCaseStringCast.phpOi2^evendor/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionClassConstantStringCast.phpOim4Svendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionIntersectionType.php Oi Gvendor/ondrejmirtes/better-reflection/src/Reflection/ReflectionEnum.phpjOij 2Avendor/ondrejmirtes/better-reflection/src/Reflector/Reflector.phpOibyIvendor/ondrejmirtes/better-reflection/src/Reflector/FunctionReflector.phpOia8ҤTvendor/ondrejmirtes/better-reflection/src/Reflector/Exception/IdentifierNotFound.phpLOiLޤ'Ivendor/ondrejmirtes/better-reflection/src/Reflector/ConstantReflector.phpOi$EHvendor/ondrejmirtes/better-reflection/src/Reflector/DefaultReflector.phpOiFvendor/ondrejmirtes/better-reflection/src/Reflector/ClassReflector.phpOiE3vendor/ondrejmirtes/better-reflection/renovate.jsonOi{vendor/react/event-loop/LICENSEuOiu{-vendor/react/event-loop/src/LoopInterface.phpKOiK1פ,vendor/react/event-loop/src/ExtEventLoop.phpOiȤ)vendor/react/event-loop/src/ExtUvLoop.php#Oi#ѡ,vendor/react/event-loop/src/ExtLibevLoop.phpOitNo/vendor/react/event-loop/src/ExtLibeventLoop.php!Oi!Ԓ.vendor/react/event-loop/src/TimerInterface.phpOiר4vendor/react/event-loop/src/Tick/FutureTickQueue.phpOiN)vendor/react/event-loop/src/ExtEvLoop.phpOip+vendor/react/event-loop/src/Timer/Timer.php6Oi6ulѤ,vendor/react/event-loop/src/Timer/Timers.php Oi B;$vendor/react/event-loop/src/Loop.php9Oi9rD'vendor/react/event-loop/src/Factory.php<Oi<Kc!0vendor/react/event-loop/src/StreamSelectLoop.php/Oi/*'.vendor/react/event-loop/src/SignalsHandler.php+Oi+V;"vendor/react/child-process/LICENSEuOiu{*vendor/react/child-process/src/Process.php:Oi:w/vendor/react/socket/LICENSEuOiu{.vendor/react/socket/src/ConnectorInterface.php=Oi=\m(vendor/react/socket/src/TcpConnector.phpOi(jH$vendor/react/socket/src/FdServer.phpOi#-vendor/react/socket/src/FixedUriConnector.php<Oi<H,vendor/react/socket/src/StreamEncryption.phpOî B"vendor/react/socket/src/Server.phpOisM+vendor/react/socket/src/ServerInterface.phpOiЯ:vendor/react/socket/src/HappyEyeBallsConnectionBuilder.php-Oi-T3Ѥ/vendor/react/socket/src/ConnectionInterface.phpmOim)vendor/react/socket/src/UnixConnector.phpOig%vendor/react/socket/src/TcpServer.php"Oi"L(vendor/react/socket/src/DnsConnector.phpOi,;2vendor/react/socket/src/HappyEyeBallsConnector.php Oi ZG}&vendor/react/socket/src/Connection.phpOiW(vendor/react/socket/src/SocketServer.php"Oi"x>ܤ(vendor/react/socket/src/SecureServer.phpOi q&vendor/react/socket/src/UnixServer.phpOi| ?*vendor/react/socket/src/LimitingServer.phpOic+vendor/react/socket/src/SecureConnector.phpJOiJ¤%vendor/react/socket/src/Connector.phpOi8HI,vendor/react/socket/src/TimeoutConnector.phpa Oia cvendor/react/promise/LICENSEgOigF9vendor/react/promise/src/Exception/CompositeException.phptOit4V66vendor/react/promise/src/Exception/LengthException.phpqOiq̀Jf.vendor/react/promise/src/functions_include.phpOi@}y%vendor/react/promise/src/Deferred.php%Oi%[W3Ӥ$vendor/react/promise/src/Promise.php#(Oi#(U&vendor/react/promise/src/functions.php,Oi,7vendor/react/promise/src/Internal/CancellationQueue.php'Oi'*5vendor/react/promise/src/Internal/RejectedPromise.php Oi f[6vendor/react/promise/src/Internal/FulfilledPromise.phpT OiT 1-vendor/react/promise/src/PromiseInterface.phpmOim:vendor/react/cache/LICENSEuOiu{)vendor/react/cache/src/CacheInterface.php0 Oi0 Cɘ%vendor/react/cache/src/ArrayCache.php_Oi_vendor/react/async/LICENSE^Oi^yT,vendor/react/async/src/functions_include.phpOi򢕙$vendor/react/async/src/functions.phpBOiB!Ȥvendor/react/http/LICENSEuOiu{vendor/react/http/PATCHES.txtOi!=y,vendor/react/http/src/Io/EmptyBodyStream.phpH OiH  ,vendor/react/http/src/Io/AbstractRequest.phpOi31'l$vendor/react/http/src/Io/IniUtil.phpsOislF+vendor/react/http/src/Io/HttpBodyStream.phpOi+b0vendor/react/http/src/Io/ClientRequestStream.php)Oi)r<,vendor/react/http/src/Io/StreamingServer.phpQHOiQHH)vendor/react/http/src/Io/UploadedFile.php Oi zͤ+vendor/react/http/src/Io/ChunkedDecoder.php/Oi/"vendor/react/http/src/Io/Clock.phpOi,vendor/react/http/src/Io/MultipartParser.php($Oi($!C/vendor/react/http/src/Io/ReadableBodyStream.php Oi ;dwϤ(vendor/react/http/src/Io/Transaction.php,Oi,:\r+vendor/react/http/src/Io/ChunkedEncoder.phpQOiQ,2vendor/react/http/src/Io/CloseProtectionStream.php6 Oi6 80vendor/react/http/src/Io/RequestHeaderParser.phpOiP*,vendor/react/http/src/Io/AbstractMessage.phpOi8B*0vendor/react/http/src/Io/LengthLimitedStream.php Oi /.vendor/react/http/src/Io/PauseBufferStream.phpOigtm4vendor/react/http/src/Io/ClientConnectionManager.phpOi~#vendor/react/http/src/Io/Sender.phpOiF/vendor/react/http/src/Io/ClientRequestState.php-Oi-)vendor/react/http/src/Io/BufferedBody.phpOi-vendor/react/http/src/Io/MiddlewareRunner.phpOi f vendor/react/http/src/Server.phpFOiF0$vendor/react/http/src/HttpServer.php<Oi<P^)vendor/react/http/src/Message/Request.php" Oi" {%vendor/react/http/src/Message/Uri.phpL%OiL%xg*vendor/react/http/src/Message/Response.php}9Oi}9Uפ/vendor/react/http/src/Message/ServerRequest.php/Oi/OgW3vendor/react/http/src/Message/ResponseException.phpOicU!vendor/react/http/src/Browser.phpN|OiN|JVv'vendor/react/http/src/Client/Client.phpOi.4@vendor/react/http/src/Middleware/RequestBodyParserMiddleware.php^Oi^ŀ@vendor/react/http/src/Middleware/RequestBodyBufferMiddleware.php3Oi3pc`?vendor/react/http/src/Middleware/StreamingRequestMiddleware.php/ Oi/ kWͤFvendor/react/http/src/Middleware/LimitConcurrentRequestsMiddleware.phpOi \'vendor/react/stream/LICENSEuOiu{1vendor/react/stream/src/DuplexStreamInterface.phpOiۤ2vendor/react/stream/src/WritableResourceStream.phpOiZ!}2vendor/react/stream/src/ReadableResourceStream.phpOiz& 3vendor/react/stream/src/ReadableStreamInterface.php7Oi7;^)vendor/react/stream/src/ThroughStream.phpOia3vendor/react/stream/src/WritableStreamInterface.php9Oi9Sy+vendor/react/stream/src/CompositeStream.phphOih:<0vendor/react/stream/src/DuplexResourceStream.phpOiȱ vendor/react/stream/src/Util.phpOi?b~vendor/react/dns/LICENSEuOiu{%vendor/react/dns/src/Model/Record.phpOi#`&vendor/react/dns/src/Model/Message.phpOi}+vendor/react/dns/src/BadServerException.phpfOif?{)vendor/react/dns/src/Config/HostsFile.phpOiΏT&vendor/react/dns/src/Config/Config.phpKOiKg.vendor/react/dns/src/Protocol/BinaryDumper.phpQOiQ&(vendor/react/dns/src/Protocol/Parser.php,Oi, 鵤0vendor/react/dns/src/RecordNotFoundException.phpkOikНѤ*vendor/react/dns/src/Resolver/Resolver.phpOi1c )vendor/react/dns/src/Resolver/Factory.php Oi k/3vendor/react/dns/src/Resolver/ResolverInterface.phpOis`ͪ.vendor/react/dns/src/Query/CachingExecutor.phpU OiU !6¤9vendor/react/dns/src/Query/SelectiveTransportExecutor.php Oi KФ$vendor/react/dns/src/Query/Query.phpOij0vendor/react/dns/src/Query/HostsFileExecutor.php Oi {I0vendor/react/dns/src/Query/ExecutorInterface.phpOi)t/vendor/react/dns/src/Query/FallbackExecutor.phpOigiA}/vendor/react/dns/src/Query/TimeoutException.phpjOijԂk+vendor/react/dns/src/Query/CoopExecutor.php Oi @hN.vendor/react/dns/src/Query/TimeoutExecutor.php Oi 24vendor/react/dns/src/Query/CancellationException.phpvOiv1<,vendor/react/dns/src/Query/RetryExecutor.phpK OiK MJ{3vendor/react/dns/src/Query/UdpTransportExecutor.phph!Oih! ^J3vendor/react/dns/src/Query/TcpTransportExecutor.php6Oi6vendor/psr/container/LICENSEyOiyOp/vendor/psr/container/src/ContainerInterface.php"Oi"5 Ҥ8vendor/psr/container/src/ContainerExceptionInterface.phpOi\9F7vendor/psr/container/src/NotFoundExceptionInterface.phpOiYvendor/psr/http-message/LICENSE=Oi=0vendor/psr/http-message/src/MessageInterface.phpROiR>Zt0vendor/psr/http-message/src/RequestInterface.php Oi Wê1vendor/psr/http-message/src/ResponseInterface.phpU OiU (,vendor/psr/http-message/src/UriInterface.php1Oi1zKϤ/vendor/psr/http-message/src/StreamInterface.phpOiƤ5vendor/psr/http-message/src/UploadedFileInterface.phppOipx M6vendor/psr/http-message/src/ServerRequestInterface.php'Oi'<@&vendor/psr/log/LICENSE=Oi=pO"vendor/psr/log/src/LoggerTrait.phpLOiL)vendor/psr/log/src/LogLevel.phpLOiLSȤ'vendor/psr/log/src/LoggerAwareTrait.phpOi&vendor/psr/log/src/LoggerInterface.php Oi +vendor/psr/log/src/LoggerAwareInterface.php<Oi<&_ؤ/vendor/psr/log/src/InvalidArgumentException.phpsOis(p!vendor/psr/log/src/NullLogger.phpOiOM%vendor/psr/log/src/AbstractLogger.phpOissrc/File/FileFinder.phpOiH src/File/FileExcluderFactory.phpKOiK[src/File/FileMonitor.phpSOiS>m 3src/File/SystemAgnosticSimpleRelativePathHelper.phpOiͤsrc/File/FileWriter.phpOiRsrc/File/RelativePathHelper.phpOi+lsrc/File/FileHelper.php Oi ʠsrc/File/FileReader.phpOiBWͤsrc/File/FileMonitorResult.phpOi.#src/File/NullRelativePathHelper.phpOiz"src/File/PathNotFoundException.phpOiOJ5&src/File/CouldNotReadFileException.phpOix1g.src/File/ParentDirectoryRelativePathHelper.phpOiBh#src/File/FileExcluderRawFactory.phpOi) fsrc/File/FileFinderResult.phpZOiZ {$src/File/FuzzyRelativePathHelper.phpPOiP𜍤%src/File/SimpleRelativePathHelper.php.Oi.cq'src/File/CouldNotWriteFileException.phpOisrc/File/FileExcluder.php^Oi^:UH+src/Classes/ForbiddenClassNameExtension.phpLOiL}ж$src/Php/PhpVersionFactoryFactory.phpOi_src/Php/PhpVersion.php+"Oi+"P\src/Php/PhpVersionFactory.phpOi^ Фsrc/AnalysedCodeException.phpOiiqE^src/autoloadFunctions.phpOiѤsrc/Type/NeverType.php6Oi6&2src/Type/FunctionParameterClosureTypeExtension.phpOi_src/Type/CallableType.phpgSOigS* src/Type/TypeUtils.php~2Oi~2&,src/Type/IntegerType.phpOi&src/Type/TypeAliasResolverProvider.phpOi!nsrc/Type/UnionTypeHelper.php~Oi~"osrc/Type/IntegerRangeType.phpc\Oic\Y]-src/Type/DynamicMethodReturnTypeExtension.phpOiC$src/Type/ConstantScalarType.phpOi)Y src/Type/IsSuperTypeOfResult.phpVOiV0\src/Type/LateResolvableType.phpOi1#src/Type/ObjectWithoutClassType.phpOiX@3src/Type/Php/DateTimeDynamicReturnTypeExtension.php;Oi;004src/Type/Php/DateTimeSubMethodThrowTypeExtension.php Oi դ>src/Type/Php/SimpleXMLElementConstructorThrowTypeExtension.phpwOiwtZˤ:src/Type/Php/IsCallableFunctionTypeSpecifyingExtension.php Oi {`֤7src/Type/Php/DateIntervalDynamicReturnTypeExtension.phpOiqM>>src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.phpf Oif 7src/Type/Php/InArrayFunctionTypeSpecifyingExtension.phpOi%*z2src/Type/Php/StrlenFunctionReturnTypeExtension.php Oi S]>src/Type/Php/FunctionExistsFunctionTypeSpecifyingExtension.phpAOiA 4src/Type/Php/ArrayMapFunctionReturnTypeExtension.phpmOimva8src/Type/Php/OpenSslEncryptParameterOutTypeExtension.php Oi Usrc/Type/Php/ConstantHelper.phpZOiZt92src/Type/Php/HrtimeFunctionReturnTypeExtension.phpOi7src/Type/Php/IsArrayFunctionTypeSpecifyingExtension.phpOi$Ұ;src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.php Oi U?src/Type/Php/BackedEnumFromMethodDynamicReturnTypeExtension.phpz Oiz :src/Type/Php/CtypeDigitFunctionTypeSpecifyingExtension.php Oi W7src/Type/Php/DefinedConstantTypeSpecifyingExtension.phpOiӰ?src/Type/Php/Base64DecodeDynamicFunctionReturnTypeExtension.phpOigR6src/Type/Php/DefineConstantTypeSpecifyingExtension.phpOi^-src/Type/Php/ThrowableReturnTypeExtension.phpOis9src/Type/Php/DatePeriodConstructorReturnTypeExtension.php$ Oi$ mFܤ:src/Type/Php/SprintfFunctionDynamicReturnTypeExtension.php0Oi0A2src/Type/Php/StrTokFunctionReturnTypeExtension.phpOi"r3src/Type/Php/GettypeFunctionReturnTypeExtension.phpF OiF 1Ŗ5src/Type/Php/ArrayRandFunctionReturnTypeExtension.php!Oi!`5src/Type/Php/MicrotimeFunctionReturnTypeExtension.phpOi¤4src/Type/Php/MbStrlenFunctionReturnTypeExtension.phpOi^Yܤ9src/Type/Php/SscanfFunctionDynamicReturnTypeExtension.phpg Oig ns3src/Type/Php/ArrayKeyDynamicReturnTypeExtension.phpOi*1=@src/Type/Php/ArrayPointerFunctionsDynamicReturnTypeExtension.phpOiuCAsrc/Type/Php/StrIncrementDecrementFunctionReturnTypeExtension.phpOi*Z1src/Type/Php/CountFunctionReturnTypeExtension.phpOij.m'src/Type/Php/JsonThrowTypeExtension.phpNOiND+20src/Type/Php/IsAFunctionTypeSpecifyingHelper.php Oi 2ζ>src/Type/Php/CurlGetinfoFunctionDynamicReturnTypeExtension.phpOix!>src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.phpOiy-lAsrc/Type/Php/VersionCompareFunctionDynamicReturnTypeExtension.php Oi 1src/Type/Php/SubstrDynamicReturnTypeExtension.phpoOiofڤ3src/Type/Php/IsAFunctionTypeSpecifyingExtension.phpH OiH ΃e)src/Type/Php/IntdivThrowTypeExtension.phpgOigC;src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php~Oi~kN3src/Type/Php/PregMatchParameterOutTypeExtension.phphOihH 8src/Type/Php/ArrayReverseFunctionReturnTypeExtension.phpOi"ˤ/src/Type/Php/MbFunctionsReturnTypeExtension.php Oi `,;src/Type/Php/ClassImplementsFunctionReturnTypeExtension.php{Oi{c%w6src/Type/Php/BcMathStringOrNullReturnTypeExtension.phpj(Oij(WYsrc/Type/Php/ArrayValuesFunctionDynamicReturnTypeExtension.php@Oi@E"?9src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.phpFOiFCl 6src/Type/Php/FilterInputDynamicReturnTypeExtension.phpOi^(Ȥ0src/Type/Php/DateFunctionReturnTypeExtension.phpOiDԤ>src/Type/Php/ClosureFromCallableDynamicReturnTypeExtension.php~Oi~{s$/src/Type/Php/StatDynamicReturnTypeExtension.phpnOinڤPD1src/Type/Php/RoundFunctionReturnTypeExtension.php Oi Mcw7src/Type/Php/ArraySpliceFunctionReturnTypeExtension.phpOin7src/Type/Php/ArrayFilterFunctionReturnTypeExtension.phpOiov:src/Type/Php/IsIterableFunctionTypeSpecifyingExtension.php.Oi.R39src/Type/Php/FilterVarArrayDynamicReturnTypeExtension.php Oi Gv;src/Type/Php/ClassExistsFunctionTypeSpecifyingExtension.phpOi j4src/Type/Php/StrSplitFunctionReturnTypeExtension.phpOi*8src/Type/Php/GetDebugTypeFunctionReturnTypeExtension.phpOiL7src/Type/Php/ArrayCurrentDynamicReturnTypeExtension.phpOi7?src/Type/Php/SimpleXMLElementAsXMLMethodReturnTypeExtension.php;Oi;OX->src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php} Oi} *Τ;src/Type/Php/ArraySumFunctionDynamicReturnTypeExtension.phpOiVN=src/Type/Php/ArrayIntersectKeyFunctionReturnTypeExtension.phpOimB7src/Type/Php/DateTimeModifyMethodThrowTypeExtension.phpOi1-6src/Type/Php/ArrayChunkFunctionReturnTypeExtension.phpiOiiy0src/Type/Php/DsMapDynamicReturnTypeExtension.php:Oi:̢5src/Type/Php/ArrayFillFunctionReturnTypeExtension.php) Oi) b:src/Type/Php/GetDefinedVarsFunctionReturnTypeExtension.phpOi {1src/Type/Php/XMLReaderOpenReturnTypeExtension.phpOih8src/Type/Php/PregReplaceCallbackClosureTypeExtension.phpOi 6src/Type/Php/AssertFunctionTypeSpecifyingExtension.phpOi&f2src/Type/Php/DateTimeModifyReturnTypeExtension.php9 Oi9 w5src/Type/Php/StrRepeatFunctionReturnTypeExtension.phpOi/~8src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.phpOiа:src/Type/Php/DateTimeZoneConstructorThrowTypeExtension.phpOizZ<src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php Oi *٤;src/Type/Php/ArraySearchFunctionTypeSpecifyingExtension.phpHOiHkԤ=src/Type/Php/ArrayMergeFunctionDynamicReturnTypeExtension.phpOilӤ9src/Type/Php/DateTimeCreateDynamicReturnTypeExtension.php.Oi.(1[;src/Type/Php/NonEmptyStringFunctionsReturnTypeExtension.phpOicQK/src/Type/Php/FilterFunctionReturnTypeHelper.php4BOi4B>B1src/Type/Php/HashFunctionsReturnTypeExtension.php@Oi@"D'src/Type/Php/RegexArrayShapeMatcher.phpDOiD;src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.phpaOiamUBɤ@src/Type/Php/ReflectionFunctionConstructorThrowTypeExtension.phpjOij28src/Type/Php/ArrayKeyFirstDynamicReturnTypeExtension.phpOiyZ5src/Type/Php/StrtotimeFunctionReturnTypeExtension.php Oi 1)S:src/Type/Php/DioStatDynamicFunctionReturnTypeExtension.phpOi 9src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php Oi x*src/Type/Php/IniGetReturnTypeExtension.phpOiWN6src/Type/Php/DateFormatFunctionReturnTypeExtension.phpOi¥Cs<src/Type/Php/ArrayKeysFunctionDynamicReturnTypeExtension.php:Oi:0~-src/Type/Php/DateFunctionReturnTypeHelper.phpOiݠ_7src/Type/Php/TrimFunctionDynamicReturnTypeExtension.phpOiv7src/Type/Php/TriggerErrorDynamicReturnTypeExtension.phpOiq6src/Type/Php/PropertyExistsTypeSpecifyingExtension.php Oi /m4src/Type/Php/ArrayPopFunctionReturnTypeExtension.phpOiƤ5src/Type/Php/CountFunctionTypeSpecifyingExtension.phpOibQ4src/Type/Php/MbFunctionsReturnTypeExtensionTrait.phpOio% 98src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php^Oi^¤1src/Type/Php/RangeFunctionReturnTypeExtension.php5Oi5 3src/Type/Php/CompactFunctionReturnTypeExtension.phpt Oit bj4src/Type/Php/ConstantFunctionReturnTypeExtension.phpOiԤ8src/Type/Php/ClosureBindToDynamicReturnTypeExtension.phpOi1src/Type/Php/PregMatchTypeSpecifyingExtension.php4 Oi4 iK?src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.phpOi vQ7src/Type/Php/SetTypeFunctionTypeSpecifyingExtension.php; Oi; G:src/Type/Php/HighlightStringDynamicReturnTypeExtension.phpOik85src/Type/Php/ArrayFindFunctionReturnTypeExtension.php3Oi3S2src/Type/Php/StrPadFunctionReturnTypeExtension.php) Oi) ap:src/Type/Php/DateIntervalConstructorThrowTypeExtension.phpOiP475src/Type/Php/RandomIntFunctionReturnTypeExtension.php Oi ߻4+2src/Type/Php/StrrevFunctionReturnTypeExtension.php Oi -5src/Type/Php/ArrayFlipFunctionReturnTypeExtension.php Oi VQAsrc/Type/Php/SimpleXMLElementClassPropertyReflectionExtension.phpOi?@2src/Type/Php/ParseStrParameterOutTypeExtension.phpOiǬ7src/Type/Php/ArrayColumnFunctionReturnTypeExtension.phpOiI[Ф6src/Type/Php/ArraySliceFunctionReturnTypeExtension.phpyOiyX8src/Type/Php/ArrayFindKeyFunctionReturnTypeExtension.php+Oi+*"?src/Type/Php/StrWordCountFunctionDynamicReturnTypeExtension.php$Oi$|46src/Type/Php/DateTimeConstructorThrowTypeExtension.phpOi=src/Type/Php/ReflectionClassConstructorThrowTypeExtension.php&Oi&96src/Type/Php/AbsFunctionDynamicReturnTypeExtension.phpOiD4src/Type/Php/FilterVarDynamicReturnTypeExtension.phpOi7!=src/Type/Php/MbConvertEncodingFunctionReturnTypeExtension.phpOig#4src/Type/Php/StrCaseFunctionsReturnTypeExtension.php,Oi,5src/Type/Php/StrContainingTypeSpecifyingExtension.php Oi s*Asrc/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.phpOi-rJCsrc/Type/Php/ReflectionClassIsSubclassOfTypeSpecifyingExtension.phpOi,Ф6src/Type/Php/ArrayShiftFunctionReturnTypeExtension.phpOi5l3src/Type/Php/GetClassDynamicReturnTypeExtension.php% Oi% wϡ?src/Type/Php/GettimeofdayDynamicFunctionReturnTypeExtension.phpJOiJR>4src/Type/Php/ArrayNextDynamicReturnTypeExtension.phpOi*E>src/Type/Php/ArraySearchFunctionDynamicReturnTypeExtension.php&Oi&O 6src/Type/Php/PregFilterFunctionReturnTypeExtension.phpOi|3src/Type/Php/ImplodeFunctionReturnTypeExtension.phpOiy7src/Type/Php/ArrayReduceFunctionReturnTypeExtension.phpOi{u:src/Type/Php/ExplodeFunctionDynamicReturnTypeExtension.php Oi f*6src/Type/Php/ClosureBindDynamicReturnTypeExtension.phpOi]4src/Type/Php/ArrayFilterFunctionReturnTypeHelper.php1Oi1! K)src/Type/Php/AssertThrowTypeExtension.php$Oi$M/src/Type/Php/PowFunctionReturnTypeExtension.php{Oi{_ڤ'src/Type/NonexistentParentClassType.phpOiz3src/Type/DynamicStaticMethodReturnTypeExtension.phpOiCѤsrc/Type/TypeAliasResolver.php4Oi4Л/src/Type/DynamicFunctionReturnTypeExtension.php~Oi~src/Type/ClassStringType.phpM OiM  src/Type/BenevolentUnionType.phpOiDfr*src/Type/LazyTypeAliasResolverProvider.phpOick$src/Type/Enum/EnumCaseObjectType.phpOi Msrc/Type/NewObjectType.php6 Oi6 src/Type/RecursionGuard.phpOi}Osrc/Type/NullType.phpo)Oio),@,src/Type/MethodParameterOutTypeExtension.phpOi src/Type/CallableTypeHelper.phpOi"Tʤ$src/Type/UsefulTypeAliasResolver.phpOiпsrc/Type/ExponentiateHelper.phpOiMsrc/Type/TypeResult.phpOi((src/Type/Constant/ConstantStringType.phpKOiK/ -'src/Type/Constant/ConstantFloatType.php Oi B0src/Type/Constant/ConstantArrayTypeAndMethod.phpOi.'src/Type/Constant/ConstantArrayType.phppOipA.src/Type/Constant/ConstantArrayTypeBuilder.php0Oi0K2src/Type/Constant/ConstantScalarToBooleanTrait.phpOi&)src/Type/Constant/ConstantIntegerType.php Oi j+src/Type/Constant/OversizedArrayBuilder.phpOivj')src/Type/Constant/ConstantBooleanType.php Oi src/Type/ThisType.php? Oi? w-src/Type/VerbosityLevel.phpuOiuSsrc/Type/ConstantType.php|Oi|>G.src/Type/FunctionParameterOutTypeExtension.phpOi$%¤(src/Type/GenericTypeVariableResolver.phpOi0?,src/Type/DynamicMethodThrowTypeExtension.phpgOigޭ^src/Type/StringType.phpI!OiI!G \src/Type/AcceptsResult.php Oi x|w,src/Type/FunctionTypeSpecifyingExtension.phpOig\P*src/Type/MethodTypeSpecifyingExtension.php'Oi'T\0e,src/Type/ExpressionTypeResolverExtension.phpIOiIC8src/Type/OffsetAccessType.php Oi <src/Type/TypeTraverser.php*Oi*pIsrc/Type/ObjectShapeType.phpGOiGasrc/Type/TypeWithClassName.php\Oi\'ܤ*src/Type/ObjectShapePropertyReflection.phpOicsrc/Type/ValueOfType.php Oi E src/Type/GeneralizePrecision.phpOi0"?src/Type/SubtractableType.phpOi2src/Type/StaticMethodParameterOutTypeExtension.phpOisrc/Type/TypeAlias.phpiOii9 8src/Type/StringAlwaysAcceptingObjectWithToStringType.phpOiY 91src/Type/CircularTypeAliasDefinitionException.phpOiűä'src/Type/CircularTypeAliasErrorType.phpOi[}6src/Type/StaticMethodParameterClosureTypeExtension.phpOic}Bsrc/Type/KeyOfType.php& Oi& s٤src/Type/TypehintHelper.php%Oi%Z}4src/Type/OperatorTypeSpecifyingExtensionRegistry.php Oi 4src/Type/ArrayType.phpcOicpsrc/Type/FileTypeMapper.php4Oi4:릤,src/Type/OperatorTypeSpecifyingExtension.phpOi tF#src/Type/Traits/ObjectTypeTrait.php{Oi{s>0*src/Type/Traits/MaybeIterableTypeTrait.phpIOiI*src/Type/Traits/FalseyBooleanTypeTrait.phpOi4k1(src/Type/Traits/NonIterableTypeTrait.phpOi. |6src/Type/Traits/ConstantNumericComparisonTypeTrait.php) Oi) 5'src/Type/Traits/MaybeArrayTypeTrait.phpOi{-src/Type/Traits/UndecidedBooleanTypeTrait.phpOiȷ0src/Type/Traits/UndecidedComparisonTypeTrait.phpOin'src/Type/Traits/NonGenericTypeTrait.phpOiށ8src/Type/Traits/UndecidedComparisonCompoundTypeTrait.phpOi0src/Type/Traits/NonOffsetAccessibleTypeTrait.phpOi*src/Type/Traits/MaybeCallableTypeTrait.phpOi*src/Type/Traits/NonRemoveableTypeTrait.phpOi4i8+src/Type/Traits/LateResolvableTypeTrait.php=Oi=: 2src/Type/Traits/MaybeOffsetAccessibleTypeTrait.phpxOix(src/Type/Traits/MaybeObjectTypeTrait.php Oi 2{(src/Type/Traits/NonCallableTypeTrait.phpOiզ[*src/Type/Traits/TruthyBooleanTypeTrait.phpOi %src/Type/Traits/NonArrayTypeTrait.phpOi݄#-src/Type/Traits/NonGeneralizableTypeTrait.phpOif7ݤ&src/Type/Traits/NonObjectTypeTrait.phpu Oiu B+src/Type/Traits/ConstantScalarTypeTrait.php6Oi6z;r1src/Type/IntersectionType.php\Oi\Ww"src/Type/JustNullableTypeTrait.php2Oi2OchG(src/Type/ConditionalTypeForParameter.phpOiΤ)src/Type/Accessory/HasOffsetValueType.php5Oi5fс&src/Type/Accessory/HasPropertyType.phpOiȨ`)src/Type/Accessory/OversizedArrayType.phpk*Oik*T%aӤ1src/Type/Accessory/AccessoryNumericStringType.php%Oi%+$src/Type/Accessory/HasMethodType.phpOiǚ$src/Type/Accessory/HasOffsetType.phpO,OiO,)93src/Type/Accessory/AccessoryLowercaseStringType.phpo$Oio$1src/Type/Accessory/AccessoryLiteralStringType.php$Oi$dT2src/Type/Accessory/AccessoryNonEmptyStringType.php&Oi&Ѥ2src/Type/Accessory/AccessoryNonFalsyStringType.php'$Oi'$!f-src/Type/Accessory/AccessoryArrayListType.php10Oi1043src/Type/Accessory/AccessoryUppercaseStringType.phpo$Oio$o $src/Type/Accessory/AccessoryType.phpOi;ʠ(src/Type/Accessory/NonEmptyArrayType.php+Oi+դ0src/Type/MethodParameterClosureTypeExtension.phpsOisMҌsrc/Type/ObjectType.phpxOixF28src/Type/ConstantTypeHelper.php Oi D㫤src/Type/StaticType.php^Oi^ID(src/Type/ParserNodeTypeToPHPStanType.phpOi2src/Type/ClosureTypeFactory.phplOil?ݤ.src/Type/DynamicFunctionThrowTypeExtension.phplOil+src/Type/StrictMixedType.phpu/Oiu/ֹ,src/Type/DirectTypeAliasResolverProvider.phpOi)'src/Type/Helper/GetTemplateTypeType.php Oi ,src/Type/Generic/TemplateObjectShapeType.phpOi b3src/Type/Generic/TemplateObjectWithoutClassType.php,Oi,<0src/Type/Generic/TemplateConstantIntegerType.phpOiGA8դ.src/Type/Generic/TemplateGenericObjectType.phpOi"$src/Type/Generic/TemplateTypeMap.php_Oi_T1src/Type/Generic/TemplateTypeArgumentStrategy.phpOify)src/Type/Generic/TemplateTypeStrategy.php<Oi<Uzܤ(src/Type/Generic/TemplateIntegerType.php[Oi[˝L+src/Type/Generic/GenericClassStringType.phpOi{&src/Type/Generic/TemplateTypeScope.phpOiG&src/Type/Generic/TemplateTypeTrait.php0Oi0$y)src/Type/Generic/TypeProjectionHelper.phpsOisH^1&src/Type/Generic/GenericObjectType.php6Oi6_'Ф,src/Type/Generic/TemplateTypeVarianceMap.phpOi$.,src/Type/Generic/TemplateStrictMixedType.phpOiA0src/Type/Generic/TemplateBenevolentUnionType.phpEOiE֤&src/Type/Generic/TemplateMixedType.phphOiho&src/Type/Generic/TemplateArrayType.php|Oi|`'src/Type/Generic/TemplateTypeHelper.phpOi/%'src/Type/Generic/TemplateObjectType.php Oi 8'src/Type/Generic/TemplateStringType.phpVOiV6yI/)src/Type/Generic/TemplateIterableType.php+Oi+^&src/Type/Generic/TemplateKeyOfType.php{Oi{f&src/Type/Generic/GenericStaticType.php%Oi%]2src/Type/Generic/TemplateTypeParameterStrategy.phpOi(}&src/Type/Generic/TemplateFloatType.phpQOiQ$Z/src/Type/Generic/TemplateConstantStringType.phpOi+T(src/Type/Generic/TemplateBooleanType.php[Oi[&src/Type/Generic/TemplateUnionType.php-Oi-`mh)src/Type/Generic/TemplateTypeVariance.phpOiK(src/Type/Generic/TemplateTypeFactory.phpTOiTiI*src/Type/Generic/TemplateTypeReference.phpOiB8-src/Type/Generic/TemplateIntersectionType.phpOi .src/Type/Generic/TemplateConstantArrayType.phpOi(\&!src/Type/Generic/TemplateType.php|Oi|r/src/Type/UnionType.php(Oi([src/Type/MixedType.php8Oi8src/Type/ResourceType.phpw Oiw "src/Type/LooseComparisonHelper.php Oi 9ͤsrc/Type/ErrorType.phpOiXäsrc/Type/BooleanType.phpOi D]src/Type/CompoundType.phpOiU4src/Type/ExpressionTypeResolverExtensionRegistry.php'Oi'yn0src/Type/StaticMethodTypeSpecifyingExtension.phpGOiGz;"src/Type/NonAcceptingNeverType.phpOiE3src/Type/VoidType.phpOiʃl¤src/Type/StaticTypeFactory.phpOiesrc/Type/ClosureType.phpaOiaF;/src/Type/DynamicReturnTypeExtensionRegistry.phpOin&src/Type/BitwiseFlagHelper.php Oi *-{src/Type/Type.php0Oi0$Fsrc/Type/TypeCombinator.phpOiERj2src/Type/DynamicStaticMethodThrowTypeExtension.phpOisrc/Type/IterableType.php=Oi=esrc/Type/FloatType.phpOij:%src/Type/Regex/RegexAstWalkResult.php Oi iڤ)src/Type/Regex/RegexNonCapturingGroup.phpmOim%D&src/Type/Regex/RegexCapturingGroup.phpOi+-ڤ#src/Type/Regex/RegexAlternation.phpOi^ m'src/Type/Regex/RegexGroupWalkResult.php Oi c#src/Type/Regex/RegexGroupParser.phpTOiTd >@(src/Type/Regex/RegexExpressionHelper.phpOi(Ϥsrc/Type/ConditionalType.phpOi&src/Type/SimultaneousTypeTraverser.phpOi,դsrc/Rules/MetadataRuleError.phpOih'src/Rules/Missing/MissingReturnRule.phppOip6%src/Rules/FunctionReturnTypeCheck.phpP OiP Ȯ>src/Rules/Properties/ReadOnlyByPhpDocPropertyAssignRefRule.phpxOix11src/Rules/Properties/PropertyReflectionFinder.phpOiAsrc/Rules/Properties/LazyReadWritePropertiesExtensionProvider.phpOiÁBsrc/Rules/Properties/DefaultValueTypesAssignedToPropertiesRule.php)Oi)[3src/Rules/Properties/ReadOnlyPropertyAssignRule.phpOiSCsrc/Rules/Properties/DirectReadWritePropertiesExtensionProvider.phphOihe*6src/Rules/Properties/TypesAssignedToPropertiesRule.php Oi >>;src/Rules/Properties/ReadOnlyByPhpDocPropertyAssignRule.phpOiz5src/Rules/Properties/ReadWritePropertiesExtension.phpOi=src/Rules/Properties/ReadWritePropertiesExtensionProvider.php.Oi._-src/Rules/Properties/ReadOnlyPropertyRule.phpOi8Bsrc/Rules/Properties/MissingReadOnlyByPhpDocPropertyAssignRule.php Oi ź5src/Rules/Properties/AccessPropertiesInAssignRule.phpOi)5src/Rules/Properties/ReadOnlyByPhpDocPropertyRule.phpOi۫G6src/Rules/Properties/ReadOnlyPropertyAssignRefRule.php<Oi<4src/Rules/Properties/MissingPropertyTypehintRule.phpB OiB H?src/Rules/Properties/AccessPrivatePropertyThroughStaticRule.php=Oi=uɤ8src/Rules/Properties/ExistingClassesInPropertiesRule.phpOiyt8src/Rules/Properties/WritingToReadOnlyPropertiesRule.phpOi8Ġ7src/Rules/Properties/ReadingWriteOnlyPropertiesRule.phpOi@;src/Rules/Properties/AccessStaticPropertiesInAssignRule.phpOi.ڤ8src/Rules/Properties/InvalidCallablePropertyTypeRule.phpOih3src/Rules/Properties/AccessStaticPropertiesRule.phpE"OiE"1u/src/Rules/Properties/PropertyAttributesRule.phpOir72src/Rules/Properties/UninitializedPropertyRule.phpOi:UpФ:src/Rules/Properties/MissingReadOnlyPropertyAssignRule.phpO OiO my-src/Rules/Properties/AccessPropertiesRule.php6Oi6٤2src/Rules/Properties/NullsafePropertyFetchRule.php Oi :̑0src/Rules/Properties/FoundPropertyReflection.php0Oi0_HĤ2src/Rules/Properties/PropertiesInInterfaceRule.phpOiZ鎤+src/Rules/Properties/PropertyDescriptor.phpOiOVQ/src/Rules/Properties/OverridingPropertyRule.php Oi "ؤ2src/Rules/Generics/MethodSignatureVarianceRule.php Oi  +src/Rules/Generics/EnumTemplateTypeRule.phpOi-src/Rules/Generics/InterfaceAncestorsRule.php Oi =ps$src/Rules/Generics/VarianceCheck.php,Oi,%6,src/Rules/Generics/TraitTemplateTypeRule.phpZ OiZ 3(src/Rules/Generics/TemplateTypeCheck.php)'Oi)'j֤-src/Rules/Generics/GenericObjectTypeCheck.phpOi-~ˤ1src/Rules/Generics/CrossCheckInterfacesHelper.php Oi Ԥ,src/Rules/Generics/ClassTemplateTypeRule.phpOi訤(src/Rules/Generics/EnumAncestorsRule.phpn Oin ۻ+src/Rules/Generics/PropertyVarianceRule.phpOi?%src/Rules/Generics/UsedTraitsRule.php Oi [ 0src/Rules/Generics/InterfaceTemplateTypeRule.phpOia1-src/Rules/Generics/MethodTemplateTypeRule.php)Oi)<;0src/Rules/Generics/MethodTagTemplateTypeRule.phptOitӛ:)src/Rules/Generics/ClassAncestorsRule.phpOixM7I1src/Rules/Generics/MethodTagTemplateTypeCheck.php Oi 5src/Rules/Generics/MethodTagTemplateTypeTraitRule.php+Oi++\/src/Rules/Generics/FunctionTemplateTypeRule.php Oi faI,,src/Rules/Generics/GenericAncestorsCheck.phpBOiBo?4src/Rules/Generics/FunctionSignatureVarianceRule.phpOijr2&src/Rules/Pure/FunctionPurityCheck.phpOi!src/Rules/Pure/PureMethodRule.phpOiۅ#src/Rules/Pure/PureFunctionRule.phpOi=(src/Rules/Classes/RequireExtendsRule.phpOiәi#src/Rules/Classes/MethodTagRule.phpOiF+src/Rules/Classes/RequireImplementsRule.phpOiʤ%src/Rules/Classes/PropertyTagRule.phpOi?+src/Rules/Classes/MethodTagTraitUseRule.phpOi)D/src/Rules/Classes/LocalTypeTraitAliasesRule.phpOi{ج9src/Rules/Classes/ExistingClassesInEnumImplementsRule.php Oi aV3src/Rules/Classes/DuplicateClassDeclarationRule.php Oi 1=Lsrc/Rules/Classes/MixinRule.phpOic$src/Rules/Classes/MixinTraitRule.phpwOiw'src/Rules/Classes/ClassConstantRule.phpOi`ä:src/Rules/Classes/ExistingClassesInClassImplementsRule.php5 Oi5 ^./src/Rules/Classes/InstantiationCallableRule.phpOiݦ1src/Rules/Classes/ClassConstantAttributesRule.php$Oi$p5src/Rules/Classes/UnusedConstructorParametersRule.phpOi'src/Rules/Classes/InstantiationRule.php $Oi $fX0src/Rules/Classes/NonClassAttributeClassRule.phpfOif-Y*src/Rules/Classes/LocalTypeAliasesRule.phpOiUG}$src/Rules/Classes/MethodTagCheck.phpH/OiH/}93src/Rules/Classes/InvalidPromotedPropertiesRule.php Oi cؕ-src/Rules/Classes/TraitAttributeClassRule.phpPOiPE\w-src/Rules/Classes/PropertyTagTraitUseRule.phpOiwbv)src/Rules/Classes/AllowedSubTypesRule.php Oi 7D+src/Rules/Classes/LocalTypeAliasesCheck.php6;Oi6;(u&src/Rules/Classes/PropertyTagCheck.php\'Oi\' 92src/Rules/Classes/LocalTypeTraitUseAliasesRule.phpOi_v.src/Rules/Classes/ImpossibleInstanceOfRule.phpOiwO'src/Rules/Classes/ReadOnlyClassRule.phpOi iB src/Rules/Classes/MixinCheck.phpOi߫(src/Rules/Classes/MethodTagTraitRule.phpOijyK*src/Rules/Classes/PropertyTagTraitRule.phpOi5src/Rules/Classes/ExistingClassInClassExtendsRule.php+Oi+"Pw-.src/Rules/Classes/DuplicateDeclarationRule.phpOi/ ;src/Rules/Classes/ExistingClassesInInterfaceExtendsRule.php Oi '21)src/Rules/Classes/ClassAttributesRule.phpROiRcx'src/Rules/Classes/MixinTraitUseRule.phpOi~1src/Rules/Classes/ExistingClassInTraitUseRule.php Oi BկԤ3src/Rules/Classes/ExistingClassInInstanceOfRule.php Oi @.#src/Rules/Classes/NewStaticRule.phpOiO$src/Rules/Classes/EnumSanityRule.php^Oi^8<src/Rules/Classes/AccessPrivateConstantThroughStaticRule.phpOi⌵src/Rules/RuleErrorBuilder.phpOi/%src/Rules/FunctionDefinitionCheck.phpfOifUҤ+src/Rules/Types/InvalidTypesInUnionRule.phpL OiL K0src/Rules/ClassNameCheck.phpOicH&src/Rules/Api/BcUncoveredInterface.phpOi ٤5src/Rules/Api/NodeConnectingVisitorAttributesRule.php Oi `b#src/Rules/Api/ApiInstanceofRule.php[Oi[jlZ'src/Rules/Api/ApiInstanceofTypeRule.php<Oi</src/Rules/Api/RuntimeReflectionFunctionRule.phpOiU src/Rules/Api/ApiRuleHelper.phph Oih 1J(src/Rules/Api/ApiClassConstFetchRule.phpf Oif _2z&src/Rules/Api/ApiInstantiationRule.php Oi ױ)src/Rules/Api/ApiInterfaceExtendsRule.php) Oi) z6ݤ%src/Rules/Api/ApiClassExtendsRule.php Oi R!src/Rules/Api/ApiTraitUseRule.phpOiL%src/Rules/Api/GetTemplateTypeRule.php Oi (src/Rules/Api/ApiClassImplementsRule.php+ Oi+ Y#src/Rules/Api/ApiMethodCallRule.php> Oi> +`|#src/Rules/Api/ApiStaticCallRule.php Oi 4src/Rules/Api/RuntimeReflectionInstantiationRule.php: Oi: Mh%7src/Rules/Api/PhpStanNamespaceIn3rdPartyPackageRule.php Oi & ɤsrc/Rules/LineRuleError.phpOi[%7*src/Rules/RuleLevelHelperAcceptsResult.phpOizJ +src/Rules/Whitespace/FileWhitespaceRule.php_ Oi_ .\%src/Rules/Variables/ThrowTypeRule.phpQOiQO!src/Rules/Variables/IssetRule.phpOi⿤4src/Rules/Variables/ParameterOutAssignedTypeRule.php Oi @+src/Rules/Variables/VariableCloningRule.phpOi-8src/Rules/Variables/ParameterOutExecutionEndTypeRule.phpOijt,src/Rules/Variables/CompactVariablesRule.php Oi A!src/Rules/Variables/EmptyRule.phpUOiUeR+src/Rules/Variables/DefinedVariableRule.phpOi^ɤ!src/Rules/Variables/UnsetRule.phpOiSY5(src/Rules/Variables/NullCoalesceRule.phpOi1T[src/Rules/IssetCheck.php/Oi/c쑤'src/Rules/DateTimeInstantiationRule.php/Oi/+^src/Rules/NullsafeCheck.phpOiì)src/Rules/Ignore/IgnoreParseErrorRule.phpBOiBb-src/Rules/RuleLevelHelper.phpMBOiMBxRGsrc/Rules/DirectRegistry.php%Oi%u:src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.phpOiy'src/Rules/Arrays/ArrayUnpackingRule.phpgOig⩤9src/Rules/Arrays/OffsetAccessWithoutDimForReadingRule.phpOi?4src/Rules/Arrays/OffsetAccessValueAssignmentRule.php Oi UV'src/Rules/Arrays/EmptyArrayItemRule.php:Oi:Yr:5src/Rules/Arrays/DuplicateKeysInLiteralArraysRule.phpiOii P-src/Rules/Arrays/AppendedArrayKeyTypeRule.php Oi e2src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.phpOiM.src/Rules/Arrays/InvalidKeyInArrayItemRule.phpOi>Zf-src/Rules/Arrays/OffsetAccessAssignOpRule.php Oi ,7(+src/Rules/Arrays/ArrayDestructuringRule.phpZ OiZ 1s*src/Rules/Arrays/AllowedArrayKeysTypes.php{ Oi{ ~mB/src/Rules/Arrays/OffsetAccessAssignmentRule.php Oi :.src/Rules/Arrays/UnpackIterableInArrayRule.phpOir$src/Rules/Arrays/DeadForeachRule.phpOiAȤ9src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php Oi r}{o*src/Rules/Arrays/IterableInForeachRule.phpBOiBpz.src/Rules/Arrays/AppendedArrayItemTypeRule.php Oi ģ!src/Rules/IdentifierRuleError.phpOiMT3'src/Rules/ClassCaseSensitivityCheck.phpOiP.src/Rules/EnumCases/EnumCaseAttributesRule.phpOi8]*%src/Rules/ClassForbiddenNameCheck.php Oi =s1src/Rules/Regexp/RegularExpressionQuotingRule.phpOi]pĤ1src/Rules/Regexp/RegularExpressionPatternRule.phpOi)src/Rules/FunctionCallParametersCheck.phpdOide9src/Rules/Comparison/WhileLoopAlwaysTrueConditionRule.php Oi x8c9src/Rules/Comparison/DoWhileLoopConstantConditionRule.php Oi Eb:src/Rules/Comparison/ImpossibleCheckTypeMethodCallRule.phpOi{8src/Rules/Comparison/BooleanNotConstantConditionRule.php Oi Y]:src/Rules/Comparison/WhileLoopAlwaysFalseConditionRule.php2Oi2P42src/Rules/Comparison/UnreachableIfBranchesRule.php Oi cIK4src/Rules/Comparison/ConstantConditionRuleHelper.php Oi k2src/Rules/Comparison/ImpossibleCheckTypeHelper.php"FOi"FExǤ7src/Rules/Comparison/BooleanOrConstantConditionRule.phpOi kb8src/Rules/Comparison/LogicalXorConstantConditionRule.phpOiI@src/Rules/Comparison/ImpossibleCheckTypeStaticMethodCallRule.phpOiS4src/Rules/Comparison/ElseIfConstantConditionRule.php Oi =src/Rules/Comparison/TernaryOperatorConstantConditionRule.phpOi2< 8src/Rules/Comparison/BooleanAndConstantConditionRule.phpOi=src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php=Oi=;&0src/Rules/Comparison/IfConstantConditionRule.phpOiEW7src/Rules/Comparison/UsageOfVoidMatchExpressionRule.php"Oi"<src/Rules/Comparison/ImpossibleCheckTypeFunctionCallRule.phpQOiQQ9src/Rules/Comparison/UnreachableTernaryElseBranchRule.php Oi ^,src/Rules/Comparison/MatchExpressionRule.php>Oi>Y(@Gsrc/Rules/Comparison/NumberComparisonOperatorsConstantConditionRule.phpp Oip , 4src/Rules/Comparison/ConstantLooseComparisonRule.phpOiDu Ӥ,src/Rules/Functions/FunctionCallableRule.phpOi ֤3src/Rules/Functions/ArrowFunctionAttributesRule.php Oi m05src/Rules/Functions/ParameterCastableToStringRule.php Oi 鸤+src/Rules/Functions/ParamAttributesRule.phpOig$Ϥ<src/Rules/Functions/IncompatibleDefaultParameterTypeRule.phpOiƈ<src/Rules/Functions/MissingFunctionParameterTypehintRule.phpOi{Csrc/Rules/Functions/IncompatibleClosureDefaultParameterTypeRule.phpOiW)6src/Rules/Functions/UselessFunctionReturnValueRule.php Oi h5-src/Rules/Functions/UnusedClosureUsesRule.phpOiMIsrc/Rules/Functions/IncompatibleArrowFunctionDefaultParameterTypeRule.phpOiD9src/Rules/Functions/VariadicParametersDeclarationRule.php2Oi2k/src/Rules/Functions/ReturnNullsafeByRefRule.phpZOiZן+src/Rules/Functions/ImplodeFunctionRule.php Oi CR/src/Rules/Functions/RandomIntParametersRule.phpOi.src/Rules/Functions/FunctionAttributesRule.phpOi-src/Rules/Functions/ClosureAttributesRule.phpOi7f9(src/Rules/Functions/CallUserFuncRule.php Oi K,src/Rules/Functions/PrintfParametersRule.phps Ois G?src/Rules/Functions/InvalidLexicalVariablesInClosureUseRule.phpOidu4src/Rules/Functions/CallToFunctionParametersRule.php Oi -l9src/Rules/Functions/SortParameterCastableToStringRule.phpOi2%l{,src/Rules/Functions/DefineParametersRule.phpOix 'src/Rules/Functions/ArrayFilterRule.phpOi;.Ӥ<src/Rules/Functions/ArrowFunctionReturnNullsafeByRefRule.phpOi6 3src/Rules/Functions/ArrowFunctionReturnTypeRule.phpOi\M&src/Rules/Functions/ReturnTypeRule.php(Oi(t$7Ϥ<src/Rules/Functions/ImplodeParameterCastableToStringRule.php Oi 1src/Rules/Functions/PrintfArrayParametersRule.phpOiۤ=src/Rules/Functions/ExistingClassesInClosureTypehintsRule.php\Oi\(l9src/Rules/Functions/MissingFunctionReturnTypehintRule.php Oi 8:)src/Rules/Functions/InnerFunctionRule.phpeOieEl6src/Rules/Functions/ExistingClassesInTypehintsRule.phpOiΤ8src/Rules/Functions/DuplicateFunctionDeclarationRule.phpOi7ҭ/src/Rules/Functions/RedefinedParametersRule.phpOi4'src/Rules/Functions/ArrayValuesRule.phpTOiT.-src/Rules/Functions/ClosureReturnTypeRule.php@Oi@fn)src/Rules/Functions/CallCallablesRule.phpPOiP$src/Rules/Functions/PrintfHelper.php@ Oi@ ?\|Csrc/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRule.phpOiU$Esrc/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.phpHOiH'>5src/Rules/Functions/CallToNonExistentFunctionRule.php'Oi'.&src/Rules/Generators/YieldTypeRule.phpU OiU b-src/Rules/Generators/YieldInGeneratorRule.php"Oi"}! *src/Rules/Generators/YieldFromTypeRule.php"Oi"QҤ src/Rules/Debug/DumpTypeRule.phpOiӤ"src/Rules/Debug/DebugScopeRule.phpHOiH "src/Rules/Debug/FileAssertRule.phpOi~&src/Rules/Debug/DumpPhpDocTypeRule.php*Oi*zB,src/Rules/ParameterCastableToStringCheck.phpjOijL%src/Rules/RuleErrors/RuleError125.php`Oi`+%src/Rules/RuleErrors/RuleError121.phpOi2 ܤ$src/Rules/RuleErrors/RuleError69.phpOiR%$src/Rules/RuleErrors/RuleError85.phpOi@9$src/Rules/RuleErrors/RuleError97.phpOi B$src/Rules/RuleErrors/RuleError21.phpOiR#x$src/Rules/RuleErrors/RuleError83.php"Oi"S$src/Rules/RuleErrors/RuleError43.phpOiW$src/Rules/RuleErrors/RuleError81.phptOitȃe#src/Rules/RuleErrors/RuleError1.phpaOiai~%src/Rules/RuleErrors/RuleError105.php5Oi5b0$src/Rules/RuleErrors/RuleError49.phpOi+ݫ`$src/Rules/RuleErrors/RuleError17.php4Oi4ȹ$src/Rules/RuleErrors/RuleError23.php;Oi;[D$src/Rules/RuleErrors/RuleError35.phpOih"%src/Rules/RuleErrors/RuleError115.phpOi |$src/Rules/RuleErrors/RuleError29.php<Oi<F%src/Rules/RuleErrors/RuleError109.phpOi6:$src/Rules/RuleErrors/RuleError57.phpOic #src/Rules/RuleErrors/RuleError7.phphOih$src/Rules/RuleErrors/RuleError11.phpOi3J$src/Rules/RuleErrors/RuleError73.phpQOiQUq<*src/Rules/Traits/ConstantsInTraitsRule.php*Oi*٤&src/Rules/Traits/TraitUseCollector.phpOi8.src/Rules/Traits/TraitDeclarationCollector.php[Oi[놤2src/Rules/Traits/ConflictingTraitConstantsRule.php#Oi#$Pפ)src/Rules/Traits/NotAnalysedTraitRule.phpOix^*0src/Rules/Constants/ClassAsClassConstantRule.php}Oi}Esrc/Rules/Constants/LazyAlwaysUsedClassConstantsExtensionProvider.php!Oi!j0src/Rules/Constants/MagicConstantContextRule.phpvOivɺ4src/Rules/Constants/NativeTypedClassConstantRule.phpOixLAsrc/Rules/Constants/AlwaysUsedClassConstantsExtensionProvider.phpEOiER?$src/Rules/Constants/ConstantRule.phpOio^ک8src/Rules/Constants/ValueAssignedToClassConstantRule.phpOiY5src/Rules/Constants/DynamicClassConstantFetchRule.phpOi0a.src/Rules/Constants/OverridingConstantRule.phpOiZk)src/Rules/Constants/FinalConstantRule.phpOia29src/Rules/Constants/AlwaysUsedClassConstantsExtension.phpOiޡr8src/Rules/Constants/MissingClassConstantTypehintRule.phpE OiE ݤ1src/Rules/Operators/InvalidUnaryOperationRule.php Oi U`2src/Rules/Operators/InvalidBinaryOperationRule.php#Oi#'8P6src/Rules/Operators/InvalidComparisonOperationRule.phpOi2src/Rules/Operators/InvalidIncDecOperationRule.phpOin)iĤ,src/Rules/Operators/InvalidAssignVarRule.php Oi [src/Rules/RuleError.phpOit@Фsrc/Rules/Registry.php'Oi'>src/Rules/DeadCode/ConstructorWithoutImpurePointsCollector.phpOie6src/Rules/DeadCode/PossiblyPureMethodCallCollector.phpOi˒0src/Rules/DeadCode/UnusedPrivateConstantRule.phpTOiT8KCsrc/Rules/DeadCode/CallToMethodStatementWithoutImpurePointsRule.phphOihʩ;src/Rules/DeadCode/FunctionWithoutImpurePointsCollector.phpOiiEsrc/Rules/DeadCode/CallToFunctionStatementWithoutImpurePointsRule.phpOi|%src/Rules/DeadCode/BetterNoopRule.phpKOiK\.src/Rules/DeadCode/UnusedPrivateMethodRule.phpOi26src/Rules/DeadCode/PossiblyPureStaticCallCollector.phpOijsrc/Rules/DeadCode/NoopRule.phpOi/src/Rules/DeadCode/PossiblyPureNewCollector.php3Oi3٤4src/Rules/DeadCode/PossiblyPureFuncCallCollector.phpOi+fYIsrc/Rules/DeadCode/CallToStaticMethodStatementWithoutImpurePointsRule.phpOiu9src/Rules/DeadCode/MethodWithoutImpurePointsCollector.phpOi/src/Rules/DeadCode/UnreachableStatementRule.phpOi!Hsrc/Rules/DeadCode/CallToConstructorStatementWithoutImpurePointsRule.phpOi B0src/Rules/DeadCode/UnusedPrivatePropertyRule.phpC!OiC!50:src/Rules/Methods/MissingMagicSerializationMethodsRule.php Oi )Gsrc/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.phpI OiI :src/Rules/Methods/AbstractMethodInNonAbstractClassRule.phpSOiS 2src/Rules/Methods/MissingMethodSelfOutTypeRule.phpM OiM p~5src/Rules/Methods/MissingMethodImplementationRule.phpOi}Ť:src/Rules/Methods/IncompatibleDefaultParameterTypeRule.phpOi/src/Rules/Methods/ConstructorReturnTypeRule.phpOi:m5src/Rules/Methods/MethodVisibilityInInterfaceRule.php?Oi?%src/Rules/Methods/MethodCallCheck.phpOi6src/Rules/Methods/IllegalConstructorMethodCallRule.phpOix<(src/Rules/Methods/MethodCallableRule.phpOi^oN6src/Rules/Methods/IllegalConstructorStaticCallRule.php Oi %g8src/Rules/Methods/MissingMethodParameterTypehintRule.phpOi@b5src/Rules/Methods/MethodParameterComparisonHelper.php8Oi8?/src/Rules/Methods/ConsistentConstructorRule.php6Oi6>Ф*src/Rules/Methods/MethodAttributesRule.phpOiU9%src/Rules/Methods/CallMethodsRule.php Oi Wb+src/Rules/Methods/CallStaticMethodsRule.php Oi ӆ/src/Rules/Methods/AbstractPrivateMethodRule.phpOi~)*src/Rules/Methods/OverridingMethodRule.php?Oi? %;src/Rules/Methods/LazyAlwaysUsedMethodExtensionProvider.phpOiܤ7src/Rules/Methods/AlwaysUsedMethodExtensionProvider.php)Oi)EFsrc/Rules/Methods/CallToConstructorStatementWithoutSideEffectsRule.phpOiцꑤ$src/Rules/Methods/ReturnTypeRule.phpOiDۊ.src/Rules/Methods/StaticMethodCallableRule.php<Oi<n5src/Rules/Methods/MissingMethodReturnTypehintRule.php Oi g74src/Rules/Methods/ExistingClassesInTypehintsRule.phpOij3 /src/Rules/Methods/AlwaysUsedMethodExtension.phpKOiKGe,src/Rules/Methods/FinalPrivateMethodRule.phpOi'ߙ,src/Rules/Methods/NullsafeMethodCallRule.phppOipu(Ť=src/Rules/Methods/DirectAlwaysUsedMethodExtensionProvider.phpOiA8src/Rules/Methods/CallPrivateMethodThroughStaticRule.phpOi1y Asrc/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php Oi >[Ф)src/Rules/Methods/MethodSignatureRule.php.Oi.)[+src/Rules/Methods/StaticMethodCallCheck.php'Oi'_P!src/Rules/Names/UsedNamesRule.phpOiv,src/Rules/Keywords/RequireFileExistsRule.phpOi(.src/Rules/Keywords/ContinueBreakInLoopRule.phpOi0r-src/Rules/Keywords/DeclareStrictTypesRule.phpOi[B+src/Rules/UnusedFunctionParametersCheck.php Oi ʐԤsrc/Rules/FoundTypeResult.phpOih[g"src/Rules/MissingTypehintCheck.phpOircsrc/Rules/LazyRegistry.phpOioϒsrc/Rules/ClassNameNodePair.phpOi$hͤsrc/Rules/AttributesCheck.phplOilF[Bsrc/Rules/Exceptions/MissingCheckedExceptionInMethodThrowsRule.phpOig 5src/Rules/Exceptions/TooWideFunctionThrowTypeRule.phpZOiZSڱ*src/Rules/Exceptions/ThrowExprTypeRule.phpVOiVM(K5src/Rules/Exceptions/CaughtExceptionExistenceRule.php Oi ~w)Esrc/Rules/Exceptions/ThrowsVoidFunctionWithExplicitThrowPointRule.php Oi ӗ3src/Rules/Exceptions/TooWideMethodThrowTypeRule.phpOi_~=src/Rules/Exceptions/MissingCheckedExceptionInThrowsCheck.phpOi~.src/Rules/Exceptions/NoncapturingCatchRule.phpOi$Csrc/Rules/Exceptions/ThrowsVoidMethodWithExplicitThrowPointRule.php Oi /zhDsrc/Rules/Exceptions/MissingCheckedExceptionInFunctionThrowsRule.php}Oi}煤,src/Rules/Exceptions/ThrowExpressionRule.phpOi].src/Rules/Exceptions/TooWideThrowTypeCheck.phpOiVѤ.src/Rules/Exceptions/ExceptionTypeResolver.phpOis5src/Rules/Exceptions/DefaultExceptionTypeResolver.phpOiO7src/Rules/Exceptions/CatchWithUnthrownExceptionRule.phpTOiTX:src/Rules/Exceptions/OverwrittenExitPointByFinallyRule.php$Oi$9}Bsrc/Rules/TooWideTypehints/TooWideFunctionParameterOutTypeRule.phpOig>src/Rules/TooWideTypehints/TooWideMethodReturnTypehintRule.phpMOiMhݤ@src/Rules/TooWideTypehints/TooWideFunctionReturnTypehintRule.php Oi Ĕ@src/Rules/TooWideTypehints/TooWideMethodParameterOutTypeRule.phpOi͉6src/Rules/TooWideTypehints/TooWidePropertyTypeRule.phpOi;'Esrc/Rules/TooWideTypehints/TooWideArrowFunctionReturnTypehintRule.phpOi] W;src/Rules/TooWideTypehints/TooWideParameterOutTypeCheck.php? Oi? o|?src/Rules/TooWideTypehints/TooWideClosureReturnTypehintRule.phpOii Ф#src/Rules/NonIgnorableRuleError.phpOi6y̤src/Rules/Cast/PrintRule.phpYOiYQf¤ src/Rules/Cast/UnsetCastRule.phpOi|Ҥ"src/Rules/Cast/InvalidCastRule.php Oi (ysrc/Rules/Cast/EchoRule.phpOiv2src/Rules/Cast/InvalidPartOfEncapsedStringRule.phpOi<&src/Rules/Playground/NoPhpCodeRule.phpVOiV:E Ԥ*src/Rules/Playground/FunctionNeverRule.phpUOiU{٤(src/Rules/Playground/NeverRuleHelper.phpOi@.(src/Rules/Playground/MethodNeverRule.phpwOiw]r-src/Rules/Playground/NotAnalysedTraitRule.phpOiZʆsrc/Rules/FileRuleError.phpOi!vsrc/Rules/TipRuleError.phpOi|2src/Rules/PhpDoc/WrongVariableNameInVarTagRule.php6Oi6la-src/Rules/PhpDoc/InvalidPHPStanDocTagRule.phpOiaB%src/Rules/PhpDoc/MethodAssertRule.phpOiχ0src/Rules/PhpDoc/IncompatibleSelfOutTypeRule.phpd Oid O9src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php Oi qf%src/Rules/PhpDoc/AssertRuleHelper.php%Oi%vZ'src/Rules/PhpDoc/FunctionAssertRule.phpOiU֤4src/Rules/PhpDoc/MethodConditionalReturnTypeRule.phpOi!̷ܤ(src/Rules/PhpDoc/RequireExtendsCheck.phpD OiD 51src/Rules/PhpDoc/InvalidThrowsPhpDocValueRule.php Oi #7src/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRule.phpOiޤ6src/Rules/PhpDoc/FunctionConditionalReturnTypeRule.phpOiF4src/Rules/PhpDoc/ConditionalReturnTypeRuleHelper.phpOiyƐ.src/Rules/PhpDoc/GenericCallableRuleHelper.phpOi 0src/Rules/PhpDoc/InvalidPhpDocVarTagTypeRule.phpOiQգ6src/Rules/PhpDoc/RequireExtendsDefinitionTraitRule.php Oi FC=<src/Rules/PhpDoc/IncompatibleClassConstantPhpDocTypeRule.php Oi j逘)src/Rules/PhpDoc/VarTagTypeRuleHelper.phpJ#OiJ#]E.src/Rules/PhpDoc/InvalidPhpDocTagValueRule.phpOi阽Dsrc/Rules/PhpDoc/IncompatibleParamImmediatelyInvokedCallableRule.php Oi U4src/Rules/PhpDoc/VarTagChangedExpressionTypeRule.phphOihˊ+src/Rules/PhpDoc/UnresolvableTypeHelper.phpEOiE u%src/Rules/PhpDoc/PhpDocLineHelper.php:Oi:6}6src/Rules/PhpDoc/RequireExtendsDefinitionClassRule.php0Oi0BF9src/Rules/PhpDoc/RequireImplementsDefinitionClassRule.phpOi[/src/Rules/PhpDoc/IncompatiblePhpDocTypeRule.phpc.Oic.)A3src/Rules/Rule.phpOiYړ/src/Rules/Namespaces/ExistingNamesInUseRule.phphOihI4src/Rules/Namespaces/ExistingNamesInGroupUseRule.phpOi6*src/DependencyInjection/RulesExtension.phpOiep/src/DependencyInjection/ProjectConfigHelper.phpOiq0src/DependencyInjection/Nette/NetteContainer.php Oi ؙ @src/DependencyInjection/InvalidIgnoredErrorPatternsException.php/Oi/6;src/DependencyInjection/DuplicateIncludedFilesException.phppOip԰;i%src/DependencyInjection/Container.phpOi؋R,src/DependencyInjection/ContainerFactory.php&<Oi&<`>̾)src/DependencyInjection/LoaderFactory.php,Oi,ZPsrc/DependencyInjection/Type/OperatorTypeSpecifyingExtensionRegistryProvider.phpOis)Osrc/DependencyInjection/Type/LazyDynamicReturnTypeExtensionRegistryProvider.php!Oi!;-jJsrc/DependencyInjection/Type/LazyParameterClosureTypeExtensionProvider.php{Oi{ äFsrc/DependencyInjection/Type/LazyDynamicThrowTypeExtensionProvider.php[Oi[*ǤTsrc/DependencyInjection/Type/LazyExpressionTypeResolverExtensionRegistryProvider.phpOiRפKsrc/DependencyInjection/Type/DynamicReturnTypeExtensionRegistryProvider.phpOi;rTsrc/DependencyInjection/Type/LazyOperatorTypeSpecifyingExtensionRegistryProvider.phpOie('Fsrc/DependencyInjection/Type/ParameterClosureTypeExtensionProvider.phpOiI{Psrc/DependencyInjection/Type/ExpressionTypeResolverExtensionRegistryProvider.phpOi楤Bsrc/DependencyInjection/Type/ParameterOutTypeExtensionProvider.phpOiFsrc/DependencyInjection/Type/LazyParameterOutTypeExtensionProvider.php[Oi[j4Bsrc/DependencyInjection/Type/DynamicThrowTypeExtensionProvider.phpOipդ.src/DependencyInjection/MemoizingContainer.phpOimr6src/DependencyInjection/ParameterNotFoundException.phpPOiP D-src/DependencyInjection/Neon/OptionalPath.phpOi`GŤ5src/DependencyInjection/ParametersSchemaExtension.phpOixG4src/DependencyInjection/ConditionalTagsExtension.phpOi0{&src/DependencyInjection/NeonLoader.phpOiG+(src/DependencyInjection/Configurator.php Oi 3Osrc/DependencyInjection/Reflection/ClassReflectionExtensionRegistryProvider.php Oi rSsrc/DependencyInjection/Reflection/LazyClassReflectionExtensionRegistryProvider.php+ Oi+ Pyʤ.src/DependencyInjection/BleedingEdgeToggle.phpOi7a'src/DependencyInjection/NeonAdapter.phpOi8HI9src/DependencyInjection/ValidateExcludePathsExtension.phpw Oiw ZPF6src/DependencyInjection/DerivativeContainerFactory.php Oi :src/DependencyInjection/ValidateIgnoredErrorsExtension.php! Oi! r8src/DependencyInjection/InvalidExcludePathsException.php'Oi'Ԕ~!src/Analyser/StatementContext.phpOi_8,src/Analyser/ConditionalExpressionHolder.phpOip7!src/Analyser/ConstantResolver.php+Oi+31#src/Analyser/EndStatementResult.phpiOii>,src/Analyser/TypeSpecifierAwareExtension.phpOiQsrc/Analyser/TypeSpecifier.php2~Oi2~](src/Analyser/AnalyserResultFinalizer.php%Oi%p"src/Analyser/NodeScopeResolver.phpx{Oix{MUӤsrc/Analyser/ScopeContext.php Oi *#src/Analyser/FileAnalyserResult.phppOipoHN src/Analyser/StatementResult.phpOi.:#src/Analyser/StatementExitPoint.phpqOiqI(src/Analyser/ConstantResolverFactory.php?Oi?)&!src/Analyser/ExpressionResult.phpU OiU ,src/Analyser/EnsuredNonNullabilityResult.phpWOiW{=m)src/Analyser/RicherScopeGetTypeHelper.php" Oi" src/Analyser/ScopeFactory.phpOiCsrc/Analyser/MutatingScope.php\Oi\8src/Analyser/AnalyserResult.php}Oi}M̤9src/Analyser/Ignore/IgnoredErrorHelperProcessedResult.php Oi 48C*src/Analyser/Ignore/IgnoredErrorHelper.phpOim6$src/Analyser/Ignore/IgnoredError.php4 Oi4 TWb,src/Analyser/Ignore/IgnoreParseException.phpOi툤#src/Analyser/Ignore/IgnoreLexer.phpy Oiy 0src/Analyser/Ignore/IgnoredErrorHelperResult.php(Oi(@q7%src/Analyser/TypeSpecifierContext.php Oi EE6src/Analyser/EnsuredNonNullabilityResultExpression.phppOipYCZsrc/Analyser/ThrowPoint.phpOi'#e,src/Analyser/LocalIgnoresProcessorResult.php9Oi9 n$src/Analyser/ArgumentsNormalizer.phpOi l'src/Analyser/NullsafeOperatorHelper.php Oi +src/Analyser/DirectInternalScopeFactory.phpOi[1Ф%src/Analyser/ExpressionTypeHolder.phpOi*-(src/Analyser/ResultCache/ResultCache.phpOi}/src/Analyser/ResultCache/ResultCacheClearer.phpKOiKu/src/Analyser/ResultCache/ResultCacheManager.phpOi{|%5src/Analyser/ResultCache/ResultCacheProcessResult.phpwOiwv6src/Analyser/ResultCache/ResultCacheManagerFactory.php Oi Pksrc/Analyser/SpecifiedTypes.php^Oi^Z=%src/Analyser/TypeSpecifierFactory.php=Oi=yOsrc/Analyser/Scope.phpOi]{src/Analyser/NameScope.phpIOiIe=9%src/Analyser/ProcessClosureResult.phpOi 1src/Analyser/Error.phpOidrkP src/Analyser/OutOfClassScope.phpOi#src/Analyser/ImpurePoint.phpOiv?+src/Analyser/UndefinedVariableException.php;Oi;!%src/Analyser/InternalScopeFactory.phpOiϤƷ src/Analyser/FinalizerResult.phpLOiLK&src/Analyser/LocalIgnoresProcessor.php Oi DWYsrc/Analyser/InternalError.phpx Oix m&xsrc/Analyser/FileAnalyser.phpCOiC"src/Analyser/ExpressionContext.phpOin,asrc/Analyser/Analyser.phpOiL%src/Analyser/RuleErrorTransformer.php! Oi! ~)src/Analyser/LazyInternalScopeFactory.phpOi9isrc/Command/InceptionResult.phpzOizPsrc/Command/CommandHelper.php߉Oi߉n"src/Command/FixerWorkerCommand.php>Oi>Ssrc/Command/OutputStyle.phpOi>g'src/Command/ClearResultCacheCommand.php Oi Vsrc/Command/AnalyserRunner.php]Oi]Wmۂ+src/Command/IgnoredRegexValidatorResult.phpOi3?%src/Command/FixerProcessException.phpOiH}src/Command/WorkerCommand.php,Oi,a"src/Command/ErrorsConsoleStyle.phpOiz%src/Command/IgnoredRegexValidator.phpOi %src/Command/Symfony/SymfonyOutput.phpOi%4$src/Command/Symfony/SymfonyStyle.phpOids{"src/Command/AnalyseApplication.php7Oi7:/hsrc/Command/Output.phpOi9 src/Command/FixerApplication.phpUOiU(ޤsrc/Command/DiagnoseCommand.php?Oi?src/Command/AnalysisResult.phpcOic$e/src/Command/InceptionNotSuccessfulException.phpOi_src/Command/AnalyseCommand.phpOi~^11src/Command/ErrorFormatter/JsonErrorFormatter.phpROiRu&5src/Command/ErrorFormatter/TeamcityErrorFormatter.phpOiK.8src/Command/ErrorFormatter/BaselinePhpErrorFormatter.phpP OiP ] 3src/Command/ErrorFormatter/GitlabErrorFormatter.php5Oi5֖-src/Command/ErrorFormatter/ErrorFormatter.phpOis̤7src/Command/ErrorFormatter/CheckstyleErrorFormatter.phpOi=40src/Command/ErrorFormatter/RawErrorFormatter.phpjOij3src/Command/ErrorFormatter/GithubErrorFormatter.phph Oih VԤ7src/Command/ErrorFormatter/CiDetectedErrorFormatter.phpOiPoP9src/Command/ErrorFormatter/BaselineNeonErrorFormatter.php Oi `vZ2src/Command/ErrorFormatter/TableErrorFormatter.phpPOiPn1zw2src/Command/ErrorFormatter/JunitErrorFormatter.php Oi U+%src/Command/DumpParametersCommand.phpFOiFYgt\src/Command/fixer-phar.pubkey Oi u䪤#src/Dependency/RootExportedNode.phpOi]650src/Dependency/ExportedNode/ExportedEnumNode.phpOiVt1src/Dependency/ExportedNode/ExportedClassNode.phpSOiS o5src/Dependency/ExportedNode/ExportedInterfaceNode.php Oi }A:src/Dependency/ExportedNode/ExportedClassConstantsNode.php Oi )89src/Dependency/ExportedNode/ExportedClassConstantNode.phpU OiU a%5src/Dependency/ExportedNode/ExportedAttributeNode.phpOi071src/Dependency/ExportedNode/ExportedTraitNode.phpOi:4src/Dependency/ExportedNode/ExportedEnumCaseNode.phpOi4src/Dependency/ExportedNode/ExportedFunctionNode.phpOi6u5src/Dependency/ExportedNode/ExportedParameterNode.php Oi Ȥ6src/Dependency/ExportedNode/ExportedPropertiesNode.php$Oi$2l٤:src/Dependency/ExportedNode/ExportedTraitUseAdaptation.phpF OiF )2src/Dependency/ExportedNode/ExportedPhpDocNode.php)Oi)2src/Dependency/ExportedNode/ExportedMethodNode.phpOiB%src/Dependency/DependencyResolver.phpOit&src/Dependency/ExportedNodeFetcher.phpOi*^#src/Dependency/NodeDependencies.phpOiWsrc/Dependency/ExportedNode.phpaOiaVN'src/Dependency/ExportedNodeResolver.php4Oi4-$&src/Dependency/ExportedNodeVisitor.phpOi‚Y"src/Diagnose/DiagnoseExtension.phpOiפ)src/Diagnose/PHPStanDiagnoseExtension.phpOi%src/Parser/ParentStmtTypesVisitor.phpnOin &ܤ%src/Parser/DeclarePositionVisitor.phpOimA"src/Parser/ArrayWalkArgVisitor.phpOi+F#src/Parser/CurlSetOptArgVisitor.phpOiAc!src/Parser/PhpParserDecorator.phpOi#ߤsrc/Parser/CleaningParser.phpOiԱD src/Parser/ClosureArgVisitor.phpOigˤ"src/Parser/TryCatchTypeVisitor.phpOiK>-src/Parser/TypeTraverserInstanceofVisitor.php(Oi(QF src/Parser/PathRoutingParser.php Oi ҂M%src/Parser/TraitCollectingVisitor.phpOi}4(Ĥ#src/Parser/LastConditionVisitor.php Oi o$src/Parser/ClosureBindArgVisitor.phpOi`isrc/Parser/SimpleParser.phpOiFa$src/Parser/ArrayFilterArgVisitor.phpOiNh5!src/Parser/ArrayMapArgVisitor.phpOi,z츤src/Parser/LexerFactory.phpOi$B9/src/Parser/MagicConstantParamDefaultVisitor.phpOiBä$src/Parser/AnonymousClassVisitor.phpfOif,Gsrc/Parser/CachedParser.php Oi 64l"src/Parser/ArrayFindArgVisitor.phpOi̲?+src/Parser/NewAssignedToPropertyVisitor.phpOiXsrc/Parser/CleaningVisitor.php\ Oi\ H&src/Parser/ArrowFunctionArgVisitor.phpOiǤ&src/Parser/ClosureBindToVarVisitor.phpOiB*src/Parser/FunctionCallStatementFinder.phpOiJysrc/Parser/RichParser.php4Oi4dR$src/Parser/ParserErrorsException.phpOi<)4src/Parser/RemoveUnusedCodeByPhpVersionIdVisitor.phpS OiS SL/src/Parser/ImmediatelyInvokedClosureVisitor.phpOiŇosrc/Parser/Parser.phpOi_8(src/Process/ProcessCanceledException.phpOiw@Xsrc/Process/ProcessPromise.phpz Oiz 0src/Process/CpuCoreCounter.phpOif$s'src/Process/ProcessCrashedException.phpOi &Фsrc/Process/ProcessHelper.phpY OiY \ isrc/Cache/Cache.phpgOig`src/Cache/FileCacheStorage.phpO OiO {aisrc/Cache/CacheItem.php8Oi8OIWsrc/Cache/CacheStorage.php0Oi0 src/Cache/MemoryCacheStorage.phpOOiO kB"src/Node/FinallyExitPointsNode.phpOi@q{src/Node/ClassMethodsNode.phpOijWsrc/Node/BooleanOrNode.phpOi*ksrc/Node/NoopExpressionNode.phpOi5)src/Node/FunctionReturnStatementsNode.php Oi 4,src/Node/Expr/PropertyInitializationExpr.phpOil֤0src/Node/Expr/SetExistingOffsetValueTypeExpr.phpOif64src/Node/Expr/ParameterVariableOriginalValueExpr.phpOi DH(src/Node/Expr/GetOffsetValueTypeExpr.php4Oi4%7*src/Node/Expr/GetIterableValueTypeExpr.phpOi &(src/Node/Expr/GetIterableKeyTypeExpr.phpOiWm2B!src/Node/Expr/UnsetOffsetExpr.php&Oi&Wcsrc/Node/Expr/TypeExpr.phpOigä&src/Node/Expr/AlwaysRememberedExpr.php.Oi.w~(*src/Node/Expr/OriginalPropertyTypeExpr.phpOi(src/Node/Expr/SetOffsetValueTypeExpr.phpOi6'src/Node/Expr/ExistingArrayDimFetch.php2Oi2src/Node/CollectedDataNode.phpOißsrc/Node/InFunctionNode.phpOi_,src/Node/VarTagChangedExpressionTypeNode.phpOi4/src/Node/ExecutionEndNode.phpOi76(src/Node/MatchExpressionArmCondition.phpOi& +src/Node/InTraitNode.phpyOiy@src/Node/ReturnStatement.phpOi쏿src/Node/ClassMethod.phpOOiO-e(7$src/Node/Printer/NodeTypePrinter.phpOiw9 src/Node/Printer/ExprPrinter.phpOiWԝΤsrc/Node/Printer/Printer.phpOi$src/Node/InClosureNode.php)Oi){9Ssrc/Node/LiteralArrayItem.phpgOig%k$src/Node/ClassStatementsGatherer.php#Oi#(src/Node/ClosureReturnStatementsNode.php Oi \+src/Node/CatchWithUnthrownExceptionNode.phpOiG%src/Node/DoWhileLoopConditionNode.php<Oi<{ o!src/Node/FunctionCallableNode.phpOi;"src/Node/Property/PropertyRead.php Oi W#src/Node/Property/PropertyWrite.phpOi}$src/Node/Property/PropertyAssign.phprOir &src/Node/InstantiationCallableNode.phpOi~#'src/Node/MethodReturnStatementsNode.phpOicˌ(src/Node/Constant/ClassConstantFetch.phpiOiisrc/Node/Method/MethodCall.phpOi[src/Node/AnonymousClassNode.phpOibɫsrc/Node/BooleanAndNode.phpOi7cJsrc/Node/ClassConstantsNode.phpOi"häsrc/Node/IssetExpr.phpOi-n src/Node/ClassPropertiesNode.phpY@OiY@ɤ src/Node/MatchExpressionNode.phpOiذ0src/Node/InvalidateExprNode.phpOisrc/Node/InClassMethodNode.phpOi ܤsrc/Node/InClassNode.php2Oi2bX%src/Node/StaticMethodCallableNode.php;Oi;)3E0src/Node/VirtualNode.phpOi@Ϥ#src/Node/BreaklessWhileLoopNode.phpOiFsrc/Node/MatchExpressionArm.phpOit#src/Node/MatchExpressionArmBody.php3Oi3ƶ3src/Node/InForeachNode.phpOiSqGsrc/Node/LiteralArrayNode.php~Oi~9/r src/Node/InArrowFunctionNode.phpWOiWE<%src/Node/UnreachableStatementNode.phpOisrc/Node/VariableAssignNode.phpOi src/Node/ClassPropertyNode.phpOi2src/Node/PropertyAssignNode.phpNOiNJ!src/Node/ReturnStatementsNode.phpoOio7src/Node/FileNode.phpPOiPQsrc/Node/MethodCallableNode.phpOioo,src/Testing/TestCaseSourceLocatorFactory.phpiOiisrc/Testing/TestCase.neonOi;,!src/Testing/PHPStanTestCase.php!%Oi!%zQ&src/Testing/ErrorFormatterTestCase.php;Oi;b2%src/Testing/TypeInferenceTestCase.php5Oi5jdsrc/Testing/functions.phpOi-csrc/Testing/LevelsTestCase.phpOi톙src/Testing/RuleTestCase.phpOOiOI!src/Parallel/ParallelAnalyser.php!5Oi!5Fsrc/Parallel/Schedule.phpOi޻)src/Parallel/ProcessTimedOutException.phpOiߤsrc/Parallel/ProcessPool.phpjOij"Fsrc/Parallel/Scheduler.php Oi src/Parallel/Process.phpOi= O%src/Broker/ClassNotFoundException.phpOi^zߤ(src/Broker/ClassAutoloadingException.phpOi!uVsrc/Broker/BrokerFactory.phpOi6QΗsrc/Broker/Broker.phpOi&'src/Broker/AnonymousClassNameHelper.phpOik0<(src/Broker/FunctionNotFoundException.phpOir(src/Broker/ConstantNotFoundException.phpOicHsrc/dumpType.phpAOiA .src/Reflection/Callables/SimpleImpurePoint.phpOin4src/Reflection/Callables/FunctionCallableVariant.phptOit,N17src/Reflection/Callables/CallableParametersAcceptor.phpOi"R-src/Reflection/Callables/SimpleThrowPoint.phpOikCIsrc/Reflection/Annotations/AnnotationsMethodsClassReflectionExtension.phpOi% Lsrc/Reflection/Annotations/AnnotationsPropertiesClassReflectionExtension.phpmOimUaCsrc/Reflection/Annotations/AnnotationsMethodParameterReflection.php.Oi.;src/Reflection/Annotations/AnnotationPropertyReflection.phpkOikEۡԤ9src/Reflection/Annotations/AnnotationMethodReflection.phpOiol㿤Qsrc/Reflection/RequireExtension/RequireExtendsMethodsClassReflectionExtension.phpFOiFޤTsrc/Reflection/RequireExtension/RequireExtendsPropertiesClassReflectionExtension.phplOil>,src/Reflection/FunctionReflectionFactory.phpEOiEt%src/Reflection/ConstantNameHelper.phpOiB%src/Reflection/EnumCaseReflection.phpOiK)src/Reflection/InitializerExprContext.phpOi""src/Reflection/ClassNameHelper.php Oi aZy5src/Reflection/CallableFunctionVariantWithPhpDocs.php Oi 4*Zޤ6src/Reflection/ResolvedFunctionVariantWithOriginal.php)Oi)&U,src/Reflection/WrapperPropertyReflection.phpOi6@-src/Reflection/ParametersAcceptorSelector.phpOiі=src/Reflection/Mixin/MixinMethodsClassReflectionExtension.php: Oi: jVޤ.src/Reflection/Mixin/MixinMethodReflection.php4Oi4 #]@src/Reflection/Mixin/MixinPropertiesClassReflectionExtension.php Oi D^פ+src/Reflection/GlobalConstantReflection.phpOivZʤ+src/Reflection/ExtendedMethodReflection.phpIOiIX\%src/Reflection/ConstructorsHelper.php Oi (Q0src/Reflection/Php/EnumCasesMethodReflection.phpS OiS Aw)-src/Reflection/Php/PhpParameterReflection.phpzOizf .src/Reflection/Php/BuiltinMethodReflection.php Oi l1src/Reflection/Php/PhpMethodReflectionFactory.phpOi-src/Reflection/Php/EnumPropertyReflection.phpOiTBsrc/Reflection/Php/EnumAllowedSubTypesClassReflectionExtension.php Oi  8src/Reflection/Php/PhpMethodFromParserNodeReflection.phpOi6f2src/Reflection/Php/ClosureCallMethodReflection.phpOiYƢ/src/Reflection/Php/SimpleXMLElementProperty.phpOi;src/Reflection/Php/PhpParameterFromParserNodeReflection.phpH OiH ^@4src/Reflection/Php/NativeBuiltinMethodReflection.phpOi*KDsrc/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php Oi NN,src/Reflection/Php/PhpFunctionReflection.php.Oi.-Jդ2src/Reflection/Php/PhpClassReflectionExtension.php6Oi6'1*src/Reflection/Php/PhpMethodReflection.phpxFOixFྤ6src/Reflection/Php/Soap/SoapClientMethodReflection.phpFOiFiEsrc/Reflection/Php/Soap/SoapClientMethodsClassReflectionExtension.phpOi+Esrc/Reflection/Php/ClosureCallUnresolvedMethodPrototypeReflection.php~Oi~Kr@src/Reflection/Php/EnumUnresolvedPropertyPrototypeReflection.phpOi'70src/Reflection/Php/DummyParameterWithPhpDocs.phpOij-,src/Reflection/Php/PhpPropertyReflection.phpOiv3src/Reflection/Php/UniversalObjectCrateProperty.phpJOiJt?:src/Reflection/Php/PhpFunctionFromParserNodeReflection.php,Oi,T"Ȥ%src/Reflection/Php/DummyParameter.php Oi XB-src/Reflection/Php/ExitFunctionReflection.php Oi V*src/Reflection/ClassConstantReflection.php\Oi\\JNFsrc/Reflection/Type/UnionTypeUnresolvedPropertyPrototypeReflection.php Oi ]U_Ksrc/Reflection/Type/IntersectionTypeUnresolvedMethodPrototypeReflection.php Oi '¤Gsrc/Reflection/Type/CalledOnTypeUnresolvedMethodPrototypeReflection.php?Oi?cN:src/Reflection/Type/IntersectionTypePropertyReflection.phpnOinT=src/Reflection/Type/UnresolvedPropertyPrototypeReflection.phpOiT`Csrc/Reflection/Type/CallbackUnresolvedMethodPrototypeReflection.php.Oi.eg;src/Reflection/Type/UnresolvedMethodPrototypeReflection.phpOiC.Msrc/Reflection/Type/IntersectionTypeUnresolvedPropertyPrototypeReflection.php Oi Cy̤Esrc/Reflection/Type/CallbackUnresolvedPropertyPrototypeReflection.phphOih-38src/Reflection/Type/IntersectionTypeMethodReflection.phpOiIsrc/Reflection/Type/CalledOnTypeUnresolvedPropertyPrototypeReflection.phpcOicD耤Dsrc/Reflection/Type/UnionTypeUnresolvedMethodPrototypeReflection.php Oi 0SФ3src/Reflection/Type/UnionTypePropertyReflection.phppOip/~1src/Reflection/Type/UnionTypeMethodReflection.phpTOiT?e.src/Reflection/InitializerExprTypeResolver.php,aOi,aI9src/Reflection/MissingPropertyFromReflectionException.php}Oi}D$5src/Reflection/PropertiesClassReflectionExtension.phpSOiS-=[%src/Reflection/ParametersAcceptor.phpIOiI6U%src/Reflection/PropertyReflection.phpWOiWsrc/Reflection/Native/NativeParameterWithPhpDocsReflection.php Oi 52src/Reflection/Native/NativeFunctionReflection.phpOiUR3src/Reflection/Native/NativeParameterReflection.phpOiatʤ0src/Reflection/Native/NativeMethodReflection.php Oi A>-src/Reflection/ExtendedPropertyReflection.phpOiS-src/Reflection/ResolvedPropertyReflection.phpKOiK^p+src/Reflection/ResolvedMethodReflection.php=Oi=Fsrc/Reflection/ReflectionProvider/SetterReflectionProviderProvider.phpaOia3Fsrc/Reflection/ReflectionProvider/DirectReflectionProviderProvider.phpPOiPn̪?src/Reflection/ReflectionProvider/ReflectionProviderFactory.phpSOiSG+=src/Reflection/ReflectionProvider/DummyReflectionProvider.phpOi1"Dsrc/Reflection/ReflectionProvider/LazyReflectionProviderProvider.php`Oi`@src/Reflection/ReflectionProvider/ReflectionProviderProvider.phpOi Asrc/Reflection/ReflectionProvider/MemoizingReflectionProvider.php Oi T)r2src/Reflection/WrappedExtendedMethodReflection.php4Oi4u>G%src/Reflection/InaccessibleMethod.php*Oi*C؂$src/Reflection/NamespaceAnswerer.phpOi\w&src/Reflection/ParameterReflection.phpOi`}1:src/Reflection/AllowedSubTypesClassReflectionExtension.phpOiUlb1src/Reflection/ParameterReflectionWithPhpDocs.phpOiy-src/Reflection/FunctionVariantWithPhpDocs.phpOi Osrc/Reflection/PHPStan/NativeReflectionEnumReturnDynamicReturnTypeExtension.phpOiG"src/Reflection/ClassReflection.php1Oi1ͤ',src/Reflection/ClassMemberAccessAnswerer.phptOitJ(src/Reflection/ClassMemberReflection.phpdOidY3٤,src/Reflection/MethodPrototypeReflection.php Oi # @$src/Reflection/PassedByReference.php%Oi%B3src/Reflection/ReflectionProviderStaticAccessor.phpOi2Hsrc/Reflection/Assertions.php Oi kXƤ%src/Reflection/FunctionReflection.phpOi*src/Reflection/ResolvedFunctionVariant.phpOili'Ԥ2src/Reflection/AdditionalConstructorsExtension.phpOi W<%src/Reflection/ReflectionProvider.phpOir!7src/Reflection/MissingMethodFromReflectionException.phpvOivCzb'src/Reflection/BrokerAwareExtension.phpOiJ9src/Reflection/MissingConstantFromReflectionException.php|Oi|'ʤ"src/Reflection/FunctionVariant.php1Oi1$yפ2src/Reflection/MethodsClassReflectionExtension.php:Oi:GgN4src/Reflection/GenericParametersAcceptorResolver.phpEOiE =0src/Reflection/ParametersAcceptorWithPhpDocs.phpOiO$E#src/Reflection/MethodReflection.phpOiu*.src/Reflection/Dummy/DummyMethodReflection.php Oi 2gV0src/Reflection/Dummy/DummyPropertyReflection.phpOOiOvE0src/Reflection/Dummy/DummyConstantReflection.phpuOiuA4src/Reflection/Dummy/ChangedTypeMethodReflection.phpOi0*6src/Reflection/Dummy/ChangedTypePropertyReflection.php Oi m3src/Reflection/Dummy/DummyConstructorReflection.php Oi wSsrc/Reflection/BetterReflection/SourceStubber/PhpStormStubsSourceStubberFactory.phpOiԊPsrc/Reflection/BetterReflection/SourceStubber/ReflectionSourceStubberFactory.phpOihVsrc/Reflection/BetterReflection/SourceLocator/OptimizedPsrAutoloaderLocatorFactory.phpsOisǣ/`\src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocatorRepository.phpOi?BNsrc/Reflection/BetterReflection/SourceLocator/ReflectionClassSourceLocator.phpLOiL+?Psrc/Reflection/BetterReflection/SourceLocator/AutoloadFunctionsSourceLocator.phpOi[H@src/Reflection/BetterReflection/SourceLocator/PhpFileCleaner.php"Oi"`Rsrc/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocator.php%%Oi%%K!Rsrc/Reflection/BetterReflection/SourceLocator/PhpVersionBlacklistSourceLocator.phpOiBsrc/Reflection/BetterReflection/SourceLocator/FileNodesFetcher.phpOijn̤Ysrc/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocatorFactory.phpOii@src/Reflection/BetterReflection/SourceLocator/CachingVisitor.phpOic$fV=src/Reflection/BetterReflection/SourceLocator/FetchedNode.php Oi Xsrc/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorFactory.phpiOiiQsrc/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php4Oi4=`src/Reflection/BetterReflection/SourceLocator/ComposerJsonAndInstalledJsonSourceLocatorMaker.php*Oi*&;Dsrc/Reflection/BetterReflection/SourceLocator/FetchedNodesResult.php'Oi'QMsrc/Reflection/BetterReflection/SourceLocator/SkipClassAliasSourceLocator.phpOisФKsrc/Reflection/BetterReflection/SourceLocator/FileReadTrapStreamWrapper.php)Oi)q|Psrc/Reflection/BetterReflection/SourceLocator/RewriteClassAliasSourceLocator.phpOi,Tsrc/Reflection/BetterReflection/SourceLocator/NewOptimizedDirectorySourceLocator.php Oi Rp}Gsrc/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.phpo6Oio6%zOsrc/Reflection/BetterReflection/SourceLocator/OptimizedPsrAutoloaderLocator.phpOi[bB[src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorRepository.phpOibĥCsrc/Reflection/BetterReflection/BetterReflectionProviderFactory.php#Oi#)yHsrc/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php!Oi!"k<src/Reflection/BetterReflection/BetterReflectionProvider.phplTOilT"@src/Reflection/BetterReflection/Reflector/MemoizingReflector.phpOi'b+src/Reflection/PhpVersionStaticAccessor.phpkOikq?6src/Reflection/ResolvedFunctionVariantWithCallable.phpOiӤ#src/Internal/CombinationsHelper.phpOi{ou*src/Internal/DirectoryCreatorException.php8Oi8~src/Internal/BytesHelper.phpOie| 4src/Internal/ContainerDynamicReturnTypeExtension.php)Oi)wCsrc/Internal/SprintfHelper.phpOi 6src/Internal/ComposerHelper.php Oi T!src/Internal/DirectoryCreator.phpOizysrc/Internal/AgentDetector.phpOisrc/TrinaryLogic.phpOi3* src/Collectors/CollectedData.phpZOiZnasrc/Collectors/Collector.php Oi ;"src/Collectors/RegistryFactory.phpOiwʤsrc/Collectors/Registry.phpvOiv( src/ShouldNotHappenException.phpOisrc/debugScope.phpOi src/PhpDoc/TypeNodeResolver.phpOiڠs!src/PhpDoc/StubFilesExtension.phptOitR%src/PhpDoc/ConstExprParserFactory.phpOiפ src/PhpDoc/Tag/DeprecatedTag.phpcOicVsrc/PhpDoc/Tag/TypeAliasTag.php?Oi?%src/PhpDoc/Tag/TypeAliasImportTag.php8Oi8Atw src/PhpDoc/Tag/ImplementsTag.php_Oi_%A;src/PhpDoc/Tag/MethodTag.php Oi  %src/PhpDoc/Tag/MethodTagParameter.phpOisrc/PhpDoc/DirectTypeNodeResolverExtensionRegistryProvider.php&Oi& N(src/PhpDoc/PhpDocInheritanceResolver.phpOi6dդ src/PhpDoc/StubFilesProvider.phpOi%#src/PhpDoc/PhpDocStringResolver.phpOi;ܤ!src/PhpDoc/StubPhpDocProvider.phpF2OiF28)g$src/PhpDoc/ConstExprNodeResolver.phpOic src/PhpDoc/StubValidator.php7Oi7喚0'src/PhpDoc/DefaultStubFilesProvider.php Oi Pۤ*src/PhpDoc/CountableStubFilesExtension.php$Oi$sUV<src/PhpDoc/LazyTypeNodeResolverExtensionRegistryProvider.phpOi!src/PhpDoc/PhpDocNodeResolver.php iOi i$#!src/PhpDoc/TypeStringResolver.phpOij-src/PhpDoc/SocketSelectStubFilesExtension.php^Oi^Dˤ5src/PhpDoc/TypeNodeResolverExtensionAwareRegistry.phpqOiqQA0src/PhpDoc/TypeNodeResolverExtensionRegistry.phpOiu /src/PhpDoc/ReflectionEnumStubFilesExtension.php*Oi*  bin/phpstanOiԤ$resources/functionMap_php82delta.phpOiWresources/functionMetadata.php[Oi[>I$resources/functionMap_php84delta.phpOi$resources/functionMap_php83delta.phpOi.resources/RegexGrammar.ppOi7?yresources/functionMap.phpvOivq$resources/functionMap_php80delta.phpljOilj|null &$read * @param array|null &$write * @param array|null &$except * @param-out ($read is not null ? array : null) $read * @param-out ($write is not null ? array : null) $write * @param-out ($except is not null ? array : null) $except * @return int|false */ function socket_select(?array &$read, ?array &$write, ?array &$except, ?int $seconds, int $microseconds = 0) {} */ public function getElementsByTagName ($name) {} /** * @param string $namespaceURI * @param string $localName * @return DOMNodeList */ public function getElementsByTagNameNS ($namespaceURI, $localName) {} } class DOMNode { } class DOMElement extends DOMNode { /** @var DOMDocument */ public $ownerDocument; /** * @param string $name * @return DOMNodeList */ public function getElementsByTagName ($name) {} /** * @param string $namespaceURI * @param string $localName * @return DOMNodeList */ public function getElementsByTagNameNS ($namespaceURI, $localName) {} } /** * @template-covariant TNode as DOMNode * @implements Traversable * @implements IteratorAggregate */ class DOMNodeList implements Traversable, IteratorAggregate, Countable { /** * @param int $index * @return TNode|null */ public function item ($index) {} } class DOMXPath { /** * @param string $expression * @param DOMNode|null $contextNode * @param boolean $registerNodeNS * @return DOMNodeList|false */ public function query($expression, $contextNode, $registerNodeNS) {} } class DOMAttr { /** @var DOMDocument */ public $ownerDocument; } class DOMCharacterData { /** @var DOMDocument */ public $ownerDocument; } class DOMDocumentType { /** @var DOMDocument */ public $ownerDocument; } class DOMEntity { /** @var DOMDocument */ public $ownerDocument; } class DOMNotation { /** @var DOMDocument */ public $ownerDocument; } class DOMProcessingInstruction { /** @var DOMDocument */ public $ownerDocument; /** * @var string */ public $target; /** * @var string */ public $data; } /** * @property-read int $length */ class DOMNamedNodeMap { } class DOMText { /** @var string */ public $wholeText; } */ interface Collection extends IteratorAggregate, Countable, JsonSerializable { /** * @return static */ public function copy(); /** * @return array */ public function toArray(): array; } /** * @template TValue * @implements Sequence */ final class Deque implements Sequence { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Deque */ public function copy() { } /** * @template TValue2 * @param iterable $values * @return Deque */ public function merge(iterable $values): Deque { } /** * @param (callable(TValue): bool)|null $callback * @return Deque */ public function filter(?callable $callback = null): Deque { } /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Deque */ public function map(callable $callback): Deque { } /** * @return Deque */ public function reversed(): Deque { } /** * @return Deque */ public function slice(int $offset, ?int $length = null): Deque { } } /** * @template TKey * @template TValue * @implements Collection * @implements ArrayAccess */ final class Map implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Map */ public function copy(): Map { } /** * @param callable(TKey, TValue): TValue $callback * @return void */ public function apply(callable $callback) { } /** * @return Pair * @throws UnderflowException */ public function first(): Pair { } /** * @return Pair * @throws UnderflowException */ public function last(): Pair { } /** * @return Pair * @throws OutOfRangeException */ public function skip(int $position): Pair { } /** * @template TKey2 * @template TValue2 * @param iterable $values * @return Map */ public function merge(iterable $values): Map { } /** * @template TKey2 * @template TValue2 * @param Map $map * @return Map */ public function intersect(Map $map): Map { } /** * @template TValue2 * @param Map $map * @return Map */ public function diff(Map $map): Map { } /** * @param TKey $key */ public function hasKey($key): bool { } /** * @param TValue $value */ public function hasValue($value): bool { } /** * @param (callable(TKey, TValue): bool)|null $callback * @return Map */ public function filter(?callable $callback = null): Map { } /** * @template TDefault * @param TKey $key * @param TDefault $default * @return TValue|TDefault * @throws OutOfBoundsException */ public function get($key, $default = null) { } /** * @return Set */ public function keys(): Set { } /** * @template TNewValue * @param callable(TKey, TValue): TNewValue $callback * @return Map */ public function map(callable $callback): Map { } /** * @return Sequence> */ public function pairs(): Sequence { } /** * @param TKey $key * @param TValue $value * @return void */ public function put($key, $value) { } /** * @param iterable $values * @return void */ public function putAll(iterable $values) { } /** * @template TCarry * @param callable(TCarry, TKey, TValue): TCarry $callback * @param TCarry $initial * @return TCarry */ public function reduce(callable $callback, $initial = null) { } /** * @template TDefault * @param TKey $key * @param TDefault $default * @return TValue|TDefault * @throws \OutOfBoundsException */ public function remove($key, $default = null) { } /** * @return Map */ public function reversed(): Map { } /** * @return Map */ public function slice(int $offset, ?int $length = null): Map { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return void */ public function sort(?callable $comparator = null) { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Map */ public function sorted(?callable $comparator = null): Map { } /** * @param (callable(TKey, TKey): int)|null $comparator * @return void */ public function ksort(?callable $comparator = null) { } /** * @param (callable(TKey, TKey): int)|null $comparator * @return Map */ public function ksorted(?callable $comparator = null): Map { } /** * @return array */ public function toArray(): array { } /** * @return Sequence */ public function values(): Sequence { } /** * @template TKey2 * @template TValue2 * @param Map $map * @return Map */ public function union(Map $map): Map { } /** * @template TKey2 * @template TValue2 * @param Map $map * @return Map */ public function xor(Map $map): Map { } } /** * @template-covariant TKey * @template-covariant TValue */ final class Pair implements JsonSerializable { /** * @var TKey */ public $key; /** * @var TValue */ public $value; /** * @param TKey $key * @param TValue $value */ public function __construct($key = null, $value = null) { } /** * @return Pair */ public function copy(): Pair { } } /** * @template TValue * @extends Collection * @extends ArrayAccess */ interface Sequence extends Collection, ArrayAccess { /** * @param callable(TValue): TValue $callback * @return void */ public function apply(callable $callback); /** * @param TValue ...$values */ public function contains(...$values): bool; /** * @param (callable(TValue): bool)|null $callback * @return Sequence */ public function filter(?callable $callback = null); /** * @param TValue $value * @return int|false */ public function find($value); /** * @return TValue * @throws \UnderflowException */ public function first(); /** * @return TValue * @throws \OutOfRangeException */ public function get(int $index); /** * @param TValue ...$values * @throws \OutOfRangeException * @return void */ public function insert(int $index, ...$values); /** * @param string $glue * @return string */ public function join(?string $glue = null): string; /** * @return TValue * @throws \UnderflowException */ public function last(); /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Sequence */ public function map(callable $callback); /** * @template TValue2 * @param iterable $values * @return Sequence */ public function merge(iterable $values); /** * @return TValue * @throws \UnderflowException * @phpstan-impure */ public function pop(); /** * @param TValue ...$values * @return void */ public function push(...$values); /** * @template TCarry * @param callable(TCarry, TValue): TCarry $callback * @param TCarry $initial * @return TCarry */ public function reduce(callable $callback, $initial = null); /** * @return TValue * @throws \OutOfRangeException */ public function remove(int $index); /** * @return Sequence */ public function reversed(); /** * @param TValue $value * @throws \OutOfRangeException * @return void */ public function set(int $index, $value); /** * @return TValue * @throws \UnderflowException * @phpstan-impure */ public function shift(); /** * @return Sequence */ public function slice(int $index, ?int $length = null); /** * @param (callable(TValue, TValue): int)|null $comparator * @return void */ public function sort(?callable $comparator = null); /** * @param (callable(TValue, TValue): int)|null $comparator * @return Sequence */ public function sorted(?callable $comparator = null); /** * @param TValue ...$values * @return void */ public function unshift(...$values); } /** * @template TValue * @implements Sequence */ final class Vector implements Sequence { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Vector */ public function copy() { } /** * @return Vector */ public function reversed(): Vector { } /** * @return Vector */ public function slice(int $offset, ?int $length = null): Vector { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Vector */ public function sorted(?callable $comparator = null): Vector { } /** * @param (callable(TValue): bool)|null $callback * @return Vector */ public function filter(?callable $callback = null): Vector { } /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Vector */ public function map(callable $callback): Vector { } /** * @template TValue2 * @param iterable $values * @return Vector */ public function merge(iterable $values): Vector { } } /** * @template TValue * @implements Collection * @implements ArrayAccess */ final class Set implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @param TValue ...$values */ public function add(...$values): void { } /** * @param TValue ...$values */ public function contains(...$values): bool { } /** * @return Set */ public function copy(): Set { } /** * @template TValue2 * @param Set $set * @return Set */ public function diff(Set $set): Set { } /** * @param (callable(TValue): bool)|null $callback * @return Set */ public function filter(?callable $callback = null): Set { } /** * @return TValue * @throws \UnderflowException */ public function first() { } /** * @return TValue * @throws \OutOfRangeException */ public function get(int $index) { } /** * @template TValue2 * @param Set $set * @return Set */ public function intersect(Set $set): Set { } /** * @return TValue * @throws \UnderflowException */ public function last() { } /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Set */ public function map(callable $callback): Set { } /** * @template TValue2 * @param iterable $values * @return Set */ public function merge(iterable $values): Set { } /** * @template TCarry * @param callable(TCarry, TValue): TCarry $callback * @param TCarry $initial * @return TCarry */ public function reduce(callable $callback, $initial = null) { } /** * @param TValue ...$values */ public function remove(...$values): void { } /** * @return Set */ public function reversed(): Set { } /** * @return Set */ public function slice(int $index, ?int $length = null): Set { } /** * @param (callable(TValue, TValue): int)|null $comparator */ public function sort(?callable $comparator = null): void { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Set */ public function sorted(?callable $comparator = null): Set { } /** * @return list */ public function toArray(): array { } /** * @template TValue2 * @param Set $set * @return Set */ public function union(Set $set): Set { } /** * @template TValue2 * @param Set $set * @return Set */ public function xor(Set $set): Set { } } /** * @template TValue * @implements Collection * @implements ArrayAccess */ final class Stack implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Stack */ public function copy(): Stack { } /** * @return TValue * @throws UnderflowException */ public function peek() { } /** * @return TValue * @throws UnderflowException * @phpstan-impure */ public function pop() { } /** * @param TValue ...$values * @return void */ public function push(...$values): void { } /** * @return list */ public function toArray(): array { } } /** * @template TValue * @implements Collection * @implements ArrayAccess */ final class Queue implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Queue */ public function copy(): Queue { } /** * @return TValue * @throws UnderflowException */ public function peek() { } /** * @return TValue * @throws UnderflowException * @phpstan-impure */ public function pop() { } /** * @param TValue ...$values */ public function push(...$values): void { } /** * @return list */ public function toArray(): array { } } /** * @template TValue * @implements Collection */ final class PriorityQueue implements Collection { /** * @return PriorityQueue */ public function copy(): PriorityQueue { } /** * @return TValue * @throws UnderflowException */ public function peek() { } /** * @return TValue * @throws UnderflowException * @phpstan-impure */ public function pop() { } /** * @param TValue $value */ public function push($value, int $priority): void { } /** * @return list */ public function toArray(): array { } } > */ public function getAttributes(?string $name = null, int $flags = 0) { } } */ public static function create(object $referent): WeakReference {} /** @return ?T */ public function get() {} } /** * @template TKey of object * @template TValue * @implements \ArrayAccess * @implements \IteratorAggregate */ final class WeakMap implements \ArrayAccess, \Countable, \IteratorAggregate { /** * @param TKey $offset * @return TValue */ public function offsetGet($offset) {} } * @implements \Traversable */ class DatePeriod implements \IteratorAggregate, \Traversable { /** * @return TEnd */ public function getEndDate() { } /** * @return TRecurrences */ public function getRecurrences() { } /** * @return TDate */ public function getStartDate(): DateTimeInterface { } } > */ public function getAttributes(?string $name = null, int $flags = 0) { } } */ public function getName() : string { } /** * @return T */ public function newInstance() : object { } } $flags * @phpstan-assert-if-true =non-empty-string $json */ function json_validate(string $json, int $depth = 512, int $flags = 0): bool { } * @implements ArrayAccess */ class ArrayObject implements IteratorAggregate, ArrayAccess { /** * @param array|object $input * @param int $flags * @param class-string $iterator_class */ public function __construct($input = null, $flags = 0, $iterator_class = "ArrayIterator") { } /** * @param TValue $value * @return void */ public function append($value) { } /** * @return array */ public function getArrayCopy() { } /** * @param callable(TValue, TValue): int $cmp_function * @return void */ public function uasort($cmp_function) { } /** * @param callable(TKey, TKey): int $cmp_function * @return void */ public function uksort($cmp_function) { } /** * @return ArrayIterator */ public function getIterator() { } /** * @param class-string $iterator_class * @return void */ public function setIteratorClass($iterator_class) { } } /** * @template TValue * @implements Iterator * @implements IteratorAggregate * @implements ArrayAccess */ class SplFixedArray implements Iterator, IteratorAggregate, ArrayAccess, Countable { /** * @template TInput * @param array $array * @return SplFixedArray */ public static function fromArray(array $array, bool $save_indexes = true): SplFixedArray { } /** * @return array */ public function toArray(): array { } } , g: int<0, 255>, b: int<0, 255>, a: int<0, 1>} : ($normalized is 1 ? array{r: float, g: float, b: float, a: float} : ($normalized is 2 ? array{r: int<0, 255>, g: int<0, 255>, b: int<0, 255>, a: int<0, 255>} : array{}))) */ public function getColor(int $normalized = 0): array; } * @template-implements SeekableIterator * @template-implements ArrayAccess */ class SplObjectStorage implements Countable, Iterator, SeekableIterator, Serializable, ArrayAccess { /** * @param \SplObjectStorage $storage */ public function addAll(SplObjectStorage $storage): void { } /** * @param TObject $object * @param TData $data */ public function attach(object $object, $data = null): void { } /** * @param TObject $object */ public function contains(object $object): bool { } /** * @param TObject $object */ public function detach(object $object): void { } /** * @param TObject $object */ public function getHash(object $object): string { } /** * @return TData */ public function getInfo() { } /** * @param \SplObjectStorage<*, *> $storage */ public function removeAll(SplObjectStorage $storage): void { } /** * @param \SplObjectStorage<*, *> $storage */ public function removeAllExcept(SplObjectStorage $storage): void { } /** * @param TData $data */ public function setInfo($data): void { } /** * @param TObject $offset * @return TData */ public function offsetGet($offset); } */ interface IteratorAggregate extends Traversable { /** * @return Traversable */ public function getIterator(); } /** * @template-covariant TKey * @template-covariant TValue * * @extends Traversable */ interface Iterator extends Traversable { /** * @return TValue */ public function current(); /** * @return TKey */ public function key(); } /** * @template-covariant TKey * @template-covariant TValue * * @extends Iterator */ interface RecursiveIterator extends Iterator { } /** * @template-covariant TKey * @template-covariant TValue * @template TSend * @template-covariant TReturn * * @implements Iterator */ class Generator implements Iterator { /** * @return TReturn */ public function getReturn() {} /** * @param TSend $value * @return TValue */ public function send($value) {} } /** * @implements Traversable * @implements ArrayAccess * @implements Iterator * @implements RecursiveIterator */ class SimpleXMLElement implements Traversable, ArrayAccess, Iterator, RecursiveIterator { /** * @return ($filename is null ? string|false : bool) */ public function asXML(?string $filename = null) { } /** * @return ($filename is null ? string|false : bool) */ public function saveXML(?string $filename = null) { } } /** * @template-covariant TKey * @template-covariant TValue * @extends Iterator */ interface SeekableIterator extends Iterator { } /** * @template TKey of array-key * @template TValue * @implements SeekableIterator * @implements ArrayAccess */ class ArrayIterator implements SeekableIterator, ArrayAccess, Countable { /** * @param array $array * @param int $flags */ public function __construct($array = array(), $flags = 0) { } /** * @param TValue $value * @return void */ public function append($value) { } /** * @return array */ public function getArrayCopy() { } /** * @param callable(TValue, TValue): int $cmp_function * @return void */ public function uasort($cmp_function) { } /** * @param callable(TKey, TKey): int $cmp_function * @return void */ public function uksort($cmp_function) { } } /** * @template T of \RecursiveIterator|\IteratorAggregate * @mixin T */ class RecursiveIteratorIterator { /** * @param T $iterator */ public function __construct( $iterator, int $mode = RecursiveIteratorIterator::LEAVES_ONLY, int $flags = 0 ) { } } /** * @template-covariant TKey * @template-covariant TValue * * @template-extends Iterator */ interface OuterIterator extends Iterator { /** * @return Iterator */ public function getInnerIterator(); } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Traversable * * @template-implements OuterIterator * * @mixin TIterator */ class IteratorIterator implements OuterIterator { /** * @param TIterator $iterator */ public function __construct(Traversable $iterator) {} } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Traversable * * @template-extends IteratorIterator */ class FilterIterator extends IteratorIterator { } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Traversable * * @extends FilterIterator */ class CallbackFilterIterator extends FilterIterator { } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Traversable * * @extends CallbackFilterIterator * @implements RecursiveIterator */ class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator { /** * @return bool */ public function hasChildren() {} /** * @return RecursiveCallbackFilterIterator */ public function getChildren() {} } /** * @template TKey of array-key * @template TValue * * @template-implements RecursiveIterator * @template-extends ArrayIterator */ class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator { /** * @return RecursiveArrayIterator */ public function getChildren() {} /** * @return bool */ public function hasChildren() {} /** * @return TValue */ public function current() {} /** * @return TKey */ public function key() {} /** * @param callable(TKey, TKey): int $cmp_function * @return void */ public function uksort($cmp_function) { } } /** * @template TKey * @template TValue * @template TIterator as Iterator * * @template-extends IteratorIterator */ class AppendIterator extends IteratorIterator { /** * @param TIterator $iterator * @return void */ public function append(Iterator $iterator) {} /** * @return ArrayIterator */ public function getArrayIterator() {} } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Iterator * * @template-extends IteratorIterator */ class NoRewindIterator extends IteratorIterator { /** * @param TIterator $iterator */ public function __construct(Iterator $iterator) {} /** * @return TValue */ public function current() {} /** * @return TKey */ public function key() {} } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Iterator * * @template-implements OuterIterator * @template-extends IteratorIterator */ class LimitIterator extends IteratorIterator implements OuterIterator { /** * @param TIterator $iterator */ public function __construct(Iterator $iterator, int $offset = 0, int $count = -1) {} /** * @return TValue */ public function current() {} /** * @return TKey */ public function key() {} } /** * @template-covariant TKey * @template-covariant TValue * @template TIterator as Iterator * * @template-extends IteratorIterator */ class InfiniteIterator extends IteratorIterator { /** * @param TIterator $iterator */ public function __construct(Iterator $iterator) {} /** * @return TValue */ public function current() {} /** * @return TKey */ public function key() {} } /** * @template TKey * @template TValue * @template TIterator as Iterator * * @template-implements OuterIterator * @template-implements ArrayAccess * * @template-extends IteratorIterator */ class CachingIterator extends IteratorIterator implements OuterIterator, ArrayAccess, Countable { const CALL_TOSTRING = 1 ; const CATCH_GET_CHILD = 16 ; const TOSTRING_USE_KEY = 2 ; const TOSTRING_USE_CURRENT = 4 ; const TOSTRING_USE_INNER = 8 ; const FULL_CACHE = 256 ; /** * @param TIterator $iterator * @param int-mask-of $flags */ public function __construct(Iterator $iterator, int $flags = self::CALL_TOSTRING) {} /** * @return TValue */ public function current() {} /** * @return TKey */ public function key() {} /** * @return array */ public function getCache() {} } /** * @template TKey * @template TValue * @template TIterator of Traversable * * @template-extends FilterIterator */ class RegexIterator extends FilterIterator { const MATCH = 0 ; const GET_MATCH = 1 ; const ALL_MATCHES = 2 ; const SPLIT = 3 ; const REPLACE = 4 ; const USE_KEY = 1 ; /** * @param Iterator $iterator * @param self::MATCH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode */ public function __construct(Iterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} /** * @return TValue */ public function current() {} /** * @return TKey */ public function key() {} } /** * @template-implements Iterator */ class EmptyIterator implements Iterator { /** * @return never */ public function current() {} /** * @return never */ public function key() {} /** * @return false */ public function valid() {} } |numeric-string */ public $affected_rows; } class mysqli_result { /** * @var int<0,max>|numeric-string */ public $num_rows; /** * @template T of object * @param class-string $class * @param array $constructor_args * @return T|null|false */ function fetch_object(string $class = 'stdClass', array $constructor_args = []) {} } /** * @template T of object * * @param class-string $class * @param array $constructor_args * @return T|null|false */ function mysqli_fetch_object(mysqli_result $result, string $class = 'stdClass', array $constructor_args = []) {} class mysqli_stmt { /** * @var int<-1,max>|numeric-string */ public $affected_rows; /** * @var int */ public $errno; /** * @var list */ public $error_list; /** * @var string */ public $error; /** * @var 0|positive-int */ public $field_count; /** * @var int|string */ public $insert_id; /** * @var int<0,max>|numeric-string */ public $num_rows; /** * @var 0|positive-int */ public $param_count; /** * @var non-empty-string */ public $sqlstate; } |null &$read * @param array|null &$write * @param array|null &$except * @param-out ($read is not null ? array : null) $read * @param-out ($write is not null ? array : null) $write * @param-out ($except is not null ? array : null) $except */ function socket_select(?array &$read, ?array &$write, ?array &$except, ?int $seconds, int $microseconds = 0): int|false {} */ public $name; /** * @param T|class-string $argument * @throws ReflectionException */ public function __construct($argument) {} /** * @return class-string */ public function getName() : string; /** * @param mixed ...$args * * @return T */ public function newInstance(...$args) {} /** * @param array $args * * @return T */ public function newInstanceArgs(array $args) {} /** * @return T */ public function newInstanceWithoutConstructor(); /** * @return list> */ public function getAttributes(?string $name = null, int $flags = 0) { } } > * @implements IteratorAggregate> * @link https://php.net/manual/en/class.pdostatement.php */ class PDOStatement implements Traversable, IteratorAggregate { /** * @template T of object * @param class-string $class * @param array $ctorArgs * @return false|T */ public function fetchObject($class = \stdClass::class, array $ctorArgs = array()) {} /** * @return array{name: string, table?: string, native_type?: string, len: int, flags: array, precision: int<0, max>, pdo_type: PDO::PARAM_* }|false */ public function getColumnMeta(int $column) {} } $one * @param callable(TReturn, TIn): TReturn $two * @param TReturn $three * * @return TReturn */ function array_reduce( array $one, callable $two, $three = null ) {} /** * @template T of mixed * * @param array $array * @return ($array is non-empty-array ? non-empty-list : list) */ function array_values(array $array): array {} /** * @template TKey as (int|string) * @template T * @template TArray as array * * @param TArray $array * @param callable(T,T):int $callback */ function uasort(array &$array, callable $callback): bool {} /** * @template T * @template TArray as array * * @param TArray $array * @param callable(T,T):int $callback */ function usort(array &$array, callable $callback): bool {} /** * @template TKey as (int|string) * @template T * @template TArray as array * * @param TArray $array * @param callable(TKey,TKey):int $callback */ function uksort(array &$array, callable $callback): bool { } /** * @template TV of mixed * @template TK of mixed * * @param array $one * @param array $two * @param callable(TV, TV): int $three * @return array */ function array_udiff( array $one, array $two, callable $three ): array {} /** * @param array $value * @return ($value is __always-list ? true : false) */ function array_is_list(array $value): bool {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TK, TK): int $three * @return array */ function array_diff_uassoc( array $one, array $two, callable $three ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TK, TK): int $three * @return array */ function array_diff_ukey( array $one, array $two, callable $three ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TK, TK): int $three * @return array */ function array_intersect_uassoc( array $one, array $two, callable $three ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TK, TK): int $three * * @return array */ function array_intersect_ukey( array $one, array $two, callable $three ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TV, TV): int $three * * @return array */ function array_udiff_assoc( array $one, array $two, callable $three ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TV, TV): int $three * @param callable(TK, TK): int $four * @return array */ function array_udiff_uassoc( array $one, array $two, callable $three, callable $four ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TV, TV): int $three * @return array */ function array_uintersect_assoc( array $one, array $two, callable $three, ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TV, TV): int $three * @param callable(TK, TK): int $four * @return array */ function array_uintersect_uassoc( array $one, array $two, callable $three, callable $four ): array {} /** * @template TK of array-key * @template TV of mixed * * @param array $one * @param array $two * @param callable(TV, TV): int $three * @return array */ function array_uintersect( array $one, array $two, callable $three, ): array {} > */ public function getAttributes(?string $name = null, int $flags = 0) { } } $result * @param-out array|string> $result */ function parse_str(string $string, array &$result): void {} /** * @param array $result * @param-out array|string> $result */ function mb_parse_str(string $string, array &$result): bool {} /** @param-out float $percent */ function similar_text(string $string1, string $string2, ?float &$percent = null) : int {} /** * @param mixed $output * @param mixed $result_code * * @param-out list $output * @param-out int $result_code * * @return string|false */ function exec(string $command, &$output, &$result_code) {} /** * @param mixed $result_code * @param-out int $result_code * * @return string|false */ function system(string $command, &$result_code) {} /** * @param mixed $result_code * @param-out int $result_code */ function passthru(string $command, &$result_code): ?bool {} /** * @template T * @template TArray as array * * @param TArray $array */ function shuffle(array &$array): bool { } /** * @template T * @template TArray as array * * @param TArray $array */ function sort(array &$array, int $flags = SORT_REGULAR): bool { } /** * @template T * @template TArray as array * * @param TArray $array */ function rsort(array &$array, int $flags = SORT_REGULAR): bool { } /** * @param string $string * @param-out null $string */ function sodium_memzero(string &$string): void { } /** * @param resource $stream * @param mixed $vars * @param-out string|int|float|null $vars * * @return list|int|false */ function fscanf($stream, string $format, &...$vars) {} /** * @param mixed $war * @param mixed $vars * @param-out string|int|float|null $war * @param-out string|int|float|null $vars * * @return int|array|null */ function sscanf(string $string, string $format, &$war, &...$vars) {} /** * @template TFlags as int * * @param string $pattern * @param string $subject * @param mixed $matches * @param TFlags $flags * @param-out ( * TFlags is 1 * ? array> * : (TFlags is 2 * ? list> * : (TFlags is 256|257 * ? array> * : (TFlags is 258 * ? list> * : (TFlags is 512|513 * ? array> * : (TFlags is 514 * ? list> * : (TFlags is 770 * ? list> * : (TFlags is 0 ? array> : array) * ) * ) * ) * ) * ) * ) * ) $matches * @return int|false */ function preg_match_all($pattern, $subject, &$matches = [], int $flags = 1, int $offset = 0) {} /** * @template TFlags as int-mask<0, 256, 512> * * @param string $pattern * @param string $subject * @param mixed $matches * @param TFlags $flags * @param-out ( * TFlags is 256 * ? array * : (TFlags is 512 * ? array * : (TFlags is 768 * ? array * : array * ) * ) * ) $matches * @return 1|0|false */ function preg_match($pattern, $subject, &$matches = [], int $flags = 0, int $offset = 0) {} /** * @param string|array $pattern * @param callable(array):string $callback * @param string|array $subject * @param int $count * @param-out 0|positive-int $count * @return ($subject is array ? list|null : string|null) */ function preg_replace_callback($pattern, $callback, $subject, int $limit = -1, &$count = null, int $flags = 0) {} /** * @param string|array $pattern * @param string|array $replacement * @param string|array $subject * @param int $count * @param-out 0|positive-int $count * @return ($subject is array ? list|null : string|null) */ function preg_replace($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} /** * @param string|array $pattern * @param string|array $replacement * @param string|array $subject * @param int $count * @param-out 0|positive-int $count * @return ($subject is array ? list : string|null) */ function preg_filter($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} /** * @param array|string $search * @param array|string $replace * @param array|string $subject * @param-out int $count * @return list|string */ function str_replace($search, $replace, $subject, ?int &$count = null) {} /** * @param array|string $search * @param array|string $replace * @param array|string $subject * @param-out int $count * @return list|string */ function str_ireplace($search, $replace, $subject, ?int &$count = null) {} /** * @template TRead of null|array * @template TWrite of null|array * @template TExcept of null|array * @param TRead $read * @param TWrite $write * @param TExcept $except * @return false|0|positive-int * @param-out (TRead is null ? null : array) $read * @param-out (TWrite is null ? null : array) $write * @param-out (TExcept is null ? null : array) $except */ function stream_select(?array &$read, ?array &$write, ?array &$except, ?int $seconds, ?int $microseconds = null) {} /** * @param resource $stream * @param-out 0|1 $would_block */ function flock($stream, int $operation, mixed &$would_block = null): bool {} /** * @param-out int $error_code * @param-out string $error_message * @return resource|false */ function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null) {} /** * @param-out string $filename * @param-out int $line */ function headers_sent(?string &$filename = null, ?int &$line = null): bool {} /** * @param-out callable-string $callable_name * @return ($value is callable ? true : false) */ function is_callable(mixed $value, bool $syntax_only = false, ?string &$callable_name = null): bool {} /** * @param float|int $num * @return ($num is float ? float : $num is int ? non-negative-int : float|non-negative-int) */ function abs($num) {} /** * @return ($categorize is true ? array> : array) */ function get_defined_constants(bool $categorize = false): array {} */ public function getNodeType(): string; /** * @param TNodeType $node * @return list */ public function processNode(Node $node, Scope $scope): array; } */ class ReflectionEnum extends ReflectionClass { /** * @return (T is BackedEnum ? ReflectionEnumBackedCase[] : ReflectionEnumUnitCase[]) */ public function getCases(): array {} /** * @return (T is BackedEnum ? ReflectionEnumBackedCase : ReflectionEnumUnitCase) * @throws ReflectionException */ public function getCase(string $name): ReflectionEnumUnitCase {} /** * @phpstan-assert-if-true self $this * @phpstan-assert-if-true !null $this->getBackingType() */ public function isBacked(): bool {} } ',args?:mixed[],object?:object}> * @throws void */ public function getTrace(); /** * @return string * @throws void */ public function getTraceAsString(); /** * @return null|Throwable * @throws void */ public function getPrevious(); /** * @return string */ public function __toString(); } class Exception implements Throwable { /** * @return string * @throws void */ final public function getMessage(): string {} /** * @return mixed * @throws void */ final public function getCode() {} /** * @return string * @throws void */ final public function getFile(): string {} /** * @return int * @throws void */ final public function getLine(): int {} /** * @return list',args?:mixed[],object?:object}> * @throws void */ final public function getTrace(): array {} /** * @return null|Throwable * @throws void */ final public function getPrevious(): ?Throwable {} /** * @return string * @throws void */ final public function getTraceAsString(): string {} } class Error implements Throwable { /** * @return string * @throws void */ final public function getMessage(): string {} /** * @return mixed * @throws void */ final public function getCode() {} /** * @return string * @throws void */ final public function getFile(): string {} /** * @return int * @throws void */ final public function getLine(): int {} /** * @return list',args?:mixed[],object?:object}> * @throws void */ final public function getTrace(): array {} /** * @return null|Throwable * @throws void */ final public function getPrevious(): ?Throwable {} /** * @return string * @throws void */ final public function getTraceAsString(): string {} } flags = $flags; } } } if (\PHP_VERSION_ID < 80100 && !class_exists('ReturnTypeWillChange', false)) { #[Attribute(Attribute::TARGET_METHOD)] final class ReturnTypeWillChange { } } if (\PHP_VERSION_ID < 80200 && !class_exists('AllowDynamicProperties', false)) { #[Attribute(Attribute::TARGET_CLASS)] final class AllowDynamicProperties { } } if (\PHP_VERSION_ID < 80200 && !class_exists('SensitiveParameter', false)) { #[Attribute(Attribute::TARGET_PARAMETER)] final class SensitiveParameter { } } */ public static function cases(): array; } } |\Countable ? true : false) */ function is_countable(mixed $value): bool { } /** * @return ($value is object ? true : false) */ function is_object(mixed $value): bool { } /** * @return ($value is scalar ? true : false) */ function is_scalar(mixed $value): bool { } /** * @return ($value is int ? true : false) */ function is_int(mixed $value): bool { } /** * @return ($value is int ? true : false) */ function is_integer(mixed $value): bool { } /** * @return ($value is int ? true : false) */ function is_long(mixed $value): bool { } /** * @phpstan-assert-if-true =resource $value * @return bool */ function is_resource(mixed $value): bool { } /** * @return ($value is array ? true : false) */ function is_array(mixed $value): bool { } /** * @return ($value is iterable ? true : false) */ function is_iterable(mixed $value): bool { } * @implements \ArrayAccess */ class SplDoublyLinkedList implements \Iterator, \ArrayAccess { /** * @param int $index * @param TValue $newval * @return void */ public function add($index, $newval) {} /** * @return TValue */ public function pop () {} /** * @return TValue */ public function shift () {} /** * @param TValue $value * @return void */ public function push ($value) {} /** * @param TValue $value * @return void */ public function unshift ($value) {} /** * @return TValue */ public function top () {} /** * @return TValue */ public function bottom () {} /** * @param int $offset * @return TValue */ public function offsetGet ($offset) {} } /** * @template TValue * @extends \SplDoublyLinkedList */ class SplQueue extends \SplDoublyLinkedList { /** * @param TValue $value * @return void */ public function enqueue ($value) {} /** * @return TValue */ public function dequeue () {} } /** * @template TPriority * @template TValue * * @implements \Iterator */ class SplPriorityQueue implements \Iterator { /** * @param TPriority $priority1 * @param TPriority $priority2 * @return int */ public function compare ($priority1, $priority2) {} /** * @param TValue $value * @param TPriority $priority * @return true */ public function insert ($value, $priority) {} /** * @return TPriority|TValue|array{priority: TPriority, data: TValue} */ public function top () {} /** * @return TPriority|TValue|array{priority: TPriority, data: TValue} */ public function extract () {} /** * @return TPriority|TValue|array{priority: TPriority, data: TValue} */ public function current () {} } > */ public function getAttributes(?string $name = null, int $flags = 0) { } } Copyright (c) 2011 Igor Wiedler 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Evenement; use InvalidArgumentException; use function count; use function array_keys; use function array_merge; use function array_search; use function array_unique; use function array_values; trait EventEmitterTrait { protected $listeners = []; protected $onceListeners = []; public function on($event, callable $listener) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (!isset($this->listeners[$event])) { $this->listeners[$event] = []; } $this->listeners[$event][] = $listener; return $this; } public function once($event, callable $listener) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (!isset($this->onceListeners[$event])) { $this->onceListeners[$event] = []; } $this->onceListeners[$event][] = $listener; return $this; } public function removeListener($event, callable $listener) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (isset($this->listeners[$event])) { $index = array_search($listener, $this->listeners[$event], \true); if (\false !== $index) { unset($this->listeners[$event][$index]); if (count($this->listeners[$event]) === 0) { unset($this->listeners[$event]); } } } if (isset($this->onceListeners[$event])) { $index = array_search($listener, $this->onceListeners[$event], \true); if (\false !== $index) { unset($this->onceListeners[$event][$index]); if (count($this->onceListeners[$event]) === 0) { unset($this->onceListeners[$event]); } } } } public function removeAllListeners($event = null) { if ($event !== null) { unset($this->listeners[$event]); } else { $this->listeners = []; } if ($event !== null) { unset($this->onceListeners[$event]); } else { $this->onceListeners = []; } } public function listeners($event = null) : array { if ($event === null) { $events = []; $eventNames = array_unique(array_merge(array_keys($this->listeners), array_keys($this->onceListeners))); foreach ($eventNames as $eventName) { $events[$eventName] = array_merge(isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [], isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : []); } return $events; } return array_merge(isset($this->listeners[$event]) ? $this->listeners[$event] : [], isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : []); } public function emit($event, array $arguments = []) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } $listeners = []; if (isset($this->listeners[$event])) { $listeners = array_values($this->listeners[$event]); } $onceListeners = []; if (isset($this->onceListeners[$event])) { $onceListeners = array_values($this->onceListeners[$event]); } if (empty($listeners) === \false) { foreach ($listeners as $listener) { $listener(...$arguments); } } if (empty($onceListeners) === \false) { unset($this->onceListeners[$event]); foreach ($onceListeners as $listener) { $listener(...$arguments); } } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Evenement; class EventEmitter implements EventEmitterInterface { use EventEmitterTrait; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Evenement; interface EventEmitterInterface { public function on($event, callable $listener); public function once($event, callable $listener); public function removeListener($event, callable $listener); public function removeAllListeners($event = null); public function listeners($event = null); public function emit($event, array $arguments = []); } __DIR__ . '/..' . '/hoa/consistency/Prelude.php', '3e76f7f02b41af8cea96018933f6b7e3' => __DIR__ . '/..' . '/hoa/protocol/Wrapper.php', 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'fe1d4898277c26748a003292f432cd3b' => __DIR__ . '/..' . '/jetbrains/phpstorm-stubs/PhpStormStubsMap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', 'c4e03ecd470d2a87804979c0a8152284' => __DIR__ . '/..' . '/react/async/src/functions_include.php', 'b686b8e46447868025a15ce5d0cb2634' => __DIR__ . '/..' . '/symfony/polyfill-php74/bootstrap.php', '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', '23e1affdf407e3538a1f32c140fb0401' => __DIR__ . '/../..' . '/src/debugScope.php', '8b3b25e11e82753923d43e298a70dcd0' => __DIR__ . '/../..' . '/src/dumpType.php', '9662279e3e75f737d93030252673bf2d' => __DIR__ . '/../..' . '/src/autoloadFunctions.php', '1a2eab53065eff9692bac238d15cc8cb' => __DIR__ . '/../..' . '/src/Testing/functions.php', ); public static $prefixLengthsPsr4 = array ( '_' => array ( '_PHPStan_8c66d8255\\Symfony\\Polyfill\\Ctype\\' => 42, '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\' => 45, '_PHPStan_8c66d8255\\Symfony\\Component\\String\\' => 44, '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\' => 45, '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\' => 44, '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\' => 45, '_PHPStan_8c66d8255\\React\\Stream\\' => 32, '_PHPStan_8c66d8255\\React\\Socket\\' => 32, '_PHPStan_8c66d8255\\React\\Promise\\' => 33, '_PHPStan_8c66d8255\\React\\Http\\' => 30, '_PHPStan_8c66d8255\\React\\EventLoop\\' => 35, '_PHPStan_8c66d8255\\React\\Dns\\' => 29, '_PHPStan_8c66d8255\\React\\ChildProcess\\' => 38, '_PHPStan_8c66d8255\\React\\Cache\\' => 31, '_PHPStan_8c66d8255\\Psr\\Log\\' => 27, '_PHPStan_8c66d8255\\Psr\\Http\\Message\\' => 36, '_PHPStan_8c66d8255\\Psr\\Container\\' => 33, '_PHPStan_8c66d8255\\OndraM\\CiDetector\\' => 37, '_PHPStan_8c66d8255\\Fig\\Http\\Message\\' => 36, '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\' => 40, '_PHPStan_8c66d8255\\Evenement\\' => 29, '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\' => 42, '_PHPStan_8c66d8255\\Composer\\Semver\\' => 35, '_PHPStan_8c66d8255\\Composer\\Pcre\\' => 33, '_PHPStan_8c66d8255\\Composer\\CaBundle\\' => 37, '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\' => 37, ), 'S' => array ( 'Symfony\\Polyfill\\Php81\\' => 23, 'Symfony\\Polyfill\\Php80\\' => 23, 'Symfony\\Polyfill\\Php74\\' => 23, 'Symfony\\Polyfill\\Php73\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, ), 'P' => array ( 'PhpParser\\' => 10, 'PHPStan\\PhpDocParser\\' => 21, 'PHPStan\\BetterReflection\\' => 25, 'PHPStan\\' => 8, ), 'H' => array ( 'Hoa\\Zformat\\' => 12, 'Hoa\\Visitor\\' => 12, 'Hoa\\Ustring\\' => 12, 'Hoa\\Stream\\' => 11, 'Hoa\\Regex\\' => 10, 'Hoa\\Protocol\\' => 13, 'Hoa\\Math\\' => 9, 'Hoa\\Iterator\\' => 13, 'Hoa\\File\\' => 9, 'Hoa\\Exception\\' => 14, 'Hoa\\Event\\' => 10, 'Hoa\\Consistency\\' => 16, 'Hoa\\Compiler\\' => 13, ), ); public static $prefixDirsPsr4 = array ( '_PHPStan_8c66d8255\\Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), '_PHPStan_8c66d8255\\Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), '_PHPStan_8c66d8255\\React\\Stream\\' => array ( 0 => __DIR__ . '/..' . '/react/stream/src', ), '_PHPStan_8c66d8255\\React\\Socket\\' => array ( 0 => __DIR__ . '/..' . '/react/socket/src', ), '_PHPStan_8c66d8255\\React\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/react/promise/src', ), '_PHPStan_8c66d8255\\React\\Http\\' => array ( 0 => __DIR__ . '/..' . '/react/http/src', ), '_PHPStan_8c66d8255\\React\\EventLoop\\' => array ( 0 => __DIR__ . '/..' . '/react/event-loop/src', ), '_PHPStan_8c66d8255\\React\\Dns\\' => array ( 0 => __DIR__ . '/..' . '/react/dns/src', ), '_PHPStan_8c66d8255\\React\\ChildProcess\\' => array ( 0 => __DIR__ . '/..' . '/react/child-process/src', ), '_PHPStan_8c66d8255\\React\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/react/cache/src', ), '_PHPStan_8c66d8255\\Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), '_PHPStan_8c66d8255\\Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', ), '_PHPStan_8c66d8255\\Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), '_PHPStan_8c66d8255\\OndraM\\CiDetector\\' => array ( 0 => __DIR__ . '/..' . '/ondram/ci-detector/src', ), '_PHPStan_8c66d8255\\Fig\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/fig/http-message-util/src', ), '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\' => array ( 0 => __DIR__ . '/..' . '/fidry/cpu-core-counter/src', ), '_PHPStan_8c66d8255\\Evenement\\' => array ( 0 => __DIR__ . '/..' . '/evenement/evenement/src', ), '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', ), '_PHPStan_8c66d8255\\Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), '_PHPStan_8c66d8255\\Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), '_PHPStan_8c66d8255\\Composer\\CaBundle\\' => array ( 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', ), '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\' => array ( 0 => __DIR__ . '/..' . '/clue/ndjson-react/src', ), 'Symfony\\Polyfill\\Php81\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php81', ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), 'Symfony\\Polyfill\\Php74\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php74', ), 'Symfony\\Polyfill\\Php73\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), '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', ), 'PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), 'PHPStan\\PhpDocParser\\' => array ( 0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src', ), 'PHPStan\\BetterReflection\\' => array ( 0 => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src', ), 'PHPStan\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), 'Hoa\\Zformat\\' => array ( 0 => __DIR__ . '/..' . '/hoa/zformat', ), 'Hoa\\Visitor\\' => array ( 0 => __DIR__ . '/..' . '/hoa/visitor', ), 'Hoa\\Ustring\\' => array ( 0 => __DIR__ . '/..' . '/hoa/ustring', ), 'Hoa\\Stream\\' => array ( 0 => __DIR__ . '/..' . '/hoa/stream', ), 'Hoa\\Regex\\' => array ( 0 => __DIR__ . '/..' . '/hoa/regex', ), 'Hoa\\Protocol\\' => array ( 0 => __DIR__ . '/..' . '/hoa/protocol', ), 'Hoa\\Math\\' => array ( 0 => __DIR__ . '/..' . '/hoa/math', ), 'Hoa\\Iterator\\' => array ( 0 => __DIR__ . '/..' . '/hoa/iterator', ), 'Hoa\\File\\' => array ( 0 => __DIR__ . '/..' . '/hoa/file', ), 'Hoa\\Exception\\' => array ( 0 => __DIR__ . '/..' . '/hoa/exception', ), 'Hoa\\Event\\' => array ( 0 => __DIR__ . '/..' . '/hoa/event', ), 'Hoa\\Consistency\\' => array ( 0 => __DIR__ . '/..' . '/hoa/consistency', ), 'Hoa\\Compiler\\' => array ( 0 => __DIR__ . '/..' . '/hoa/compiler', ), ); public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'CURLStringFile' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Hoa\\Compiler\\Bin\\Pp' => __DIR__ . '/..' . '/hoa/compiler/Bin/Pp.php', 'Hoa\\Compiler\\Exception\\Exception' => __DIR__ . '/..' . '/hoa/compiler/Exception/Exception.php', 'Hoa\\Compiler\\Exception\\FinalStateHasNotBeenReached' => __DIR__ . '/..' . '/hoa/compiler/Exception/FinalStateHasNotBeenReached.php', 'Hoa\\Compiler\\Exception\\IllegalToken' => __DIR__ . '/..' . '/hoa/compiler/Exception/IllegalToken.php', 'Hoa\\Compiler\\Exception\\Lexer' => __DIR__ . '/..' . '/hoa/compiler/Exception/Lexer.php', 'Hoa\\Compiler\\Exception\\Rule' => __DIR__ . '/..' . '/hoa/compiler/Exception/Rule.php', 'Hoa\\Compiler\\Exception\\UnexpectedToken' => __DIR__ . '/..' . '/hoa/compiler/Exception/UnexpectedToken.php', 'Hoa\\Compiler\\Exception\\UnrecognizedToken' => __DIR__ . '/..' . '/hoa/compiler/Exception/UnrecognizedToken.php', 'Hoa\\Compiler\\Ll1' => __DIR__ . '/..' . '/hoa/compiler/Ll1.php', 'Hoa\\Compiler\\Llk\\Lexer' => __DIR__ . '/..' . '/hoa/compiler/Llk/Lexer.php', 'Hoa\\Compiler\\Llk\\Llk' => __DIR__ . '/..' . '/hoa/compiler/Llk/Llk.php', 'Hoa\\Compiler\\Llk\\Parser' => __DIR__ . '/..' . '/hoa/compiler/Llk/Parser.php', 'Hoa\\Compiler\\Llk\\Rule\\Analyzer' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Analyzer.php', 'Hoa\\Compiler\\Llk\\Rule\\Choice' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Choice.php', 'Hoa\\Compiler\\Llk\\Rule\\Concatenation' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Concatenation.php', 'Hoa\\Compiler\\Llk\\Rule\\Ekzit' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Ekzit.php', 'Hoa\\Compiler\\Llk\\Rule\\Entry' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Entry.php', 'Hoa\\Compiler\\Llk\\Rule\\Invocation' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Invocation.php', 'Hoa\\Compiler\\Llk\\Rule\\Repetition' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Repetition.php', 'Hoa\\Compiler\\Llk\\Rule\\Rule' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Rule.php', 'Hoa\\Compiler\\Llk\\Rule\\Token' => __DIR__ . '/..' . '/hoa/compiler/Llk/Rule/Token.php', 'Hoa\\Compiler\\Llk\\Sampler\\BoundedExhaustive' => __DIR__ . '/..' . '/hoa/compiler/Llk/Sampler/BoundedExhaustive.php', 'Hoa\\Compiler\\Llk\\Sampler\\Coverage' => __DIR__ . '/..' . '/hoa/compiler/Llk/Sampler/Coverage.php', 'Hoa\\Compiler\\Llk\\Sampler\\Exception' => __DIR__ . '/..' . '/hoa/compiler/Llk/Sampler/Exception.php', 'Hoa\\Compiler\\Llk\\Sampler\\Sampler' => __DIR__ . '/..' . '/hoa/compiler/Llk/Sampler/Sampler.php', 'Hoa\\Compiler\\Llk\\Sampler\\Uniform' => __DIR__ . '/..' . '/hoa/compiler/Llk/Sampler/Uniform.php', 'Hoa\\Compiler\\Llk\\TreeNode' => __DIR__ . '/..' . '/hoa/compiler/Llk/TreeNode.php', 'Hoa\\Compiler\\Visitor\\Dump' => __DIR__ . '/..' . '/hoa/compiler/Visitor/Dump.php', 'Hoa\\Consistency\\Autoloader' => __DIR__ . '/..' . '/hoa/consistency/Autoloader.php', 'Hoa\\Consistency\\Consistency' => __DIR__ . '/..' . '/hoa/consistency/Consistency.php', 'Hoa\\Consistency\\Exception' => __DIR__ . '/..' . '/hoa/consistency/Exception.php', 'Hoa\\Consistency\\Xcallable' => __DIR__ . '/..' . '/hoa/consistency/Xcallable.php', 'Hoa\\Event\\Bucket' => __DIR__ . '/..' . '/hoa/event/Bucket.php', 'Hoa\\Event\\Event' => __DIR__ . '/..' . '/hoa/event/Event.php', 'Hoa\\Event\\Exception' => __DIR__ . '/..' . '/hoa/event/Exception.php', 'Hoa\\Event\\Listenable' => __DIR__ . '/..' . '/hoa/event/Listenable.php', 'Hoa\\Event\\Listener' => __DIR__ . '/..' . '/hoa/event/Listener.php', 'Hoa\\Event\\Listens' => __DIR__ . '/..' . '/hoa/event/Listens.php', 'Hoa\\Event\\Source' => __DIR__ . '/..' . '/hoa/event/Source.php', 'Hoa\\Exception\\Error' => __DIR__ . '/..' . '/hoa/exception/Error.php', 'Hoa\\Exception\\Exception' => __DIR__ . '/..' . '/hoa/exception/Exception.php', 'Hoa\\Exception\\Group' => __DIR__ . '/..' . '/hoa/exception/Group.php', 'Hoa\\Exception\\Idle' => __DIR__ . '/..' . '/hoa/exception/Idle.php', 'Hoa\\File\\Directory' => __DIR__ . '/..' . '/hoa/file/Directory.php', 'Hoa\\File\\Exception\\Exception' => __DIR__ . '/..' . '/hoa/file/Exception/Exception.php', 'Hoa\\File\\Exception\\FileDoesNotExist' => __DIR__ . '/..' . '/hoa/file/Exception/FileDoesNotExist.php', 'Hoa\\File\\File' => __DIR__ . '/..' . '/hoa/file/File.php', 'Hoa\\File\\Finder' => __DIR__ . '/..' . '/hoa/file/Finder.php', 'Hoa\\File\\Generic' => __DIR__ . '/..' . '/hoa/file/Generic.php', 'Hoa\\File\\Link\\Link' => __DIR__ . '/..' . '/hoa/file/Link/Link.php', 'Hoa\\File\\Link\\Read' => __DIR__ . '/..' . '/hoa/file/Link/Read.php', 'Hoa\\File\\Link\\ReadWrite' => __DIR__ . '/..' . '/hoa/file/Link/ReadWrite.php', 'Hoa\\File\\Link\\Write' => __DIR__ . '/..' . '/hoa/file/Link/Write.php', 'Hoa\\File\\Read' => __DIR__ . '/..' . '/hoa/file/Read.php', 'Hoa\\File\\ReadWrite' => __DIR__ . '/..' . '/hoa/file/ReadWrite.php', 'Hoa\\File\\SplFileInfo' => __DIR__ . '/..' . '/hoa/file/SplFileInfo.php', 'Hoa\\File\\Temporary\\Read' => __DIR__ . '/..' . '/hoa/file/Temporary/Read.php', 'Hoa\\File\\Temporary\\ReadWrite' => __DIR__ . '/..' . '/hoa/file/Temporary/ReadWrite.php', 'Hoa\\File\\Temporary\\Temporary' => __DIR__ . '/..' . '/hoa/file/Temporary/Temporary.php', 'Hoa\\File\\Temporary\\Write' => __DIR__ . '/..' . '/hoa/file/Temporary/Write.php', 'Hoa\\File\\Watcher' => __DIR__ . '/..' . '/hoa/file/Watcher.php', 'Hoa\\File\\Write' => __DIR__ . '/..' . '/hoa/file/Write.php', 'Hoa\\Iterator\\Aggregate' => __DIR__ . '/..' . '/hoa/iterator/Aggregate.php', 'Hoa\\Iterator\\Append' => __DIR__ . '/..' . '/hoa/iterator/Append.php', 'Hoa\\Iterator\\Buffer' => __DIR__ . '/..' . '/hoa/iterator/Buffer.php', 'Hoa\\Iterator\\CallbackFilter' => __DIR__ . '/..' . '/hoa/iterator/CallbackFilter.php', 'Hoa\\Iterator\\CallbackGenerator' => __DIR__ . '/..' . '/hoa/iterator/CallbackGenerator.php', 'Hoa\\Iterator\\Counter' => __DIR__ . '/..' . '/hoa/iterator/Counter.php', 'Hoa\\Iterator\\Demultiplexer' => __DIR__ . '/..' . '/hoa/iterator/Demultiplexer.php', 'Hoa\\Iterator\\Directory' => __DIR__ . '/..' . '/hoa/iterator/Directory.php', 'Hoa\\Iterator\\Exception' => __DIR__ . '/..' . '/hoa/iterator/Exception.php', 'Hoa\\Iterator\\FileSystem' => __DIR__ . '/..' . '/hoa/iterator/FileSystem.php', 'Hoa\\Iterator\\Filter' => __DIR__ . '/..' . '/hoa/iterator/Filter.php', 'Hoa\\Iterator\\Glob' => __DIR__ . '/..' . '/hoa/iterator/Glob.php', 'Hoa\\Iterator\\Infinite' => __DIR__ . '/..' . '/hoa/iterator/Infinite.php', 'Hoa\\Iterator\\Iterator' => __DIR__ . '/..' . '/hoa/iterator/Iterator.php', 'Hoa\\Iterator\\IteratorIterator' => __DIR__ . '/..' . '/hoa/iterator/IteratorIterator.php', 'Hoa\\Iterator\\Limit' => __DIR__ . '/..' . '/hoa/iterator/Limit.php', 'Hoa\\Iterator\\Lookahead' => __DIR__ . '/..' . '/hoa/iterator/Lookahead.php', 'Hoa\\Iterator\\Lookbehind' => __DIR__ . '/..' . '/hoa/iterator/Lookbehind.php', 'Hoa\\Iterator\\Map' => __DIR__ . '/..' . '/hoa/iterator/Map.php', 'Hoa\\Iterator\\Mock' => __DIR__ . '/..' . '/hoa/iterator/Mock.php', 'Hoa\\Iterator\\Multiple' => __DIR__ . '/..' . '/hoa/iterator/Multiple.php', 'Hoa\\Iterator\\NoRewind' => __DIR__ . '/..' . '/hoa/iterator/NoRewind.php', 'Hoa\\Iterator\\Outer' => __DIR__ . '/..' . '/hoa/iterator/Outer.php', 'Hoa\\Iterator\\Recursive\\CallbackFilter' => __DIR__ . '/..' . '/hoa/iterator/Recursive/CallbackFilter.php', 'Hoa\\Iterator\\Recursive\\Directory' => __DIR__ . '/..' . '/hoa/iterator/Recursive/Directory.php', 'Hoa\\Iterator\\Recursive\\Filter' => __DIR__ . '/..' . '/hoa/iterator/Recursive/Filter.php', 'Hoa\\Iterator\\Recursive\\Iterator' => __DIR__ . '/..' . '/hoa/iterator/Recursive/Iterator.php', 'Hoa\\Iterator\\Recursive\\Map' => __DIR__ . '/..' . '/hoa/iterator/Recursive/Map.php', 'Hoa\\Iterator\\Recursive\\Mock' => __DIR__ . '/..' . '/hoa/iterator/Recursive/Mock.php', 'Hoa\\Iterator\\Recursive\\Recursive' => __DIR__ . '/..' . '/hoa/iterator/Recursive/Recursive.php', 'Hoa\\Iterator\\Recursive\\RegularExpression' => __DIR__ . '/..' . '/hoa/iterator/Recursive/RegularExpression.php', 'Hoa\\Iterator\\RegularExpression' => __DIR__ . '/..' . '/hoa/iterator/RegularExpression.php', 'Hoa\\Iterator\\Repeater' => __DIR__ . '/..' . '/hoa/iterator/Repeater.php', 'Hoa\\Iterator\\Seekable' => __DIR__ . '/..' . '/hoa/iterator/Seekable.php', 'Hoa\\Iterator\\SplFileInfo' => __DIR__ . '/..' . '/hoa/iterator/SplFileInfo.php', 'Hoa\\Math\\Bin\\Calc' => __DIR__ . '/..' . '/hoa/math/Bin/Calc.php', 'Hoa\\Math\\Combinatorics\\Combination\\CartesianProduct' => __DIR__ . '/..' . '/hoa/math/Combinatorics/Combination/CartesianProduct.php', 'Hoa\\Math\\Combinatorics\\Combination\\Combination' => __DIR__ . '/..' . '/hoa/math/Combinatorics/Combination/Combination.php', 'Hoa\\Math\\Combinatorics\\Combination\\Gamma' => __DIR__ . '/..' . '/hoa/math/Combinatorics/Combination/Gamma.php', 'Hoa\\Math\\Context' => __DIR__ . '/..' . '/hoa/math/Context.php', 'Hoa\\Math\\Exception\\AlreadyDefinedConstant' => __DIR__ . '/..' . '/hoa/math/Exception/AlreadyDefinedConstant.php', 'Hoa\\Math\\Exception\\Exception' => __DIR__ . '/..' . '/hoa/math/Exception/Exception.php', 'Hoa\\Math\\Exception\\UnknownConstant' => __DIR__ . '/..' . '/hoa/math/Exception/UnknownConstant.php', 'Hoa\\Math\\Exception\\UnknownFunction' => __DIR__ . '/..' . '/hoa/math/Exception/UnknownFunction.php', 'Hoa\\Math\\Exception\\UnknownVariable' => __DIR__ . '/..' . '/hoa/math/Exception/UnknownVariable.php', 'Hoa\\Math\\Sampler\\Random' => __DIR__ . '/..' . '/hoa/math/Sampler/Random.php', 'Hoa\\Math\\Sampler\\Sampler' => __DIR__ . '/..' . '/hoa/math/Sampler/Sampler.php', 'Hoa\\Math\\Util' => __DIR__ . '/..' . '/hoa/math/Util.php', 'Hoa\\Math\\Visitor\\Arithmetic' => __DIR__ . '/..' . '/hoa/math/Visitor/Arithmetic.php', 'Hoa\\Protocol\\Bin\\Resolve' => __DIR__ . '/..' . '/hoa/protocol/Bin/Resolve.php', 'Hoa\\Protocol\\Exception' => __DIR__ . '/..' . '/hoa/protocol/Exception.php', 'Hoa\\Protocol\\Node\\Library' => __DIR__ . '/..' . '/hoa/protocol/Node/Library.php', 'Hoa\\Protocol\\Node\\Node' => __DIR__ . '/..' . '/hoa/protocol/Node/Node.php', 'Hoa\\Protocol\\Protocol' => __DIR__ . '/..' . '/hoa/protocol/Protocol.php', 'Hoa\\Protocol\\Wrapper' => __DIR__ . '/..' . '/hoa/protocol/Wrapper.php', 'Hoa\\Regex\\Exception' => __DIR__ . '/..' . '/hoa/regex/Exception.php', 'Hoa\\Regex\\Visitor\\Isotropic' => __DIR__ . '/..' . '/hoa/regex/Visitor/Isotropic.php', 'Hoa\\Stream\\Bucket' => __DIR__ . '/..' . '/hoa/stream/Bucket.php', 'Hoa\\Stream\\Composite' => __DIR__ . '/..' . '/hoa/stream/Composite.php', 'Hoa\\Stream\\Context' => __DIR__ . '/..' . '/hoa/stream/Context.php', 'Hoa\\Stream\\Exception' => __DIR__ . '/..' . '/hoa/stream/Exception.php', 'Hoa\\Stream\\Filter\\Basic' => __DIR__ . '/..' . '/hoa/stream/Filter/Basic.php', 'Hoa\\Stream\\Filter\\Exception' => __DIR__ . '/..' . '/hoa/stream/Filter/Exception.php', 'Hoa\\Stream\\Filter\\Filter' => __DIR__ . '/..' . '/hoa/stream/Filter/Filter.php', 'Hoa\\Stream\\Filter\\LateComputed' => __DIR__ . '/..' . '/hoa/stream/Filter/LateComputed.php', 'Hoa\\Stream\\IStream\\Bufferable' => __DIR__ . '/..' . '/hoa/stream/IStream/Bufferable.php', 'Hoa\\Stream\\IStream\\In' => __DIR__ . '/..' . '/hoa/stream/IStream/In.php', 'Hoa\\Stream\\IStream\\Lockable' => __DIR__ . '/..' . '/hoa/stream/IStream/Lockable.php', 'Hoa\\Stream\\IStream\\Out' => __DIR__ . '/..' . '/hoa/stream/IStream/Out.php', 'Hoa\\Stream\\IStream\\Pathable' => __DIR__ . '/..' . '/hoa/stream/IStream/Pathable.php', 'Hoa\\Stream\\IStream\\Pointable' => __DIR__ . '/..' . '/hoa/stream/IStream/Pointable.php', 'Hoa\\Stream\\IStream\\Statable' => __DIR__ . '/..' . '/hoa/stream/IStream/Statable.php', 'Hoa\\Stream\\IStream\\Stream' => __DIR__ . '/..' . '/hoa/stream/IStream/Stream.php', 'Hoa\\Stream\\IStream\\Structural' => __DIR__ . '/..' . '/hoa/stream/IStream/Structural.php', 'Hoa\\Stream\\IStream\\Touchable' => __DIR__ . '/..' . '/hoa/stream/IStream/Touchable.php', 'Hoa\\Stream\\Stream' => __DIR__ . '/..' . '/hoa/stream/Stream.php', 'Hoa\\Stream\\Wrapper\\Exception' => __DIR__ . '/..' . '/hoa/stream/Wrapper/Exception.php', 'Hoa\\Stream\\Wrapper\\IWrapper\\File' => __DIR__ . '/..' . '/hoa/stream/Wrapper/IWrapper/File.php', 'Hoa\\Stream\\Wrapper\\IWrapper\\IWrapper' => __DIR__ . '/..' . '/hoa/stream/Wrapper/IWrapper/IWrapper.php', 'Hoa\\Stream\\Wrapper\\IWrapper\\Stream' => __DIR__ . '/..' . '/hoa/stream/Wrapper/IWrapper/Stream.php', 'Hoa\\Stream\\Wrapper\\Wrapper' => __DIR__ . '/..' . '/hoa/stream/Wrapper/Wrapper.php', 'Hoa\\Ustring\\Bin\\Fromcode' => __DIR__ . '/..' . '/hoa/ustring/Bin/Fromcode.php', 'Hoa\\Ustring\\Bin\\Tocode' => __DIR__ . '/..' . '/hoa/ustring/Bin/Tocode.php', 'Hoa\\Ustring\\Exception' => __DIR__ . '/..' . '/hoa/ustring/Exception.php', 'Hoa\\Ustring\\Search' => __DIR__ . '/..' . '/hoa/ustring/Search.php', 'Hoa\\Ustring\\Ustring' => __DIR__ . '/..' . '/hoa/ustring/Ustring.php', 'Hoa\\Visitor\\Element' => __DIR__ . '/..' . '/hoa/visitor/Element.php', 'Hoa\\Visitor\\Visit' => __DIR__ . '/..' . '/hoa/visitor/Visit.php', 'Hoa\\Zformat\\Exception' => __DIR__ . '/..' . '/hoa/zformat/Exception.php', 'Hoa\\Zformat\\Parameter' => __DIR__ . '/..' . '/hoa/zformat/Parameter.php', 'Hoa\\Zformat\\Parameterizable' => __DIR__ . '/..' . '/hoa/zformat/Parameterizable.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PHPStan\\AnalysedCodeException' => __DIR__ . '/../..' . '/src/AnalysedCodeException.php', 'PHPStan\\Analyser\\Analyser' => __DIR__ . '/../..' . '/src/Analyser/Analyser.php', 'PHPStan\\Analyser\\AnalyserResult' => __DIR__ . '/../..' . '/src/Analyser/AnalyserResult.php', 'PHPStan\\Analyser\\AnalyserResultFinalizer' => __DIR__ . '/../..' . '/src/Analyser/AnalyserResultFinalizer.php', 'PHPStan\\Analyser\\ArgumentsNormalizer' => __DIR__ . '/../..' . '/src/Analyser/ArgumentsNormalizer.php', 'PHPStan\\Analyser\\ConditionalExpressionHolder' => __DIR__ . '/../..' . '/src/Analyser/ConditionalExpressionHolder.php', 'PHPStan\\Analyser\\ConstantResolver' => __DIR__ . '/../..' . '/src/Analyser/ConstantResolver.php', 'PHPStan\\Analyser\\ConstantResolverFactory' => __DIR__ . '/../..' . '/src/Analyser/ConstantResolverFactory.php', 'PHPStan\\Analyser\\DirectInternalScopeFactory' => __DIR__ . '/../..' . '/src/Analyser/DirectInternalScopeFactory.php', 'PHPStan\\Analyser\\EndStatementResult' => __DIR__ . '/../..' . '/src/Analyser/EndStatementResult.php', 'PHPStan\\Analyser\\EnsuredNonNullabilityResult' => __DIR__ . '/../..' . '/src/Analyser/EnsuredNonNullabilityResult.php', 'PHPStan\\Analyser\\EnsuredNonNullabilityResultExpression' => __DIR__ . '/../..' . '/src/Analyser/EnsuredNonNullabilityResultExpression.php', 'PHPStan\\Analyser\\Error' => __DIR__ . '/../..' . '/src/Analyser/Error.php', 'PHPStan\\Analyser\\ExpressionContext' => __DIR__ . '/../..' . '/src/Analyser/ExpressionContext.php', 'PHPStan\\Analyser\\ExpressionResult' => __DIR__ . '/../..' . '/src/Analyser/ExpressionResult.php', 'PHPStan\\Analyser\\ExpressionTypeHolder' => __DIR__ . '/../..' . '/src/Analyser/ExpressionTypeHolder.php', 'PHPStan\\Analyser\\FileAnalyser' => __DIR__ . '/../..' . '/src/Analyser/FileAnalyser.php', 'PHPStan\\Analyser\\FileAnalyserResult' => __DIR__ . '/../..' . '/src/Analyser/FileAnalyserResult.php', 'PHPStan\\Analyser\\FinalizerResult' => __DIR__ . '/../..' . '/src/Analyser/FinalizerResult.php', 'PHPStan\\Analyser\\Ignore\\IgnoreLexer' => __DIR__ . '/../..' . '/src/Analyser/Ignore/IgnoreLexer.php', 'PHPStan\\Analyser\\Ignore\\IgnoreParseException' => __DIR__ . '/../..' . '/src/Analyser/Ignore/IgnoreParseException.php', 'PHPStan\\Analyser\\Ignore\\IgnoredError' => __DIR__ . '/../..' . '/src/Analyser/Ignore/IgnoredError.php', 'PHPStan\\Analyser\\Ignore\\IgnoredErrorHelper' => __DIR__ . '/../..' . '/src/Analyser/Ignore/IgnoredErrorHelper.php', 'PHPStan\\Analyser\\Ignore\\IgnoredErrorHelperProcessedResult' => __DIR__ . '/../..' . '/src/Analyser/Ignore/IgnoredErrorHelperProcessedResult.php', 'PHPStan\\Analyser\\Ignore\\IgnoredErrorHelperResult' => __DIR__ . '/../..' . '/src/Analyser/Ignore/IgnoredErrorHelperResult.php', 'PHPStan\\Analyser\\ImpurePoint' => __DIR__ . '/../..' . '/src/Analyser/ImpurePoint.php', 'PHPStan\\Analyser\\InternalError' => __DIR__ . '/../..' . '/src/Analyser/InternalError.php', 'PHPStan\\Analyser\\InternalScopeFactory' => __DIR__ . '/../..' . '/src/Analyser/InternalScopeFactory.php', 'PHPStan\\Analyser\\LazyInternalScopeFactory' => __DIR__ . '/../..' . '/src/Analyser/LazyInternalScopeFactory.php', 'PHPStan\\Analyser\\LocalIgnoresProcessor' => __DIR__ . '/../..' . '/src/Analyser/LocalIgnoresProcessor.php', 'PHPStan\\Analyser\\LocalIgnoresProcessorResult' => __DIR__ . '/../..' . '/src/Analyser/LocalIgnoresProcessorResult.php', 'PHPStan\\Analyser\\MutatingScope' => __DIR__ . '/../..' . '/src/Analyser/MutatingScope.php', 'PHPStan\\Analyser\\NameScope' => __DIR__ . '/../..' . '/src/Analyser/NameScope.php', 'PHPStan\\Analyser\\NodeScopeResolver' => __DIR__ . '/../..' . '/src/Analyser/NodeScopeResolver.php', 'PHPStan\\Analyser\\NullsafeOperatorHelper' => __DIR__ . '/../..' . '/src/Analyser/NullsafeOperatorHelper.php', 'PHPStan\\Analyser\\OutOfClassScope' => __DIR__ . '/../..' . '/src/Analyser/OutOfClassScope.php', 'PHPStan\\Analyser\\ProcessClosureResult' => __DIR__ . '/../..' . '/src/Analyser/ProcessClosureResult.php', 'PHPStan\\Analyser\\ResultCache\\ResultCache' => __DIR__ . '/../..' . '/src/Analyser/ResultCache/ResultCache.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheClearer' => __DIR__ . '/../..' . '/src/Analyser/ResultCache/ResultCacheClearer.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheManager' => __DIR__ . '/../..' . '/src/Analyser/ResultCache/ResultCacheManager.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheManagerFactory' => __DIR__ . '/../..' . '/src/Analyser/ResultCache/ResultCacheManagerFactory.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheProcessResult' => __DIR__ . '/../..' . '/src/Analyser/ResultCache/ResultCacheProcessResult.php', 'PHPStan\\Analyser\\RicherScopeGetTypeHelper' => __DIR__ . '/../..' . '/src/Analyser/RicherScopeGetTypeHelper.php', 'PHPStan\\Analyser\\RuleErrorTransformer' => __DIR__ . '/../..' . '/src/Analyser/RuleErrorTransformer.php', 'PHPStan\\Analyser\\Scope' => __DIR__ . '/../..' . '/src/Analyser/Scope.php', 'PHPStan\\Analyser\\ScopeContext' => __DIR__ . '/../..' . '/src/Analyser/ScopeContext.php', 'PHPStan\\Analyser\\ScopeFactory' => __DIR__ . '/../..' . '/src/Analyser/ScopeFactory.php', 'PHPStan\\Analyser\\SpecifiedTypes' => __DIR__ . '/../..' . '/src/Analyser/SpecifiedTypes.php', 'PHPStan\\Analyser\\StatementContext' => __DIR__ . '/../..' . '/src/Analyser/StatementContext.php', 'PHPStan\\Analyser\\StatementExitPoint' => __DIR__ . '/../..' . '/src/Analyser/StatementExitPoint.php', 'PHPStan\\Analyser\\StatementResult' => __DIR__ . '/../..' . '/src/Analyser/StatementResult.php', 'PHPStan\\Analyser\\ThrowPoint' => __DIR__ . '/../..' . '/src/Analyser/ThrowPoint.php', 'PHPStan\\Analyser\\TypeSpecifier' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifier.php', 'PHPStan\\Analyser\\TypeSpecifierAwareExtension' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifierAwareExtension.php', 'PHPStan\\Analyser\\TypeSpecifierContext' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifierContext.php', 'PHPStan\\Analyser\\TypeSpecifierFactory' => __DIR__ . '/../..' . '/src/Analyser/TypeSpecifierFactory.php', 'PHPStan\\Analyser\\UndefinedVariableException' => __DIR__ . '/../..' . '/src/Analyser/UndefinedVariableException.php', 'PHPStan\\BetterReflection\\BetterReflection' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/BetterReflection.php', 'PHPStan\\BetterReflection\\Identifier\\Exception\\InvalidIdentifierName' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Identifier/Exception/InvalidIdentifierName.php', 'PHPStan\\BetterReflection\\Identifier\\Identifier' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Identifier/Identifier.php', 'PHPStan\\BetterReflection\\Identifier\\IdentifierType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Identifier/IdentifierType.php', 'PHPStan\\BetterReflection\\NodeCompiler\\CompileNodeToValue' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/NodeCompiler/CompileNodeToValue.php', 'PHPStan\\BetterReflection\\NodeCompiler\\CompiledValue' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/NodeCompiler/CompiledValue.php', 'PHPStan\\BetterReflection\\NodeCompiler\\CompilerContext' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/NodeCompiler/CompilerContext.php', 'PHPStan\\BetterReflection\\NodeCompiler\\Exception\\UnableToCompileNode' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/NodeCompiler/Exception/UnableToCompileNode.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\Exception\\NotImplemented' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/Exception/NotImplemented.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\FakeReflectionAttribute' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/FakeReflectionAttribute.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionAttribute' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionAttribute.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionAttributeFactory' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionAttributeFactory.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionClass' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionClass.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionClassConstant' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionClassConstant.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionEnum' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnum.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionEnumBackedCase' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnumBackedCase.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionEnumUnitCase' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnumUnitCase.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionFunction' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionFunction.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionIntersectionType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionIntersectionType.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionMethod' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionMethod.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionNamedType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionNamedType.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionObject' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionObject.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionParameter' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionParameter.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionProperty' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionProperty.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionType.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionUnionType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionUnionType.php', 'PHPStan\\BetterReflection\\Reflection\\Annotation\\AnnotationHelper' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Annotation/AnnotationHelper.php', 'PHPStan\\BetterReflection\\Reflection\\Attribute\\ReflectionAttributeHelper' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Attribute/ReflectionAttributeHelper.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\CircularReference' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/CircularReference.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\ClassDoesNotExist' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/ClassDoesNotExist.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\CodeLocationMissing' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/CodeLocationMissing.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\FunctionDoesNotExist' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/FunctionDoesNotExist.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\InvalidArrowFunctionBodyNode' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidArrowFunctionBodyNode.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\InvalidConstantNode' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidConstantNode.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\InvalidDefaultValueType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidDefaultValueType.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\MethodPrototypeNotFound' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/MethodPrototypeNotFound.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\NoObjectProvided' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/NoObjectProvided.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\NoParent' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/NoParent.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\NotAnObject' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/NotAnObject.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\ObjectNotInstanceOfClass' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/ObjectNotInstanceOfClass.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\PropertyDoesNotExist' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/PropertyDoesNotExist.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\PropertyIsNotStatic' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Exception/PropertyIsNotStatic.php', 'PHPStan\\BetterReflection\\Reflection\\Reflection' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Reflection.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionAttribute' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionAttribute.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionClass' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionClass.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionClassConstant' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionClassConstant.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionConstant' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionConstant.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionEnum' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionEnum.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionEnumCase' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionEnumCase.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionFunction' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionFunction.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionFunctionAbstract' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionFunctionAbstract.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionIntersectionType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionIntersectionType.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionMethod' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionMethod.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionNamedType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionNamedType.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionObject' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionObject.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionParameter' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionParameter.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionProperty' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionProperty.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionType.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionUnionType' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionUnionType.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionAttributeStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionAttributeStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionClassConstantStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionClassConstantStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionClassStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionClassStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionConstantStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionConstantStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionEnumCaseStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionEnumCaseStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionFunctionStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionFunctionStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionMethodStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionMethodStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionParameterStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionParameterStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionPropertyStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionPropertyStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionTypeStringCast' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionTypeStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\Support\\AlreadyVisitedClasses' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflection/Support/AlreadyVisitedClasses.php', 'PHPStan\\BetterReflection\\Reflector\\ClassReflector' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflector/ClassReflector.php', 'PHPStan\\BetterReflection\\Reflector\\ConstantReflector' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflector/ConstantReflector.php', 'PHPStan\\BetterReflection\\Reflector\\DefaultReflector' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflector/DefaultReflector.php', 'PHPStan\\BetterReflection\\Reflector\\Exception\\IdentifierNotFound' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflector/Exception/IdentifierNotFound.php', 'PHPStan\\BetterReflection\\Reflector\\FunctionReflector' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflector/FunctionReflector.php', 'PHPStan\\BetterReflection\\Reflector\\Reflector' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Reflector/Reflector.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Exception\\ParseToAstFailure' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Exception/ParseToAstFailure.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\FindReflectionsInTree' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/FindReflectionsInTree.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Locator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Locator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Parser\\MemoizingParser' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Parser/MemoizingParser.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\AstConversionStrategy' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Strategy/AstConversionStrategy.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\NodeToReflection' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Strategy/NodeToReflection.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\EvaledAnonymousClassCannotBeLocated' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/EvaledAnonymousClassCannotBeLocated.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\EvaledClosureCannotBeLocated' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/EvaledClosureCannotBeLocated.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\FunctionUndefined' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/FunctionUndefined.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\InvalidDirectory' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidDirectory.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\InvalidFileInfo' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidFileInfo.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\InvalidFileLocation' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidFileLocation.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\NoAnonymousClassOnLine' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NoAnonymousClassOnLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\NoClosureOnLine' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NoClosureOnLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\NotInternalClass' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NotInternalClass.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\TwoAnonymousClassesOnSameLine' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/TwoAnonymousClassesOnSameLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\TwoClosuresOnSameLine' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/TwoClosuresOnSameLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\FileChecker' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/FileChecker.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\AliasLocatedSource' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/AliasLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\AnonymousLocatedSource' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/AnonymousLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\EvaledLocatedSource' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/EvaledLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\InternalLocatedSource' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/InternalLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\LocatedSource' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/LocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\AggregateSourceStubber' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/AggregateSourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\Exception\\CouldNotFindPhpStormStubs' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/Exception/CouldNotFindPhpStormStubs.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\PhpStormStubsSourceStubber' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\PhpStormStubs\\CachingVisitor' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubs/CachingVisitor.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\ReflectionSourceStubber' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/ReflectionSourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\SourceStubber' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/SourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\StubData' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/StubData.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AbstractSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AbstractSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AggregateSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AggregateSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AnonymousClassObjectSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AnonymousClassObjectSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AutoloadSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AutoloadSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AutoloadSourceLocator\\FileReadTrapStreamWrapper' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AutoloadSourceLocator/FileReadTrapStreamWrapper.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\ClosureSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/ClosureSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\ComposerSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/ComposerSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\Exception' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/Exception.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\FailedToParseJson' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/FailedToParseJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\InvalidProjectDirectory' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/InvalidProjectDirectory.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\MissingComposerJson' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/MissingComposerJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\MissingInstalledJson' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/MissingInstalledJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\MakeLocatorForComposerJson' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForComposerJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\MakeLocatorForComposerJsonAndInstalledJson' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForComposerJsonAndInstalledJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\MakeLocatorForInstalledJson' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForInstalledJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\PsrAutoloaderLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/PsrAutoloaderLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Exception\\Exception' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Exception/Exception.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Exception\\InvalidPrefixMapping' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Exception/InvalidPrefixMapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Psr0Mapping' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Psr0Mapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Psr4Mapping' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Psr4Mapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\PsrAutoloaderMapping' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/PsrAutoloaderMapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\DirectoriesSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/DirectoriesSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\EvaledCodeSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/EvaledCodeSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\FileIteratorSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/FileIteratorSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\MemoizingSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/MemoizingSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\PhpInternalSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/PhpInternalSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\SingleFileSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/SingleFileSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\SourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/SourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\StringSourceLocator' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/StringSourceLocator.php', 'PHPStan\\BetterReflection\\Util\\CalculateReflectionColumn' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/CalculateReflectionColumn.php', 'PHPStan\\BetterReflection\\Util\\ClassExistenceChecker' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/ClassExistenceChecker.php', 'PHPStan\\BetterReflection\\Util\\ConstantNodeChecker' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/ConstantNodeChecker.php', 'PHPStan\\BetterReflection\\Util\\Exception\\InvalidNodePosition' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/Exception/InvalidNodePosition.php', 'PHPStan\\BetterReflection\\Util\\Exception\\NoNodePosition' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/Exception/NoNodePosition.php', 'PHPStan\\BetterReflection\\Util\\FileHelper' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/FileHelper.php', 'PHPStan\\BetterReflection\\Util\\FindReflectionOnLine' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/FindReflectionOnLine.php', 'PHPStan\\BetterReflection\\Util\\GetLastDocComment' => __DIR__ . '/..' . '/ondrejmirtes/better-reflection/src/Util/GetLastDocComment.php', 'PHPStan\\Broker\\AnonymousClassNameHelper' => __DIR__ . '/../..' . '/src/Broker/AnonymousClassNameHelper.php', 'PHPStan\\Broker\\Broker' => __DIR__ . '/../..' . '/src/Broker/Broker.php', 'PHPStan\\Broker\\BrokerFactory' => __DIR__ . '/../..' . '/src/Broker/BrokerFactory.php', 'PHPStan\\Broker\\ClassAutoloadingException' => __DIR__ . '/../..' . '/src/Broker/ClassAutoloadingException.php', 'PHPStan\\Broker\\ClassNotFoundException' => __DIR__ . '/../..' . '/src/Broker/ClassNotFoundException.php', 'PHPStan\\Broker\\ConstantNotFoundException' => __DIR__ . '/../..' . '/src/Broker/ConstantNotFoundException.php', 'PHPStan\\Broker\\FunctionNotFoundException' => __DIR__ . '/../..' . '/src/Broker/FunctionNotFoundException.php', 'PHPStan\\Cache\\Cache' => __DIR__ . '/../..' . '/src/Cache/Cache.php', 'PHPStan\\Cache\\CacheItem' => __DIR__ . '/../..' . '/src/Cache/CacheItem.php', 'PHPStan\\Cache\\CacheStorage' => __DIR__ . '/../..' . '/src/Cache/CacheStorage.php', 'PHPStan\\Cache\\FileCacheStorage' => __DIR__ . '/../..' . '/src/Cache/FileCacheStorage.php', 'PHPStan\\Cache\\MemoryCacheStorage' => __DIR__ . '/../..' . '/src/Cache/MemoryCacheStorage.php', 'PHPStan\\Classes\\ForbiddenClassNameExtension' => __DIR__ . '/../..' . '/src/Classes/ForbiddenClassNameExtension.php', 'PHPStan\\Collectors\\CollectedData' => __DIR__ . '/../..' . '/src/Collectors/CollectedData.php', 'PHPStan\\Collectors\\Collector' => __DIR__ . '/../..' . '/src/Collectors/Collector.php', 'PHPStan\\Collectors\\Registry' => __DIR__ . '/../..' . '/src/Collectors/Registry.php', 'PHPStan\\Collectors\\RegistryFactory' => __DIR__ . '/../..' . '/src/Collectors/RegistryFactory.php', 'PHPStan\\Command\\AnalyseApplication' => __DIR__ . '/../..' . '/src/Command/AnalyseApplication.php', 'PHPStan\\Command\\AnalyseCommand' => __DIR__ . '/../..' . '/src/Command/AnalyseCommand.php', 'PHPStan\\Command\\AnalyserRunner' => __DIR__ . '/../..' . '/src/Command/AnalyserRunner.php', 'PHPStan\\Command\\AnalysisResult' => __DIR__ . '/../..' . '/src/Command/AnalysisResult.php', 'PHPStan\\Command\\ClearResultCacheCommand' => __DIR__ . '/../..' . '/src/Command/ClearResultCacheCommand.php', 'PHPStan\\Command\\CommandHelper' => __DIR__ . '/../..' . '/src/Command/CommandHelper.php', 'PHPStan\\Command\\DiagnoseCommand' => __DIR__ . '/../..' . '/src/Command/DiagnoseCommand.php', 'PHPStan\\Command\\DumpParametersCommand' => __DIR__ . '/../..' . '/src/Command/DumpParametersCommand.php', 'PHPStan\\Command\\ErrorFormatter\\BaselineNeonErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/BaselineNeonErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\BaselinePhpErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\CheckstyleErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\CiDetectedErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/CiDetectedErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\ErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/ErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\GithubErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/GithubErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\GitlabErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/GitlabErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\JsonErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/JsonErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\JunitErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/JunitErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\RawErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/RawErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\TableErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/TableErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\TeamcityErrorFormatter' => __DIR__ . '/../..' . '/src/Command/ErrorFormatter/TeamcityErrorFormatter.php', 'PHPStan\\Command\\ErrorsConsoleStyle' => __DIR__ . '/../..' . '/src/Command/ErrorsConsoleStyle.php', 'PHPStan\\Command\\FixerApplication' => __DIR__ . '/../..' . '/src/Command/FixerApplication.php', 'PHPStan\\Command\\FixerProcessException' => __DIR__ . '/../..' . '/src/Command/FixerProcessException.php', 'PHPStan\\Command\\FixerWorkerCommand' => __DIR__ . '/../..' . '/src/Command/FixerWorkerCommand.php', 'PHPStan\\Command\\IgnoredRegexValidator' => __DIR__ . '/../..' . '/src/Command/IgnoredRegexValidator.php', 'PHPStan\\Command\\IgnoredRegexValidatorResult' => __DIR__ . '/../..' . '/src/Command/IgnoredRegexValidatorResult.php', 'PHPStan\\Command\\InceptionNotSuccessfulException' => __DIR__ . '/../..' . '/src/Command/InceptionNotSuccessfulException.php', 'PHPStan\\Command\\InceptionResult' => __DIR__ . '/../..' . '/src/Command/InceptionResult.php', 'PHPStan\\Command\\Output' => __DIR__ . '/../..' . '/src/Command/Output.php', 'PHPStan\\Command\\OutputStyle' => __DIR__ . '/../..' . '/src/Command/OutputStyle.php', 'PHPStan\\Command\\Symfony\\SymfonyOutput' => __DIR__ . '/../..' . '/src/Command/Symfony/SymfonyOutput.php', 'PHPStan\\Command\\Symfony\\SymfonyStyle' => __DIR__ . '/../..' . '/src/Command/Symfony/SymfonyStyle.php', 'PHPStan\\Command\\WorkerCommand' => __DIR__ . '/../..' . '/src/Command/WorkerCommand.php', 'PHPStan\\DependencyInjection\\BleedingEdgeToggle' => __DIR__ . '/../..' . '/src/DependencyInjection/BleedingEdgeToggle.php', 'PHPStan\\DependencyInjection\\ConditionalTagsExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/ConditionalTagsExtension.php', 'PHPStan\\DependencyInjection\\Configurator' => __DIR__ . '/../..' . '/src/DependencyInjection/Configurator.php', 'PHPStan\\DependencyInjection\\Container' => __DIR__ . '/../..' . '/src/DependencyInjection/Container.php', 'PHPStan\\DependencyInjection\\ContainerFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/ContainerFactory.php', 'PHPStan\\DependencyInjection\\DerivativeContainerFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/DerivativeContainerFactory.php', 'PHPStan\\DependencyInjection\\DuplicateIncludedFilesException' => __DIR__ . '/../..' . '/src/DependencyInjection/DuplicateIncludedFilesException.php', 'PHPStan\\DependencyInjection\\InvalidExcludePathsException' => __DIR__ . '/../..' . '/src/DependencyInjection/InvalidExcludePathsException.php', 'PHPStan\\DependencyInjection\\InvalidIgnoredErrorPatternsException' => __DIR__ . '/../..' . '/src/DependencyInjection/InvalidIgnoredErrorPatternsException.php', 'PHPStan\\DependencyInjection\\LoaderFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/LoaderFactory.php', 'PHPStan\\DependencyInjection\\MemoizingContainer' => __DIR__ . '/../..' . '/src/DependencyInjection/MemoizingContainer.php', 'PHPStan\\DependencyInjection\\NeonAdapter' => __DIR__ . '/../..' . '/src/DependencyInjection/NeonAdapter.php', 'PHPStan\\DependencyInjection\\NeonLoader' => __DIR__ . '/../..' . '/src/DependencyInjection/NeonLoader.php', 'PHPStan\\DependencyInjection\\Neon\\OptionalPath' => __DIR__ . '/../..' . '/src/DependencyInjection/Neon/OptionalPath.php', 'PHPStan\\DependencyInjection\\Nette\\NetteContainer' => __DIR__ . '/../..' . '/src/DependencyInjection/Nette/NetteContainer.php', 'PHPStan\\DependencyInjection\\ParameterNotFoundException' => __DIR__ . '/../..' . '/src/DependencyInjection/ParameterNotFoundException.php', 'PHPStan\\DependencyInjection\\ParametersSchemaExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/ParametersSchemaExtension.php', 'PHPStan\\DependencyInjection\\ProjectConfigHelper' => __DIR__ . '/../..' . '/src/DependencyInjection/ProjectConfigHelper.php', 'PHPStan\\DependencyInjection\\Reflection\\ClassReflectionExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Reflection/ClassReflectionExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Reflection\\LazyClassReflectionExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Reflection/LazyClassReflectionExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\RulesExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/RulesExtension.php', 'PHPStan\\DependencyInjection\\Type\\DynamicReturnTypeExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/DynamicReturnTypeExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\DynamicThrowTypeExtensionProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/DynamicThrowTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\ExpressionTypeResolverExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/ExpressionTypeResolverExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyDynamicReturnTypeExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/LazyDynamicReturnTypeExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyDynamicThrowTypeExtensionProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/LazyDynamicThrowTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyExpressionTypeResolverExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/LazyExpressionTypeResolverExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyOperatorTypeSpecifyingExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/LazyOperatorTypeSpecifyingExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyParameterClosureTypeExtensionProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/LazyParameterClosureTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyParameterOutTypeExtensionProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/LazyParameterOutTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\OperatorTypeSpecifyingExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/OperatorTypeSpecifyingExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\ParameterClosureTypeExtensionProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/ParameterClosureTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\ParameterOutTypeExtensionProvider' => __DIR__ . '/../..' . '/src/DependencyInjection/Type/ParameterOutTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\ValidateExcludePathsExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/ValidateExcludePathsExtension.php', 'PHPStan\\DependencyInjection\\ValidateIgnoredErrorsExtension' => __DIR__ . '/../..' . '/src/DependencyInjection/ValidateIgnoredErrorsExtension.php', 'PHPStan\\Dependency\\DependencyResolver' => __DIR__ . '/../..' . '/src/Dependency/DependencyResolver.php', 'PHPStan\\Dependency\\ExportedNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode.php', 'PHPStan\\Dependency\\ExportedNodeFetcher' => __DIR__ . '/../..' . '/src/Dependency/ExportedNodeFetcher.php', 'PHPStan\\Dependency\\ExportedNodeResolver' => __DIR__ . '/../..' . '/src/Dependency/ExportedNodeResolver.php', 'PHPStan\\Dependency\\ExportedNodeVisitor' => __DIR__ . '/../..' . '/src/Dependency/ExportedNodeVisitor.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedAttributeNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedAttributeNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedClassConstantNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedClassConstantNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedClassConstantsNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedClassConstantsNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedClassNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedClassNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedEnumCaseNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedEnumCaseNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedEnumNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedEnumNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedFunctionNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedFunctionNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedInterfaceNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedInterfaceNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedMethodNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedMethodNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedParameterNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedParameterNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedPhpDocNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedPhpDocNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedPropertiesNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedPropertiesNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedTraitNode' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedTraitNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedTraitUseAdaptation' => __DIR__ . '/../..' . '/src/Dependency/ExportedNode/ExportedTraitUseAdaptation.php', 'PHPStan\\Dependency\\NodeDependencies' => __DIR__ . '/../..' . '/src/Dependency/NodeDependencies.php', 'PHPStan\\Dependency\\RootExportedNode' => __DIR__ . '/../..' . '/src/Dependency/RootExportedNode.php', 'PHPStan\\Diagnose\\DiagnoseExtension' => __DIR__ . '/../..' . '/src/Diagnose/DiagnoseExtension.php', 'PHPStan\\Diagnose\\PHPStanDiagnoseExtension' => __DIR__ . '/../..' . '/src/Diagnose/PHPStanDiagnoseExtension.php', 'PHPStan\\File\\CouldNotReadFileException' => __DIR__ . '/../..' . '/src/File/CouldNotReadFileException.php', 'PHPStan\\File\\CouldNotWriteFileException' => __DIR__ . '/../..' . '/src/File/CouldNotWriteFileException.php', 'PHPStan\\File\\FileExcluder' => __DIR__ . '/../..' . '/src/File/FileExcluder.php', 'PHPStan\\File\\FileExcluderFactory' => __DIR__ . '/../..' . '/src/File/FileExcluderFactory.php', 'PHPStan\\File\\FileExcluderRawFactory' => __DIR__ . '/../..' . '/src/File/FileExcluderRawFactory.php', 'PHPStan\\File\\FileFinder' => __DIR__ . '/../..' . '/src/File/FileFinder.php', 'PHPStan\\File\\FileFinderResult' => __DIR__ . '/../..' . '/src/File/FileFinderResult.php', 'PHPStan\\File\\FileHelper' => __DIR__ . '/../..' . '/src/File/FileHelper.php', 'PHPStan\\File\\FileMonitor' => __DIR__ . '/../..' . '/src/File/FileMonitor.php', 'PHPStan\\File\\FileMonitorResult' => __DIR__ . '/../..' . '/src/File/FileMonitorResult.php', 'PHPStan\\File\\FileReader' => __DIR__ . '/../..' . '/src/File/FileReader.php', 'PHPStan\\File\\FileWriter' => __DIR__ . '/../..' . '/src/File/FileWriter.php', 'PHPStan\\File\\FuzzyRelativePathHelper' => __DIR__ . '/../..' . '/src/File/FuzzyRelativePathHelper.php', 'PHPStan\\File\\NullRelativePathHelper' => __DIR__ . '/../..' . '/src/File/NullRelativePathHelper.php', 'PHPStan\\File\\ParentDirectoryRelativePathHelper' => __DIR__ . '/../..' . '/src/File/ParentDirectoryRelativePathHelper.php', 'PHPStan\\File\\PathNotFoundException' => __DIR__ . '/../..' . '/src/File/PathNotFoundException.php', 'PHPStan\\File\\RelativePathHelper' => __DIR__ . '/../..' . '/src/File/RelativePathHelper.php', 'PHPStan\\File\\SimpleRelativePathHelper' => __DIR__ . '/../..' . '/src/File/SimpleRelativePathHelper.php', 'PHPStan\\File\\SystemAgnosticSimpleRelativePathHelper' => __DIR__ . '/../..' . '/src/File/SystemAgnosticSimpleRelativePathHelper.php', 'PHPStan\\Internal\\AgentDetector' => __DIR__ . '/../..' . '/src/Internal/AgentDetector.php', 'PHPStan\\Internal\\BytesHelper' => __DIR__ . '/../..' . '/src/Internal/BytesHelper.php', 'PHPStan\\Internal\\CombinationsHelper' => __DIR__ . '/../..' . '/src/Internal/CombinationsHelper.php', 'PHPStan\\Internal\\ComposerHelper' => __DIR__ . '/../..' . '/src/Internal/ComposerHelper.php', 'PHPStan\\Internal\\ContainerDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Internal/ContainerDynamicReturnTypeExtension.php', 'PHPStan\\Internal\\DirectoryCreator' => __DIR__ . '/../..' . '/src/Internal/DirectoryCreator.php', 'PHPStan\\Internal\\DirectoryCreatorException' => __DIR__ . '/../..' . '/src/Internal/DirectoryCreatorException.php', 'PHPStan\\Internal\\SprintfHelper' => __DIR__ . '/../..' . '/src/Internal/SprintfHelper.php', 'PHPStan\\Node\\AnonymousClassNode' => __DIR__ . '/../..' . '/src/Node/AnonymousClassNode.php', 'PHPStan\\Node\\BooleanAndNode' => __DIR__ . '/../..' . '/src/Node/BooleanAndNode.php', 'PHPStan\\Node\\BooleanOrNode' => __DIR__ . '/../..' . '/src/Node/BooleanOrNode.php', 'PHPStan\\Node\\BreaklessWhileLoopNode' => __DIR__ . '/../..' . '/src/Node/BreaklessWhileLoopNode.php', 'PHPStan\\Node\\CatchWithUnthrownExceptionNode' => __DIR__ . '/../..' . '/src/Node/CatchWithUnthrownExceptionNode.php', 'PHPStan\\Node\\ClassConstantsNode' => __DIR__ . '/../..' . '/src/Node/ClassConstantsNode.php', 'PHPStan\\Node\\ClassMethod' => __DIR__ . '/../..' . '/src/Node/ClassMethod.php', 'PHPStan\\Node\\ClassMethodsNode' => __DIR__ . '/../..' . '/src/Node/ClassMethodsNode.php', 'PHPStan\\Node\\ClassPropertiesNode' => __DIR__ . '/../..' . '/src/Node/ClassPropertiesNode.php', 'PHPStan\\Node\\ClassPropertyNode' => __DIR__ . '/../..' . '/src/Node/ClassPropertyNode.php', 'PHPStan\\Node\\ClassStatementsGatherer' => __DIR__ . '/../..' . '/src/Node/ClassStatementsGatherer.php', 'PHPStan\\Node\\ClosureReturnStatementsNode' => __DIR__ . '/../..' . '/src/Node/ClosureReturnStatementsNode.php', 'PHPStan\\Node\\CollectedDataNode' => __DIR__ . '/../..' . '/src/Node/CollectedDataNode.php', 'PHPStan\\Node\\Constant\\ClassConstantFetch' => __DIR__ . '/../..' . '/src/Node/Constant/ClassConstantFetch.php', 'PHPStan\\Node\\DoWhileLoopConditionNode' => __DIR__ . '/../..' . '/src/Node/DoWhileLoopConditionNode.php', 'PHPStan\\Node\\ExecutionEndNode' => __DIR__ . '/../..' . '/src/Node/ExecutionEndNode.php', 'PHPStan\\Node\\Expr\\AlwaysRememberedExpr' => __DIR__ . '/../..' . '/src/Node/Expr/AlwaysRememberedExpr.php', 'PHPStan\\Node\\Expr\\ExistingArrayDimFetch' => __DIR__ . '/../..' . '/src/Node/Expr/ExistingArrayDimFetch.php', 'PHPStan\\Node\\Expr\\GetIterableKeyTypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/GetIterableKeyTypeExpr.php', 'PHPStan\\Node\\Expr\\GetIterableValueTypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/GetIterableValueTypeExpr.php', 'PHPStan\\Node\\Expr\\GetOffsetValueTypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/GetOffsetValueTypeExpr.php', 'PHPStan\\Node\\Expr\\OriginalPropertyTypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/OriginalPropertyTypeExpr.php', 'PHPStan\\Node\\Expr\\ParameterVariableOriginalValueExpr' => __DIR__ . '/../..' . '/src/Node/Expr/ParameterVariableOriginalValueExpr.php', 'PHPStan\\Node\\Expr\\PropertyInitializationExpr' => __DIR__ . '/../..' . '/src/Node/Expr/PropertyInitializationExpr.php', 'PHPStan\\Node\\Expr\\SetExistingOffsetValueTypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/SetExistingOffsetValueTypeExpr.php', 'PHPStan\\Node\\Expr\\SetOffsetValueTypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/SetOffsetValueTypeExpr.php', 'PHPStan\\Node\\Expr\\TypeExpr' => __DIR__ . '/../..' . '/src/Node/Expr/TypeExpr.php', 'PHPStan\\Node\\Expr\\UnsetOffsetExpr' => __DIR__ . '/../..' . '/src/Node/Expr/UnsetOffsetExpr.php', 'PHPStan\\Node\\FileNode' => __DIR__ . '/../..' . '/src/Node/FileNode.php', 'PHPStan\\Node\\FinallyExitPointsNode' => __DIR__ . '/../..' . '/src/Node/FinallyExitPointsNode.php', 'PHPStan\\Node\\FunctionCallableNode' => __DIR__ . '/../..' . '/src/Node/FunctionCallableNode.php', 'PHPStan\\Node\\FunctionReturnStatementsNode' => __DIR__ . '/../..' . '/src/Node/FunctionReturnStatementsNode.php', 'PHPStan\\Node\\InArrowFunctionNode' => __DIR__ . '/../..' . '/src/Node/InArrowFunctionNode.php', 'PHPStan\\Node\\InClassMethodNode' => __DIR__ . '/../..' . '/src/Node/InClassMethodNode.php', 'PHPStan\\Node\\InClassNode' => __DIR__ . '/../..' . '/src/Node/InClassNode.php', 'PHPStan\\Node\\InClosureNode' => __DIR__ . '/../..' . '/src/Node/InClosureNode.php', 'PHPStan\\Node\\InForeachNode' => __DIR__ . '/../..' . '/src/Node/InForeachNode.php', 'PHPStan\\Node\\InFunctionNode' => __DIR__ . '/../..' . '/src/Node/InFunctionNode.php', 'PHPStan\\Node\\InTraitNode' => __DIR__ . '/../..' . '/src/Node/InTraitNode.php', 'PHPStan\\Node\\InstantiationCallableNode' => __DIR__ . '/../..' . '/src/Node/InstantiationCallableNode.php', 'PHPStan\\Node\\InvalidateExprNode' => __DIR__ . '/../..' . '/src/Node/InvalidateExprNode.php', 'PHPStan\\Node\\IssetExpr' => __DIR__ . '/../..' . '/src/Node/IssetExpr.php', 'PHPStan\\Node\\LiteralArrayItem' => __DIR__ . '/../..' . '/src/Node/LiteralArrayItem.php', 'PHPStan\\Node\\LiteralArrayNode' => __DIR__ . '/../..' . '/src/Node/LiteralArrayNode.php', 'PHPStan\\Node\\MatchExpressionArm' => __DIR__ . '/../..' . '/src/Node/MatchExpressionArm.php', 'PHPStan\\Node\\MatchExpressionArmBody' => __DIR__ . '/../..' . '/src/Node/MatchExpressionArmBody.php', 'PHPStan\\Node\\MatchExpressionArmCondition' => __DIR__ . '/../..' . '/src/Node/MatchExpressionArmCondition.php', 'PHPStan\\Node\\MatchExpressionNode' => __DIR__ . '/../..' . '/src/Node/MatchExpressionNode.php', 'PHPStan\\Node\\MethodCallableNode' => __DIR__ . '/../..' . '/src/Node/MethodCallableNode.php', 'PHPStan\\Node\\MethodReturnStatementsNode' => __DIR__ . '/../..' . '/src/Node/MethodReturnStatementsNode.php', 'PHPStan\\Node\\Method\\MethodCall' => __DIR__ . '/../..' . '/src/Node/Method/MethodCall.php', 'PHPStan\\Node\\NoopExpressionNode' => __DIR__ . '/../..' . '/src/Node/NoopExpressionNode.php', 'PHPStan\\Node\\Printer\\ExprPrinter' => __DIR__ . '/../..' . '/src/Node/Printer/ExprPrinter.php', 'PHPStan\\Node\\Printer\\NodeTypePrinter' => __DIR__ . '/../..' . '/src/Node/Printer/NodeTypePrinter.php', 'PHPStan\\Node\\Printer\\Printer' => __DIR__ . '/../..' . '/src/Node/Printer/Printer.php', 'PHPStan\\Node\\PropertyAssignNode' => __DIR__ . '/../..' . '/src/Node/PropertyAssignNode.php', 'PHPStan\\Node\\Property\\PropertyAssign' => __DIR__ . '/../..' . '/src/Node/Property/PropertyAssign.php', 'PHPStan\\Node\\Property\\PropertyRead' => __DIR__ . '/../..' . '/src/Node/Property/PropertyRead.php', 'PHPStan\\Node\\Property\\PropertyWrite' => __DIR__ . '/../..' . '/src/Node/Property/PropertyWrite.php', 'PHPStan\\Node\\ReturnStatement' => __DIR__ . '/../..' . '/src/Node/ReturnStatement.php', 'PHPStan\\Node\\ReturnStatementsNode' => __DIR__ . '/../..' . '/src/Node/ReturnStatementsNode.php', 'PHPStan\\Node\\StaticMethodCallableNode' => __DIR__ . '/../..' . '/src/Node/StaticMethodCallableNode.php', 'PHPStan\\Node\\UnreachableStatementNode' => __DIR__ . '/../..' . '/src/Node/UnreachableStatementNode.php', 'PHPStan\\Node\\VarTagChangedExpressionTypeNode' => __DIR__ . '/../..' . '/src/Node/VarTagChangedExpressionTypeNode.php', 'PHPStan\\Node\\VariableAssignNode' => __DIR__ . '/../..' . '/src/Node/VariableAssignNode.php', 'PHPStan\\Node\\VirtualNode' => __DIR__ . '/../..' . '/src/Node/VirtualNode.php', 'PHPStan\\Parallel\\ParallelAnalyser' => __DIR__ . '/../..' . '/src/Parallel/ParallelAnalyser.php', 'PHPStan\\Parallel\\Process' => __DIR__ . '/../..' . '/src/Parallel/Process.php', 'PHPStan\\Parallel\\ProcessPool' => __DIR__ . '/../..' . '/src/Parallel/ProcessPool.php', 'PHPStan\\Parallel\\ProcessTimedOutException' => __DIR__ . '/../..' . '/src/Parallel/ProcessTimedOutException.php', 'PHPStan\\Parallel\\Schedule' => __DIR__ . '/../..' . '/src/Parallel/Schedule.php', 'PHPStan\\Parallel\\Scheduler' => __DIR__ . '/../..' . '/src/Parallel/Scheduler.php', 'PHPStan\\Parser\\AnonymousClassVisitor' => __DIR__ . '/../..' . '/src/Parser/AnonymousClassVisitor.php', 'PHPStan\\Parser\\ArrayFilterArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ArrayFilterArgVisitor.php', 'PHPStan\\Parser\\ArrayFindArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ArrayFindArgVisitor.php', 'PHPStan\\Parser\\ArrayMapArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ArrayMapArgVisitor.php', 'PHPStan\\Parser\\ArrayWalkArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ArrayWalkArgVisitor.php', 'PHPStan\\Parser\\ArrowFunctionArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ArrowFunctionArgVisitor.php', 'PHPStan\\Parser\\CachedParser' => __DIR__ . '/../..' . '/src/Parser/CachedParser.php', 'PHPStan\\Parser\\CleaningParser' => __DIR__ . '/../..' . '/src/Parser/CleaningParser.php', 'PHPStan\\Parser\\CleaningVisitor' => __DIR__ . '/../..' . '/src/Parser/CleaningVisitor.php', 'PHPStan\\Parser\\ClosureArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ClosureArgVisitor.php', 'PHPStan\\Parser\\ClosureBindArgVisitor' => __DIR__ . '/../..' . '/src/Parser/ClosureBindArgVisitor.php', 'PHPStan\\Parser\\ClosureBindToVarVisitor' => __DIR__ . '/../..' . '/src/Parser/ClosureBindToVarVisitor.php', 'PHPStan\\Parser\\CurlSetOptArgVisitor' => __DIR__ . '/../..' . '/src/Parser/CurlSetOptArgVisitor.php', 'PHPStan\\Parser\\DeclarePositionVisitor' => __DIR__ . '/../..' . '/src/Parser/DeclarePositionVisitor.php', 'PHPStan\\Parser\\FunctionCallStatementFinder' => __DIR__ . '/../..' . '/src/Parser/FunctionCallStatementFinder.php', 'PHPStan\\Parser\\ImmediatelyInvokedClosureVisitor' => __DIR__ . '/../..' . '/src/Parser/ImmediatelyInvokedClosureVisitor.php', 'PHPStan\\Parser\\LastConditionVisitor' => __DIR__ . '/../..' . '/src/Parser/LastConditionVisitor.php', 'PHPStan\\Parser\\LexerFactory' => __DIR__ . '/../..' . '/src/Parser/LexerFactory.php', 'PHPStan\\Parser\\MagicConstantParamDefaultVisitor' => __DIR__ . '/../..' . '/src/Parser/MagicConstantParamDefaultVisitor.php', 'PHPStan\\Parser\\NewAssignedToPropertyVisitor' => __DIR__ . '/../..' . '/src/Parser/NewAssignedToPropertyVisitor.php', 'PHPStan\\Parser\\ParentStmtTypesVisitor' => __DIR__ . '/../..' . '/src/Parser/ParentStmtTypesVisitor.php', 'PHPStan\\Parser\\Parser' => __DIR__ . '/../..' . '/src/Parser/Parser.php', 'PHPStan\\Parser\\ParserErrorsException' => __DIR__ . '/../..' . '/src/Parser/ParserErrorsException.php', 'PHPStan\\Parser\\PathRoutingParser' => __DIR__ . '/../..' . '/src/Parser/PathRoutingParser.php', 'PHPStan\\Parser\\PhpParserDecorator' => __DIR__ . '/../..' . '/src/Parser/PhpParserDecorator.php', 'PHPStan\\Parser\\RemoveUnusedCodeByPhpVersionIdVisitor' => __DIR__ . '/../..' . '/src/Parser/RemoveUnusedCodeByPhpVersionIdVisitor.php', 'PHPStan\\Parser\\RichParser' => __DIR__ . '/../..' . '/src/Parser/RichParser.php', 'PHPStan\\Parser\\SimpleParser' => __DIR__ . '/../..' . '/src/Parser/SimpleParser.php', 'PHPStan\\Parser\\TraitCollectingVisitor' => __DIR__ . '/../..' . '/src/Parser/TraitCollectingVisitor.php', 'PHPStan\\Parser\\TryCatchTypeVisitor' => __DIR__ . '/../..' . '/src/Parser/TryCatchTypeVisitor.php', 'PHPStan\\Parser\\TypeTraverserInstanceofVisitor' => __DIR__ . '/../..' . '/src/Parser/TypeTraverserInstanceofVisitor.php', 'PHPStan\\Php8StubsMap' => __DIR__ . '/..' . '/phpstan/php-8-stubs/Php8StubsMap.php', 'PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\Attribute' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\QuoteAwareConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\Node' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Node.php', 'PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', 'PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', 'PHPStan\\PhpDocParser\\Ast\\NodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagMethodValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagPropertyValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineAnnotation' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArgument' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArray' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArrayItem' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ExtendsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ImplementsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MixinTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamClosureThisTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamImmediatelyInvokedCallableTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamLaterInvokedCallableTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamOutTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PureUnlessCallableIsImpureTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireExtendsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireImplementsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\SelfOutTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasImportTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypelessParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\UsesTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeUnsealedTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeForParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\InvalidTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', 'PHPStan\\PhpDocParser\\Lexer\\Lexer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', 'PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', 'PHPStan\\PhpDocParser\\Parser\\ParserException' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', 'PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', 'PHPStan\\PhpDocParser\\Parser\\StringUnescaper' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php', 'PHPStan\\PhpDocParser\\Parser\\TokenIterator' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php', 'PHPStan\\PhpDocParser\\Parser\\TypeParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php', 'PHPStan\\PhpDocParser\\Printer\\DiffElem' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/DiffElem.php', 'PHPStan\\PhpDocParser\\Printer\\Differ' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/Differ.php', 'PHPStan\\PhpDocParser\\Printer\\Printer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/Printer.php', 'PHPStan\\PhpDoc\\ConstExprNodeResolver' => __DIR__ . '/../..' . '/src/PhpDoc/ConstExprNodeResolver.php', 'PHPStan\\PhpDoc\\ConstExprParserFactory' => __DIR__ . '/../..' . '/src/PhpDoc/ConstExprParserFactory.php', 'PHPStan\\PhpDoc\\CountableStubFilesExtension' => __DIR__ . '/../..' . '/src/PhpDoc/CountableStubFilesExtension.php', 'PHPStan\\PhpDoc\\DefaultStubFilesProvider' => __DIR__ . '/../..' . '/src/PhpDoc/DefaultStubFilesProvider.php', 'PHPStan\\PhpDoc\\DirectTypeNodeResolverExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/PhpDoc/DirectTypeNodeResolverExtensionRegistryProvider.php', 'PHPStan\\PhpDoc\\JsonValidateStubFilesExtension' => __DIR__ . '/../..' . '/src/PhpDoc/JsonValidateStubFilesExtension.php', 'PHPStan\\PhpDoc\\LazyTypeNodeResolverExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/PhpDoc/LazyTypeNodeResolverExtensionRegistryProvider.php', 'PHPStan\\PhpDoc\\NameScopeAlreadyBeingCreatedException' => __DIR__ . '/../..' . '/src/PhpDoc/NameScopeAlreadyBeingCreatedException.php', 'PHPStan\\PhpDoc\\PhpDocBlock' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocBlock.php', 'PHPStan\\PhpDoc\\PhpDocInheritanceResolver' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocInheritanceResolver.php', 'PHPStan\\PhpDoc\\PhpDocNodeResolver' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocNodeResolver.php', 'PHPStan\\PhpDoc\\PhpDocStringResolver' => __DIR__ . '/../..' . '/src/PhpDoc/PhpDocStringResolver.php', 'PHPStan\\PhpDoc\\ReflectionEnumStubFilesExtension' => __DIR__ . '/../..' . '/src/PhpDoc/ReflectionEnumStubFilesExtension.php', 'PHPStan\\PhpDoc\\ResolvedPhpDocBlock' => __DIR__ . '/../..' . '/src/PhpDoc/ResolvedPhpDocBlock.php', 'PHPStan\\PhpDoc\\SocketSelectStubFilesExtension' => __DIR__ . '/../..' . '/src/PhpDoc/SocketSelectStubFilesExtension.php', 'PHPStan\\PhpDoc\\StubFilesExtension' => __DIR__ . '/../..' . '/src/PhpDoc/StubFilesExtension.php', 'PHPStan\\PhpDoc\\StubFilesProvider' => __DIR__ . '/../..' . '/src/PhpDoc/StubFilesProvider.php', 'PHPStan\\PhpDoc\\StubPhpDocProvider' => __DIR__ . '/../..' . '/src/PhpDoc/StubPhpDocProvider.php', 'PHPStan\\PhpDoc\\StubSourceLocatorFactory' => __DIR__ . '/../..' . '/src/PhpDoc/StubSourceLocatorFactory.php', 'PHPStan\\PhpDoc\\StubValidator' => __DIR__ . '/../..' . '/src/PhpDoc/StubValidator.php', 'PHPStan\\PhpDoc\\Tag\\AssertTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/AssertTag.php', 'PHPStan\\PhpDoc\\Tag\\AssertTagParameter' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/AssertTagParameter.php', 'PHPStan\\PhpDoc\\Tag\\DeprecatedTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/DeprecatedTag.php', 'PHPStan\\PhpDoc\\Tag\\ExtendsTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ExtendsTag.php', 'PHPStan\\PhpDoc\\Tag\\ImplementsTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ImplementsTag.php', 'PHPStan\\PhpDoc\\Tag\\MethodTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/MethodTag.php', 'PHPStan\\PhpDoc\\Tag\\MethodTagParameter' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/MethodTagParameter.php', 'PHPStan\\PhpDoc\\Tag\\MixinTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/MixinTag.php', 'PHPStan\\PhpDoc\\Tag\\ParamClosureThisTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ParamClosureThisTag.php', 'PHPStan\\PhpDoc\\Tag\\ParamOutTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ParamOutTag.php', 'PHPStan\\PhpDoc\\Tag\\ParamTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ParamTag.php', 'PHPStan\\PhpDoc\\Tag\\PropertyTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/PropertyTag.php', 'PHPStan\\PhpDoc\\Tag\\RequireExtendsTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/RequireExtendsTag.php', 'PHPStan\\PhpDoc\\Tag\\RequireImplementsTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/RequireImplementsTag.php', 'PHPStan\\PhpDoc\\Tag\\ReturnTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ReturnTag.php', 'PHPStan\\PhpDoc\\Tag\\SelfOutTypeTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/SelfOutTypeTag.php', 'PHPStan\\PhpDoc\\Tag\\TemplateTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/TemplateTag.php', 'PHPStan\\PhpDoc\\Tag\\ThrowsTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/ThrowsTag.php', 'PHPStan\\PhpDoc\\Tag\\TypeAliasImportTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/TypeAliasImportTag.php', 'PHPStan\\PhpDoc\\Tag\\TypeAliasTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/TypeAliasTag.php', 'PHPStan\\PhpDoc\\Tag\\TypedTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/TypedTag.php', 'PHPStan\\PhpDoc\\Tag\\UsesTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/UsesTag.php', 'PHPStan\\PhpDoc\\Tag\\VarTag' => __DIR__ . '/../..' . '/src/PhpDoc/Tag/VarTag.php', 'PHPStan\\PhpDoc\\TypeNodeResolver' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolver.php', 'PHPStan\\PhpDoc\\TypeNodeResolverAwareExtension' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverAwareExtension.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtension' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverExtension.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtensionAwareRegistry' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverExtensionAwareRegistry.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtensionRegistry' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverExtensionRegistry.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtensionRegistryProvider' => __DIR__ . '/../..' . '/src/PhpDoc/TypeNodeResolverExtensionRegistryProvider.php', 'PHPStan\\PhpDoc\\TypeStringResolver' => __DIR__ . '/../..' . '/src/PhpDoc/TypeStringResolver.php', 'PHPStan\\Php\\PhpVersion' => __DIR__ . '/../..' . '/src/Php/PhpVersion.php', 'PHPStan\\Php\\PhpVersionFactory' => __DIR__ . '/../..' . '/src/Php/PhpVersionFactory.php', 'PHPStan\\Php\\PhpVersionFactoryFactory' => __DIR__ . '/../..' . '/src/Php/PhpVersionFactoryFactory.php', 'PHPStan\\Process\\CpuCoreCounter' => __DIR__ . '/../..' . '/src/Process/CpuCoreCounter.php', 'PHPStan\\Process\\ProcessCanceledException' => __DIR__ . '/../..' . '/src/Process/ProcessCanceledException.php', 'PHPStan\\Process\\ProcessCrashedException' => __DIR__ . '/../..' . '/src/Process/ProcessCrashedException.php', 'PHPStan\\Process\\ProcessHelper' => __DIR__ . '/../..' . '/src/Process/ProcessHelper.php', 'PHPStan\\Process\\ProcessPromise' => __DIR__ . '/../..' . '/src/Process/ProcessPromise.php', 'PHPStan\\Reflection\\AdditionalConstructorsExtension' => __DIR__ . '/../..' . '/src/Reflection/AdditionalConstructorsExtension.php', 'PHPStan\\Reflection\\AllowedSubTypesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/AllowedSubTypesClassReflectionExtension.php', 'PHPStan\\Reflection\\Annotations\\AnnotationMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationMethodReflection.php', 'PHPStan\\Reflection\\Annotations\\AnnotationPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationPropertyReflection.php', 'PHPStan\\Reflection\\Annotations\\AnnotationsMethodParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationsMethodParameterReflection.php', 'PHPStan\\Reflection\\Annotations\\AnnotationsMethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationsMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\Annotations\\AnnotationsPropertiesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Annotations/AnnotationsPropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\Assertions' => __DIR__ . '/../..' . '/src/Reflection/Assertions.php', 'PHPStan\\Reflection\\BetterReflection\\BetterReflectionProvider' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/BetterReflectionProvider.php', 'PHPStan\\Reflection\\BetterReflection\\BetterReflectionProviderFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/BetterReflectionProviderFactory.php', 'PHPStan\\Reflection\\BetterReflection\\BetterReflectionSourceLocatorFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\Reflector\\MemoizingReflector' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/Reflector/MemoizingReflector.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\AutoloadFunctionsSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/AutoloadFunctionsSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\AutoloadSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\CachingVisitor' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\ComposerJsonAndInstalledJsonSourceLocatorMaker' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/ComposerJsonAndInstalledJsonSourceLocatorMaker.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FetchedNode' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/FetchedNode.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FetchedNodesResult' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/FetchedNodesResult.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FileNodesFetcher' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/FileNodesFetcher.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FileReadTrapStreamWrapper' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/FileReadTrapStreamWrapper.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\NewOptimizedDirectorySourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/NewOptimizedDirectorySourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedDirectorySourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedDirectorySourceLocatorFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedDirectorySourceLocatorRepository' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorRepository.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedPsrAutoloaderLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedPsrAutoloaderLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedPsrAutoloaderLocatorFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedPsrAutoloaderLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedSingleFileSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedSingleFileSourceLocatorFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedSingleFileSourceLocatorRepository' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocatorRepository.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\PhpFileCleaner' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/PhpFileCleaner.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\PhpVersionBlacklistSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/PhpVersionBlacklistSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\ReflectionClassSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/ReflectionClassSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\RewriteClassAliasSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/RewriteClassAliasSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\SkipClassAliasSourceLocator' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceLocator/SkipClassAliasSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceStubber\\PhpStormStubsSourceStubberFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceStubber/PhpStormStubsSourceStubberFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceStubber\\ReflectionSourceStubberFactory' => __DIR__ . '/../..' . '/src/Reflection/BetterReflection/SourceStubber/ReflectionSourceStubberFactory.php', 'PHPStan\\Reflection\\BrokerAwareExtension' => __DIR__ . '/../..' . '/src/Reflection/BrokerAwareExtension.php', 'PHPStan\\Reflection\\CallableFunctionVariantWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/CallableFunctionVariantWithPhpDocs.php', 'PHPStan\\Reflection\\Callables\\CallableParametersAcceptor' => __DIR__ . '/../..' . '/src/Reflection/Callables/CallableParametersAcceptor.php', 'PHPStan\\Reflection\\Callables\\FunctionCallableVariant' => __DIR__ . '/../..' . '/src/Reflection/Callables/FunctionCallableVariant.php', 'PHPStan\\Reflection\\Callables\\SimpleImpurePoint' => __DIR__ . '/../..' . '/src/Reflection/Callables/SimpleImpurePoint.php', 'PHPStan\\Reflection\\Callables\\SimpleThrowPoint' => __DIR__ . '/../..' . '/src/Reflection/Callables/SimpleThrowPoint.php', 'PHPStan\\Reflection\\ClassConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/ClassConstantReflection.php', 'PHPStan\\Reflection\\ClassMemberAccessAnswerer' => __DIR__ . '/../..' . '/src/Reflection/ClassMemberAccessAnswerer.php', 'PHPStan\\Reflection\\ClassMemberReflection' => __DIR__ . '/../..' . '/src/Reflection/ClassMemberReflection.php', 'PHPStan\\Reflection\\ClassNameHelper' => __DIR__ . '/../..' . '/src/Reflection/ClassNameHelper.php', 'PHPStan\\Reflection\\ClassReflection' => __DIR__ . '/../..' . '/src/Reflection/ClassReflection.php', 'PHPStan\\Reflection\\ClassReflectionExtensionRegistry' => __DIR__ . '/../..' . '/src/Reflection/ClassReflectionExtensionRegistry.php', 'PHPStan\\Reflection\\ConstantNameHelper' => __DIR__ . '/../..' . '/src/Reflection/ConstantNameHelper.php', 'PHPStan\\Reflection\\ConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/ConstantReflection.php', 'PHPStan\\Reflection\\Constant\\RuntimeConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/Constant/RuntimeConstantReflection.php', 'PHPStan\\Reflection\\ConstructorsHelper' => __DIR__ . '/../..' . '/src/Reflection/ConstructorsHelper.php', 'PHPStan\\Reflection\\Dummy\\ChangedTypeMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/ChangedTypeMethodReflection.php', 'PHPStan\\Reflection\\Dummy\\ChangedTypePropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/ChangedTypePropertyReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyConstantReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyConstructorReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyConstructorReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyMethodReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Dummy/DummyPropertyReflection.php', 'PHPStan\\Reflection\\EnumCaseReflection' => __DIR__ . '/../..' . '/src/Reflection/EnumCaseReflection.php', 'PHPStan\\Reflection\\ExtendedMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/ExtendedMethodReflection.php', 'PHPStan\\Reflection\\ExtendedPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/ExtendedPropertyReflection.php', 'PHPStan\\Reflection\\FunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/FunctionReflection.php', 'PHPStan\\Reflection\\FunctionReflectionFactory' => __DIR__ . '/../..' . '/src/Reflection/FunctionReflectionFactory.php', 'PHPStan\\Reflection\\FunctionVariant' => __DIR__ . '/../..' . '/src/Reflection/FunctionVariant.php', 'PHPStan\\Reflection\\FunctionVariantWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/FunctionVariantWithPhpDocs.php', 'PHPStan\\Reflection\\GenericParametersAcceptorResolver' => __DIR__ . '/../..' . '/src/Reflection/GenericParametersAcceptorResolver.php', 'PHPStan\\Reflection\\GlobalConstantReflection' => __DIR__ . '/../..' . '/src/Reflection/GlobalConstantReflection.php', 'PHPStan\\Reflection\\InaccessibleMethod' => __DIR__ . '/../..' . '/src/Reflection/InaccessibleMethod.php', 'PHPStan\\Reflection\\InitializerExprContext' => __DIR__ . '/../..' . '/src/Reflection/InitializerExprContext.php', 'PHPStan\\Reflection\\InitializerExprTypeResolver' => __DIR__ . '/../..' . '/src/Reflection/InitializerExprTypeResolver.php', 'PHPStan\\Reflection\\MethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/MethodPrototypeReflection.php', 'PHPStan\\Reflection\\MethodReflection' => __DIR__ . '/../..' . '/src/Reflection/MethodReflection.php', 'PHPStan\\Reflection\\MethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/MethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\MissingConstantFromReflectionException' => __DIR__ . '/../..' . '/src/Reflection/MissingConstantFromReflectionException.php', 'PHPStan\\Reflection\\MissingMethodFromReflectionException' => __DIR__ . '/../..' . '/src/Reflection/MissingMethodFromReflectionException.php', 'PHPStan\\Reflection\\MissingPropertyFromReflectionException' => __DIR__ . '/../..' . '/src/Reflection/MissingPropertyFromReflectionException.php', 'PHPStan\\Reflection\\Mixin\\MixinMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Mixin/MixinMethodReflection.php', 'PHPStan\\Reflection\\Mixin\\MixinMethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Mixin/MixinMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\Mixin\\MixinPropertiesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Mixin/MixinPropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\NamespaceAnswerer' => __DIR__ . '/../..' . '/src/Reflection/NamespaceAnswerer.php', 'PHPStan\\Reflection\\Native\\NativeFunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeFunctionReflection.php', 'PHPStan\\Reflection\\Native\\NativeMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeMethodReflection.php', 'PHPStan\\Reflection\\Native\\NativeParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeParameterReflection.php', 'PHPStan\\Reflection\\Native\\NativeParameterWithPhpDocsReflection' => __DIR__ . '/../..' . '/src/Reflection/Native/NativeParameterWithPhpDocsReflection.php', 'PHPStan\\Reflection\\PHPStan\\NativeReflectionEnumReturnDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Reflection/PHPStan/NativeReflectionEnumReturnDynamicReturnTypeExtension.php', 'PHPStan\\Reflection\\ParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/ParameterReflection.php', 'PHPStan\\Reflection\\ParameterReflectionWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/ParameterReflectionWithPhpDocs.php', 'PHPStan\\Reflection\\ParametersAcceptor' => __DIR__ . '/../..' . '/src/Reflection/ParametersAcceptor.php', 'PHPStan\\Reflection\\ParametersAcceptorSelector' => __DIR__ . '/../..' . '/src/Reflection/ParametersAcceptorSelector.php', 'PHPStan\\Reflection\\ParametersAcceptorWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/ParametersAcceptorWithPhpDocs.php', 'PHPStan\\Reflection\\PassedByReference' => __DIR__ . '/../..' . '/src/Reflection/PassedByReference.php', 'PHPStan\\Reflection\\PhpVersionStaticAccessor' => __DIR__ . '/../..' . '/src/Reflection/PhpVersionStaticAccessor.php', 'PHPStan\\Reflection\\Php\\BuiltinMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/BuiltinMethodReflection.php', 'PHPStan\\Reflection\\Php\\ClosureCallMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/ClosureCallMethodReflection.php', 'PHPStan\\Reflection\\Php\\ClosureCallUnresolvedMethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/ClosureCallUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Php\\DummyParameter' => __DIR__ . '/../..' . '/src/Reflection/Php/DummyParameter.php', 'PHPStan\\Reflection\\Php\\DummyParameterWithPhpDocs' => __DIR__ . '/../..' . '/src/Reflection/Php/DummyParameterWithPhpDocs.php', 'PHPStan\\Reflection\\Php\\EnumAllowedSubTypesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Php/EnumAllowedSubTypesClassReflectionExtension.php', 'PHPStan\\Reflection\\Php\\EnumCasesMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/EnumCasesMethodReflection.php', 'PHPStan\\Reflection\\Php\\EnumPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/EnumPropertyReflection.php', 'PHPStan\\Reflection\\Php\\EnumUnresolvedPropertyPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/EnumUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Php\\ExitFunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/ExitFunctionReflection.php', 'PHPStan\\Reflection\\Php\\NativeBuiltinMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/NativeBuiltinMethodReflection.php', 'PHPStan\\Reflection\\Php\\PhpClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpClassReflectionExtension.php', 'PHPStan\\Reflection\\Php\\PhpFunctionFromParserNodeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpFunctionFromParserNodeReflection.php', 'PHPStan\\Reflection\\Php\\PhpFunctionReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpFunctionReflection.php', 'PHPStan\\Reflection\\Php\\PhpMethodFromParserNodeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpMethodFromParserNodeReflection.php', 'PHPStan\\Reflection\\Php\\PhpMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpMethodReflection.php', 'PHPStan\\Reflection\\Php\\PhpMethodReflectionFactory' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpMethodReflectionFactory.php', 'PHPStan\\Reflection\\Php\\PhpParameterFromParserNodeReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpParameterFromParserNodeReflection.php', 'PHPStan\\Reflection\\Php\\PhpParameterReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpParameterReflection.php', 'PHPStan\\Reflection\\Php\\PhpPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/PhpPropertyReflection.php', 'PHPStan\\Reflection\\Php\\SimpleXMLElementProperty' => __DIR__ . '/../..' . '/src/Reflection/Php/SimpleXMLElementProperty.php', 'PHPStan\\Reflection\\Php\\Soap\\SoapClientMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Php/Soap/SoapClientMethodReflection.php', 'PHPStan\\Reflection\\Php\\Soap\\SoapClientMethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Php/Soap/SoapClientMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\Php\\UniversalObjectCrateProperty' => __DIR__ . '/../..' . '/src/Reflection/Php/UniversalObjectCrateProperty.php', 'PHPStan\\Reflection\\Php\\UniversalObjectCratesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php', 'PHPStan\\Reflection\\PropertiesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/PropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\PropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/PropertyReflection.php', 'PHPStan\\Reflection\\ReflectionProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider.php', 'PHPStan\\Reflection\\ReflectionProviderStaticAccessor' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProviderStaticAccessor.php', 'PHPStan\\Reflection\\ReflectionProvider\\DirectReflectionProviderProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/DirectReflectionProviderProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\DummyReflectionProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/DummyReflectionProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\LazyReflectionProviderProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/LazyReflectionProviderProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\MemoizingReflectionProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/MemoizingReflectionProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\ReflectionProviderFactory' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/ReflectionProviderFactory.php', 'PHPStan\\Reflection\\ReflectionProvider\\ReflectionProviderProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/ReflectionProviderProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\SetterReflectionProviderProvider' => __DIR__ . '/../..' . '/src/Reflection/ReflectionProvider/SetterReflectionProviderProvider.php', 'PHPStan\\Reflection\\RequireExtension\\RequireExtendsMethodsClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/RequireExtension/RequireExtendsMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\RequireExtension\\RequireExtendsPropertiesClassReflectionExtension' => __DIR__ . '/../..' . '/src/Reflection/RequireExtension/RequireExtendsPropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\ResolvedFunctionVariant' => __DIR__ . '/../..' . '/src/Reflection/ResolvedFunctionVariant.php', 'PHPStan\\Reflection\\ResolvedFunctionVariantWithCallable' => __DIR__ . '/../..' . '/src/Reflection/ResolvedFunctionVariantWithCallable.php', 'PHPStan\\Reflection\\ResolvedFunctionVariantWithOriginal' => __DIR__ . '/../..' . '/src/Reflection/ResolvedFunctionVariantWithOriginal.php', 'PHPStan\\Reflection\\ResolvedMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/ResolvedMethodReflection.php', 'PHPStan\\Reflection\\ResolvedPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/ResolvedPropertyReflection.php', 'PHPStan\\Reflection\\SignatureMap\\FunctionSignature' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/FunctionSignature.php', 'PHPStan\\Reflection\\SignatureMap\\FunctionSignatureMapProvider' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/FunctionSignatureMapProvider.php', 'PHPStan\\Reflection\\SignatureMap\\NativeFunctionReflectionProvider' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/NativeFunctionReflectionProvider.php', 'PHPStan\\Reflection\\SignatureMap\\ParameterSignature' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/ParameterSignature.php', 'PHPStan\\Reflection\\SignatureMap\\Php8SignatureMapProvider' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/Php8SignatureMapProvider.php', 'PHPStan\\Reflection\\SignatureMap\\SignatureMapParser' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/SignatureMapParser.php', 'PHPStan\\Reflection\\SignatureMap\\SignatureMapProvider' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/SignatureMapProvider.php', 'PHPStan\\Reflection\\SignatureMap\\SignatureMapProviderFactory' => __DIR__ . '/../..' . '/src/Reflection/SignatureMap/SignatureMapProviderFactory.php', 'PHPStan\\Reflection\\TrivialParametersAcceptor' => __DIR__ . '/../..' . '/src/Reflection/TrivialParametersAcceptor.php', 'PHPStan\\Reflection\\Type\\CallbackUnresolvedMethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/CallbackUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\CallbackUnresolvedPropertyPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/CallbackUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\CalledOnTypeUnresolvedMethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/CalledOnTypeUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\CalledOnTypeUnresolvedPropertyPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/CalledOnTypeUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypeMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/IntersectionTypeMethodReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypePropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/IntersectionTypePropertyReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypeUnresolvedMethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/IntersectionTypeUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypeUnresolvedPropertyPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/IntersectionTypeUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypeMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/UnionTypeMethodReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypePropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/UnionTypePropertyReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypeUnresolvedMethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/UnionTypeUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypeUnresolvedPropertyPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/UnionTypeUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnresolvedMethodPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/UnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnresolvedPropertyPrototypeReflection' => __DIR__ . '/../..' . '/src/Reflection/Type/UnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\WrappedExtendedMethodReflection' => __DIR__ . '/../..' . '/src/Reflection/WrappedExtendedMethodReflection.php', 'PHPStan\\Reflection\\WrappedExtendedPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/WrappedExtendedPropertyReflection.php', 'PHPStan\\Reflection\\WrapperPropertyReflection' => __DIR__ . '/../..' . '/src/Reflection/WrapperPropertyReflection.php', 'PHPStan\\Rules\\Api\\ApiClassConstFetchRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiClassConstFetchRule.php', 'PHPStan\\Rules\\Api\\ApiClassExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiClassExtendsRule.php', 'PHPStan\\Rules\\Api\\ApiClassImplementsRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiClassImplementsRule.php', 'PHPStan\\Rules\\Api\\ApiInstanceofRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiInstanceofRule.php', 'PHPStan\\Rules\\Api\\ApiInstanceofTypeRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiInstanceofTypeRule.php', 'PHPStan\\Rules\\Api\\ApiInstantiationRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiInstantiationRule.php', 'PHPStan\\Rules\\Api\\ApiInterfaceExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiInterfaceExtendsRule.php', 'PHPStan\\Rules\\Api\\ApiMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiMethodCallRule.php', 'PHPStan\\Rules\\Api\\ApiRuleHelper' => __DIR__ . '/../..' . '/src/Rules/Api/ApiRuleHelper.php', 'PHPStan\\Rules\\Api\\ApiStaticCallRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiStaticCallRule.php', 'PHPStan\\Rules\\Api\\ApiTraitUseRule' => __DIR__ . '/../..' . '/src/Rules/Api/ApiTraitUseRule.php', 'PHPStan\\Rules\\Api\\BcUncoveredInterface' => __DIR__ . '/../..' . '/src/Rules/Api/BcUncoveredInterface.php', 'PHPStan\\Rules\\Api\\GetTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Api/GetTemplateTypeRule.php', 'PHPStan\\Rules\\Api\\NodeConnectingVisitorAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Api/NodeConnectingVisitorAttributesRule.php', 'PHPStan\\Rules\\Api\\PhpStanNamespaceIn3rdPartyPackageRule' => __DIR__ . '/../..' . '/src/Rules/Api/PhpStanNamespaceIn3rdPartyPackageRule.php', 'PHPStan\\Rules\\Api\\RuntimeReflectionFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Api/RuntimeReflectionFunctionRule.php', 'PHPStan\\Rules\\Api\\RuntimeReflectionInstantiationRule' => __DIR__ . '/../..' . '/src/Rules/Api/RuntimeReflectionInstantiationRule.php', 'PHPStan\\Rules\\Arrays\\AllowedArrayKeysTypes' => __DIR__ . '/../..' . '/src/Rules/Arrays/AllowedArrayKeysTypes.php', 'PHPStan\\Rules\\Arrays\\AppendedArrayItemTypeRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/AppendedArrayItemTypeRule.php', 'PHPStan\\Rules\\Arrays\\AppendedArrayKeyTypeRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/AppendedArrayKeyTypeRule.php', 'PHPStan\\Rules\\Arrays\\ArrayDestructuringRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/ArrayDestructuringRule.php', 'PHPStan\\Rules\\Arrays\\ArrayUnpackingRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/ArrayUnpackingRule.php', 'PHPStan\\Rules\\Arrays\\DeadForeachRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/DeadForeachRule.php', 'PHPStan\\Rules\\Arrays\\DuplicateKeysInLiteralArraysRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/DuplicateKeysInLiteralArraysRule.php', 'PHPStan\\Rules\\Arrays\\EmptyArrayItemRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/EmptyArrayItemRule.php', 'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayDimFetchRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php', 'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayItemRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/InvalidKeyInArrayItemRule.php', 'PHPStan\\Rules\\Arrays\\IterableInForeachRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/IterableInForeachRule.php', 'PHPStan\\Rules\\Arrays\\NonexistentOffsetInArrayDimFetchCheck' => __DIR__ . '/../..' . '/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.php', 'PHPStan\\Rules\\Arrays\\NonexistentOffsetInArrayDimFetchRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessAssignOpRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessAssignOpRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessAssignmentRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessAssignmentRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessValueAssignmentRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessValueAssignmentRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessWithoutDimForReadingRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/OffsetAccessWithoutDimForReadingRule.php', 'PHPStan\\Rules\\Arrays\\UnpackIterableInArrayRule' => __DIR__ . '/../..' . '/src/Rules/Arrays/UnpackIterableInArrayRule.php', 'PHPStan\\Rules\\AttributesCheck' => __DIR__ . '/../..' . '/src/Rules/AttributesCheck.php', 'PHPStan\\Rules\\Cast\\EchoRule' => __DIR__ . '/../..' . '/src/Rules/Cast/EchoRule.php', 'PHPStan\\Rules\\Cast\\InvalidCastRule' => __DIR__ . '/../..' . '/src/Rules/Cast/InvalidCastRule.php', 'PHPStan\\Rules\\Cast\\InvalidPartOfEncapsedStringRule' => __DIR__ . '/../..' . '/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php', 'PHPStan\\Rules\\Cast\\PrintRule' => __DIR__ . '/../..' . '/src/Rules/Cast/PrintRule.php', 'PHPStan\\Rules\\Cast\\UnsetCastRule' => __DIR__ . '/../..' . '/src/Rules/Cast/UnsetCastRule.php', 'PHPStan\\Rules\\ClassCaseSensitivityCheck' => __DIR__ . '/../..' . '/src/Rules/ClassCaseSensitivityCheck.php', 'PHPStan\\Rules\\ClassForbiddenNameCheck' => __DIR__ . '/../..' . '/src/Rules/ClassForbiddenNameCheck.php', 'PHPStan\\Rules\\ClassNameCheck' => __DIR__ . '/../..' . '/src/Rules/ClassNameCheck.php', 'PHPStan\\Rules\\ClassNameNodePair' => __DIR__ . '/../..' . '/src/Rules/ClassNameNodePair.php', 'PHPStan\\Rules\\Classes\\AccessPrivateConstantThroughStaticRule' => __DIR__ . '/../..' . '/src/Rules/Classes/AccessPrivateConstantThroughStaticRule.php', 'PHPStan\\Rules\\Classes\\AllowedSubTypesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/AllowedSubTypesRule.php', 'PHPStan\\Rules\\Classes\\ClassAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ClassAttributesRule.php', 'PHPStan\\Rules\\Classes\\ClassConstantAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ClassConstantAttributesRule.php', 'PHPStan\\Rules\\Classes\\ClassConstantRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ClassConstantRule.php', 'PHPStan\\Rules\\Classes\\DuplicateClassDeclarationRule' => __DIR__ . '/../..' . '/src/Rules/Classes/DuplicateClassDeclarationRule.php', 'PHPStan\\Rules\\Classes\\DuplicateDeclarationRule' => __DIR__ . '/../..' . '/src/Rules/Classes/DuplicateDeclarationRule.php', 'PHPStan\\Rules\\Classes\\EnumSanityRule' => __DIR__ . '/../..' . '/src/Rules/Classes/EnumSanityRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassInClassExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassInClassExtendsRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassInInstanceOfRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassInInstanceOfRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassInTraitUseRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassInTraitUseRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassesInClassImplementsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassesInClassImplementsRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassesInEnumImplementsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassesInEnumImplementsRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassesInInterfaceExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ExistingClassesInInterfaceExtendsRule.php', 'PHPStan\\Rules\\Classes\\ImpossibleInstanceOfRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ImpossibleInstanceOfRule.php', 'PHPStan\\Rules\\Classes\\InstantiationCallableRule' => __DIR__ . '/../..' . '/src/Rules/Classes/InstantiationCallableRule.php', 'PHPStan\\Rules\\Classes\\InstantiationRule' => __DIR__ . '/../..' . '/src/Rules/Classes/InstantiationRule.php', 'PHPStan\\Rules\\Classes\\InvalidPromotedPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/InvalidPromotedPropertiesRule.php', 'PHPStan\\Rules\\Classes\\LocalTypeAliasesCheck' => __DIR__ . '/../..' . '/src/Rules/Classes/LocalTypeAliasesCheck.php', 'PHPStan\\Rules\\Classes\\LocalTypeAliasesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/LocalTypeAliasesRule.php', 'PHPStan\\Rules\\Classes\\LocalTypeTraitAliasesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/LocalTypeTraitAliasesRule.php', 'PHPStan\\Rules\\Classes\\LocalTypeTraitUseAliasesRule' => __DIR__ . '/../..' . '/src/Rules/Classes/LocalTypeTraitUseAliasesRule.php', 'PHPStan\\Rules\\Classes\\MethodTagCheck' => __DIR__ . '/../..' . '/src/Rules/Classes/MethodTagCheck.php', 'PHPStan\\Rules\\Classes\\MethodTagRule' => __DIR__ . '/../..' . '/src/Rules/Classes/MethodTagRule.php', 'PHPStan\\Rules\\Classes\\MethodTagTraitRule' => __DIR__ . '/../..' . '/src/Rules/Classes/MethodTagTraitRule.php', 'PHPStan\\Rules\\Classes\\MethodTagTraitUseRule' => __DIR__ . '/../..' . '/src/Rules/Classes/MethodTagTraitUseRule.php', 'PHPStan\\Rules\\Classes\\MixinCheck' => __DIR__ . '/../..' . '/src/Rules/Classes/MixinCheck.php', 'PHPStan\\Rules\\Classes\\MixinRule' => __DIR__ . '/../..' . '/src/Rules/Classes/MixinRule.php', 'PHPStan\\Rules\\Classes\\MixinTraitRule' => __DIR__ . '/../..' . '/src/Rules/Classes/MixinTraitRule.php', 'PHPStan\\Rules\\Classes\\MixinTraitUseRule' => __DIR__ . '/../..' . '/src/Rules/Classes/MixinTraitUseRule.php', 'PHPStan\\Rules\\Classes\\NewStaticRule' => __DIR__ . '/../..' . '/src/Rules/Classes/NewStaticRule.php', 'PHPStan\\Rules\\Classes\\NonClassAttributeClassRule' => __DIR__ . '/../..' . '/src/Rules/Classes/NonClassAttributeClassRule.php', 'PHPStan\\Rules\\Classes\\PropertyTagCheck' => __DIR__ . '/../..' . '/src/Rules/Classes/PropertyTagCheck.php', 'PHPStan\\Rules\\Classes\\PropertyTagRule' => __DIR__ . '/../..' . '/src/Rules/Classes/PropertyTagRule.php', 'PHPStan\\Rules\\Classes\\PropertyTagTraitRule' => __DIR__ . '/../..' . '/src/Rules/Classes/PropertyTagTraitRule.php', 'PHPStan\\Rules\\Classes\\PropertyTagTraitUseRule' => __DIR__ . '/../..' . '/src/Rules/Classes/PropertyTagTraitUseRule.php', 'PHPStan\\Rules\\Classes\\ReadOnlyClassRule' => __DIR__ . '/../..' . '/src/Rules/Classes/ReadOnlyClassRule.php', 'PHPStan\\Rules\\Classes\\RequireExtendsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/RequireExtendsRule.php', 'PHPStan\\Rules\\Classes\\RequireImplementsRule' => __DIR__ . '/../..' . '/src/Rules/Classes/RequireImplementsRule.php', 'PHPStan\\Rules\\Classes\\TraitAttributeClassRule' => __DIR__ . '/../..' . '/src/Rules/Classes/TraitAttributeClassRule.php', 'PHPStan\\Rules\\Classes\\UnusedConstructorParametersRule' => __DIR__ . '/../..' . '/src/Rules/Classes/UnusedConstructorParametersRule.php', 'PHPStan\\Rules\\Comparison\\BooleanAndConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/BooleanAndConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\BooleanNotConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/BooleanNotConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\BooleanOrConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/BooleanOrConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\ConstantConditionRuleHelper' => __DIR__ . '/../..' . '/src/Rules/Comparison/ConstantConditionRuleHelper.php', 'PHPStan\\Rules\\Comparison\\ConstantLooseComparisonRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ConstantLooseComparisonRule.php', 'PHPStan\\Rules\\Comparison\\DoWhileLoopConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/DoWhileLoopConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\ElseIfConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ElseIfConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\IfConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/IfConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeFunctionCallRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeFunctionCallRule.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeHelper' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeHelper.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeMethodCallRule.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeStaticMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/ImpossibleCheckTypeStaticMethodCallRule.php', 'PHPStan\\Rules\\Comparison\\LogicalXorConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/LogicalXorConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\MatchExpressionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/MatchExpressionRule.php', 'PHPStan\\Rules\\Comparison\\NumberComparisonOperatorsConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/NumberComparisonOperatorsConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\StrictComparisonOfDifferentTypesRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php', 'PHPStan\\Rules\\Comparison\\TernaryOperatorConstantConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/TernaryOperatorConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\UnreachableIfBranchesRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/UnreachableIfBranchesRule.php', 'PHPStan\\Rules\\Comparison\\UnreachableTernaryElseBranchRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/UnreachableTernaryElseBranchRule.php', 'PHPStan\\Rules\\Comparison\\UsageOfVoidMatchExpressionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/UsageOfVoidMatchExpressionRule.php', 'PHPStan\\Rules\\Comparison\\WhileLoopAlwaysFalseConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/WhileLoopAlwaysFalseConditionRule.php', 'PHPStan\\Rules\\Comparison\\WhileLoopAlwaysTrueConditionRule' => __DIR__ . '/../..' . '/src/Rules/Comparison/WhileLoopAlwaysTrueConditionRule.php', 'PHPStan\\Rules\\Constants\\AlwaysUsedClassConstantsExtension' => __DIR__ . '/../..' . '/src/Rules/Constants/AlwaysUsedClassConstantsExtension.php', 'PHPStan\\Rules\\Constants\\AlwaysUsedClassConstantsExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Constants/AlwaysUsedClassConstantsExtensionProvider.php', 'PHPStan\\Rules\\Constants\\ClassAsClassConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/ClassAsClassConstantRule.php', 'PHPStan\\Rules\\Constants\\ConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/ConstantRule.php', 'PHPStan\\Rules\\Constants\\DynamicClassConstantFetchRule' => __DIR__ . '/../..' . '/src/Rules/Constants/DynamicClassConstantFetchRule.php', 'PHPStan\\Rules\\Constants\\FinalConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/FinalConstantRule.php', 'PHPStan\\Rules\\Constants\\LazyAlwaysUsedClassConstantsExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Constants/LazyAlwaysUsedClassConstantsExtensionProvider.php', 'PHPStan\\Rules\\Constants\\MagicConstantContextRule' => __DIR__ . '/../..' . '/src/Rules/Constants/MagicConstantContextRule.php', 'PHPStan\\Rules\\Constants\\MissingClassConstantTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Constants/MissingClassConstantTypehintRule.php', 'PHPStan\\Rules\\Constants\\NativeTypedClassConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/NativeTypedClassConstantRule.php', 'PHPStan\\Rules\\Constants\\OverridingConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/OverridingConstantRule.php', 'PHPStan\\Rules\\Constants\\ValueAssignedToClassConstantRule' => __DIR__ . '/../..' . '/src/Rules/Constants/ValueAssignedToClassConstantRule.php', 'PHPStan\\Rules\\DateTimeInstantiationRule' => __DIR__ . '/../..' . '/src/Rules/DateTimeInstantiationRule.php', 'PHPStan\\Rules\\DeadCode\\BetterNoopRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/BetterNoopRule.php', 'PHPStan\\Rules\\DeadCode\\CallToConstructorStatementWithoutImpurePointsRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/CallToConstructorStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\CallToFunctionStatementWithoutImpurePointsRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/CallToFunctionStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\CallToMethodStatementWithoutImpurePointsRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/CallToMethodStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\CallToStaticMethodStatementWithoutImpurePointsRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/CallToStaticMethodStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\ConstructorWithoutImpurePointsCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/ConstructorWithoutImpurePointsCollector.php', 'PHPStan\\Rules\\DeadCode\\FunctionWithoutImpurePointsCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/FunctionWithoutImpurePointsCollector.php', 'PHPStan\\Rules\\DeadCode\\MethodWithoutImpurePointsCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/MethodWithoutImpurePointsCollector.php', 'PHPStan\\Rules\\DeadCode\\NoopRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/NoopRule.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureFuncCallCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/PossiblyPureFuncCallCollector.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureMethodCallCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/PossiblyPureMethodCallCollector.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureNewCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/PossiblyPureNewCollector.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureStaticCallCollector' => __DIR__ . '/../..' . '/src/Rules/DeadCode/PossiblyPureStaticCallCollector.php', 'PHPStan\\Rules\\DeadCode\\UnreachableStatementRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/UnreachableStatementRule.php', 'PHPStan\\Rules\\DeadCode\\UnusedPrivateConstantRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/UnusedPrivateConstantRule.php', 'PHPStan\\Rules\\DeadCode\\UnusedPrivateMethodRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/UnusedPrivateMethodRule.php', 'PHPStan\\Rules\\DeadCode\\UnusedPrivatePropertyRule' => __DIR__ . '/../..' . '/src/Rules/DeadCode/UnusedPrivatePropertyRule.php', 'PHPStan\\Rules\\Debug\\DebugScopeRule' => __DIR__ . '/../..' . '/src/Rules/Debug/DebugScopeRule.php', 'PHPStan\\Rules\\Debug\\DumpPhpDocTypeRule' => __DIR__ . '/../..' . '/src/Rules/Debug/DumpPhpDocTypeRule.php', 'PHPStan\\Rules\\Debug\\DumpTypeRule' => __DIR__ . '/../..' . '/src/Rules/Debug/DumpTypeRule.php', 'PHPStan\\Rules\\Debug\\FileAssertRule' => __DIR__ . '/../..' . '/src/Rules/Debug/FileAssertRule.php', 'PHPStan\\Rules\\DirectRegistry' => __DIR__ . '/../..' . '/src/Rules/DirectRegistry.php', 'PHPStan\\Rules\\EnumCases\\EnumCaseAttributesRule' => __DIR__ . '/../..' . '/src/Rules/EnumCases/EnumCaseAttributesRule.php', 'PHPStan\\Rules\\Exceptions\\CatchWithUnthrownExceptionRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/CatchWithUnthrownExceptionRule.php', 'PHPStan\\Rules\\Exceptions\\CaughtExceptionExistenceRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/CaughtExceptionExistenceRule.php', 'PHPStan\\Rules\\Exceptions\\DefaultExceptionTypeResolver' => __DIR__ . '/../..' . '/src/Rules/Exceptions/DefaultExceptionTypeResolver.php', 'PHPStan\\Rules\\Exceptions\\ExceptionTypeResolver' => __DIR__ . '/../..' . '/src/Rules/Exceptions/ExceptionTypeResolver.php', 'PHPStan\\Rules\\Exceptions\\MissingCheckedExceptionInFunctionThrowsRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/MissingCheckedExceptionInFunctionThrowsRule.php', 'PHPStan\\Rules\\Exceptions\\MissingCheckedExceptionInMethodThrowsRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/MissingCheckedExceptionInMethodThrowsRule.php', 'PHPStan\\Rules\\Exceptions\\MissingCheckedExceptionInThrowsCheck' => __DIR__ . '/../..' . '/src/Rules/Exceptions/MissingCheckedExceptionInThrowsCheck.php', 'PHPStan\\Rules\\Exceptions\\NoncapturingCatchRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/NoncapturingCatchRule.php', 'PHPStan\\Rules\\Exceptions\\OverwrittenExitPointByFinallyRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/OverwrittenExitPointByFinallyRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowExprTypeRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/ThrowExprTypeRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowExpressionRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/ThrowExpressionRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowsVoidFunctionWithExplicitThrowPointRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/ThrowsVoidFunctionWithExplicitThrowPointRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowsVoidMethodWithExplicitThrowPointRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/ThrowsVoidMethodWithExplicitThrowPointRule.php', 'PHPStan\\Rules\\Exceptions\\TooWideFunctionThrowTypeRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/TooWideFunctionThrowTypeRule.php', 'PHPStan\\Rules\\Exceptions\\TooWideMethodThrowTypeRule' => __DIR__ . '/../..' . '/src/Rules/Exceptions/TooWideMethodThrowTypeRule.php', 'PHPStan\\Rules\\Exceptions\\TooWideThrowTypeCheck' => __DIR__ . '/../..' . '/src/Rules/Exceptions/TooWideThrowTypeCheck.php', 'PHPStan\\Rules\\FileRuleError' => __DIR__ . '/../..' . '/src/Rules/FileRuleError.php', 'PHPStan\\Rules\\FoundTypeResult' => __DIR__ . '/../..' . '/src/Rules/FoundTypeResult.php', 'PHPStan\\Rules\\FunctionCallParametersCheck' => __DIR__ . '/../..' . '/src/Rules/FunctionCallParametersCheck.php', 'PHPStan\\Rules\\FunctionDefinitionCheck' => __DIR__ . '/../..' . '/src/Rules/FunctionDefinitionCheck.php', 'PHPStan\\Rules\\FunctionReturnTypeCheck' => __DIR__ . '/../..' . '/src/Rules/FunctionReturnTypeCheck.php', 'PHPStan\\Rules\\Functions\\ArrayFilterRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ArrayFilterRule.php', 'PHPStan\\Rules\\Functions\\ArrayValuesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ArrayValuesRule.php', 'PHPStan\\Rules\\Functions\\ArrowFunctionAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ArrowFunctionAttributesRule.php', 'PHPStan\\Rules\\Functions\\ArrowFunctionReturnNullsafeByRefRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ArrowFunctionReturnNullsafeByRefRule.php', 'PHPStan\\Rules\\Functions\\ArrowFunctionReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ArrowFunctionReturnTypeRule.php', 'PHPStan\\Rules\\Functions\\CallCallablesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallCallablesRule.php', 'PHPStan\\Rules\\Functions\\CallToFunctionParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallToFunctionParametersRule.php', 'PHPStan\\Rules\\Functions\\CallToFunctionStatementWithoutSideEffectsRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Functions\\CallToNonExistentFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallToNonExistentFunctionRule.php', 'PHPStan\\Rules\\Functions\\CallUserFuncRule' => __DIR__ . '/../..' . '/src/Rules/Functions/CallUserFuncRule.php', 'PHPStan\\Rules\\Functions\\ClosureAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ClosureAttributesRule.php', 'PHPStan\\Rules\\Functions\\ClosureReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ClosureReturnTypeRule.php', 'PHPStan\\Rules\\Functions\\DefineParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/DefineParametersRule.php', 'PHPStan\\Rules\\Functions\\DuplicateFunctionDeclarationRule' => __DIR__ . '/../..' . '/src/Rules/Functions/DuplicateFunctionDeclarationRule.php', 'PHPStan\\Rules\\Functions\\ExistingClassesInArrowFunctionTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRule.php', 'PHPStan\\Rules\\Functions\\ExistingClassesInClosureTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ExistingClassesInClosureTypehintsRule.php', 'PHPStan\\Rules\\Functions\\ExistingClassesInTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ExistingClassesInTypehintsRule.php', 'PHPStan\\Rules\\Functions\\FunctionAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/FunctionAttributesRule.php', 'PHPStan\\Rules\\Functions\\FunctionCallableRule' => __DIR__ . '/../..' . '/src/Rules/Functions/FunctionCallableRule.php', 'PHPStan\\Rules\\Functions\\ImplodeFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ImplodeFunctionRule.php', 'PHPStan\\Rules\\Functions\\ImplodeParameterCastableToStringRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ImplodeParameterCastableToStringRule.php', 'PHPStan\\Rules\\Functions\\IncompatibleArrowFunctionDefaultParameterTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/IncompatibleArrowFunctionDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Functions\\IncompatibleClosureDefaultParameterTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/IncompatibleClosureDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Functions\\IncompatibleDefaultParameterTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/IncompatibleDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Functions\\InnerFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Functions/InnerFunctionRule.php', 'PHPStan\\Rules\\Functions\\InvalidLexicalVariablesInClosureUseRule' => __DIR__ . '/../..' . '/src/Rules/Functions/InvalidLexicalVariablesInClosureUseRule.php', 'PHPStan\\Rules\\Functions\\MissingFunctionParameterTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Functions/MissingFunctionParameterTypehintRule.php', 'PHPStan\\Rules\\Functions\\MissingFunctionReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Functions/MissingFunctionReturnTypehintRule.php', 'PHPStan\\Rules\\Functions\\ParamAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ParamAttributesRule.php', 'PHPStan\\Rules\\Functions\\ParameterCastableToStringRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ParameterCastableToStringRule.php', 'PHPStan\\Rules\\Functions\\PrintfArrayParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/PrintfArrayParametersRule.php', 'PHPStan\\Rules\\Functions\\PrintfHelper' => __DIR__ . '/../..' . '/src/Rules/Functions/PrintfHelper.php', 'PHPStan\\Rules\\Functions\\PrintfParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/PrintfParametersRule.php', 'PHPStan\\Rules\\Functions\\RandomIntParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/RandomIntParametersRule.php', 'PHPStan\\Rules\\Functions\\RedefinedParametersRule' => __DIR__ . '/../..' . '/src/Rules/Functions/RedefinedParametersRule.php', 'PHPStan\\Rules\\Functions\\ReturnNullsafeByRefRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ReturnNullsafeByRefRule.php', 'PHPStan\\Rules\\Functions\\ReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Functions/ReturnTypeRule.php', 'PHPStan\\Rules\\Functions\\SortParameterCastableToStringRule' => __DIR__ . '/../..' . '/src/Rules/Functions/SortParameterCastableToStringRule.php', 'PHPStan\\Rules\\Functions\\UnusedClosureUsesRule' => __DIR__ . '/../..' . '/src/Rules/Functions/UnusedClosureUsesRule.php', 'PHPStan\\Rules\\Functions\\UselessFunctionReturnValueRule' => __DIR__ . '/../..' . '/src/Rules/Functions/UselessFunctionReturnValueRule.php', 'PHPStan\\Rules\\Functions\\VariadicParametersDeclarationRule' => __DIR__ . '/../..' . '/src/Rules/Functions/VariadicParametersDeclarationRule.php', 'PHPStan\\Rules\\Generators\\YieldFromTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generators/YieldFromTypeRule.php', 'PHPStan\\Rules\\Generators\\YieldInGeneratorRule' => __DIR__ . '/../..' . '/src/Rules/Generators/YieldInGeneratorRule.php', 'PHPStan\\Rules\\Generators\\YieldTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generators/YieldTypeRule.php', 'PHPStan\\Rules\\Generics\\ClassAncestorsRule' => __DIR__ . '/../..' . '/src/Rules/Generics/ClassAncestorsRule.php', 'PHPStan\\Rules\\Generics\\ClassTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/ClassTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\CrossCheckInterfacesHelper' => __DIR__ . '/../..' . '/src/Rules/Generics/CrossCheckInterfacesHelper.php', 'PHPStan\\Rules\\Generics\\EnumAncestorsRule' => __DIR__ . '/../..' . '/src/Rules/Generics/EnumAncestorsRule.php', 'PHPStan\\Rules\\Generics\\EnumTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/EnumTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\FunctionSignatureVarianceRule' => __DIR__ . '/../..' . '/src/Rules/Generics/FunctionSignatureVarianceRule.php', 'PHPStan\\Rules\\Generics\\FunctionTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/FunctionTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\GenericAncestorsCheck' => __DIR__ . '/../..' . '/src/Rules/Generics/GenericAncestorsCheck.php', 'PHPStan\\Rules\\Generics\\GenericObjectTypeCheck' => __DIR__ . '/../..' . '/src/Rules/Generics/GenericObjectTypeCheck.php', 'PHPStan\\Rules\\Generics\\InterfaceAncestorsRule' => __DIR__ . '/../..' . '/src/Rules/Generics/InterfaceAncestorsRule.php', 'PHPStan\\Rules\\Generics\\InterfaceTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/InterfaceTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\MethodSignatureVarianceRule' => __DIR__ . '/../..' . '/src/Rules/Generics/MethodSignatureVarianceRule.php', 'PHPStan\\Rules\\Generics\\MethodTagTemplateTypeCheck' => __DIR__ . '/../..' . '/src/Rules/Generics/MethodTagTemplateTypeCheck.php', 'PHPStan\\Rules\\Generics\\MethodTagTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/MethodTagTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\MethodTagTemplateTypeTraitRule' => __DIR__ . '/../..' . '/src/Rules/Generics/MethodTagTemplateTypeTraitRule.php', 'PHPStan\\Rules\\Generics\\MethodTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/MethodTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\PropertyVarianceRule' => __DIR__ . '/../..' . '/src/Rules/Generics/PropertyVarianceRule.php', 'PHPStan\\Rules\\Generics\\TemplateTypeCheck' => __DIR__ . '/../..' . '/src/Rules/Generics/TemplateTypeCheck.php', 'PHPStan\\Rules\\Generics\\TraitTemplateTypeRule' => __DIR__ . '/../..' . '/src/Rules/Generics/TraitTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\UsedTraitsRule' => __DIR__ . '/../..' . '/src/Rules/Generics/UsedTraitsRule.php', 'PHPStan\\Rules\\Generics\\VarianceCheck' => __DIR__ . '/../..' . '/src/Rules/Generics/VarianceCheck.php', 'PHPStan\\Rules\\IdentifierRuleError' => __DIR__ . '/../..' . '/src/Rules/IdentifierRuleError.php', 'PHPStan\\Rules\\Ignore\\IgnoreParseErrorRule' => __DIR__ . '/../..' . '/src/Rules/Ignore/IgnoreParseErrorRule.php', 'PHPStan\\Rules\\IssetCheck' => __DIR__ . '/../..' . '/src/Rules/IssetCheck.php', 'PHPStan\\Rules\\Keywords\\ContinueBreakInLoopRule' => __DIR__ . '/../..' . '/src/Rules/Keywords/ContinueBreakInLoopRule.php', 'PHPStan\\Rules\\Keywords\\DeclareStrictTypesRule' => __DIR__ . '/../..' . '/src/Rules/Keywords/DeclareStrictTypesRule.php', 'PHPStan\\Rules\\Keywords\\RequireFileExistsRule' => __DIR__ . '/../..' . '/src/Rules/Keywords/RequireFileExistsRule.php', 'PHPStan\\Rules\\LazyRegistry' => __DIR__ . '/../..' . '/src/Rules/LazyRegistry.php', 'PHPStan\\Rules\\LineRuleError' => __DIR__ . '/../..' . '/src/Rules/LineRuleError.php', 'PHPStan\\Rules\\MetadataRuleError' => __DIR__ . '/../..' . '/src/Rules/MetadataRuleError.php', 'PHPStan\\Rules\\Methods\\AbstractMethodInNonAbstractClassRule' => __DIR__ . '/../..' . '/src/Rules/Methods/AbstractMethodInNonAbstractClassRule.php', 'PHPStan\\Rules\\Methods\\AbstractPrivateMethodRule' => __DIR__ . '/../..' . '/src/Rules/Methods/AbstractPrivateMethodRule.php', 'PHPStan\\Rules\\Methods\\AlwaysUsedMethodExtension' => __DIR__ . '/../..' . '/src/Rules/Methods/AlwaysUsedMethodExtension.php', 'PHPStan\\Rules\\Methods\\AlwaysUsedMethodExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Methods/AlwaysUsedMethodExtensionProvider.php', 'PHPStan\\Rules\\Methods\\CallMethodsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallMethodsRule.php', 'PHPStan\\Rules\\Methods\\CallPrivateMethodThroughStaticRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallPrivateMethodThroughStaticRule.php', 'PHPStan\\Rules\\Methods\\CallStaticMethodsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallStaticMethodsRule.php', 'PHPStan\\Rules\\Methods\\CallToConstructorStatementWithoutSideEffectsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallToConstructorStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Methods\\CallToMethodStatementWithoutSideEffectsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Methods\\CallToStaticMethodStatementWithoutSideEffectsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Methods\\ConsistentConstructorRule' => __DIR__ . '/../..' . '/src/Rules/Methods/ConsistentConstructorRule.php', 'PHPStan\\Rules\\Methods\\ConstructorReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Methods/ConstructorReturnTypeRule.php', 'PHPStan\\Rules\\Methods\\DirectAlwaysUsedMethodExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Methods/DirectAlwaysUsedMethodExtensionProvider.php', 'PHPStan\\Rules\\Methods\\ExistingClassesInTypehintsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/ExistingClassesInTypehintsRule.php', 'PHPStan\\Rules\\Methods\\FinalPrivateMethodRule' => __DIR__ . '/../..' . '/src/Rules/Methods/FinalPrivateMethodRule.php', 'PHPStan\\Rules\\Methods\\IllegalConstructorMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Methods/IllegalConstructorMethodCallRule.php', 'PHPStan\\Rules\\Methods\\IllegalConstructorStaticCallRule' => __DIR__ . '/../..' . '/src/Rules/Methods/IllegalConstructorStaticCallRule.php', 'PHPStan\\Rules\\Methods\\IncompatibleDefaultParameterTypeRule' => __DIR__ . '/../..' . '/src/Rules/Methods/IncompatibleDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Methods\\LazyAlwaysUsedMethodExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Methods/LazyAlwaysUsedMethodExtensionProvider.php', 'PHPStan\\Rules\\Methods\\MethodAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodAttributesRule.php', 'PHPStan\\Rules\\Methods\\MethodCallCheck' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodCallCheck.php', 'PHPStan\\Rules\\Methods\\MethodCallableRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodCallableRule.php', 'PHPStan\\Rules\\Methods\\MethodParameterComparisonHelper' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodParameterComparisonHelper.php', 'PHPStan\\Rules\\Methods\\MethodSignatureRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodSignatureRule.php', 'PHPStan\\Rules\\Methods\\MethodVisibilityInInterfaceRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MethodVisibilityInInterfaceRule.php', 'PHPStan\\Rules\\Methods\\MissingMagicSerializationMethodsRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MissingMagicSerializationMethodsRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodImplementationRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MissingMethodImplementationRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodParameterTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MissingMethodParameterTypehintRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MissingMethodReturnTypehintRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodSelfOutTypeRule' => __DIR__ . '/../..' . '/src/Rules/Methods/MissingMethodSelfOutTypeRule.php', 'PHPStan\\Rules\\Methods\\NullsafeMethodCallRule' => __DIR__ . '/../..' . '/src/Rules/Methods/NullsafeMethodCallRule.php', 'PHPStan\\Rules\\Methods\\OverridingMethodRule' => __DIR__ . '/../..' . '/src/Rules/Methods/OverridingMethodRule.php', 'PHPStan\\Rules\\Methods\\ReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/Methods/ReturnTypeRule.php', 'PHPStan\\Rules\\Methods\\StaticMethodCallCheck' => __DIR__ . '/../..' . '/src/Rules/Methods/StaticMethodCallCheck.php', 'PHPStan\\Rules\\Methods\\StaticMethodCallableRule' => __DIR__ . '/../..' . '/src/Rules/Methods/StaticMethodCallableRule.php', 'PHPStan\\Rules\\MissingTypehintCheck' => __DIR__ . '/../..' . '/src/Rules/MissingTypehintCheck.php', 'PHPStan\\Rules\\Missing\\MissingReturnRule' => __DIR__ . '/../..' . '/src/Rules/Missing/MissingReturnRule.php', 'PHPStan\\Rules\\Names\\UsedNamesRule' => __DIR__ . '/../..' . '/src/Rules/Names/UsedNamesRule.php', 'PHPStan\\Rules\\Namespaces\\ExistingNamesInGroupUseRule' => __DIR__ . '/../..' . '/src/Rules/Namespaces/ExistingNamesInGroupUseRule.php', 'PHPStan\\Rules\\Namespaces\\ExistingNamesInUseRule' => __DIR__ . '/../..' . '/src/Rules/Namespaces/ExistingNamesInUseRule.php', 'PHPStan\\Rules\\NonIgnorableRuleError' => __DIR__ . '/../..' . '/src/Rules/NonIgnorableRuleError.php', 'PHPStan\\Rules\\NullsafeCheck' => __DIR__ . '/../..' . '/src/Rules/NullsafeCheck.php', 'PHPStan\\Rules\\Operators\\InvalidAssignVarRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidAssignVarRule.php', 'PHPStan\\Rules\\Operators\\InvalidBinaryOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidBinaryOperationRule.php', 'PHPStan\\Rules\\Operators\\InvalidComparisonOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidComparisonOperationRule.php', 'PHPStan\\Rules\\Operators\\InvalidIncDecOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidIncDecOperationRule.php', 'PHPStan\\Rules\\Operators\\InvalidUnaryOperationRule' => __DIR__ . '/../..' . '/src/Rules/Operators/InvalidUnaryOperationRule.php', 'PHPStan\\Rules\\ParameterCastableToStringCheck' => __DIR__ . '/../..' . '/src/Rules/ParameterCastableToStringCheck.php', 'PHPStan\\Rules\\PhpDoc\\AssertRuleHelper' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/AssertRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\ConditionalReturnTypeRuleHelper' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/ConditionalReturnTypeRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\FunctionAssertRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/FunctionAssertRule.php', 'PHPStan\\Rules\\PhpDoc\\FunctionConditionalReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/FunctionConditionalReturnTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\GenericCallableRuleHelper' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/GenericCallableRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\IncompatibleClassConstantPhpDocTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatibleClassConstantPhpDocTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatibleParamImmediatelyInvokedCallableRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatibleParamImmediatelyInvokedCallableRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatiblePhpDocTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatiblePhpDocTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatiblePropertyPhpDocTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatibleSelfOutTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/IncompatibleSelfOutTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidPHPStanDocTagRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/InvalidPHPStanDocTagRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidPhpDocTagValueRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/InvalidPhpDocTagValueRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidPhpDocVarTagTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/InvalidPhpDocVarTagTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidThrowsPhpDocValueRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/InvalidThrowsPhpDocValueRule.php', 'PHPStan\\Rules\\PhpDoc\\MethodAssertRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/MethodAssertRule.php', 'PHPStan\\Rules\\PhpDoc\\MethodConditionalReturnTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/MethodConditionalReturnTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\PhpDocLineHelper' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/PhpDocLineHelper.php', 'PHPStan\\Rules\\PhpDoc\\RequireExtendsCheck' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/RequireExtendsCheck.php', 'PHPStan\\Rules\\PhpDoc\\RequireExtendsDefinitionClassRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/RequireExtendsDefinitionClassRule.php', 'PHPStan\\Rules\\PhpDoc\\RequireExtendsDefinitionTraitRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/RequireExtendsDefinitionTraitRule.php', 'PHPStan\\Rules\\PhpDoc\\RequireImplementsDefinitionClassRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/RequireImplementsDefinitionClassRule.php', 'PHPStan\\Rules\\PhpDoc\\RequireImplementsDefinitionTraitRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php', 'PHPStan\\Rules\\PhpDoc\\UnresolvableTypeHelper' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/UnresolvableTypeHelper.php', 'PHPStan\\Rules\\PhpDoc\\VarTagChangedExpressionTypeRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/VarTagChangedExpressionTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\VarTagTypeRuleHelper' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/VarTagTypeRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\WrongVariableNameInVarTagRule' => __DIR__ . '/../..' . '/src/Rules/PhpDoc/WrongVariableNameInVarTagRule.php', 'PHPStan\\Rules\\Playground\\FunctionNeverRule' => __DIR__ . '/../..' . '/src/Rules/Playground/FunctionNeverRule.php', 'PHPStan\\Rules\\Playground\\MethodNeverRule' => __DIR__ . '/../..' . '/src/Rules/Playground/MethodNeverRule.php', 'PHPStan\\Rules\\Playground\\NeverRuleHelper' => __DIR__ . '/../..' . '/src/Rules/Playground/NeverRuleHelper.php', 'PHPStan\\Rules\\Playground\\NoPhpCodeRule' => __DIR__ . '/../..' . '/src/Rules/Playground/NoPhpCodeRule.php', 'PHPStan\\Rules\\Playground\\NotAnalysedTraitRule' => __DIR__ . '/../..' . '/src/Rules/Playground/NotAnalysedTraitRule.php', 'PHPStan\\Rules\\Properties\\AccessPrivatePropertyThroughStaticRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessPrivatePropertyThroughStaticRule.php', 'PHPStan\\Rules\\Properties\\AccessPropertiesInAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessPropertiesInAssignRule.php', 'PHPStan\\Rules\\Properties\\AccessPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessPropertiesRule.php', 'PHPStan\\Rules\\Properties\\AccessStaticPropertiesInAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessStaticPropertiesInAssignRule.php', 'PHPStan\\Rules\\Properties\\AccessStaticPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/AccessStaticPropertiesRule.php', 'PHPStan\\Rules\\Properties\\DefaultValueTypesAssignedToPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/DefaultValueTypesAssignedToPropertiesRule.php', 'PHPStan\\Rules\\Properties\\DirectReadWritePropertiesExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Properties/DirectReadWritePropertiesExtensionProvider.php', 'PHPStan\\Rules\\Properties\\ExistingClassesInPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ExistingClassesInPropertiesRule.php', 'PHPStan\\Rules\\Properties\\FoundPropertyReflection' => __DIR__ . '/../..' . '/src/Rules/Properties/FoundPropertyReflection.php', 'PHPStan\\Rules\\Properties\\InvalidCallablePropertyTypeRule' => __DIR__ . '/../..' . '/src/Rules/Properties/InvalidCallablePropertyTypeRule.php', 'PHPStan\\Rules\\Properties\\LazyReadWritePropertiesExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Properties/LazyReadWritePropertiesExtensionProvider.php', 'PHPStan\\Rules\\Properties\\MissingPropertyTypehintRule' => __DIR__ . '/../..' . '/src/Rules/Properties/MissingPropertyTypehintRule.php', 'PHPStan\\Rules\\Properties\\MissingReadOnlyByPhpDocPropertyAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/MissingReadOnlyByPhpDocPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\MissingReadOnlyPropertyAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/MissingReadOnlyPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\NullsafePropertyFetchRule' => __DIR__ . '/../..' . '/src/Rules/Properties/NullsafePropertyFetchRule.php', 'PHPStan\\Rules\\Properties\\OverridingPropertyRule' => __DIR__ . '/../..' . '/src/Rules/Properties/OverridingPropertyRule.php', 'PHPStan\\Rules\\Properties\\PropertiesInInterfaceRule' => __DIR__ . '/../..' . '/src/Rules/Properties/PropertiesInInterfaceRule.php', 'PHPStan\\Rules\\Properties\\PropertyAttributesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/PropertyAttributesRule.php', 'PHPStan\\Rules\\Properties\\PropertyDescriptor' => __DIR__ . '/../..' . '/src/Rules/Properties/PropertyDescriptor.php', 'PHPStan\\Rules\\Properties\\PropertyReflectionFinder' => __DIR__ . '/../..' . '/src/Rules/Properties/PropertyReflectionFinder.php', 'PHPStan\\Rules\\Properties\\ReadOnlyByPhpDocPropertyAssignRefRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadOnlyByPhpDocPropertyAssignRefRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyByPhpDocPropertyAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadOnlyByPhpDocPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyByPhpDocPropertyRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadOnlyByPhpDocPropertyRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyPropertyAssignRefRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadOnlyPropertyAssignRefRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyPropertyAssignRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadOnlyPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyPropertyRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadOnlyPropertyRule.php', 'PHPStan\\Rules\\Properties\\ReadWritePropertiesExtension' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadWritePropertiesExtension.php', 'PHPStan\\Rules\\Properties\\ReadWritePropertiesExtensionProvider' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadWritePropertiesExtensionProvider.php', 'PHPStan\\Rules\\Properties\\ReadingWriteOnlyPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/ReadingWriteOnlyPropertiesRule.php', 'PHPStan\\Rules\\Properties\\TypesAssignedToPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/TypesAssignedToPropertiesRule.php', 'PHPStan\\Rules\\Properties\\UninitializedPropertyRule' => __DIR__ . '/../..' . '/src/Rules/Properties/UninitializedPropertyRule.php', 'PHPStan\\Rules\\Properties\\WritingToReadOnlyPropertiesRule' => __DIR__ . '/../..' . '/src/Rules/Properties/WritingToReadOnlyPropertiesRule.php', 'PHPStan\\Rules\\Pure\\FunctionPurityCheck' => __DIR__ . '/../..' . '/src/Rules/Pure/FunctionPurityCheck.php', 'PHPStan\\Rules\\Pure\\PureFunctionRule' => __DIR__ . '/../..' . '/src/Rules/Pure/PureFunctionRule.php', 'PHPStan\\Rules\\Pure\\PureMethodRule' => __DIR__ . '/../..' . '/src/Rules/Pure/PureMethodRule.php', 'PHPStan\\Rules\\Regexp\\RegularExpressionPatternRule' => __DIR__ . '/../..' . '/src/Rules/Regexp/RegularExpressionPatternRule.php', 'PHPStan\\Rules\\Regexp\\RegularExpressionQuotingRule' => __DIR__ . '/../..' . '/src/Rules/Regexp/RegularExpressionQuotingRule.php', 'PHPStan\\Rules\\Registry' => __DIR__ . '/../..' . '/src/Rules/Registry.php', 'PHPStan\\Rules\\Rule' => __DIR__ . '/../..' . '/src/Rules/Rule.php', 'PHPStan\\Rules\\RuleError' => __DIR__ . '/../..' . '/src/Rules/RuleError.php', 'PHPStan\\Rules\\RuleErrorBuilder' => __DIR__ . '/../..' . '/src/Rules/RuleErrorBuilder.php', 'PHPStan\\Rules\\RuleErrors\\RuleError1' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError1.php', 'PHPStan\\Rules\\RuleErrors\\RuleError101' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError101.php', 'PHPStan\\Rules\\RuleErrors\\RuleError103' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError103.php', 'PHPStan\\Rules\\RuleErrors\\RuleError105' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError105.php', 'PHPStan\\Rules\\RuleErrors\\RuleError107' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError107.php', 'PHPStan\\Rules\\RuleErrors\\RuleError109' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError109.php', 'PHPStan\\Rules\\RuleErrors\\RuleError11' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError11.php', 'PHPStan\\Rules\\RuleErrors\\RuleError111' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError111.php', 'PHPStan\\Rules\\RuleErrors\\RuleError113' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError113.php', 'PHPStan\\Rules\\RuleErrors\\RuleError115' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError115.php', 'PHPStan\\Rules\\RuleErrors\\RuleError117' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError117.php', 'PHPStan\\Rules\\RuleErrors\\RuleError119' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError119.php', 'PHPStan\\Rules\\RuleErrors\\RuleError121' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError121.php', 'PHPStan\\Rules\\RuleErrors\\RuleError123' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError123.php', 'PHPStan\\Rules\\RuleErrors\\RuleError125' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError125.php', 'PHPStan\\Rules\\RuleErrors\\RuleError127' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError127.php', 'PHPStan\\Rules\\RuleErrors\\RuleError13' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError13.php', 'PHPStan\\Rules\\RuleErrors\\RuleError15' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError15.php', 'PHPStan\\Rules\\RuleErrors\\RuleError17' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError17.php', 'PHPStan\\Rules\\RuleErrors\\RuleError19' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError19.php', 'PHPStan\\Rules\\RuleErrors\\RuleError21' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError21.php', 'PHPStan\\Rules\\RuleErrors\\RuleError23' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError23.php', 'PHPStan\\Rules\\RuleErrors\\RuleError25' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError25.php', 'PHPStan\\Rules\\RuleErrors\\RuleError27' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError27.php', 'PHPStan\\Rules\\RuleErrors\\RuleError29' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError29.php', 'PHPStan\\Rules\\RuleErrors\\RuleError3' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError3.php', 'PHPStan\\Rules\\RuleErrors\\RuleError31' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError31.php', 'PHPStan\\Rules\\RuleErrors\\RuleError33' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError33.php', 'PHPStan\\Rules\\RuleErrors\\RuleError35' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError35.php', 'PHPStan\\Rules\\RuleErrors\\RuleError37' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError37.php', 'PHPStan\\Rules\\RuleErrors\\RuleError39' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError39.php', 'PHPStan\\Rules\\RuleErrors\\RuleError41' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError41.php', 'PHPStan\\Rules\\RuleErrors\\RuleError43' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError43.php', 'PHPStan\\Rules\\RuleErrors\\RuleError45' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError45.php', 'PHPStan\\Rules\\RuleErrors\\RuleError47' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError47.php', 'PHPStan\\Rules\\RuleErrors\\RuleError49' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError49.php', 'PHPStan\\Rules\\RuleErrors\\RuleError5' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError5.php', 'PHPStan\\Rules\\RuleErrors\\RuleError51' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError51.php', 'PHPStan\\Rules\\RuleErrors\\RuleError53' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError53.php', 'PHPStan\\Rules\\RuleErrors\\RuleError55' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError55.php', 'PHPStan\\Rules\\RuleErrors\\RuleError57' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError57.php', 'PHPStan\\Rules\\RuleErrors\\RuleError59' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError59.php', 'PHPStan\\Rules\\RuleErrors\\RuleError61' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError61.php', 'PHPStan\\Rules\\RuleErrors\\RuleError63' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError63.php', 'PHPStan\\Rules\\RuleErrors\\RuleError65' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError65.php', 'PHPStan\\Rules\\RuleErrors\\RuleError67' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError67.php', 'PHPStan\\Rules\\RuleErrors\\RuleError69' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError69.php', 'PHPStan\\Rules\\RuleErrors\\RuleError7' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError7.php', 'PHPStan\\Rules\\RuleErrors\\RuleError71' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError71.php', 'PHPStan\\Rules\\RuleErrors\\RuleError73' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError73.php', 'PHPStan\\Rules\\RuleErrors\\RuleError75' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError75.php', 'PHPStan\\Rules\\RuleErrors\\RuleError77' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError77.php', 'PHPStan\\Rules\\RuleErrors\\RuleError79' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError79.php', 'PHPStan\\Rules\\RuleErrors\\RuleError81' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError81.php', 'PHPStan\\Rules\\RuleErrors\\RuleError83' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError83.php', 'PHPStan\\Rules\\RuleErrors\\RuleError85' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError85.php', 'PHPStan\\Rules\\RuleErrors\\RuleError87' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError87.php', 'PHPStan\\Rules\\RuleErrors\\RuleError89' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError89.php', 'PHPStan\\Rules\\RuleErrors\\RuleError9' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError9.php', 'PHPStan\\Rules\\RuleErrors\\RuleError91' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError91.php', 'PHPStan\\Rules\\RuleErrors\\RuleError93' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError93.php', 'PHPStan\\Rules\\RuleErrors\\RuleError95' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError95.php', 'PHPStan\\Rules\\RuleErrors\\RuleError97' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError97.php', 'PHPStan\\Rules\\RuleErrors\\RuleError99' => __DIR__ . '/../..' . '/src/Rules/RuleErrors/RuleError99.php', 'PHPStan\\Rules\\RuleLevelHelper' => __DIR__ . '/../..' . '/src/Rules/RuleLevelHelper.php', 'PHPStan\\Rules\\RuleLevelHelperAcceptsResult' => __DIR__ . '/../..' . '/src/Rules/RuleLevelHelperAcceptsResult.php', 'PHPStan\\Rules\\TipRuleError' => __DIR__ . '/../..' . '/src/Rules/TipRuleError.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideArrowFunctionReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideArrowFunctionReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideClosureReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideClosureReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideFunctionParameterOutTypeRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideFunctionParameterOutTypeRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideFunctionReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideFunctionReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideMethodParameterOutTypeRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideMethodParameterOutTypeRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideMethodReturnTypehintRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideMethodReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideParameterOutTypeCheck' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWideParameterOutTypeCheck.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWidePropertyTypeRule' => __DIR__ . '/../..' . '/src/Rules/TooWideTypehints/TooWidePropertyTypeRule.php', 'PHPStan\\Rules\\Traits\\ConflictingTraitConstantsRule' => __DIR__ . '/../..' . '/src/Rules/Traits/ConflictingTraitConstantsRule.php', 'PHPStan\\Rules\\Traits\\ConstantsInTraitsRule' => __DIR__ . '/../..' . '/src/Rules/Traits/ConstantsInTraitsRule.php', 'PHPStan\\Rules\\Traits\\NotAnalysedTraitRule' => __DIR__ . '/../..' . '/src/Rules/Traits/NotAnalysedTraitRule.php', 'PHPStan\\Rules\\Traits\\TraitDeclarationCollector' => __DIR__ . '/../..' . '/src/Rules/Traits/TraitDeclarationCollector.php', 'PHPStan\\Rules\\Traits\\TraitUseCollector' => __DIR__ . '/../..' . '/src/Rules/Traits/TraitUseCollector.php', 'PHPStan\\Rules\\Types\\InvalidTypesInUnionRule' => __DIR__ . '/../..' . '/src/Rules/Types/InvalidTypesInUnionRule.php', 'PHPStan\\Rules\\UnusedFunctionParametersCheck' => __DIR__ . '/../..' . '/src/Rules/UnusedFunctionParametersCheck.php', 'PHPStan\\Rules\\Variables\\CompactVariablesRule' => __DIR__ . '/../..' . '/src/Rules/Variables/CompactVariablesRule.php', 'PHPStan\\Rules\\Variables\\DefinedVariableRule' => __DIR__ . '/../..' . '/src/Rules/Variables/DefinedVariableRule.php', 'PHPStan\\Rules\\Variables\\EmptyRule' => __DIR__ . '/../..' . '/src/Rules/Variables/EmptyRule.php', 'PHPStan\\Rules\\Variables\\IssetRule' => __DIR__ . '/../..' . '/src/Rules/Variables/IssetRule.php', 'PHPStan\\Rules\\Variables\\NullCoalesceRule' => __DIR__ . '/../..' . '/src/Rules/Variables/NullCoalesceRule.php', 'PHPStan\\Rules\\Variables\\ParameterOutAssignedTypeRule' => __DIR__ . '/../..' . '/src/Rules/Variables/ParameterOutAssignedTypeRule.php', 'PHPStan\\Rules\\Variables\\ParameterOutExecutionEndTypeRule' => __DIR__ . '/../..' . '/src/Rules/Variables/ParameterOutExecutionEndTypeRule.php', 'PHPStan\\Rules\\Variables\\ThrowTypeRule' => __DIR__ . '/../..' . '/src/Rules/Variables/ThrowTypeRule.php', 'PHPStan\\Rules\\Variables\\UnsetRule' => __DIR__ . '/../..' . '/src/Rules/Variables/UnsetRule.php', 'PHPStan\\Rules\\Variables\\VariableCloningRule' => __DIR__ . '/../..' . '/src/Rules/Variables/VariableCloningRule.php', 'PHPStan\\Rules\\Whitespace\\FileWhitespaceRule' => __DIR__ . '/../..' . '/src/Rules/Whitespace/FileWhitespaceRule.php', 'PHPStan\\ShouldNotHappenException' => __DIR__ . '/../..' . '/src/ShouldNotHappenException.php', 'PHPStan\\Testing\\ErrorFormatterTestCase' => __DIR__ . '/../..' . '/src/Testing/ErrorFormatterTestCase.php', 'PHPStan\\Testing\\LevelsTestCase' => __DIR__ . '/../..' . '/src/Testing/LevelsTestCase.php', 'PHPStan\\Testing\\PHPStanTestCase' => __DIR__ . '/../..' . '/src/Testing/PHPStanTestCase.php', 'PHPStan\\Testing\\RuleTestCase' => __DIR__ . '/../..' . '/src/Testing/RuleTestCase.php', 'PHPStan\\Testing\\TestCaseSourceLocatorFactory' => __DIR__ . '/../..' . '/src/Testing/TestCaseSourceLocatorFactory.php', 'PHPStan\\Testing\\TypeInferenceTestCase' => __DIR__ . '/../..' . '/src/Testing/TypeInferenceTestCase.php', 'PHPStan\\TrinaryLogic' => __DIR__ . '/../..' . '/src/TrinaryLogic.php', 'PHPStan\\Type\\AcceptsResult' => __DIR__ . '/../..' . '/src/Type/AcceptsResult.php', 'PHPStan\\Type\\Accessory\\AccessoryArrayListType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryArrayListType.php', 'PHPStan\\Type\\Accessory\\AccessoryLiteralStringType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryLiteralStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryLowercaseStringType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryLowercaseStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryNonEmptyStringType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryNonEmptyStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryNonFalsyStringType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryNonFalsyStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryNumericStringType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryNumericStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryType.php', 'PHPStan\\Type\\Accessory\\AccessoryUppercaseStringType' => __DIR__ . '/../..' . '/src/Type/Accessory/AccessoryUppercaseStringType.php', 'PHPStan\\Type\\Accessory\\HasMethodType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasMethodType.php', 'PHPStan\\Type\\Accessory\\HasOffsetType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasOffsetType.php', 'PHPStan\\Type\\Accessory\\HasOffsetValueType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasOffsetValueType.php', 'PHPStan\\Type\\Accessory\\HasPropertyType' => __DIR__ . '/../..' . '/src/Type/Accessory/HasPropertyType.php', 'PHPStan\\Type\\Accessory\\NonEmptyArrayType' => __DIR__ . '/../..' . '/src/Type/Accessory/NonEmptyArrayType.php', 'PHPStan\\Type\\Accessory\\OversizedArrayType' => __DIR__ . '/../..' . '/src/Type/Accessory/OversizedArrayType.php', 'PHPStan\\Type\\ArrayType' => __DIR__ . '/../..' . '/src/Type/ArrayType.php', 'PHPStan\\Type\\BenevolentUnionType' => __DIR__ . '/../..' . '/src/Type/BenevolentUnionType.php', 'PHPStan\\Type\\BitwiseFlagHelper' => __DIR__ . '/../..' . '/src/Type/BitwiseFlagHelper.php', 'PHPStan\\Type\\BooleanType' => __DIR__ . '/../..' . '/src/Type/BooleanType.php', 'PHPStan\\Type\\CallableType' => __DIR__ . '/../..' . '/src/Type/CallableType.php', 'PHPStan\\Type\\CallableTypeHelper' => __DIR__ . '/../..' . '/src/Type/CallableTypeHelper.php', 'PHPStan\\Type\\CircularTypeAliasDefinitionException' => __DIR__ . '/../..' . '/src/Type/CircularTypeAliasDefinitionException.php', 'PHPStan\\Type\\CircularTypeAliasErrorType' => __DIR__ . '/../..' . '/src/Type/CircularTypeAliasErrorType.php', 'PHPStan\\Type\\ClassStringType' => __DIR__ . '/../..' . '/src/Type/ClassStringType.php', 'PHPStan\\Type\\ClosureType' => __DIR__ . '/../..' . '/src/Type/ClosureType.php', 'PHPStan\\Type\\ClosureTypeFactory' => __DIR__ . '/../..' . '/src/Type/ClosureTypeFactory.php', 'PHPStan\\Type\\CompoundType' => __DIR__ . '/../..' . '/src/Type/CompoundType.php', 'PHPStan\\Type\\ConditionalType' => __DIR__ . '/../..' . '/src/Type/ConditionalType.php', 'PHPStan\\Type\\ConditionalTypeForParameter' => __DIR__ . '/../..' . '/src/Type/ConditionalTypeForParameter.php', 'PHPStan\\Type\\ConstantScalarType' => __DIR__ . '/../..' . '/src/Type/ConstantScalarType.php', 'PHPStan\\Type\\ConstantType' => __DIR__ . '/../..' . '/src/Type/ConstantType.php', 'PHPStan\\Type\\ConstantTypeHelper' => __DIR__ . '/../..' . '/src/Type/ConstantTypeHelper.php', 'PHPStan\\Type\\Constant\\ConstantArrayType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantArrayType.php', 'PHPStan\\Type\\Constant\\ConstantArrayTypeAndMethod' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantArrayTypeAndMethod.php', 'PHPStan\\Type\\Constant\\ConstantArrayTypeBuilder' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantArrayTypeBuilder.php', 'PHPStan\\Type\\Constant\\ConstantBooleanType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantBooleanType.php', 'PHPStan\\Type\\Constant\\ConstantFloatType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantFloatType.php', 'PHPStan\\Type\\Constant\\ConstantIntegerType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantIntegerType.php', 'PHPStan\\Type\\Constant\\ConstantScalarToBooleanTrait' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantScalarToBooleanTrait.php', 'PHPStan\\Type\\Constant\\ConstantStringType' => __DIR__ . '/../..' . '/src/Type/Constant/ConstantStringType.php', 'PHPStan\\Type\\Constant\\OversizedArrayBuilder' => __DIR__ . '/../..' . '/src/Type/Constant/OversizedArrayBuilder.php', 'PHPStan\\Type\\DirectTypeAliasResolverProvider' => __DIR__ . '/../..' . '/src/Type/DirectTypeAliasResolverProvider.php', 'PHPStan\\Type\\DynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\DynamicFunctionThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicFunctionThrowTypeExtension.php', 'PHPStan\\Type\\DynamicMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicMethodReturnTypeExtension.php', 'PHPStan\\Type\\DynamicMethodThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicMethodThrowTypeExtension.php', 'PHPStan\\Type\\DynamicReturnTypeExtensionRegistry' => __DIR__ . '/../..' . '/src/Type/DynamicReturnTypeExtensionRegistry.php', 'PHPStan\\Type\\DynamicStaticMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicStaticMethodReturnTypeExtension.php', 'PHPStan\\Type\\DynamicStaticMethodThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/DynamicStaticMethodThrowTypeExtension.php', 'PHPStan\\Type\\Enum\\EnumCaseObjectType' => __DIR__ . '/../..' . '/src/Type/Enum/EnumCaseObjectType.php', 'PHPStan\\Type\\ErrorType' => __DIR__ . '/../..' . '/src/Type/ErrorType.php', 'PHPStan\\Type\\ExponentiateHelper' => __DIR__ . '/../..' . '/src/Type/ExponentiateHelper.php', 'PHPStan\\Type\\ExpressionTypeResolverExtension' => __DIR__ . '/../..' . '/src/Type/ExpressionTypeResolverExtension.php', 'PHPStan\\Type\\ExpressionTypeResolverExtensionRegistry' => __DIR__ . '/../..' . '/src/Type/ExpressionTypeResolverExtensionRegistry.php', 'PHPStan\\Type\\FileTypeMapper' => __DIR__ . '/../..' . '/src/Type/FileTypeMapper.php', 'PHPStan\\Type\\FloatType' => __DIR__ . '/../..' . '/src/Type/FloatType.php', 'PHPStan\\Type\\FunctionParameterClosureTypeExtension' => __DIR__ . '/../..' . '/src/Type/FunctionParameterClosureTypeExtension.php', 'PHPStan\\Type\\FunctionParameterOutTypeExtension' => __DIR__ . '/../..' . '/src/Type/FunctionParameterOutTypeExtension.php', 'PHPStan\\Type\\FunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/FunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\GeneralizePrecision' => __DIR__ . '/../..' . '/src/Type/GeneralizePrecision.php', 'PHPStan\\Type\\GenericTypeVariableResolver' => __DIR__ . '/../..' . '/src/Type/GenericTypeVariableResolver.php', 'PHPStan\\Type\\Generic\\GenericClassStringType' => __DIR__ . '/../..' . '/src/Type/Generic/GenericClassStringType.php', 'PHPStan\\Type\\Generic\\GenericObjectType' => __DIR__ . '/../..' . '/src/Type/Generic/GenericObjectType.php', 'PHPStan\\Type\\Generic\\GenericStaticType' => __DIR__ . '/../..' . '/src/Type/Generic/GenericStaticType.php', 'PHPStan\\Type\\Generic\\TemplateArrayType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateArrayType.php', 'PHPStan\\Type\\Generic\\TemplateBenevolentUnionType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateBenevolentUnionType.php', 'PHPStan\\Type\\Generic\\TemplateBooleanType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateBooleanType.php', 'PHPStan\\Type\\Generic\\TemplateConstantArrayType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateConstantArrayType.php', 'PHPStan\\Type\\Generic\\TemplateConstantIntegerType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateConstantIntegerType.php', 'PHPStan\\Type\\Generic\\TemplateConstantStringType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateConstantStringType.php', 'PHPStan\\Type\\Generic\\TemplateFloatType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateFloatType.php', 'PHPStan\\Type\\Generic\\TemplateGenericObjectType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateGenericObjectType.php', 'PHPStan\\Type\\Generic\\TemplateIntegerType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateIntegerType.php', 'PHPStan\\Type\\Generic\\TemplateIntersectionType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateIntersectionType.php', 'PHPStan\\Type\\Generic\\TemplateIterableType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateIterableType.php', 'PHPStan\\Type\\Generic\\TemplateKeyOfType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateKeyOfType.php', 'PHPStan\\Type\\Generic\\TemplateMixedType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateMixedType.php', 'PHPStan\\Type\\Generic\\TemplateObjectShapeType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateObjectShapeType.php', 'PHPStan\\Type\\Generic\\TemplateObjectType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateObjectType.php', 'PHPStan\\Type\\Generic\\TemplateObjectWithoutClassType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateObjectWithoutClassType.php', 'PHPStan\\Type\\Generic\\TemplateStrictMixedType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateStrictMixedType.php', 'PHPStan\\Type\\Generic\\TemplateStringType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateStringType.php', 'PHPStan\\Type\\Generic\\TemplateType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateType.php', 'PHPStan\\Type\\Generic\\TemplateTypeArgumentStrategy' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeArgumentStrategy.php', 'PHPStan\\Type\\Generic\\TemplateTypeFactory' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeFactory.php', 'PHPStan\\Type\\Generic\\TemplateTypeHelper' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeHelper.php', 'PHPStan\\Type\\Generic\\TemplateTypeMap' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeMap.php', 'PHPStan\\Type\\Generic\\TemplateTypeParameterStrategy' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeParameterStrategy.php', 'PHPStan\\Type\\Generic\\TemplateTypeReference' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeReference.php', 'PHPStan\\Type\\Generic\\TemplateTypeScope' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeScope.php', 'PHPStan\\Type\\Generic\\TemplateTypeStrategy' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeStrategy.php', 'PHPStan\\Type\\Generic\\TemplateTypeTrait' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeTrait.php', 'PHPStan\\Type\\Generic\\TemplateTypeVariance' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeVariance.php', 'PHPStan\\Type\\Generic\\TemplateTypeVarianceMap' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateTypeVarianceMap.php', 'PHPStan\\Type\\Generic\\TemplateUnionType' => __DIR__ . '/../..' . '/src/Type/Generic/TemplateUnionType.php', 'PHPStan\\Type\\Generic\\TypeProjectionHelper' => __DIR__ . '/../..' . '/src/Type/Generic/TypeProjectionHelper.php', 'PHPStan\\Type\\Helper\\GetTemplateTypeType' => __DIR__ . '/../..' . '/src/Type/Helper/GetTemplateTypeType.php', 'PHPStan\\Type\\IntegerRangeType' => __DIR__ . '/../..' . '/src/Type/IntegerRangeType.php', 'PHPStan\\Type\\IntegerType' => __DIR__ . '/../..' . '/src/Type/IntegerType.php', 'PHPStan\\Type\\IntersectionType' => __DIR__ . '/../..' . '/src/Type/IntersectionType.php', 'PHPStan\\Type\\IsSuperTypeOfResult' => __DIR__ . '/../..' . '/src/Type/IsSuperTypeOfResult.php', 'PHPStan\\Type\\IterableType' => __DIR__ . '/../..' . '/src/Type/IterableType.php', 'PHPStan\\Type\\JustNullableTypeTrait' => __DIR__ . '/../..' . '/src/Type/JustNullableTypeTrait.php', 'PHPStan\\Type\\KeyOfType' => __DIR__ . '/../..' . '/src/Type/KeyOfType.php', 'PHPStan\\Type\\LateResolvableType' => __DIR__ . '/../..' . '/src/Type/LateResolvableType.php', 'PHPStan\\Type\\LazyTypeAliasResolverProvider' => __DIR__ . '/../..' . '/src/Type/LazyTypeAliasResolverProvider.php', 'PHPStan\\Type\\LooseComparisonHelper' => __DIR__ . '/../..' . '/src/Type/LooseComparisonHelper.php', 'PHPStan\\Type\\MethodParameterClosureTypeExtension' => __DIR__ . '/../..' . '/src/Type/MethodParameterClosureTypeExtension.php', 'PHPStan\\Type\\MethodParameterOutTypeExtension' => __DIR__ . '/../..' . '/src/Type/MethodParameterOutTypeExtension.php', 'PHPStan\\Type\\MethodTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/MethodTypeSpecifyingExtension.php', 'PHPStan\\Type\\MixedType' => __DIR__ . '/../..' . '/src/Type/MixedType.php', 'PHPStan\\Type\\NeverType' => __DIR__ . '/../..' . '/src/Type/NeverType.php', 'PHPStan\\Type\\NewObjectType' => __DIR__ . '/../..' . '/src/Type/NewObjectType.php', 'PHPStan\\Type\\NonAcceptingNeverType' => __DIR__ . '/../..' . '/src/Type/NonAcceptingNeverType.php', 'PHPStan\\Type\\NonexistentParentClassType' => __DIR__ . '/../..' . '/src/Type/NonexistentParentClassType.php', 'PHPStan\\Type\\NullType' => __DIR__ . '/../..' . '/src/Type/NullType.php', 'PHPStan\\Type\\ObjectShapePropertyReflection' => __DIR__ . '/../..' . '/src/Type/ObjectShapePropertyReflection.php', 'PHPStan\\Type\\ObjectShapeType' => __DIR__ . '/../..' . '/src/Type/ObjectShapeType.php', 'PHPStan\\Type\\ObjectType' => __DIR__ . '/../..' . '/src/Type/ObjectType.php', 'PHPStan\\Type\\ObjectWithoutClassType' => __DIR__ . '/../..' . '/src/Type/ObjectWithoutClassType.php', 'PHPStan\\Type\\OffsetAccessType' => __DIR__ . '/../..' . '/src/Type/OffsetAccessType.php', 'PHPStan\\Type\\OperatorTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/OperatorTypeSpecifyingExtension.php', 'PHPStan\\Type\\OperatorTypeSpecifyingExtensionRegistry' => __DIR__ . '/../..' . '/src/Type/OperatorTypeSpecifyingExtensionRegistry.php', 'PHPStan\\Type\\ParserNodeTypeToPHPStanType' => __DIR__ . '/../..' . '/src/Type/ParserNodeTypeToPHPStanType.php', 'PHPStan\\Type\\Php\\AbsFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/AbsFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArgumentBasedFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayChangeKeyCaseFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayChunkFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayChunkFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayColumnFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayColumnFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayCombineFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayCurrentDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayCurrentDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFillFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFillFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFillKeysFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFilterFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFilterFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFilterFunctionReturnTypeHelper' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFilterFunctionReturnTypeHelper.php', 'PHPStan\\Type\\Php\\ArrayFindFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFindFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFindKeyFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFindKeyFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFlipFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayFlipFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayIntersectKeyFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayIntersectKeyFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyExistsFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyFirstDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyFirstDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyLastDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeyLastDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeysFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayKeysFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayMapFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayMapFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayMergeFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayMergeFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayNextDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayNextDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayPointerFunctionsDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayPointerFunctionsDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayPopFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayPopFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayRandFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayRandFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayReduceFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayReduceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayReplaceFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayReplaceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayReverseFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayReverseFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySearchFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySearchFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySearchFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySearchFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ArrayShiftFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayShiftFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySliceFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySliceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySpliceFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySpliceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySumFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArraySumFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayValuesFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ArrayValuesFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\AssertFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/AssertFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\AssertThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/AssertThrowTypeExtension.php', 'PHPStan\\Type\\Php\\BackedEnumFromMethodDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/BackedEnumFromMethodDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\Base64DecodeDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/Base64DecodeDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\BcMathStringOrNullReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/BcMathStringOrNullReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClassExistsFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/ClassExistsFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ClassImplementsFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ClassImplementsFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClosureBindDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ClosureBindDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClosureBindToDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ClosureBindToDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClosureFromCallableDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ClosureFromCallableDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\CompactFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/CompactFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ConstantFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ConstantFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ConstantHelper' => __DIR__ . '/../..' . '/src/Type/Php/ConstantHelper.php', 'PHPStan\\Type\\Php\\CountFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/CountFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\CountFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/CountFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\CtypeDigitFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/CtypeDigitFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\CurlGetinfoFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/CurlGetinfoFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFormatFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateFormatFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFormatMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateFormatMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFunctionReturnTypeHelper' => __DIR__ . '/../..' . '/src/Type/Php/DateFunctionReturnTypeHelper.php', 'PHPStan\\Type\\Php\\DateIntervalConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateIntervalConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateIntervalDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateIntervalDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DatePeriodConstructorReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DatePeriodConstructorReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeCreateDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeCreateDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeModifyMethodThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeModifyMethodThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeModifyReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeModifyReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeSubMethodThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeSubMethodThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeZoneConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DateTimeZoneConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DefineConstantTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/DefineConstantTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\DefinedConstantTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/DefinedConstantTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\DioStatDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DioStatDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DsMapDynamicMethodThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DsMapDynamicMethodThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DsMapDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/DsMapDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ExplodeFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ExplodeFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FilterFunctionReturnTypeHelper' => __DIR__ . '/../..' . '/src/Type/Php/FilterFunctionReturnTypeHelper.php', 'PHPStan\\Type\\Php\\FilterInputDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/FilterInputDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FilterVarArrayDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/FilterVarArrayDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FilterVarDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/FilterVarDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FunctionExistsFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/FunctionExistsFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\GetCalledClassDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GetCalledClassDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetClassDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GetClassDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetDebugTypeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GetDebugTypeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetDefinedVarsFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GetDefinedVarsFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetParentClassDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GetParentClassDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GettimeofdayDynamicFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GettimeofdayDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GettypeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/GettypeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\HashFunctionsReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/HashFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\HighlightStringDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/HighlightStringDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\HrtimeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/HrtimeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ImplodeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ImplodeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\InArrayFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/InArrayFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IniGetReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/IniGetReturnTypeExtension.php', 'PHPStan\\Type\\Php\\IntdivThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/IntdivThrowTypeExtension.php', 'PHPStan\\Type\\Php\\IsAFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsAFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsAFunctionTypeSpecifyingHelper' => __DIR__ . '/../..' . '/src/Type/Php/IsAFunctionTypeSpecifyingHelper.php', 'PHPStan\\Type\\Php\\IsArrayFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsArrayFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsCallableFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsCallableFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsIterableFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsIterableFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsSubclassOfFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IteratorToArrayFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\JsonThrowOnErrorDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\JsonThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/JsonThrowTypeExtension.php', 'PHPStan\\Type\\Php\\LtrimFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/LtrimFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbConvertEncodingFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MbConvertEncodingFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbFunctionsReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MbFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbFunctionsReturnTypeExtensionTrait' => __DIR__ . '/../..' . '/src/Type/Php/MbFunctionsReturnTypeExtensionTrait.php', 'PHPStan\\Type\\Php\\MbStrlenFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MbStrlenFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbSubstituteCharacterDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MbSubstituteCharacterDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MethodExistsTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/MethodExistsTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\MicrotimeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MicrotimeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MinMaxFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/MinMaxFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\NonEmptyStringFunctionsReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/NonEmptyStringFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\NumberFormatFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\OpenSslEncryptParameterOutTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/OpenSslEncryptParameterOutTypeExtension.php', 'PHPStan\\Type\\Php\\ParseStrParameterOutTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ParseStrParameterOutTypeExtension.php', 'PHPStan\\Type\\Php\\ParseUrlFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ParseUrlFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PathinfoFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PowFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PowFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PregFilterFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PregFilterFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PregMatchParameterOutTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PregMatchParameterOutTypeExtension.php', 'PHPStan\\Type\\Php\\PregMatchTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/PregMatchTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\PregReplaceCallbackClosureTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PregReplaceCallbackClosureTypeExtension.php', 'PHPStan\\Type\\Php\\PregSplitDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/PregSplitDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PropertyExistsTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/PropertyExistsTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\RandomIntFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/RandomIntFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\RangeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/RangeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionClassConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReflectionClassConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionClassIsSubclassOfTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReflectionClassIsSubclassOfTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ReflectionFunctionConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReflectionFunctionConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionGetAttributesMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionMethodConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionPropertyConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReflectionPropertyConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\RegexArrayShapeMatcher' => __DIR__ . '/../..' . '/src/Type/Php/RegexArrayShapeMatcher.php', 'PHPStan\\Type\\Php\\ReplaceFunctionsDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\RoundFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/RoundFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SetTypeFunctionTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/SetTypeFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementAsXMLMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SimpleXMLElementAsXMLMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementClassPropertyReflectionExtension' => __DIR__ . '/../..' . '/src/Type/Php/SimpleXMLElementClassPropertyReflectionExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementConstructorThrowTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SimpleXMLElementConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementXpathMethodReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SimpleXMLElementXpathMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SprintfFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SprintfFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SscanfFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SscanfFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StatDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StatDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrCaseFunctionsReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrCaseFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrContainingTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrContainingTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\StrIncrementDecrementFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrIncrementDecrementFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrPadFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrPadFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrRepeatFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrRepeatFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrSplitFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrSplitFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrTokFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrTokFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrWordCountFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrWordCountFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrlenFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrlenFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrrevFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrrevFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrtotimeFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrtotimeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrvalFamilyFunctionReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SubstrDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/SubstrDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ThrowableReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/ThrowableReturnTypeExtension.php', 'PHPStan\\Type\\Php\\TriggerErrorDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/TriggerErrorDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\TrimFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/TrimFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\TypeSpecifyingFunctionsDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/TypeSpecifyingFunctionsDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\VersionCompareFunctionDynamicReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/VersionCompareFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\XMLReaderOpenReturnTypeExtension' => __DIR__ . '/../..' . '/src/Type/Php/XMLReaderOpenReturnTypeExtension.php', 'PHPStan\\Type\\RecursionGuard' => __DIR__ . '/../..' . '/src/Type/RecursionGuard.php', 'PHPStan\\Type\\Regex\\RegexAlternation' => __DIR__ . '/../..' . '/src/Type/Regex/RegexAlternation.php', 'PHPStan\\Type\\Regex\\RegexAstWalkResult' => __DIR__ . '/../..' . '/src/Type/Regex/RegexAstWalkResult.php', 'PHPStan\\Type\\Regex\\RegexCapturingGroup' => __DIR__ . '/../..' . '/src/Type/Regex/RegexCapturingGroup.php', 'PHPStan\\Type\\Regex\\RegexExpressionHelper' => __DIR__ . '/../..' . '/src/Type/Regex/RegexExpressionHelper.php', 'PHPStan\\Type\\Regex\\RegexGroupParser' => __DIR__ . '/../..' . '/src/Type/Regex/RegexGroupParser.php', 'PHPStan\\Type\\Regex\\RegexGroupWalkResult' => __DIR__ . '/../..' . '/src/Type/Regex/RegexGroupWalkResult.php', 'PHPStan\\Type\\Regex\\RegexNonCapturingGroup' => __DIR__ . '/../..' . '/src/Type/Regex/RegexNonCapturingGroup.php', 'PHPStan\\Type\\ResourceType' => __DIR__ . '/../..' . '/src/Type/ResourceType.php', 'PHPStan\\Type\\SimultaneousTypeTraverser' => __DIR__ . '/../..' . '/src/Type/SimultaneousTypeTraverser.php', 'PHPStan\\Type\\StaticMethodParameterClosureTypeExtension' => __DIR__ . '/../..' . '/src/Type/StaticMethodParameterClosureTypeExtension.php', 'PHPStan\\Type\\StaticMethodParameterOutTypeExtension' => __DIR__ . '/../..' . '/src/Type/StaticMethodParameterOutTypeExtension.php', 'PHPStan\\Type\\StaticMethodTypeSpecifyingExtension' => __DIR__ . '/../..' . '/src/Type/StaticMethodTypeSpecifyingExtension.php', 'PHPStan\\Type\\StaticType' => __DIR__ . '/../..' . '/src/Type/StaticType.php', 'PHPStan\\Type\\StaticTypeFactory' => __DIR__ . '/../..' . '/src/Type/StaticTypeFactory.php', 'PHPStan\\Type\\StrictMixedType' => __DIR__ . '/../..' . '/src/Type/StrictMixedType.php', 'PHPStan\\Type\\StringAlwaysAcceptingObjectWithToStringType' => __DIR__ . '/../..' . '/src/Type/StringAlwaysAcceptingObjectWithToStringType.php', 'PHPStan\\Type\\StringType' => __DIR__ . '/../..' . '/src/Type/StringType.php', 'PHPStan\\Type\\SubtractableType' => __DIR__ . '/../..' . '/src/Type/SubtractableType.php', 'PHPStan\\Type\\ThisType' => __DIR__ . '/../..' . '/src/Type/ThisType.php', 'PHPStan\\Type\\Traits\\ConstantNumericComparisonTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/ConstantNumericComparisonTypeTrait.php', 'PHPStan\\Type\\Traits\\ConstantScalarTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/ConstantScalarTypeTrait.php', 'PHPStan\\Type\\Traits\\FalseyBooleanTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/FalseyBooleanTypeTrait.php', 'PHPStan\\Type\\Traits\\LateResolvableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/LateResolvableTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeArrayTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeArrayTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeCallableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeCallableTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeIterableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeIterableTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeObjectTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeObjectTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeOffsetAccessibleTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/MaybeOffsetAccessibleTypeTrait.php', 'PHPStan\\Type\\Traits\\NonArrayTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonArrayTypeTrait.php', 'PHPStan\\Type\\Traits\\NonCallableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonCallableTypeTrait.php', 'PHPStan\\Type\\Traits\\NonGeneralizableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonGeneralizableTypeTrait.php', 'PHPStan\\Type\\Traits\\NonGenericTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonGenericTypeTrait.php', 'PHPStan\\Type\\Traits\\NonIterableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonIterableTypeTrait.php', 'PHPStan\\Type\\Traits\\NonObjectTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonObjectTypeTrait.php', 'PHPStan\\Type\\Traits\\NonOffsetAccessibleTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonOffsetAccessibleTypeTrait.php', 'PHPStan\\Type\\Traits\\NonRemoveableTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/NonRemoveableTypeTrait.php', 'PHPStan\\Type\\Traits\\ObjectTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/ObjectTypeTrait.php', 'PHPStan\\Type\\Traits\\TruthyBooleanTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/TruthyBooleanTypeTrait.php', 'PHPStan\\Type\\Traits\\UndecidedBooleanTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/UndecidedBooleanTypeTrait.php', 'PHPStan\\Type\\Traits\\UndecidedComparisonCompoundTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/UndecidedComparisonCompoundTypeTrait.php', 'PHPStan\\Type\\Traits\\UndecidedComparisonTypeTrait' => __DIR__ . '/../..' . '/src/Type/Traits/UndecidedComparisonTypeTrait.php', 'PHPStan\\Type\\Type' => __DIR__ . '/../..' . '/src/Type/Type.php', 'PHPStan\\Type\\TypeAlias' => __DIR__ . '/../..' . '/src/Type/TypeAlias.php', 'PHPStan\\Type\\TypeAliasResolver' => __DIR__ . '/../..' . '/src/Type/TypeAliasResolver.php', 'PHPStan\\Type\\TypeAliasResolverProvider' => __DIR__ . '/../..' . '/src/Type/TypeAliasResolverProvider.php', 'PHPStan\\Type\\TypeCombinator' => __DIR__ . '/../..' . '/src/Type/TypeCombinator.php', 'PHPStan\\Type\\TypeResult' => __DIR__ . '/../..' . '/src/Type/TypeResult.php', 'PHPStan\\Type\\TypeTraverser' => __DIR__ . '/../..' . '/src/Type/TypeTraverser.php', 'PHPStan\\Type\\TypeUtils' => __DIR__ . '/../..' . '/src/Type/TypeUtils.php', 'PHPStan\\Type\\TypeWithClassName' => __DIR__ . '/../..' . '/src/Type/TypeWithClassName.php', 'PHPStan\\Type\\TypehintHelper' => __DIR__ . '/../..' . '/src/Type/TypehintHelper.php', 'PHPStan\\Type\\UnionType' => __DIR__ . '/../..' . '/src/Type/UnionType.php', 'PHPStan\\Type\\UnionTypeHelper' => __DIR__ . '/../..' . '/src/Type/UnionTypeHelper.php', 'PHPStan\\Type\\UsefulTypeAliasResolver' => __DIR__ . '/../..' . '/src/Type/UsefulTypeAliasResolver.php', 'PHPStan\\Type\\ValueOfType' => __DIR__ . '/../..' . '/src/Type/ValueOfType.php', 'PHPStan\\Type\\VerbosityLevel' => __DIR__ . '/../..' . '/src/Type/VerbosityLevel.php', 'PHPStan\\Type\\VoidType' => __DIR__ . '/../..' . '/src/Type/VoidType.php', 'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', 'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', 'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', 'PhpParser\\Builder\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', 'PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', 'PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', 'PhpParser\\Builder\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', 'PhpParser\\Builder\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', 'PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', 'PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', 'PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', 'PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', 'PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', 'PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', 'PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', 'PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', 'PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', 'PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', 'PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', 'PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php', 'PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', 'PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', 'PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', 'PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php', 'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', 'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', 'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', 'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', 'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', 'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', 'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', 'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', 'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', 'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', 'PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', 'PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', 'PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', 'PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', 'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', 'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', 'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', 'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', 'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', 'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', 'PhpParser\\Node\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', 'PhpParser\\Node\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', 'PhpParser\\Node\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', 'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', 'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', 'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', 'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', 'PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', 'PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', 'PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', 'PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', 'PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', 'PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', 'PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', 'PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', 'PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', 'PhpParser\\Node\\Expr\\CallLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', 'PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', 'PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', 'PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', 'PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', 'PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', 'PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', 'PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', 'PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', 'PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', 'PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', 'PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', 'PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', 'PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', 'PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', 'PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', 'PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', 'PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', 'PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', 'PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', 'PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', 'PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', 'PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', 'PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', 'PhpParser\\Node\\Expr\\Match_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', 'PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', 'PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', 'PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', 'PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', 'PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', 'PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', 'PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', 'PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', 'PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', 'PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', 'PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', 'PhpParser\\Node\\Expr\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', 'PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', 'PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', 'PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', 'PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', 'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', 'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', 'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', 'PhpParser\\Node\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', 'PhpParser\\Node\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', 'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', 'PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', 'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', 'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', 'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', 'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', 'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', 'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', 'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', 'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', 'PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', 'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', 'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', 'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', 'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', 'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', 'PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', 'PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', 'PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', 'PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', 'PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', 'PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', 'PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', 'PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', 'PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', 'PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', 'PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', 'PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', 'PhpParser\\Node\\Stmt\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', 'PhpParser\\Node\\Stmt\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', 'PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', 'PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', 'PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', 'PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', 'PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', 'PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', 'PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', 'PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', 'PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', 'PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', 'PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', 'PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', 'PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', 'PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', 'PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', 'PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', 'PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', 'PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', 'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', 'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', 'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', 'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', 'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', 'PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', 'PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', 'PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', 'PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', 'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', 'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', 'PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', 'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', 'PhpParser\\Node\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', 'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', 'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', 'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', 'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', 'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', 'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.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', 'Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php', 'Symfony\\Polyfill\\Php74\\Php74' => __DIR__ . '/..' . '/symfony/polyfill-php74/Php74.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', 'Symfony\\Polyfill\\Php81\\Php81' => __DIR__ . '/..' . '/symfony/polyfill-php81/Php81.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\Decoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Decoder.php', '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\Encoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Encoder.php', '_PHPStan_8c66d8255\\Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', '_PHPStan_8c66d8255\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', '_PHPStan_8c66d8255\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', '_PHPStan_8c66d8255\\Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php', '_PHPStan_8c66d8255\\Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php', '_PHPStan_8c66d8255\\Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\ParallelisationResult' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/ParallelisationResult.php', '_PHPStan_8c66d8255\\Fig\\Http\\Message\\RequestMethodInterface' => __DIR__ . '/..' . '/fig/http-message-util/src/RequestMethodInterface.php', '_PHPStan_8c66d8255\\Fig\\Http\\Message\\StatusCodeInterface' => __DIR__ . '/..' . '/fig/http-message-util/src/StatusCodeInterface.php', '_PHPStan_8c66d8255\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Bootstrap\\Configurator' => __DIR__ . '/..' . '/nette/bootstrap/src/Bootstrap/Configurator.php', '_PHPStan_8c66d8255\\Nette\\Bootstrap\\Extensions\\ConstantsExtension' => __DIR__ . '/..' . '/nette/bootstrap/src/Bootstrap/Extensions/ConstantsExtension.php', '_PHPStan_8c66d8255\\Nette\\Bootstrap\\Extensions\\PhpExtension' => __DIR__ . '/..' . '/nette/bootstrap/src/Bootstrap/Extensions/PhpExtension.php', '_PHPStan_8c66d8255\\Nette\\Bridges\\DITracy\\ContainerPanel' => __DIR__ . '/..' . '/nette/di/src/Bridges/DITracy/ContainerPanel.php', '_PHPStan_8c66d8255\\Nette\\Configurator' => __DIR__ . '/..' . '/nette/bootstrap/src/Configurator.php', '_PHPStan_8c66d8255\\Nette\\DI\\Attributes\\Inject' => __DIR__ . '/..' . '/nette/di/src/DI/Attributes/Inject.php', '_PHPStan_8c66d8255\\Nette\\DI\\Autowiring' => __DIR__ . '/..' . '/nette/di/src/DI/Autowiring.php', '_PHPStan_8c66d8255\\Nette\\DI\\Compiler' => __DIR__ . '/..' . '/nette/di/src/DI/Compiler.php', '_PHPStan_8c66d8255\\Nette\\DI\\CompilerExtension' => __DIR__ . '/..' . '/nette/di/src/DI/CompilerExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Adapter' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Adapter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Adapters\\NeonAdapter' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Adapters/NeonAdapter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Adapters\\PhpAdapter' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Adapters/PhpAdapter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Helpers' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Helpers.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\IAdapter' => __DIR__ . '/..' . '/nette/di/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Loader' => __DIR__ . '/..' . '/nette/di/src/DI/Config/Loader.php', '_PHPStan_8c66d8255\\Nette\\DI\\Container' => __DIR__ . '/..' . '/nette/di/src/DI/Container.php', '_PHPStan_8c66d8255\\Nette\\DI\\ContainerBuilder' => __DIR__ . '/..' . '/nette/di/src/DI/ContainerBuilder.php', '_PHPStan_8c66d8255\\Nette\\DI\\ContainerLoader' => __DIR__ . '/..' . '/nette/di/src/DI/ContainerLoader.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\AccessorDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/AccessorDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\Definition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/Definition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\FactoryDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/FactoryDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\ImportedDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/ImportedDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\LocatorDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/LocatorDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\Reference' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/Reference.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\ServiceDefinition' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/ServiceDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\Statement' => __DIR__ . '/..' . '/nette/di/src/DI/Definitions/Statement.php', '_PHPStan_8c66d8255\\Nette\\DI\\DependencyChecker' => __DIR__ . '/..' . '/nette/di/src/DI/DependencyChecker.php', '_PHPStan_8c66d8255\\Nette\\DI\\DynamicParameter' => __DIR__ . '/..' . '/nette/di/src/DI/DynamicParameter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ConstantsExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ConstantsExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\DIExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/DIExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\DecoratorExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/DecoratorExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\DefinitionSchema' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/DefinitionSchema.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ExtensionsExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ExtensionsExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\InjectExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/InjectExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ParametersExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ParametersExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\PhpExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/PhpExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\SearchExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/SearchExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ServicesExtension' => __DIR__ . '/..' . '/nette/di/src/DI/Extensions/ServicesExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Helpers' => __DIR__ . '/..' . '/nette/di/src/DI/Helpers.php', '_PHPStan_8c66d8255\\Nette\\DI\\InvalidConfigurationException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\MissingServiceException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\NotAllowedDuringResolvingException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\PhpGenerator' => __DIR__ . '/..' . '/nette/di/src/DI/PhpGenerator.php', '_PHPStan_8c66d8255\\Nette\\DI\\Resolver' => __DIR__ . '/..' . '/nette/di/src/DI/Resolver.php', '_PHPStan_8c66d8255\\Nette\\DI\\ServiceCreationException' => __DIR__ . '/..' . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\ServiceDefinition' => __DIR__ . '/..' . '/nette/di/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\DI\\Statement' => __DIR__ . '/..' . '/nette/di/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php', '_PHPStan_8c66d8255\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', '_PHPStan_8c66d8255\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', '_PHPStan_8c66d8255\\Nette\\Loaders\\RobotLoader' => __DIR__ . '/..' . '/nette/robot-loader/src/RobotLoader/RobotLoader.php', '_PHPStan_8c66d8255\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php', '_PHPStan_8c66d8255\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Decoder' => __DIR__ . '/..' . '/nette/neon/src/Neon/Decoder.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Encoder' => __DIR__ . '/..' . '/nette/neon/src/Neon/Encoder.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Entity' => __DIR__ . '/..' . '/nette/neon/src/Neon/Entity.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Exception' => __DIR__ . '/..' . '/nette/neon/src/Neon/Exception.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Lexer' => __DIR__ . '/..' . '/nette/neon/src/Neon/Lexer.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Neon' => __DIR__ . '/..' . '/nette/neon/src/Neon/Neon.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\ArrayItemNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/ArrayItemNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\ArrayNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/ArrayNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\BlockArrayNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/BlockArrayNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\EntityChainNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/EntityChainNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\EntityNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/EntityNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\InlineArrayNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/InlineArrayNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\LiteralNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/LiteralNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\StringNode' => __DIR__ . '/..' . '/nette/neon/src/Neon/Node/StringNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Parser' => __DIR__ . '/..' . '/nette/neon/src/Neon/Parser.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Token' => __DIR__ . '/..' . '/nette/neon/src/Neon/Token.php', '_PHPStan_8c66d8255\\Nette\\Neon\\TokenStream' => __DIR__ . '/..' . '/nette/neon/src/Neon/TokenStream.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Traverser' => __DIR__ . '/..' . '/nette/neon/src/Neon/Traverser.php', '_PHPStan_8c66d8255\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Attribute' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Attribute.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\ClassType' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/ClassType.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Closure' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Closure.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Constant' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Constant.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Dumper' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Dumper.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\EnumCase' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/EnumCase.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Extractor' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Extractor.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Factory' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Factory.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\GlobalFunction' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/GlobalFunction.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Helpers' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Helpers.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Literal' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Literal.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Method' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Method.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Parameter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Parameter.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PhpFile' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpFile.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PhpLiteral' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpLiteral.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PhpNamespace' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpNamespace.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Printer' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Printer.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PromotedParameter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PromotedParameter.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Property' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Property.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PsrPrinter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PsrPrinter.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\TraitUse' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/TraitUse.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\AttributeAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/AttributeAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\CommentAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\FunctionLike' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\NameAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/NameAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\VisibilityAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Type' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Type.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Context' => __DIR__ . '/..' . '/nette/schema/src/Schema/Context.php', '_PHPStan_8c66d8255\\Nette\\Schema\\DynamicParameter' => __DIR__ . '/..' . '/nette/schema/src/Schema/DynamicParameter.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\AnyOf' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/AnyOf.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\Base' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/Base.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\Structure' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/Structure.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\Type' => __DIR__ . '/..' . '/nette/schema/src/Schema/Elements/Type.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Expect' => __DIR__ . '/..' . '/nette/schema/src/Schema/Expect.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Helpers' => __DIR__ . '/..' . '/nette/schema/src/Schema/Helpers.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Message' => __DIR__ . '/..' . '/nette/schema/src/Schema/Message.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Processor' => __DIR__ . '/..' . '/nette/schema/src/Schema/Processor.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Schema' => __DIR__ . '/..' . '/nette/schema/src/Schema/Schema.php', '_PHPStan_8c66d8255\\Nette\\Schema\\ValidationException' => __DIR__ . '/..' . '/nette/schema/src/Schema/ValidationException.php', '_PHPStan_8c66d8255\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php', '_PHPStan_8c66d8255\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php', '_PHPStan_8c66d8255\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', '_PHPStan_8c66d8255\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', '_PHPStan_8c66d8255\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', '_PHPStan_8c66d8255\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/finder/src/Utils/Finder.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', '_PHPStan_8c66d8255\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', '_PHPStan_8c66d8255\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ObjectMixin' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectMixin.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', '_PHPStan_8c66d8255\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', '_PHPStan_8c66d8255\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\CiDetector' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetector.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\AbstractCi' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AbstractCi.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\AppVeyor' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AppVeyor.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Bamboo' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Bamboo.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Buddy' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Buddy.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\CiInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/CiInterface.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Circle' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Circle.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Codeship' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Codeship.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Continuousphp' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Continuousphp.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Drone' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Drone.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\GitHubActions' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitHubActions.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\GitLab' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitLab.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Jenkins' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Jenkins.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\TeamCity' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/TeamCity.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Travis' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Travis.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Wercker' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Wercker.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Env' => __DIR__ . '/..' . '/ondram/ci-detector/src/Env.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => __DIR__ . '/..' . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\TrinaryLogic' => __DIR__ . '/..' . '/ondram/ci-detector/src/TrinaryLogic.php', '_PHPStan_8c66d8255\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', '_PHPStan_8c66d8255\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', '_PHPStan_8c66d8255\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', '_PHPStan_8c66d8255\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', '_PHPStan_8c66d8255\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', '_PHPStan_8c66d8255\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', '_PHPStan_8c66d8255\\React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php', '_PHPStan_8c66d8255\\React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php', '_PHPStan_8c66d8255\\React\\ChildProcess\\Process' => __DIR__ . '/..' . '/react/child-process/src/Process.php', '_PHPStan_8c66d8255\\React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php', '_PHPStan_8c66d8255\\React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php', '_PHPStan_8c66d8255\\React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php', '_PHPStan_8c66d8255\\React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php', '_PHPStan_8c66d8255\\React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php', '_PHPStan_8c66d8255\\React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php', '_PHPStan_8c66d8255\\React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php', '_PHPStan_8c66d8255\\React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php', '_PHPStan_8c66d8255\\React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php', '_PHPStan_8c66d8255\\React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php', '_PHPStan_8c66d8255\\React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php', '_PHPStan_8c66d8255\\React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php', '_PHPStan_8c66d8255\\React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php', '_PHPStan_8c66d8255\\React\\Http\\Browser' => __DIR__ . '/..' . '/react/http/src/Browser.php', '_PHPStan_8c66d8255\\React\\Http\\Client\\Client' => __DIR__ . '/..' . '/react/http/src/Client/Client.php', '_PHPStan_8c66d8255\\React\\Http\\HttpServer' => __DIR__ . '/..' . '/react/http/src/HttpServer.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\AbstractMessage' => __DIR__ . '/..' . '/react/http/src/Io/AbstractMessage.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\AbstractRequest' => __DIR__ . '/..' . '/react/http/src/Io/AbstractRequest.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\BufferedBody' => __DIR__ . '/..' . '/react/http/src/Io/BufferedBody.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ChunkedDecoder' => __DIR__ . '/..' . '/react/http/src/Io/ChunkedDecoder.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ChunkedEncoder' => __DIR__ . '/..' . '/react/http/src/Io/ChunkedEncoder.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ClientConnectionManager' => __DIR__ . '/..' . '/react/http/src/Io/ClientConnectionManager.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ClientRequestState' => __DIR__ . '/..' . '/react/http/src/Io/ClientRequestState.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ClientRequestStream' => __DIR__ . '/..' . '/react/http/src/Io/ClientRequestStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\Clock' => __DIR__ . '/..' . '/react/http/src/Io/Clock.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\CloseProtectionStream' => __DIR__ . '/..' . '/react/http/src/Io/CloseProtectionStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\EmptyBodyStream' => __DIR__ . '/..' . '/react/http/src/Io/EmptyBodyStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\HttpBodyStream' => __DIR__ . '/..' . '/react/http/src/Io/HttpBodyStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\IniUtil' => __DIR__ . '/..' . '/react/http/src/Io/IniUtil.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\LengthLimitedStream' => __DIR__ . '/..' . '/react/http/src/Io/LengthLimitedStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\MiddlewareRunner' => __DIR__ . '/..' . '/react/http/src/Io/MiddlewareRunner.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\MultipartParser' => __DIR__ . '/..' . '/react/http/src/Io/MultipartParser.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\PauseBufferStream' => __DIR__ . '/..' . '/react/http/src/Io/PauseBufferStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ReadableBodyStream' => __DIR__ . '/..' . '/react/http/src/Io/ReadableBodyStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\RequestHeaderParser' => __DIR__ . '/..' . '/react/http/src/Io/RequestHeaderParser.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\Sender' => __DIR__ . '/..' . '/react/http/src/Io/Sender.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\StreamingServer' => __DIR__ . '/..' . '/react/http/src/Io/StreamingServer.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\Transaction' => __DIR__ . '/..' . '/react/http/src/Io/Transaction.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\UploadedFile' => __DIR__ . '/..' . '/react/http/src/Io/UploadedFile.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\Request' => __DIR__ . '/..' . '/react/http/src/Message/Request.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\Response' => __DIR__ . '/..' . '/react/http/src/Message/Response.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\ResponseException' => __DIR__ . '/..' . '/react/http/src/Message/ResponseException.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\ServerRequest' => __DIR__ . '/..' . '/react/http/src/Message/ServerRequest.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\Uri' => __DIR__ . '/..' . '/react/http/src/Message/Uri.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\LimitConcurrentRequestsMiddleware' => __DIR__ . '/..' . '/react/http/src/Middleware/LimitConcurrentRequestsMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\RequestBodyBufferMiddleware' => __DIR__ . '/..' . '/react/http/src/Middleware/RequestBodyBufferMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\RequestBodyParserMiddleware' => __DIR__ . '/..' . '/react/http/src/Middleware/RequestBodyParserMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\StreamingRequestMiddleware' => __DIR__ . '/..' . '/react/http/src/Middleware/StreamingRequestMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Server' => __DIR__ . '/..' . '/react/http/src/Server.php', '_PHPStan_8c66d8255\\React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', '_PHPStan_8c66d8255\\React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', '_PHPStan_8c66d8255\\React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', '_PHPStan_8c66d8255\\React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', '_PHPStan_8c66d8255\\React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', '_PHPStan_8c66d8255\\React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', '_PHPStan_8c66d8255\\React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', '_PHPStan_8c66d8255\\React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php', '_PHPStan_8c66d8255\\React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php', '_PHPStan_8c66d8255\\React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php', '_PHPStan_8c66d8255\\React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', '_PHPStan_8c66d8255\\React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php', '_PHPStan_8c66d8255\\React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php', '_PHPStan_8c66d8255\\React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php', '_PHPStan_8c66d8255\\React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php', '_PHPStan_8c66d8255\\React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php', '_PHPStan_8c66d8255\\React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php', '_PHPStan_8c66d8255\\React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php', '_PHPStan_8c66d8255\\React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php', '_PHPStan_8c66d8255\\React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php', '_PHPStan_8c66d8255\\React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php', '_PHPStan_8c66d8255\\React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php', '_PHPStan_8c66d8255\\React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php', '_PHPStan_8c66d8255\\React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php', '_PHPStan_8c66d8255\\React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php', '_PHPStan_8c66d8255\\React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php', '_PHPStan_8c66d8255\\React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', '_PHPStan_8c66d8255\\Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit07b46dce51ea41c025511b9415b3274c::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit07b46dce51ea41c025511b9415b3274c::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit07b46dce51ea41c025511b9415b3274c::$classMap; }, null, ClassLoader::class); } } setClassMapAuthoritative(true); $loader->register(true); $filesToLoad = \Composer\Autoload\ComposerStaticInit07b46dce51ea41c025511b9415b3274c::$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; } } array( 'name' => 'phpstan/phpstan-src', 'pretty_version' => '1.12.33', 'version' => '1.12.33.0', 'reference' => '8c66d8255b29e146f6f150abae579f1f6f9170a5', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true, ), 'versions' => array( 'brianium/paratest' => array( 'pretty_version' => 'v6.6.3', 'version' => '6.6.3.0', 'reference' => 'f2d781bb9136cda2f5e73ee778049e80ba681cf6', 'type' => 'library', 'install_path' => __DIR__ . '/../brianium/paratest', 'aliases' => array(), 'dev_requirement' => true, ), 'clue/ndjson-react' => array( 'pretty_version' => 'v1.3.0', 'version' => '1.3.0.0', 'reference' => '392dc165fce93b5bb5c637b67e59619223c931b0', 'type' => 'library', 'install_path' => __DIR__ . '/../clue/ndjson-react', 'aliases' => array(), 'dev_requirement' => false, ), 'composer/ca-bundle' => array( 'pretty_version' => '1.5.0', 'version' => '1.5.0.0', 'reference' => '0c5ccfcfea312b5c5a190a21ac5cef93f74baf99', 'type' => 'library', 'install_path' => __DIR__ . '/./ca-bundle', 'aliases' => array(), 'dev_requirement' => false, ), 'composer/pcre' => array( 'pretty_version' => '3.3.1', 'version' => '3.3.1.0', 'reference' => '63aaeac21d7e775ff9bc9d45021e1745c97521c4', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => false, ), 'composer/semver' => array( 'pretty_version' => '3.4.0', 'version' => '3.4.0.0', 'reference' => '35e8d0af4486141bc745f23a29cc2091eb624a32', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => false, ), 'composer/xdebug-handler' => array( 'pretty_version' => '3.0.5', 'version' => '3.0.5.0', 'reference' => '6c1925561632e83d60a44492e0b344cf48ab85ef', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => false, ), 'cweagans/composer-patches' => array( 'pretty_version' => '1.7.3', 'version' => '1.7.3.0', 'reference' => 'e190d4466fe2b103a55467dfa83fc2fecfcaf2db', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../cweagans/composer-patches', 'aliases' => array(), 'dev_requirement' => true, ), 'doctrine/instantiator' => array( 'pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/instantiator', 'aliases' => array(), 'dev_requirement' => true, ), 'evenement/evenement' => array( 'pretty_version' => 'v3.0.2', 'version' => '3.0.2.0', 'reference' => '0a16b0d71ab13284339abb99d9d2bd813640efbc', 'type' => 'library', 'install_path' => __DIR__ . '/../evenement/evenement', 'aliases' => array(), 'dev_requirement' => false, ), 'fidry/cpu-core-counter' => array( 'pretty_version' => '1.2.0', 'version' => '1.2.0.0', 'reference' => '8520451a140d3f46ac33042715115e290cf5785f', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => false, ), 'fig/http-message-util' => array( 'pretty_version' => '1.1.5', 'version' => '1.1.5.0', 'reference' => '9d94dc0154230ac39e5bf89398b324a86f63f765', 'type' => 'library', 'install_path' => __DIR__ . '/../fig/http-message-util', 'aliases' => array(), 'dev_requirement' => false, ), 'grogy/php-parallel-lint' => array( 'dev_requirement' => true, 'replaced' => array( 0 => '*', ), ), 'hoa/compiler' => array( 'pretty_version' => '3.17.08.08', 'version' => '3.17.08.08', 'reference' => 'aa09caf0bf28adae6654ca6ee415ee2f522672de', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/compiler', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/consistency' => array( 'pretty_version' => '1.17.05.02', 'version' => '1.17.05.02', 'reference' => 'fd7d0adc82410507f332516faf655b6ed22e4c2f', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/consistency', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/event' => array( 'pretty_version' => '1.17.01.13', 'version' => '1.17.01.13', 'reference' => '6c0060dced212ffa3af0e34bb46624f990b29c54', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/event', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/exception' => array( 'pretty_version' => '1.17.01.16', 'version' => '1.17.01.16', 'reference' => '091727d46420a3d7468ef0595651488bfc3a458f', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/exception', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/file' => array( 'pretty_version' => '1.17.07.11', 'version' => '1.17.07.11', 'reference' => '35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/file', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/iterator' => array( 'pretty_version' => '2.17.01.10', 'version' => '2.17.01.10', 'reference' => 'd1120ba09cb4ccd049c86d10058ab94af245f0cc', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/iterator', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/math' => array( 'pretty_version' => '1.17.05.16', 'version' => '1.17.05.16', 'reference' => '7150785d30f5d565704912116a462e9f5bc83a0c', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/math', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/protocol' => array( 'pretty_version' => '1.17.01.14', 'version' => '1.17.01.14', 'reference' => '5c2cf972151c45f373230da170ea015deecf19e2', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/protocol', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/regex' => array( 'pretty_version' => '1.17.01.13', 'version' => '1.17.01.13', 'reference' => '7e263a61b6fb45c1d03d8e5ef77668518abd5bec', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/regex', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/stream' => array( 'pretty_version' => '1.17.02.21', 'version' => '1.17.02.21', 'reference' => '3293cfffca2de10525df51436adf88a559151d82', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/stream', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/ustring' => array( 'pretty_version' => '4.17.01.16', 'version' => '4.17.01.16', 'reference' => 'e6326e2739178799b1fe3fdd92029f9517fa17a0', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/ustring', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/visitor' => array( 'pretty_version' => '2.17.01.16', 'version' => '2.17.01.16', 'reference' => 'c18fe1cbac98ae449e0d56e87469103ba08f224a', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/visitor', 'aliases' => array(), 'dev_requirement' => false, ), 'hoa/zformat' => array( 'pretty_version' => '1.17.01.10', 'version' => '1.17.01.10', 'reference' => '522c381a2a075d4b9dbb42eb4592dd09520e4ac2', 'type' => 'library', 'install_path' => __DIR__ . '/../hoa/zformat', 'aliases' => array(), 'dev_requirement' => false, ), 'jakub-onderka/php-parallel-lint' => array( 'dev_requirement' => true, 'replaced' => array( 0 => '*', ), ), 'jean85/pretty-package-versions' => array( 'pretty_version' => '2.0.5', 'version' => '2.0.5.0', 'reference' => 'ae547e455a3d8babd07b96966b17d7fd21d9c6af', 'type' => 'library', 'install_path' => __DIR__ . '/../jean85/pretty-package-versions', 'aliases' => array(), 'dev_requirement' => true, ), 'jetbrains/phpstorm-stubs' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '56f6b9e55f5885e651553843a1aaf9ec9c586c04', 'type' => 'library', 'install_path' => __DIR__ . '/../jetbrains/phpstorm-stubs', 'aliases' => array( 0 => '9999999-dev', ), 'dev_requirement' => false, ), 'myclabs/deep-copy' => array( 'pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'dev_requirement' => true, ), 'nette/bootstrap' => array( 'pretty_version' => 'v3.1.4', 'version' => '3.1.4.0', 'reference' => '1a7965b4ee401ad0e3f673b9c016d2481afdc280', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/bootstrap', 'aliases' => array(), 'dev_requirement' => false, ), 'nette/di' => array( 'pretty_version' => 'v3.1.5', 'version' => '3.1.5.0', 'reference' => '00ea0afa643b3b4383a5cd1a322656c989ade498', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/di', '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/neon' => array( 'pretty_version' => 'v3.3.3', 'version' => '3.3.3.0', 'reference' => '22e384da162fab42961d48eb06c06d3ad0c11b95', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/neon', 'aliases' => array(), 'dev_requirement' => false, ), 'nette/php-generator' => array( 'pretty_version' => 'v3.6.9', 'version' => '3.6.9.0', 'reference' => 'd31782f7bd2ae84ad06f863391ec3fb77ca4d0a6', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/php-generator', 'aliases' => array(), 'dev_requirement' => false, ), 'nette/robot-loader' => array( 'pretty_version' => 'v3.4.1', 'version' => '3.4.1.0', 'reference' => 'e2adc334cb958164c050f485d99c44c430f51fe2', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/robot-loader', 'aliases' => array(), 'dev_requirement' => false, ), 'nette/schema' => array( 'pretty_version' => 'v1.2.5', 'version' => '1.2.5.0', 'reference' => '0462f0166e823aad657c9224d0f849ecac1ba10a', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/schema', 'aliases' => array(), 'dev_requirement' => false, ), 'nette/utils' => array( 'pretty_version' => 'v3.2.7', 'version' => '3.2.7.0', 'reference' => '0af4e3de4df9f1543534beab255ccf459e7a2c99', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => false, ), 'nikic/php-parser' => array( 'pretty_version' => 'v4.19.4', 'version' => '4.19.4.0', 'reference' => '715f4d25e225bc47b293a8b997fe6ce99bf987d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => false, ), 'ondram/ci-detector' => array( 'pretty_version' => '3.5.1', 'version' => '3.5.1.0', 'reference' => '594e61252843b68998bddd48078c5058fe9028bd', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => false, ), 'ondrejmirtes/better-reflection' => array( 'pretty_version' => '6.25.0.21', 'version' => '6.25.0.21', 'reference' => 'c1bcfaa130718e4004ab8260bed4bfe96a46dc02', 'type' => 'library', 'install_path' => __DIR__ . '/../ondrejmirtes/better-reflection', 'aliases' => array(), 'dev_requirement' => false, ), 'ondrejmirtes/simple-downgrader' => array( 'pretty_version' => '1.0.2', 'version' => '1.0.2.0', 'reference' => '832aaae53dcfe358f63180494de8734244773d46', 'type' => 'library', 'install_path' => __DIR__ . '/../ondrejmirtes/simple-downgrader', 'aliases' => array(), 'dev_requirement' => true, ), 'phar-io/manifest' => array( 'pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/manifest', 'aliases' => array(), 'dev_requirement' => true, ), 'phar-io/version' => array( 'pretty_version' => '3.2.1', 'version' => '3.2.1.0', 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/version', 'aliases' => array(), 'dev_requirement' => true, ), 'php-parallel-lint/php-parallel-lint' => array( 'pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '6db563514f27e19595a19f45a4bf757b6401194e', 'type' => 'library', 'install_path' => __DIR__ . '/../php-parallel-lint/php-parallel-lint', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/php-8-stubs' => array( 'pretty_version' => '0.3.111', 'version' => '0.3.111.0', 'reference' => '0013252145df5d84112764d4ea57ed1c6f074018', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/php-8-stubs', 'aliases' => array(), 'dev_requirement' => false, ), 'phpstan/phpdoc-parser' => array( 'pretty_version' => '1.33.0', 'version' => '1.33.0.0', 'reference' => '82a311fd3690fb2bf7b64d5c98f912b3dd746140', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => false, ), 'phpstan/phpstan' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '1.12.x', ), ), 'phpstan/phpstan-deprecation-rules' => array( 'pretty_version' => '1.2.0', 'version' => '1.2.0.0', 'reference' => 'fa8cce7720fa782899a0aa97b6a41225d1bb7b26', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../phpstan/phpstan-deprecation-rules', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/phpstan-nette' => array( 'pretty_version' => '1.3.8', 'version' => '1.3.8.0', 'reference' => 'bc74b8b208b47f163fe55708fcf1a0333247fa79', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../phpstan/phpstan-nette', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/phpstan-phpunit' => array( 'pretty_version' => '1.4.0', 'version' => '1.4.0.0', 'reference' => 'f3ea021866f4263f07ca3636bf22c64be9610c11', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../phpstan/phpstan-phpunit', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/phpstan-src' => array( 'pretty_version' => '1.12.33', 'version' => '1.12.33.0', 'reference' => '8c66d8255b29e146f6f150abae579f1f6f9170a5', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), 'phpstan/phpstan-strict-rules' => array( 'pretty_version' => '1.6.0', 'version' => '1.6.0.0', 'reference' => '363f921dd8441777d4fc137deb99beb486c77df1', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../phpstan/phpstan-strict-rules', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-code-coverage' => array( 'pretty_version' => '9.2.30', 'version' => '9.2.30.0', 'reference' => 'ca2bd87d2f9215904682a9cb9bb37dda98e76089', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-file-iterator' => array( 'pretty_version' => '3.0.6', 'version' => '3.0.6.0', 'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-invoker' => array( 'pretty_version' => '3.1.1', 'version' => '3.1.1.0', 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-invoker', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-text-template' => array( 'pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-text-template', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/php-timer' => array( 'pretty_version' => '5.0.3', 'version' => '5.0.3.0', 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-timer', 'aliases' => array(), 'dev_requirement' => true, ), 'phpunit/phpunit' => array( 'pretty_version' => '9.5.23', 'version' => '9.5.23.0', 'reference' => '888556852e7e9bbeeedb9656afe46118765ade34', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), 'dev_requirement' => true, ), 'psr/container' => array( 'pretty_version' => '1.1.2', 'version' => '1.1.2.0', 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/http-message' => array( 'pretty_version' => '1.1', 'version' => '1.1.0.0', 'reference' => 'cb6ce4845ce34a8ad9e68117c10ee90a29919eba', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/log' => array( 'pretty_version' => '2.0.0', 'version' => '2.0.0.0', 'reference' => 'ef29f6d262798707a9edd554e2b82517ef3a9376', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0|2.0', ), ), 'react/async' => array( 'pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => 'bc3ef672b33e95bf814fe8377731e46888ed4b54', 'type' => 'library', 'install_path' => __DIR__ . '/../react/async', 'aliases' => array(), 'dev_requirement' => false, ), 'react/cache' => array( 'pretty_version' => 'v1.2.0', 'version' => '1.2.0.0', 'reference' => 'd47c472b64aa5608225f47965a484b75c7817d5b', 'type' => 'library', 'install_path' => __DIR__ . '/../react/cache', 'aliases' => array(), 'dev_requirement' => false, ), 'react/child-process' => array( 'pretty_version' => '0.7.x-dev', 'version' => '0.7.9999999.9999999-dev', 'reference' => 'ce2654d21d2a749e0a6142d00432e65ba003a2d9', 'type' => 'library', 'install_path' => __DIR__ . '/../react/child-process', 'aliases' => array(), 'dev_requirement' => false, ), 'react/dns' => array( 'pretty_version' => 'v1.13.0', 'version' => '1.13.0.0', 'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => false, ), 'react/event-loop' => array( 'pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', 'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => false, ), 'react/http' => array( 'pretty_version' => 'v1.10.0', 'version' => '1.10.0.0', 'reference' => '8111281ee57f22b7194f5dba225e609ba7ce4d20', 'type' => 'library', 'install_path' => __DIR__ . '/../react/http', 'aliases' => array(), 'dev_requirement' => false, ), 'react/promise' => array( 'pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => false, ), 'react/socket' => array( 'pretty_version' => 'v1.16.0', 'version' => '1.16.0.0', 'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => false, ), 'react/stream' => array( 'pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d', 'type' => 'library', 'install_path' => __DIR__ . '/../react/stream', 'aliases' => array(), 'dev_requirement' => false, ), 'sebastian/cli-parser' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/cli-parser', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/code-unit' => array( 'pretty_version' => '1.0.8', 'version' => '1.0.8.0', 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/code-unit-reverse-lookup' => array( 'pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/comparator' => array( 'pretty_version' => '4.0.6', 'version' => '4.0.6.0', 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/comparator', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/complexity' => array( 'pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'reference' => '25f207c40d62b8b7aa32f5ab026c53561964053a', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/complexity', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/diff' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/environment' => array( 'pretty_version' => '5.1.5', 'version' => '5.1.5.0', 'reference' => '830c43a844f1f8d5b7a1f6d6076b784454d8b7ed', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/environment', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/exporter' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/exporter', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/global-state' => array( 'pretty_version' => '5.0.5', 'version' => '5.0.5.0', 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/global-state', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/lines-of-code' => array( 'pretty_version' => '1.0.4', 'version' => '1.0.4.0', 'reference' => 'e1e4a170560925c26d424b6a03aed157e7dcc5c5', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/lines-of-code', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/object-enumerator' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-enumerator', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/object-reflector' => array( 'pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-reflector', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/recursion-context' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/recursion-context', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/resource-operations' => array( 'pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/resource-operations', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/type' => array( 'pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => 'b233b84bc4465aff7b57cf1c4bc75c86d00d6dad', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/type', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/version' => array( 'pretty_version' => '3.0.2', 'version' => '3.0.2.0', 'reference' => 'c6c1022351a901512170118436c764e473f6de8c', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/version', 'aliases' => array(), 'dev_requirement' => true, ), 'shipmonk/composer-dependency-analyser' => array( 'pretty_version' => '1.7.0', 'version' => '1.7.0.0', 'reference' => 'bca862b2830a453734aee048eb0cdab82e5c9da3', 'type' => 'library', 'install_path' => __DIR__ . '/../shipmonk/composer-dependency-analyser', 'aliases' => array(), 'dev_requirement' => true, ), 'shipmonk/name-collision-detector' => array( 'pretty_version' => '2.1.1', 'version' => '2.1.1.0', 'reference' => 'e8c8267a9a3774450b64f4cbf0bb035108e78f07', 'type' => 'library', 'install_path' => __DIR__ . '/../shipmonk/name-collision-detector', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/console' => array( 'pretty_version' => 'v5.4.41', 'version' => '5.4.41.0', 'reference' => '6473d441a913cb997123b59ff2dbe3d1cf9e11ba', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/finder' => array( 'pretty_version' => 'v5.4.40', 'version' => '5.4.40.0', 'reference' => 'f51cff4687547641c7d8180d74932ab40b2205ce', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-ctype' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-grapheme' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => 'b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => '0f68c03565dcaaf25a890667542e8bd75fe7e5bb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php74' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => '9589537d05325fb5d88a20d8926823e5b827a43e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php74', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => '60328e362d4c2c802a54fcbf04f9d3fb892b4cf8', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php81' => array( 'pretty_version' => 'v1.31.0', 'version' => '1.31.0.0', 'reference' => '4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/process' => array( 'pretty_version' => 'v5.4.40', 'version' => '5.4.40.0', 'reference' => 'deedcb3bb4669cae2148bc920eafd2b16dc7c046', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/service-contracts' => array( 'pretty_version' => 'v2.5.3', 'version' => '2.5.3.0', 'reference' => 'a2329596ddc8fd568900e3fc76cba42489ecc7f3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/string' => array( 'pretty_version' => 'v5.4.41', 'version' => '5.4.41.0', 'reference' => '065a9611e0b1fd2197a867e1fb7f2238191b7096', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => false, ), 'theseer/tokenizer' => array( 'pretty_version' => '1.2.1', 'version' => '1.2.1.0', 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e', 'type' => 'library', 'install_path' => __DIR__ . '/../theseer/tokenizer', 'aliases' => array(), 'dev_requirement' => true, ), ), ); MIT License Copyright (c) 2017 Composer 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. * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\XdebugHandler; /** * @author John Stevenson * * @phpstan-type restartData array{tmpIni: string, scannedInis: bool, scanDir: false|string, phprc: false|string, inis: string[], skipped: string} */ class PhpConfig { /** * Use the original PHP configuration * * @return string[] Empty array of PHP cli options */ public function useOriginal() : array { $this->getDataAndReset(); return []; } /** * Use standard restart settings * * @return string[] PHP cli options */ public function useStandard() : array { $data = $this->getDataAndReset(); if ($data !== null) { return ['-n', '-c', $data['tmpIni']]; } return []; } /** * Use environment variables to persist settings * * @return string[] Empty array of PHP cli options */ public function usePersistent() : array { $data = $this->getDataAndReset(); if ($data !== null) { $this->updateEnv('PHPRC', $data['tmpIni']); $this->updateEnv('PHP_INI_SCAN_DIR', ''); } return []; } /** * Returns restart data if available and resets the environment * * @phpstan-return restartData|null */ private function getDataAndReset() : ?array { $data = XdebugHandler::getRestartSettings(); if ($data !== null) { $this->updateEnv('PHPRC', $data['phprc']); $this->updateEnv('PHP_INI_SCAN_DIR', $data['scanDir']); } return $data; } /** * Updates a restart settings value in the environment * * @param string $name * @param string|false $value */ private function updateEnv(string $name, $value) : void { Process::setEnv($name, \false !== $value ? $value : null); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace _PHPStan_8c66d8255\Composer\XdebugHandler; use _PHPStan_8c66d8255\Composer\Pcre\Preg; use _PHPStan_8c66d8255\Psr\Log\LoggerInterface; /** * @author John Stevenson * * @phpstan-import-type restartData from PhpConfig */ class XdebugHandler { const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; const SUFFIX_INIS = '_ORIGINAL_INIS'; const RESTART_ID = 'internal'; const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; const DEBUG = 'XDEBUG_HANDLER_DEBUG'; /** @var string|null */ protected $tmpIni; /** @var bool */ private static $inRestart; /** @var string */ private static $name; /** @var string|null */ private static $skipped; /** @var bool */ private static $xdebugActive; /** @var string|null */ private static $xdebugMode; /** @var string|null */ private static $xdebugVersion; /** @var bool */ private $cli; /** @var string|null */ private $debug; /** @var string */ private $envAllowXdebug; /** @var string */ private $envOriginalInis; /** @var bool */ private $persistent; /** @var string|null */ private $script; /** @var Status */ private $statusWriter; /** * Constructor * * The $envPrefix is used to create distinct environment variables. It is * uppercased and prepended to the default base values. For example 'myapp' * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. * * @param string $envPrefix Value used in environment variables * @throws \RuntimeException If the parameter is invalid */ public function __construct(string $envPrefix) { if ($envPrefix === '') { throw new \RuntimeException('Invalid constructor parameter'); } self::$name = \strtoupper($envPrefix); $this->envAllowXdebug = self::$name . self::SUFFIX_ALLOW; $this->envOriginalInis = self::$name . self::SUFFIX_INIS; self::setXdebugDetails(); self::$inRestart = \false; if ($this->cli = \PHP_SAPI === 'cli') { $this->debug = (string) \getenv(self::DEBUG); } $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); } /** * Activates status message output to a PSR3 logger */ public function setLogger(LoggerInterface $logger) : self { $this->statusWriter->setLogger($logger); return $this; } /** * Sets the main script location if it cannot be called from argv */ public function setMainScript(string $script) : self { $this->script = $script; return $this; } /** * Persist the settings to keep Xdebug out of sub-processes */ public function setPersistent() : self { $this->persistent = \true; return $this; } /** * Checks if Xdebug is loaded and the process needs to be restarted * * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG * environment variable to 1. This variable is used internally so that * the restarted process is created only once. */ public function check() : void { $this->notify(Status::CHECK, self::$xdebugVersion . '|' . self::$xdebugMode); $envArgs = \explode('|', (string) \getenv($this->envAllowXdebug)); if (!(bool) $envArgs[0] && $this->requiresRestart(self::$xdebugActive)) { // Restart required $this->notify(Status::RESTART); $command = $this->prepareRestart(); if ($command !== null) { $this->restart($command); } return; } if (self::RESTART_ID === $envArgs[0] && \count($envArgs) === 5) { // Restarted, so unset environment variable and use saved values $this->notify(Status::RESTARTED); Process::setEnv($this->envAllowXdebug); self::$inRestart = \true; if (self::$xdebugVersion === null) { // Skipped version is only set if Xdebug is not loaded self::$skipped = $envArgs[1]; } $this->tryEnableSignals(); // Put restart settings in the environment $this->setEnvRestartSettings($envArgs); return; } $this->notify(Status::NORESTART); $settings = self::getRestartSettings(); if ($settings !== null) { // Called with existing settings, so sync our settings $this->syncSettings($settings); } } /** * Returns an array of php.ini locations with at least one entry * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be an empty string. * * @return non-empty-list */ public static function getAllIniFiles() : array { if (self::$name !== null) { $env = \getenv(self::$name . self::SUFFIX_INIS); if (\false !== $env) { return \explode(\PATH_SEPARATOR, $env); } } $paths = [(string) \php_ini_loaded_file()]; $scanned = \php_ini_scanned_files(); if ($scanned !== \false) { $paths = \array_merge($paths, \array_map('trim', \explode(',', $scanned))); } return $paths; } /** * Returns an array of restart settings or null * * Settings will be available if the current process was restarted, or * called with the settings from an existing restart. * * @phpstan-return restartData|null */ public static function getRestartSettings() : ?array { $envArgs = \explode('|', (string) \getenv(self::RESTART_SETTINGS)); if (\count($envArgs) !== 6 || !self::$inRestart && \php_ini_loaded_file() !== $envArgs[0]) { return null; } return ['tmpIni' => $envArgs[0], 'scannedInis' => (bool) $envArgs[1], 'scanDir' => '*' === $envArgs[2] ? \false : $envArgs[2], 'phprc' => '*' === $envArgs[3] ? \false : $envArgs[3], 'inis' => \explode(\PATH_SEPARATOR, $envArgs[4]), 'skipped' => $envArgs[5]]; } /** * Returns the Xdebug version that triggered a successful restart */ public static function getSkippedVersion() : string { return (string) self::$skipped; } /** * Returns whether Xdebug is loaded and active * * true: if Xdebug is loaded and is running in an active mode. * false: if Xdebug is not loaded, or it is running with xdebug.mode=off. */ public static function isXdebugActive() : bool { self::setXdebugDetails(); return self::$xdebugActive; } /** * Allows an extending class to decide if there should be a restart * * The default is to restart if Xdebug is loaded and its mode is not "off". */ protected function requiresRestart(bool $default) : bool { return $default; } /** * Allows an extending class to access the tmpIni * * @param non-empty-list $command */ protected function restart(array $command) : void { $this->doRestart($command); } /** * Executes the restarted command then deletes the tmp ini * * @param non-empty-list $command * @phpstan-return never */ private function doRestart(array $command) : void { if (\PHP_VERSION_ID >= 70400) { $cmd = $command; $displayCmd = \sprintf('[%s]', \implode(', ', $cmd)); } else { $cmd = Process::escapeShellCommand($command); if (\defined('PHP_WINDOWS_VERSION_BUILD')) { // Outer quotes required on cmd string below PHP 8 $cmd = '"' . $cmd . '"'; } $displayCmd = $cmd; } $this->tryEnableSignals(); $this->notify(Status::RESTARTING, $displayCmd); $process = \proc_open($cmd, [], $pipes); if (\is_resource($process)) { $exitCode = \proc_close($process); } if (!isset($exitCode)) { // Unlikely that php or the default shell cannot be invoked $this->notify(Status::ERROR, 'Unable to restart process'); $exitCode = -1; } else { $this->notify(Status::INFO, 'Restarted process exited ' . $exitCode); } if ($this->debug === '2') { $this->notify(Status::INFO, 'Temp ini saved: ' . $this->tmpIni); } else { @\unlink((string) $this->tmpIni); } exit($exitCode); } /** * Returns the command line array if everything was written for the restart * * If any of the following fails (however unlikely) we must return false to * stop potential recursion: * - tmp ini file creation * - environment variable creation * * @return non-empty-list|null */ private function prepareRestart() : ?array { if (!$this->cli) { $this->notify(Status::ERROR, 'Unsupported SAPI: ' . \PHP_SAPI); return null; } if (($argv = $this->checkServerArgv()) === null) { $this->notify(Status::ERROR, '$_SERVER[argv] is not as expected'); return null; } if (!$this->checkConfiguration($info)) { $this->notify(Status::ERROR, $info); return null; } $mainScript = (string) $this->script; if (!$this->checkMainScript($mainScript, $argv)) { $this->notify(Status::ERROR, 'Unable to access main script: ' . $mainScript); return null; } $tmpDir = \sys_get_temp_dir(); $iniError = 'Unable to create temp ini file at: ' . $tmpDir; if (($tmpfile = @\tempnam($tmpDir, '')) === \false) { $this->notify(Status::ERROR, $iniError); return null; } $error = null; $iniFiles = self::getAllIniFiles(); $scannedInis = \count($iniFiles) > 1; if (!$this->writeTmpIni($tmpfile, $iniFiles, $error)) { $this->notify(Status::ERROR, $error ?? $iniError); @\unlink($tmpfile); return null; } if (!$this->setEnvironment($scannedInis, $iniFiles, $tmpfile)) { $this->notify(Status::ERROR, 'Unable to set environment variables'); @\unlink($tmpfile); return null; } $this->tmpIni = $tmpfile; return $this->getCommand($argv, $tmpfile, $mainScript); } /** * Returns true if the tmp ini file was written * * @param non-empty-list $iniFiles All ini files used in the current process */ private function writeTmpIni(string $tmpFile, array $iniFiles, ?string &$error) : bool { // $iniFiles has at least one item and it may be empty if ($iniFiles[0] === '') { \array_shift($iniFiles); } $content = ''; $sectionRegex = '/^\\s*\\[(?:PATH|HOST)\\s*=/mi'; $xdebugRegex = '/^\\s*(zend_extension\\s*=.*xdebug.*)$/mi'; foreach ($iniFiles as $file) { // Check for inaccessible ini files if (($data = @\file_get_contents($file)) === \false) { $error = 'Unable to read ini: ' . $file; return \false; } // Check and remove directives after HOST and PATH sections if (Preg::isMatchWithOffsets($sectionRegex, $data, $matches)) { $data = \substr($data, 0, $matches[0][1]); } $content .= Preg::replace($xdebugRegex, ';$1', $data) . \PHP_EOL; } // Merge loaded settings into our ini content, if it is valid $config = \parse_ini_string($content); $loaded = \ini_get_all(null, \false); if (\false === $config || \false === $loaded) { $error = 'Unable to parse ini data'; return \false; } $content .= $this->mergeLoadedConfig($loaded, $config); // Work-around for https://bugs.php.net/bug.php?id=75932 $content .= 'opcache.enable_cli=0' . \PHP_EOL; return (bool) @\file_put_contents($tmpFile, $content); } /** * Returns the command line arguments for the restart * * @param non-empty-list $argv * @return non-empty-list */ private function getCommand(array $argv, string $tmpIni, string $mainScript) : array { $php = [\PHP_BINARY]; $args = \array_slice($argv, 1); if (!$this->persistent) { // Use command-line options \array_push($php, '-n', '-c', $tmpIni); } return \array_merge($php, [$mainScript], $args); } /** * Returns true if the restart environment variables were set * * No need to update $_SERVER since this is set in the restarted process. * * @param non-empty-list $iniFiles All ini files used in the current process */ private function setEnvironment(bool $scannedInis, array $iniFiles, string $tmpIni) : bool { $scanDir = \getenv('PHP_INI_SCAN_DIR'); $phprc = \getenv('PHPRC'); // Make original inis available to restarted process if (!\putenv($this->envOriginalInis . '=' . \implode(\PATH_SEPARATOR, $iniFiles))) { return \false; } if ($this->persistent) { // Use the environment to persist the settings if (!\putenv('PHP_INI_SCAN_DIR=') || !\putenv('PHPRC=' . $tmpIni)) { return \false; } } // Flag restarted process and save values for it to use $envArgs = [self::RESTART_ID, self::$xdebugVersion, (int) $scannedInis, \false === $scanDir ? '*' : $scanDir, \false === $phprc ? '*' : $phprc]; return \putenv($this->envAllowXdebug . '=' . \implode('|', $envArgs)); } /** * Logs status messages */ private function notify(string $op, ?string $data = null) : void { $this->statusWriter->report($op, $data); } /** * Returns default, changed and command-line ini settings * * @param mixed[] $loadedConfig All current ini settings * @param mixed[] $iniConfig Settings from user ini files * */ private function mergeLoadedConfig(array $loadedConfig, array $iniConfig) : string { $content = ''; foreach ($loadedConfig as $name => $value) { // Value will either be null, string or array (HHVM only) if (!\is_string($value) || \strpos($name, 'xdebug') === 0 || $name === 'apc.mmap_file_mask') { continue; } if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { // Double-quote escape each value $content .= $name . '="' . \addcslashes($value, '\\"') . '"' . \PHP_EOL; } } return $content; } /** * Returns true if the script name can be used * * @param non-empty-list $argv */ private function checkMainScript(string &$mainScript, array $argv) : bool { if ($mainScript !== '') { // Allow an application to set -- for standard input return \file_exists($mainScript) || '--' === $mainScript; } if (\file_exists($mainScript = $argv[0])) { return \true; } // Use a backtrace to resolve Phar and chdir issues. $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); $main = \end($trace); if ($main !== \false && isset($main['file'])) { return \file_exists($mainScript = $main['file']); } return \false; } /** * Adds restart settings to the environment * * @param non-empty-list $envArgs */ private function setEnvRestartSettings(array $envArgs) : void { $settings = [\php_ini_loaded_file(), $envArgs[2], $envArgs[3], $envArgs[4], \getenv($this->envOriginalInis), self::$skipped]; Process::setEnv(self::RESTART_SETTINGS, \implode('|', $settings)); } /** * Syncs settings and the environment if called with existing settings * * @phpstan-param restartData $settings */ private function syncSettings(array $settings) : void { if (\false === \getenv($this->envOriginalInis)) { // Called by another app, so make original inis available Process::setEnv($this->envOriginalInis, \implode(\PATH_SEPARATOR, $settings['inis'])); } self::$skipped = $settings['skipped']; $this->notify(Status::INFO, 'Process called with existing restart settings'); } /** * Returns true if there are no known configuration issues */ private function checkConfiguration(?string &$info) : bool { if (!\function_exists('proc_open')) { $info = 'proc_open function is disabled'; return \false; } if (!\file_exists(\PHP_BINARY)) { $info = 'PHP_BINARY is not available'; return \false; } if (\extension_loaded('uopz') && !(bool) \ini_get('uopz.disable')) { // uopz works at opcode level and disables exit calls if (\function_exists('uopz_allow_exit')) { @\uopz_allow_exit(\true); } else { $info = 'uopz extension is not compatible'; return \false; } } // Check UNC paths when using cmd.exe if (\defined('PHP_WINDOWS_VERSION_BUILD') && \PHP_VERSION_ID < 70400) { $workingDir = \getcwd(); if ($workingDir === \false) { $info = 'unable to determine working directory'; return \false; } if (0 === \strpos($workingDir, '\\\\')) { $info = 'cmd.exe does not support UNC paths: ' . $workingDir; return \false; } } return \true; } /** * Enables async signals and control interrupts in the restarted process * * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+. */ private function tryEnableSignals() : void { if (\function_exists('pcntl_async_signals') && \function_exists('pcntl_signal')) { \pcntl_async_signals(\true); $message = 'Async signals enabled'; if (!self::$inRestart) { // Restarting, so ignore SIGINT in parent \pcntl_signal(\SIGINT, \SIG_IGN); } elseif (\is_int(\pcntl_signal_get_handler(\SIGINT))) { // Restarted, no handler set so force default action \pcntl_signal(\SIGINT, \SIG_DFL); } } if (!self::$inRestart && \function_exists('sapi_windows_set_ctrl_handler')) { // Restarting, so set a handler to ignore CTRL events in the parent. // This ensures that CTRL+C events will be available in the child // process without having to enable them there, which is unreliable. \sapi_windows_set_ctrl_handler(function ($evt) { }); } } /** * Returns $_SERVER['argv'] if it is as expected * * @return non-empty-list|null */ private function checkServerArgv() : ?array { $result = []; if (isset($_SERVER['argv']) && \is_array($_SERVER['argv'])) { foreach ($_SERVER['argv'] as $value) { if (!\is_string($value)) { return null; } $result[] = $value; } } return \count($result) > 0 ? $result : null; } /** * Sets static properties $xdebugActive, $xdebugVersion and $xdebugMode */ private static function setXdebugDetails() : void { if (self::$xdebugActive !== null) { return; } self::$xdebugActive = \false; if (!\extension_loaded('xdebug')) { return; } $version = \phpversion('xdebug'); self::$xdebugVersion = $version !== \false ? $version : 'unknown'; if (\version_compare(self::$xdebugVersion, '3.1', '>=')) { $modes = \xdebug_info('mode'); self::$xdebugMode = \count($modes) === 0 ? 'off' : \implode(',', $modes); self::$xdebugActive = self::$xdebugMode !== 'off'; return; } // See if xdebug.mode is supported in this version $iniMode = \ini_get('xdebug.mode'); if ($iniMode === \false) { self::$xdebugActive = \true; return; } // Environment value wins but cannot be empty $envMode = (string) \getenv('XDEBUG_MODE'); if ($envMode !== '') { self::$xdebugMode = $envMode; } else { self::$xdebugMode = $iniMode !== '' ? $iniMode : 'off'; } // An empty comma-separated list is treated as mode 'off' if (Preg::isMatch('/^,+$/', \str_replace(' ', '', self::$xdebugMode))) { self::$xdebugMode = 'off'; } self::$xdebugActive = self::$xdebugMode !== 'off'; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace _PHPStan_8c66d8255\Composer\XdebugHandler; use _PHPStan_8c66d8255\Composer\Pcre\Preg; /** * Process utility functions * * @author John Stevenson */ class Process { /** * Escapes a string to be used as a shell argument. * * From https://github.com/johnstevenson/winbox-args * MIT Licensed (c) John Stevenson * * @param string $arg The argument to be escaped * @param bool $meta Additionally escape cmd.exe meta characters * @param bool $module The argument is the module to invoke */ public static function escape(string $arg, bool $meta = \true, bool $module = \false) : string { if (!\defined('PHP_WINDOWS_VERSION_BUILD')) { return "'" . \str_replace("'", "'\\''", $arg) . "'"; } $quote = \strpbrk($arg, " \t") !== \false || $arg === ''; $arg = Preg::replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); $dquotes = (bool) $dquotes; if ($meta) { $meta = $dquotes || Preg::isMatch('/%[^%]+%/', $arg); if (!$meta) { $quote = $quote || \strpbrk($arg, '^&|<>()') !== \false; } elseif ($module && !$dquotes && $quote) { $meta = \false; } } if ($quote) { $arg = '"' . Preg::replace('/(\\\\*)$/', '$1$1', $arg) . '"'; } if ($meta) { $arg = Preg::replace('/(["^&|<>()%])/', '^$1', $arg); } return $arg; } /** * Escapes an array of arguments that make up a shell command * * @param string[] $args Argument list, with the module name first */ public static function escapeShellCommand(array $args) : string { $command = ''; $module = \array_shift($args); if ($module !== null) { $command = self::escape($module, \true, \true); foreach ($args as $arg) { $command .= ' ' . self::escape($arg); } } return $command; } /** * Makes putenv environment changes available in $_SERVER and $_ENV * * @param string $name * @param ?string $value A null value unsets the variable */ public static function setEnv(string $name, ?string $value = null) : bool { $unset = null === $value; if (!\putenv($unset ? $name : $name . '=' . $value)) { return \false; } if ($unset) { unset($_SERVER[$name]); } else { $_SERVER[$name] = $value; } // Update $_ENV if it is being used if (\false !== \stripos((string) \ini_get('variables_order'), 'E')) { if ($unset) { unset($_ENV[$name]); } else { $_ENV[$name] = $value; } } return \true; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace _PHPStan_8c66d8255\Composer\XdebugHandler; use _PHPStan_8c66d8255\Psr\Log\LoggerInterface; use _PHPStan_8c66d8255\Psr\Log\LogLevel; /** * @author John Stevenson * @internal */ class Status { const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; const CHECK = 'Check'; const ERROR = 'Error'; const INFO = 'Info'; const NORESTART = 'NoRestart'; const RESTART = 'Restart'; const RESTARTING = 'Restarting'; const RESTARTED = 'Restarted'; /** @var bool */ private $debug; /** @var string */ private $envAllowXdebug; /** @var string|null */ private $loaded; /** @var LoggerInterface|null */ private $logger; /** @var bool */ private $modeOff; /** @var float */ private $time; /** * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name * @param bool $debug Whether debug output is required */ public function __construct(string $envAllowXdebug, bool $debug) { $start = \getenv(self::ENV_RESTART); Process::setEnv(self::ENV_RESTART); $this->time = \is_numeric($start) ? \round((\microtime(\true) - $start) * 1000) : 0; $this->envAllowXdebug = $envAllowXdebug; $this->debug = $debug && \defined('STDERR'); $this->modeOff = \false; } /** * Activates status message output to a PSR3 logger * * @return void */ public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } /** * Calls a handler method to report a message * * @throws \InvalidArgumentException If $op is not known */ public function report(string $op, ?string $data) : void { if ($this->logger !== null || $this->debug) { $param = (string) $data; switch ($op) { case self::CHECK: $this->reportCheck($param); break; case self::ERROR: $this->reportError($param); break; case self::INFO: $this->reportInfo($param); break; case self::NORESTART: $this->reportNoRestart(); break; case self::RESTART: $this->reportRestart(); break; case self::RESTARTED: $this->reportRestarted(); break; case self::RESTARTING: $this->reportRestarting($param); break; default: throw new \InvalidArgumentException('Unknown op handler: ' . $op); } } } /** * Outputs a status message */ private function output(string $text, ?string $level = null) : void { if ($this->logger !== null) { $this->logger->log($level !== null ? $level : LogLevel::DEBUG, $text); } if ($this->debug) { \fwrite(\STDERR, \sprintf('xdebug-handler[%d] %s', \getmypid(), $text . \PHP_EOL)); } } /** * Checking status message */ private function reportCheck(string $loaded) : void { list($version, $mode) = \explode('|', $loaded); if ($version !== '') { $this->loaded = '(' . $version . ')' . ($mode !== '' ? ' xdebug.mode=' . $mode : ''); } $this->modeOff = $mode === 'off'; $this->output('Checking ' . $this->envAllowXdebug); } /** * Error status message */ private function reportError(string $error) : void { $this->output(\sprintf('No restart (%s)', $error), LogLevel::WARNING); } /** * Info status message */ private function reportInfo(string $info) : void { $this->output($info); } /** * No restart status message */ private function reportNoRestart() : void { $this->output($this->getLoadedMessage()); if ($this->loaded !== null) { $text = \sprintf('No restart (%s)', $this->getEnvAllow()); if (!(bool) \getenv($this->envAllowXdebug)) { $text .= ' Allowed by ' . ($this->modeOff ? 'xdebug.mode' : 'application'); } $this->output($text); } } /** * Restart status message */ private function reportRestart() : void { $this->output($this->getLoadedMessage()); Process::setEnv(self::ENV_RESTART, (string) \microtime(\true)); } /** * Restarted status message */ private function reportRestarted() : void { $loaded = $this->getLoadedMessage(); $text = \sprintf('Restarted (%d ms). %s', $this->time, $loaded); $level = $this->loaded !== null ? LogLevel::WARNING : null; $this->output($text, $level); } /** * Restarting status message */ private function reportRestarting(string $command) : void { $text = \sprintf('Process restarting (%s)', $this->getEnvAllow()); $this->output($text); $text = 'Running: ' . $command; $this->output($text); } /** * Returns the _ALLOW_XDEBUG environment variable as name=value */ private function getEnvAllow() : string { return $this->envAllowXdebug . '=' . \getenv($this->envAllowXdebug); } /** * Returns the Xdebug status and version */ private function getLoadedMessage() : string { $loaded = $this->loaded !== null ? \sprintf('loaded %s', $this->loaded) : 'not loaded'; return 'The Xdebug extension is ' . $loaded; } } * 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); } } 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. services: - class: _PHPStan_8c66d8255\Composer\Pcre\PHPStan\PregMatchParameterOutTypeExtension tags: - phpstan.staticMethodParameterOutTypeExtension - class: _PHPStan_8c66d8255\Composer\Pcre\PHPStan\PregMatchTypeSpecifyingExtension tags: - phpstan.typeSpecifier.staticMethodTypeSpecifyingExtension - class: _PHPStan_8c66d8255\Composer\Pcre\PHPStan\PregReplaceCallbackClosureTypeExtension tags: - phpstan.staticMethodParameterClosureTypeExtension rules: - Composer\Pcre\PHPStan\UnsafeStrictGroupsCallRule - Composer\Pcre\PHPStan\InvalidRegexPatternRule Copyright (C) 2021 Composer 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. * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class ReplaceResult { /** * @readonly * @var string */ public $result; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count */ public function __construct(int $count, string $result) { $this->count = $count; $this->matched = (bool) $count; $this->result = $result; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class MatchAllWithOffsetsResult { /** * An array of match group => list of matches, every match being a pair of string matched + offset in bytes (or -1 if no match) * * @readonly * @var array> * @phpstan-var array}>> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches * @phpstan-param array}>> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class MatchAllStrictGroupsResult { /** * An array of match group => list of matched strings * * @readonly * @var array> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class MatchStrictGroupsResult { /** * An array of match group => string matched * * @readonly * @var array */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class MatchWithOffsetsResult { /** * An array of match group => pair of string matched + offset in bytes (or -1 if no match) * * @readonly * @var array * @phpstan-var array}> */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches * @phpstan-param array}> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; class PcreException extends \RuntimeException { /** * @param string $function * @param string|string[] $pattern * @return self */ public static function fromFunction($function, $pattern) { $code = \preg_last_error(); if (\is_array($pattern)) { $pattern = \implode(', ', $pattern); } return new PcreException($function . '(): failed executing "' . $pattern . '": ' . self::pcreLastErrorMessage($code), $code); } /** * @param int $code * @return string */ private static function pcreLastErrorMessage($code) { if (\function_exists('preg_last_error_msg')) { return \preg_last_error_msg(); } // older php versions did not set the code properly in all cases if (\PHP_VERSION_ID < 70201 && $code === 0) { return 'UNDEFINED_ERROR'; } $constants = \get_defined_constants(\true); if (!isset($constants['pcre'])) { return 'UNDEFINED_ERROR'; } foreach ($constants['pcre'] as $const => $val) { if ($val === $code && \substr($const, -6) === '_ERROR') { return $const; } } return 'UNDEFINED_ERROR'; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class MatchAllResult { /** * An array of match group => list of matched strings * * @readonly * @var array> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } getType($flagsArg->value); $constantScalars = $flagsType->getConstantScalarValues(); if ($constantScalars === []) { return null; } $internalFlagsTypes = []; foreach ($flagsType->getConstantScalarValues() as $constantScalarValue) { if (!\is_int($constantScalarValue)) { return null; } $internalFlagsTypes[] = new ConstantIntegerType($constantScalarValue | \PREG_UNMATCHED_AS_NULL); } return TypeCombinator::union(...$internalFlagsTypes); } public static function removeNullFromMatches(Type $matchesType) : Type { return TypeTraverser::map($matchesType, static function (Type $type, callable $traverse) : Type { if ($type instanceof UnionType || $type instanceof IntersectionType) { return $traverse($type); } if ($type instanceof ConstantArrayType) { return new ConstantArrayType($type->getKeyTypes(), \array_map(static function (Type $valueType) use($traverse) : Type { return $traverse($valueType); }, $type->getValueTypes()), $type->getNextAutoIndexes(), [], $type->isList()); } if ($type instanceof ArrayType) { return new ArrayType($type->getKeyType(), $traverse($type->getItemType())); } return TypeCombinator::removeNull($type); }); } } regexShapeMatcher = $regexShapeMatcher; } public function isStaticMethodSupported(MethodReflection $methodReflection, ParameterReflection $parameter) : bool { return $methodReflection->getDeclaringClass()->getName() === Preg::class && \in_array($methodReflection->getName(), ['match', 'isMatch', 'matchStrictGroups', 'isMatchStrictGroups', 'matchAll', 'isMatchAll', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true) && $parameter->getName() === 'matches'; } public function getParameterOutTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, ParameterReflection $parameter, Scope $scope) : ?Type { $args = $methodCall->getArgs(); $patternArg = $args[0] ?? null; $matchesArg = $args[2] ?? null; $flagsArg = $args[3] ?? null; if ($patternArg === null || $matchesArg === null) { return null; } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); if ($flagsType === null) { return null; } if (\stripos($methodReflection->getName(), 'matchAll') !== \false) { return $this->regexShapeMatcher->matchAllExpr($patternArg->value, $flagsType, TrinaryLogic::createMaybe(), $scope); } return $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createMaybe(), $scope); } } */ class InvalidRegexPatternRule implements Rule { public function getNodeType() : string { return StaticCall::class; } public function processNode(Node $node, Scope $scope) : array { $patterns = $this->extractPatterns($node, $scope); $errors = []; foreach ($patterns as $pattern) { $errorMessage = $this->validatePattern($pattern); if ($errorMessage === null) { continue; } $errors[] = RuleErrorBuilder::message(sprintf('Regex pattern is invalid: %s', $errorMessage))->identifier('regexp.pattern')->build(); } return $errors; } /** * @return string[] */ private function extractPatterns(StaticCall $node, Scope $scope) : array { if (!$node->class instanceof FullyQualified) { return []; } $isRegex = $node->class->toString() === Regex::class; $isPreg = $node->class->toString() === Preg::class; if (!$isRegex && !$isPreg) { return []; } if (!$node->name instanceof Node\Identifier || !Preg::isMatch('{^(match|isMatch|grep|replace|split)}', $node->name->name)) { return []; } $functionName = $node->name->name; if (!isset($node->getArgs()[0])) { return []; } $patternNode = $node->getArgs()[0]->value; $patternType = $scope->getType($patternNode); $patternStrings = []; foreach ($patternType->getConstantStrings() as $constantStringType) { if ($functionName === 'replaceCallbackArray') { continue; } $patternStrings[] = $constantStringType->getValue(); } foreach ($patternType->getConstantArrays() as $constantArrayType) { if (in_array($functionName, ['replace', 'replaceCallback'], \true)) { foreach ($constantArrayType->getValueTypes() as $arrayKeyType) { foreach ($arrayKeyType->getConstantStrings() as $constantString) { $patternStrings[] = $constantString->getValue(); } } } if ($functionName !== 'replaceCallbackArray') { continue; } foreach ($constantArrayType->getKeyTypes() as $arrayKeyType) { foreach ($arrayKeyType->getConstantStrings() as $constantString) { $patternStrings[] = $constantString->getValue(); } } } return $patternStrings; } private function validatePattern(string $pattern) : ?string { try { $msg = null; $prev = \set_error_handler(function (int $severity, string $message, string $file) use(&$msg) : bool { $msg = \preg_replace("#^preg_match(_all)?\\(.*?\\): #", '', $message); return \true; }); if ($pattern === '') { return 'Empty string is not a valid regular expression'; } Preg::match($pattern, ''); if ($msg !== null) { return $msg; } } catch (PcreException $e) { if ($e->getCode() === \PREG_INTERNAL_ERROR && $msg !== null) { return $msg; } return \preg_replace('{.*? failed executing ".*": }', '', $e->getMessage()); } finally { \restore_error_handler(); } return null; } } */ final class UnsafeStrictGroupsCallRule implements Rule { /** * @var RegexArrayShapeMatcher */ private $regexShapeMatcher; public function __construct(RegexArrayShapeMatcher $regexShapeMatcher) { $this->regexShapeMatcher = $regexShapeMatcher; } public function getNodeType() : string { return StaticCall::class; } public function processNode(Node $node, Scope $scope) : array { if (!$node->class instanceof FullyQualified) { return []; } $isRegex = $node->class->toString() === Regex::class; $isPreg = $node->class->toString() === Preg::class; if (!$isRegex && !$isPreg) { return []; } if (!$node->name instanceof Node\Identifier || !\in_array($node->name->name, ['matchStrictGroups', 'isMatchStrictGroups', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true)) { return []; } $args = $node->getArgs(); if (!isset($args[0])) { return []; } $patternArg = $args[0] ?? null; if ($isPreg) { if (!isset($args[2])) { // no matches set, skip as the matches won't be used anyway return []; } $flagsArg = $args[3] ?? null; } else { $flagsArg = $args[2] ?? null; } if ($patternArg === null) { return []; } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); if ($flagsType === null) { return []; } $matchedType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createYes(), $scope); if ($matchedType === null) { return [RuleErrorBuilder::message(sprintf('The %s call is potentially unsafe as $matches\' type could not be inferred.', $node->name->name))->identifier('composerPcre.maybeUnsafeStrictGroups')->build()]; } if (\count($matchedType->getConstantArrays()) === 1) { $matchedType = $matchedType->getConstantArrays()[0]; $nullableGroups = []; foreach ($matchedType->getValueTypes() as $index => $type) { if (TypeCombinator::containsNull($type)) { $nullableGroups[] = $matchedType->getKeyTypes()[$index]->getValue(); } } if (\count($nullableGroups) > 0) { return [RuleErrorBuilder::message(sprintf('The %s call is unsafe as match group%s "%s" %s optional and may be null.', $node->name->name, \count($nullableGroups) > 1 ? 's' : '', \implode('", "', $nullableGroups), \count($nullableGroups) > 1 ? 'are' : 'is'))->identifier('composerPcre.unsafeStrictGroups')->build()]; } } return []; } } regexShapeMatcher = $regexShapeMatcher; } public function isStaticMethodSupported(MethodReflection $methodReflection, ParameterReflection $parameter) : bool { return \in_array($methodReflection->getDeclaringClass()->getName(), [Preg::class, Regex::class], \true) && \in_array($methodReflection->getName(), ['replaceCallback', 'replaceCallbackStrictGroups'], \true) && $parameter->getName() === 'replacement'; } public function getTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, ParameterReflection $parameter, Scope $scope) : ?Type { $args = $methodCall->getArgs(); $patternArg = $args[0] ?? null; $flagsArg = $args[5] ?? null; if ($patternArg === null) { return null; } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); $matchesType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createYes(), $scope); if ($matchesType === null) { return null; } if ($methodReflection->getName() === 'replaceCallbackStrictGroups' && \count($matchesType->getConstantArrays()) === 1) { $matchesType = $matchesType->getConstantArrays()[0]; $matchesType = new ConstantArrayType($matchesType->getKeyTypes(), \array_map(static function (Type $valueType) : Type { if (\count($valueType->getConstantArrays()) === 1) { $valueTypeArray = $valueType->getConstantArrays()[0]; return new ConstantArrayType($valueTypeArray->getKeyTypes(), \array_map(static function (Type $valueType) : Type { return TypeCombinator::removeNull($valueType); }, $valueTypeArray->getValueTypes()), $valueTypeArray->getNextAutoIndexes(), [], $valueTypeArray->isList()); } return TypeCombinator::removeNull($valueType); }, $matchesType->getValueTypes()), $matchesType->getNextAutoIndexes(), [], $matchesType->isList()); } return new ClosureType([new NativeParameterReflection($parameter->getName(), $parameter->isOptional(), $matchesType, $parameter->passedByReference(), $parameter->isVariadic(), $parameter->getDefaultValue())], new StringType()); } } regexShapeMatcher = $regexShapeMatcher; } public function setTypeSpecifier(TypeSpecifier $typeSpecifier) : void { $this->typeSpecifier = $typeSpecifier; } public function getClass() : string { return Preg::class; } public function isStaticMethodSupported(MethodReflection $methodReflection, StaticCall $node, TypeSpecifierContext $context) : bool { return \in_array($methodReflection->getName(), ['match', 'isMatch', 'matchStrictGroups', 'isMatchStrictGroups', 'matchAll', 'isMatchAll', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true) && !$context->null(); } public function specifyTypes(MethodReflection $methodReflection, StaticCall $node, Scope $scope, TypeSpecifierContext $context) : SpecifiedTypes { $args = $node->getArgs(); $patternArg = $args[0] ?? null; $matchesArg = $args[2] ?? null; $flagsArg = $args[3] ?? null; if ($patternArg === null || $matchesArg === null) { return new SpecifiedTypes(); } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); if ($flagsType === null) { return new SpecifiedTypes(); } if (\stripos($methodReflection->getName(), 'matchAll') !== \false) { $matchedType = $this->regexShapeMatcher->matchAllExpr($patternArg->value, $flagsType, TrinaryLogic::createFromBoolean($context->true()), $scope); } else { $matchedType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createFromBoolean($context->true()), $scope); } if ($matchedType === null) { return new SpecifiedTypes(); } if (\in_array($methodReflection->getName(), ['matchStrictGroups', 'isMatchStrictGroups', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true)) { $matchedType = \Composer\Pcre\PHPStan\PregMatchFlags::removeNullFromMatches($matchedType); } $overwrite = \false; if ($context->false()) { $overwrite = \true; $context = $context->negate(); } return $this->typeSpecifier->create($matchesArg->value, $matchedType, $context, $overwrite, $scope, $node); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; final class MatchResult { /** * An array of match group => string matched * * @readonly * @var array */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; class Regex { /** * @param non-empty-string $pattern */ public static function isMatch(string $pattern, string $subject, int $offset = 0) : bool { return (bool) Preg::match($pattern, $subject, $matches, 0, $offset); } /** * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported */ public static function match(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchResult { self::checkOffsetCapture($flags, 'matchWithOffsets'); $count = Preg::match($pattern, $subject, $matches, $flags, $offset); return new MatchResult($count, $matches); } /** * Variant of `match()` which returns non-null matches (or throws) * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException */ public static function matchStrictGroups(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchStrictGroupsResult { // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups $count = Preg::matchStrictGroups($pattern, $subject, $matches, $flags, $offset); return new MatchStrictGroupsResult($count, $matches); } /** * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported */ public static function matchWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchWithOffsetsResult { $count = Preg::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); return new MatchWithOffsetsResult($count, $matches); } /** * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported */ public static function matchAll(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchAllResult { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $count = Preg::matchAll($pattern, $subject, $matches, $flags, $offset); return new MatchAllResult($count, $matches); } /** * Variant of `matchAll()` which returns non-null matches (or throws) * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException */ public static function matchAllStrictGroups(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchAllStrictGroupsResult { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups $count = Preg::matchAllStrictGroups($pattern, $subject, $matches, $flags, $offset); return new MatchAllStrictGroupsResult($count, $matches); } /** * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported */ public static function matchAllWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchAllWithOffsetsResult { self::checkSetOrder($flags); $count = Preg::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); return new MatchAllWithOffsetsResult($count, $matches); } /** * @param string|string[] $pattern * @param string|string[] $replacement * @param string $subject */ public static function replace($pattern, $replacement, $subject, int $limit = -1) : ReplaceResult { $result = Preg::replace($pattern, $replacement, $subject, $limit, $count); return new ReplaceResult($count, $result); } /** * @param string|string[] $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0) : ReplaceResult { $result = Preg::replaceCallback($pattern, $replacement, $subject, $limit, $count, $flags); return new ReplaceResult($count, $result); } /** * Variant of `replaceCallback()` which outputs non-null matches (or throws) * * @param string $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallbackStrictGroups($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0) : ReplaceResult { $result = Preg::replaceCallbackStrictGroups($pattern, $replacement, $subject, $limit, $count, $flags); return new ReplaceResult($count, $result); } /** * @param ($flags is PREG_OFFSET_CAPTURE ? (array}>): string>) : array): string>) $pattern * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int $flags = 0) : ReplaceResult { $result = Preg::replaceCallbackArray($pattern, $subject, $limit, $count, $flags); return new ReplaceResult($count, $result); } private static function checkOffsetCapture(int $flags, string $useFunctionName) : void { if (($flags & \PREG_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use ' . $useFunctionName . '() instead'); } } private static function checkSetOrder(int $flags) : void { if (($flags & \PREG_SET_ORDER) !== 0) { throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the return type'); } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; class Preg { /** @internal */ public const ARRAY_MSG = '$subject as an array is not supported. You can use \'foreach\' instead.'; /** @internal */ public const INVALID_TYPE_MSG = '$subject must be a string, %s given.'; /** * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|1 * * @param-out array $matches */ public static function match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { self::checkOffsetCapture($flags, 'matchWithOffsets'); $result = \preg_match($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset); if ($result === \false) { throw PcreException::fromFunction('preg_match', $pattern); } return $result; } /** * Variant of `match()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|1 * @throws UnexpectedNullMatchException * * @param-out array $matches */ public static function matchStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { $result = self::match($pattern, $subject, $matchesInternal, $flags, $offset); $matches = self::enforceNonNullMatches($pattern, $matchesInternal, 'match'); return $result; } /** * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_OFFSET_CAPTURE are always set, no other flags are supported * @return 0|1 * * @param-out array}> $matches */ public static function matchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { $result = \preg_match($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL | \PREG_OFFSET_CAPTURE, $offset); if ($result === \false) { throw PcreException::fromFunction('preg_match', $pattern); } return $result; } /** * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|positive-int * * @param-out array> $matches */ public static function matchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $result = \preg_match_all($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset); if (!\is_int($result)) { // PHP < 8 may return null, 8+ returns int|false throw PcreException::fromFunction('preg_match_all', $pattern); } return $result; } /** * Variant of `match()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|positive-int * @throws UnexpectedNullMatchException * * @param-out array> $matches */ public static function matchAllStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { $result = self::matchAll($pattern, $subject, $matchesInternal, $flags, $offset); $matches = self::enforceNonNullMatchAll($pattern, $matchesInternal, 'matchAll'); return $result; } /** * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported * @return 0|positive-int * * @param-out array}>> $matches */ public static function matchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { self::checkSetOrder($flags); $result = \preg_match_all($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL | \PREG_OFFSET_CAPTURE, $offset); if (!\is_int($result)) { // PHP < 8 may return null, 8+ returns int|false throw PcreException::fromFunction('preg_match_all', $pattern); } return $result; } /** * @param string|string[] $pattern * @param string|string[] $replacement * @param string $subject * @param int $count Set by method * * @param-out int<0, max> $count */ public static function replace($pattern, $replacement, $subject, int $limit = -1, ?int &$count = null) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace($pattern, $replacement, $subject, $limit, $count); if ($result === null) { throw PcreException::fromFunction('preg_replace', $pattern); } return $result; } /** * @param string|string[] $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, ?int &$count = null, int $flags = 0) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace_callback($pattern, $replacement, $subject, $limit, $count, $flags | \PREG_UNMATCHED_AS_NULL); if ($result === null) { throw PcreException::fromFunction('preg_replace_callback', $pattern); } return $result; } /** * Variant of `replaceCallback()` which outputs non-null matches (or throws) * * @param string $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallbackStrictGroups(string $pattern, callable $replacement, $subject, int $limit = -1, ?int &$count = null, int $flags = 0) : string { return self::replaceCallback($pattern, function (array $matches) use($pattern, $replacement) { return $replacement(self::enforceNonNullMatches($pattern, $matches, 'replaceCallback')); }, $subject, $limit, $count, $flags); } /** * @param ($flags is PREG_OFFSET_CAPTURE ? (array}>): string>) : array): string>) $pattern * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags | \PREG_UNMATCHED_AS_NULL); if ($result === null) { $pattern = \array_keys($pattern); throw PcreException::fromFunction('preg_replace_callback_array', $pattern); } return $result; } /** * @param int-mask $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE * @return list */ public static function split(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { if (($flags & \PREG_SPLIT_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_SPLIT_OFFSET_CAPTURE is not supported as it changes the type of $matches, use splitWithOffsets() instead'); } $result = \preg_split($pattern, $subject, $limit, $flags); if ($result === \false) { throw PcreException::fromFunction('preg_split', $pattern); } return $result; } /** * @param int-mask $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE is always set * @return list * @phpstan-return list}> */ public static function splitWithOffsets(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { $result = \preg_split($pattern, $subject, $limit, $flags | \PREG_SPLIT_OFFSET_CAPTURE); if ($result === \false) { throw PcreException::fromFunction('preg_split', $pattern); } return $result; } /** * @template T of string|\Stringable * @param string $pattern * @param array $array * @param int-mask $flags PREG_GREP_INVERT * @return array */ public static function grep(string $pattern, array $array, int $flags = 0) : array { $result = \preg_grep($pattern, $array, $flags); if ($result === \false) { throw PcreException::fromFunction('preg_grep', $pattern); } return $result; } /** * Variant of match() which returns a bool instead of int * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array $matches */ public static function isMatch(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) static::match($pattern, $subject, $matches, $flags, $offset); } /** * Variant of `isMatch()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException * * @param-out array $matches */ public static function isMatchStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) self::matchStrictGroups($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchAll() which returns a bool instead of int * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array> $matches */ public static function isMatchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchAll($pattern, $subject, $matches, $flags, $offset); } /** * Variant of `isMatchAll()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array> $matches */ public static function isMatchAllStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) self::matchAllStrictGroups($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchWithOffsets() which returns a bool instead of int * * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array}> $matches */ public static function isMatchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchAllWithOffsets() which returns a bool instead of int * * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array}>> $matches */ public static function isMatchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); } private static function checkOffsetCapture(int $flags, string $useFunctionName) : void { if (($flags & \PREG_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use ' . $useFunctionName . '() instead'); } } private static function checkSetOrder(int $flags) : void { if (($flags & \PREG_SET_ORDER) !== 0) { throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the type of $matches'); } } /** * @param array $matches * @return array * @throws UnexpectedNullMatchException */ private static function enforceNonNullMatches(string $pattern, array $matches, string $variantMethod) { foreach ($matches as $group => $match) { if (\is_string($match) || \is_array($match) && \is_string($match[0])) { continue; } throw new UnexpectedNullMatchException('Pattern "' . $pattern . '" had an unexpected unmatched group "' . $group . '", make sure the pattern always matches or use ' . $variantMethod . '() instead.'); } /** @var array */ return $matches; } /** * @param array> $matches * @return array> * @throws UnexpectedNullMatchException */ private static function enforceNonNullMatchAll(string $pattern, array $matches, string $variantMethod) { foreach ($matches as $group => $groupMatches) { foreach ($groupMatches as $match) { if (null === $match) { throw new UnexpectedNullMatchException('Pattern "' . $pattern . '" had an unexpected unmatched group "' . $group . '", make sure the pattern always matches or use ' . $variantMethod . '() instead.'); } } } /** @var array> */ return $matches; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Pcre; class UnexpectedNullMatchException extends PcreException { public static function fromFunction($function, $pattern) { throw new \LogicException('fromFunction should not be called on ' . self::class . ', use ' . PcreException::class); } } array($vendorDir . '/symfony/polyfill-ctype'), '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), '_PHPStan_8c66d8255\\Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), '_PHPStan_8c66d8255\\React\\Stream\\' => array($vendorDir . '/react/stream/src'), '_PHPStan_8c66d8255\\React\\Socket\\' => array($vendorDir . '/react/socket/src'), '_PHPStan_8c66d8255\\React\\Promise\\' => array($vendorDir . '/react/promise/src'), '_PHPStan_8c66d8255\\React\\Http\\' => array($vendorDir . '/react/http/src'), '_PHPStan_8c66d8255\\React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), '_PHPStan_8c66d8255\\React\\Dns\\' => array($vendorDir . '/react/dns/src'), '_PHPStan_8c66d8255\\React\\ChildProcess\\' => array($vendorDir . '/react/child-process/src'), '_PHPStan_8c66d8255\\React\\Cache\\' => array($vendorDir . '/react/cache/src'), '_PHPStan_8c66d8255\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), '_PHPStan_8c66d8255\\Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), '_PHPStan_8c66d8255\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), '_PHPStan_8c66d8255\\OndraM\\CiDetector\\' => array($vendorDir . '/ondram/ci-detector/src'), '_PHPStan_8c66d8255\\Fig\\Http\\Message\\' => array($vendorDir . '/fig/http-message-util/src'), '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), '_PHPStan_8c66d8255\\Evenement\\' => array($vendorDir . '/evenement/evenement/src'), '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), '_PHPStan_8c66d8255\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), '_PHPStan_8c66d8255\\Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), '_PHPStan_8c66d8255\\Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'), '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\' => array($vendorDir . '/clue/ndjson-react/src'), 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php74\\' => array($vendorDir . '/symfony/polyfill-php74'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), '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'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), 'PHPStan\\BetterReflection\\' => array($vendorDir . '/ondrejmirtes/better-reflection/src'), 'PHPStan\\' => array($baseDir . '/src'), 'Hoa\\Zformat\\' => array($vendorDir . '/hoa/zformat'), 'Hoa\\Visitor\\' => array($vendorDir . '/hoa/visitor'), 'Hoa\\Ustring\\' => array($vendorDir . '/hoa/ustring'), 'Hoa\\Stream\\' => array($vendorDir . '/hoa/stream'), 'Hoa\\Regex\\' => array($vendorDir . '/hoa/regex'), 'Hoa\\Protocol\\' => array($vendorDir . '/hoa/protocol'), 'Hoa\\Math\\' => array($vendorDir . '/hoa/math'), 'Hoa\\Iterator\\' => array($vendorDir . '/hoa/iterator'), 'Hoa\\File\\' => array($vendorDir . '/hoa/file'), 'Hoa\\Exception\\' => array($vendorDir . '/hoa/exception'), 'Hoa\\Event\\' => array($vendorDir . '/hoa/event'), 'Hoa\\Consistency\\' => array($vendorDir . '/hoa/consistency'), 'Hoa\\Compiler\\' => array($vendorDir . '/hoa/compiler'), ); $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'CURLStringFile' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Hoa\\Compiler\\Bin\\Pp' => $vendorDir . '/hoa/compiler/Bin/Pp.php', 'Hoa\\Compiler\\Exception\\Exception' => $vendorDir . '/hoa/compiler/Exception/Exception.php', 'Hoa\\Compiler\\Exception\\FinalStateHasNotBeenReached' => $vendorDir . '/hoa/compiler/Exception/FinalStateHasNotBeenReached.php', 'Hoa\\Compiler\\Exception\\IllegalToken' => $vendorDir . '/hoa/compiler/Exception/IllegalToken.php', 'Hoa\\Compiler\\Exception\\Lexer' => $vendorDir . '/hoa/compiler/Exception/Lexer.php', 'Hoa\\Compiler\\Exception\\Rule' => $vendorDir . '/hoa/compiler/Exception/Rule.php', 'Hoa\\Compiler\\Exception\\UnexpectedToken' => $vendorDir . '/hoa/compiler/Exception/UnexpectedToken.php', 'Hoa\\Compiler\\Exception\\UnrecognizedToken' => $vendorDir . '/hoa/compiler/Exception/UnrecognizedToken.php', 'Hoa\\Compiler\\Ll1' => $vendorDir . '/hoa/compiler/Ll1.php', 'Hoa\\Compiler\\Llk\\Lexer' => $vendorDir . '/hoa/compiler/Llk/Lexer.php', 'Hoa\\Compiler\\Llk\\Llk' => $vendorDir . '/hoa/compiler/Llk/Llk.php', 'Hoa\\Compiler\\Llk\\Parser' => $vendorDir . '/hoa/compiler/Llk/Parser.php', 'Hoa\\Compiler\\Llk\\Rule\\Analyzer' => $vendorDir . '/hoa/compiler/Llk/Rule/Analyzer.php', 'Hoa\\Compiler\\Llk\\Rule\\Choice' => $vendorDir . '/hoa/compiler/Llk/Rule/Choice.php', 'Hoa\\Compiler\\Llk\\Rule\\Concatenation' => $vendorDir . '/hoa/compiler/Llk/Rule/Concatenation.php', 'Hoa\\Compiler\\Llk\\Rule\\Ekzit' => $vendorDir . '/hoa/compiler/Llk/Rule/Ekzit.php', 'Hoa\\Compiler\\Llk\\Rule\\Entry' => $vendorDir . '/hoa/compiler/Llk/Rule/Entry.php', 'Hoa\\Compiler\\Llk\\Rule\\Invocation' => $vendorDir . '/hoa/compiler/Llk/Rule/Invocation.php', 'Hoa\\Compiler\\Llk\\Rule\\Repetition' => $vendorDir . '/hoa/compiler/Llk/Rule/Repetition.php', 'Hoa\\Compiler\\Llk\\Rule\\Rule' => $vendorDir . '/hoa/compiler/Llk/Rule/Rule.php', 'Hoa\\Compiler\\Llk\\Rule\\Token' => $vendorDir . '/hoa/compiler/Llk/Rule/Token.php', 'Hoa\\Compiler\\Llk\\Sampler\\BoundedExhaustive' => $vendorDir . '/hoa/compiler/Llk/Sampler/BoundedExhaustive.php', 'Hoa\\Compiler\\Llk\\Sampler\\Coverage' => $vendorDir . '/hoa/compiler/Llk/Sampler/Coverage.php', 'Hoa\\Compiler\\Llk\\Sampler\\Exception' => $vendorDir . '/hoa/compiler/Llk/Sampler/Exception.php', 'Hoa\\Compiler\\Llk\\Sampler\\Sampler' => $vendorDir . '/hoa/compiler/Llk/Sampler/Sampler.php', 'Hoa\\Compiler\\Llk\\Sampler\\Uniform' => $vendorDir . '/hoa/compiler/Llk/Sampler/Uniform.php', 'Hoa\\Compiler\\Llk\\TreeNode' => $vendorDir . '/hoa/compiler/Llk/TreeNode.php', 'Hoa\\Compiler\\Visitor\\Dump' => $vendorDir . '/hoa/compiler/Visitor/Dump.php', 'Hoa\\Consistency\\Autoloader' => $vendorDir . '/hoa/consistency/Autoloader.php', 'Hoa\\Consistency\\Consistency' => $vendorDir . '/hoa/consistency/Consistency.php', 'Hoa\\Consistency\\Exception' => $vendorDir . '/hoa/consistency/Exception.php', 'Hoa\\Consistency\\Xcallable' => $vendorDir . '/hoa/consistency/Xcallable.php', 'Hoa\\Event\\Bucket' => $vendorDir . '/hoa/event/Bucket.php', 'Hoa\\Event\\Event' => $vendorDir . '/hoa/event/Event.php', 'Hoa\\Event\\Exception' => $vendorDir . '/hoa/event/Exception.php', 'Hoa\\Event\\Listenable' => $vendorDir . '/hoa/event/Listenable.php', 'Hoa\\Event\\Listener' => $vendorDir . '/hoa/event/Listener.php', 'Hoa\\Event\\Listens' => $vendorDir . '/hoa/event/Listens.php', 'Hoa\\Event\\Source' => $vendorDir . '/hoa/event/Source.php', 'Hoa\\Exception\\Error' => $vendorDir . '/hoa/exception/Error.php', 'Hoa\\Exception\\Exception' => $vendorDir . '/hoa/exception/Exception.php', 'Hoa\\Exception\\Group' => $vendorDir . '/hoa/exception/Group.php', 'Hoa\\Exception\\Idle' => $vendorDir . '/hoa/exception/Idle.php', 'Hoa\\File\\Directory' => $vendorDir . '/hoa/file/Directory.php', 'Hoa\\File\\Exception\\Exception' => $vendorDir . '/hoa/file/Exception/Exception.php', 'Hoa\\File\\Exception\\FileDoesNotExist' => $vendorDir . '/hoa/file/Exception/FileDoesNotExist.php', 'Hoa\\File\\File' => $vendorDir . '/hoa/file/File.php', 'Hoa\\File\\Finder' => $vendorDir . '/hoa/file/Finder.php', 'Hoa\\File\\Generic' => $vendorDir . '/hoa/file/Generic.php', 'Hoa\\File\\Link\\Link' => $vendorDir . '/hoa/file/Link/Link.php', 'Hoa\\File\\Link\\Read' => $vendorDir . '/hoa/file/Link/Read.php', 'Hoa\\File\\Link\\ReadWrite' => $vendorDir . '/hoa/file/Link/ReadWrite.php', 'Hoa\\File\\Link\\Write' => $vendorDir . '/hoa/file/Link/Write.php', 'Hoa\\File\\Read' => $vendorDir . '/hoa/file/Read.php', 'Hoa\\File\\ReadWrite' => $vendorDir . '/hoa/file/ReadWrite.php', 'Hoa\\File\\SplFileInfo' => $vendorDir . '/hoa/file/SplFileInfo.php', 'Hoa\\File\\Temporary\\Read' => $vendorDir . '/hoa/file/Temporary/Read.php', 'Hoa\\File\\Temporary\\ReadWrite' => $vendorDir . '/hoa/file/Temporary/ReadWrite.php', 'Hoa\\File\\Temporary\\Temporary' => $vendorDir . '/hoa/file/Temporary/Temporary.php', 'Hoa\\File\\Temporary\\Write' => $vendorDir . '/hoa/file/Temporary/Write.php', 'Hoa\\File\\Watcher' => $vendorDir . '/hoa/file/Watcher.php', 'Hoa\\File\\Write' => $vendorDir . '/hoa/file/Write.php', 'Hoa\\Iterator\\Aggregate' => $vendorDir . '/hoa/iterator/Aggregate.php', 'Hoa\\Iterator\\Append' => $vendorDir . '/hoa/iterator/Append.php', 'Hoa\\Iterator\\Buffer' => $vendorDir . '/hoa/iterator/Buffer.php', 'Hoa\\Iterator\\CallbackFilter' => $vendorDir . '/hoa/iterator/CallbackFilter.php', 'Hoa\\Iterator\\CallbackGenerator' => $vendorDir . '/hoa/iterator/CallbackGenerator.php', 'Hoa\\Iterator\\Counter' => $vendorDir . '/hoa/iterator/Counter.php', 'Hoa\\Iterator\\Demultiplexer' => $vendorDir . '/hoa/iterator/Demultiplexer.php', 'Hoa\\Iterator\\Directory' => $vendorDir . '/hoa/iterator/Directory.php', 'Hoa\\Iterator\\Exception' => $vendorDir . '/hoa/iterator/Exception.php', 'Hoa\\Iterator\\FileSystem' => $vendorDir . '/hoa/iterator/FileSystem.php', 'Hoa\\Iterator\\Filter' => $vendorDir . '/hoa/iterator/Filter.php', 'Hoa\\Iterator\\Glob' => $vendorDir . '/hoa/iterator/Glob.php', 'Hoa\\Iterator\\Infinite' => $vendorDir . '/hoa/iterator/Infinite.php', 'Hoa\\Iterator\\Iterator' => $vendorDir . '/hoa/iterator/Iterator.php', 'Hoa\\Iterator\\IteratorIterator' => $vendorDir . '/hoa/iterator/IteratorIterator.php', 'Hoa\\Iterator\\Limit' => $vendorDir . '/hoa/iterator/Limit.php', 'Hoa\\Iterator\\Lookahead' => $vendorDir . '/hoa/iterator/Lookahead.php', 'Hoa\\Iterator\\Lookbehind' => $vendorDir . '/hoa/iterator/Lookbehind.php', 'Hoa\\Iterator\\Map' => $vendorDir . '/hoa/iterator/Map.php', 'Hoa\\Iterator\\Mock' => $vendorDir . '/hoa/iterator/Mock.php', 'Hoa\\Iterator\\Multiple' => $vendorDir . '/hoa/iterator/Multiple.php', 'Hoa\\Iterator\\NoRewind' => $vendorDir . '/hoa/iterator/NoRewind.php', 'Hoa\\Iterator\\Outer' => $vendorDir . '/hoa/iterator/Outer.php', 'Hoa\\Iterator\\Recursive\\CallbackFilter' => $vendorDir . '/hoa/iterator/Recursive/CallbackFilter.php', 'Hoa\\Iterator\\Recursive\\Directory' => $vendorDir . '/hoa/iterator/Recursive/Directory.php', 'Hoa\\Iterator\\Recursive\\Filter' => $vendorDir . '/hoa/iterator/Recursive/Filter.php', 'Hoa\\Iterator\\Recursive\\Iterator' => $vendorDir . '/hoa/iterator/Recursive/Iterator.php', 'Hoa\\Iterator\\Recursive\\Map' => $vendorDir . '/hoa/iterator/Recursive/Map.php', 'Hoa\\Iterator\\Recursive\\Mock' => $vendorDir . '/hoa/iterator/Recursive/Mock.php', 'Hoa\\Iterator\\Recursive\\Recursive' => $vendorDir . '/hoa/iterator/Recursive/Recursive.php', 'Hoa\\Iterator\\Recursive\\RegularExpression' => $vendorDir . '/hoa/iterator/Recursive/RegularExpression.php', 'Hoa\\Iterator\\RegularExpression' => $vendorDir . '/hoa/iterator/RegularExpression.php', 'Hoa\\Iterator\\Repeater' => $vendorDir . '/hoa/iterator/Repeater.php', 'Hoa\\Iterator\\Seekable' => $vendorDir . '/hoa/iterator/Seekable.php', 'Hoa\\Iterator\\SplFileInfo' => $vendorDir . '/hoa/iterator/SplFileInfo.php', 'Hoa\\Math\\Bin\\Calc' => $vendorDir . '/hoa/math/Bin/Calc.php', 'Hoa\\Math\\Combinatorics\\Combination\\CartesianProduct' => $vendorDir . '/hoa/math/Combinatorics/Combination/CartesianProduct.php', 'Hoa\\Math\\Combinatorics\\Combination\\Combination' => $vendorDir . '/hoa/math/Combinatorics/Combination/Combination.php', 'Hoa\\Math\\Combinatorics\\Combination\\Gamma' => $vendorDir . '/hoa/math/Combinatorics/Combination/Gamma.php', 'Hoa\\Math\\Context' => $vendorDir . '/hoa/math/Context.php', 'Hoa\\Math\\Exception\\AlreadyDefinedConstant' => $vendorDir . '/hoa/math/Exception/AlreadyDefinedConstant.php', 'Hoa\\Math\\Exception\\Exception' => $vendorDir . '/hoa/math/Exception/Exception.php', 'Hoa\\Math\\Exception\\UnknownConstant' => $vendorDir . '/hoa/math/Exception/UnknownConstant.php', 'Hoa\\Math\\Exception\\UnknownFunction' => $vendorDir . '/hoa/math/Exception/UnknownFunction.php', 'Hoa\\Math\\Exception\\UnknownVariable' => $vendorDir . '/hoa/math/Exception/UnknownVariable.php', 'Hoa\\Math\\Sampler\\Random' => $vendorDir . '/hoa/math/Sampler/Random.php', 'Hoa\\Math\\Sampler\\Sampler' => $vendorDir . '/hoa/math/Sampler/Sampler.php', 'Hoa\\Math\\Util' => $vendorDir . '/hoa/math/Util.php', 'Hoa\\Math\\Visitor\\Arithmetic' => $vendorDir . '/hoa/math/Visitor/Arithmetic.php', 'Hoa\\Protocol\\Bin\\Resolve' => $vendorDir . '/hoa/protocol/Bin/Resolve.php', 'Hoa\\Protocol\\Exception' => $vendorDir . '/hoa/protocol/Exception.php', 'Hoa\\Protocol\\Node\\Library' => $vendorDir . '/hoa/protocol/Node/Library.php', 'Hoa\\Protocol\\Node\\Node' => $vendorDir . '/hoa/protocol/Node/Node.php', 'Hoa\\Protocol\\Protocol' => $vendorDir . '/hoa/protocol/Protocol.php', 'Hoa\\Protocol\\Wrapper' => $vendorDir . '/hoa/protocol/Wrapper.php', 'Hoa\\Regex\\Exception' => $vendorDir . '/hoa/regex/Exception.php', 'Hoa\\Regex\\Visitor\\Isotropic' => $vendorDir . '/hoa/regex/Visitor/Isotropic.php', 'Hoa\\Stream\\Bucket' => $vendorDir . '/hoa/stream/Bucket.php', 'Hoa\\Stream\\Composite' => $vendorDir . '/hoa/stream/Composite.php', 'Hoa\\Stream\\Context' => $vendorDir . '/hoa/stream/Context.php', 'Hoa\\Stream\\Exception' => $vendorDir . '/hoa/stream/Exception.php', 'Hoa\\Stream\\Filter\\Basic' => $vendorDir . '/hoa/stream/Filter/Basic.php', 'Hoa\\Stream\\Filter\\Exception' => $vendorDir . '/hoa/stream/Filter/Exception.php', 'Hoa\\Stream\\Filter\\Filter' => $vendorDir . '/hoa/stream/Filter/Filter.php', 'Hoa\\Stream\\Filter\\LateComputed' => $vendorDir . '/hoa/stream/Filter/LateComputed.php', 'Hoa\\Stream\\IStream\\Bufferable' => $vendorDir . '/hoa/stream/IStream/Bufferable.php', 'Hoa\\Stream\\IStream\\In' => $vendorDir . '/hoa/stream/IStream/In.php', 'Hoa\\Stream\\IStream\\Lockable' => $vendorDir . '/hoa/stream/IStream/Lockable.php', 'Hoa\\Stream\\IStream\\Out' => $vendorDir . '/hoa/stream/IStream/Out.php', 'Hoa\\Stream\\IStream\\Pathable' => $vendorDir . '/hoa/stream/IStream/Pathable.php', 'Hoa\\Stream\\IStream\\Pointable' => $vendorDir . '/hoa/stream/IStream/Pointable.php', 'Hoa\\Stream\\IStream\\Statable' => $vendorDir . '/hoa/stream/IStream/Statable.php', 'Hoa\\Stream\\IStream\\Stream' => $vendorDir . '/hoa/stream/IStream/Stream.php', 'Hoa\\Stream\\IStream\\Structural' => $vendorDir . '/hoa/stream/IStream/Structural.php', 'Hoa\\Stream\\IStream\\Touchable' => $vendorDir . '/hoa/stream/IStream/Touchable.php', 'Hoa\\Stream\\Stream' => $vendorDir . '/hoa/stream/Stream.php', 'Hoa\\Stream\\Wrapper\\Exception' => $vendorDir . '/hoa/stream/Wrapper/Exception.php', 'Hoa\\Stream\\Wrapper\\IWrapper\\File' => $vendorDir . '/hoa/stream/Wrapper/IWrapper/File.php', 'Hoa\\Stream\\Wrapper\\IWrapper\\IWrapper' => $vendorDir . '/hoa/stream/Wrapper/IWrapper/IWrapper.php', 'Hoa\\Stream\\Wrapper\\IWrapper\\Stream' => $vendorDir . '/hoa/stream/Wrapper/IWrapper/Stream.php', 'Hoa\\Stream\\Wrapper\\Wrapper' => $vendorDir . '/hoa/stream/Wrapper/Wrapper.php', 'Hoa\\Ustring\\Bin\\Fromcode' => $vendorDir . '/hoa/ustring/Bin/Fromcode.php', 'Hoa\\Ustring\\Bin\\Tocode' => $vendorDir . '/hoa/ustring/Bin/Tocode.php', 'Hoa\\Ustring\\Exception' => $vendorDir . '/hoa/ustring/Exception.php', 'Hoa\\Ustring\\Search' => $vendorDir . '/hoa/ustring/Search.php', 'Hoa\\Ustring\\Ustring' => $vendorDir . '/hoa/ustring/Ustring.php', 'Hoa\\Visitor\\Element' => $vendorDir . '/hoa/visitor/Element.php', 'Hoa\\Visitor\\Visit' => $vendorDir . '/hoa/visitor/Visit.php', 'Hoa\\Zformat\\Exception' => $vendorDir . '/hoa/zformat/Exception.php', 'Hoa\\Zformat\\Parameter' => $vendorDir . '/hoa/zformat/Parameter.php', 'Hoa\\Zformat\\Parameterizable' => $vendorDir . '/hoa/zformat/Parameterizable.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PHPStan\\AnalysedCodeException' => $baseDir . '/src/AnalysedCodeException.php', 'PHPStan\\Analyser\\Analyser' => $baseDir . '/src/Analyser/Analyser.php', 'PHPStan\\Analyser\\AnalyserResult' => $baseDir . '/src/Analyser/AnalyserResult.php', 'PHPStan\\Analyser\\AnalyserResultFinalizer' => $baseDir . '/src/Analyser/AnalyserResultFinalizer.php', 'PHPStan\\Analyser\\ArgumentsNormalizer' => $baseDir . '/src/Analyser/ArgumentsNormalizer.php', 'PHPStan\\Analyser\\ConditionalExpressionHolder' => $baseDir . '/src/Analyser/ConditionalExpressionHolder.php', 'PHPStan\\Analyser\\ConstantResolver' => $baseDir . '/src/Analyser/ConstantResolver.php', 'PHPStan\\Analyser\\ConstantResolverFactory' => $baseDir . '/src/Analyser/ConstantResolverFactory.php', 'PHPStan\\Analyser\\DirectInternalScopeFactory' => $baseDir . '/src/Analyser/DirectInternalScopeFactory.php', 'PHPStan\\Analyser\\EndStatementResult' => $baseDir . '/src/Analyser/EndStatementResult.php', 'PHPStan\\Analyser\\EnsuredNonNullabilityResult' => $baseDir . '/src/Analyser/EnsuredNonNullabilityResult.php', 'PHPStan\\Analyser\\EnsuredNonNullabilityResultExpression' => $baseDir . '/src/Analyser/EnsuredNonNullabilityResultExpression.php', 'PHPStan\\Analyser\\Error' => $baseDir . '/src/Analyser/Error.php', 'PHPStan\\Analyser\\ExpressionContext' => $baseDir . '/src/Analyser/ExpressionContext.php', 'PHPStan\\Analyser\\ExpressionResult' => $baseDir . '/src/Analyser/ExpressionResult.php', 'PHPStan\\Analyser\\ExpressionTypeHolder' => $baseDir . '/src/Analyser/ExpressionTypeHolder.php', 'PHPStan\\Analyser\\FileAnalyser' => $baseDir . '/src/Analyser/FileAnalyser.php', 'PHPStan\\Analyser\\FileAnalyserResult' => $baseDir . '/src/Analyser/FileAnalyserResult.php', 'PHPStan\\Analyser\\FinalizerResult' => $baseDir . '/src/Analyser/FinalizerResult.php', 'PHPStan\\Analyser\\Ignore\\IgnoreLexer' => $baseDir . '/src/Analyser/Ignore/IgnoreLexer.php', 'PHPStan\\Analyser\\Ignore\\IgnoreParseException' => $baseDir . '/src/Analyser/Ignore/IgnoreParseException.php', 'PHPStan\\Analyser\\Ignore\\IgnoredError' => $baseDir . '/src/Analyser/Ignore/IgnoredError.php', 'PHPStan\\Analyser\\Ignore\\IgnoredErrorHelper' => $baseDir . '/src/Analyser/Ignore/IgnoredErrorHelper.php', 'PHPStan\\Analyser\\Ignore\\IgnoredErrorHelperProcessedResult' => $baseDir . '/src/Analyser/Ignore/IgnoredErrorHelperProcessedResult.php', 'PHPStan\\Analyser\\Ignore\\IgnoredErrorHelperResult' => $baseDir . '/src/Analyser/Ignore/IgnoredErrorHelperResult.php', 'PHPStan\\Analyser\\ImpurePoint' => $baseDir . '/src/Analyser/ImpurePoint.php', 'PHPStan\\Analyser\\InternalError' => $baseDir . '/src/Analyser/InternalError.php', 'PHPStan\\Analyser\\InternalScopeFactory' => $baseDir . '/src/Analyser/InternalScopeFactory.php', 'PHPStan\\Analyser\\LazyInternalScopeFactory' => $baseDir . '/src/Analyser/LazyInternalScopeFactory.php', 'PHPStan\\Analyser\\LocalIgnoresProcessor' => $baseDir . '/src/Analyser/LocalIgnoresProcessor.php', 'PHPStan\\Analyser\\LocalIgnoresProcessorResult' => $baseDir . '/src/Analyser/LocalIgnoresProcessorResult.php', 'PHPStan\\Analyser\\MutatingScope' => $baseDir . '/src/Analyser/MutatingScope.php', 'PHPStan\\Analyser\\NameScope' => $baseDir . '/src/Analyser/NameScope.php', 'PHPStan\\Analyser\\NodeScopeResolver' => $baseDir . '/src/Analyser/NodeScopeResolver.php', 'PHPStan\\Analyser\\NullsafeOperatorHelper' => $baseDir . '/src/Analyser/NullsafeOperatorHelper.php', 'PHPStan\\Analyser\\OutOfClassScope' => $baseDir . '/src/Analyser/OutOfClassScope.php', 'PHPStan\\Analyser\\ProcessClosureResult' => $baseDir . '/src/Analyser/ProcessClosureResult.php', 'PHPStan\\Analyser\\ResultCache\\ResultCache' => $baseDir . '/src/Analyser/ResultCache/ResultCache.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheClearer' => $baseDir . '/src/Analyser/ResultCache/ResultCacheClearer.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheManager' => $baseDir . '/src/Analyser/ResultCache/ResultCacheManager.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheManagerFactory' => $baseDir . '/src/Analyser/ResultCache/ResultCacheManagerFactory.php', 'PHPStan\\Analyser\\ResultCache\\ResultCacheProcessResult' => $baseDir . '/src/Analyser/ResultCache/ResultCacheProcessResult.php', 'PHPStan\\Analyser\\RicherScopeGetTypeHelper' => $baseDir . '/src/Analyser/RicherScopeGetTypeHelper.php', 'PHPStan\\Analyser\\RuleErrorTransformer' => $baseDir . '/src/Analyser/RuleErrorTransformer.php', 'PHPStan\\Analyser\\Scope' => $baseDir . '/src/Analyser/Scope.php', 'PHPStan\\Analyser\\ScopeContext' => $baseDir . '/src/Analyser/ScopeContext.php', 'PHPStan\\Analyser\\ScopeFactory' => $baseDir . '/src/Analyser/ScopeFactory.php', 'PHPStan\\Analyser\\SpecifiedTypes' => $baseDir . '/src/Analyser/SpecifiedTypes.php', 'PHPStan\\Analyser\\StatementContext' => $baseDir . '/src/Analyser/StatementContext.php', 'PHPStan\\Analyser\\StatementExitPoint' => $baseDir . '/src/Analyser/StatementExitPoint.php', 'PHPStan\\Analyser\\StatementResult' => $baseDir . '/src/Analyser/StatementResult.php', 'PHPStan\\Analyser\\ThrowPoint' => $baseDir . '/src/Analyser/ThrowPoint.php', 'PHPStan\\Analyser\\TypeSpecifier' => $baseDir . '/src/Analyser/TypeSpecifier.php', 'PHPStan\\Analyser\\TypeSpecifierAwareExtension' => $baseDir . '/src/Analyser/TypeSpecifierAwareExtension.php', 'PHPStan\\Analyser\\TypeSpecifierContext' => $baseDir . '/src/Analyser/TypeSpecifierContext.php', 'PHPStan\\Analyser\\TypeSpecifierFactory' => $baseDir . '/src/Analyser/TypeSpecifierFactory.php', 'PHPStan\\Analyser\\UndefinedVariableException' => $baseDir . '/src/Analyser/UndefinedVariableException.php', 'PHPStan\\BetterReflection\\BetterReflection' => $vendorDir . '/ondrejmirtes/better-reflection/src/BetterReflection.php', 'PHPStan\\BetterReflection\\Identifier\\Exception\\InvalidIdentifierName' => $vendorDir . '/ondrejmirtes/better-reflection/src/Identifier/Exception/InvalidIdentifierName.php', 'PHPStan\\BetterReflection\\Identifier\\Identifier' => $vendorDir . '/ondrejmirtes/better-reflection/src/Identifier/Identifier.php', 'PHPStan\\BetterReflection\\Identifier\\IdentifierType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Identifier/IdentifierType.php', 'PHPStan\\BetterReflection\\NodeCompiler\\CompileNodeToValue' => $vendorDir . '/ondrejmirtes/better-reflection/src/NodeCompiler/CompileNodeToValue.php', 'PHPStan\\BetterReflection\\NodeCompiler\\CompiledValue' => $vendorDir . '/ondrejmirtes/better-reflection/src/NodeCompiler/CompiledValue.php', 'PHPStan\\BetterReflection\\NodeCompiler\\CompilerContext' => $vendorDir . '/ondrejmirtes/better-reflection/src/NodeCompiler/CompilerContext.php', 'PHPStan\\BetterReflection\\NodeCompiler\\Exception\\UnableToCompileNode' => $vendorDir . '/ondrejmirtes/better-reflection/src/NodeCompiler/Exception/UnableToCompileNode.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\Exception\\NotImplemented' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/Exception/NotImplemented.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\FakeReflectionAttribute' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/FakeReflectionAttribute.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionAttribute' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionAttribute.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionAttributeFactory' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionAttributeFactory.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionClass' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionClass.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionClassConstant' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionClassConstant.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionEnum' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnum.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionEnumBackedCase' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnumBackedCase.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionEnumUnitCase' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionEnumUnitCase.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionFunction' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionFunction.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionIntersectionType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionIntersectionType.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionMethod' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionMethod.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionNamedType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionNamedType.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionObject' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionObject.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionParameter' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionParameter.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionProperty' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionProperty.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionType.php', 'PHPStan\\BetterReflection\\Reflection\\Adapter\\ReflectionUnionType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Adapter/ReflectionUnionType.php', 'PHPStan\\BetterReflection\\Reflection\\Annotation\\AnnotationHelper' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Annotation/AnnotationHelper.php', 'PHPStan\\BetterReflection\\Reflection\\Attribute\\ReflectionAttributeHelper' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Attribute/ReflectionAttributeHelper.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\CircularReference' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/CircularReference.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\ClassDoesNotExist' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/ClassDoesNotExist.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\CodeLocationMissing' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/CodeLocationMissing.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\FunctionDoesNotExist' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/FunctionDoesNotExist.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\InvalidArrowFunctionBodyNode' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidArrowFunctionBodyNode.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\InvalidConstantNode' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidConstantNode.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\InvalidDefaultValueType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/InvalidDefaultValueType.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\MethodPrototypeNotFound' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/MethodPrototypeNotFound.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\NoObjectProvided' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/NoObjectProvided.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\NoParent' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/NoParent.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\NotAnObject' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/NotAnObject.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\ObjectNotInstanceOfClass' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/ObjectNotInstanceOfClass.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\PropertyDoesNotExist' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/PropertyDoesNotExist.php', 'PHPStan\\BetterReflection\\Reflection\\Exception\\PropertyIsNotStatic' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Exception/PropertyIsNotStatic.php', 'PHPStan\\BetterReflection\\Reflection\\Reflection' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Reflection.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionAttribute' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionAttribute.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionClass' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionClass.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionClassConstant' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionClassConstant.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionConstant' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionConstant.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionEnum' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionEnum.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionEnumCase' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionEnumCase.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionFunction' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionFunction.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionFunctionAbstract' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionFunctionAbstract.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionIntersectionType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionIntersectionType.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionMethod' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionMethod.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionNamedType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionNamedType.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionObject' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionObject.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionParameter' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionParameter.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionProperty' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionProperty.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionType.php', 'PHPStan\\BetterReflection\\Reflection\\ReflectionUnionType' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/ReflectionUnionType.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionAttributeStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionAttributeStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionClassConstantStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionClassConstantStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionClassStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionClassStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionConstantStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionConstantStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionEnumCaseStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionEnumCaseStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionFunctionStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionFunctionStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionMethodStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionMethodStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionParameterStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionParameterStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionPropertyStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionPropertyStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\StringCast\\ReflectionTypeStringCast' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/StringCast/ReflectionTypeStringCast.php', 'PHPStan\\BetterReflection\\Reflection\\Support\\AlreadyVisitedClasses' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflection/Support/AlreadyVisitedClasses.php', 'PHPStan\\BetterReflection\\Reflector\\ClassReflector' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflector/ClassReflector.php', 'PHPStan\\BetterReflection\\Reflector\\ConstantReflector' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflector/ConstantReflector.php', 'PHPStan\\BetterReflection\\Reflector\\DefaultReflector' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflector/DefaultReflector.php', 'PHPStan\\BetterReflection\\Reflector\\Exception\\IdentifierNotFound' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflector/Exception/IdentifierNotFound.php', 'PHPStan\\BetterReflection\\Reflector\\FunctionReflector' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflector/FunctionReflector.php', 'PHPStan\\BetterReflection\\Reflector\\Reflector' => $vendorDir . '/ondrejmirtes/better-reflection/src/Reflector/Reflector.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Exception\\ParseToAstFailure' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Exception/ParseToAstFailure.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\FindReflectionsInTree' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/FindReflectionsInTree.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Locator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Locator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Parser\\MemoizingParser' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Parser/MemoizingParser.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\AstConversionStrategy' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Strategy/AstConversionStrategy.php', 'PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\NodeToReflection' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Ast/Strategy/NodeToReflection.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\EvaledAnonymousClassCannotBeLocated' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/EvaledAnonymousClassCannotBeLocated.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\EvaledClosureCannotBeLocated' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/EvaledClosureCannotBeLocated.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\FunctionUndefined' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/FunctionUndefined.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\InvalidDirectory' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidDirectory.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\InvalidFileInfo' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidFileInfo.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\InvalidFileLocation' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/InvalidFileLocation.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\NoAnonymousClassOnLine' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NoAnonymousClassOnLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\NoClosureOnLine' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NoClosureOnLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\NotInternalClass' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/NotInternalClass.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\TwoAnonymousClassesOnSameLine' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/TwoAnonymousClassesOnSameLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\Exception\\TwoClosuresOnSameLine' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Exception/TwoClosuresOnSameLine.php', 'PHPStan\\BetterReflection\\SourceLocator\\FileChecker' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/FileChecker.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\AliasLocatedSource' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/AliasLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\AnonymousLocatedSource' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/AnonymousLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\EvaledLocatedSource' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/EvaledLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\InternalLocatedSource' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/InternalLocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\Located\\LocatedSource' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Located/LocatedSource.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\AggregateSourceStubber' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/AggregateSourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\Exception\\CouldNotFindPhpStormStubs' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/Exception/CouldNotFindPhpStormStubs.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\PhpStormStubsSourceStubber' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\PhpStormStubs\\CachingVisitor' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubs/CachingVisitor.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\ReflectionSourceStubber' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/ReflectionSourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\SourceStubber' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/SourceStubber.php', 'PHPStan\\BetterReflection\\SourceLocator\\SourceStubber\\StubData' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/StubData.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AbstractSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AbstractSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AggregateSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AggregateSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AnonymousClassObjectSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AnonymousClassObjectSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AutoloadSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AutoloadSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\AutoloadSourceLocator\\FileReadTrapStreamWrapper' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/AutoloadSourceLocator/FileReadTrapStreamWrapper.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\ClosureSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/ClosureSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\ComposerSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/ComposerSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\Exception' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/Exception.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\FailedToParseJson' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/FailedToParseJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\InvalidProjectDirectory' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/InvalidProjectDirectory.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\MissingComposerJson' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/MissingComposerJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\Exception\\MissingInstalledJson' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/Exception/MissingInstalledJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\MakeLocatorForComposerJson' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForComposerJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\MakeLocatorForComposerJsonAndInstalledJson' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForComposerJsonAndInstalledJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Factory\\MakeLocatorForInstalledJson' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Factory/MakeLocatorForInstalledJson.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\PsrAutoloaderLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/PsrAutoloaderLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Exception\\Exception' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Exception/Exception.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Exception\\InvalidPrefixMapping' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Exception/InvalidPrefixMapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Psr0Mapping' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Psr0Mapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\Psr4Mapping' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/Psr4Mapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\Composer\\Psr\\PsrAutoloaderMapping' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/Composer/Psr/PsrAutoloaderMapping.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\DirectoriesSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/DirectoriesSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\EvaledCodeSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/EvaledCodeSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\FileIteratorSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/FileIteratorSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\MemoizingSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/MemoizingSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\PhpInternalSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/PhpInternalSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\SingleFileSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/SingleFileSourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\SourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/SourceLocator.php', 'PHPStan\\BetterReflection\\SourceLocator\\Type\\StringSourceLocator' => $vendorDir . '/ondrejmirtes/better-reflection/src/SourceLocator/Type/StringSourceLocator.php', 'PHPStan\\BetterReflection\\Util\\CalculateReflectionColumn' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/CalculateReflectionColumn.php', 'PHPStan\\BetterReflection\\Util\\ClassExistenceChecker' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/ClassExistenceChecker.php', 'PHPStan\\BetterReflection\\Util\\ConstantNodeChecker' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/ConstantNodeChecker.php', 'PHPStan\\BetterReflection\\Util\\Exception\\InvalidNodePosition' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/Exception/InvalidNodePosition.php', 'PHPStan\\BetterReflection\\Util\\Exception\\NoNodePosition' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/Exception/NoNodePosition.php', 'PHPStan\\BetterReflection\\Util\\FileHelper' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/FileHelper.php', 'PHPStan\\BetterReflection\\Util\\FindReflectionOnLine' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/FindReflectionOnLine.php', 'PHPStan\\BetterReflection\\Util\\GetLastDocComment' => $vendorDir . '/ondrejmirtes/better-reflection/src/Util/GetLastDocComment.php', 'PHPStan\\Broker\\AnonymousClassNameHelper' => $baseDir . '/src/Broker/AnonymousClassNameHelper.php', 'PHPStan\\Broker\\Broker' => $baseDir . '/src/Broker/Broker.php', 'PHPStan\\Broker\\BrokerFactory' => $baseDir . '/src/Broker/BrokerFactory.php', 'PHPStan\\Broker\\ClassAutoloadingException' => $baseDir . '/src/Broker/ClassAutoloadingException.php', 'PHPStan\\Broker\\ClassNotFoundException' => $baseDir . '/src/Broker/ClassNotFoundException.php', 'PHPStan\\Broker\\ConstantNotFoundException' => $baseDir . '/src/Broker/ConstantNotFoundException.php', 'PHPStan\\Broker\\FunctionNotFoundException' => $baseDir . '/src/Broker/FunctionNotFoundException.php', 'PHPStan\\Cache\\Cache' => $baseDir . '/src/Cache/Cache.php', 'PHPStan\\Cache\\CacheItem' => $baseDir . '/src/Cache/CacheItem.php', 'PHPStan\\Cache\\CacheStorage' => $baseDir . '/src/Cache/CacheStorage.php', 'PHPStan\\Cache\\FileCacheStorage' => $baseDir . '/src/Cache/FileCacheStorage.php', 'PHPStan\\Cache\\MemoryCacheStorage' => $baseDir . '/src/Cache/MemoryCacheStorage.php', 'PHPStan\\Classes\\ForbiddenClassNameExtension' => $baseDir . '/src/Classes/ForbiddenClassNameExtension.php', 'PHPStan\\Collectors\\CollectedData' => $baseDir . '/src/Collectors/CollectedData.php', 'PHPStan\\Collectors\\Collector' => $baseDir . '/src/Collectors/Collector.php', 'PHPStan\\Collectors\\Registry' => $baseDir . '/src/Collectors/Registry.php', 'PHPStan\\Collectors\\RegistryFactory' => $baseDir . '/src/Collectors/RegistryFactory.php', 'PHPStan\\Command\\AnalyseApplication' => $baseDir . '/src/Command/AnalyseApplication.php', 'PHPStan\\Command\\AnalyseCommand' => $baseDir . '/src/Command/AnalyseCommand.php', 'PHPStan\\Command\\AnalyserRunner' => $baseDir . '/src/Command/AnalyserRunner.php', 'PHPStan\\Command\\AnalysisResult' => $baseDir . '/src/Command/AnalysisResult.php', 'PHPStan\\Command\\ClearResultCacheCommand' => $baseDir . '/src/Command/ClearResultCacheCommand.php', 'PHPStan\\Command\\CommandHelper' => $baseDir . '/src/Command/CommandHelper.php', 'PHPStan\\Command\\DiagnoseCommand' => $baseDir . '/src/Command/DiagnoseCommand.php', 'PHPStan\\Command\\DumpParametersCommand' => $baseDir . '/src/Command/DumpParametersCommand.php', 'PHPStan\\Command\\ErrorFormatter\\BaselineNeonErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/BaselineNeonErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\BaselinePhpErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\CheckstyleErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\CiDetectedErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/CiDetectedErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\ErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/ErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\GithubErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/GithubErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\GitlabErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/GitlabErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\JsonErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/JsonErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\JunitErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/JunitErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\RawErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/RawErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\TableErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/TableErrorFormatter.php', 'PHPStan\\Command\\ErrorFormatter\\TeamcityErrorFormatter' => $baseDir . '/src/Command/ErrorFormatter/TeamcityErrorFormatter.php', 'PHPStan\\Command\\ErrorsConsoleStyle' => $baseDir . '/src/Command/ErrorsConsoleStyle.php', 'PHPStan\\Command\\FixerApplication' => $baseDir . '/src/Command/FixerApplication.php', 'PHPStan\\Command\\FixerProcessException' => $baseDir . '/src/Command/FixerProcessException.php', 'PHPStan\\Command\\FixerWorkerCommand' => $baseDir . '/src/Command/FixerWorkerCommand.php', 'PHPStan\\Command\\IgnoredRegexValidator' => $baseDir . '/src/Command/IgnoredRegexValidator.php', 'PHPStan\\Command\\IgnoredRegexValidatorResult' => $baseDir . '/src/Command/IgnoredRegexValidatorResult.php', 'PHPStan\\Command\\InceptionNotSuccessfulException' => $baseDir . '/src/Command/InceptionNotSuccessfulException.php', 'PHPStan\\Command\\InceptionResult' => $baseDir . '/src/Command/InceptionResult.php', 'PHPStan\\Command\\Output' => $baseDir . '/src/Command/Output.php', 'PHPStan\\Command\\OutputStyle' => $baseDir . '/src/Command/OutputStyle.php', 'PHPStan\\Command\\Symfony\\SymfonyOutput' => $baseDir . '/src/Command/Symfony/SymfonyOutput.php', 'PHPStan\\Command\\Symfony\\SymfonyStyle' => $baseDir . '/src/Command/Symfony/SymfonyStyle.php', 'PHPStan\\Command\\WorkerCommand' => $baseDir . '/src/Command/WorkerCommand.php', 'PHPStan\\DependencyInjection\\BleedingEdgeToggle' => $baseDir . '/src/DependencyInjection/BleedingEdgeToggle.php', 'PHPStan\\DependencyInjection\\ConditionalTagsExtension' => $baseDir . '/src/DependencyInjection/ConditionalTagsExtension.php', 'PHPStan\\DependencyInjection\\Configurator' => $baseDir . '/src/DependencyInjection/Configurator.php', 'PHPStan\\DependencyInjection\\Container' => $baseDir . '/src/DependencyInjection/Container.php', 'PHPStan\\DependencyInjection\\ContainerFactory' => $baseDir . '/src/DependencyInjection/ContainerFactory.php', 'PHPStan\\DependencyInjection\\DerivativeContainerFactory' => $baseDir . '/src/DependencyInjection/DerivativeContainerFactory.php', 'PHPStan\\DependencyInjection\\DuplicateIncludedFilesException' => $baseDir . '/src/DependencyInjection/DuplicateIncludedFilesException.php', 'PHPStan\\DependencyInjection\\InvalidExcludePathsException' => $baseDir . '/src/DependencyInjection/InvalidExcludePathsException.php', 'PHPStan\\DependencyInjection\\InvalidIgnoredErrorPatternsException' => $baseDir . '/src/DependencyInjection/InvalidIgnoredErrorPatternsException.php', 'PHPStan\\DependencyInjection\\LoaderFactory' => $baseDir . '/src/DependencyInjection/LoaderFactory.php', 'PHPStan\\DependencyInjection\\MemoizingContainer' => $baseDir . '/src/DependencyInjection/MemoizingContainer.php', 'PHPStan\\DependencyInjection\\NeonAdapter' => $baseDir . '/src/DependencyInjection/NeonAdapter.php', 'PHPStan\\DependencyInjection\\NeonLoader' => $baseDir . '/src/DependencyInjection/NeonLoader.php', 'PHPStan\\DependencyInjection\\Neon\\OptionalPath' => $baseDir . '/src/DependencyInjection/Neon/OptionalPath.php', 'PHPStan\\DependencyInjection\\Nette\\NetteContainer' => $baseDir . '/src/DependencyInjection/Nette/NetteContainer.php', 'PHPStan\\DependencyInjection\\ParameterNotFoundException' => $baseDir . '/src/DependencyInjection/ParameterNotFoundException.php', 'PHPStan\\DependencyInjection\\ParametersSchemaExtension' => $baseDir . '/src/DependencyInjection/ParametersSchemaExtension.php', 'PHPStan\\DependencyInjection\\ProjectConfigHelper' => $baseDir . '/src/DependencyInjection/ProjectConfigHelper.php', 'PHPStan\\DependencyInjection\\Reflection\\ClassReflectionExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Reflection/ClassReflectionExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Reflection\\LazyClassReflectionExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Reflection/LazyClassReflectionExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\RulesExtension' => $baseDir . '/src/DependencyInjection/RulesExtension.php', 'PHPStan\\DependencyInjection\\Type\\DynamicReturnTypeExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Type/DynamicReturnTypeExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\DynamicThrowTypeExtensionProvider' => $baseDir . '/src/DependencyInjection/Type/DynamicThrowTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\ExpressionTypeResolverExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Type/ExpressionTypeResolverExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyDynamicReturnTypeExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Type/LazyDynamicReturnTypeExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyDynamicThrowTypeExtensionProvider' => $baseDir . '/src/DependencyInjection/Type/LazyDynamicThrowTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyExpressionTypeResolverExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Type/LazyExpressionTypeResolverExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyOperatorTypeSpecifyingExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Type/LazyOperatorTypeSpecifyingExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyParameterClosureTypeExtensionProvider' => $baseDir . '/src/DependencyInjection/Type/LazyParameterClosureTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\LazyParameterOutTypeExtensionProvider' => $baseDir . '/src/DependencyInjection/Type/LazyParameterOutTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\OperatorTypeSpecifyingExtensionRegistryProvider' => $baseDir . '/src/DependencyInjection/Type/OperatorTypeSpecifyingExtensionRegistryProvider.php', 'PHPStan\\DependencyInjection\\Type\\ParameterClosureTypeExtensionProvider' => $baseDir . '/src/DependencyInjection/Type/ParameterClosureTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\Type\\ParameterOutTypeExtensionProvider' => $baseDir . '/src/DependencyInjection/Type/ParameterOutTypeExtensionProvider.php', 'PHPStan\\DependencyInjection\\ValidateExcludePathsExtension' => $baseDir . '/src/DependencyInjection/ValidateExcludePathsExtension.php', 'PHPStan\\DependencyInjection\\ValidateIgnoredErrorsExtension' => $baseDir . '/src/DependencyInjection/ValidateIgnoredErrorsExtension.php', 'PHPStan\\Dependency\\DependencyResolver' => $baseDir . '/src/Dependency/DependencyResolver.php', 'PHPStan\\Dependency\\ExportedNode' => $baseDir . '/src/Dependency/ExportedNode.php', 'PHPStan\\Dependency\\ExportedNodeFetcher' => $baseDir . '/src/Dependency/ExportedNodeFetcher.php', 'PHPStan\\Dependency\\ExportedNodeResolver' => $baseDir . '/src/Dependency/ExportedNodeResolver.php', 'PHPStan\\Dependency\\ExportedNodeVisitor' => $baseDir . '/src/Dependency/ExportedNodeVisitor.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedAttributeNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedAttributeNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedClassConstantNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedClassConstantNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedClassConstantsNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedClassConstantsNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedClassNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedClassNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedEnumCaseNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedEnumCaseNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedEnumNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedEnumNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedFunctionNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedFunctionNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedInterfaceNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedInterfaceNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedMethodNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedMethodNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedParameterNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedParameterNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedPhpDocNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedPhpDocNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedPropertiesNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedPropertiesNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedTraitNode' => $baseDir . '/src/Dependency/ExportedNode/ExportedTraitNode.php', 'PHPStan\\Dependency\\ExportedNode\\ExportedTraitUseAdaptation' => $baseDir . '/src/Dependency/ExportedNode/ExportedTraitUseAdaptation.php', 'PHPStan\\Dependency\\NodeDependencies' => $baseDir . '/src/Dependency/NodeDependencies.php', 'PHPStan\\Dependency\\RootExportedNode' => $baseDir . '/src/Dependency/RootExportedNode.php', 'PHPStan\\Diagnose\\DiagnoseExtension' => $baseDir . '/src/Diagnose/DiagnoseExtension.php', 'PHPStan\\Diagnose\\PHPStanDiagnoseExtension' => $baseDir . '/src/Diagnose/PHPStanDiagnoseExtension.php', 'PHPStan\\File\\CouldNotReadFileException' => $baseDir . '/src/File/CouldNotReadFileException.php', 'PHPStan\\File\\CouldNotWriteFileException' => $baseDir . '/src/File/CouldNotWriteFileException.php', 'PHPStan\\File\\FileExcluder' => $baseDir . '/src/File/FileExcluder.php', 'PHPStan\\File\\FileExcluderFactory' => $baseDir . '/src/File/FileExcluderFactory.php', 'PHPStan\\File\\FileExcluderRawFactory' => $baseDir . '/src/File/FileExcluderRawFactory.php', 'PHPStan\\File\\FileFinder' => $baseDir . '/src/File/FileFinder.php', 'PHPStan\\File\\FileFinderResult' => $baseDir . '/src/File/FileFinderResult.php', 'PHPStan\\File\\FileHelper' => $baseDir . '/src/File/FileHelper.php', 'PHPStan\\File\\FileMonitor' => $baseDir . '/src/File/FileMonitor.php', 'PHPStan\\File\\FileMonitorResult' => $baseDir . '/src/File/FileMonitorResult.php', 'PHPStan\\File\\FileReader' => $baseDir . '/src/File/FileReader.php', 'PHPStan\\File\\FileWriter' => $baseDir . '/src/File/FileWriter.php', 'PHPStan\\File\\FuzzyRelativePathHelper' => $baseDir . '/src/File/FuzzyRelativePathHelper.php', 'PHPStan\\File\\NullRelativePathHelper' => $baseDir . '/src/File/NullRelativePathHelper.php', 'PHPStan\\File\\ParentDirectoryRelativePathHelper' => $baseDir . '/src/File/ParentDirectoryRelativePathHelper.php', 'PHPStan\\File\\PathNotFoundException' => $baseDir . '/src/File/PathNotFoundException.php', 'PHPStan\\File\\RelativePathHelper' => $baseDir . '/src/File/RelativePathHelper.php', 'PHPStan\\File\\SimpleRelativePathHelper' => $baseDir . '/src/File/SimpleRelativePathHelper.php', 'PHPStan\\File\\SystemAgnosticSimpleRelativePathHelper' => $baseDir . '/src/File/SystemAgnosticSimpleRelativePathHelper.php', 'PHPStan\\Internal\\AgentDetector' => $baseDir . '/src/Internal/AgentDetector.php', 'PHPStan\\Internal\\BytesHelper' => $baseDir . '/src/Internal/BytesHelper.php', 'PHPStan\\Internal\\CombinationsHelper' => $baseDir . '/src/Internal/CombinationsHelper.php', 'PHPStan\\Internal\\ComposerHelper' => $baseDir . '/src/Internal/ComposerHelper.php', 'PHPStan\\Internal\\ContainerDynamicReturnTypeExtension' => $baseDir . '/src/Internal/ContainerDynamicReturnTypeExtension.php', 'PHPStan\\Internal\\DirectoryCreator' => $baseDir . '/src/Internal/DirectoryCreator.php', 'PHPStan\\Internal\\DirectoryCreatorException' => $baseDir . '/src/Internal/DirectoryCreatorException.php', 'PHPStan\\Internal\\SprintfHelper' => $baseDir . '/src/Internal/SprintfHelper.php', 'PHPStan\\Node\\AnonymousClassNode' => $baseDir . '/src/Node/AnonymousClassNode.php', 'PHPStan\\Node\\BooleanAndNode' => $baseDir . '/src/Node/BooleanAndNode.php', 'PHPStan\\Node\\BooleanOrNode' => $baseDir . '/src/Node/BooleanOrNode.php', 'PHPStan\\Node\\BreaklessWhileLoopNode' => $baseDir . '/src/Node/BreaklessWhileLoopNode.php', 'PHPStan\\Node\\CatchWithUnthrownExceptionNode' => $baseDir . '/src/Node/CatchWithUnthrownExceptionNode.php', 'PHPStan\\Node\\ClassConstantsNode' => $baseDir . '/src/Node/ClassConstantsNode.php', 'PHPStan\\Node\\ClassMethod' => $baseDir . '/src/Node/ClassMethod.php', 'PHPStan\\Node\\ClassMethodsNode' => $baseDir . '/src/Node/ClassMethodsNode.php', 'PHPStan\\Node\\ClassPropertiesNode' => $baseDir . '/src/Node/ClassPropertiesNode.php', 'PHPStan\\Node\\ClassPropertyNode' => $baseDir . '/src/Node/ClassPropertyNode.php', 'PHPStan\\Node\\ClassStatementsGatherer' => $baseDir . '/src/Node/ClassStatementsGatherer.php', 'PHPStan\\Node\\ClosureReturnStatementsNode' => $baseDir . '/src/Node/ClosureReturnStatementsNode.php', 'PHPStan\\Node\\CollectedDataNode' => $baseDir . '/src/Node/CollectedDataNode.php', 'PHPStan\\Node\\Constant\\ClassConstantFetch' => $baseDir . '/src/Node/Constant/ClassConstantFetch.php', 'PHPStan\\Node\\DoWhileLoopConditionNode' => $baseDir . '/src/Node/DoWhileLoopConditionNode.php', 'PHPStan\\Node\\ExecutionEndNode' => $baseDir . '/src/Node/ExecutionEndNode.php', 'PHPStan\\Node\\Expr\\AlwaysRememberedExpr' => $baseDir . '/src/Node/Expr/AlwaysRememberedExpr.php', 'PHPStan\\Node\\Expr\\ExistingArrayDimFetch' => $baseDir . '/src/Node/Expr/ExistingArrayDimFetch.php', 'PHPStan\\Node\\Expr\\GetIterableKeyTypeExpr' => $baseDir . '/src/Node/Expr/GetIterableKeyTypeExpr.php', 'PHPStan\\Node\\Expr\\GetIterableValueTypeExpr' => $baseDir . '/src/Node/Expr/GetIterableValueTypeExpr.php', 'PHPStan\\Node\\Expr\\GetOffsetValueTypeExpr' => $baseDir . '/src/Node/Expr/GetOffsetValueTypeExpr.php', 'PHPStan\\Node\\Expr\\OriginalPropertyTypeExpr' => $baseDir . '/src/Node/Expr/OriginalPropertyTypeExpr.php', 'PHPStan\\Node\\Expr\\ParameterVariableOriginalValueExpr' => $baseDir . '/src/Node/Expr/ParameterVariableOriginalValueExpr.php', 'PHPStan\\Node\\Expr\\PropertyInitializationExpr' => $baseDir . '/src/Node/Expr/PropertyInitializationExpr.php', 'PHPStan\\Node\\Expr\\SetExistingOffsetValueTypeExpr' => $baseDir . '/src/Node/Expr/SetExistingOffsetValueTypeExpr.php', 'PHPStan\\Node\\Expr\\SetOffsetValueTypeExpr' => $baseDir . '/src/Node/Expr/SetOffsetValueTypeExpr.php', 'PHPStan\\Node\\Expr\\TypeExpr' => $baseDir . '/src/Node/Expr/TypeExpr.php', 'PHPStan\\Node\\Expr\\UnsetOffsetExpr' => $baseDir . '/src/Node/Expr/UnsetOffsetExpr.php', 'PHPStan\\Node\\FileNode' => $baseDir . '/src/Node/FileNode.php', 'PHPStan\\Node\\FinallyExitPointsNode' => $baseDir . '/src/Node/FinallyExitPointsNode.php', 'PHPStan\\Node\\FunctionCallableNode' => $baseDir . '/src/Node/FunctionCallableNode.php', 'PHPStan\\Node\\FunctionReturnStatementsNode' => $baseDir . '/src/Node/FunctionReturnStatementsNode.php', 'PHPStan\\Node\\InArrowFunctionNode' => $baseDir . '/src/Node/InArrowFunctionNode.php', 'PHPStan\\Node\\InClassMethodNode' => $baseDir . '/src/Node/InClassMethodNode.php', 'PHPStan\\Node\\InClassNode' => $baseDir . '/src/Node/InClassNode.php', 'PHPStan\\Node\\InClosureNode' => $baseDir . '/src/Node/InClosureNode.php', 'PHPStan\\Node\\InForeachNode' => $baseDir . '/src/Node/InForeachNode.php', 'PHPStan\\Node\\InFunctionNode' => $baseDir . '/src/Node/InFunctionNode.php', 'PHPStan\\Node\\InTraitNode' => $baseDir . '/src/Node/InTraitNode.php', 'PHPStan\\Node\\InstantiationCallableNode' => $baseDir . '/src/Node/InstantiationCallableNode.php', 'PHPStan\\Node\\InvalidateExprNode' => $baseDir . '/src/Node/InvalidateExprNode.php', 'PHPStan\\Node\\IssetExpr' => $baseDir . '/src/Node/IssetExpr.php', 'PHPStan\\Node\\LiteralArrayItem' => $baseDir . '/src/Node/LiteralArrayItem.php', 'PHPStan\\Node\\LiteralArrayNode' => $baseDir . '/src/Node/LiteralArrayNode.php', 'PHPStan\\Node\\MatchExpressionArm' => $baseDir . '/src/Node/MatchExpressionArm.php', 'PHPStan\\Node\\MatchExpressionArmBody' => $baseDir . '/src/Node/MatchExpressionArmBody.php', 'PHPStan\\Node\\MatchExpressionArmCondition' => $baseDir . '/src/Node/MatchExpressionArmCondition.php', 'PHPStan\\Node\\MatchExpressionNode' => $baseDir . '/src/Node/MatchExpressionNode.php', 'PHPStan\\Node\\MethodCallableNode' => $baseDir . '/src/Node/MethodCallableNode.php', 'PHPStan\\Node\\MethodReturnStatementsNode' => $baseDir . '/src/Node/MethodReturnStatementsNode.php', 'PHPStan\\Node\\Method\\MethodCall' => $baseDir . '/src/Node/Method/MethodCall.php', 'PHPStan\\Node\\NoopExpressionNode' => $baseDir . '/src/Node/NoopExpressionNode.php', 'PHPStan\\Node\\Printer\\ExprPrinter' => $baseDir . '/src/Node/Printer/ExprPrinter.php', 'PHPStan\\Node\\Printer\\NodeTypePrinter' => $baseDir . '/src/Node/Printer/NodeTypePrinter.php', 'PHPStan\\Node\\Printer\\Printer' => $baseDir . '/src/Node/Printer/Printer.php', 'PHPStan\\Node\\PropertyAssignNode' => $baseDir . '/src/Node/PropertyAssignNode.php', 'PHPStan\\Node\\Property\\PropertyAssign' => $baseDir . '/src/Node/Property/PropertyAssign.php', 'PHPStan\\Node\\Property\\PropertyRead' => $baseDir . '/src/Node/Property/PropertyRead.php', 'PHPStan\\Node\\Property\\PropertyWrite' => $baseDir . '/src/Node/Property/PropertyWrite.php', 'PHPStan\\Node\\ReturnStatement' => $baseDir . '/src/Node/ReturnStatement.php', 'PHPStan\\Node\\ReturnStatementsNode' => $baseDir . '/src/Node/ReturnStatementsNode.php', 'PHPStan\\Node\\StaticMethodCallableNode' => $baseDir . '/src/Node/StaticMethodCallableNode.php', 'PHPStan\\Node\\UnreachableStatementNode' => $baseDir . '/src/Node/UnreachableStatementNode.php', 'PHPStan\\Node\\VarTagChangedExpressionTypeNode' => $baseDir . '/src/Node/VarTagChangedExpressionTypeNode.php', 'PHPStan\\Node\\VariableAssignNode' => $baseDir . '/src/Node/VariableAssignNode.php', 'PHPStan\\Node\\VirtualNode' => $baseDir . '/src/Node/VirtualNode.php', 'PHPStan\\Parallel\\ParallelAnalyser' => $baseDir . '/src/Parallel/ParallelAnalyser.php', 'PHPStan\\Parallel\\Process' => $baseDir . '/src/Parallel/Process.php', 'PHPStan\\Parallel\\ProcessPool' => $baseDir . '/src/Parallel/ProcessPool.php', 'PHPStan\\Parallel\\ProcessTimedOutException' => $baseDir . '/src/Parallel/ProcessTimedOutException.php', 'PHPStan\\Parallel\\Schedule' => $baseDir . '/src/Parallel/Schedule.php', 'PHPStan\\Parallel\\Scheduler' => $baseDir . '/src/Parallel/Scheduler.php', 'PHPStan\\Parser\\AnonymousClassVisitor' => $baseDir . '/src/Parser/AnonymousClassVisitor.php', 'PHPStan\\Parser\\ArrayFilterArgVisitor' => $baseDir . '/src/Parser/ArrayFilterArgVisitor.php', 'PHPStan\\Parser\\ArrayFindArgVisitor' => $baseDir . '/src/Parser/ArrayFindArgVisitor.php', 'PHPStan\\Parser\\ArrayMapArgVisitor' => $baseDir . '/src/Parser/ArrayMapArgVisitor.php', 'PHPStan\\Parser\\ArrayWalkArgVisitor' => $baseDir . '/src/Parser/ArrayWalkArgVisitor.php', 'PHPStan\\Parser\\ArrowFunctionArgVisitor' => $baseDir . '/src/Parser/ArrowFunctionArgVisitor.php', 'PHPStan\\Parser\\CachedParser' => $baseDir . '/src/Parser/CachedParser.php', 'PHPStan\\Parser\\CleaningParser' => $baseDir . '/src/Parser/CleaningParser.php', 'PHPStan\\Parser\\CleaningVisitor' => $baseDir . '/src/Parser/CleaningVisitor.php', 'PHPStan\\Parser\\ClosureArgVisitor' => $baseDir . '/src/Parser/ClosureArgVisitor.php', 'PHPStan\\Parser\\ClosureBindArgVisitor' => $baseDir . '/src/Parser/ClosureBindArgVisitor.php', 'PHPStan\\Parser\\ClosureBindToVarVisitor' => $baseDir . '/src/Parser/ClosureBindToVarVisitor.php', 'PHPStan\\Parser\\CurlSetOptArgVisitor' => $baseDir . '/src/Parser/CurlSetOptArgVisitor.php', 'PHPStan\\Parser\\DeclarePositionVisitor' => $baseDir . '/src/Parser/DeclarePositionVisitor.php', 'PHPStan\\Parser\\FunctionCallStatementFinder' => $baseDir . '/src/Parser/FunctionCallStatementFinder.php', 'PHPStan\\Parser\\ImmediatelyInvokedClosureVisitor' => $baseDir . '/src/Parser/ImmediatelyInvokedClosureVisitor.php', 'PHPStan\\Parser\\LastConditionVisitor' => $baseDir . '/src/Parser/LastConditionVisitor.php', 'PHPStan\\Parser\\LexerFactory' => $baseDir . '/src/Parser/LexerFactory.php', 'PHPStan\\Parser\\MagicConstantParamDefaultVisitor' => $baseDir . '/src/Parser/MagicConstantParamDefaultVisitor.php', 'PHPStan\\Parser\\NewAssignedToPropertyVisitor' => $baseDir . '/src/Parser/NewAssignedToPropertyVisitor.php', 'PHPStan\\Parser\\ParentStmtTypesVisitor' => $baseDir . '/src/Parser/ParentStmtTypesVisitor.php', 'PHPStan\\Parser\\Parser' => $baseDir . '/src/Parser/Parser.php', 'PHPStan\\Parser\\ParserErrorsException' => $baseDir . '/src/Parser/ParserErrorsException.php', 'PHPStan\\Parser\\PathRoutingParser' => $baseDir . '/src/Parser/PathRoutingParser.php', 'PHPStan\\Parser\\PhpParserDecorator' => $baseDir . '/src/Parser/PhpParserDecorator.php', 'PHPStan\\Parser\\RemoveUnusedCodeByPhpVersionIdVisitor' => $baseDir . '/src/Parser/RemoveUnusedCodeByPhpVersionIdVisitor.php', 'PHPStan\\Parser\\RichParser' => $baseDir . '/src/Parser/RichParser.php', 'PHPStan\\Parser\\SimpleParser' => $baseDir . '/src/Parser/SimpleParser.php', 'PHPStan\\Parser\\TraitCollectingVisitor' => $baseDir . '/src/Parser/TraitCollectingVisitor.php', 'PHPStan\\Parser\\TryCatchTypeVisitor' => $baseDir . '/src/Parser/TryCatchTypeVisitor.php', 'PHPStan\\Parser\\TypeTraverserInstanceofVisitor' => $baseDir . '/src/Parser/TypeTraverserInstanceofVisitor.php', 'PHPStan\\Php8StubsMap' => $vendorDir . '/phpstan/php-8-stubs/Php8StubsMap.php', 'PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\Attribute' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\QuoteAwareConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\Node' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Node.php', 'PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', 'PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', 'PHPStan\\PhpDocParser\\Ast\\NodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\NodeVisitor\\CloningVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagMethodValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagPropertyValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineAnnotation' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArgument' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArray' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArrayItem' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ExtendsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ImplementsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MixinTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamClosureThisTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamImmediatelyInvokedCallableTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamLaterInvokedCallableTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamOutTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PureUnlessCallableIsImpureTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireExtendsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireImplementsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\SelfOutTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasImportTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypelessParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\UsesTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeUnsealedTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeForParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\InvalidTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', 'PHPStan\\PhpDocParser\\Lexer\\Lexer' => $vendorDir . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', 'PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', 'PHPStan\\PhpDocParser\\Parser\\ParserException' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', 'PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', 'PHPStan\\PhpDocParser\\Parser\\StringUnescaper' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php', 'PHPStan\\PhpDocParser\\Parser\\TokenIterator' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php', 'PHPStan\\PhpDocParser\\Parser\\TypeParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php', 'PHPStan\\PhpDocParser\\Printer\\DiffElem' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/DiffElem.php', 'PHPStan\\PhpDocParser\\Printer\\Differ' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/Differ.php', 'PHPStan\\PhpDocParser\\Printer\\Printer' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/Printer.php', 'PHPStan\\PhpDoc\\ConstExprNodeResolver' => $baseDir . '/src/PhpDoc/ConstExprNodeResolver.php', 'PHPStan\\PhpDoc\\ConstExprParserFactory' => $baseDir . '/src/PhpDoc/ConstExprParserFactory.php', 'PHPStan\\PhpDoc\\CountableStubFilesExtension' => $baseDir . '/src/PhpDoc/CountableStubFilesExtension.php', 'PHPStan\\PhpDoc\\DefaultStubFilesProvider' => $baseDir . '/src/PhpDoc/DefaultStubFilesProvider.php', 'PHPStan\\PhpDoc\\DirectTypeNodeResolverExtensionRegistryProvider' => $baseDir . '/src/PhpDoc/DirectTypeNodeResolverExtensionRegistryProvider.php', 'PHPStan\\PhpDoc\\JsonValidateStubFilesExtension' => $baseDir . '/src/PhpDoc/JsonValidateStubFilesExtension.php', 'PHPStan\\PhpDoc\\LazyTypeNodeResolverExtensionRegistryProvider' => $baseDir . '/src/PhpDoc/LazyTypeNodeResolverExtensionRegistryProvider.php', 'PHPStan\\PhpDoc\\NameScopeAlreadyBeingCreatedException' => $baseDir . '/src/PhpDoc/NameScopeAlreadyBeingCreatedException.php', 'PHPStan\\PhpDoc\\PhpDocBlock' => $baseDir . '/src/PhpDoc/PhpDocBlock.php', 'PHPStan\\PhpDoc\\PhpDocInheritanceResolver' => $baseDir . '/src/PhpDoc/PhpDocInheritanceResolver.php', 'PHPStan\\PhpDoc\\PhpDocNodeResolver' => $baseDir . '/src/PhpDoc/PhpDocNodeResolver.php', 'PHPStan\\PhpDoc\\PhpDocStringResolver' => $baseDir . '/src/PhpDoc/PhpDocStringResolver.php', 'PHPStan\\PhpDoc\\ReflectionEnumStubFilesExtension' => $baseDir . '/src/PhpDoc/ReflectionEnumStubFilesExtension.php', 'PHPStan\\PhpDoc\\ResolvedPhpDocBlock' => $baseDir . '/src/PhpDoc/ResolvedPhpDocBlock.php', 'PHPStan\\PhpDoc\\SocketSelectStubFilesExtension' => $baseDir . '/src/PhpDoc/SocketSelectStubFilesExtension.php', 'PHPStan\\PhpDoc\\StubFilesExtension' => $baseDir . '/src/PhpDoc/StubFilesExtension.php', 'PHPStan\\PhpDoc\\StubFilesProvider' => $baseDir . '/src/PhpDoc/StubFilesProvider.php', 'PHPStan\\PhpDoc\\StubPhpDocProvider' => $baseDir . '/src/PhpDoc/StubPhpDocProvider.php', 'PHPStan\\PhpDoc\\StubSourceLocatorFactory' => $baseDir . '/src/PhpDoc/StubSourceLocatorFactory.php', 'PHPStan\\PhpDoc\\StubValidator' => $baseDir . '/src/PhpDoc/StubValidator.php', 'PHPStan\\PhpDoc\\Tag\\AssertTag' => $baseDir . '/src/PhpDoc/Tag/AssertTag.php', 'PHPStan\\PhpDoc\\Tag\\AssertTagParameter' => $baseDir . '/src/PhpDoc/Tag/AssertTagParameter.php', 'PHPStan\\PhpDoc\\Tag\\DeprecatedTag' => $baseDir . '/src/PhpDoc/Tag/DeprecatedTag.php', 'PHPStan\\PhpDoc\\Tag\\ExtendsTag' => $baseDir . '/src/PhpDoc/Tag/ExtendsTag.php', 'PHPStan\\PhpDoc\\Tag\\ImplementsTag' => $baseDir . '/src/PhpDoc/Tag/ImplementsTag.php', 'PHPStan\\PhpDoc\\Tag\\MethodTag' => $baseDir . '/src/PhpDoc/Tag/MethodTag.php', 'PHPStan\\PhpDoc\\Tag\\MethodTagParameter' => $baseDir . '/src/PhpDoc/Tag/MethodTagParameter.php', 'PHPStan\\PhpDoc\\Tag\\MixinTag' => $baseDir . '/src/PhpDoc/Tag/MixinTag.php', 'PHPStan\\PhpDoc\\Tag\\ParamClosureThisTag' => $baseDir . '/src/PhpDoc/Tag/ParamClosureThisTag.php', 'PHPStan\\PhpDoc\\Tag\\ParamOutTag' => $baseDir . '/src/PhpDoc/Tag/ParamOutTag.php', 'PHPStan\\PhpDoc\\Tag\\ParamTag' => $baseDir . '/src/PhpDoc/Tag/ParamTag.php', 'PHPStan\\PhpDoc\\Tag\\PropertyTag' => $baseDir . '/src/PhpDoc/Tag/PropertyTag.php', 'PHPStan\\PhpDoc\\Tag\\RequireExtendsTag' => $baseDir . '/src/PhpDoc/Tag/RequireExtendsTag.php', 'PHPStan\\PhpDoc\\Tag\\RequireImplementsTag' => $baseDir . '/src/PhpDoc/Tag/RequireImplementsTag.php', 'PHPStan\\PhpDoc\\Tag\\ReturnTag' => $baseDir . '/src/PhpDoc/Tag/ReturnTag.php', 'PHPStan\\PhpDoc\\Tag\\SelfOutTypeTag' => $baseDir . '/src/PhpDoc/Tag/SelfOutTypeTag.php', 'PHPStan\\PhpDoc\\Tag\\TemplateTag' => $baseDir . '/src/PhpDoc/Tag/TemplateTag.php', 'PHPStan\\PhpDoc\\Tag\\ThrowsTag' => $baseDir . '/src/PhpDoc/Tag/ThrowsTag.php', 'PHPStan\\PhpDoc\\Tag\\TypeAliasImportTag' => $baseDir . '/src/PhpDoc/Tag/TypeAliasImportTag.php', 'PHPStan\\PhpDoc\\Tag\\TypeAliasTag' => $baseDir . '/src/PhpDoc/Tag/TypeAliasTag.php', 'PHPStan\\PhpDoc\\Tag\\TypedTag' => $baseDir . '/src/PhpDoc/Tag/TypedTag.php', 'PHPStan\\PhpDoc\\Tag\\UsesTag' => $baseDir . '/src/PhpDoc/Tag/UsesTag.php', 'PHPStan\\PhpDoc\\Tag\\VarTag' => $baseDir . '/src/PhpDoc/Tag/VarTag.php', 'PHPStan\\PhpDoc\\TypeNodeResolver' => $baseDir . '/src/PhpDoc/TypeNodeResolver.php', 'PHPStan\\PhpDoc\\TypeNodeResolverAwareExtension' => $baseDir . '/src/PhpDoc/TypeNodeResolverAwareExtension.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtension' => $baseDir . '/src/PhpDoc/TypeNodeResolverExtension.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtensionAwareRegistry' => $baseDir . '/src/PhpDoc/TypeNodeResolverExtensionAwareRegistry.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtensionRegistry' => $baseDir . '/src/PhpDoc/TypeNodeResolverExtensionRegistry.php', 'PHPStan\\PhpDoc\\TypeNodeResolverExtensionRegistryProvider' => $baseDir . '/src/PhpDoc/TypeNodeResolverExtensionRegistryProvider.php', 'PHPStan\\PhpDoc\\TypeStringResolver' => $baseDir . '/src/PhpDoc/TypeStringResolver.php', 'PHPStan\\Php\\PhpVersion' => $baseDir . '/src/Php/PhpVersion.php', 'PHPStan\\Php\\PhpVersionFactory' => $baseDir . '/src/Php/PhpVersionFactory.php', 'PHPStan\\Php\\PhpVersionFactoryFactory' => $baseDir . '/src/Php/PhpVersionFactoryFactory.php', 'PHPStan\\Process\\CpuCoreCounter' => $baseDir . '/src/Process/CpuCoreCounter.php', 'PHPStan\\Process\\ProcessCanceledException' => $baseDir . '/src/Process/ProcessCanceledException.php', 'PHPStan\\Process\\ProcessCrashedException' => $baseDir . '/src/Process/ProcessCrashedException.php', 'PHPStan\\Process\\ProcessHelper' => $baseDir . '/src/Process/ProcessHelper.php', 'PHPStan\\Process\\ProcessPromise' => $baseDir . '/src/Process/ProcessPromise.php', 'PHPStan\\Reflection\\AdditionalConstructorsExtension' => $baseDir . '/src/Reflection/AdditionalConstructorsExtension.php', 'PHPStan\\Reflection\\AllowedSubTypesClassReflectionExtension' => $baseDir . '/src/Reflection/AllowedSubTypesClassReflectionExtension.php', 'PHPStan\\Reflection\\Annotations\\AnnotationMethodReflection' => $baseDir . '/src/Reflection/Annotations/AnnotationMethodReflection.php', 'PHPStan\\Reflection\\Annotations\\AnnotationPropertyReflection' => $baseDir . '/src/Reflection/Annotations/AnnotationPropertyReflection.php', 'PHPStan\\Reflection\\Annotations\\AnnotationsMethodParameterReflection' => $baseDir . '/src/Reflection/Annotations/AnnotationsMethodParameterReflection.php', 'PHPStan\\Reflection\\Annotations\\AnnotationsMethodsClassReflectionExtension' => $baseDir . '/src/Reflection/Annotations/AnnotationsMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\Annotations\\AnnotationsPropertiesClassReflectionExtension' => $baseDir . '/src/Reflection/Annotations/AnnotationsPropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\Assertions' => $baseDir . '/src/Reflection/Assertions.php', 'PHPStan\\Reflection\\BetterReflection\\BetterReflectionProvider' => $baseDir . '/src/Reflection/BetterReflection/BetterReflectionProvider.php', 'PHPStan\\Reflection\\BetterReflection\\BetterReflectionProviderFactory' => $baseDir . '/src/Reflection/BetterReflection/BetterReflectionProviderFactory.php', 'PHPStan\\Reflection\\BetterReflection\\BetterReflectionSourceLocatorFactory' => $baseDir . '/src/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\Reflector\\MemoizingReflector' => $baseDir . '/src/Reflection/BetterReflection/Reflector/MemoizingReflector.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\AutoloadFunctionsSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/AutoloadFunctionsSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\AutoloadSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\CachingVisitor' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\ComposerJsonAndInstalledJsonSourceLocatorMaker' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/ComposerJsonAndInstalledJsonSourceLocatorMaker.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FetchedNode' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/FetchedNode.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FetchedNodesResult' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/FetchedNodesResult.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FileNodesFetcher' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/FileNodesFetcher.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FileReadTrapStreamWrapper' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/FileReadTrapStreamWrapper.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\NewOptimizedDirectorySourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/NewOptimizedDirectorySourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedDirectorySourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedDirectorySourceLocatorFactory' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedDirectorySourceLocatorRepository' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorRepository.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedPsrAutoloaderLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedPsrAutoloaderLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedPsrAutoloaderLocatorFactory' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedPsrAutoloaderLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedSingleFileSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedSingleFileSourceLocatorFactory' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocatorFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\OptimizedSingleFileSourceLocatorRepository' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocatorRepository.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\PhpFileCleaner' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/PhpFileCleaner.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\PhpVersionBlacklistSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/PhpVersionBlacklistSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\ReflectionClassSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/ReflectionClassSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\RewriteClassAliasSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/RewriteClassAliasSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceLocator\\SkipClassAliasSourceLocator' => $baseDir . '/src/Reflection/BetterReflection/SourceLocator/SkipClassAliasSourceLocator.php', 'PHPStan\\Reflection\\BetterReflection\\SourceStubber\\PhpStormStubsSourceStubberFactory' => $baseDir . '/src/Reflection/BetterReflection/SourceStubber/PhpStormStubsSourceStubberFactory.php', 'PHPStan\\Reflection\\BetterReflection\\SourceStubber\\ReflectionSourceStubberFactory' => $baseDir . '/src/Reflection/BetterReflection/SourceStubber/ReflectionSourceStubberFactory.php', 'PHPStan\\Reflection\\BrokerAwareExtension' => $baseDir . '/src/Reflection/BrokerAwareExtension.php', 'PHPStan\\Reflection\\CallableFunctionVariantWithPhpDocs' => $baseDir . '/src/Reflection/CallableFunctionVariantWithPhpDocs.php', 'PHPStan\\Reflection\\Callables\\CallableParametersAcceptor' => $baseDir . '/src/Reflection/Callables/CallableParametersAcceptor.php', 'PHPStan\\Reflection\\Callables\\FunctionCallableVariant' => $baseDir . '/src/Reflection/Callables/FunctionCallableVariant.php', 'PHPStan\\Reflection\\Callables\\SimpleImpurePoint' => $baseDir . '/src/Reflection/Callables/SimpleImpurePoint.php', 'PHPStan\\Reflection\\Callables\\SimpleThrowPoint' => $baseDir . '/src/Reflection/Callables/SimpleThrowPoint.php', 'PHPStan\\Reflection\\ClassConstantReflection' => $baseDir . '/src/Reflection/ClassConstantReflection.php', 'PHPStan\\Reflection\\ClassMemberAccessAnswerer' => $baseDir . '/src/Reflection/ClassMemberAccessAnswerer.php', 'PHPStan\\Reflection\\ClassMemberReflection' => $baseDir . '/src/Reflection/ClassMemberReflection.php', 'PHPStan\\Reflection\\ClassNameHelper' => $baseDir . '/src/Reflection/ClassNameHelper.php', 'PHPStan\\Reflection\\ClassReflection' => $baseDir . '/src/Reflection/ClassReflection.php', 'PHPStan\\Reflection\\ClassReflectionExtensionRegistry' => $baseDir . '/src/Reflection/ClassReflectionExtensionRegistry.php', 'PHPStan\\Reflection\\ConstantNameHelper' => $baseDir . '/src/Reflection/ConstantNameHelper.php', 'PHPStan\\Reflection\\ConstantReflection' => $baseDir . '/src/Reflection/ConstantReflection.php', 'PHPStan\\Reflection\\Constant\\RuntimeConstantReflection' => $baseDir . '/src/Reflection/Constant/RuntimeConstantReflection.php', 'PHPStan\\Reflection\\ConstructorsHelper' => $baseDir . '/src/Reflection/ConstructorsHelper.php', 'PHPStan\\Reflection\\Dummy\\ChangedTypeMethodReflection' => $baseDir . '/src/Reflection/Dummy/ChangedTypeMethodReflection.php', 'PHPStan\\Reflection\\Dummy\\ChangedTypePropertyReflection' => $baseDir . '/src/Reflection/Dummy/ChangedTypePropertyReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyConstantReflection' => $baseDir . '/src/Reflection/Dummy/DummyConstantReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyConstructorReflection' => $baseDir . '/src/Reflection/Dummy/DummyConstructorReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyMethodReflection' => $baseDir . '/src/Reflection/Dummy/DummyMethodReflection.php', 'PHPStan\\Reflection\\Dummy\\DummyPropertyReflection' => $baseDir . '/src/Reflection/Dummy/DummyPropertyReflection.php', 'PHPStan\\Reflection\\EnumCaseReflection' => $baseDir . '/src/Reflection/EnumCaseReflection.php', 'PHPStan\\Reflection\\ExtendedMethodReflection' => $baseDir . '/src/Reflection/ExtendedMethodReflection.php', 'PHPStan\\Reflection\\ExtendedPropertyReflection' => $baseDir . '/src/Reflection/ExtendedPropertyReflection.php', 'PHPStan\\Reflection\\FunctionReflection' => $baseDir . '/src/Reflection/FunctionReflection.php', 'PHPStan\\Reflection\\FunctionReflectionFactory' => $baseDir . '/src/Reflection/FunctionReflectionFactory.php', 'PHPStan\\Reflection\\FunctionVariant' => $baseDir . '/src/Reflection/FunctionVariant.php', 'PHPStan\\Reflection\\FunctionVariantWithPhpDocs' => $baseDir . '/src/Reflection/FunctionVariantWithPhpDocs.php', 'PHPStan\\Reflection\\GenericParametersAcceptorResolver' => $baseDir . '/src/Reflection/GenericParametersAcceptorResolver.php', 'PHPStan\\Reflection\\GlobalConstantReflection' => $baseDir . '/src/Reflection/GlobalConstantReflection.php', 'PHPStan\\Reflection\\InaccessibleMethod' => $baseDir . '/src/Reflection/InaccessibleMethod.php', 'PHPStan\\Reflection\\InitializerExprContext' => $baseDir . '/src/Reflection/InitializerExprContext.php', 'PHPStan\\Reflection\\InitializerExprTypeResolver' => $baseDir . '/src/Reflection/InitializerExprTypeResolver.php', 'PHPStan\\Reflection\\MethodPrototypeReflection' => $baseDir . '/src/Reflection/MethodPrototypeReflection.php', 'PHPStan\\Reflection\\MethodReflection' => $baseDir . '/src/Reflection/MethodReflection.php', 'PHPStan\\Reflection\\MethodsClassReflectionExtension' => $baseDir . '/src/Reflection/MethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\MissingConstantFromReflectionException' => $baseDir . '/src/Reflection/MissingConstantFromReflectionException.php', 'PHPStan\\Reflection\\MissingMethodFromReflectionException' => $baseDir . '/src/Reflection/MissingMethodFromReflectionException.php', 'PHPStan\\Reflection\\MissingPropertyFromReflectionException' => $baseDir . '/src/Reflection/MissingPropertyFromReflectionException.php', 'PHPStan\\Reflection\\Mixin\\MixinMethodReflection' => $baseDir . '/src/Reflection/Mixin/MixinMethodReflection.php', 'PHPStan\\Reflection\\Mixin\\MixinMethodsClassReflectionExtension' => $baseDir . '/src/Reflection/Mixin/MixinMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\Mixin\\MixinPropertiesClassReflectionExtension' => $baseDir . '/src/Reflection/Mixin/MixinPropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\NamespaceAnswerer' => $baseDir . '/src/Reflection/NamespaceAnswerer.php', 'PHPStan\\Reflection\\Native\\NativeFunctionReflection' => $baseDir . '/src/Reflection/Native/NativeFunctionReflection.php', 'PHPStan\\Reflection\\Native\\NativeMethodReflection' => $baseDir . '/src/Reflection/Native/NativeMethodReflection.php', 'PHPStan\\Reflection\\Native\\NativeParameterReflection' => $baseDir . '/src/Reflection/Native/NativeParameterReflection.php', 'PHPStan\\Reflection\\Native\\NativeParameterWithPhpDocsReflection' => $baseDir . '/src/Reflection/Native/NativeParameterWithPhpDocsReflection.php', 'PHPStan\\Reflection\\PHPStan\\NativeReflectionEnumReturnDynamicReturnTypeExtension' => $baseDir . '/src/Reflection/PHPStan/NativeReflectionEnumReturnDynamicReturnTypeExtension.php', 'PHPStan\\Reflection\\ParameterReflection' => $baseDir . '/src/Reflection/ParameterReflection.php', 'PHPStan\\Reflection\\ParameterReflectionWithPhpDocs' => $baseDir . '/src/Reflection/ParameterReflectionWithPhpDocs.php', 'PHPStan\\Reflection\\ParametersAcceptor' => $baseDir . '/src/Reflection/ParametersAcceptor.php', 'PHPStan\\Reflection\\ParametersAcceptorSelector' => $baseDir . '/src/Reflection/ParametersAcceptorSelector.php', 'PHPStan\\Reflection\\ParametersAcceptorWithPhpDocs' => $baseDir . '/src/Reflection/ParametersAcceptorWithPhpDocs.php', 'PHPStan\\Reflection\\PassedByReference' => $baseDir . '/src/Reflection/PassedByReference.php', 'PHPStan\\Reflection\\PhpVersionStaticAccessor' => $baseDir . '/src/Reflection/PhpVersionStaticAccessor.php', 'PHPStan\\Reflection\\Php\\BuiltinMethodReflection' => $baseDir . '/src/Reflection/Php/BuiltinMethodReflection.php', 'PHPStan\\Reflection\\Php\\ClosureCallMethodReflection' => $baseDir . '/src/Reflection/Php/ClosureCallMethodReflection.php', 'PHPStan\\Reflection\\Php\\ClosureCallUnresolvedMethodPrototypeReflection' => $baseDir . '/src/Reflection/Php/ClosureCallUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Php\\DummyParameter' => $baseDir . '/src/Reflection/Php/DummyParameter.php', 'PHPStan\\Reflection\\Php\\DummyParameterWithPhpDocs' => $baseDir . '/src/Reflection/Php/DummyParameterWithPhpDocs.php', 'PHPStan\\Reflection\\Php\\EnumAllowedSubTypesClassReflectionExtension' => $baseDir . '/src/Reflection/Php/EnumAllowedSubTypesClassReflectionExtension.php', 'PHPStan\\Reflection\\Php\\EnumCasesMethodReflection' => $baseDir . '/src/Reflection/Php/EnumCasesMethodReflection.php', 'PHPStan\\Reflection\\Php\\EnumPropertyReflection' => $baseDir . '/src/Reflection/Php/EnumPropertyReflection.php', 'PHPStan\\Reflection\\Php\\EnumUnresolvedPropertyPrototypeReflection' => $baseDir . '/src/Reflection/Php/EnumUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Php\\ExitFunctionReflection' => $baseDir . '/src/Reflection/Php/ExitFunctionReflection.php', 'PHPStan\\Reflection\\Php\\NativeBuiltinMethodReflection' => $baseDir . '/src/Reflection/Php/NativeBuiltinMethodReflection.php', 'PHPStan\\Reflection\\Php\\PhpClassReflectionExtension' => $baseDir . '/src/Reflection/Php/PhpClassReflectionExtension.php', 'PHPStan\\Reflection\\Php\\PhpFunctionFromParserNodeReflection' => $baseDir . '/src/Reflection/Php/PhpFunctionFromParserNodeReflection.php', 'PHPStan\\Reflection\\Php\\PhpFunctionReflection' => $baseDir . '/src/Reflection/Php/PhpFunctionReflection.php', 'PHPStan\\Reflection\\Php\\PhpMethodFromParserNodeReflection' => $baseDir . '/src/Reflection/Php/PhpMethodFromParserNodeReflection.php', 'PHPStan\\Reflection\\Php\\PhpMethodReflection' => $baseDir . '/src/Reflection/Php/PhpMethodReflection.php', 'PHPStan\\Reflection\\Php\\PhpMethodReflectionFactory' => $baseDir . '/src/Reflection/Php/PhpMethodReflectionFactory.php', 'PHPStan\\Reflection\\Php\\PhpParameterFromParserNodeReflection' => $baseDir . '/src/Reflection/Php/PhpParameterFromParserNodeReflection.php', 'PHPStan\\Reflection\\Php\\PhpParameterReflection' => $baseDir . '/src/Reflection/Php/PhpParameterReflection.php', 'PHPStan\\Reflection\\Php\\PhpPropertyReflection' => $baseDir . '/src/Reflection/Php/PhpPropertyReflection.php', 'PHPStan\\Reflection\\Php\\SimpleXMLElementProperty' => $baseDir . '/src/Reflection/Php/SimpleXMLElementProperty.php', 'PHPStan\\Reflection\\Php\\Soap\\SoapClientMethodReflection' => $baseDir . '/src/Reflection/Php/Soap/SoapClientMethodReflection.php', 'PHPStan\\Reflection\\Php\\Soap\\SoapClientMethodsClassReflectionExtension' => $baseDir . '/src/Reflection/Php/Soap/SoapClientMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\Php\\UniversalObjectCrateProperty' => $baseDir . '/src/Reflection/Php/UniversalObjectCrateProperty.php', 'PHPStan\\Reflection\\Php\\UniversalObjectCratesClassReflectionExtension' => $baseDir . '/src/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php', 'PHPStan\\Reflection\\PropertiesClassReflectionExtension' => $baseDir . '/src/Reflection/PropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\PropertyReflection' => $baseDir . '/src/Reflection/PropertyReflection.php', 'PHPStan\\Reflection\\ReflectionProvider' => $baseDir . '/src/Reflection/ReflectionProvider.php', 'PHPStan\\Reflection\\ReflectionProviderStaticAccessor' => $baseDir . '/src/Reflection/ReflectionProviderStaticAccessor.php', 'PHPStan\\Reflection\\ReflectionProvider\\DirectReflectionProviderProvider' => $baseDir . '/src/Reflection/ReflectionProvider/DirectReflectionProviderProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\DummyReflectionProvider' => $baseDir . '/src/Reflection/ReflectionProvider/DummyReflectionProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\LazyReflectionProviderProvider' => $baseDir . '/src/Reflection/ReflectionProvider/LazyReflectionProviderProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\MemoizingReflectionProvider' => $baseDir . '/src/Reflection/ReflectionProvider/MemoizingReflectionProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\ReflectionProviderFactory' => $baseDir . '/src/Reflection/ReflectionProvider/ReflectionProviderFactory.php', 'PHPStan\\Reflection\\ReflectionProvider\\ReflectionProviderProvider' => $baseDir . '/src/Reflection/ReflectionProvider/ReflectionProviderProvider.php', 'PHPStan\\Reflection\\ReflectionProvider\\SetterReflectionProviderProvider' => $baseDir . '/src/Reflection/ReflectionProvider/SetterReflectionProviderProvider.php', 'PHPStan\\Reflection\\RequireExtension\\RequireExtendsMethodsClassReflectionExtension' => $baseDir . '/src/Reflection/RequireExtension/RequireExtendsMethodsClassReflectionExtension.php', 'PHPStan\\Reflection\\RequireExtension\\RequireExtendsPropertiesClassReflectionExtension' => $baseDir . '/src/Reflection/RequireExtension/RequireExtendsPropertiesClassReflectionExtension.php', 'PHPStan\\Reflection\\ResolvedFunctionVariant' => $baseDir . '/src/Reflection/ResolvedFunctionVariant.php', 'PHPStan\\Reflection\\ResolvedFunctionVariantWithCallable' => $baseDir . '/src/Reflection/ResolvedFunctionVariantWithCallable.php', 'PHPStan\\Reflection\\ResolvedFunctionVariantWithOriginal' => $baseDir . '/src/Reflection/ResolvedFunctionVariantWithOriginal.php', 'PHPStan\\Reflection\\ResolvedMethodReflection' => $baseDir . '/src/Reflection/ResolvedMethodReflection.php', 'PHPStan\\Reflection\\ResolvedPropertyReflection' => $baseDir . '/src/Reflection/ResolvedPropertyReflection.php', 'PHPStan\\Reflection\\SignatureMap\\FunctionSignature' => $baseDir . '/src/Reflection/SignatureMap/FunctionSignature.php', 'PHPStan\\Reflection\\SignatureMap\\FunctionSignatureMapProvider' => $baseDir . '/src/Reflection/SignatureMap/FunctionSignatureMapProvider.php', 'PHPStan\\Reflection\\SignatureMap\\NativeFunctionReflectionProvider' => $baseDir . '/src/Reflection/SignatureMap/NativeFunctionReflectionProvider.php', 'PHPStan\\Reflection\\SignatureMap\\ParameterSignature' => $baseDir . '/src/Reflection/SignatureMap/ParameterSignature.php', 'PHPStan\\Reflection\\SignatureMap\\Php8SignatureMapProvider' => $baseDir . '/src/Reflection/SignatureMap/Php8SignatureMapProvider.php', 'PHPStan\\Reflection\\SignatureMap\\SignatureMapParser' => $baseDir . '/src/Reflection/SignatureMap/SignatureMapParser.php', 'PHPStan\\Reflection\\SignatureMap\\SignatureMapProvider' => $baseDir . '/src/Reflection/SignatureMap/SignatureMapProvider.php', 'PHPStan\\Reflection\\SignatureMap\\SignatureMapProviderFactory' => $baseDir . '/src/Reflection/SignatureMap/SignatureMapProviderFactory.php', 'PHPStan\\Reflection\\TrivialParametersAcceptor' => $baseDir . '/src/Reflection/TrivialParametersAcceptor.php', 'PHPStan\\Reflection\\Type\\CallbackUnresolvedMethodPrototypeReflection' => $baseDir . '/src/Reflection/Type/CallbackUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\CallbackUnresolvedPropertyPrototypeReflection' => $baseDir . '/src/Reflection/Type/CallbackUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\CalledOnTypeUnresolvedMethodPrototypeReflection' => $baseDir . '/src/Reflection/Type/CalledOnTypeUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\CalledOnTypeUnresolvedPropertyPrototypeReflection' => $baseDir . '/src/Reflection/Type/CalledOnTypeUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypeMethodReflection' => $baseDir . '/src/Reflection/Type/IntersectionTypeMethodReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypePropertyReflection' => $baseDir . '/src/Reflection/Type/IntersectionTypePropertyReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypeUnresolvedMethodPrototypeReflection' => $baseDir . '/src/Reflection/Type/IntersectionTypeUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\IntersectionTypeUnresolvedPropertyPrototypeReflection' => $baseDir . '/src/Reflection/Type/IntersectionTypeUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypeMethodReflection' => $baseDir . '/src/Reflection/Type/UnionTypeMethodReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypePropertyReflection' => $baseDir . '/src/Reflection/Type/UnionTypePropertyReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypeUnresolvedMethodPrototypeReflection' => $baseDir . '/src/Reflection/Type/UnionTypeUnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnionTypeUnresolvedPropertyPrototypeReflection' => $baseDir . '/src/Reflection/Type/UnionTypeUnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnresolvedMethodPrototypeReflection' => $baseDir . '/src/Reflection/Type/UnresolvedMethodPrototypeReflection.php', 'PHPStan\\Reflection\\Type\\UnresolvedPropertyPrototypeReflection' => $baseDir . '/src/Reflection/Type/UnresolvedPropertyPrototypeReflection.php', 'PHPStan\\Reflection\\WrappedExtendedMethodReflection' => $baseDir . '/src/Reflection/WrappedExtendedMethodReflection.php', 'PHPStan\\Reflection\\WrappedExtendedPropertyReflection' => $baseDir . '/src/Reflection/WrappedExtendedPropertyReflection.php', 'PHPStan\\Reflection\\WrapperPropertyReflection' => $baseDir . '/src/Reflection/WrapperPropertyReflection.php', 'PHPStan\\Rules\\Api\\ApiClassConstFetchRule' => $baseDir . '/src/Rules/Api/ApiClassConstFetchRule.php', 'PHPStan\\Rules\\Api\\ApiClassExtendsRule' => $baseDir . '/src/Rules/Api/ApiClassExtendsRule.php', 'PHPStan\\Rules\\Api\\ApiClassImplementsRule' => $baseDir . '/src/Rules/Api/ApiClassImplementsRule.php', 'PHPStan\\Rules\\Api\\ApiInstanceofRule' => $baseDir . '/src/Rules/Api/ApiInstanceofRule.php', 'PHPStan\\Rules\\Api\\ApiInstanceofTypeRule' => $baseDir . '/src/Rules/Api/ApiInstanceofTypeRule.php', 'PHPStan\\Rules\\Api\\ApiInstantiationRule' => $baseDir . '/src/Rules/Api/ApiInstantiationRule.php', 'PHPStan\\Rules\\Api\\ApiInterfaceExtendsRule' => $baseDir . '/src/Rules/Api/ApiInterfaceExtendsRule.php', 'PHPStan\\Rules\\Api\\ApiMethodCallRule' => $baseDir . '/src/Rules/Api/ApiMethodCallRule.php', 'PHPStan\\Rules\\Api\\ApiRuleHelper' => $baseDir . '/src/Rules/Api/ApiRuleHelper.php', 'PHPStan\\Rules\\Api\\ApiStaticCallRule' => $baseDir . '/src/Rules/Api/ApiStaticCallRule.php', 'PHPStan\\Rules\\Api\\ApiTraitUseRule' => $baseDir . '/src/Rules/Api/ApiTraitUseRule.php', 'PHPStan\\Rules\\Api\\BcUncoveredInterface' => $baseDir . '/src/Rules/Api/BcUncoveredInterface.php', 'PHPStan\\Rules\\Api\\GetTemplateTypeRule' => $baseDir . '/src/Rules/Api/GetTemplateTypeRule.php', 'PHPStan\\Rules\\Api\\NodeConnectingVisitorAttributesRule' => $baseDir . '/src/Rules/Api/NodeConnectingVisitorAttributesRule.php', 'PHPStan\\Rules\\Api\\PhpStanNamespaceIn3rdPartyPackageRule' => $baseDir . '/src/Rules/Api/PhpStanNamespaceIn3rdPartyPackageRule.php', 'PHPStan\\Rules\\Api\\RuntimeReflectionFunctionRule' => $baseDir . '/src/Rules/Api/RuntimeReflectionFunctionRule.php', 'PHPStan\\Rules\\Api\\RuntimeReflectionInstantiationRule' => $baseDir . '/src/Rules/Api/RuntimeReflectionInstantiationRule.php', 'PHPStan\\Rules\\Arrays\\AllowedArrayKeysTypes' => $baseDir . '/src/Rules/Arrays/AllowedArrayKeysTypes.php', 'PHPStan\\Rules\\Arrays\\AppendedArrayItemTypeRule' => $baseDir . '/src/Rules/Arrays/AppendedArrayItemTypeRule.php', 'PHPStan\\Rules\\Arrays\\AppendedArrayKeyTypeRule' => $baseDir . '/src/Rules/Arrays/AppendedArrayKeyTypeRule.php', 'PHPStan\\Rules\\Arrays\\ArrayDestructuringRule' => $baseDir . '/src/Rules/Arrays/ArrayDestructuringRule.php', 'PHPStan\\Rules\\Arrays\\ArrayUnpackingRule' => $baseDir . '/src/Rules/Arrays/ArrayUnpackingRule.php', 'PHPStan\\Rules\\Arrays\\DeadForeachRule' => $baseDir . '/src/Rules/Arrays/DeadForeachRule.php', 'PHPStan\\Rules\\Arrays\\DuplicateKeysInLiteralArraysRule' => $baseDir . '/src/Rules/Arrays/DuplicateKeysInLiteralArraysRule.php', 'PHPStan\\Rules\\Arrays\\EmptyArrayItemRule' => $baseDir . '/src/Rules/Arrays/EmptyArrayItemRule.php', 'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayDimFetchRule' => $baseDir . '/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php', 'PHPStan\\Rules\\Arrays\\InvalidKeyInArrayItemRule' => $baseDir . '/src/Rules/Arrays/InvalidKeyInArrayItemRule.php', 'PHPStan\\Rules\\Arrays\\IterableInForeachRule' => $baseDir . '/src/Rules/Arrays/IterableInForeachRule.php', 'PHPStan\\Rules\\Arrays\\NonexistentOffsetInArrayDimFetchCheck' => $baseDir . '/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.php', 'PHPStan\\Rules\\Arrays\\NonexistentOffsetInArrayDimFetchRule' => $baseDir . '/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessAssignOpRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessAssignOpRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessAssignmentRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessAssignmentRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessValueAssignmentRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessValueAssignmentRule.php', 'PHPStan\\Rules\\Arrays\\OffsetAccessWithoutDimForReadingRule' => $baseDir . '/src/Rules/Arrays/OffsetAccessWithoutDimForReadingRule.php', 'PHPStan\\Rules\\Arrays\\UnpackIterableInArrayRule' => $baseDir . '/src/Rules/Arrays/UnpackIterableInArrayRule.php', 'PHPStan\\Rules\\AttributesCheck' => $baseDir . '/src/Rules/AttributesCheck.php', 'PHPStan\\Rules\\Cast\\EchoRule' => $baseDir . '/src/Rules/Cast/EchoRule.php', 'PHPStan\\Rules\\Cast\\InvalidCastRule' => $baseDir . '/src/Rules/Cast/InvalidCastRule.php', 'PHPStan\\Rules\\Cast\\InvalidPartOfEncapsedStringRule' => $baseDir . '/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php', 'PHPStan\\Rules\\Cast\\PrintRule' => $baseDir . '/src/Rules/Cast/PrintRule.php', 'PHPStan\\Rules\\Cast\\UnsetCastRule' => $baseDir . '/src/Rules/Cast/UnsetCastRule.php', 'PHPStan\\Rules\\ClassCaseSensitivityCheck' => $baseDir . '/src/Rules/ClassCaseSensitivityCheck.php', 'PHPStan\\Rules\\ClassForbiddenNameCheck' => $baseDir . '/src/Rules/ClassForbiddenNameCheck.php', 'PHPStan\\Rules\\ClassNameCheck' => $baseDir . '/src/Rules/ClassNameCheck.php', 'PHPStan\\Rules\\ClassNameNodePair' => $baseDir . '/src/Rules/ClassNameNodePair.php', 'PHPStan\\Rules\\Classes\\AccessPrivateConstantThroughStaticRule' => $baseDir . '/src/Rules/Classes/AccessPrivateConstantThroughStaticRule.php', 'PHPStan\\Rules\\Classes\\AllowedSubTypesRule' => $baseDir . '/src/Rules/Classes/AllowedSubTypesRule.php', 'PHPStan\\Rules\\Classes\\ClassAttributesRule' => $baseDir . '/src/Rules/Classes/ClassAttributesRule.php', 'PHPStan\\Rules\\Classes\\ClassConstantAttributesRule' => $baseDir . '/src/Rules/Classes/ClassConstantAttributesRule.php', 'PHPStan\\Rules\\Classes\\ClassConstantRule' => $baseDir . '/src/Rules/Classes/ClassConstantRule.php', 'PHPStan\\Rules\\Classes\\DuplicateClassDeclarationRule' => $baseDir . '/src/Rules/Classes/DuplicateClassDeclarationRule.php', 'PHPStan\\Rules\\Classes\\DuplicateDeclarationRule' => $baseDir . '/src/Rules/Classes/DuplicateDeclarationRule.php', 'PHPStan\\Rules\\Classes\\EnumSanityRule' => $baseDir . '/src/Rules/Classes/EnumSanityRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassInClassExtendsRule' => $baseDir . '/src/Rules/Classes/ExistingClassInClassExtendsRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassInInstanceOfRule' => $baseDir . '/src/Rules/Classes/ExistingClassInInstanceOfRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassInTraitUseRule' => $baseDir . '/src/Rules/Classes/ExistingClassInTraitUseRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassesInClassImplementsRule' => $baseDir . '/src/Rules/Classes/ExistingClassesInClassImplementsRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassesInEnumImplementsRule' => $baseDir . '/src/Rules/Classes/ExistingClassesInEnumImplementsRule.php', 'PHPStan\\Rules\\Classes\\ExistingClassesInInterfaceExtendsRule' => $baseDir . '/src/Rules/Classes/ExistingClassesInInterfaceExtendsRule.php', 'PHPStan\\Rules\\Classes\\ImpossibleInstanceOfRule' => $baseDir . '/src/Rules/Classes/ImpossibleInstanceOfRule.php', 'PHPStan\\Rules\\Classes\\InstantiationCallableRule' => $baseDir . '/src/Rules/Classes/InstantiationCallableRule.php', 'PHPStan\\Rules\\Classes\\InstantiationRule' => $baseDir . '/src/Rules/Classes/InstantiationRule.php', 'PHPStan\\Rules\\Classes\\InvalidPromotedPropertiesRule' => $baseDir . '/src/Rules/Classes/InvalidPromotedPropertiesRule.php', 'PHPStan\\Rules\\Classes\\LocalTypeAliasesCheck' => $baseDir . '/src/Rules/Classes/LocalTypeAliasesCheck.php', 'PHPStan\\Rules\\Classes\\LocalTypeAliasesRule' => $baseDir . '/src/Rules/Classes/LocalTypeAliasesRule.php', 'PHPStan\\Rules\\Classes\\LocalTypeTraitAliasesRule' => $baseDir . '/src/Rules/Classes/LocalTypeTraitAliasesRule.php', 'PHPStan\\Rules\\Classes\\LocalTypeTraitUseAliasesRule' => $baseDir . '/src/Rules/Classes/LocalTypeTraitUseAliasesRule.php', 'PHPStan\\Rules\\Classes\\MethodTagCheck' => $baseDir . '/src/Rules/Classes/MethodTagCheck.php', 'PHPStan\\Rules\\Classes\\MethodTagRule' => $baseDir . '/src/Rules/Classes/MethodTagRule.php', 'PHPStan\\Rules\\Classes\\MethodTagTraitRule' => $baseDir . '/src/Rules/Classes/MethodTagTraitRule.php', 'PHPStan\\Rules\\Classes\\MethodTagTraitUseRule' => $baseDir . '/src/Rules/Classes/MethodTagTraitUseRule.php', 'PHPStan\\Rules\\Classes\\MixinCheck' => $baseDir . '/src/Rules/Classes/MixinCheck.php', 'PHPStan\\Rules\\Classes\\MixinRule' => $baseDir . '/src/Rules/Classes/MixinRule.php', 'PHPStan\\Rules\\Classes\\MixinTraitRule' => $baseDir . '/src/Rules/Classes/MixinTraitRule.php', 'PHPStan\\Rules\\Classes\\MixinTraitUseRule' => $baseDir . '/src/Rules/Classes/MixinTraitUseRule.php', 'PHPStan\\Rules\\Classes\\NewStaticRule' => $baseDir . '/src/Rules/Classes/NewStaticRule.php', 'PHPStan\\Rules\\Classes\\NonClassAttributeClassRule' => $baseDir . '/src/Rules/Classes/NonClassAttributeClassRule.php', 'PHPStan\\Rules\\Classes\\PropertyTagCheck' => $baseDir . '/src/Rules/Classes/PropertyTagCheck.php', 'PHPStan\\Rules\\Classes\\PropertyTagRule' => $baseDir . '/src/Rules/Classes/PropertyTagRule.php', 'PHPStan\\Rules\\Classes\\PropertyTagTraitRule' => $baseDir . '/src/Rules/Classes/PropertyTagTraitRule.php', 'PHPStan\\Rules\\Classes\\PropertyTagTraitUseRule' => $baseDir . '/src/Rules/Classes/PropertyTagTraitUseRule.php', 'PHPStan\\Rules\\Classes\\ReadOnlyClassRule' => $baseDir . '/src/Rules/Classes/ReadOnlyClassRule.php', 'PHPStan\\Rules\\Classes\\RequireExtendsRule' => $baseDir . '/src/Rules/Classes/RequireExtendsRule.php', 'PHPStan\\Rules\\Classes\\RequireImplementsRule' => $baseDir . '/src/Rules/Classes/RequireImplementsRule.php', 'PHPStan\\Rules\\Classes\\TraitAttributeClassRule' => $baseDir . '/src/Rules/Classes/TraitAttributeClassRule.php', 'PHPStan\\Rules\\Classes\\UnusedConstructorParametersRule' => $baseDir . '/src/Rules/Classes/UnusedConstructorParametersRule.php', 'PHPStan\\Rules\\Comparison\\BooleanAndConstantConditionRule' => $baseDir . '/src/Rules/Comparison/BooleanAndConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\BooleanNotConstantConditionRule' => $baseDir . '/src/Rules/Comparison/BooleanNotConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\BooleanOrConstantConditionRule' => $baseDir . '/src/Rules/Comparison/BooleanOrConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\ConstantConditionRuleHelper' => $baseDir . '/src/Rules/Comparison/ConstantConditionRuleHelper.php', 'PHPStan\\Rules\\Comparison\\ConstantLooseComparisonRule' => $baseDir . '/src/Rules/Comparison/ConstantLooseComparisonRule.php', 'PHPStan\\Rules\\Comparison\\DoWhileLoopConstantConditionRule' => $baseDir . '/src/Rules/Comparison/DoWhileLoopConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\ElseIfConstantConditionRule' => $baseDir . '/src/Rules/Comparison/ElseIfConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\IfConstantConditionRule' => $baseDir . '/src/Rules/Comparison/IfConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeFunctionCallRule' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeFunctionCallRule.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeHelper' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeHelper.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeMethodCallRule' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeMethodCallRule.php', 'PHPStan\\Rules\\Comparison\\ImpossibleCheckTypeStaticMethodCallRule' => $baseDir . '/src/Rules/Comparison/ImpossibleCheckTypeStaticMethodCallRule.php', 'PHPStan\\Rules\\Comparison\\LogicalXorConstantConditionRule' => $baseDir . '/src/Rules/Comparison/LogicalXorConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\MatchExpressionRule' => $baseDir . '/src/Rules/Comparison/MatchExpressionRule.php', 'PHPStan\\Rules\\Comparison\\NumberComparisonOperatorsConstantConditionRule' => $baseDir . '/src/Rules/Comparison/NumberComparisonOperatorsConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\StrictComparisonOfDifferentTypesRule' => $baseDir . '/src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php', 'PHPStan\\Rules\\Comparison\\TernaryOperatorConstantConditionRule' => $baseDir . '/src/Rules/Comparison/TernaryOperatorConstantConditionRule.php', 'PHPStan\\Rules\\Comparison\\UnreachableIfBranchesRule' => $baseDir . '/src/Rules/Comparison/UnreachableIfBranchesRule.php', 'PHPStan\\Rules\\Comparison\\UnreachableTernaryElseBranchRule' => $baseDir . '/src/Rules/Comparison/UnreachableTernaryElseBranchRule.php', 'PHPStan\\Rules\\Comparison\\UsageOfVoidMatchExpressionRule' => $baseDir . '/src/Rules/Comparison/UsageOfVoidMatchExpressionRule.php', 'PHPStan\\Rules\\Comparison\\WhileLoopAlwaysFalseConditionRule' => $baseDir . '/src/Rules/Comparison/WhileLoopAlwaysFalseConditionRule.php', 'PHPStan\\Rules\\Comparison\\WhileLoopAlwaysTrueConditionRule' => $baseDir . '/src/Rules/Comparison/WhileLoopAlwaysTrueConditionRule.php', 'PHPStan\\Rules\\Constants\\AlwaysUsedClassConstantsExtension' => $baseDir . '/src/Rules/Constants/AlwaysUsedClassConstantsExtension.php', 'PHPStan\\Rules\\Constants\\AlwaysUsedClassConstantsExtensionProvider' => $baseDir . '/src/Rules/Constants/AlwaysUsedClassConstantsExtensionProvider.php', 'PHPStan\\Rules\\Constants\\ClassAsClassConstantRule' => $baseDir . '/src/Rules/Constants/ClassAsClassConstantRule.php', 'PHPStan\\Rules\\Constants\\ConstantRule' => $baseDir . '/src/Rules/Constants/ConstantRule.php', 'PHPStan\\Rules\\Constants\\DynamicClassConstantFetchRule' => $baseDir . '/src/Rules/Constants/DynamicClassConstantFetchRule.php', 'PHPStan\\Rules\\Constants\\FinalConstantRule' => $baseDir . '/src/Rules/Constants/FinalConstantRule.php', 'PHPStan\\Rules\\Constants\\LazyAlwaysUsedClassConstantsExtensionProvider' => $baseDir . '/src/Rules/Constants/LazyAlwaysUsedClassConstantsExtensionProvider.php', 'PHPStan\\Rules\\Constants\\MagicConstantContextRule' => $baseDir . '/src/Rules/Constants/MagicConstantContextRule.php', 'PHPStan\\Rules\\Constants\\MissingClassConstantTypehintRule' => $baseDir . '/src/Rules/Constants/MissingClassConstantTypehintRule.php', 'PHPStan\\Rules\\Constants\\NativeTypedClassConstantRule' => $baseDir . '/src/Rules/Constants/NativeTypedClassConstantRule.php', 'PHPStan\\Rules\\Constants\\OverridingConstantRule' => $baseDir . '/src/Rules/Constants/OverridingConstantRule.php', 'PHPStan\\Rules\\Constants\\ValueAssignedToClassConstantRule' => $baseDir . '/src/Rules/Constants/ValueAssignedToClassConstantRule.php', 'PHPStan\\Rules\\DateTimeInstantiationRule' => $baseDir . '/src/Rules/DateTimeInstantiationRule.php', 'PHPStan\\Rules\\DeadCode\\BetterNoopRule' => $baseDir . '/src/Rules/DeadCode/BetterNoopRule.php', 'PHPStan\\Rules\\DeadCode\\CallToConstructorStatementWithoutImpurePointsRule' => $baseDir . '/src/Rules/DeadCode/CallToConstructorStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\CallToFunctionStatementWithoutImpurePointsRule' => $baseDir . '/src/Rules/DeadCode/CallToFunctionStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\CallToMethodStatementWithoutImpurePointsRule' => $baseDir . '/src/Rules/DeadCode/CallToMethodStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\CallToStaticMethodStatementWithoutImpurePointsRule' => $baseDir . '/src/Rules/DeadCode/CallToStaticMethodStatementWithoutImpurePointsRule.php', 'PHPStan\\Rules\\DeadCode\\ConstructorWithoutImpurePointsCollector' => $baseDir . '/src/Rules/DeadCode/ConstructorWithoutImpurePointsCollector.php', 'PHPStan\\Rules\\DeadCode\\FunctionWithoutImpurePointsCollector' => $baseDir . '/src/Rules/DeadCode/FunctionWithoutImpurePointsCollector.php', 'PHPStan\\Rules\\DeadCode\\MethodWithoutImpurePointsCollector' => $baseDir . '/src/Rules/DeadCode/MethodWithoutImpurePointsCollector.php', 'PHPStan\\Rules\\DeadCode\\NoopRule' => $baseDir . '/src/Rules/DeadCode/NoopRule.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureFuncCallCollector' => $baseDir . '/src/Rules/DeadCode/PossiblyPureFuncCallCollector.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureMethodCallCollector' => $baseDir . '/src/Rules/DeadCode/PossiblyPureMethodCallCollector.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureNewCollector' => $baseDir . '/src/Rules/DeadCode/PossiblyPureNewCollector.php', 'PHPStan\\Rules\\DeadCode\\PossiblyPureStaticCallCollector' => $baseDir . '/src/Rules/DeadCode/PossiblyPureStaticCallCollector.php', 'PHPStan\\Rules\\DeadCode\\UnreachableStatementRule' => $baseDir . '/src/Rules/DeadCode/UnreachableStatementRule.php', 'PHPStan\\Rules\\DeadCode\\UnusedPrivateConstantRule' => $baseDir . '/src/Rules/DeadCode/UnusedPrivateConstantRule.php', 'PHPStan\\Rules\\DeadCode\\UnusedPrivateMethodRule' => $baseDir . '/src/Rules/DeadCode/UnusedPrivateMethodRule.php', 'PHPStan\\Rules\\DeadCode\\UnusedPrivatePropertyRule' => $baseDir . '/src/Rules/DeadCode/UnusedPrivatePropertyRule.php', 'PHPStan\\Rules\\Debug\\DebugScopeRule' => $baseDir . '/src/Rules/Debug/DebugScopeRule.php', 'PHPStan\\Rules\\Debug\\DumpPhpDocTypeRule' => $baseDir . '/src/Rules/Debug/DumpPhpDocTypeRule.php', 'PHPStan\\Rules\\Debug\\DumpTypeRule' => $baseDir . '/src/Rules/Debug/DumpTypeRule.php', 'PHPStan\\Rules\\Debug\\FileAssertRule' => $baseDir . '/src/Rules/Debug/FileAssertRule.php', 'PHPStan\\Rules\\DirectRegistry' => $baseDir . '/src/Rules/DirectRegistry.php', 'PHPStan\\Rules\\EnumCases\\EnumCaseAttributesRule' => $baseDir . '/src/Rules/EnumCases/EnumCaseAttributesRule.php', 'PHPStan\\Rules\\Exceptions\\CatchWithUnthrownExceptionRule' => $baseDir . '/src/Rules/Exceptions/CatchWithUnthrownExceptionRule.php', 'PHPStan\\Rules\\Exceptions\\CaughtExceptionExistenceRule' => $baseDir . '/src/Rules/Exceptions/CaughtExceptionExistenceRule.php', 'PHPStan\\Rules\\Exceptions\\DefaultExceptionTypeResolver' => $baseDir . '/src/Rules/Exceptions/DefaultExceptionTypeResolver.php', 'PHPStan\\Rules\\Exceptions\\ExceptionTypeResolver' => $baseDir . '/src/Rules/Exceptions/ExceptionTypeResolver.php', 'PHPStan\\Rules\\Exceptions\\MissingCheckedExceptionInFunctionThrowsRule' => $baseDir . '/src/Rules/Exceptions/MissingCheckedExceptionInFunctionThrowsRule.php', 'PHPStan\\Rules\\Exceptions\\MissingCheckedExceptionInMethodThrowsRule' => $baseDir . '/src/Rules/Exceptions/MissingCheckedExceptionInMethodThrowsRule.php', 'PHPStan\\Rules\\Exceptions\\MissingCheckedExceptionInThrowsCheck' => $baseDir . '/src/Rules/Exceptions/MissingCheckedExceptionInThrowsCheck.php', 'PHPStan\\Rules\\Exceptions\\NoncapturingCatchRule' => $baseDir . '/src/Rules/Exceptions/NoncapturingCatchRule.php', 'PHPStan\\Rules\\Exceptions\\OverwrittenExitPointByFinallyRule' => $baseDir . '/src/Rules/Exceptions/OverwrittenExitPointByFinallyRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowExprTypeRule' => $baseDir . '/src/Rules/Exceptions/ThrowExprTypeRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowExpressionRule' => $baseDir . '/src/Rules/Exceptions/ThrowExpressionRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowsVoidFunctionWithExplicitThrowPointRule' => $baseDir . '/src/Rules/Exceptions/ThrowsVoidFunctionWithExplicitThrowPointRule.php', 'PHPStan\\Rules\\Exceptions\\ThrowsVoidMethodWithExplicitThrowPointRule' => $baseDir . '/src/Rules/Exceptions/ThrowsVoidMethodWithExplicitThrowPointRule.php', 'PHPStan\\Rules\\Exceptions\\TooWideFunctionThrowTypeRule' => $baseDir . '/src/Rules/Exceptions/TooWideFunctionThrowTypeRule.php', 'PHPStan\\Rules\\Exceptions\\TooWideMethodThrowTypeRule' => $baseDir . '/src/Rules/Exceptions/TooWideMethodThrowTypeRule.php', 'PHPStan\\Rules\\Exceptions\\TooWideThrowTypeCheck' => $baseDir . '/src/Rules/Exceptions/TooWideThrowTypeCheck.php', 'PHPStan\\Rules\\FileRuleError' => $baseDir . '/src/Rules/FileRuleError.php', 'PHPStan\\Rules\\FoundTypeResult' => $baseDir . '/src/Rules/FoundTypeResult.php', 'PHPStan\\Rules\\FunctionCallParametersCheck' => $baseDir . '/src/Rules/FunctionCallParametersCheck.php', 'PHPStan\\Rules\\FunctionDefinitionCheck' => $baseDir . '/src/Rules/FunctionDefinitionCheck.php', 'PHPStan\\Rules\\FunctionReturnTypeCheck' => $baseDir . '/src/Rules/FunctionReturnTypeCheck.php', 'PHPStan\\Rules\\Functions\\ArrayFilterRule' => $baseDir . '/src/Rules/Functions/ArrayFilterRule.php', 'PHPStan\\Rules\\Functions\\ArrayValuesRule' => $baseDir . '/src/Rules/Functions/ArrayValuesRule.php', 'PHPStan\\Rules\\Functions\\ArrowFunctionAttributesRule' => $baseDir . '/src/Rules/Functions/ArrowFunctionAttributesRule.php', 'PHPStan\\Rules\\Functions\\ArrowFunctionReturnNullsafeByRefRule' => $baseDir . '/src/Rules/Functions/ArrowFunctionReturnNullsafeByRefRule.php', 'PHPStan\\Rules\\Functions\\ArrowFunctionReturnTypeRule' => $baseDir . '/src/Rules/Functions/ArrowFunctionReturnTypeRule.php', 'PHPStan\\Rules\\Functions\\CallCallablesRule' => $baseDir . '/src/Rules/Functions/CallCallablesRule.php', 'PHPStan\\Rules\\Functions\\CallToFunctionParametersRule' => $baseDir . '/src/Rules/Functions/CallToFunctionParametersRule.php', 'PHPStan\\Rules\\Functions\\CallToFunctionStatementWithoutSideEffectsRule' => $baseDir . '/src/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Functions\\CallToNonExistentFunctionRule' => $baseDir . '/src/Rules/Functions/CallToNonExistentFunctionRule.php', 'PHPStan\\Rules\\Functions\\CallUserFuncRule' => $baseDir . '/src/Rules/Functions/CallUserFuncRule.php', 'PHPStan\\Rules\\Functions\\ClosureAttributesRule' => $baseDir . '/src/Rules/Functions/ClosureAttributesRule.php', 'PHPStan\\Rules\\Functions\\ClosureReturnTypeRule' => $baseDir . '/src/Rules/Functions/ClosureReturnTypeRule.php', 'PHPStan\\Rules\\Functions\\DefineParametersRule' => $baseDir . '/src/Rules/Functions/DefineParametersRule.php', 'PHPStan\\Rules\\Functions\\DuplicateFunctionDeclarationRule' => $baseDir . '/src/Rules/Functions/DuplicateFunctionDeclarationRule.php', 'PHPStan\\Rules\\Functions\\ExistingClassesInArrowFunctionTypehintsRule' => $baseDir . '/src/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRule.php', 'PHPStan\\Rules\\Functions\\ExistingClassesInClosureTypehintsRule' => $baseDir . '/src/Rules/Functions/ExistingClassesInClosureTypehintsRule.php', 'PHPStan\\Rules\\Functions\\ExistingClassesInTypehintsRule' => $baseDir . '/src/Rules/Functions/ExistingClassesInTypehintsRule.php', 'PHPStan\\Rules\\Functions\\FunctionAttributesRule' => $baseDir . '/src/Rules/Functions/FunctionAttributesRule.php', 'PHPStan\\Rules\\Functions\\FunctionCallableRule' => $baseDir . '/src/Rules/Functions/FunctionCallableRule.php', 'PHPStan\\Rules\\Functions\\ImplodeFunctionRule' => $baseDir . '/src/Rules/Functions/ImplodeFunctionRule.php', 'PHPStan\\Rules\\Functions\\ImplodeParameterCastableToStringRule' => $baseDir . '/src/Rules/Functions/ImplodeParameterCastableToStringRule.php', 'PHPStan\\Rules\\Functions\\IncompatibleArrowFunctionDefaultParameterTypeRule' => $baseDir . '/src/Rules/Functions/IncompatibleArrowFunctionDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Functions\\IncompatibleClosureDefaultParameterTypeRule' => $baseDir . '/src/Rules/Functions/IncompatibleClosureDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Functions\\IncompatibleDefaultParameterTypeRule' => $baseDir . '/src/Rules/Functions/IncompatibleDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Functions\\InnerFunctionRule' => $baseDir . '/src/Rules/Functions/InnerFunctionRule.php', 'PHPStan\\Rules\\Functions\\InvalidLexicalVariablesInClosureUseRule' => $baseDir . '/src/Rules/Functions/InvalidLexicalVariablesInClosureUseRule.php', 'PHPStan\\Rules\\Functions\\MissingFunctionParameterTypehintRule' => $baseDir . '/src/Rules/Functions/MissingFunctionParameterTypehintRule.php', 'PHPStan\\Rules\\Functions\\MissingFunctionReturnTypehintRule' => $baseDir . '/src/Rules/Functions/MissingFunctionReturnTypehintRule.php', 'PHPStan\\Rules\\Functions\\ParamAttributesRule' => $baseDir . '/src/Rules/Functions/ParamAttributesRule.php', 'PHPStan\\Rules\\Functions\\ParameterCastableToStringRule' => $baseDir . '/src/Rules/Functions/ParameterCastableToStringRule.php', 'PHPStan\\Rules\\Functions\\PrintfArrayParametersRule' => $baseDir . '/src/Rules/Functions/PrintfArrayParametersRule.php', 'PHPStan\\Rules\\Functions\\PrintfHelper' => $baseDir . '/src/Rules/Functions/PrintfHelper.php', 'PHPStan\\Rules\\Functions\\PrintfParametersRule' => $baseDir . '/src/Rules/Functions/PrintfParametersRule.php', 'PHPStan\\Rules\\Functions\\RandomIntParametersRule' => $baseDir . '/src/Rules/Functions/RandomIntParametersRule.php', 'PHPStan\\Rules\\Functions\\RedefinedParametersRule' => $baseDir . '/src/Rules/Functions/RedefinedParametersRule.php', 'PHPStan\\Rules\\Functions\\ReturnNullsafeByRefRule' => $baseDir . '/src/Rules/Functions/ReturnNullsafeByRefRule.php', 'PHPStan\\Rules\\Functions\\ReturnTypeRule' => $baseDir . '/src/Rules/Functions/ReturnTypeRule.php', 'PHPStan\\Rules\\Functions\\SortParameterCastableToStringRule' => $baseDir . '/src/Rules/Functions/SortParameterCastableToStringRule.php', 'PHPStan\\Rules\\Functions\\UnusedClosureUsesRule' => $baseDir . '/src/Rules/Functions/UnusedClosureUsesRule.php', 'PHPStan\\Rules\\Functions\\UselessFunctionReturnValueRule' => $baseDir . '/src/Rules/Functions/UselessFunctionReturnValueRule.php', 'PHPStan\\Rules\\Functions\\VariadicParametersDeclarationRule' => $baseDir . '/src/Rules/Functions/VariadicParametersDeclarationRule.php', 'PHPStan\\Rules\\Generators\\YieldFromTypeRule' => $baseDir . '/src/Rules/Generators/YieldFromTypeRule.php', 'PHPStan\\Rules\\Generators\\YieldInGeneratorRule' => $baseDir . '/src/Rules/Generators/YieldInGeneratorRule.php', 'PHPStan\\Rules\\Generators\\YieldTypeRule' => $baseDir . '/src/Rules/Generators/YieldTypeRule.php', 'PHPStan\\Rules\\Generics\\ClassAncestorsRule' => $baseDir . '/src/Rules/Generics/ClassAncestorsRule.php', 'PHPStan\\Rules\\Generics\\ClassTemplateTypeRule' => $baseDir . '/src/Rules/Generics/ClassTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\CrossCheckInterfacesHelper' => $baseDir . '/src/Rules/Generics/CrossCheckInterfacesHelper.php', 'PHPStan\\Rules\\Generics\\EnumAncestorsRule' => $baseDir . '/src/Rules/Generics/EnumAncestorsRule.php', 'PHPStan\\Rules\\Generics\\EnumTemplateTypeRule' => $baseDir . '/src/Rules/Generics/EnumTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\FunctionSignatureVarianceRule' => $baseDir . '/src/Rules/Generics/FunctionSignatureVarianceRule.php', 'PHPStan\\Rules\\Generics\\FunctionTemplateTypeRule' => $baseDir . '/src/Rules/Generics/FunctionTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\GenericAncestorsCheck' => $baseDir . '/src/Rules/Generics/GenericAncestorsCheck.php', 'PHPStan\\Rules\\Generics\\GenericObjectTypeCheck' => $baseDir . '/src/Rules/Generics/GenericObjectTypeCheck.php', 'PHPStan\\Rules\\Generics\\InterfaceAncestorsRule' => $baseDir . '/src/Rules/Generics/InterfaceAncestorsRule.php', 'PHPStan\\Rules\\Generics\\InterfaceTemplateTypeRule' => $baseDir . '/src/Rules/Generics/InterfaceTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\MethodSignatureVarianceRule' => $baseDir . '/src/Rules/Generics/MethodSignatureVarianceRule.php', 'PHPStan\\Rules\\Generics\\MethodTagTemplateTypeCheck' => $baseDir . '/src/Rules/Generics/MethodTagTemplateTypeCheck.php', 'PHPStan\\Rules\\Generics\\MethodTagTemplateTypeRule' => $baseDir . '/src/Rules/Generics/MethodTagTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\MethodTagTemplateTypeTraitRule' => $baseDir . '/src/Rules/Generics/MethodTagTemplateTypeTraitRule.php', 'PHPStan\\Rules\\Generics\\MethodTemplateTypeRule' => $baseDir . '/src/Rules/Generics/MethodTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\PropertyVarianceRule' => $baseDir . '/src/Rules/Generics/PropertyVarianceRule.php', 'PHPStan\\Rules\\Generics\\TemplateTypeCheck' => $baseDir . '/src/Rules/Generics/TemplateTypeCheck.php', 'PHPStan\\Rules\\Generics\\TraitTemplateTypeRule' => $baseDir . '/src/Rules/Generics/TraitTemplateTypeRule.php', 'PHPStan\\Rules\\Generics\\UsedTraitsRule' => $baseDir . '/src/Rules/Generics/UsedTraitsRule.php', 'PHPStan\\Rules\\Generics\\VarianceCheck' => $baseDir . '/src/Rules/Generics/VarianceCheck.php', 'PHPStan\\Rules\\IdentifierRuleError' => $baseDir . '/src/Rules/IdentifierRuleError.php', 'PHPStan\\Rules\\Ignore\\IgnoreParseErrorRule' => $baseDir . '/src/Rules/Ignore/IgnoreParseErrorRule.php', 'PHPStan\\Rules\\IssetCheck' => $baseDir . '/src/Rules/IssetCheck.php', 'PHPStan\\Rules\\Keywords\\ContinueBreakInLoopRule' => $baseDir . '/src/Rules/Keywords/ContinueBreakInLoopRule.php', 'PHPStan\\Rules\\Keywords\\DeclareStrictTypesRule' => $baseDir . '/src/Rules/Keywords/DeclareStrictTypesRule.php', 'PHPStan\\Rules\\Keywords\\RequireFileExistsRule' => $baseDir . '/src/Rules/Keywords/RequireFileExistsRule.php', 'PHPStan\\Rules\\LazyRegistry' => $baseDir . '/src/Rules/LazyRegistry.php', 'PHPStan\\Rules\\LineRuleError' => $baseDir . '/src/Rules/LineRuleError.php', 'PHPStan\\Rules\\MetadataRuleError' => $baseDir . '/src/Rules/MetadataRuleError.php', 'PHPStan\\Rules\\Methods\\AbstractMethodInNonAbstractClassRule' => $baseDir . '/src/Rules/Methods/AbstractMethodInNonAbstractClassRule.php', 'PHPStan\\Rules\\Methods\\AbstractPrivateMethodRule' => $baseDir . '/src/Rules/Methods/AbstractPrivateMethodRule.php', 'PHPStan\\Rules\\Methods\\AlwaysUsedMethodExtension' => $baseDir . '/src/Rules/Methods/AlwaysUsedMethodExtension.php', 'PHPStan\\Rules\\Methods\\AlwaysUsedMethodExtensionProvider' => $baseDir . '/src/Rules/Methods/AlwaysUsedMethodExtensionProvider.php', 'PHPStan\\Rules\\Methods\\CallMethodsRule' => $baseDir . '/src/Rules/Methods/CallMethodsRule.php', 'PHPStan\\Rules\\Methods\\CallPrivateMethodThroughStaticRule' => $baseDir . '/src/Rules/Methods/CallPrivateMethodThroughStaticRule.php', 'PHPStan\\Rules\\Methods\\CallStaticMethodsRule' => $baseDir . '/src/Rules/Methods/CallStaticMethodsRule.php', 'PHPStan\\Rules\\Methods\\CallToConstructorStatementWithoutSideEffectsRule' => $baseDir . '/src/Rules/Methods/CallToConstructorStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Methods\\CallToMethodStatementWithoutSideEffectsRule' => $baseDir . '/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Methods\\CallToStaticMethodStatementWithoutSideEffectsRule' => $baseDir . '/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php', 'PHPStan\\Rules\\Methods\\ConsistentConstructorRule' => $baseDir . '/src/Rules/Methods/ConsistentConstructorRule.php', 'PHPStan\\Rules\\Methods\\ConstructorReturnTypeRule' => $baseDir . '/src/Rules/Methods/ConstructorReturnTypeRule.php', 'PHPStan\\Rules\\Methods\\DirectAlwaysUsedMethodExtensionProvider' => $baseDir . '/src/Rules/Methods/DirectAlwaysUsedMethodExtensionProvider.php', 'PHPStan\\Rules\\Methods\\ExistingClassesInTypehintsRule' => $baseDir . '/src/Rules/Methods/ExistingClassesInTypehintsRule.php', 'PHPStan\\Rules\\Methods\\FinalPrivateMethodRule' => $baseDir . '/src/Rules/Methods/FinalPrivateMethodRule.php', 'PHPStan\\Rules\\Methods\\IllegalConstructorMethodCallRule' => $baseDir . '/src/Rules/Methods/IllegalConstructorMethodCallRule.php', 'PHPStan\\Rules\\Methods\\IllegalConstructorStaticCallRule' => $baseDir . '/src/Rules/Methods/IllegalConstructorStaticCallRule.php', 'PHPStan\\Rules\\Methods\\IncompatibleDefaultParameterTypeRule' => $baseDir . '/src/Rules/Methods/IncompatibleDefaultParameterTypeRule.php', 'PHPStan\\Rules\\Methods\\LazyAlwaysUsedMethodExtensionProvider' => $baseDir . '/src/Rules/Methods/LazyAlwaysUsedMethodExtensionProvider.php', 'PHPStan\\Rules\\Methods\\MethodAttributesRule' => $baseDir . '/src/Rules/Methods/MethodAttributesRule.php', 'PHPStan\\Rules\\Methods\\MethodCallCheck' => $baseDir . '/src/Rules/Methods/MethodCallCheck.php', 'PHPStan\\Rules\\Methods\\MethodCallableRule' => $baseDir . '/src/Rules/Methods/MethodCallableRule.php', 'PHPStan\\Rules\\Methods\\MethodParameterComparisonHelper' => $baseDir . '/src/Rules/Methods/MethodParameterComparisonHelper.php', 'PHPStan\\Rules\\Methods\\MethodSignatureRule' => $baseDir . '/src/Rules/Methods/MethodSignatureRule.php', 'PHPStan\\Rules\\Methods\\MethodVisibilityInInterfaceRule' => $baseDir . '/src/Rules/Methods/MethodVisibilityInInterfaceRule.php', 'PHPStan\\Rules\\Methods\\MissingMagicSerializationMethodsRule' => $baseDir . '/src/Rules/Methods/MissingMagicSerializationMethodsRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodImplementationRule' => $baseDir . '/src/Rules/Methods/MissingMethodImplementationRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodParameterTypehintRule' => $baseDir . '/src/Rules/Methods/MissingMethodParameterTypehintRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodReturnTypehintRule' => $baseDir . '/src/Rules/Methods/MissingMethodReturnTypehintRule.php', 'PHPStan\\Rules\\Methods\\MissingMethodSelfOutTypeRule' => $baseDir . '/src/Rules/Methods/MissingMethodSelfOutTypeRule.php', 'PHPStan\\Rules\\Methods\\NullsafeMethodCallRule' => $baseDir . '/src/Rules/Methods/NullsafeMethodCallRule.php', 'PHPStan\\Rules\\Methods\\OverridingMethodRule' => $baseDir . '/src/Rules/Methods/OverridingMethodRule.php', 'PHPStan\\Rules\\Methods\\ReturnTypeRule' => $baseDir . '/src/Rules/Methods/ReturnTypeRule.php', 'PHPStan\\Rules\\Methods\\StaticMethodCallCheck' => $baseDir . '/src/Rules/Methods/StaticMethodCallCheck.php', 'PHPStan\\Rules\\Methods\\StaticMethodCallableRule' => $baseDir . '/src/Rules/Methods/StaticMethodCallableRule.php', 'PHPStan\\Rules\\MissingTypehintCheck' => $baseDir . '/src/Rules/MissingTypehintCheck.php', 'PHPStan\\Rules\\Missing\\MissingReturnRule' => $baseDir . '/src/Rules/Missing/MissingReturnRule.php', 'PHPStan\\Rules\\Names\\UsedNamesRule' => $baseDir . '/src/Rules/Names/UsedNamesRule.php', 'PHPStan\\Rules\\Namespaces\\ExistingNamesInGroupUseRule' => $baseDir . '/src/Rules/Namespaces/ExistingNamesInGroupUseRule.php', 'PHPStan\\Rules\\Namespaces\\ExistingNamesInUseRule' => $baseDir . '/src/Rules/Namespaces/ExistingNamesInUseRule.php', 'PHPStan\\Rules\\NonIgnorableRuleError' => $baseDir . '/src/Rules/NonIgnorableRuleError.php', 'PHPStan\\Rules\\NullsafeCheck' => $baseDir . '/src/Rules/NullsafeCheck.php', 'PHPStan\\Rules\\Operators\\InvalidAssignVarRule' => $baseDir . '/src/Rules/Operators/InvalidAssignVarRule.php', 'PHPStan\\Rules\\Operators\\InvalidBinaryOperationRule' => $baseDir . '/src/Rules/Operators/InvalidBinaryOperationRule.php', 'PHPStan\\Rules\\Operators\\InvalidComparisonOperationRule' => $baseDir . '/src/Rules/Operators/InvalidComparisonOperationRule.php', 'PHPStan\\Rules\\Operators\\InvalidIncDecOperationRule' => $baseDir . '/src/Rules/Operators/InvalidIncDecOperationRule.php', 'PHPStan\\Rules\\Operators\\InvalidUnaryOperationRule' => $baseDir . '/src/Rules/Operators/InvalidUnaryOperationRule.php', 'PHPStan\\Rules\\ParameterCastableToStringCheck' => $baseDir . '/src/Rules/ParameterCastableToStringCheck.php', 'PHPStan\\Rules\\PhpDoc\\AssertRuleHelper' => $baseDir . '/src/Rules/PhpDoc/AssertRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\ConditionalReturnTypeRuleHelper' => $baseDir . '/src/Rules/PhpDoc/ConditionalReturnTypeRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\FunctionAssertRule' => $baseDir . '/src/Rules/PhpDoc/FunctionAssertRule.php', 'PHPStan\\Rules\\PhpDoc\\FunctionConditionalReturnTypeRule' => $baseDir . '/src/Rules/PhpDoc/FunctionConditionalReturnTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\GenericCallableRuleHelper' => $baseDir . '/src/Rules/PhpDoc/GenericCallableRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\IncompatibleClassConstantPhpDocTypeRule' => $baseDir . '/src/Rules/PhpDoc/IncompatibleClassConstantPhpDocTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatibleParamImmediatelyInvokedCallableRule' => $baseDir . '/src/Rules/PhpDoc/IncompatibleParamImmediatelyInvokedCallableRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatiblePhpDocTypeRule' => $baseDir . '/src/Rules/PhpDoc/IncompatiblePhpDocTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatiblePropertyPhpDocTypeRule' => $baseDir . '/src/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\IncompatibleSelfOutTypeRule' => $baseDir . '/src/Rules/PhpDoc/IncompatibleSelfOutTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidPHPStanDocTagRule' => $baseDir . '/src/Rules/PhpDoc/InvalidPHPStanDocTagRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidPhpDocTagValueRule' => $baseDir . '/src/Rules/PhpDoc/InvalidPhpDocTagValueRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidPhpDocVarTagTypeRule' => $baseDir . '/src/Rules/PhpDoc/InvalidPhpDocVarTagTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\InvalidThrowsPhpDocValueRule' => $baseDir . '/src/Rules/PhpDoc/InvalidThrowsPhpDocValueRule.php', 'PHPStan\\Rules\\PhpDoc\\MethodAssertRule' => $baseDir . '/src/Rules/PhpDoc/MethodAssertRule.php', 'PHPStan\\Rules\\PhpDoc\\MethodConditionalReturnTypeRule' => $baseDir . '/src/Rules/PhpDoc/MethodConditionalReturnTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\PhpDocLineHelper' => $baseDir . '/src/Rules/PhpDoc/PhpDocLineHelper.php', 'PHPStan\\Rules\\PhpDoc\\RequireExtendsCheck' => $baseDir . '/src/Rules/PhpDoc/RequireExtendsCheck.php', 'PHPStan\\Rules\\PhpDoc\\RequireExtendsDefinitionClassRule' => $baseDir . '/src/Rules/PhpDoc/RequireExtendsDefinitionClassRule.php', 'PHPStan\\Rules\\PhpDoc\\RequireExtendsDefinitionTraitRule' => $baseDir . '/src/Rules/PhpDoc/RequireExtendsDefinitionTraitRule.php', 'PHPStan\\Rules\\PhpDoc\\RequireImplementsDefinitionClassRule' => $baseDir . '/src/Rules/PhpDoc/RequireImplementsDefinitionClassRule.php', 'PHPStan\\Rules\\PhpDoc\\RequireImplementsDefinitionTraitRule' => $baseDir . '/src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php', 'PHPStan\\Rules\\PhpDoc\\UnresolvableTypeHelper' => $baseDir . '/src/Rules/PhpDoc/UnresolvableTypeHelper.php', 'PHPStan\\Rules\\PhpDoc\\VarTagChangedExpressionTypeRule' => $baseDir . '/src/Rules/PhpDoc/VarTagChangedExpressionTypeRule.php', 'PHPStan\\Rules\\PhpDoc\\VarTagTypeRuleHelper' => $baseDir . '/src/Rules/PhpDoc/VarTagTypeRuleHelper.php', 'PHPStan\\Rules\\PhpDoc\\WrongVariableNameInVarTagRule' => $baseDir . '/src/Rules/PhpDoc/WrongVariableNameInVarTagRule.php', 'PHPStan\\Rules\\Playground\\FunctionNeverRule' => $baseDir . '/src/Rules/Playground/FunctionNeverRule.php', 'PHPStan\\Rules\\Playground\\MethodNeverRule' => $baseDir . '/src/Rules/Playground/MethodNeverRule.php', 'PHPStan\\Rules\\Playground\\NeverRuleHelper' => $baseDir . '/src/Rules/Playground/NeverRuleHelper.php', 'PHPStan\\Rules\\Playground\\NoPhpCodeRule' => $baseDir . '/src/Rules/Playground/NoPhpCodeRule.php', 'PHPStan\\Rules\\Playground\\NotAnalysedTraitRule' => $baseDir . '/src/Rules/Playground/NotAnalysedTraitRule.php', 'PHPStan\\Rules\\Properties\\AccessPrivatePropertyThroughStaticRule' => $baseDir . '/src/Rules/Properties/AccessPrivatePropertyThroughStaticRule.php', 'PHPStan\\Rules\\Properties\\AccessPropertiesInAssignRule' => $baseDir . '/src/Rules/Properties/AccessPropertiesInAssignRule.php', 'PHPStan\\Rules\\Properties\\AccessPropertiesRule' => $baseDir . '/src/Rules/Properties/AccessPropertiesRule.php', 'PHPStan\\Rules\\Properties\\AccessStaticPropertiesInAssignRule' => $baseDir . '/src/Rules/Properties/AccessStaticPropertiesInAssignRule.php', 'PHPStan\\Rules\\Properties\\AccessStaticPropertiesRule' => $baseDir . '/src/Rules/Properties/AccessStaticPropertiesRule.php', 'PHPStan\\Rules\\Properties\\DefaultValueTypesAssignedToPropertiesRule' => $baseDir . '/src/Rules/Properties/DefaultValueTypesAssignedToPropertiesRule.php', 'PHPStan\\Rules\\Properties\\DirectReadWritePropertiesExtensionProvider' => $baseDir . '/src/Rules/Properties/DirectReadWritePropertiesExtensionProvider.php', 'PHPStan\\Rules\\Properties\\ExistingClassesInPropertiesRule' => $baseDir . '/src/Rules/Properties/ExistingClassesInPropertiesRule.php', 'PHPStan\\Rules\\Properties\\FoundPropertyReflection' => $baseDir . '/src/Rules/Properties/FoundPropertyReflection.php', 'PHPStan\\Rules\\Properties\\InvalidCallablePropertyTypeRule' => $baseDir . '/src/Rules/Properties/InvalidCallablePropertyTypeRule.php', 'PHPStan\\Rules\\Properties\\LazyReadWritePropertiesExtensionProvider' => $baseDir . '/src/Rules/Properties/LazyReadWritePropertiesExtensionProvider.php', 'PHPStan\\Rules\\Properties\\MissingPropertyTypehintRule' => $baseDir . '/src/Rules/Properties/MissingPropertyTypehintRule.php', 'PHPStan\\Rules\\Properties\\MissingReadOnlyByPhpDocPropertyAssignRule' => $baseDir . '/src/Rules/Properties/MissingReadOnlyByPhpDocPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\MissingReadOnlyPropertyAssignRule' => $baseDir . '/src/Rules/Properties/MissingReadOnlyPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\NullsafePropertyFetchRule' => $baseDir . '/src/Rules/Properties/NullsafePropertyFetchRule.php', 'PHPStan\\Rules\\Properties\\OverridingPropertyRule' => $baseDir . '/src/Rules/Properties/OverridingPropertyRule.php', 'PHPStan\\Rules\\Properties\\PropertiesInInterfaceRule' => $baseDir . '/src/Rules/Properties/PropertiesInInterfaceRule.php', 'PHPStan\\Rules\\Properties\\PropertyAttributesRule' => $baseDir . '/src/Rules/Properties/PropertyAttributesRule.php', 'PHPStan\\Rules\\Properties\\PropertyDescriptor' => $baseDir . '/src/Rules/Properties/PropertyDescriptor.php', 'PHPStan\\Rules\\Properties\\PropertyReflectionFinder' => $baseDir . '/src/Rules/Properties/PropertyReflectionFinder.php', 'PHPStan\\Rules\\Properties\\ReadOnlyByPhpDocPropertyAssignRefRule' => $baseDir . '/src/Rules/Properties/ReadOnlyByPhpDocPropertyAssignRefRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyByPhpDocPropertyAssignRule' => $baseDir . '/src/Rules/Properties/ReadOnlyByPhpDocPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyByPhpDocPropertyRule' => $baseDir . '/src/Rules/Properties/ReadOnlyByPhpDocPropertyRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyPropertyAssignRefRule' => $baseDir . '/src/Rules/Properties/ReadOnlyPropertyAssignRefRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyPropertyAssignRule' => $baseDir . '/src/Rules/Properties/ReadOnlyPropertyAssignRule.php', 'PHPStan\\Rules\\Properties\\ReadOnlyPropertyRule' => $baseDir . '/src/Rules/Properties/ReadOnlyPropertyRule.php', 'PHPStan\\Rules\\Properties\\ReadWritePropertiesExtension' => $baseDir . '/src/Rules/Properties/ReadWritePropertiesExtension.php', 'PHPStan\\Rules\\Properties\\ReadWritePropertiesExtensionProvider' => $baseDir . '/src/Rules/Properties/ReadWritePropertiesExtensionProvider.php', 'PHPStan\\Rules\\Properties\\ReadingWriteOnlyPropertiesRule' => $baseDir . '/src/Rules/Properties/ReadingWriteOnlyPropertiesRule.php', 'PHPStan\\Rules\\Properties\\TypesAssignedToPropertiesRule' => $baseDir . '/src/Rules/Properties/TypesAssignedToPropertiesRule.php', 'PHPStan\\Rules\\Properties\\UninitializedPropertyRule' => $baseDir . '/src/Rules/Properties/UninitializedPropertyRule.php', 'PHPStan\\Rules\\Properties\\WritingToReadOnlyPropertiesRule' => $baseDir . '/src/Rules/Properties/WritingToReadOnlyPropertiesRule.php', 'PHPStan\\Rules\\Pure\\FunctionPurityCheck' => $baseDir . '/src/Rules/Pure/FunctionPurityCheck.php', 'PHPStan\\Rules\\Pure\\PureFunctionRule' => $baseDir . '/src/Rules/Pure/PureFunctionRule.php', 'PHPStan\\Rules\\Pure\\PureMethodRule' => $baseDir . '/src/Rules/Pure/PureMethodRule.php', 'PHPStan\\Rules\\Regexp\\RegularExpressionPatternRule' => $baseDir . '/src/Rules/Regexp/RegularExpressionPatternRule.php', 'PHPStan\\Rules\\Regexp\\RegularExpressionQuotingRule' => $baseDir . '/src/Rules/Regexp/RegularExpressionQuotingRule.php', 'PHPStan\\Rules\\Registry' => $baseDir . '/src/Rules/Registry.php', 'PHPStan\\Rules\\Rule' => $baseDir . '/src/Rules/Rule.php', 'PHPStan\\Rules\\RuleError' => $baseDir . '/src/Rules/RuleError.php', 'PHPStan\\Rules\\RuleErrorBuilder' => $baseDir . '/src/Rules/RuleErrorBuilder.php', 'PHPStan\\Rules\\RuleErrors\\RuleError1' => $baseDir . '/src/Rules/RuleErrors/RuleError1.php', 'PHPStan\\Rules\\RuleErrors\\RuleError101' => $baseDir . '/src/Rules/RuleErrors/RuleError101.php', 'PHPStan\\Rules\\RuleErrors\\RuleError103' => $baseDir . '/src/Rules/RuleErrors/RuleError103.php', 'PHPStan\\Rules\\RuleErrors\\RuleError105' => $baseDir . '/src/Rules/RuleErrors/RuleError105.php', 'PHPStan\\Rules\\RuleErrors\\RuleError107' => $baseDir . '/src/Rules/RuleErrors/RuleError107.php', 'PHPStan\\Rules\\RuleErrors\\RuleError109' => $baseDir . '/src/Rules/RuleErrors/RuleError109.php', 'PHPStan\\Rules\\RuleErrors\\RuleError11' => $baseDir . '/src/Rules/RuleErrors/RuleError11.php', 'PHPStan\\Rules\\RuleErrors\\RuleError111' => $baseDir . '/src/Rules/RuleErrors/RuleError111.php', 'PHPStan\\Rules\\RuleErrors\\RuleError113' => $baseDir . '/src/Rules/RuleErrors/RuleError113.php', 'PHPStan\\Rules\\RuleErrors\\RuleError115' => $baseDir . '/src/Rules/RuleErrors/RuleError115.php', 'PHPStan\\Rules\\RuleErrors\\RuleError117' => $baseDir . '/src/Rules/RuleErrors/RuleError117.php', 'PHPStan\\Rules\\RuleErrors\\RuleError119' => $baseDir . '/src/Rules/RuleErrors/RuleError119.php', 'PHPStan\\Rules\\RuleErrors\\RuleError121' => $baseDir . '/src/Rules/RuleErrors/RuleError121.php', 'PHPStan\\Rules\\RuleErrors\\RuleError123' => $baseDir . '/src/Rules/RuleErrors/RuleError123.php', 'PHPStan\\Rules\\RuleErrors\\RuleError125' => $baseDir . '/src/Rules/RuleErrors/RuleError125.php', 'PHPStan\\Rules\\RuleErrors\\RuleError127' => $baseDir . '/src/Rules/RuleErrors/RuleError127.php', 'PHPStan\\Rules\\RuleErrors\\RuleError13' => $baseDir . '/src/Rules/RuleErrors/RuleError13.php', 'PHPStan\\Rules\\RuleErrors\\RuleError15' => $baseDir . '/src/Rules/RuleErrors/RuleError15.php', 'PHPStan\\Rules\\RuleErrors\\RuleError17' => $baseDir . '/src/Rules/RuleErrors/RuleError17.php', 'PHPStan\\Rules\\RuleErrors\\RuleError19' => $baseDir . '/src/Rules/RuleErrors/RuleError19.php', 'PHPStan\\Rules\\RuleErrors\\RuleError21' => $baseDir . '/src/Rules/RuleErrors/RuleError21.php', 'PHPStan\\Rules\\RuleErrors\\RuleError23' => $baseDir . '/src/Rules/RuleErrors/RuleError23.php', 'PHPStan\\Rules\\RuleErrors\\RuleError25' => $baseDir . '/src/Rules/RuleErrors/RuleError25.php', 'PHPStan\\Rules\\RuleErrors\\RuleError27' => $baseDir . '/src/Rules/RuleErrors/RuleError27.php', 'PHPStan\\Rules\\RuleErrors\\RuleError29' => $baseDir . '/src/Rules/RuleErrors/RuleError29.php', 'PHPStan\\Rules\\RuleErrors\\RuleError3' => $baseDir . '/src/Rules/RuleErrors/RuleError3.php', 'PHPStan\\Rules\\RuleErrors\\RuleError31' => $baseDir . '/src/Rules/RuleErrors/RuleError31.php', 'PHPStan\\Rules\\RuleErrors\\RuleError33' => $baseDir . '/src/Rules/RuleErrors/RuleError33.php', 'PHPStan\\Rules\\RuleErrors\\RuleError35' => $baseDir . '/src/Rules/RuleErrors/RuleError35.php', 'PHPStan\\Rules\\RuleErrors\\RuleError37' => $baseDir . '/src/Rules/RuleErrors/RuleError37.php', 'PHPStan\\Rules\\RuleErrors\\RuleError39' => $baseDir . '/src/Rules/RuleErrors/RuleError39.php', 'PHPStan\\Rules\\RuleErrors\\RuleError41' => $baseDir . '/src/Rules/RuleErrors/RuleError41.php', 'PHPStan\\Rules\\RuleErrors\\RuleError43' => $baseDir . '/src/Rules/RuleErrors/RuleError43.php', 'PHPStan\\Rules\\RuleErrors\\RuleError45' => $baseDir . '/src/Rules/RuleErrors/RuleError45.php', 'PHPStan\\Rules\\RuleErrors\\RuleError47' => $baseDir . '/src/Rules/RuleErrors/RuleError47.php', 'PHPStan\\Rules\\RuleErrors\\RuleError49' => $baseDir . '/src/Rules/RuleErrors/RuleError49.php', 'PHPStan\\Rules\\RuleErrors\\RuleError5' => $baseDir . '/src/Rules/RuleErrors/RuleError5.php', 'PHPStan\\Rules\\RuleErrors\\RuleError51' => $baseDir . '/src/Rules/RuleErrors/RuleError51.php', 'PHPStan\\Rules\\RuleErrors\\RuleError53' => $baseDir . '/src/Rules/RuleErrors/RuleError53.php', 'PHPStan\\Rules\\RuleErrors\\RuleError55' => $baseDir . '/src/Rules/RuleErrors/RuleError55.php', 'PHPStan\\Rules\\RuleErrors\\RuleError57' => $baseDir . '/src/Rules/RuleErrors/RuleError57.php', 'PHPStan\\Rules\\RuleErrors\\RuleError59' => $baseDir . '/src/Rules/RuleErrors/RuleError59.php', 'PHPStan\\Rules\\RuleErrors\\RuleError61' => $baseDir . '/src/Rules/RuleErrors/RuleError61.php', 'PHPStan\\Rules\\RuleErrors\\RuleError63' => $baseDir . '/src/Rules/RuleErrors/RuleError63.php', 'PHPStan\\Rules\\RuleErrors\\RuleError65' => $baseDir . '/src/Rules/RuleErrors/RuleError65.php', 'PHPStan\\Rules\\RuleErrors\\RuleError67' => $baseDir . '/src/Rules/RuleErrors/RuleError67.php', 'PHPStan\\Rules\\RuleErrors\\RuleError69' => $baseDir . '/src/Rules/RuleErrors/RuleError69.php', 'PHPStan\\Rules\\RuleErrors\\RuleError7' => $baseDir . '/src/Rules/RuleErrors/RuleError7.php', 'PHPStan\\Rules\\RuleErrors\\RuleError71' => $baseDir . '/src/Rules/RuleErrors/RuleError71.php', 'PHPStan\\Rules\\RuleErrors\\RuleError73' => $baseDir . '/src/Rules/RuleErrors/RuleError73.php', 'PHPStan\\Rules\\RuleErrors\\RuleError75' => $baseDir . '/src/Rules/RuleErrors/RuleError75.php', 'PHPStan\\Rules\\RuleErrors\\RuleError77' => $baseDir . '/src/Rules/RuleErrors/RuleError77.php', 'PHPStan\\Rules\\RuleErrors\\RuleError79' => $baseDir . '/src/Rules/RuleErrors/RuleError79.php', 'PHPStan\\Rules\\RuleErrors\\RuleError81' => $baseDir . '/src/Rules/RuleErrors/RuleError81.php', 'PHPStan\\Rules\\RuleErrors\\RuleError83' => $baseDir . '/src/Rules/RuleErrors/RuleError83.php', 'PHPStan\\Rules\\RuleErrors\\RuleError85' => $baseDir . '/src/Rules/RuleErrors/RuleError85.php', 'PHPStan\\Rules\\RuleErrors\\RuleError87' => $baseDir . '/src/Rules/RuleErrors/RuleError87.php', 'PHPStan\\Rules\\RuleErrors\\RuleError89' => $baseDir . '/src/Rules/RuleErrors/RuleError89.php', 'PHPStan\\Rules\\RuleErrors\\RuleError9' => $baseDir . '/src/Rules/RuleErrors/RuleError9.php', 'PHPStan\\Rules\\RuleErrors\\RuleError91' => $baseDir . '/src/Rules/RuleErrors/RuleError91.php', 'PHPStan\\Rules\\RuleErrors\\RuleError93' => $baseDir . '/src/Rules/RuleErrors/RuleError93.php', 'PHPStan\\Rules\\RuleErrors\\RuleError95' => $baseDir . '/src/Rules/RuleErrors/RuleError95.php', 'PHPStan\\Rules\\RuleErrors\\RuleError97' => $baseDir . '/src/Rules/RuleErrors/RuleError97.php', 'PHPStan\\Rules\\RuleErrors\\RuleError99' => $baseDir . '/src/Rules/RuleErrors/RuleError99.php', 'PHPStan\\Rules\\RuleLevelHelper' => $baseDir . '/src/Rules/RuleLevelHelper.php', 'PHPStan\\Rules\\RuleLevelHelperAcceptsResult' => $baseDir . '/src/Rules/RuleLevelHelperAcceptsResult.php', 'PHPStan\\Rules\\TipRuleError' => $baseDir . '/src/Rules/TipRuleError.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideArrowFunctionReturnTypehintRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWideArrowFunctionReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideClosureReturnTypehintRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWideClosureReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideFunctionParameterOutTypeRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWideFunctionParameterOutTypeRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideFunctionReturnTypehintRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWideFunctionReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideMethodParameterOutTypeRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWideMethodParameterOutTypeRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideMethodReturnTypehintRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWideMethodReturnTypehintRule.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWideParameterOutTypeCheck' => $baseDir . '/src/Rules/TooWideTypehints/TooWideParameterOutTypeCheck.php', 'PHPStan\\Rules\\TooWideTypehints\\TooWidePropertyTypeRule' => $baseDir . '/src/Rules/TooWideTypehints/TooWidePropertyTypeRule.php', 'PHPStan\\Rules\\Traits\\ConflictingTraitConstantsRule' => $baseDir . '/src/Rules/Traits/ConflictingTraitConstantsRule.php', 'PHPStan\\Rules\\Traits\\ConstantsInTraitsRule' => $baseDir . '/src/Rules/Traits/ConstantsInTraitsRule.php', 'PHPStan\\Rules\\Traits\\NotAnalysedTraitRule' => $baseDir . '/src/Rules/Traits/NotAnalysedTraitRule.php', 'PHPStan\\Rules\\Traits\\TraitDeclarationCollector' => $baseDir . '/src/Rules/Traits/TraitDeclarationCollector.php', 'PHPStan\\Rules\\Traits\\TraitUseCollector' => $baseDir . '/src/Rules/Traits/TraitUseCollector.php', 'PHPStan\\Rules\\Types\\InvalidTypesInUnionRule' => $baseDir . '/src/Rules/Types/InvalidTypesInUnionRule.php', 'PHPStan\\Rules\\UnusedFunctionParametersCheck' => $baseDir . '/src/Rules/UnusedFunctionParametersCheck.php', 'PHPStan\\Rules\\Variables\\CompactVariablesRule' => $baseDir . '/src/Rules/Variables/CompactVariablesRule.php', 'PHPStan\\Rules\\Variables\\DefinedVariableRule' => $baseDir . '/src/Rules/Variables/DefinedVariableRule.php', 'PHPStan\\Rules\\Variables\\EmptyRule' => $baseDir . '/src/Rules/Variables/EmptyRule.php', 'PHPStan\\Rules\\Variables\\IssetRule' => $baseDir . '/src/Rules/Variables/IssetRule.php', 'PHPStan\\Rules\\Variables\\NullCoalesceRule' => $baseDir . '/src/Rules/Variables/NullCoalesceRule.php', 'PHPStan\\Rules\\Variables\\ParameterOutAssignedTypeRule' => $baseDir . '/src/Rules/Variables/ParameterOutAssignedTypeRule.php', 'PHPStan\\Rules\\Variables\\ParameterOutExecutionEndTypeRule' => $baseDir . '/src/Rules/Variables/ParameterOutExecutionEndTypeRule.php', 'PHPStan\\Rules\\Variables\\ThrowTypeRule' => $baseDir . '/src/Rules/Variables/ThrowTypeRule.php', 'PHPStan\\Rules\\Variables\\UnsetRule' => $baseDir . '/src/Rules/Variables/UnsetRule.php', 'PHPStan\\Rules\\Variables\\VariableCloningRule' => $baseDir . '/src/Rules/Variables/VariableCloningRule.php', 'PHPStan\\Rules\\Whitespace\\FileWhitespaceRule' => $baseDir . '/src/Rules/Whitespace/FileWhitespaceRule.php', 'PHPStan\\ShouldNotHappenException' => $baseDir . '/src/ShouldNotHappenException.php', 'PHPStan\\Testing\\ErrorFormatterTestCase' => $baseDir . '/src/Testing/ErrorFormatterTestCase.php', 'PHPStan\\Testing\\LevelsTestCase' => $baseDir . '/src/Testing/LevelsTestCase.php', 'PHPStan\\Testing\\PHPStanTestCase' => $baseDir . '/src/Testing/PHPStanTestCase.php', 'PHPStan\\Testing\\RuleTestCase' => $baseDir . '/src/Testing/RuleTestCase.php', 'PHPStan\\Testing\\TestCaseSourceLocatorFactory' => $baseDir . '/src/Testing/TestCaseSourceLocatorFactory.php', 'PHPStan\\Testing\\TypeInferenceTestCase' => $baseDir . '/src/Testing/TypeInferenceTestCase.php', 'PHPStan\\TrinaryLogic' => $baseDir . '/src/TrinaryLogic.php', 'PHPStan\\Type\\AcceptsResult' => $baseDir . '/src/Type/AcceptsResult.php', 'PHPStan\\Type\\Accessory\\AccessoryArrayListType' => $baseDir . '/src/Type/Accessory/AccessoryArrayListType.php', 'PHPStan\\Type\\Accessory\\AccessoryLiteralStringType' => $baseDir . '/src/Type/Accessory/AccessoryLiteralStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryLowercaseStringType' => $baseDir . '/src/Type/Accessory/AccessoryLowercaseStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryNonEmptyStringType' => $baseDir . '/src/Type/Accessory/AccessoryNonEmptyStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryNonFalsyStringType' => $baseDir . '/src/Type/Accessory/AccessoryNonFalsyStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryNumericStringType' => $baseDir . '/src/Type/Accessory/AccessoryNumericStringType.php', 'PHPStan\\Type\\Accessory\\AccessoryType' => $baseDir . '/src/Type/Accessory/AccessoryType.php', 'PHPStan\\Type\\Accessory\\AccessoryUppercaseStringType' => $baseDir . '/src/Type/Accessory/AccessoryUppercaseStringType.php', 'PHPStan\\Type\\Accessory\\HasMethodType' => $baseDir . '/src/Type/Accessory/HasMethodType.php', 'PHPStan\\Type\\Accessory\\HasOffsetType' => $baseDir . '/src/Type/Accessory/HasOffsetType.php', 'PHPStan\\Type\\Accessory\\HasOffsetValueType' => $baseDir . '/src/Type/Accessory/HasOffsetValueType.php', 'PHPStan\\Type\\Accessory\\HasPropertyType' => $baseDir . '/src/Type/Accessory/HasPropertyType.php', 'PHPStan\\Type\\Accessory\\NonEmptyArrayType' => $baseDir . '/src/Type/Accessory/NonEmptyArrayType.php', 'PHPStan\\Type\\Accessory\\OversizedArrayType' => $baseDir . '/src/Type/Accessory/OversizedArrayType.php', 'PHPStan\\Type\\ArrayType' => $baseDir . '/src/Type/ArrayType.php', 'PHPStan\\Type\\BenevolentUnionType' => $baseDir . '/src/Type/BenevolentUnionType.php', 'PHPStan\\Type\\BitwiseFlagHelper' => $baseDir . '/src/Type/BitwiseFlagHelper.php', 'PHPStan\\Type\\BooleanType' => $baseDir . '/src/Type/BooleanType.php', 'PHPStan\\Type\\CallableType' => $baseDir . '/src/Type/CallableType.php', 'PHPStan\\Type\\CallableTypeHelper' => $baseDir . '/src/Type/CallableTypeHelper.php', 'PHPStan\\Type\\CircularTypeAliasDefinitionException' => $baseDir . '/src/Type/CircularTypeAliasDefinitionException.php', 'PHPStan\\Type\\CircularTypeAliasErrorType' => $baseDir . '/src/Type/CircularTypeAliasErrorType.php', 'PHPStan\\Type\\ClassStringType' => $baseDir . '/src/Type/ClassStringType.php', 'PHPStan\\Type\\ClosureType' => $baseDir . '/src/Type/ClosureType.php', 'PHPStan\\Type\\ClosureTypeFactory' => $baseDir . '/src/Type/ClosureTypeFactory.php', 'PHPStan\\Type\\CompoundType' => $baseDir . '/src/Type/CompoundType.php', 'PHPStan\\Type\\ConditionalType' => $baseDir . '/src/Type/ConditionalType.php', 'PHPStan\\Type\\ConditionalTypeForParameter' => $baseDir . '/src/Type/ConditionalTypeForParameter.php', 'PHPStan\\Type\\ConstantScalarType' => $baseDir . '/src/Type/ConstantScalarType.php', 'PHPStan\\Type\\ConstantType' => $baseDir . '/src/Type/ConstantType.php', 'PHPStan\\Type\\ConstantTypeHelper' => $baseDir . '/src/Type/ConstantTypeHelper.php', 'PHPStan\\Type\\Constant\\ConstantArrayType' => $baseDir . '/src/Type/Constant/ConstantArrayType.php', 'PHPStan\\Type\\Constant\\ConstantArrayTypeAndMethod' => $baseDir . '/src/Type/Constant/ConstantArrayTypeAndMethod.php', 'PHPStan\\Type\\Constant\\ConstantArrayTypeBuilder' => $baseDir . '/src/Type/Constant/ConstantArrayTypeBuilder.php', 'PHPStan\\Type\\Constant\\ConstantBooleanType' => $baseDir . '/src/Type/Constant/ConstantBooleanType.php', 'PHPStan\\Type\\Constant\\ConstantFloatType' => $baseDir . '/src/Type/Constant/ConstantFloatType.php', 'PHPStan\\Type\\Constant\\ConstantIntegerType' => $baseDir . '/src/Type/Constant/ConstantIntegerType.php', 'PHPStan\\Type\\Constant\\ConstantScalarToBooleanTrait' => $baseDir . '/src/Type/Constant/ConstantScalarToBooleanTrait.php', 'PHPStan\\Type\\Constant\\ConstantStringType' => $baseDir . '/src/Type/Constant/ConstantStringType.php', 'PHPStan\\Type\\Constant\\OversizedArrayBuilder' => $baseDir . '/src/Type/Constant/OversizedArrayBuilder.php', 'PHPStan\\Type\\DirectTypeAliasResolverProvider' => $baseDir . '/src/Type/DirectTypeAliasResolverProvider.php', 'PHPStan\\Type\\DynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/DynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\DynamicFunctionThrowTypeExtension' => $baseDir . '/src/Type/DynamicFunctionThrowTypeExtension.php', 'PHPStan\\Type\\DynamicMethodReturnTypeExtension' => $baseDir . '/src/Type/DynamicMethodReturnTypeExtension.php', 'PHPStan\\Type\\DynamicMethodThrowTypeExtension' => $baseDir . '/src/Type/DynamicMethodThrowTypeExtension.php', 'PHPStan\\Type\\DynamicReturnTypeExtensionRegistry' => $baseDir . '/src/Type/DynamicReturnTypeExtensionRegistry.php', 'PHPStan\\Type\\DynamicStaticMethodReturnTypeExtension' => $baseDir . '/src/Type/DynamicStaticMethodReturnTypeExtension.php', 'PHPStan\\Type\\DynamicStaticMethodThrowTypeExtension' => $baseDir . '/src/Type/DynamicStaticMethodThrowTypeExtension.php', 'PHPStan\\Type\\Enum\\EnumCaseObjectType' => $baseDir . '/src/Type/Enum/EnumCaseObjectType.php', 'PHPStan\\Type\\ErrorType' => $baseDir . '/src/Type/ErrorType.php', 'PHPStan\\Type\\ExponentiateHelper' => $baseDir . '/src/Type/ExponentiateHelper.php', 'PHPStan\\Type\\ExpressionTypeResolverExtension' => $baseDir . '/src/Type/ExpressionTypeResolverExtension.php', 'PHPStan\\Type\\ExpressionTypeResolverExtensionRegistry' => $baseDir . '/src/Type/ExpressionTypeResolverExtensionRegistry.php', 'PHPStan\\Type\\FileTypeMapper' => $baseDir . '/src/Type/FileTypeMapper.php', 'PHPStan\\Type\\FloatType' => $baseDir . '/src/Type/FloatType.php', 'PHPStan\\Type\\FunctionParameterClosureTypeExtension' => $baseDir . '/src/Type/FunctionParameterClosureTypeExtension.php', 'PHPStan\\Type\\FunctionParameterOutTypeExtension' => $baseDir . '/src/Type/FunctionParameterOutTypeExtension.php', 'PHPStan\\Type\\FunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/FunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\GeneralizePrecision' => $baseDir . '/src/Type/GeneralizePrecision.php', 'PHPStan\\Type\\GenericTypeVariableResolver' => $baseDir . '/src/Type/GenericTypeVariableResolver.php', 'PHPStan\\Type\\Generic\\GenericClassStringType' => $baseDir . '/src/Type/Generic/GenericClassStringType.php', 'PHPStan\\Type\\Generic\\GenericObjectType' => $baseDir . '/src/Type/Generic/GenericObjectType.php', 'PHPStan\\Type\\Generic\\GenericStaticType' => $baseDir . '/src/Type/Generic/GenericStaticType.php', 'PHPStan\\Type\\Generic\\TemplateArrayType' => $baseDir . '/src/Type/Generic/TemplateArrayType.php', 'PHPStan\\Type\\Generic\\TemplateBenevolentUnionType' => $baseDir . '/src/Type/Generic/TemplateBenevolentUnionType.php', 'PHPStan\\Type\\Generic\\TemplateBooleanType' => $baseDir . '/src/Type/Generic/TemplateBooleanType.php', 'PHPStan\\Type\\Generic\\TemplateConstantArrayType' => $baseDir . '/src/Type/Generic/TemplateConstantArrayType.php', 'PHPStan\\Type\\Generic\\TemplateConstantIntegerType' => $baseDir . '/src/Type/Generic/TemplateConstantIntegerType.php', 'PHPStan\\Type\\Generic\\TemplateConstantStringType' => $baseDir . '/src/Type/Generic/TemplateConstantStringType.php', 'PHPStan\\Type\\Generic\\TemplateFloatType' => $baseDir . '/src/Type/Generic/TemplateFloatType.php', 'PHPStan\\Type\\Generic\\TemplateGenericObjectType' => $baseDir . '/src/Type/Generic/TemplateGenericObjectType.php', 'PHPStan\\Type\\Generic\\TemplateIntegerType' => $baseDir . '/src/Type/Generic/TemplateIntegerType.php', 'PHPStan\\Type\\Generic\\TemplateIntersectionType' => $baseDir . '/src/Type/Generic/TemplateIntersectionType.php', 'PHPStan\\Type\\Generic\\TemplateIterableType' => $baseDir . '/src/Type/Generic/TemplateIterableType.php', 'PHPStan\\Type\\Generic\\TemplateKeyOfType' => $baseDir . '/src/Type/Generic/TemplateKeyOfType.php', 'PHPStan\\Type\\Generic\\TemplateMixedType' => $baseDir . '/src/Type/Generic/TemplateMixedType.php', 'PHPStan\\Type\\Generic\\TemplateObjectShapeType' => $baseDir . '/src/Type/Generic/TemplateObjectShapeType.php', 'PHPStan\\Type\\Generic\\TemplateObjectType' => $baseDir . '/src/Type/Generic/TemplateObjectType.php', 'PHPStan\\Type\\Generic\\TemplateObjectWithoutClassType' => $baseDir . '/src/Type/Generic/TemplateObjectWithoutClassType.php', 'PHPStan\\Type\\Generic\\TemplateStrictMixedType' => $baseDir . '/src/Type/Generic/TemplateStrictMixedType.php', 'PHPStan\\Type\\Generic\\TemplateStringType' => $baseDir . '/src/Type/Generic/TemplateStringType.php', 'PHPStan\\Type\\Generic\\TemplateType' => $baseDir . '/src/Type/Generic/TemplateType.php', 'PHPStan\\Type\\Generic\\TemplateTypeArgumentStrategy' => $baseDir . '/src/Type/Generic/TemplateTypeArgumentStrategy.php', 'PHPStan\\Type\\Generic\\TemplateTypeFactory' => $baseDir . '/src/Type/Generic/TemplateTypeFactory.php', 'PHPStan\\Type\\Generic\\TemplateTypeHelper' => $baseDir . '/src/Type/Generic/TemplateTypeHelper.php', 'PHPStan\\Type\\Generic\\TemplateTypeMap' => $baseDir . '/src/Type/Generic/TemplateTypeMap.php', 'PHPStan\\Type\\Generic\\TemplateTypeParameterStrategy' => $baseDir . '/src/Type/Generic/TemplateTypeParameterStrategy.php', 'PHPStan\\Type\\Generic\\TemplateTypeReference' => $baseDir . '/src/Type/Generic/TemplateTypeReference.php', 'PHPStan\\Type\\Generic\\TemplateTypeScope' => $baseDir . '/src/Type/Generic/TemplateTypeScope.php', 'PHPStan\\Type\\Generic\\TemplateTypeStrategy' => $baseDir . '/src/Type/Generic/TemplateTypeStrategy.php', 'PHPStan\\Type\\Generic\\TemplateTypeTrait' => $baseDir . '/src/Type/Generic/TemplateTypeTrait.php', 'PHPStan\\Type\\Generic\\TemplateTypeVariance' => $baseDir . '/src/Type/Generic/TemplateTypeVariance.php', 'PHPStan\\Type\\Generic\\TemplateTypeVarianceMap' => $baseDir . '/src/Type/Generic/TemplateTypeVarianceMap.php', 'PHPStan\\Type\\Generic\\TemplateUnionType' => $baseDir . '/src/Type/Generic/TemplateUnionType.php', 'PHPStan\\Type\\Generic\\TypeProjectionHelper' => $baseDir . '/src/Type/Generic/TypeProjectionHelper.php', 'PHPStan\\Type\\Helper\\GetTemplateTypeType' => $baseDir . '/src/Type/Helper/GetTemplateTypeType.php', 'PHPStan\\Type\\IntegerRangeType' => $baseDir . '/src/Type/IntegerRangeType.php', 'PHPStan\\Type\\IntegerType' => $baseDir . '/src/Type/IntegerType.php', 'PHPStan\\Type\\IntersectionType' => $baseDir . '/src/Type/IntersectionType.php', 'PHPStan\\Type\\IsSuperTypeOfResult' => $baseDir . '/src/Type/IsSuperTypeOfResult.php', 'PHPStan\\Type\\IterableType' => $baseDir . '/src/Type/IterableType.php', 'PHPStan\\Type\\JustNullableTypeTrait' => $baseDir . '/src/Type/JustNullableTypeTrait.php', 'PHPStan\\Type\\KeyOfType' => $baseDir . '/src/Type/KeyOfType.php', 'PHPStan\\Type\\LateResolvableType' => $baseDir . '/src/Type/LateResolvableType.php', 'PHPStan\\Type\\LazyTypeAliasResolverProvider' => $baseDir . '/src/Type/LazyTypeAliasResolverProvider.php', 'PHPStan\\Type\\LooseComparisonHelper' => $baseDir . '/src/Type/LooseComparisonHelper.php', 'PHPStan\\Type\\MethodParameterClosureTypeExtension' => $baseDir . '/src/Type/MethodParameterClosureTypeExtension.php', 'PHPStan\\Type\\MethodParameterOutTypeExtension' => $baseDir . '/src/Type/MethodParameterOutTypeExtension.php', 'PHPStan\\Type\\MethodTypeSpecifyingExtension' => $baseDir . '/src/Type/MethodTypeSpecifyingExtension.php', 'PHPStan\\Type\\MixedType' => $baseDir . '/src/Type/MixedType.php', 'PHPStan\\Type\\NeverType' => $baseDir . '/src/Type/NeverType.php', 'PHPStan\\Type\\NewObjectType' => $baseDir . '/src/Type/NewObjectType.php', 'PHPStan\\Type\\NonAcceptingNeverType' => $baseDir . '/src/Type/NonAcceptingNeverType.php', 'PHPStan\\Type\\NonexistentParentClassType' => $baseDir . '/src/Type/NonexistentParentClassType.php', 'PHPStan\\Type\\NullType' => $baseDir . '/src/Type/NullType.php', 'PHPStan\\Type\\ObjectShapePropertyReflection' => $baseDir . '/src/Type/ObjectShapePropertyReflection.php', 'PHPStan\\Type\\ObjectShapeType' => $baseDir . '/src/Type/ObjectShapeType.php', 'PHPStan\\Type\\ObjectType' => $baseDir . '/src/Type/ObjectType.php', 'PHPStan\\Type\\ObjectWithoutClassType' => $baseDir . '/src/Type/ObjectWithoutClassType.php', 'PHPStan\\Type\\OffsetAccessType' => $baseDir . '/src/Type/OffsetAccessType.php', 'PHPStan\\Type\\OperatorTypeSpecifyingExtension' => $baseDir . '/src/Type/OperatorTypeSpecifyingExtension.php', 'PHPStan\\Type\\OperatorTypeSpecifyingExtensionRegistry' => $baseDir . '/src/Type/OperatorTypeSpecifyingExtensionRegistry.php', 'PHPStan\\Type\\ParserNodeTypeToPHPStanType' => $baseDir . '/src/Type/ParserNodeTypeToPHPStanType.php', 'PHPStan\\Type\\Php\\AbsFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/AbsFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArgumentBasedFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayChangeKeyCaseFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayChunkFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayChunkFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayColumnFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayColumnFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayCombineFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayCurrentDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayCurrentDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFillFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFillFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFillKeysFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFilterFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFilterFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFilterFunctionReturnTypeHelper' => $baseDir . '/src/Type/Php/ArrayFilterFunctionReturnTypeHelper.php', 'PHPStan\\Type\\Php\\ArrayFindFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFindFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFindKeyFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFindKeyFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayFlipFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayFlipFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayIntersectKeyFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayIntersectKeyFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeyDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyExistsFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyFirstDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeyFirstDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeyLastDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeyLastDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayKeysFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayKeysFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayMapFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayMapFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayMergeFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayMergeFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayNextDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayNextDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayPointerFunctionsDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayPointerFunctionsDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayPopFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayPopFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayRandFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayRandFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayReduceFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayReduceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayReplaceFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayReplaceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayReverseFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayReverseFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySearchFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArraySearchFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySearchFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/ArraySearchFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ArrayShiftFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayShiftFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySliceFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArraySliceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySpliceFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ArraySpliceFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArraySumFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArraySumFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ArrayValuesFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ArrayValuesFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\AssertFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/AssertFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\AssertThrowTypeExtension' => $baseDir . '/src/Type/Php/AssertThrowTypeExtension.php', 'PHPStan\\Type\\Php\\BackedEnumFromMethodDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/BackedEnumFromMethodDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\Base64DecodeDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/Base64DecodeDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\BcMathStringOrNullReturnTypeExtension' => $baseDir . '/src/Type/Php/BcMathStringOrNullReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClassExistsFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/ClassExistsFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ClassImplementsFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ClassImplementsFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClosureBindDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ClosureBindDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClosureBindToDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ClosureBindToDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ClosureFromCallableDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ClosureFromCallableDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\CompactFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/CompactFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ConstantFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ConstantFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ConstantHelper' => $baseDir . '/src/Type/Php/ConstantHelper.php', 'PHPStan\\Type\\Php\\CountFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/CountFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\CountFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/CountFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\CtypeDigitFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/CtypeDigitFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\CurlGetinfoFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/CurlGetinfoFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFormatFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/DateFormatFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFormatMethodReturnTypeExtension' => $baseDir . '/src/Type/Php/DateFormatMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/DateFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateFunctionReturnTypeHelper' => $baseDir . '/src/Type/Php/DateFunctionReturnTypeHelper.php', 'PHPStan\\Type\\Php\\DateIntervalConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/DateIntervalConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateIntervalDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/DateIntervalDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DatePeriodConstructorReturnTypeExtension' => $baseDir . '/src/Type/Php/DatePeriodConstructorReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/DateTimeConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeCreateDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/DateTimeCreateDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/DateTimeDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeModifyMethodThrowTypeExtension' => $baseDir . '/src/Type/Php/DateTimeModifyMethodThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeModifyReturnTypeExtension' => $baseDir . '/src/Type/Php/DateTimeModifyReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeSubMethodThrowTypeExtension' => $baseDir . '/src/Type/Php/DateTimeSubMethodThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DateTimeZoneConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/DateTimeZoneConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DefineConstantTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/DefineConstantTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\DefinedConstantTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/DefinedConstantTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\DioStatDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/DioStatDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\DsMapDynamicMethodThrowTypeExtension' => $baseDir . '/src/Type/Php/DsMapDynamicMethodThrowTypeExtension.php', 'PHPStan\\Type\\Php\\DsMapDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/DsMapDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ExplodeFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ExplodeFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FilterFunctionReturnTypeHelper' => $baseDir . '/src/Type/Php/FilterFunctionReturnTypeHelper.php', 'PHPStan\\Type\\Php\\FilterInputDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/FilterInputDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FilterVarArrayDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/FilterVarArrayDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FilterVarDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/FilterVarDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\FunctionExistsFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/FunctionExistsFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\GetCalledClassDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/GetCalledClassDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetClassDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/GetClassDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetDebugTypeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GetDebugTypeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetDefinedVarsFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GetDefinedVarsFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GetParentClassDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GetParentClassDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GettimeofdayDynamicFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GettimeofdayDynamicFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\GettypeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/GettypeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\HashFunctionsReturnTypeExtension' => $baseDir . '/src/Type/Php/HashFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\HighlightStringDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/HighlightStringDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\HrtimeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/HrtimeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ImplodeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/ImplodeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\InArrayFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/InArrayFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IniGetReturnTypeExtension' => $baseDir . '/src/Type/Php/IniGetReturnTypeExtension.php', 'PHPStan\\Type\\Php\\IntdivThrowTypeExtension' => $baseDir . '/src/Type/Php/IntdivThrowTypeExtension.php', 'PHPStan\\Type\\Php\\IsAFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsAFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsAFunctionTypeSpecifyingHelper' => $baseDir . '/src/Type/Php/IsAFunctionTypeSpecifyingHelper.php', 'PHPStan\\Type\\Php\\IsArrayFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsArrayFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsCallableFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsCallableFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsIterableFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsIterableFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IsSubclassOfFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\IteratorToArrayFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\JsonThrowOnErrorDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\JsonThrowTypeExtension' => $baseDir . '/src/Type/Php/JsonThrowTypeExtension.php', 'PHPStan\\Type\\Php\\LtrimFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/LtrimFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbConvertEncodingFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/MbConvertEncodingFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbFunctionsReturnTypeExtension' => $baseDir . '/src/Type/Php/MbFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbFunctionsReturnTypeExtensionTrait' => $baseDir . '/src/Type/Php/MbFunctionsReturnTypeExtensionTrait.php', 'PHPStan\\Type\\Php\\MbStrlenFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/MbStrlenFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MbSubstituteCharacterDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/MbSubstituteCharacterDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MethodExistsTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/MethodExistsTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\MicrotimeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/MicrotimeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\MinMaxFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/MinMaxFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\NonEmptyStringFunctionsReturnTypeExtension' => $baseDir . '/src/Type/Php/NonEmptyStringFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\NumberFormatFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\OpenSslEncryptParameterOutTypeExtension' => $baseDir . '/src/Type/Php/OpenSslEncryptParameterOutTypeExtension.php', 'PHPStan\\Type\\Php\\ParseStrParameterOutTypeExtension' => $baseDir . '/src/Type/Php/ParseStrParameterOutTypeExtension.php', 'PHPStan\\Type\\Php\\ParseUrlFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ParseUrlFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PathinfoFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PowFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/PowFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PregFilterFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/PregFilterFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PregMatchParameterOutTypeExtension' => $baseDir . '/src/Type/Php/PregMatchParameterOutTypeExtension.php', 'PHPStan\\Type\\Php\\PregMatchTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/PregMatchTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\PregReplaceCallbackClosureTypeExtension' => $baseDir . '/src/Type/Php/PregReplaceCallbackClosureTypeExtension.php', 'PHPStan\\Type\\Php\\PregSplitDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/PregSplitDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\PropertyExistsTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/PropertyExistsTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\RandomIntFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/RandomIntFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\RangeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/RangeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionClassConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/ReflectionClassConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionClassIsSubclassOfTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/ReflectionClassIsSubclassOfTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\ReflectionFunctionConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/ReflectionFunctionConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionGetAttributesMethodReturnTypeExtension' => $baseDir . '/src/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionMethodConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\ReflectionPropertyConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/ReflectionPropertyConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\RegexArrayShapeMatcher' => $baseDir . '/src/Type/Php/RegexArrayShapeMatcher.php', 'PHPStan\\Type\\Php\\ReplaceFunctionsDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\RoundFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/RoundFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SetTypeFunctionTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/SetTypeFunctionTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementAsXMLMethodReturnTypeExtension' => $baseDir . '/src/Type/Php/SimpleXMLElementAsXMLMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementClassPropertyReflectionExtension' => $baseDir . '/src/Type/Php/SimpleXMLElementClassPropertyReflectionExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementConstructorThrowTypeExtension' => $baseDir . '/src/Type/Php/SimpleXMLElementConstructorThrowTypeExtension.php', 'PHPStan\\Type\\Php\\SimpleXMLElementXpathMethodReturnTypeExtension' => $baseDir . '/src/Type/Php/SimpleXMLElementXpathMethodReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SprintfFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/SprintfFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SscanfFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/SscanfFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StatDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/StatDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrCaseFunctionsReturnTypeExtension' => $baseDir . '/src/Type/Php/StrCaseFunctionsReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrContainingTypeSpecifyingExtension' => $baseDir . '/src/Type/Php/StrContainingTypeSpecifyingExtension.php', 'PHPStan\\Type\\Php\\StrIncrementDecrementFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrIncrementDecrementFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrPadFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrPadFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrRepeatFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrRepeatFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrSplitFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrSplitFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrTokFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrTokFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrWordCountFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/StrWordCountFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrlenFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrlenFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrrevFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrrevFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrtotimeFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrtotimeFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\StrvalFamilyFunctionReturnTypeExtension' => $baseDir . '/src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.php', 'PHPStan\\Type\\Php\\SubstrDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/SubstrDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\ThrowableReturnTypeExtension' => $baseDir . '/src/Type/Php/ThrowableReturnTypeExtension.php', 'PHPStan\\Type\\Php\\TriggerErrorDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/TriggerErrorDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\TrimFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/TrimFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\TypeSpecifyingFunctionsDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/TypeSpecifyingFunctionsDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\VersionCompareFunctionDynamicReturnTypeExtension' => $baseDir . '/src/Type/Php/VersionCompareFunctionDynamicReturnTypeExtension.php', 'PHPStan\\Type\\Php\\XMLReaderOpenReturnTypeExtension' => $baseDir . '/src/Type/Php/XMLReaderOpenReturnTypeExtension.php', 'PHPStan\\Type\\RecursionGuard' => $baseDir . '/src/Type/RecursionGuard.php', 'PHPStan\\Type\\Regex\\RegexAlternation' => $baseDir . '/src/Type/Regex/RegexAlternation.php', 'PHPStan\\Type\\Regex\\RegexAstWalkResult' => $baseDir . '/src/Type/Regex/RegexAstWalkResult.php', 'PHPStan\\Type\\Regex\\RegexCapturingGroup' => $baseDir . '/src/Type/Regex/RegexCapturingGroup.php', 'PHPStan\\Type\\Regex\\RegexExpressionHelper' => $baseDir . '/src/Type/Regex/RegexExpressionHelper.php', 'PHPStan\\Type\\Regex\\RegexGroupParser' => $baseDir . '/src/Type/Regex/RegexGroupParser.php', 'PHPStan\\Type\\Regex\\RegexGroupWalkResult' => $baseDir . '/src/Type/Regex/RegexGroupWalkResult.php', 'PHPStan\\Type\\Regex\\RegexNonCapturingGroup' => $baseDir . '/src/Type/Regex/RegexNonCapturingGroup.php', 'PHPStan\\Type\\ResourceType' => $baseDir . '/src/Type/ResourceType.php', 'PHPStan\\Type\\SimultaneousTypeTraverser' => $baseDir . '/src/Type/SimultaneousTypeTraverser.php', 'PHPStan\\Type\\StaticMethodParameterClosureTypeExtension' => $baseDir . '/src/Type/StaticMethodParameterClosureTypeExtension.php', 'PHPStan\\Type\\StaticMethodParameterOutTypeExtension' => $baseDir . '/src/Type/StaticMethodParameterOutTypeExtension.php', 'PHPStan\\Type\\StaticMethodTypeSpecifyingExtension' => $baseDir . '/src/Type/StaticMethodTypeSpecifyingExtension.php', 'PHPStan\\Type\\StaticType' => $baseDir . '/src/Type/StaticType.php', 'PHPStan\\Type\\StaticTypeFactory' => $baseDir . '/src/Type/StaticTypeFactory.php', 'PHPStan\\Type\\StrictMixedType' => $baseDir . '/src/Type/StrictMixedType.php', 'PHPStan\\Type\\StringAlwaysAcceptingObjectWithToStringType' => $baseDir . '/src/Type/StringAlwaysAcceptingObjectWithToStringType.php', 'PHPStan\\Type\\StringType' => $baseDir . '/src/Type/StringType.php', 'PHPStan\\Type\\SubtractableType' => $baseDir . '/src/Type/SubtractableType.php', 'PHPStan\\Type\\ThisType' => $baseDir . '/src/Type/ThisType.php', 'PHPStan\\Type\\Traits\\ConstantNumericComparisonTypeTrait' => $baseDir . '/src/Type/Traits/ConstantNumericComparisonTypeTrait.php', 'PHPStan\\Type\\Traits\\ConstantScalarTypeTrait' => $baseDir . '/src/Type/Traits/ConstantScalarTypeTrait.php', 'PHPStan\\Type\\Traits\\FalseyBooleanTypeTrait' => $baseDir . '/src/Type/Traits/FalseyBooleanTypeTrait.php', 'PHPStan\\Type\\Traits\\LateResolvableTypeTrait' => $baseDir . '/src/Type/Traits/LateResolvableTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeArrayTypeTrait' => $baseDir . '/src/Type/Traits/MaybeArrayTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeCallableTypeTrait' => $baseDir . '/src/Type/Traits/MaybeCallableTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeIterableTypeTrait' => $baseDir . '/src/Type/Traits/MaybeIterableTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeObjectTypeTrait' => $baseDir . '/src/Type/Traits/MaybeObjectTypeTrait.php', 'PHPStan\\Type\\Traits\\MaybeOffsetAccessibleTypeTrait' => $baseDir . '/src/Type/Traits/MaybeOffsetAccessibleTypeTrait.php', 'PHPStan\\Type\\Traits\\NonArrayTypeTrait' => $baseDir . '/src/Type/Traits/NonArrayTypeTrait.php', 'PHPStan\\Type\\Traits\\NonCallableTypeTrait' => $baseDir . '/src/Type/Traits/NonCallableTypeTrait.php', 'PHPStan\\Type\\Traits\\NonGeneralizableTypeTrait' => $baseDir . '/src/Type/Traits/NonGeneralizableTypeTrait.php', 'PHPStan\\Type\\Traits\\NonGenericTypeTrait' => $baseDir . '/src/Type/Traits/NonGenericTypeTrait.php', 'PHPStan\\Type\\Traits\\NonIterableTypeTrait' => $baseDir . '/src/Type/Traits/NonIterableTypeTrait.php', 'PHPStan\\Type\\Traits\\NonObjectTypeTrait' => $baseDir . '/src/Type/Traits/NonObjectTypeTrait.php', 'PHPStan\\Type\\Traits\\NonOffsetAccessibleTypeTrait' => $baseDir . '/src/Type/Traits/NonOffsetAccessibleTypeTrait.php', 'PHPStan\\Type\\Traits\\NonRemoveableTypeTrait' => $baseDir . '/src/Type/Traits/NonRemoveableTypeTrait.php', 'PHPStan\\Type\\Traits\\ObjectTypeTrait' => $baseDir . '/src/Type/Traits/ObjectTypeTrait.php', 'PHPStan\\Type\\Traits\\TruthyBooleanTypeTrait' => $baseDir . '/src/Type/Traits/TruthyBooleanTypeTrait.php', 'PHPStan\\Type\\Traits\\UndecidedBooleanTypeTrait' => $baseDir . '/src/Type/Traits/UndecidedBooleanTypeTrait.php', 'PHPStan\\Type\\Traits\\UndecidedComparisonCompoundTypeTrait' => $baseDir . '/src/Type/Traits/UndecidedComparisonCompoundTypeTrait.php', 'PHPStan\\Type\\Traits\\UndecidedComparisonTypeTrait' => $baseDir . '/src/Type/Traits/UndecidedComparisonTypeTrait.php', 'PHPStan\\Type\\Type' => $baseDir . '/src/Type/Type.php', 'PHPStan\\Type\\TypeAlias' => $baseDir . '/src/Type/TypeAlias.php', 'PHPStan\\Type\\TypeAliasResolver' => $baseDir . '/src/Type/TypeAliasResolver.php', 'PHPStan\\Type\\TypeAliasResolverProvider' => $baseDir . '/src/Type/TypeAliasResolverProvider.php', 'PHPStan\\Type\\TypeCombinator' => $baseDir . '/src/Type/TypeCombinator.php', 'PHPStan\\Type\\TypeResult' => $baseDir . '/src/Type/TypeResult.php', 'PHPStan\\Type\\TypeTraverser' => $baseDir . '/src/Type/TypeTraverser.php', 'PHPStan\\Type\\TypeUtils' => $baseDir . '/src/Type/TypeUtils.php', 'PHPStan\\Type\\TypeWithClassName' => $baseDir . '/src/Type/TypeWithClassName.php', 'PHPStan\\Type\\TypehintHelper' => $baseDir . '/src/Type/TypehintHelper.php', 'PHPStan\\Type\\UnionType' => $baseDir . '/src/Type/UnionType.php', 'PHPStan\\Type\\UnionTypeHelper' => $baseDir . '/src/Type/UnionTypeHelper.php', 'PHPStan\\Type\\UsefulTypeAliasResolver' => $baseDir . '/src/Type/UsefulTypeAliasResolver.php', 'PHPStan\\Type\\ValueOfType' => $baseDir . '/src/Type/ValueOfType.php', 'PHPStan\\Type\\VerbosityLevel' => $baseDir . '/src/Type/VerbosityLevel.php', 'PHPStan\\Type\\VoidType' => $baseDir . '/src/Type/VoidType.php', 'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', 'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', 'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', 'PhpParser\\Builder\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', 'PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', 'PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', 'PhpParser\\Builder\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', 'PhpParser\\Builder\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', 'PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', 'PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', 'PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', 'PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', 'PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', 'PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', 'PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', 'PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', 'PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', 'PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', 'PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', 'PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php', 'PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', 'PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', 'PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', 'PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php', 'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', 'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', 'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', 'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', 'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', 'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', 'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', 'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', 'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', 'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', 'PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', 'PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', 'PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', 'PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', 'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', 'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', 'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', 'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', 'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', 'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', 'PhpParser\\Node\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', 'PhpParser\\Node\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', 'PhpParser\\Node\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', 'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', 'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', 'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', 'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', 'PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', 'PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', 'PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', 'PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', 'PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', 'PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', 'PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', 'PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', 'PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', 'PhpParser\\Node\\Expr\\CallLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', 'PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', 'PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', 'PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', 'PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', 'PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', 'PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', 'PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', 'PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', 'PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', 'PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', 'PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', 'PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', 'PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', 'PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', 'PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', 'PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', 'PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', 'PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', 'PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', 'PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', 'PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', 'PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', 'PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', 'PhpParser\\Node\\Expr\\Match_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', 'PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', 'PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', 'PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', 'PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', 'PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', 'PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', 'PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', 'PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', 'PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', 'PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', 'PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', 'PhpParser\\Node\\Expr\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', 'PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', 'PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', 'PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', 'PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', 'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', 'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', 'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', 'PhpParser\\Node\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', 'PhpParser\\Node\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', 'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', 'PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', 'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', 'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', 'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', 'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', 'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', 'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', 'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', 'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', 'PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', 'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', 'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', 'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', 'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', 'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', 'PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', 'PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', 'PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', 'PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', 'PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', 'PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', 'PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', 'PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', 'PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', 'PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', 'PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', 'PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', 'PhpParser\\Node\\Stmt\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', 'PhpParser\\Node\\Stmt\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', 'PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', 'PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', 'PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', 'PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', 'PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', 'PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', 'PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', 'PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', 'PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', 'PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', 'PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', 'PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', 'PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', 'PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', 'PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', 'PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', 'PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', 'PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', 'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', 'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', 'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', 'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', 'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', 'PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', 'PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', 'PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', 'PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', 'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', 'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', 'PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', 'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', 'PhpParser\\Node\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', 'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', 'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', 'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', 'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', 'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', 'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', 'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.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', 'Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php', 'Symfony\\Polyfill\\Php74\\Php74' => $vendorDir . '/symfony/polyfill-php74/Php74.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', 'Symfony\\Polyfill\\Php81\\Php81' => $vendorDir . '/symfony/polyfill-php81/Php81.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\Decoder' => $vendorDir . '/clue/ndjson-react/src/Decoder.php', '_PHPStan_8c66d8255\\Clue\\React\\NDJson\\Encoder' => $vendorDir . '/clue/ndjson-react/src/Encoder.php', '_PHPStan_8c66d8255\\Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', '_PHPStan_8c66d8255\\Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', '_PHPStan_8c66d8255\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', '_PHPStan_8c66d8255\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', '_PHPStan_8c66d8255\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', '_PHPStan_8c66d8255\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', '_PHPStan_8c66d8255\\Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php', '_PHPStan_8c66d8255\\Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php', '_PHPStan_8c66d8255\\Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', '_PHPStan_8c66d8255\\Fidry\\CpuCoreCounter\\ParallelisationResult' => $vendorDir . '/fidry/cpu-core-counter/src/ParallelisationResult.php', '_PHPStan_8c66d8255\\Fig\\Http\\Message\\RequestMethodInterface' => $vendorDir . '/fig/http-message-util/src/RequestMethodInterface.php', '_PHPStan_8c66d8255\\Fig\\Http\\Message\\StatusCodeInterface' => $vendorDir . '/fig/http-message-util/src/StatusCodeInterface.php', '_PHPStan_8c66d8255\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Bootstrap\\Configurator' => $vendorDir . '/nette/bootstrap/src/Bootstrap/Configurator.php', '_PHPStan_8c66d8255\\Nette\\Bootstrap\\Extensions\\ConstantsExtension' => $vendorDir . '/nette/bootstrap/src/Bootstrap/Extensions/ConstantsExtension.php', '_PHPStan_8c66d8255\\Nette\\Bootstrap\\Extensions\\PhpExtension' => $vendorDir . '/nette/bootstrap/src/Bootstrap/Extensions/PhpExtension.php', '_PHPStan_8c66d8255\\Nette\\Bridges\\DITracy\\ContainerPanel' => $vendorDir . '/nette/di/src/Bridges/DITracy/ContainerPanel.php', '_PHPStan_8c66d8255\\Nette\\Configurator' => $vendorDir . '/nette/bootstrap/src/Configurator.php', '_PHPStan_8c66d8255\\Nette\\DI\\Attributes\\Inject' => $vendorDir . '/nette/di/src/DI/Attributes/Inject.php', '_PHPStan_8c66d8255\\Nette\\DI\\Autowiring' => $vendorDir . '/nette/di/src/DI/Autowiring.php', '_PHPStan_8c66d8255\\Nette\\DI\\Compiler' => $vendorDir . '/nette/di/src/DI/Compiler.php', '_PHPStan_8c66d8255\\Nette\\DI\\CompilerExtension' => $vendorDir . '/nette/di/src/DI/CompilerExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Adapter' => $vendorDir . '/nette/di/src/DI/Config/Adapter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Adapters\\NeonAdapter' => $vendorDir . '/nette/di/src/DI/Config/Adapters/NeonAdapter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Adapters\\PhpAdapter' => $vendorDir . '/nette/di/src/DI/Config/Adapters/PhpAdapter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Helpers' => $vendorDir . '/nette/di/src/DI/Config/Helpers.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\IAdapter' => $vendorDir . '/nette/di/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\DI\\Config\\Loader' => $vendorDir . '/nette/di/src/DI/Config/Loader.php', '_PHPStan_8c66d8255\\Nette\\DI\\Container' => $vendorDir . '/nette/di/src/DI/Container.php', '_PHPStan_8c66d8255\\Nette\\DI\\ContainerBuilder' => $vendorDir . '/nette/di/src/DI/ContainerBuilder.php', '_PHPStan_8c66d8255\\Nette\\DI\\ContainerLoader' => $vendorDir . '/nette/di/src/DI/ContainerLoader.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\AccessorDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/AccessorDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\Definition' => $vendorDir . '/nette/di/src/DI/Definitions/Definition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\FactoryDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/FactoryDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\ImportedDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/ImportedDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\LocatorDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/LocatorDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\Reference' => $vendorDir . '/nette/di/src/DI/Definitions/Reference.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\ServiceDefinition' => $vendorDir . '/nette/di/src/DI/Definitions/ServiceDefinition.php', '_PHPStan_8c66d8255\\Nette\\DI\\Definitions\\Statement' => $vendorDir . '/nette/di/src/DI/Definitions/Statement.php', '_PHPStan_8c66d8255\\Nette\\DI\\DependencyChecker' => $vendorDir . '/nette/di/src/DI/DependencyChecker.php', '_PHPStan_8c66d8255\\Nette\\DI\\DynamicParameter' => $vendorDir . '/nette/di/src/DI/DynamicParameter.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ConstantsExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ConstantsExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\DIExtension' => $vendorDir . '/nette/di/src/DI/Extensions/DIExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\DecoratorExtension' => $vendorDir . '/nette/di/src/DI/Extensions/DecoratorExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\DefinitionSchema' => $vendorDir . '/nette/di/src/DI/Extensions/DefinitionSchema.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ExtensionsExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ExtensionsExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\InjectExtension' => $vendorDir . '/nette/di/src/DI/Extensions/InjectExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ParametersExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ParametersExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\PhpExtension' => $vendorDir . '/nette/di/src/DI/Extensions/PhpExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\SearchExtension' => $vendorDir . '/nette/di/src/DI/Extensions/SearchExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Extensions\\ServicesExtension' => $vendorDir . '/nette/di/src/DI/Extensions/ServicesExtension.php', '_PHPStan_8c66d8255\\Nette\\DI\\Helpers' => $vendorDir . '/nette/di/src/DI/Helpers.php', '_PHPStan_8c66d8255\\Nette\\DI\\InvalidConfigurationException' => $vendorDir . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\MissingServiceException' => $vendorDir . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\NotAllowedDuringResolvingException' => $vendorDir . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\PhpGenerator' => $vendorDir . '/nette/di/src/DI/PhpGenerator.php', '_PHPStan_8c66d8255\\Nette\\DI\\Resolver' => $vendorDir . '/nette/di/src/DI/Resolver.php', '_PHPStan_8c66d8255\\Nette\\DI\\ServiceCreationException' => $vendorDir . '/nette/di/src/DI/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DI\\ServiceDefinition' => $vendorDir . '/nette/di/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\DI\\Statement' => $vendorDir . '/nette/di/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php', '_PHPStan_8c66d8255\\Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', '_PHPStan_8c66d8255\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', '_PHPStan_8c66d8255\\Nette\\Loaders\\RobotLoader' => $vendorDir . '/nette/robot-loader/src/RobotLoader/RobotLoader.php', '_PHPStan_8c66d8255\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php', '_PHPStan_8c66d8255\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Decoder' => $vendorDir . '/nette/neon/src/Neon/Decoder.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Encoder' => $vendorDir . '/nette/neon/src/Neon/Encoder.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Entity' => $vendorDir . '/nette/neon/src/Neon/Entity.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Exception' => $vendorDir . '/nette/neon/src/Neon/Exception.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Lexer' => $vendorDir . '/nette/neon/src/Neon/Lexer.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Neon' => $vendorDir . '/nette/neon/src/Neon/Neon.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node' => $vendorDir . '/nette/neon/src/Neon/Node.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\ArrayItemNode' => $vendorDir . '/nette/neon/src/Neon/Node/ArrayItemNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\ArrayNode' => $vendorDir . '/nette/neon/src/Neon/Node/ArrayNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\BlockArrayNode' => $vendorDir . '/nette/neon/src/Neon/Node/BlockArrayNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\EntityChainNode' => $vendorDir . '/nette/neon/src/Neon/Node/EntityChainNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\EntityNode' => $vendorDir . '/nette/neon/src/Neon/Node/EntityNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\InlineArrayNode' => $vendorDir . '/nette/neon/src/Neon/Node/InlineArrayNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\LiteralNode' => $vendorDir . '/nette/neon/src/Neon/Node/LiteralNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Node\\StringNode' => $vendorDir . '/nette/neon/src/Neon/Node/StringNode.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Parser' => $vendorDir . '/nette/neon/src/Neon/Parser.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Token' => $vendorDir . '/nette/neon/src/Neon/Token.php', '_PHPStan_8c66d8255\\Nette\\Neon\\TokenStream' => $vendorDir . '/nette/neon/src/Neon/TokenStream.php', '_PHPStan_8c66d8255\\Nette\\Neon\\Traverser' => $vendorDir . '/nette/neon/src/Neon/Traverser.php', '_PHPStan_8c66d8255\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Attribute' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Attribute.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\ClassType' => $vendorDir . '/nette/php-generator/src/PhpGenerator/ClassType.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Closure' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Closure.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Constant' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Constant.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Dumper' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Dumper.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\EnumCase' => $vendorDir . '/nette/php-generator/src/PhpGenerator/EnumCase.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Extractor' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Extractor.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Factory' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Factory.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\GlobalFunction' => $vendorDir . '/nette/php-generator/src/PhpGenerator/GlobalFunction.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Helpers' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Helpers.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Literal' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Literal.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Method' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Method.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Parameter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Parameter.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PhpFile' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpFile.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PhpLiteral' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpLiteral.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PhpNamespace' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpNamespace.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Printer' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Printer.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PromotedParameter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PromotedParameter.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Property' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Property.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\PsrPrinter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PsrPrinter.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\TraitUse' => $vendorDir . '/nette/php-generator/src/PhpGenerator/TraitUse.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\AttributeAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/AttributeAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\CommentAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\FunctionLike' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\NameAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/NameAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Traits\\VisibilityAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php', '_PHPStan_8c66d8255\\Nette\\PhpGenerator\\Type' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Type.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Context' => $vendorDir . '/nette/schema/src/Schema/Context.php', '_PHPStan_8c66d8255\\Nette\\Schema\\DynamicParameter' => $vendorDir . '/nette/schema/src/Schema/DynamicParameter.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\AnyOf' => $vendorDir . '/nette/schema/src/Schema/Elements/AnyOf.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\Base' => $vendorDir . '/nette/schema/src/Schema/Elements/Base.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\Structure' => $vendorDir . '/nette/schema/src/Schema/Elements/Structure.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Elements\\Type' => $vendorDir . '/nette/schema/src/Schema/Elements/Type.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Expect' => $vendorDir . '/nette/schema/src/Schema/Expect.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Helpers' => $vendorDir . '/nette/schema/src/Schema/Helpers.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Message' => $vendorDir . '/nette/schema/src/Schema/Message.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Processor' => $vendorDir . '/nette/schema/src/Schema/Processor.php', '_PHPStan_8c66d8255\\Nette\\Schema\\Schema' => $vendorDir . '/nette/schema/src/Schema/Schema.php', '_PHPStan_8c66d8255\\Nette\\Schema\\ValidationException' => $vendorDir . '/nette/schema/src/Schema/ValidationException.php', '_PHPStan_8c66d8255\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php', '_PHPStan_8c66d8255\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php', '_PHPStan_8c66d8255\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', '_PHPStan_8c66d8255\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', '_PHPStan_8c66d8255\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', '_PHPStan_8c66d8255\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Finder' => $vendorDir . '/nette/finder/src/Utils/Finder.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', '_PHPStan_8c66d8255\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', '_PHPStan_8c66d8255\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', '_PHPStan_8c66d8255\\Nette\\Utils\\ObjectMixin' => $vendorDir . '/nette/utils/src/Utils/ObjectMixin.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', '_PHPStan_8c66d8255\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', '_PHPStan_8c66d8255\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', '_PHPStan_8c66d8255\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\CiDetector' => $vendorDir . '/ondram/ci-detector/src/CiDetector.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\AbstractCi' => $vendorDir . '/ondram/ci-detector/src/Ci/AbstractCi.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\AppVeyor' => $vendorDir . '/ondram/ci-detector/src/Ci/AppVeyor.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => $vendorDir . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Bamboo' => $vendorDir . '/ondram/ci-detector/src/Ci/Bamboo.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Buddy' => $vendorDir . '/ondram/ci-detector/src/Ci/Buddy.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\CiInterface' => $vendorDir . '/ondram/ci-detector/src/Ci/CiInterface.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Circle' => $vendorDir . '/ondram/ci-detector/src/Ci/Circle.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Codeship' => $vendorDir . '/ondram/ci-detector/src/Ci/Codeship.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Continuousphp' => $vendorDir . '/ondram/ci-detector/src/Ci/Continuousphp.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Drone' => $vendorDir . '/ondram/ci-detector/src/Ci/Drone.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\GitHubActions' => $vendorDir . '/ondram/ci-detector/src/Ci/GitHubActions.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\GitLab' => $vendorDir . '/ondram/ci-detector/src/Ci/GitLab.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Jenkins' => $vendorDir . '/ondram/ci-detector/src/Ci/Jenkins.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\TeamCity' => $vendorDir . '/ondram/ci-detector/src/Ci/TeamCity.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Travis' => $vendorDir . '/ondram/ci-detector/src/Ci/Travis.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Ci\\Wercker' => $vendorDir . '/ondram/ci-detector/src/Ci/Wercker.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Env' => $vendorDir . '/ondram/ci-detector/src/Env.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => $vendorDir . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', '_PHPStan_8c66d8255\\OndraM\\CiDetector\\TrinaryLogic' => $vendorDir . '/ondram/ci-detector/src/TrinaryLogic.php', '_PHPStan_8c66d8255\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', '_PHPStan_8c66d8255\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', '_PHPStan_8c66d8255\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', '_PHPStan_8c66d8255\\Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', '_PHPStan_8c66d8255\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', '_PHPStan_8c66d8255\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', '_PHPStan_8c66d8255\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', '_PHPStan_8c66d8255\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', '_PHPStan_8c66d8255\\React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php', '_PHPStan_8c66d8255\\React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php', '_PHPStan_8c66d8255\\React\\ChildProcess\\Process' => $vendorDir . '/react/child-process/src/Process.php', '_PHPStan_8c66d8255\\React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php', '_PHPStan_8c66d8255\\React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php', '_PHPStan_8c66d8255\\React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php', '_PHPStan_8c66d8255\\React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php', '_PHPStan_8c66d8255\\React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php', '_PHPStan_8c66d8255\\React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php', '_PHPStan_8c66d8255\\React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php', '_PHPStan_8c66d8255\\React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php', '_PHPStan_8c66d8255\\React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php', '_PHPStan_8c66d8255\\React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php', '_PHPStan_8c66d8255\\React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php', '_PHPStan_8c66d8255\\React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php', '_PHPStan_8c66d8255\\React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php', '_PHPStan_8c66d8255\\React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php', '_PHPStan_8c66d8255\\React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php', '_PHPStan_8c66d8255\\React\\Http\\Browser' => $vendorDir . '/react/http/src/Browser.php', '_PHPStan_8c66d8255\\React\\Http\\Client\\Client' => $vendorDir . '/react/http/src/Client/Client.php', '_PHPStan_8c66d8255\\React\\Http\\HttpServer' => $vendorDir . '/react/http/src/HttpServer.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\AbstractMessage' => $vendorDir . '/react/http/src/Io/AbstractMessage.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\AbstractRequest' => $vendorDir . '/react/http/src/Io/AbstractRequest.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\BufferedBody' => $vendorDir . '/react/http/src/Io/BufferedBody.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ChunkedDecoder' => $vendorDir . '/react/http/src/Io/ChunkedDecoder.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ChunkedEncoder' => $vendorDir . '/react/http/src/Io/ChunkedEncoder.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ClientConnectionManager' => $vendorDir . '/react/http/src/Io/ClientConnectionManager.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ClientRequestState' => $vendorDir . '/react/http/src/Io/ClientRequestState.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ClientRequestStream' => $vendorDir . '/react/http/src/Io/ClientRequestStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\Clock' => $vendorDir . '/react/http/src/Io/Clock.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\CloseProtectionStream' => $vendorDir . '/react/http/src/Io/CloseProtectionStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\EmptyBodyStream' => $vendorDir . '/react/http/src/Io/EmptyBodyStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\HttpBodyStream' => $vendorDir . '/react/http/src/Io/HttpBodyStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\IniUtil' => $vendorDir . '/react/http/src/Io/IniUtil.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\LengthLimitedStream' => $vendorDir . '/react/http/src/Io/LengthLimitedStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\MiddlewareRunner' => $vendorDir . '/react/http/src/Io/MiddlewareRunner.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\MultipartParser' => $vendorDir . '/react/http/src/Io/MultipartParser.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\PauseBufferStream' => $vendorDir . '/react/http/src/Io/PauseBufferStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\ReadableBodyStream' => $vendorDir . '/react/http/src/Io/ReadableBodyStream.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\RequestHeaderParser' => $vendorDir . '/react/http/src/Io/RequestHeaderParser.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\Sender' => $vendorDir . '/react/http/src/Io/Sender.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\StreamingServer' => $vendorDir . '/react/http/src/Io/StreamingServer.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\Transaction' => $vendorDir . '/react/http/src/Io/Transaction.php', '_PHPStan_8c66d8255\\React\\Http\\Io\\UploadedFile' => $vendorDir . '/react/http/src/Io/UploadedFile.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\Request' => $vendorDir . '/react/http/src/Message/Request.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\Response' => $vendorDir . '/react/http/src/Message/Response.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\ResponseException' => $vendorDir . '/react/http/src/Message/ResponseException.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\ServerRequest' => $vendorDir . '/react/http/src/Message/ServerRequest.php', '_PHPStan_8c66d8255\\React\\Http\\Message\\Uri' => $vendorDir . '/react/http/src/Message/Uri.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\LimitConcurrentRequestsMiddleware' => $vendorDir . '/react/http/src/Middleware/LimitConcurrentRequestsMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\RequestBodyBufferMiddleware' => $vendorDir . '/react/http/src/Middleware/RequestBodyBufferMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\RequestBodyParserMiddleware' => $vendorDir . '/react/http/src/Middleware/RequestBodyParserMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Middleware\\StreamingRequestMiddleware' => $vendorDir . '/react/http/src/Middleware/StreamingRequestMiddleware.php', '_PHPStan_8c66d8255\\React\\Http\\Server' => $vendorDir . '/react/http/src/Server.php', '_PHPStan_8c66d8255\\React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', '_PHPStan_8c66d8255\\React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', '_PHPStan_8c66d8255\\React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', '_PHPStan_8c66d8255\\React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', '_PHPStan_8c66d8255\\React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', '_PHPStan_8c66d8255\\React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', '_PHPStan_8c66d8255\\React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', '_PHPStan_8c66d8255\\React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php', '_PHPStan_8c66d8255\\React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php', '_PHPStan_8c66d8255\\React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php', '_PHPStan_8c66d8255\\React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', '_PHPStan_8c66d8255\\React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php', '_PHPStan_8c66d8255\\React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php', '_PHPStan_8c66d8255\\React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php', '_PHPStan_8c66d8255\\React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php', '_PHPStan_8c66d8255\\React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php', '_PHPStan_8c66d8255\\React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php', '_PHPStan_8c66d8255\\React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php', '_PHPStan_8c66d8255\\React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php', '_PHPStan_8c66d8255\\React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php', '_PHPStan_8c66d8255\\React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php', '_PHPStan_8c66d8255\\React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php', '_PHPStan_8c66d8255\\React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php', '_PHPStan_8c66d8255\\React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php', '_PHPStan_8c66d8255\\React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php', '_PHPStan_8c66d8255\\React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php', '_PHPStan_8c66d8255\\React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php', '_PHPStan_8c66d8255\\React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php', '_PHPStan_8c66d8255\\React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', '_PHPStan_8c66d8255\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php', '_PHPStan_8c66d8255\\Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', '_PHPStan_8c66d8255\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', '_PHPStan_8c66d8255\\Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', ); * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use 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 string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to * @internal */ private static $selfDir = null; /** * @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 */ private static $installedIsLocalDir; /** * @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('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(); // when using reload, we disable the duplicate protection to ensure that self::$installed data is // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, // so we have to assume it does not, and that may result in duplicate data being returned when listing // all installed packages for example self::$installedIsLocalDir = false; } /** * @return string */ private static function getSelfDir() { if (self::$selfDir === null) { self::$selfDir = strtr(__DIR__, '\\', '/'); } return self::$selfDir; } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); $copiedLocalDir = false; if (self::$canGetVendors) { $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { $vendorDir = strtr($vendorDir, '\\', '/'); 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'; self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { self::$installed = $required; self::$installedIsLocalDir = true; } } if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { $copiedLocalDir = true; } } } 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() && !$copiedLocalDir) { $installed[] = self::$installed; } return $installed; } } $vendorDir . '/hoa/consistency/Prelude.php', '3e76f7f02b41af8cea96018933f6b7e3' => $vendorDir . '/hoa/protocol/Wrapper.php', 'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'fe1d4898277c26748a003292f432cd3b' => $vendorDir . '/jetbrains/phpstorm-stubs/PhpStormStubsMap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', 'c4e03ecd470d2a87804979c0a8152284' => $vendorDir . '/react/async/src/functions_include.php', 'b686b8e46447868025a15ce5d0cb2634' => $vendorDir . '/symfony/polyfill-php74/bootstrap.php', '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', '23e1affdf407e3538a1f32c140fb0401' => $baseDir . '/src/debugScope.php', '8b3b25e11e82753923d43e298a70dcd0' => $baseDir . '/src/dumpType.php', '9662279e3e75f737d93030252673bf2d' => $baseDir . '/src/autoloadFunctions.php', '1a2eab53065eff9692bac238d15cc8cb' => $baseDir . '/src/Testing/functions.php', ); Copyright (C) 2015 Composer 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. * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver; use _PHPStan_8c66d8255\Composer\Semver\Constraint\Constraint; class Interval { /** @var Constraint */ private $start; /** @var Constraint */ private $end; public function __construct(Constraint $start, Constraint $end) { $this->start = $start; $this->end = $end; } /** * @return Constraint */ public function getStart() { return $this->start; } /** * @return Constraint */ public function getEnd() { return $this->end; } /** * @return Constraint */ public static function fromZero() { static $zero; if (null === $zero) { $zero = new Constraint('>=', '0.0.0.0-dev'); } return $zero; } /** * @return Constraint */ public static function untilPositiveInfinity() { static $positiveInfinity; if (null === $positiveInfinity) { $positiveInfinity = new Constraint('<', \PHP_INT_MAX . '.0.0.0'); } return $positiveInfinity; } /** * @return self */ public static function any() { return new self(self::fromZero(), self::untilPositiveInfinity()); } /** * @return array{'names': string[], 'exclude': bool} */ public static function anyDev() { // any == exclude nothing return array('names' => array(), 'exclude' => \true); } /** * @return array{'names': string[], 'exclude': bool} */ public static function noDev() { // nothing == no names included return array('names' => array(), 'exclude' => \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver\Constraint; /** * Defines a constraint. */ class Constraint implements ConstraintInterface { /* operator integer values */ const OP_EQ = 0; const OP_LT = 1; const OP_LE = 2; const OP_GT = 3; const OP_GE = 4; const OP_NE = 5; /* operator string values */ const STR_OP_EQ = '=='; const STR_OP_EQ_ALT = '='; const STR_OP_LT = '<'; const STR_OP_LE = '<='; const STR_OP_GT = '>'; const STR_OP_GE = '>='; const STR_OP_NE = '!='; const STR_OP_NE_ALT = '<>'; /** * Operator to integer translation table. * * @var array * @phpstan-var array */ private static $transOpStr = array('=' => self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE); /** * Integer to operator translation table. * * @var array * @phpstan-var array */ private static $transOpInt = array(self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!='); /** * @var int * @phpstan-var self::OP_* */ protected $operator; /** @var string */ protected $version; /** @var string|null */ protected $prettyString; /** @var Bound */ protected $lowerBound; /** @var Bound */ protected $upperBound; /** * Sets operator and version to compare with. * * @param string $operator * @param string $version * * @throws \InvalidArgumentException if invalid operator is given. * * @phpstan-param self::STR_OP_* $operator */ public function __construct($operator, $version) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $this->operator = self::$transOpStr[$operator]; $this->version = $version; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return string * * @phpstan-return self::STR_OP_* */ public function getOperator() { return self::$transOpInt[$this->operator]; } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if ($provider instanceof self) { return $this->matchSpecific($provider); } // turn matching around to find a match return $provider->matches($this); } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } /** * Get all supported comparison operators. * * @return array * * @phpstan-return list */ public static function getSupportedOperators() { return \array_keys(self::$transOpStr); } /** * @param string $operator * @return int * * @phpstan-param self::STR_OP_* $operator * @phpstan-return self::OP_* */ public static function getOperatorConstant($operator) { return self::$transOpStr[$operator]; } /** * @param string $a * @param string $b * @param string $operator * @param bool $compareBranches * * @throws \InvalidArgumentException if invalid operator is given. * * @return bool * * @phpstan-param self::STR_OP_* $operator */ public function versionCompare($a, $b, $operator, $compareBranches = \false) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $aIsBranch = \strpos($a, 'dev-') === 0; $bIsBranch = \strpos($b, 'dev-') === 0; if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { return $a !== $b; } if ($aIsBranch && $bIsBranch) { return $operator === '==' && $a === $b; } // when branches are not comparable, we make sure dev branches never match anything if (!$compareBranches && ($aIsBranch || $bIsBranch)) { return \false; } return \version_compare($a, $b, $operator); } /** * {@inheritDoc} */ public function compile($otherOperator) { if (\strpos($this->version, 'dev-') === 0) { if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b && $v === %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } return 'false'; } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } return 'false'; } if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('\\version_compare($v, %s, \'==\')', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('$b || \\version_compare($v, %s, \'!=\')', \var_export($this->version, \true)); } return \sprintf('!$b && \\version_compare(%s, $v, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$otherOperator]); } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b || (!$b && \\version_compare($v, %s, \'!=\'))', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { return '!$b'; } } else { // $this->operator must be self::OP_GT || self::OP_GE here if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { return '!$b'; } } if (self::OP_NE === $otherOperator) { return 'true'; } $codeComparison = \sprintf('\\version_compare($v, %s, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$this->operator]); if ($this->operator === self::OP_LE) { if ($otherOperator === self::OP_GT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } elseif ($this->operator === self::OP_GE) { if ($otherOperator === self::OP_LT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } return \sprintf('!$b && %s', $codeComparison); } /** * @param Constraint $provider * @param bool $compareBranches * * @return bool */ public function matchSpecific(Constraint $provider, $compareBranches = \false) { $noEqualOp = \str_replace('=', '', self::$transOpInt[$this->operator]); $providerNoEqualOp = \str_replace('=', '', self::$transOpInt[$provider->operator]); $isEqualOp = self::OP_EQ === $this->operator; $isNonEqualOp = self::OP_NE === $this->operator; $isProviderEqualOp = self::OP_EQ === $provider->operator; $isProviderNonEqualOp = self::OP_NE === $provider->operator; // '!=' operator is match when other operator is not '==' operator or version is not match // these kinds of comparisons always have a solution if ($isNonEqualOp || $isProviderNonEqualOp) { if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && \strpos($provider->version, 'dev-') === 0) { return \false; } if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && \strpos($this->version, 'dev-') === 0) { return \false; } if (!$isEqualOp && !$isProviderEqualOp) { return \true; } return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); } // an example for the condition is <= 2.0 & < 1.0 // these kinds of comparisons always have a solution if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { return !(\strpos($this->version, 'dev-') === 0 || \strpos($provider->version, 'dev-') === 0); } $version1 = $isEqualOp ? $this->version : $provider->version; $version2 = $isEqualOp ? $provider->version : $this->version; $operator = $isEqualOp ? $provider->operator : $this->operator; if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { // special case, e.g. require >= 1.0 and provide < 1.0 // 1.0 >= 1.0 but 1.0 is outside of the provided interval return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp && \version_compare($provider->version, $this->version, '==')); } return \false; } /** * @return string */ public function __toString() { return self::$transOpInt[$this->operator] . ' ' . $this->version; } /** * {@inheritDoc} */ public function getLowerBound() { $this->extractBounds(); return $this->lowerBound; } /** * {@inheritDoc} */ public function getUpperBound() { $this->extractBounds(); return $this->upperBound; } /** * @return void */ private function extractBounds() { if (null !== $this->lowerBound) { return; } // Branches if (\strpos($this->version, 'dev-') === 0) { $this->lowerBound = Bound::zero(); $this->upperBound = Bound::positiveInfinity(); return; } switch ($this->operator) { case self::OP_EQ: $this->lowerBound = new Bound($this->version, \true); $this->upperBound = new Bound($this->version, \true); break; case self::OP_LT: $this->lowerBound = Bound::zero(); $this->upperBound = new Bound($this->version, \false); break; case self::OP_LE: $this->lowerBound = Bound::zero(); $this->upperBound = new Bound($this->version, \true); break; case self::OP_GT: $this->lowerBound = new Bound($this->version, \false); $this->upperBound = Bound::positiveInfinity(); break; case self::OP_GE: $this->lowerBound = new Bound($this->version, \true); $this->upperBound = Bound::positiveInfinity(); break; case self::OP_NE: $this->lowerBound = Bound::zero(); $this->upperBound = Bound::positiveInfinity(); break; } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver\Constraint; class Bound { /** * @var string */ private $version; /** * @var bool */ private $isInclusive; /** * @param string $version * @param bool $isInclusive */ public function __construct($version, $isInclusive) { $this->version = $version; $this->isInclusive = $isInclusive; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return bool */ public function isInclusive() { return $this->isInclusive; } /** * @return bool */ public function isZero() { return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive(); } /** * @return bool */ public function isPositiveInfinity() { return $this->getVersion() === \PHP_INT_MAX . '.0.0.0' && !$this->isInclusive(); } /** * Compares a bound to another with a given operator. * * @param Bound $other * @param string $operator * * @return bool */ public function compareTo(Bound $other, $operator) { if (!\in_array($operator, array('<', '>'), \true)) { throw new \InvalidArgumentException('Does not support any other operator other than > or <.'); } // If they are the same it doesn't matter if ($this == $other) { return \false; } $compareResult = \version_compare($this->getVersion(), $other->getVersion()); // Not the same version means we don't need to check if the bounds are inclusive or not if (0 !== $compareResult) { return ('>' === $operator ? 1 : -1) === $compareResult; } // Question we're answering here is "am I higher than $other?" return '>' === $operator ? $other->isInclusive() : !$other->isInclusive(); } public function __toString() { return \sprintf('%s [%s]', $this->getVersion(), $this->isInclusive() ? 'inclusive' : 'exclusive'); } /** * @return self */ public static function zero() { return new Bound('0.0.0.0-dev', \true); } /** * @return self */ public static function positiveInfinity() { return new Bound(\PHP_INT_MAX . '.0.0.0', \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver\Constraint; /** * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint * in libraries relying on composer/semver but creating your own constraint class * that implements this interface is not a supported use case and will cause the * composer/semver components to return unexpected results. */ interface ConstraintInterface { /** * Checks whether the given constraint intersects in any way with this constraint * * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider); /** * Provides a compiled version of the constraint for the given operator * The compiled version must be a PHP expression. * Executor of compile version must provide 2 variables: * - $v = the string version to compare with * - $b = whether or not the version is a non-comparable branch (starts with "dev-") * * @see Constraint::OP_* for the list of available operators. * @example return '!$b && version_compare($v, '1.0', '>')'; * * @param int $otherOperator one Constraint::OP_* * * @return string * * @phpstan-param Constraint::OP_* $otherOperator */ public function compile($otherOperator); /** * @return Bound */ public function getUpperBound(); /** * @return Bound */ public function getLowerBound(); /** * @return string */ public function getPrettyString(); /** * @param string|null $prettyString * * @return void */ public function setPrettyString($prettyString); /** * @return string */ public function __toString(); } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver\Constraint; /** * Blackhole of constraints, nothing escapes it */ class MatchNoneConstraint implements ConstraintInterface { /** @var string|null */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { return \false; } /** * {@inheritDoc} */ public function compile($otherOperator) { return 'false'; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { return '[]'; } /** * {@inheritDoc} */ public function getUpperBound() { return new Bound('0.0.0.0-dev', \false); } /** * {@inheritDoc} */ public function getLowerBound() { return new Bound('0.0.0.0-dev', \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver\Constraint; /** * Defines the absence of a constraint. * * This constraint matches everything. */ class MatchAllConstraint implements ConstraintInterface { /** @var string|null */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { return \true; } /** * {@inheritDoc} */ public function compile($otherOperator) { return 'true'; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { return '*'; } /** * {@inheritDoc} */ public function getUpperBound() { return Bound::positiveInfinity(); } /** * {@inheritDoc} */ public function getLowerBound() { return Bound::zero(); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver\Constraint; /** * Defines a conjunctive or disjunctive set of constraints. */ class MultiConstraint implements ConstraintInterface { /** * @var ConstraintInterface[] * @phpstan-var non-empty-array */ protected $constraints; /** @var string|null */ protected $prettyString; /** @var string|null */ protected $string; /** @var bool */ protected $conjunctive; /** @var Bound|null */ protected $lowerBound; /** @var Bound|null */ protected $upperBound; /** * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @throws \InvalidArgumentException If less than 2 constraints are passed */ public function __construct(array $constraints, $conjunctive = \true) { if (\count($constraints) < 2) { throw new \InvalidArgumentException('Must provide at least two constraints for a MultiConstraint. Use ' . 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use ' . 'MultiConstraint::create() which optimizes and handles those cases automatically.'); } $this->constraints = $constraints; $this->conjunctive = $conjunctive; } /** * @return ConstraintInterface[] */ public function getConstraints() { return $this->constraints; } /** * @return bool */ public function isConjunctive() { return $this->conjunctive; } /** * @return bool */ public function isDisjunctive() { return !$this->conjunctive; } /** * {@inheritDoc} */ public function compile($otherOperator) { $parts = array(); foreach ($this->constraints as $constraint) { $code = $constraint->compile($otherOperator); if ($code === 'true') { if (!$this->conjunctive) { return 'true'; } } elseif ($code === 'false') { if ($this->conjunctive) { return 'false'; } } else { $parts[] = '(' . $code . ')'; } } if (!$parts) { return $this->conjunctive ? 'true' : 'false'; } return $this->conjunctive ? \implode('&&', $parts) : \implode('||', $parts); } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if (\false === $this->conjunctive) { foreach ($this->constraints as $constraint) { if ($provider->matches($constraint)) { return \true; } } return \false; } // when matching a conjunctive and a disjunctive multi constraint we have to iterate over the disjunctive one // otherwise we'd return true if different parts of the disjunctive constraint match the conjunctive one // which would lead to incorrect results, e.g. [>1 and <2] would match [<1 or >2] although they do not intersect if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) { return $provider->matches($this); } foreach ($this->constraints as $constraint) { if (!$provider->matches($constraint)) { return \false; } } return \true; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { if ($this->string !== null) { return $this->string; } $constraints = array(); foreach ($this->constraints as $constraint) { $constraints[] = (string) $constraint; } return $this->string = '[' . \implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; } /** * {@inheritDoc} */ public function getLowerBound() { $this->extractBounds(); if (null === $this->lowerBound) { throw new \LogicException('extractBounds should have populated the lowerBound property'); } return $this->lowerBound; } /** * {@inheritDoc} */ public function getUpperBound() { $this->extractBounds(); if (null === $this->upperBound) { throw new \LogicException('extractBounds should have populated the upperBound property'); } return $this->upperBound; } /** * Tries to optimize the constraints as much as possible, meaning * reducing/collapsing congruent constraints etc. * Does not necessarily return a MultiConstraint instance if * things can be reduced to a simple constraint * * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @return ConstraintInterface */ public static function create(array $constraints, $conjunctive = \true) { if (0 === \count($constraints)) { return new MatchAllConstraint(); } if (1 === \count($constraints)) { return $constraints[0]; } $optimized = self::optimizeConstraints($constraints, $conjunctive); if ($optimized !== null) { list($constraints, $conjunctive) = $optimized; if (\count($constraints) === 1) { return $constraints[0]; } } return new self($constraints, $conjunctive); } /** * @param ConstraintInterface[] $constraints * @param bool $conjunctive * @return ?array * * @phpstan-return array{0: list, 1: bool}|null */ private static function optimizeConstraints(array $constraints, $conjunctive) { // parse the two OR groups and if they are contiguous we collapse // them into one constraint // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] if (!$conjunctive) { $left = $constraints[0]; $mergedConstraints = array(); $optimized = \false; for ($i = 1, $l = \count($constraints); $i < $l; $i++) { $right = $constraints[$i]; if ($left instanceof self && $left->conjunctive && $right instanceof self && $right->conjunctive && \count($left->constraints) === 2 && \count($right->constraints) === 2 && ($left0 = (string) $left->constraints[0]) && $left0[0] === '>' && $left0[1] === '=' && ($left1 = (string) $left->constraints[1]) && $left1[0] === '<' && ($right0 = (string) $right->constraints[0]) && $right0[0] === '>' && $right0[1] === '=' && ($right1 = (string) $right->constraints[1]) && $right1[0] === '<' && \substr($left1, 2) === \substr($right0, 3)) { $optimized = \true; $left = new MultiConstraint(array($left->constraints[0], $right->constraints[1]), \true); } else { $mergedConstraints[] = $left; $left = $right; } } if ($optimized) { $mergedConstraints[] = $left; return array($mergedConstraints, \false); } } // TODO: Here's the place to put more optimizations return null; } /** * @return void */ private function extractBounds() { if (null !== $this->lowerBound) { return; } foreach ($this->constraints as $constraint) { if (null === $this->lowerBound || null === $this->upperBound) { $this->lowerBound = $constraint->getLowerBound(); $this->upperBound = $constraint->getUpperBound(); continue; } if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { $this->lowerBound = $constraint->getLowerBound(); } if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { $this->upperBound = $constraint->getUpperBound(); } } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver; use _PHPStan_8c66d8255\Composer\Semver\Constraint\Constraint; use _PHPStan_8c66d8255\Composer\Semver\Constraint\ConstraintInterface; /** * Helper class to evaluate constraint by compiling and reusing the code to evaluate */ class CompilingMatcher { /** * @var array * @phpstan-var array */ private static $compiledCheckerCache = array(); /** * @var array * @phpstan-var array */ private static $resultCache = array(); /** @var bool */ private static $enabled; /** * @phpstan-var array */ private static $transOpInt = array(Constraint::OP_EQ => Constraint::STR_OP_EQ, Constraint::OP_LT => Constraint::STR_OP_LT, Constraint::OP_LE => Constraint::STR_OP_LE, Constraint::OP_GT => Constraint::STR_OP_GT, Constraint::OP_GE => Constraint::STR_OP_GE, Constraint::OP_NE => Constraint::STR_OP_NE); /** * Clears the memoization cache once you are done * * @return void */ public static function clear() { self::$resultCache = array(); self::$compiledCheckerCache = array(); } /** * Evaluates the expression: $constraint match $operator $version * * @param ConstraintInterface $constraint * @param int $operator * @phpstan-param Constraint::OP_* $operator * @param string $version * * @return mixed */ public static function match(ConstraintInterface $constraint, $operator, $version) { $resultCacheKey = $operator . $constraint . ';' . $version; if (isset(self::$resultCache[$resultCacheKey])) { return self::$resultCache[$resultCacheKey]; } if (self::$enabled === null) { self::$enabled = !\in_array('eval', \explode(',', (string) \ini_get('disable_functions')), \true); } if (!self::$enabled) { return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version)); } $cacheKey = $operator . $constraint; if (!isset(self::$compiledCheckerCache[$cacheKey])) { $code = $constraint->compile($operator); self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return ' . $code . ';};'); } else { $function = self::$compiledCheckerCache[$cacheKey]; } return self::$resultCache[$resultCacheKey] = $function($version, \strpos($version, 'dev-') === 0); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver; use _PHPStan_8c66d8255\Composer\Semver\Constraint\Constraint; class Comparator { /** * Evaluates the expression: $version1 > $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThan($version1, $version2) { return self::compare($version1, '>', $version2); } /** * Evaluates the expression: $version1 >= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThanOrEqualTo($version1, $version2) { return self::compare($version1, '>=', $version2); } /** * Evaluates the expression: $version1 < $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThan($version1, $version2) { return self::compare($version1, '<', $version2); } /** * Evaluates the expression: $version1 <= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThanOrEqualTo($version1, $version2) { return self::compare($version1, '<=', $version2); } /** * Evaluates the expression: $version1 == $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function equalTo($version1, $version2) { return self::compare($version1, '==', $version2); } /** * Evaluates the expression: $version1 != $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function notEqualTo($version1, $version2) { return self::compare($version1, '!=', $version2); } /** * Evaluates the expression: $version1 $operator $version2. * * @param string $version1 * @param string $operator * @param string $version2 * * @return bool * * @phpstan-param Constraint::STR_OP_* $operator */ public static function compare($version1, $operator, $version2) { $constraint = new Constraint($operator, $version2); return $constraint->matchSpecific(new Constraint('==', $version1), \true); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver; use _PHPStan_8c66d8255\Composer\Semver\Constraint\ConstraintInterface; use _PHPStan_8c66d8255\Composer\Semver\Constraint\MatchAllConstraint; use _PHPStan_8c66d8255\Composer\Semver\Constraint\MultiConstraint; use _PHPStan_8c66d8255\Composer\Semver\Constraint\Constraint; /** * Version parser. * * @author Jordi Boggiano */ class VersionParser { /** * Regex to match pre-release data (sort of). * * Due to backwards compatibility: * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. * - Numerical-only pre-release identifiers are not supported, see tests. * * |--------------| * [major].[minor].[patch] -[pre-release] +[build-metadata] * * @var string */ private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\\d+)*+)?)?([.-]?dev)?'; /** @var string */ private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev'; /** * Returns the stability of a version. * * @param string $version * * @return string * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' */ public static function parseStability($version) { $version = (string) \preg_replace('{#.+$}', '', (string) $version); if (\strpos($version, 'dev-') === 0 || '-dev' === \substr($version, -4)) { return 'dev'; } \preg_match('{' . self::$modifierRegex . '(?:\\+.*)?$}i', \strtolower($version), $match); if (!empty($match[3])) { return 'dev'; } if (!empty($match[1])) { if ('beta' === $match[1] || 'b' === $match[1]) { return 'beta'; } if ('alpha' === $match[1] || 'a' === $match[1]) { return 'alpha'; } if ('rc' === $match[1]) { return 'RC'; } } return 'stable'; } /** * @param string $stability * * @return string */ public static function normalizeStability($stability) { $stability = \strtolower((string) $stability); return $stability === 'rc' ? 'RC' : $stability; } /** * Normalizes a version string to be able to perform comparisons on it. * * @param string $version * @param ?string $fullVersion optional complete version string to give more context * * @throws \UnexpectedValueException * * @return string */ public function normalize($version, $fullVersion = null) { $version = \trim((string) $version); $origVersion = $version; if (null === $fullVersion) { $fullVersion = $version; } // strip off aliasing if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $version, $match)) { $version = $match[1]; } // strip off stability flag if (\preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) { $version = \substr($version, 0, \strlen($version) - \strlen($match[0])); } // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints if (\in_array($version, array('master', 'trunk', 'default'), \true)) { $version = 'dev-' . $version; } // if requirement is branch-like, use full name if (\stripos($version, 'dev-') === 0) { return 'dev-' . \substr($version, 4); } // strip off build metadata if (\preg_match('{^([^,\\s+]++)\\+[^\\s]++$}', $version, $match)) { $version = $match[1]; } // match classical versioning if (\preg_match('{^v?(\\d{1,5}+)(\\.\\d++)?(\\.\\d++)?(\\.\\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0'); $index = 5; // match date(time) based versioning } elseif (\preg_match('{^v?(\\d{4}(?:[.:-]?\\d{2}){1,6}(?:[.:-]?\\d{1,3}){0,2})' . self::$modifierRegex . '$}i', $version, $matches)) { $version = (string) \preg_replace('{\\D}', '.', $matches[1]); $index = 2; } // add version modifiers if a version was matched if (isset($index)) { if (!empty($matches[$index])) { if ('stable' === $matches[$index]) { return $version; } $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? \ltrim($matches[$index + 1], '.-') : ''); } if (!empty($matches[$index + 2])) { $version .= '-dev'; } return $version; } // match dev branches if (\preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { try { $normalized = $this->normalizeBranch($match[1]); // a branch ending with -dev is only valid if it is numeric // if it gets prefixed with dev- it means the branch name should // have had a dev- prefix already when passed to normalize if (\strpos($normalized, 'dev-') === \false) { return $normalized; } } catch (\Exception $e) { } } $extraMessage = ''; if (\preg_match('{ +as +' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))?$}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; } elseif (\preg_match('{^' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))? +as +}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; } throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); } /** * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. * * @param string $branch Branch name (e.g. 2.1.x-dev) * * @return string|false Numeric prefix if present (e.g. 2.1.) or false */ public function parseNumericAliasPrefix($branch) { if (\preg_match('{^(?P(\\d++\\.)*\\d++)(?:\\.x)?-dev$}i', (string) $branch, $matches)) { return $matches['version'] . '.'; } return \false; } /** * Normalizes a branch name to be able to perform comparisons on it. * * @param string $name * * @return string */ public function normalizeBranch($name) { $name = \trim((string) $name); if (\preg_match('{^v?(\\d++)(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?$}i', $name, $matches)) { $version = ''; for ($i = 1; $i < 5; ++$i) { $version .= isset($matches[$i]) ? \str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; } return \str_replace('x', '9999999', $version) . '-dev'; } return 'dev-' . $name; } /** * Normalizes a default branch name (i.e. master on git) to 9999999-dev. * * @param string $name * * @return string * * @deprecated No need to use this anymore in theory, Composer 2 does not normalize any branch names to 9999999-dev anymore */ public function normalizeDefaultBranch($name) { if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { return '9999999-dev'; } return (string) $name; } /** * Parses a constraint string into MultiConstraint and/or Constraint objects. * * @param string $constraints * * @return ConstraintInterface */ public function parseConstraints($constraints) { $prettyConstraint = (string) $constraints; $orConstraints = \preg_split('{\\s*\\|\\|?\\s*}', \trim((string) $constraints)); if (\false === $orConstraints) { throw new \RuntimeException('Failed to preg_split string: ' . $constraints); } $orGroups = array(); foreach ($orConstraints as $orConstraint) { $andConstraints = \preg_split('{(?< ,]) *(? 1) { $constraintObjects = array(); foreach ($andConstraints as $andConstraint) { foreach ($this->parseConstraint($andConstraint) as $parsedAndConstraint) { $constraintObjects[] = $parsedAndConstraint; } } } else { $constraintObjects = $this->parseConstraint($andConstraints[0]); } if (1 === \count($constraintObjects)) { $constraint = $constraintObjects[0]; } else { $constraint = new MultiConstraint($constraintObjects); } $orGroups[] = $constraint; } $parsedConstraint = MultiConstraint::create($orGroups, \false); $parsedConstraint->setPrettyString($prettyConstraint); return $parsedConstraint; } /** * @param string $constraint * * @throws \UnexpectedValueException * * @return array * * @phpstan-return non-empty-array */ private function parseConstraint($constraint) { // strip off aliasing if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $constraint, $match)) { $constraint = $match[1]; } // strip @stability flags, and keep it for later use if (\preg_match('{^([^,\\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { $constraint = '' !== $match[1] ? $match[1] : '*'; if ($match[2] !== 'stable') { $stabilityModifier = $match[2]; } } // get rid of #refs as those are used by composer only if (\preg_match('{^(dev-[^,\\s@]+?|[^,\\s@]+?\\.x-dev)#.+$}i', $constraint, $match)) { $constraint = $match[1]; } if (\preg_match('{^(v)?[xX*](\\.[xX*])*$}i', $constraint, $match)) { if (!empty($match[1]) || !empty($match[2])) { return array(new Constraint('>=', '0.0.0.0-dev')); } return array(new MatchAllConstraint()); } $versionRegex = 'v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.(\\d++))?(?:' . self::$modifierRegex . '|\\.([xX*][.-]?dev))(?:\\+[^\\s]+)?'; // Tilde Range // // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous // version, to ensure that unstable instances of the current version are allowed. However, if a stability // suffix is added to the constraint, then a >= match on the current version is used instead. if (\preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { if (\strpos($constraint, '~>') === 0) { throw new \UnexpectedValueException('Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator'); } // Work out which position in the version we are operating at if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { $position = 4; } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } // when matching 2.x-dev or 3.0.x-dev we have to shift the second or third number, despite no second/third number matching above if (!empty($matches[8])) { $position++; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highPosition = \max(1, $position - 1); $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } // Caret Range // // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for // versions 0.X >=0.1.0, and no updates for versions 0.0.X if (\preg_match('{^\\^' . $versionRegex . '($)}i', $constraint, $matches)) { // Work out which position in the version we are operating at if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { $position = 1; } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { $position = 2; } else { $position = 3; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } // X Range // // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. // A partial version range is treated as an X-Range, so the special character is in fact optional. if (\preg_match('{^v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.[xX*])++$}', $constraint, $matches)) { if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; if ($lowVersion === '0.0.0.0-dev') { return array(new Constraint('<', $highVersion)); } return array(new Constraint('>=', $lowVersion), new Constraint('<', $highVersion)); } // Hyphen Range // // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but // nothing that would be greater than the provided tuple parts. if (\preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { // Calculate the stability suffix $lowStabilitySuffix = ''; if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) { $lowStabilitySuffix = '-dev'; } $lowVersion = $this->normalize($matches['from']); $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); $empty = function ($x) { return $x === 0 || $x === '0' ? \false : empty($x); }; if (!$empty($matches[12]) && !$empty($matches[13]) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) { $highVersion = $this->normalize($matches['to']); $upperBound = new Constraint('<=', $highVersion); } else { $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]); // validate to version $this->normalize($matches['to']); $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); } return array($lowerBound, $upperBound); } // Basic Comparators if (\preg_match('{^(<>|!=|>=?|<=?|==?)?\\s*(.*)}', $constraint, $matches)) { try { try { $version = $this->normalize($matches[2]); } catch (\UnexpectedValueException $e) { // recover from an invalid constraint like foobar-dev which should be dev-foobar // except if the constraint uses a known operator, in which case it must be a parse error if (\substr($matches[2], -4) === '-dev' && \preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) { $version = $this->normalize('dev-' . \substr($matches[2], 0, -4)); } else { throw $e; } } $op = $matches[1] ?: '='; if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { $version .= '-' . $stabilityModifier; } elseif ('<' === $op || '>=' === $op) { if (!\preg_match('/-' . self::$modifierRegex . '$/', \strtolower($matches[2]))) { if (\strpos($matches[2], 'dev-') !== 0) { $version .= '-dev'; } } } return array(new Constraint($matches[1] ?: '=', $version)); } catch (\Exception $e) { } } $message = 'Could not parse version constraint ' . $constraint; if (isset($e)) { $message .= ': ' . $e->getMessage(); } throw new \UnexpectedValueException($message); } /** * Increment, decrement, or simply pad a version number. * * Support function for {@link parseConstraint()} * * @param array $matches Array with version parts in array indexes 1,2,3,4 * @param int $position 1,2,3,4 - which segment of the version to increment/decrement * @param int $increment * @param string $pad The string to pad version parts after $position * * @return string|null The new version * * @phpstan-param string[] $matches */ private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0') { for ($i = 4; $i > 0; --$i) { if ($i > $position) { $matches[$i] = $pad; } elseif ($i === $position && $increment) { $matches[$i] += $increment; // If $matches[$i] was 0, carry the decrement if ($matches[$i] < 0) { $matches[$i] = $pad; --$position; // Return null on a carry overflow if ($i === 1) { return null; } } } } return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; } /** * Expand shorthand stability string to long version. * * @param string $stability * * @return string */ private function expandStability($stability) { $stability = \strtolower($stability); switch ($stability) { case 'a': return 'alpha'; case 'b': return 'beta'; case 'p': case 'pl': return 'patch'; case 'rc': return 'RC'; default: return $stability; } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver; use _PHPStan_8c66d8255\Composer\Semver\Constraint\Constraint; class Semver { const SORT_ASC = 1; const SORT_DESC = -1; /** @var VersionParser */ private static $versionParser; /** * Determine if given version satisfies given constraints. * * @param string $version * @param string $constraints * * @return bool */ public static function satisfies($version, $constraints) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $provider = new Constraint('==', $versionParser->normalize($version)); $parsedConstraints = $versionParser->parseConstraints($constraints); return $parsedConstraints->matches($provider); } /** * Return all versions that satisfy given constraints. * * @param string[] $versions * @param string $constraints * * @return string[] */ public static function satisfiedBy(array $versions, $constraints) { $versions = \array_filter($versions, function ($version) use($constraints) { return Semver::satisfies($version, $constraints); }); return \array_values($versions); } /** * Sort given array of versions. * * @param string[] $versions * * @return string[] */ public static function sort(array $versions) { return self::usort($versions, self::SORT_ASC); } /** * Sort given array of versions in reverse. * * @param string[] $versions * * @return string[] */ public static function rsort(array $versions) { return self::usort($versions, self::SORT_DESC); } /** * @param string[] $versions * @param int $direction * * @return string[] */ private static function usort(array $versions, $direction) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $normalized = array(); // Normalize outside of usort() scope for minor performance increase. // Creates an array of arrays: [[normalized, key], ...] foreach ($versions as $key => $version) { $normalizedVersion = $versionParser->normalize($version); $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); $normalized[] = array($normalizedVersion, $key); } \usort($normalized, function (array $left, array $right) use($direction) { if ($left[0] === $right[0]) { return 0; } if (Comparator::lessThan($left[0], $right[0])) { return -$direction; } return $direction; }); // Recreate input array, using the original indexes which are now in sorted order. $sorted = array(); foreach ($normalized as $item) { $sorted[] = $versions[$item[1]]; } return $sorted; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\Semver; use _PHPStan_8c66d8255\Composer\Semver\Constraint\Constraint; use _PHPStan_8c66d8255\Composer\Semver\Constraint\ConstraintInterface; use _PHPStan_8c66d8255\Composer\Semver\Constraint\MatchAllConstraint; use _PHPStan_8c66d8255\Composer\Semver\Constraint\MatchNoneConstraint; use _PHPStan_8c66d8255\Composer\Semver\Constraint\MultiConstraint; /** * Helper class generating intervals from constraints * * This contains utilities for: * * - compacting an existing constraint which can be used to combine several into one * by creating a MultiConstraint out of the many constraints you have. * * - checking whether one subset is a subset of another. * * Note: You should call clear to free memoization memory usage when you are done using this class */ class Intervals { /** * @phpstan-var array */ private static $intervalsCache = array(); /** * @phpstan-var array */ private static $opSortOrder = array('>=' => -3, '<' => -2, '>' => 2, '<=' => 3); /** * Clears the memoization cache once you are done * * @return void */ public static function clear() { self::$intervalsCache = array(); } /** * Checks whether $candidate is a subset of $constraint * * @return bool */ public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint) { if ($constraint instanceof MatchAllConstraint) { return \true; } if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) { return \false; } $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), \true)); $candidateIntervals = self::get($candidate); if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) { return \false; } foreach ($intersectionIntervals['numeric'] as $index => $interval) { if (!isset($candidateIntervals['numeric'][$index])) { return \false; } if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) { return \false; } if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) { return \false; } } if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) { return \false; } if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) { return \false; } foreach ($intersectionIntervals['branches']['names'] as $index => $name) { if ($name !== $candidateIntervals['branches']['names'][$index]) { return \false; } } return \true; } /** * Checks whether $a and $b have any intersection, equivalent to $a->matches($b) * * @return bool */ public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b) { if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) { return \true; } if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) { return \false; } $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), \true), \true); return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0; } /** * Attempts to optimize a MultiConstraint * * When merging MultiConstraints together they can get very large, this will * compact it by looking at the real intervals covered by all the constraints * and then creates a new constraint containing only the smallest amount of rules * to match the same intervals. * * @return ConstraintInterface */ public static function compactConstraint(ConstraintInterface $constraint) { if (!$constraint instanceof MultiConstraint) { return $constraint; } $intervals = self::generateIntervals($constraint); $constraints = array(); $hasNumericMatchAll = \false; if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) { $constraints[] = $intervals['numeric'][0]->getStart(); $hasNumericMatchAll = \true; } else { $unEqualConstraints = array(); for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) { $interval = $intervals['numeric'][$i]; // if current interval ends with < N and next interval begins with > N we can swap this out for != N // but this needs to happen as a conjunctive expression together with the start of the current interval // and end of next interval, so [>=M, N, [>=M, !=N, getEnd()->getOperator() === '<' && $i + 1 < $count) { $nextInterval = $intervals['numeric'][$i + 1]; if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') { // only add a start if we didn't already do so, can be skipped if we're looking at second // interval in [>=M, N, P, =M, !=N] already and we only want to add !=P right now if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) { $unEqualConstraints[] = $interval->getStart(); } $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion()); continue; } } if (\count($unEqualConstraints) > 0) { // this is where the end of the following interval of a != constraint is added as explained above if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) { $unEqualConstraints[] = $interval->getEnd(); } // count is 1 if entire constraint is just one != expression if (\count($unEqualConstraints) > 1) { $constraints[] = new MultiConstraint($unEqualConstraints, \true); } else { $constraints[] = $unEqualConstraints[0]; } $unEqualConstraints = array(); continue; } // convert back >= x - <= x intervals to == x if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') { $constraints[] = new Constraint('==', $interval->getStart()->getVersion()); continue; } if ((string) $interval->getStart() === (string) Interval::fromZero()) { $constraints[] = $interval->getEnd(); } elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) { $constraints[] = $interval->getStart(); } else { $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), \true); } } } $devConstraints = array(); if (0 === \count($intervals['branches']['names'])) { if ($intervals['branches']['exclude']) { if ($hasNumericMatchAll) { return new MatchAllConstraint(); } // otherwise constraint should contain a != operator and already cover this } } else { foreach ($intervals['branches']['names'] as $branchName) { if ($intervals['branches']['exclude']) { $devConstraints[] = new Constraint('!=', $branchName); } else { $devConstraints[] = new Constraint('==', $branchName); } } // excluded branches, e.g. != dev-foo are conjunctive with the interval, so // > 2.0 != dev-foo must return a conjunctive constraint if ($intervals['branches']['exclude']) { if (\count($constraints) > 1) { return new MultiConstraint(\array_merge(array(new MultiConstraint($constraints, \false)), $devConstraints), \true); } if (\count($constraints) === 1 && (string) $constraints[0] === (string) Interval::fromZero()) { if (\count($devConstraints) > 1) { return new MultiConstraint($devConstraints, \true); } return $devConstraints[0]; } return new MultiConstraint(\array_merge($constraints, $devConstraints), \true); } // otherwise devConstraints contains a list of == operators for branches which are disjunctive with the // rest of the constraint $constraints = \array_merge($constraints, $devConstraints); } if (\count($constraints) > 1) { return new MultiConstraint($constraints, \false); } if (\count($constraints) === 1) { return $constraints[0]; } return new MatchNoneConstraint(); } /** * Creates an array of numeric intervals and branch constraints representing a given constraint * * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf) * if the returned branches array is empty it means no dev-* versions are matched * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev() * * @return array * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ public static function get(ConstraintInterface $constraint) { $key = (string) $constraint; if (!isset(self::$intervalsCache[$key])) { self::$intervalsCache[$key] = self::generateIntervals($constraint); } return self::$intervalsCache[$key]; } /** * @param bool $stopOnFirstValidInterval * * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = \false) { if ($constraint instanceof MatchAllConstraint) { return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); } if ($constraint instanceof MatchNoneConstraint) { return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => \false)); } if ($constraint instanceof Constraint) { return self::generateSingleConstraintIntervals($constraint); } if (!$constraint instanceof MultiConstraint) { throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got ' . \get_class($constraint) . '.'); } $constraints = $constraint->getConstraints(); $numericGroups = array(); $constraintBranches = array(); foreach ($constraints as $c) { $res = self::get($c); $numericGroups[] = $res['numeric']; $constraintBranches[] = $res['branches']; } if ($constraint->isDisjunctive()) { $branches = Interval::noDev(); foreach ($constraintBranches as $b) { if ($b['exclude']) { if ($branches['exclude']) { // disjunctive constraint, so only exclude what's excluded in all constraints // !=a,!=b || !=b,!=c => !=b $branches['names'] = \array_intersect($branches['names'], $b['names']); } else { // disjunctive constraint so exclude all names which are not explicitly included in the alternative // (==b || ==c) || !=a,!=b => !=a $branches['exclude'] = \true; $branches['names'] = \array_diff($b['names'], $branches['names']); } } else { if ($branches['exclude']) { // disjunctive constraint so exclude all names which are not explicitly included in the alternative // !=a,!=b || (==b || ==c) => !=a $branches['names'] = \array_diff($branches['names'], $b['names']); } else { // disjunctive constraint, so just add all the other branches // (==a || ==b) || ==c => ==a || ==b || ==c $branches['names'] = \array_merge($branches['names'], $b['names']); } } } } else { $branches = Interval::anyDev(); foreach ($constraintBranches as $b) { if ($b['exclude']) { if ($branches['exclude']) { // conjunctive, so just add all branch names to be excluded // !=a && !=b => !=a,!=b $branches['names'] = \array_merge($branches['names'], $b['names']); } else { // conjunctive, so only keep included names which are not excluded // (==a||==c) && !=a,!=b => ==c $branches['names'] = \array_diff($branches['names'], $b['names']); } } else { if ($branches['exclude']) { // conjunctive, so only keep included names which are not excluded // !=a,!=b && (==a||==c) => ==c $branches['names'] = \array_diff($b['names'], $branches['names']); $branches['exclude'] = \false; } else { // conjunctive, so only keep names that are included in both // (==a||==b) && (==a||==c) => ==a $branches['names'] = \array_intersect($branches['names'], $b['names']); } } } } $branches['names'] = \array_unique($branches['names']); if (\count($numericGroups) === 1) { return array('numeric' => $numericGroups[0], 'branches' => $branches); } $borders = array(); foreach ($numericGroups as $group) { foreach ($group as $interval) { $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start'); $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end'); } } $opSortOrder = self::$opSortOrder; \usort($borders, function ($a, $b) use($opSortOrder) { $order = \version_compare($a['version'], $b['version']); if ($order === 0) { return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']]; } return $order; }); $activeIntervals = 0; $intervals = array(); $index = 0; $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1; $start = null; foreach ($borders as $border) { if ($border['side'] === 'start') { $activeIntervals++; } else { $activeIntervals--; } if (!$start && $activeIntervals >= $activationThreshold) { $start = new Constraint($border['operator'], $border['version']); } elseif ($start && $activeIntervals < $activationThreshold) { // filter out invalid intervals like > x - <= x, or >= x - < x if (\version_compare($start->getVersion(), $border['version'], '=') && ($start->getOperator() === '>' && $border['operator'] === '<=' || $start->getOperator() === '>=' && $border['operator'] === '<')) { unset($intervals[$index]); } else { $intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version'])); $index++; if ($stopOnFirstValidInterval) { break; } } $start = null; } } return array('numeric' => $intervals, 'branches' => $branches); } /** * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ private static function generateSingleConstraintIntervals(Constraint $constraint) { $op = $constraint->getOperator(); // handle branch constraints first if (\strpos($constraint->getVersion(), 'dev-') === 0) { $intervals = array(); $branches = array('names' => array(), 'exclude' => \false); // != dev-foo means any numeric version may match, we treat >/< like != they are not really defined for branches if ($op === '!=') { $intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity()); $branches = array('names' => array($constraint->getVersion()), 'exclude' => \true); } elseif ($op === '==') { $branches['names'][] = $constraint->getVersion(); } return array('numeric' => $intervals, 'branches' => $branches); } if ($op[0] === '>') { // > & >= return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev()); } if ($op[0] === '<') { // < & <= return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev()); } if ($op === '!=') { // convert !=x to intervals of 0 - x - +inf + dev* return array('numeric' => array(new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())), new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); } // convert ==x to an interval of >=x - <=x return array('numeric' => array(new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion()))), 'branches' => Interval::noDev()); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _PHPStan_8c66d8255\Composer\CaBundle; use _PHPStan_8c66d8255\Psr\Log\LoggerInterface; use _PHPStan_8c66d8255\Symfony\Component\Process\PhpProcess; /** * @author Chris Smith * @author Jordi Boggiano */ class CaBundle { /** @var string|null */ private static $caPath; /** @var array */ private static $caFileValidity = array(); /** * Returns the system CA bundle path, or a path to the bundled one * * This method was adapted from Sslurp. * https://github.com/EvanDotPro/Sslurp * * (c) Evan Coury * * For the full copyright and license information, please see below: * * Copyright (c) 2013, Evan Coury * 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. * * 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. * * @param LoggerInterface $logger optional logger for information about which CA files were loaded * @return string path to a CA bundle file or directory */ public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null) { if (self::$caPath !== null) { return self::$caPath; } $caBundlePaths = array(); // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE'); // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR'); $caBundlePaths[] = \ini_get('openssl.cafile'); $caBundlePaths[] = \ini_get('openssl.capath'); $otherLocations = array( '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package) '/usr/ssl/certs/ca-bundle.crt', // Cygwin '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? '/etc/ssl/cert.pem', // OpenBSD '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package '/opt/homebrew/etc/openssl@1.1/cert.pem', ); foreach ($otherLocations as $location) { $otherLocations[] = \dirname($location); } $caBundlePaths = \array_merge($caBundlePaths, $otherLocations); foreach ($caBundlePaths as $caBundle) { if ($caBundle && self::caFileUsable($caBundle, $logger)) { return self::$caPath = $caBundle; } if ($caBundle && self::caDirUsable($caBundle, $logger)) { return self::$caPath = $caBundle; } } return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort } /** * Returns the path to the bundled CA file * * In case you don't want to trust the user or the system, you can use this directly * * @return string path to a CA bundle file */ public static function getBundledCaBundlePath() { $caBundleFile = __DIR__ . '/../res/cacert.pem'; // cURL does not understand 'phar://' paths // see https://github.com/composer/ca-bundle/issues/10 if (0 === \strpos($caBundleFile, 'phar://')) { $tempCaBundleFile = \tempnam(\sys_get_temp_dir(), 'openssl-ca-bundle-'); if (\false === $tempCaBundleFile) { throw new \RuntimeException('Could not create a temporary file to store the bundled CA file'); } \file_put_contents($tempCaBundleFile, \file_get_contents($caBundleFile)); \register_shutdown_function(function () use($tempCaBundleFile) { @\unlink($tempCaBundleFile); }); $caBundleFile = $tempCaBundleFile; } return $caBundleFile; } /** * Validates a CA file using opensl_x509_parse only if it is safe to use * * @param string $filename * @param LoggerInterface $logger optional logger for information about which CA files were loaded * * @return bool */ public static function validateCaFile($filename, ?LoggerInterface $logger = null) { static $warned = \false; if (isset(self::$caFileValidity[$filename])) { return self::$caFileValidity[$filename]; } $contents = \file_get_contents($filename); if (\is_string($contents) && \strlen($contents) > 0) { $contents = \preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents); if (null === $contents) { // regex extraction failed $isValid = \false; } else { $isValid = (bool) \openssl_x509_parse($contents); } } else { $isValid = \false; } if ($logger) { $logger->debug('Checked CA file ' . \realpath($filename) . ': ' . ($isValid ? 'valid' : 'invalid')); } return self::$caFileValidity[$filename] = $isValid; } /** * Test if it is safe to use the PHP function openssl_x509_parse(). * * This checks if OpenSSL extensions is vulnerable to remote code execution * via the exploit documented as CVE-2013-6420. * * @return bool */ public static function isOpensslParseSafe() { return \true; } /** * Resets the static caches * @return void */ public static function reset() { self::$caFileValidity = array(); self::$caPath = null; } /** * @param string $name * @return string|false */ private static function getEnvVariable($name) { if (isset($_SERVER[$name])) { return (string) $_SERVER[$name]; } if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== \false && $value !== null) { return (string) $value; } return \false; } /** * @param string|false $certFile * @param LoggerInterface|null $logger * @return bool */ private static function caFileUsable($certFile, ?LoggerInterface $logger = null) { return $certFile && self::isFile($certFile, $logger) && self::isReadable($certFile, $logger) && self::validateCaFile($certFile, $logger); } /** * @param string|false $certDir * @param LoggerInterface|null $logger * @return bool */ private static function caDirUsable($certDir, ?LoggerInterface $logger = null) { return $certDir && self::isDir($certDir, $logger) && self::isReadable($certDir, $logger) && self::glob($certDir . '/*', $logger); } /** * @param string $certFile * @param LoggerInterface|null $logger * @return bool */ private static function isFile($certFile, ?LoggerInterface $logger = null) { $isFile = @\is_file($certFile); if (!$isFile && $logger) { $logger->debug(\sprintf('Checked CA file %s does not exist or it is not a file.', $certFile)); } return $isFile; } /** * @param string $certDir * @param LoggerInterface|null $logger * @return bool */ private static function isDir($certDir, ?LoggerInterface $logger = null) { $isDir = @\is_dir($certDir); if (!$isDir && $logger) { $logger->debug(\sprintf('Checked directory %s does not exist or it is not a directory.', $certDir)); } return $isDir; } /** * @param string $certFileOrDir * @param LoggerInterface|null $logger * @return bool */ private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null) { $isReadable = @\is_readable($certFileOrDir); if (!$isReadable && $logger) { $logger->debug(\sprintf('Checked file or directory %s is not readable.', $certFileOrDir)); } return $isReadable; } /** * @param string $pattern * @param LoggerInterface|null $logger * @return bool */ private static function glob($pattern, ?LoggerInterface $logger = null) { $certs = \glob($pattern); if ($certs === \false) { if ($logger) { $logger->debug(\sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern)); } return \false; } if (\count($certs) === 0) { if ($logger) { $logger->debug(\sprintf("No CA files found for pattern: %s", $pattern)); } return \false; } return \true; } } value pairs in increasing key order, but not necessarily continuous. * @return float the predicted value. This will be a class label in the case of classification, a real value in the case of regression. Throws SVMException on error * @throws SVMException Throws SVMException on error * @link https://www.php.net/manual/en/svmmodel.predict-probability.php */ public function predict_probability(array $data): float {} /** * Predict a value for previously unseen data * * This function accepts an array of data and attempts to predict the class or regression value based on the model extracted from previously trained data. * @param array $data The array to be classified. This should be a series of key => value pairs in increasing key order, but not necessarily continuous. * @return float the predicted value. This will be a class label in the case of classification, a real value in the case of regression. Throws SVMException on error * @throws SVMException Throws SVMException on error * @link https://www.php.net/manual/en/svmmodel.predict.php */ public function predict(array $data): float {} /** * Save a model to a file, for later use * @param string $filename The file to save the model to. * @return bool Throws SVMException on error. Returns true on success. * @throws SVMException Throws SVMException on error * @link https://www.php.net/manual/en/svmmodel.save.php */ public function save(string $filename): bool {} } data pairs. A URL to a file containing a SVM Light formatted problem, with the each line being a new training example, the start of each line containing the class (1, -1) then a series of tab separated data values shows as key:value. A opened stream pointing to a data source formatted as in the file above. * @param array|null $weights Weights are an optional set of weighting parameters for the different classes, to help account for unbalanced training sets. For example, if the classes were 1 and -1, and -1 had significantly more example than one, the weight for -1 could be 0.5. Weights should be in the range 0-1. * @return SVMModel Returns an SVMModel that can be used to classify previously unseen data. Throws SVMException on error * @throws SMVException * @link https://www.php.net/manual/en/svm.train.php */ public function train(array $problem, array $weights = null): SVMModel {} } amqp.host The host to connect too. Note: Max 1024 characters. * 'port' => amqp.port Port on the host. * 'vhost' => amqp.vhost The virtual host on the host. Note: Max 128 characters. * 'login' => amqp.login The login name to use. Note: Max 128 characters. * 'password' => amqp.password Password. Note: Max 128 characters. * 'read_timeout' => Timeout in for income activity. Note: 0 or greater seconds. May be fractional. * 'write_timeout' => Timeout in for outcome activity. Note: 0 or greater seconds. May be fractional. * 'connect_timeout' => Connection timeout. Note: 0 or greater seconds. May be fractional. * 'rpc_timeout' => RPC timeout. Note: 0 or greater seconds. May be fractional. * * Connection tuning options (see http://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune for details): * 'channel_max' => Specifies highest channel number that the server permits. 0 means standard extension limit * (see PHP_AMQP_MAX_CHANNELS constant) * 'frame_max' => The largest frame size that the server proposes for the connection, including frame header * and end-byte. 0 means standard extension limit (depends on librabbimq default frame size limit) * 'heartbeat' => The delay, in seconds, of the connection heartbeat that the server wants. * 0 means the server does not want a heartbeat. Note, librabbitmq has limited heartbeat support, * which means heartbeats checked only during blocking calls. * * TLS support (see https://www.rabbitmq.com/ssl.html for details): * 'cacert' => Path to the CA cert file in PEM format.. * 'cert' => Path to the client certificate in PEM foramt. * 'key' => Path to the client key in PEM format. * 'verify' => Enable or disable peer verification. If peer verification is enabled then the common name in the * server certificate must match the server name. Peer verification is enabled by default. * * 'connection_name' => A user determined name for the connection * ) * * @param array $credentials Optional array of credential information for * connecting to the AMQP broker. */ public function __construct(array $credentials = []) {} /** * Check whether the connection to the AMQP broker is still valid. * * Cannot reliably detect dropped connections or unusual socket errors, as it does not actively * engage the socket. * * @return bool TRUE if connected, FALSE otherwise. */ public function isConnected() {} /** * Whether connection persistent. * * When no connection is established, it will always return FALSE. The same disclaimer as for * {@see AMQPConnection::isConnected()} applies. * * @return bool TRUE if persistently connected, FALSE otherwise. */ public function isPersistent() {} /** * Establish a transient connection with the AMQP broker. * * This method will initiate a connection with the AMQP broker. * * @throws AMQPConnectionException * @return void */ public function connect() {} /** * Closes the transient connection with the AMQP broker. * * This method will close an open connection with the AMQP broker. * * @throws AMQPConnectionException When attempting to disconnect a persistent connection * * @return void */ public function disconnect() {} /** * Close any open transient connections and initiate a new one with the AMQP broker. * * @return void */ public function reconnect() {} /** * Establish a persistent connection with the AMQP broker. * * This method will initiate a connection with the AMQP broker * or reuse an existing one if present. * * @throws AMQPConnectionException * @return void */ public function pconnect() {} /** * Closes a persistent connection with the AMQP broker. * * This method will close an open persistent connection with the AMQP * broker. * * @throws AMQPConnectionException When attempting to disconnect a transient connection * * @return void */ public function pdisconnect() {} /** * Close any open persistent connections and initiate a new one with the AMQP broker. * * @throws AMQPConnectionException * * @return void */ public function preconnect() {} /** * Get the configured host. * * @return string The configured hostname of the broker */ public function getHost() {} /** * Get the configured login. * * @return string The configured login as a string. */ public function getLogin() {} /** * Get the configured password. * * @return string The configured password as a string. */ public function getPassword() {} /** * Get the configured port. * * @return int The configured port as an integer. */ public function getPort() {} /** * Get the configured vhost. * * @return string The configured virtual host as a string. */ public function getVhost() {} /** * Set the hostname used to connect to the AMQP broker. * * @param string $host The hostname of the AMQP broker. * * @throws AMQPConnectionException If host is longer then 1024 characters. * * @return void */ public function setHost($host) {} /** * Set the login string used to connect to the AMQP broker. * * @param string $login The login string used to authenticate * with the AMQP broker. * * @throws AMQPConnectionException If login is longer then 32 characters. * * @return void */ public function setLogin($login) {} /** * Set the password string used to connect to the AMQP broker. * * @param string $password The password string used to authenticate * with the AMQP broker. * * @throws AMQPConnectionException If password is longer then 32characters. * * @return void */ public function setPassword($password) {} /** * Set the port used to connect to the AMQP broker. * * @param int $port The port used to connect to the AMQP broker. * * @throws AMQPConnectionException If port is longer not between * 1 and 65535. * * @return void */ public function setPort($port) {} /** * Sets the virtual host to which to connect on the AMQP broker. * * @param string $vhost The virtual host to use on the AMQP * broker. * * @throws AMQPConnectionException If host is longer then 32 characters. * * @return void */ public function setVhost($vhost) {} /** * Sets the interval of time to wait for income activity from AMQP broker * * @deprecated use AMQPConnection::setReadTimeout($timeout) instead * * @param float $timeout * * @throws AMQPConnectionException If timeout is less than 0. * * @return void */ #[Deprecated(replacement: "%class%->setReadTimout(%parameter0%)")] public function setTimeout($timeout) {} /** * Get the configured interval of time to wait for income activity * from AMQP broker * * @deprecated use AMQPConnection::getReadTimeout() instead * * @return float */ #[Deprecated(replacement: '%class%->getReadTimout(%parameter0%)')] public function getTimeout() {} /** * Sets the interval of time to wait for income activity from AMQP broker * * @param float $timeout * * @throws AMQPConnectionException If timeout is less than 0. * * @return void */ public function setReadTimeout($timeout) {} /** * Get the configured interval of time to wait for income activity * from AMQP broker * * @return float */ public function getReadTimeout() {} /** * Sets the interval of time to wait for outcome activity to AMQP broker * * @param float $timeout * * @throws AMQPConnectionException If timeout is less than 0. * * @return void */ public function setWriteTimeout($timeout) {} /** * Get the configured interval of time to wait for outcome activity * to AMQP broker * * @return float */ public function getWriteTimeout() {} /** * Get the configured timeout (in seconds) for connecting to the AMQP broker */ public function getConnectTimeout(): float {} /** * Sets the interval of time to wait for RPC activity to AMQP broker * * @param float $timeout * * @throws AMQPConnectionException If timeout is less than 0. * * @return void */ public function setRpcTimeout($timeout) {} /** * Get the configured interval of time to wait for RPC activity * to AMQP broker * * @return float */ public function getRpcTimeout() {} /** * Return last used channel id during current connection session. * * @return int */ public function getUsedChannels() {} /** * Get the maximum number of channels the connection can handle. * * When connection is connected, effective connection value returned, which is normally the same as original * correspondent value passed to constructor, otherwise original value passed to constructor returned. * * @return int */ public function getMaxChannels() {} /** * Get max supported frame size per connection in bytes. * * When connection is connected, effective connection value returned, which is normally the same as original * correspondent value passed to constructor, otherwise original value passed to constructor returned. * * @return int */ public function getMaxFrameSize() {} /** * Get number of seconds between heartbeats of the connection in seconds. * * When connection is connected, effective connection value returned, which is normally the same as original * correspondent value passed to constructor, otherwise original value passed to constructor returned. * * @return int */ public function getHeartbeatInterval() {} /** * Get path to the CA cert file in PEM format * * @return string|null */ public function getCACert() {} /** * Set path to the CA cert file in PEM format * * @param string $cacert * * @return void */ public function setCACert($cacert) {} /** * Get path to the client certificate in PEM format * * @return string|null */ public function getCert() {} /** * Set path to the client certificate in PEM format * * @param string $cert * * @return void */ public function setCert($cert) {} /** * Get path to the client key in PEM format * * @return string|null */ public function getKey() {} /** * Set path to the client key in PEM format * * @param string|null $key * * @return void */ public function setKey($key) {} /** * Get whether peer verification enabled or disabled * * @return bool */ public function getVerify() {} /** * Enable or disable peer verification * * @param bool $verify * * @return void */ public function setVerify($verify) {} /** * set authentication method * * @param int $saslMethod AMQP_SASL_METHOD_PLAIN | AMQP_SASL_METHOD_EXTERNAL * * @return void */ public function setSaslMethod($method) {} /** * Get authentication mechanism configuration * * @return int AMQP_SASL_METHOD_PLAIN | AMQP_SASL_METHOD_EXTERNAL */ public function getSaslMethod() {} public function setConnectionName(?string $connectionName): void {} public function getConnectionName(): ?string {} } /** * stub class representing AMQPConnectionException from pecl-amqp */ class AMQPConnectionException extends AMQPException {} /** * Interface representing AMQP values */ interface AMQPValue { public function toAmqpValue(): float|array|AMQPDecimal|bool|int|AMQPValue|string|AMQPTimestamp|null; } /** * stub class representing AMQPDecimal from pecl-amqp */ final /* readonly */ class AMQPDecimal implements AMQPValue { public const EXPONENT_MIN = 0; public const EXPONENT_MAX = 255; public const SIGNIFICAND_MIN = 0; public const SIGNIFICAND_MAX = 4294967295; /** * @param $exponent * @param $significand * * @throws AMQPExchangeValue */ public function __construct($exponent, $significand) {} /** @return int */ public function getExponent() {} /** @return int */ public function getSignificand() {} public function toAmqpValue(): float|array|AMQPDecimal|bool|int|AMQPValue|string|AMQPTimestamp|null {} } /** * stub class representing AMQPEnvelope from pecl-amqp */ class AMQPEnvelope extends AMQPBasicProperties { /** * Get the body of the message. * * @return string The contents of the message body. */ public function getBody() {} /** * Get the routing key of the message. * * @return string The message routing key. */ public function getRoutingKey() {} /** * Get the consumer tag of the message. * * @return string|null The consumer tag of the message. */ public function getConsumerTag() {} /** * Get the delivery tag of the message. * * @return int|null The delivery tag of the message. */ public function getDeliveryTag() {} /** * Get the exchange name on which the message was published. * * @return string|null The exchange name on which the message was published. */ public function getExchangeName() {} /** * Whether this is a redelivery of the message. * * Whether this is a redelivery of a message. If this message has been * delivered and AMQPEnvelope::nack() was called, the message will be put * back on the queue to be redelivered, at which point the message will * always return TRUE when this method is called. * * @return bool TRUE if this is a redelivery, FALSE otherwise. */ public function isRedelivery() {} /** * Get a specific message header. * * @param string $headerName Name of the header to get the value from. * * @return mixed The contents of the specified header or null if not set. */ public function getHeader($headerName) {} /** * Check whether specific message header exists. * * @param string $headerName Name of the header to check. * * @return bool */ public function hasHeader($headerName) {} } /** * stub class representing AMQPEnvelopeException from pecl-amqp */ class AMQPEnvelopeException extends AMQPException { public function getEnvelope(): AMQPEnvelope {} } /** * stub class representing AMQPException from pecl-amqp */ class AMQPException extends Exception {} /** * stub class representing AMQPExchange from pecl-amqp */ class AMQPExchange { /** * Create an instance of AMQPExchange. * * Returns a new instance of an AMQPExchange object, associated with the * given AMQPChannel object. * * @param AMQPChannel $channel A valid AMQPChannel object, connected * to a broker. * * @throws AMQPExchangeException When amqp_channel is not connected to * a broker. * @throws AMQPConnectionException If the connection to the broker was * lost. */ public function __construct(AMQPChannel $channel) {} /** * Bind to another exchange. * * Bind an exchange to another exchange using the specified routing key. * * @param string $exchangeName Name of the exchange to bind. * @param string $routingKey The routing key to use for binding. * @param array $arguments Additional binding arguments. * * @throws AMQPExchangeException On failure. * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function bind($exchangeName, $routingKey = '', array $arguments = []) {} /** * Remove binding to another exchange. * * Remove a routing key binding on an another exchange from the given exchange. * * @param string $exchangeName Name of the exchange to bind. * @param string $routingKey The routing key to use for binding. * @param array $arguments Additional binding arguments. * * @throws AMQPExchangeException On failure. * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function unbind($exchangeName, $routingKey = '', array $arguments = []) {} /** * Declare a new exchange on the broker. * * @throws AMQPExchangeException On failure. * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function declareExchange() {} /** * Declare a new exchange on the broker. * * @throws AMQPExchangeException On failure. * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function declare(): void {} /** * Delete the exchange from the broker. * * @param string $exchangeName Optional name of exchange to delete. * @param int $flags Optionally AMQP_IFUNUSED can be specified * to indicate the exchange should not be * deleted until no clients are connected to * it. * * @throws AMQPExchangeException On failure. * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function delete($exchangeName = null, $flags = AMQP_NOPARAM) {} /** * Get the argument associated with the given key. * Get the argument associated with the given key. * * @param string $argumentName The key to look up. * * @throws AMQPExchangeException If key does not exist * * @return bool|int|float|string|null */ public function getArgument($argumentName) {} /** * Check whether argument associated with the given key exists. * * @param string $argumentName The key to look up. * * @return bool */ public function hasArgument($argumentName) {} /** * Get all arguments set on the given exchange. * * @return array An array containing all of the set key/value pairs. */ public function getArguments() {} /** * Get all the flags currently set on the given exchange. * * @return int An integer bitmask of all the flags currently set on this * exchange object. */ public function getFlags() {} /** * Get the configured name. * * @return string|null The configured name as a string. */ public function getName() {} /** * Get the configured type. * * @return string|null The configured type as a string. */ public function getType() {} /** * Publish a message to an exchange. * * Publish a message to the exchange represented by the AMQPExchange object. * * @param string $message The message to publish. * @param string|null $routingKey The optional routing key to which to * publish to. * @param int|null $flags One or more of AMQP_MANDATORY and * AMQP_IMMEDIATE. * @param array $headers One of content_type, content_encoding, * message_id, user_id, app_id, delivery_mode, * priority, timestamp, expiration, type * or reply_to, headers. * * @throws AMQPExchangeException On failure. * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function publish( $message, $routingKey = null, $flags = null, array $headers = [] ) {} /** * Set the value for the given key. * * @param string $argumentName Name of the argument to set. * @param string|int $argumentValue Value of the argument to set. * * @return void */ public function setArgument($argumentName, $argumentValue) {} /** * Set the value for the given key. * * @param string $argumentName Name of the argument to remove. */ public function removeArgument(string $argumentName): void {} /** * Set all arguments on the exchange. * * @param array $arguments An array of key/value pairs of arguments. * * @return bool TRUE on success or FALSE on failure. */ public function setArguments(array $arguments) {} /** * Set the flags on an exchange. * * @param int|null $flags A bitmask of flags. This call currently only * considers the following flags: * AMQP_DURABLE, AMQP_PASSIVE * (and AMQP_DURABLE, if librabbitmq version >= 0.5.3) * * @return void */ public function setFlags($flags) {} /** * Set the name of the exchange. * * @param string $exchangeName The name of the exchange to set as string. * * @return void */ public function setName($exchangeName) {} /** * Set the type of the exchange. * * Set the type of the exchange. This can be any of AMQP_EX_TYPE_DIRECT, * AMQP_EX_TYPE_FANOUT, AMQP_EX_TYPE_HEADERS or AMQP_EX_TYPE_TOPIC. * * @param string $exchangeType The type of exchange as a string. * * @return void */ public function setType($exchangeType) {} /** * Get the AMQPChannel object in use * * @return AMQPChannel */ public function getChannel() {} /** * Get the AMQPConnection object in use * * @return AMQPConnection */ public function getConnection() {} } /** * stub class representing AMQPExchangeException from pecl-amqp */ class AMQPExchangeException extends AMQPException {} /** * stub class representing AMQPQueue from pecl-amqp */ class AMQPQueue { /** * Create an instance of an AMQPQueue object. * * @param AMQPChannel $channel The amqp channel to use. * * @throws AMQPQueueException When amqp_channel is not connected to a * broker. * @throws AMQPConnectionException If the connection to the broker was lost. */ public function __construct(AMQPChannel $channel) {} /** * Acknowledge the receipt of a message. * * This method allows the acknowledgement of a message that is retrieved * without the AMQP_AUTOACK flag through AMQPQueue::get() or * AMQPQueue::consume() * * @param int $deliveryTag The message delivery tag of which to * acknowledge receipt. * @param int|null $flags The only valid flag that can be passed is * AMQP_MULTIPLE. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return void */ public function ack($deliveryTag, $flags = null) {} /** * Bind the given queue to a routing key on an exchange. * * @param string $exchangeName Name of the exchange to bind to. * @param string|null $routingKey Pattern or routing key to bind with. * @param array $arguments Additional binding arguments. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return bool */ public function bind($exchangeName, $routingKey = null, array $arguments = []) {} /** * Cancel a queue that is already bound to an exchange and routing key. * * @param string $consumer_tag The consumer tag cancel. If no tag provided, * or it is empty string, the latest consumer * tag on this queue will be used and after * successful request it will set to null. * If it also empty, no `basic.cancel` * request will be sent. When consumer_tag give * and it equals to latest consumer_tag on queue, * it will be interpreted as latest consumer_tag usage. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return bool */ public function cancel($consumer_tag = '') {} /** * Consume messages from a queue. * * Blocking function that will retrieve the next message from the queue as * it becomes available and will pass it off to the callback. * * @param callable|null $callback A callback function to which the * consumed message will be passed. The * function must accept at a minimum * one parameter, an AMQPEnvelope object, * and an optional second parameter * the AMQPQueue object from which callback * was invoked. The AMQPQueue::consume() will * not return the processing thread back to * the PHP script until the callback * function returns FALSE. * If the callback is omitted or null is passed, * then the messages delivered to this client will * be made available to the first real callback * registered. That allows one to have a single * callback consuming from multiple queues. * @param int|null $flags A bitmask of any of the flags: AMQP_AUTOACK, * AMQP_JUST_CONSUME. Note: when AMQP_JUST_CONSUME * flag used all other flags are ignored and * $consumerTag parameter has no sense. * AMQP_JUST_CONSUME flag prevent from sending * `basic.consume` request and just run $callback * if it provided. Calling method with empty $callback * and AMQP_JUST_CONSUME makes no sense. * @param string|null $consumerTag A string describing this consumer. Used * for canceling subscriptions with cancel(). * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * @throws AMQPEnvelopeException When no queue found for envelope. * @throws AMQPQueueException If timeout occurs or queue is not exists. * * @return void */ public function consume( callable $callback = null, $flags = null, $consumerTag = null ) {} /** * Declare a new queue on the broker. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * @throws AMQPQueueException On failure. * * @return int the message count. */ public function declareQueue() {} /** * Declare a new queue on the broker. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * @throws AMQPQueueException On failure. * * @return int the message count. */ public function declare(): int {} /** * Delete a queue from the broker. * * This includes its entire contents of unread or unacknowledged messages. * * @param int $flags Optionally AMQP_IFUNUSED can be specified * to indicate the queue should not be * deleted until no clients are connected to * it. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return int The number of deleted messages. */ public function delete($flags = AMQP_NOPARAM) {} /** * Retrieve the next message from the queue. * * Retrieve the next available message from the queue. If no messages are * present in the queue, this function will return NULL immediately. This * is a non blocking alternative to the AMQPQueue::consume() method. * Currently, the only supported flag for the flags parameter is * AMQP_AUTOACK. If this flag is passed in, then the message returned will * automatically be marked as acknowledged by the broker as soon as the * frames are sent to the client. * * @param int $flags A bitmask of supported flags for the * method call. Currently, the only the * supported flag is AMQP_AUTOACK. If this * value is not provided, it will use the * value of ini-setting amqp.auto_ack. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * @throws AMQPQueueException If queue is not exist. * * @return AMQPEnvelope|null */ public function get($flags = null) {} /** * Get all the flags currently set on the given queue. * * @return int An integer bitmask of all the flags currently set on this * exchange object. */ public function getFlags(): int {} /** * Get the configured name. * * @return string|null The configured name as a string. */ public function getName(): ?string {} /** * Mark a message as explicitly not acknowledged. * * Mark the message identified by delivery_tag as explicitly not * acknowledged. This method can only be called on messages that have not * yet been acknowledged, meaning that messages retrieved with by * AMQPQueue::consume() and AMQPQueue::get() and using the AMQP_AUTOACK * flag are not eligible. When called, the broker will immediately put the * message back onto the queue, instead of waiting until the connection is * closed. This method is only supported by the RabbitMQ broker. The * behavior of calling this method while connected to any other broker is * undefined. * * @param int $deliveryTag Delivery tag of last message to reject. * @param int $flags AMQP_REQUEUE to requeue the message(s), * AMQP_MULTIPLE to nack all previous * unacked messages as well. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return bool */ public function nack($deliveryTag, $flags = AMQP_NOPARAM) {} /** * Mark one message as explicitly not acknowledged. * * Mark the message identified by delivery_tag as explicitly not * acknowledged. This method can only be called on messages that have not * yet been acknowledged, meaning that messages retrieved with by * AMQPQueue::consume() and AMQPQueue::get() and using the AMQP_AUTOACK * flag are not eligible. * * @param int $deliveryTag Delivery tag of the message to reject. * @param int|null $flags AMQP_REQUEUE to requeue the message(s). * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return bool */ public function reject($deliveryTag, $flags = null) {} /** * Recover unacknowledged messages delivered to the current consumer. * * Recover all the unacknowledged messages delivered to the current consumer. * If $requeue is true, the broker can redeliver the messages to different * consumers. If $requeue is FALSE, it can only redeliver it to the current * consumer. RabbitMQ does not implement $request = false. * This method exposes `basic.recover` from the AMQP spec. * * @param bool $requeue If TRUE, deliver to any consumer, if FALSE, deliver to the current consumer only * @throws AMQPConnectionException If the connection to the broker was lost. * @throws AMQPChannelException If the channel is not open. */ public function recover(bool $requeue = true): void {} /** * Purge the contents of a queue. * * Returns the number of purged messages * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return int */ public function purge() {} /** * Get the argument associated with the given key. * * @param string $argumentName The key to look up. * @throws AMQPQueueException If key does not exist * @return bool|int|float|string|null|array|AMQPValue|AMQPDecimal|AMQPTimestamp */ public function getArgument($argumentName) {} /** * Set a queue argument. * * @param string $argumentName The key to set. * @param bool|int|float|string|null|array|AMQPValue|AMQPDecimal|AMQPTimestamp $argumentValue The argument value to set. * * @return void */ public function setArgument(string $argumentName, $argumentValue) {} /** * Set a queue argument. * * @param string $argumentName The argument name to set. */ public function removeArgument(string $argumentName): void {} /** * Set all arguments on the given queue. * * All other argument settings will be wiped. * * @param array $arguments An array of name/value pairs of arguments. */ public function setArguments(array $arguments): void {} /** * Get all set arguments as an array of key/value pairs. * * @return array An array containing all the set key/value pairs. */ public function getArguments(): array {} /** * Check whether a queue has specific argument. * * @param string $argumentName The argument name to check. * * @return bool */ public function hasArgument(string $argumentName): bool {} /** * Set the flags on the queue. * * @param int|null $flags A bitmask of flags: * AMQP_DURABLE, AMQP_PASSIVE, * AMQP_EXCLUSIVE, AMQP_AUTODELETE. * * @return bool */ public function setFlags($flags = null) {} /** * Set the queue name. * * @param string $name The name of the queue. * * @return bool */ public function setName($name) {} /** * Remove a routing key binding on an exchange from the given queue. * * @param string $exchangeName The name of the exchange on which the * queue is bound. * @param string|null $routingKey The binding routing key used by the * queue. * @param array $arguments Additional binding arguments. * * @throws AMQPChannelException If the channel is not open. * @throws AMQPConnectionException If the connection to the broker was lost. * * @return bool */ public function unbind($exchangeName, $routingKey = null, array $arguments = []) {} /** * Get the AMQPChannel object in use * * @return AMQPChannel */ public function getChannel() {} /** * Get the AMQPConnection object in use * * @return AMQPConnection */ public function getConnection() {} /** * Get latest consumer tag. If no consumer available or the latest on was canceled null will be returned. * * @return string|null */ public function getConsumerTag() {} } /** * stub class representing AMQPQueueException from pecl-amqp */ class AMQPQueueException extends AMQPException {} class AMQPValueException extends AMQPException {} /** * stub class representing AMQPTimestamp from pecl-amqp */ final /* readonly */ class AMQPTimestamp implements AMQPValue { public const MIN = 0.0; public const MAX = 18446744073709551616; /** * @throws AMQPValueException */ public function __construct(float $timestamp) {} public function __toString(): string {} public function getTimestamp(): float {} public function toAmqpValue(): float|array|AMQPDecimal|bool|int|AMQPValue|string|AMQPTimestamp|null {} } /** * stub class representing AMQPExchangeValue from pecl-amqp */ class AMQPExchangeValue extends AMQPException {} * create a new broker object capable of requesting * @link https://php.net/manual/en/function.enchant-broker-init.php * @return resource|false|EnchantBroker a broker resource on success or FALSE. */ function enchant_broker_init() {} /** * Free the broker resource and its dictionaries * @link https://php.net/manual/en/function.enchant-broker-free.php * @param resource|EnchantBroker $broker

* Broker resource *

* @return bool TRUE on success or FALSE on failure. * @since 5.3 */ #[Deprecated(reason: "Unset the object instead", since: '8.0')] function enchant_broker_free($broker) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Returns the last error of the broker * @link https://php.net/manual/en/function.enchant-broker-get-error.php * @param resource|EnchantBroker $broker

* Broker resource. *

* @return string|false Return the msg string if an error was found or FALSE */ function enchant_broker_get_error($broker) {} /** * Set the directory path for a given backend * @link https://www.php.net/manual/en/function.enchant-broker-set-dict-path.php * @param resource|EnchantBroker $broker * @param int $dict_type * @param string $value * @return bool TRUE on success or FALSE on failure. */ #[Deprecated(since: '8.0', reason: 'Relying on this function is highly discouraged.')] function enchant_broker_set_dict_path($broker, int $dict_type, string $value) {} /** * Get the directory path for a given backend * @link https://www.php.net/manual/en/function.enchant-broker-get-dict-path.php * @param resource|EnchantBroker $broker * @param int $dict_type * @return string|false */ #[Deprecated(since: '8.0', reason: 'Relying on this function is highly discouraged.')] function enchant_broker_get_dict_path($broker, $dict_type) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 1.0.1)
* Returns a list of available dictionaries * @link https://php.net/manual/en/function.enchant-broker-list-dicts.php * @param resource|EnchantBroker $broker

* Broker resource *

* @return array Returns an array of available dictionaries with their details. */ function enchant_broker_list_dicts($broker) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* create a new dictionary using a tag * @link https://php.net/manual/en/function.enchant-broker-request-dict.php * @param resource|EnchantBroker $broker

* Broker resource *

* @param string $tag

* A tag describing the locale, for example en_US, de_DE *

* @return resource|false|EnchantDictionary a dictionary resource on success or FALSE on failure. */ function enchant_broker_request_dict($broker, $tag) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* creates a dictionary using a PWL file * @link https://php.net/manual/en/function.enchant-broker-request-pwl-dict.php * @param resource|EnchantBroker $broker

* Broker resource *

* @param string $filename

* Path to the PWL file. *

* @return resource|false|EnchantDictionary a dictionary resource on success or FALSE on failure. */ function enchant_broker_request_pwl_dict($broker, $filename) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Free a dictionary resource * @link https://php.net/manual/en/function.enchant-broker-free-dict.php * @param resource|EnchantDictionary $dict

* Dictionary resource. *

* @return bool TRUE on success or FALSE on failure. */ #[Deprecated("Unset the object instead", since: '8.0')] function enchant_broker_free_dict($dict) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Whether a dictionary exists or not. Using non-empty tag * @link https://php.net/manual/en/function.enchant-broker-dict-exists.php * @param resource|EnchantBroker $broker

* Broker resource *

* @param string $tag

* non-empty tag in the LOCALE format, ex: us_US, ch_DE, etc. *

* @return bool TRUE when the tag exist or FALSE when not. */ function enchant_broker_dict_exists($broker, $tag) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Declares a preference of dictionaries to use for the language * @link https://php.net/manual/en/function.enchant-broker-set-ordering.php * @param resource|EnchantBroker $broker

* Broker resource *

* @param string $tag

* Language tag. The special "*" tag can be used as a language tag * to declare a default ordering for any language that does not * explicitly declare an ordering. *

* @param string $ordering

* Comma delimited list of provider names *

* @return bool TRUE on success or FALSE on failure. */ function enchant_broker_set_ordering($broker, $tag, $ordering) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0)
* Enumerates the Enchant providers * @link https://php.net/manual/en/function.enchant-broker-describe.php * @param resource|EnchantBroker $broker

* Broker resource *

* @return array|false */ function enchant_broker_describe($broker) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Check whether a word is correctly spelled or not * @link https://php.net/manual/en/function.enchant-dict-check.php * @param resource|EnchantDictionary $dict

* Dictionary resource *

* @param string $word

* The word to check *

* @return bool TRUE if the word is spelled correctly, FALSE if not. */ function enchant_dict_check($dict, $word) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Will return a list of values if any of those pre-conditions are not met * @link https://php.net/manual/en/function.enchant-dict-suggest.php * @param resource|EnchantDictionary $dict

* Dictionary resource *

* @param string $word

* Word to use for the suggestions. *

* @return array|false Will returns an array of suggestions if the word is bad spelled. */ function enchant_dict_suggest($dict, $word) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* add a word to personal word list * @link https://php.net/manual/en/function.enchant-dict-add-to-personal.php * @param resource $dict

* Dictionary resource *

* @param string $word

* The word to add *

* @return void * @see enchant_dict_add() */ #[Deprecated( reason: 'Use enchant_dict_add instead', replacement: 'enchant_dict_add(%parameter0%, %parameter1%)', since: '8.0' )] function enchant_dict_add_to_personal($dict, $word) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* add 'word' to this spell-checking session * @link https://php.net/manual/en/function.enchant-dict-add-to-session.php * @param resource|EnchantDictionary $dict

* Dictionary resource *

* @param string $word

* The word to add *

* @return void */ function enchant_dict_add_to_session($dict, $word) {} /** * (PHP 8)
* Add a word to personal word list * @link https://php.net/manual/en/function.enchant-dict-add.php * @param EnchantDictionary $dictionary

* An Enchant dictionary returned by enchant_broker_request_dict() or enchant_broker_request_pwl_dict(). *

* @param string $word

* The word to add *

* @return void * @since 8.0 */ function enchant_dict_add($dictionary, $word) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* whether or not 'word' exists in this spelling-session * @link https://php.net/manual/en/function.enchant-dict-is-in-session.php * @param resource $dict

* Dictionary resource *

* @param string $word

* The word to lookup *

* @return bool TRUE if the word exists or FALSE * @see enchant_dict_is_added */ #[Deprecated( reason: 'Use enchant_dict_is_added instead', replacement: 'enchant_dict_is_added(%parameter0%, %parameter1%)', since: '8.0' )] function enchant_dict_is_in_session($dict, $word) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Add a correction for a word * @link https://php.net/manual/en/function.enchant-dict-store-replacement.php * @param resource|EnchantDictionary $dict

* Dictionary resource *

* @param string $mis

* The work to fix *

* @param string $cor

* The correct word *

* @return void */ function enchant_dict_store_replacement($dict, $mis, $cor) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Returns the last error of the current spelling-session * @link https://php.net/manual/en/function.enchant-dict-get-error.php * @param resource|EnchantDictionary $dict

* Dictinaray resource *

* @return string|false the error message as string or FALSE if no error occurred. */ function enchant_dict_get_error($dict) {} /** * (PHP 8)
* Whether or not 'word' exists in this spelling-session * @link https://php.net/manual/en/function.enchant-dict-is-added.php * @param EnchantDictionary $dictionary

* An Enchant dictionary returned by enchant_broker_request_dict() or enchant_broker_request_pwl_dict(). *

* @param string $word

* The word to lookup *

* @return bool TRUE if the word exists or FALSE * @since 8.0 */ function enchant_dict_is_added($dictionary, $word) {} /** * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
* Describes an individual dictionary * @link https://php.net/manual/en/function.enchant-dict-describe.php * @param resource|EnchantDictionary $dict

* Dictionary resource *

* @return array Returns the details of the dictionary. */ function enchant_dict_describe($dict) {} /** * (PHP 5 >= 5.3.0, PECL enchant:0.2.0-1.0.1)
* Check the word is correctly spelled and provide suggestions * @link https://php.net/manual/en/function.enchant-dict-quick-check.php * @param resource|EnchantDictionary $dict

* Dictionary resource *

* @param string $word

* The word to check *

* @param null|array &$suggestions [optional]

* If the word is not correctly spelled, this variable will * contain an array of suggestions. *

* @return bool TRUE if the word is correctly spelled or FALSE */ function enchant_dict_quick_check($dict, $word, ?array &$suggestions = null) {} /** * @deprecated 8.0 */ define('ENCHANT_MYSPELL', 1); /** * @deprecated 8.0 */ define('ENCHANT_ISPELL', 2); final class EnchantBroker {} final class EnchantDictionary {} // End of enchant v.1.1.0 * The connection_string can be empty to use all default parameters, or it * can contain one or more parameter settings separated by whitespace. * Each parameter setting is in the form keyword = value. Spaces around * the equal sign are optional. To write an empty value or a value * containing spaces, surround it with single quotes, e.g., keyword = * 'a value'. Single quotes and backslashes within the value must be * escaped with a backslash, i.e., \' and \\. *

*

* The currently recognized parameter keywords are: * host, hostaddr, port, * dbname (defaults to value of user), * user, * password, connect_timeout, * options, tty (ignored), sslmode, * requiressl (deprecated in favor of sslmode), and * service. Which of these arguments exist depends * on your PostgreSQL version. *

*

* The options parameter can be used to set command line parameters * to be invoked by the server. *

* @param int $flags

* If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection * is created, even if the connection_string is identical to * an existing connection. *

* @return resource|false PostgreSQL connection resource on success, FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|false'], default: 'resource|false')] function pg_connect( string $connection_string, int $flags = 0, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $host = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $port = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $options = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $tty = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $dbname = '', ) {} /** * Open a persistent PostgreSQL connection * @link https://php.net/manual/en/function.pg-pconnect.php * @param string $connection_string

* The connection_string can be empty to use all default parameters, or it * can contain one or more parameter settings separated by whitespace. * Each parameter setting is in the form keyword = value. Spaces around * the equal sign are optional. To write an empty value or a value * containing spaces, surround it with single quotes, e.g., keyword = * 'a value'. Single quotes and backslashes within the value must be * escaped with a backslash, i.e., \' and \\. *

*

* The currently recognized parameter keywords are: * host, hostaddr, port, * dbname, user, * password, connect_timeout, * options, tty (ignored), sslmode, * requiressl (deprecated in favor of sslmode), and * service. Which of these arguments exist depends * on your PostgreSQL version. *

* @param int $flags

* If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection * is created, even if the connection_string is identical to * an existing connection. *

* @return resource|false PostgreSQL connection resource on success, FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|false'], default: 'resource|false')] function pg_pconnect( string $connection_string, #[PhpStormStubsElementAvailable(from: '8.0')] int $flags = 0, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $host = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $port = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $options = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $tty = '', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $dbname = '', ) {} /** * Closes a PostgreSQL connection * @link https://php.net/manual/en/function.pg-close.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

*/ #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] function pg_close(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null) {} /** * Poll the status of an in-progress asynchronous PostgreSQL connection attempt. * @link https://php.net/manual/en/function.pg-connect-poll.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return int PGSQL_POLLING_FAILED, PGSQL_POLLING_READING, PGSQL_POLLING_WRITING, * PGSQL_POLLING_OK, or PGSQL_POLLING_ACTIVE. * @since 5.6 */ function pg_connect_poll( #[PhpStormStubsElementAvailable(from: '5.6', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection ): int {} /** * Get connection status * @link https://php.net/manual/en/function.pg-connection-status.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return int PGSQL_CONNECTION_OK or * PGSQL_CONNECTION_BAD. */ function pg_connection_status(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): int {} /** * Get connection is busy or not * @link https://php.net/manual/en/function.pg-connection-busy.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return bool TRUE if the connection is busy, FALSE otherwise. */ function pg_connection_busy(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): bool {} /** * Reset connection (reconnect) * @link https://php.net/manual/en/function.pg-connection-reset.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return bool TRUE on success or FALSE on failure. */ function pg_connection_reset(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): bool {} /** * Get a read only handle to the socket underlying a PostgreSQL connection * @link https://php.net/manual/en/function.pg-socket.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return resource|false A socket resource on success or FALSE on failure. * @since 5.6 */ function pg_socket(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection) {} /** * Returns the host name associated with the connection * @link https://php.net/manual/en/function.pg-host.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string|false A string containing the name of the host the * connection is to, or FALSE on error. */ function pg_host(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Get the database name * @link https://php.net/manual/en/function.pg-dbname.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string|false A string containing the name of the database the * connection is to, or FALSE on error. */ function pg_dbname(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Return the port number associated with the connection * @link https://php.net/manual/en/function.pg-port.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string A string containing the port number of the database server the connection is to, or empty string on error. */ function pg_port(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Return the TTY name associated with the connection * @link https://php.net/manual/en/function.pg-tty.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string A string containing the debug TTY of * the connection, or FALSE on error. */ function pg_tty(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Get the options associated with the connection * @link https://php.net/manual/en/function.pg-options.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string A string containing the connection * options, or FALSE on error. */ function pg_options(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Returns an array with client, protocol and server version (when available) * @link https://php.net/manual/en/function.pg-version.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return array an array with client, protocol * and server keys and values (if available). Returns * FALSE on error or invalid connection. */ #[ArrayShape(["client" => "string", "protocol" => "int", "server" => "string"])] function pg_version(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): array {} /** * Ping database connection * @link https://php.net/manual/en/function.pg-ping.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return bool TRUE on success or FALSE on failure. */ function pg_ping(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): bool {} /** * Looks up a current parameter setting of the server. * @link https://php.net/manual/en/function.pg-parameter-status.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $name [optional]

* Possible param_name values include server_version, * server_encoding, client_encoding, * is_superuser, session_authorization, * DateStyle, TimeZone, and * integer_datetimes. *

* @return string|false A string containing the value of the parameter, FALSE on failure or invalid * param_name. */ function pg_parameter_status(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $name): string|false {} /** * Returns the current in-transaction status of the server. * @link https://php.net/manual/en/function.pg-transaction-status.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return int The status can be PGSQL_TRANSACTION_IDLE (currently idle), * PGSQL_TRANSACTION_ACTIVE (a command is in progress), * PGSQL_TRANSACTION_INTRANS (idle, in a valid transaction block), * or PGSQL_TRANSACTION_INERROR (idle, in a failed transaction block). * PGSQL_TRANSACTION_UNKNOWN is reported if the connection is bad. * PGSQL_TRANSACTION_ACTIVE is reported only when a query * has been sent to the server and not yet completed. */ function pg_transaction_status(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): int {} /** * Execute a query * @link https://php.net/manual/en/function.pg-query.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $query [optional]

* The SQL statement or statements to be executed. When multiple statements are passed to the function, * they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands * included in the query string. However, using multiple transactions in one function call is not recommended. *

*

* String interpolation of user-supplied data is extremely dangerous and is * likely to lead to SQL * injection vulnerabilities. In most cases * pg_query_params should be preferred, passing * user-supplied values as parameters rather than substituting them into * the query string. *

*

* Any user-supplied data substituted directly into a query string should * be properly escaped. *

* @return resource|false A query result resource on success or FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|false'], default: 'resource|false')] function pg_query( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $query ) {} /** * Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text. * @link https://php.net/manual/en/function.pg-query-params.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $query

* The parameterized SQL statement. Must contain only a single statement. * (multiple statements separated by semi-colons are not allowed.) If any parameters * are used, they are referred to as $1, $2, etc. *

*

* User-supplied values should always be passed as parameters, not * interpolated into the query string, where they form possible * SQL injection * attack vectors and introduce bugs when handling data containing quotes. * If for some reason you cannot use a parameter, ensure that interpolated * values are properly escaped. *

* @param array $params [optional]

* An array of parameter values to substitute for the $1, $2, etc. placeholders * in the original prepared query string. The number of elements in the array * must match the number of placeholders. *

*

* Values intended for bytea fields are not supported as * parameters. Use pg_escape_bytea instead, or use the * large object functions. *

* @return resource|false A query result resource on success or FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|false'], default: 'resource|false')] function pg_query_params( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $query = '', #[PhpStormStubsElementAvailable(from: '8.0')] $query, array $params ) {} /** * Submits a request to create a prepared statement with the * given parameters, and waits for completion. * @link https://php.net/manual/en/function.pg-prepare.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $statement_name

* The name to give the prepared statement. Must be unique per-connection. If * "" is specified, then an unnamed statement is created, overwriting any * previously defined unnamed statement. *

* @param string $query [optional]

* The parameterized SQL statement. Must contain only a single statement. * (multiple statements separated by semi-colons are not allowed.) If any parameters * are used, they are referred to as $1, $2, etc. *

* @return resource|false A query result resource on success or FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|false'], default: 'resource|false')] function pg_prepare( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $statement_name = '', #[PhpStormStubsElementAvailable(from: '8.0')] string $statement_name, string $query ) {} /** * Sends a request to execute a prepared statement with given parameters, and waits for the result. * @link https://php.net/manual/en/function.pg-execute.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $statement_name

* The name of the prepared statement to execute. if * "" is specified, then the unnamed statement is executed. The name must have * been previously prepared using pg_prepare, * pg_send_prepare or a PREPARE SQL * command. *

* @param array $params [optional]

* An array of parameter values to substitute for the $1, $2, etc. placeholders * in the original prepared query string. The number of elements in the array * must match the number of placeholders. *

*

* Elements are converted to strings by calling this function. *

* @return resource|false A query result resource on success or FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|false'], default: 'resource|false')] function pg_execute( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $statement_name = '', #[PhpStormStubsElementAvailable(from: '8.0')] $statement_name, array $params ) {} /** * Sends asynchronous query * @link https://php.net/manual/en/function.pg-send-query.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $query

* The SQL statement or statements to be executed. *

*

* Data inside the query should be properly escaped. *

* @return int|bool TRUE on success or FALSE on failure.

*

* Use pg_get_result to determine the query result. */ function pg_send_query( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $query ): int|bool {} /** * Submits a command and separate parameters to the server without waiting for the result(s). * @link https://php.net/manual/en/function.pg-send-query-params.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $query

* The parameterized SQL statement. Must contain only a single statement. * (multiple statements separated by semi-colons are not allowed.) If any parameters * are used, they are referred to as $1, $2, etc. *

* @param array $params

* An array of parameter values to substitute for the $1, $2, etc. placeholders * in the original prepared query string. The number of elements in the array * must match the number of placeholders. *

* @return int|bool TRUE on success or FALSE on failure.

*

* Use pg_get_result to determine the query result. */ function pg_send_query_params( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $query, array $params ): int|bool {} /** * Sends a request to create a prepared statement with the given parameters, without waiting for completion. * @link https://php.net/manual/en/function.pg-send-prepare.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $statement_name

* The name to give the prepared statement. Must be unique per-connection. If * "" is specified, then an unnamed statement is created, overwriting any * previously defined unnamed statement. *

* @param string $query

* The parameterized SQL statement. Must contain only a single statement. * (multiple statements separated by semi-colons are not allowed.) If any parameters * are used, they are referred to as $1, $2, etc. *

* @return int|bool TRUE on success, FALSE on failure. Use pg_get_result * to determine the query result. */ function pg_send_prepare( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $statement_name, string $query ): int|bool {} /** * Sends a request to execute a prepared statement with given parameters, without waiting for the result(s). * @link https://php.net/manual/en/function.pg-send-execute.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $statement_name

* The name of the prepared statement to execute. if * "" is specified, then the unnamed statement is executed. The name must have * been previously prepared using pg_prepare, * pg_send_prepare or a PREPARE SQL * command. *

* @param array $params

* An array of parameter values to substitute for the $1, $2, etc. placeholders * in the original prepared query string. The number of elements in the array * must match the number of placeholders. *

* @return int|bool TRUE on success, FALSE on failure. Use pg_get_result * to determine the query result. */ function pg_send_execute( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $statement_name, array $params ): int|bool {} /** * Cancel an asynchronous query * @link https://php.net/manual/en/function.pg-cancel-query.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return bool TRUE on success or FALSE on failure. */ function pg_cancel_query(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): bool {} /** * Returns values from a result resource * @link https://php.net/manual/en/function.pg-fetch-result.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row

* Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, * next row is fetched. *

* @param mixed $field [optional]

* A string representing the name of the field (column) to fetch, otherwise * an int representing the field number to fetch. Fields are * numbered from 0 upwards. *

* @return string|false|null Boolean is returned as "t" or "f". All * other types, including arrays are returned as strings formatted * in the same default PostgreSQL manner that you would see in the * psql program. Database NULL * values are returned as NULL. *

*

* FALSE is returned if row exceeds the number * of rows in the set, or on any other error. */ function pg_fetch_result( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $row = 0, #[PhpStormStubsElementAvailable(from: '8.0')] $row, string|int $field ): string|false|null {} /** * Get a row as an enumerated array * @link https://php.net/manual/en/function.pg-fetch-row.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row [optional]

* Row number in result to fetch. Rows are numbered from 0 upwards. If * omitted or NULL, the next row is fetched. *

* @param int $mode [optional] * @return array|false An array, indexed from 0 upwards, with each value * represented as a string. Database NULL * values are returned as NULL. *

*

* FALSE is returned if row exceeds the number * of rows in the set, there are no more rows, or on any other error. */ function pg_fetch_row(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, ?int $row = null, int $mode = 2): array|false {} /** * Fetch a row as an associative array * @link https://php.net/manual/en/function.pg-fetch-assoc.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row [optional]

* Row number in result to fetch. Rows are numbered from 0 upwards. If * omitted or NULL, the next row is fetched. *

* @return array|false An array indexed associatively (by field name). * Each value in the array is represented as a * string. Database NULL * values are returned as NULL. *

*

* FALSE is returned if row exceeds the number * of rows in the set, there are no more rows, or on any other error. */ function pg_fetch_assoc(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, ?int $row = null): array|false {} /** * Fetch a row as an array * @link https://php.net/manual/en/function.pg-fetch-array.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row [optional]

* Row number in result to fetch. Rows are numbered from 0 upwards. If * omitted or NULL, the next row is fetched. *

* @param int $mode [optional]

* An optional parameter that controls * how the returned array is indexed. * result_type is a constant and can take the * following values: PGSQL_ASSOC, * PGSQL_NUM and PGSQL_BOTH. * Using PGSQL_NUM, pg_fetch_array * will return an array with numerical indices, using * PGSQL_ASSOC it will return only associative indices * while PGSQL_BOTH, the default, will return both * numerical and associative indices. *

* @return array|false An array indexed numerically (beginning with 0) or * associatively (indexed by field name), or both. * Each value in the array is represented as a * string. Database NULL * values are returned as NULL. *

*

* FALSE is returned if row exceeds the number * of rows in the set, there are no more rows, or on any other error. */ function pg_fetch_array(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, ?int $row = null, int $mode = PGSQL_BOTH): array|false {} /** * Fetch a row as an object * @link https://php.net/manual/en/function.pg-fetch-object.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int|null $row [optional]

* Row number in result to fetch. Rows are numbered from 0 upwards. If * omitted or NULL, the next row is fetched. *

* @param string $class [optional]

* Ignored and deprecated. *

* @param array $constructor_args [optional]

*

* @return object|false An object with one attribute for each field * name in the result. Database NULL * values are returned as NULL. *

*

* FALSE is returned if row exceeds the number * of rows in the set, there are no more rows, or on any other error. */ function pg_fetch_object( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, ?int $row = null, string $class = 'stdClass', #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $l = null, array $constructor_args = [] ): object|false {} /** * Fetches all rows from a result as an array * @link https://php.net/manual/en/function.pg-fetch-all.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $mode [optional]

* An optional parameter that controls * how the returned array is indexed. * result_type is a constant and can take the * following values: PGSQL_ASSOC, * PGSQL_NUM and PGSQL_BOTH. * Using PGSQL_NUM, pg_fetch_array * will return an array with numerical indices, using * PGSQL_ASSOC it will return only associative indices * while PGSQL_BOTH, the default, will return both * numerical and associative indices. *

* @return array|false An array with all rows in the result. Each row is an array * of field values indexed by field name. *

*

* FALSE is returned if there are no rows in the result, or on any * other error. */ #[LanguageLevelTypeAware(['8.0' => 'array'], default: 'array|false')] function pg_fetch_all(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $mode = PGSQL_ASSOC) {} /** * Fetches all rows in a particular result column as an array * @link https://php.net/manual/en/function.pg-fetch-all-columns.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $field [optional]

* Column number, zero-based, to be retrieved from the result resource. Defaults * to the first column if not specified. *

* @return array An array with all values in the result column. *

* FALSE is returned if column is larger than the number * of columns in the result, or on any other error. *

*/ function pg_fetch_all_columns(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field = 0): array {} /** * Returns number of affected records (tuples) * @link https://php.net/manual/en/function.pg-affected-rows.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @return int The number of rows affected by the query. If no tuple is * affected, it will return 0. */ function pg_affected_rows(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): int {} /** * Get asynchronous query result * @link https://php.net/manual/en/function.pg-get-result.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return resource|false The result resource, or FALSE if no more results are available. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|false'], default: 'resource|false')] function pg_get_result(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection) {} /** * Set internal row offset in result resource * @link https://php.net/manual/en/function.pg-result-seek.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row

* Row to move the internal offset to in the result resource. * Rows are numbered starting from zero. *

* @return bool TRUE on success or FALSE on failure. */ function pg_result_seek(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $row): bool {} /** * Get status of query result * @link https://php.net/manual/en/function.pg-result-status.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $mode [optional]

* Either PGSQL_STATUS_LONG to return the numeric status * of the result, or PGSQL_STATUS_STRING * to return the command tag of the result. * If not specified, PGSQL_STATUS_LONG is the default. *

* @return string|int Possible return values are PGSQL_EMPTY_QUERY, * PGSQL_COMMAND_OK, PGSQL_TUPLES_OK, PGSQL_COPY_OUT, * PGSQL_COPY_IN, PGSQL_BAD_RESPONSE, PGSQL_NONFATAL_ERROR and * PGSQL_FATAL_ERROR if PGSQL_STATUS_LONG is * specified. Otherwise, a string containing the PostgreSQL command tag is returned. */ function pg_result_status(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $mode = PGSQL_STATUS_LONG): string|int {} /** * Free result memory * @link https://php.net/manual/en/function.pg-free-result.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @return bool TRUE on success or FALSE on failure. */ function pg_free_result(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): bool {} /** * Returns the last row's OID * @link https://php.net/manual/en/function.pg-last-oid.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @return string|int|false A string containing the OID assigned to the most recently inserted * row in the specified connection, or FALSE on error or * no available OID. */ function pg_last_oid(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): string|int|false {} /** * Returns the number of rows in a result * @link https://php.net/manual/en/function.pg-num-rows.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @return int The number of rows in the result. On error, -1 is returned. */ function pg_num_rows(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): int {} /** * Returns the number of fields in a result * @link https://php.net/manual/en/function.pg-num-fields.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @return int The number of fields (columns) in the result. On error, -1 is returned. */ function pg_num_fields(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): int {} /** * Returns the name of a field * @link https://php.net/manual/en/function.pg-field-name.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $field

* Field number, starting from 0. *

* @return string|false The field name, or FALSE on error. */ function pg_field_name(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): string {} /** * Returns the field number of the named field * @link https://php.net/manual/en/function.pg-field-num.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param string $field

* The name of the field. *

* @return int The field number (numbered from 0), or -1 on error. */ function pg_field_num(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, string $field): int {} /** * Returns the internal storage size of the named field * @link https://php.net/manual/en/function.pg-field-size.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $field

* Field number, starting from 0. *

* @return int The internal field storage size (in bytes). -1 indicates a variable * length field. FALSE is returned on error. */ function pg_field_size(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): int {} /** * Returns the type name for the corresponding field number * @link https://php.net/manual/en/function.pg-field-type.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $field

* Field number, starting from 0. *

* @return string|false A string containing the base name of the field's type, or FALSE * on error. */ function pg_field_type(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): string {} /** * Returns the type ID (OID) for the corresponding field number * @link https://php.net/manual/en/function.pg-field-type-oid.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $field

* Field number, starting from 0. *

* @return string|int The OID of the field's base type. FALSE is returned on error. */ function pg_field_type_oid(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): string|int {} /** * Returns the printed length * @link https://php.net/manual/en/function.pg-field-prtlen.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row * @param mixed $field [optional] * @return int|false The field printed length, or FALSE on error. */ function pg_field_prtlen( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $row = 0, #[PhpStormStubsElementAvailable(from: '8.0')] $row, string|int $field ): int|false {} /** * Test if a field is SQL NULL * @link https://php.net/manual/en/function.pg-field-is-null.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $row

* Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, * current row is fetched. *

* @param mixed $field [optional]

* Field number (starting from 0) as an integer or * the field name as a string. *

* @return int|false 1 if the field in the given row is SQL NULL, 0 * if not. FALSE is returned if the row is out of range, or upon any other error. */ function pg_field_is_null( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $row = 0, #[PhpStormStubsElementAvailable(from: '8.0')] $row, string|int $field ): int|false {} /** * Returns the name or oid of the tables field * @link https://php.net/manual/en/function.pg-field-table.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @param int $field

* Field number, starting from 0. *

* @param bool $oid_only [optional]

* By default the tables name that field belongs to is returned but * if oid_only is set to TRUE, then the * oid will instead be returned. *

* @return string|int|false On success either the fields table name or oid. Or, FALSE on failure. */ function pg_field_table(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field, bool $oid_only = false): string|int|false {} /** * Gets SQL NOTIFY message * @link https://php.net/manual/en/function.pg-get-notify.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param int $mode [optional]

* An optional parameter that controls * how the returned array is indexed. * result_type is a constant and can take the * following values: PGSQL_ASSOC, * PGSQL_NUM and PGSQL_BOTH. * Using PGSQL_NUM, pg_get_notify * will return an array with numerical indices, using * PGSQL_ASSOC it will return only associative indices * while PGSQL_BOTH, the default, will return both * numerical and associative indices. *

* @return array|false An array containing the NOTIFY message name and backend PID. * Otherwise if no NOTIFY is waiting, then FALSE is returned. */ #[ArrayShape(["message" => "string", "pid" => "int", "payload" => "string"])] function pg_get_notify( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, int $mode = 1 ): array|false {} /** * Gets the backend's process ID * @link https://php.net/manual/en/function.pg-get-pid.php * @param resource $connection

* PostgreSQL database connection resource. *

* @return int The backend database process ID. */ function pg_get_pid( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, ): int {} /** * Get error message associated with result * @link https://php.net/manual/en/function.pg-result-error.php * @param resource $result

* PostgreSQL query result resource, returned by pg_query, * pg_query_params or pg_execute * (among others). *

* @return string|false a string if there is an error associated with the * result parameter, FALSE otherwise. */ function pg_result_error(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): string|false {} /** * Returns an individual field of an error report. * @link https://php.net/manual/en/function.pg-result-error-field.php * @param resource $result

* A PostgreSQL query result resource from a previously executed * statement. *

* @param int $field_code

* Possible fieldcode values are: PGSQL_DIAG_SEVERITY, * PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY, * PGSQL_DIAG_MESSAGE_DETAIL, * PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION, * PGSQL_DIAG_INTERNAL_POSITION (PostgreSQL 8.0+ only), * PGSQL_DIAG_INTERNAL_QUERY (PostgreSQL 8.0+ only), * PGSQL_DIAG_CONTEXT, PGSQL_DIAG_SOURCE_FILE, * PGSQL_DIAG_SOURCE_LINE or * PGSQL_DIAG_SOURCE_FUNCTION. *

* @return string|null|false A string containing the contents of the error field, NULL if the field does not exist or FALSE * on failure. */ function pg_result_error_field( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field_code ): string|false|null {} /** * Get the last error message string of a connection * @link https://php.net/manual/en/function.pg-last-error.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string A string containing the last error message on the * given connection, or FALSE on error. */ function pg_last_error(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Returns the last notice message from PostgreSQL server * @link https://php.net/manual/en/function.pg-last-notice.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param int $mode [optional]

* One of PGSQL_NOTICE_LAST (to return last notice), * PGSQL_NOTICE_ALL (to return all notices), or * PGSQL_NOTICE_CLEAR (to clear notices). *

* @return array|string|bool A string containing the last notice on the * given connection with PGSQL_NOTICE_LAST, * an array with PGSQL_NOTICE_ALL, * a bool with PGSQL_NOTICE_CLEAR, or * FALSE on error. */ function pg_last_notice(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, int $mode = PGSQL_NOTICE_LAST): array|string|bool {} /** * Send a NULL-terminated string to PostgreSQL backend * @link https://php.net/manual/en/function.pg-put-line.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $query [optional]

* A line of text to be sent directly to the PostgreSQL backend. A NULL * terminator is added automatically. *

* @return bool TRUE on success or FALSE on failure. */ function pg_put_line( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $query ): bool {} /** * Sync with PostgreSQL backend * @link https://php.net/manual/en/function.pg-end-copy.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return bool TRUE on success or FALSE on failure. */ function pg_end_copy(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): bool {} /** * Copy a table to an array * @link https://php.net/manual/en/function.pg-copy-to.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table from which to copy the data into rows. *

* @param string $separator [optional]

* The token that separates values for each field in each element of * rows. Default is TAB. *

* @param string $null_as [optional]

* How SQL NULL values are represented in the * rows. Default is \N ("\\N"). *

* @return array|false An array with one element for each line of COPY data. * It returns FALSE on failure. */ function pg_copy_to( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, string $separator = ' ', string $null_as = '\\\\N' ): array|false {} /** * Insert records into a table from an array * @link https://php.net/manual/en/function.pg-copy-from.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table into which to copy the rows. *

* @param array $rows

* An array of data to be copied into table_name. * Each value in rows becomes a row in table_name. * Each value in rows should be a delimited string of the values * to insert into each field. Values should be linefeed terminated. *

* @param string $separator [optional]

* The token that separates values for each field in each element of * rows. Default is TAB. *

* @param string $null_as [optional]

* How SQL NULL values are represented in the * rows. Default is \N ("\\N"). *

* @return bool TRUE on success or FALSE on failure. */ function pg_copy_from( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, array $rows, string $separator = ' ', string $null_as = '\\\\N' ): bool {} /** * Enable tracing a PostgreSQL connection * @link https://php.net/manual/en/function.pg-trace.php * @param string $filename

* The full path and file name of the file in which to write the * trace log. Same as in fopen. *

* @param string $mode [optional]

* An optional file access mode, same as for fopen. *

* @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param int $trace_mode Since PHP 8.3 optional trace mode * @return bool TRUE on success or FALSE on failure. */ function pg_trace( string $filename, string $mode = "w", #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.3')] int $trace_mode = 0 ): bool {} /** * Disable tracing of a PostgreSQL connection * @link https://php.net/manual/en/function.pg-untrace.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

*/ #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] function pg_untrace(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null) {} /** * Create a large object * @link https://php.net/manual/en/function.pg-lo-create.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param mixed $oid [optional]

* If an object_id is given the function * will try to create a large object with this id, else a free * object id is assigned by the server. The parameter * was added in PHP 5.3 and relies on functionality that first * appeared in PostgreSQL 8.1. *

* @return string|int|false A large object OID or FALSE on error. */ function pg_lo_create(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid): string|int|false {} /** * Delete a large object * @link https://php.net/manual/en/function.pg-lo-unlink.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param int $oid [optional]

* The OID of the large object in the database. *

* @return bool TRUE on success or FALSE on failure. */ function pg_lo_unlink( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid ): bool {} /** * Open a large object * @link https://php.net/manual/en/function.pg-lo-open.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param int $oid [optional]

* The OID of the large object in the database. *

* @param string $mode [optional]

* Can be either "r" for read-only, "w" for write only or "rw" for read and * write. *

* @return resource|false A large object resource or FALSE on error. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob|false'], default: 'resource|false')] function pg_lo_open( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid, string $mode ) {} /** * Close a large object * @link https://php.net/manual/en/function.pg-lo-close.php * @param resource $lob * @return bool TRUE on success or FALSE on failure. */ function pg_lo_close(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob): bool {} /** * Read a large object * @link https://php.net/manual/en/function.pg-lo-read.php * @param resource $lob

* PostgreSQL large object (LOB) resource, returned by pg_lo_open. *

* @param int $length [optional]

* An optional maximum number of bytes to return. *

* @return string|false A string containing len bytes from the * large object, or FALSE on error. */ function pg_lo_read(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob, int $length = 8192): string|false {} /** * Write to a large object * @link https://php.net/manual/en/function.pg-lo-write.php * @param resource $lob

* PostgreSQL large object (LOB) resource, returned by pg_lo_open. *

* @param string $data

* The data to be written to the large object. If len is * specified and is less than the length of data, only * len bytes will be written. *

* @param int $length [optional]

* An optional maximum number of bytes to write. Must be greater than zero * and no greater than the length of data. Defaults to * the length of data. *

* @return int|false The number of bytes written to the large object, or FALSE on error. */ function pg_lo_write(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob, string $data, ?int $length = null): int|false {} /** * Reads an entire large object and send straight to browser * @link https://php.net/manual/en/function.pg-lo-read-all.php * @param resource $lob

* PostgreSQL large object (LOB) resource, returned by pg_lo_open. *

* @return int|false Number of bytes read or FALSE on error. */ function pg_lo_read_all(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob): int {} /** * Import a large object from file * @link https://php.net/manual/en/function.pg-lo-import.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $pathname

* The full path and file name of the file on the client * filesystem from which to read the large object data. *

* @param mixed $object_id [optional]

* If an object_id is given the function * will try to create a large object with this id, else a free * object id is assigned by the server. The parameter * was added in PHP 5.3 and relies on functionality that first * appeared in PostgreSQL 8.1. *

* @return string|int|false The OID of the newly created large object, or * FALSE on failure. */ function pg_lo_import( #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, $pathname, $object_id = null ): string|int|false {} /** * Export a large object to file * @link https://php.net/manual/en/function.pg-lo-export.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param int $oid

* The OID of the large object in the database. *

* @param string $pathname

* The full path and file name of the file in which to write the * large object on the client filesystem. *

* @return bool TRUE on success or FALSE on failure. */ function pg_lo_export( #[PhpStormStubsElementAvailable('8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, $oid, $pathname ): bool {} /** * Seeks position within a large object * @link https://php.net/manual/en/function.pg-lo-seek.php * @param resource $lob

* PostgreSQL large object (LOB) resource, returned by pg_lo_open. *

* @param int $offset

* The number of bytes to seek. *

* @param int $whence [optional]

* One of the constants PGSQL_SEEK_SET (seek from object start), * PGSQL_SEEK_CUR (seek from current position) * or PGSQL_SEEK_END (seek from object end) . *

* @return bool TRUE on success or FALSE on failure. */ function pg_lo_seek(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob, int $offset, int $whence = PGSQL_SEEK_CUR): bool {} /** * Returns current seek position a of large object * @link https://php.net/manual/en/function.pg-lo-tell.php * @param resource $lob

* PostgreSQL large object (LOB) resource, returned by pg_lo_open. *

* @return int The current seek offset (in number of bytes) from the beginning of the large * object. If there is an error, the return value is negative. */ function pg_lo_tell(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob): int {} /** * Truncates a large object * @link https://www.php.net/manual/en/function.pg-lo-truncate.php * @param resource $lob

* PostgreSQL large object (LOB) resource, returned by pg_lo_open. *

* @param int $size The number of bytes to truncate. * @return bool Returns true on success or false on failure. */ function pg_lo_truncate( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] int $size = 0, #[PhpStormStubsElementAvailable(from: '8.0')] int $size ): bool {} /** * Escape a string for query * @link https://php.net/manual/en/function.pg-escape-string.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $string [optional]

* A string containing text to be escaped. *

* @return string A string containing the escaped data. */ function pg_escape_string( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $string ): string {} /** * Escape a string for insertion into a bytea field * @link https://php.net/manual/en/function.pg-escape-bytea.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $string [optional]

* A string containing text or binary data to be inserted into a bytea * column. *

* @return string A string containing the escaped data. */ function pg_escape_bytea( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $string ): string {} /** * Escape a identifier for insertion into a text field * @link https://php.net/manual/en/function.pg-escape-identifier.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $string [optional]

* A string containing text to be escaped. *

* @return string|false A string containing the escaped data. * @since 5.4.4 */ function pg_escape_identifier( #[PhpStormStubsElementAvailable(from: '5.4', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $string ): string|false {} /** * Escape a literal for insertion into a text field * @link https://php.net/manual/en/function.pg-escape-literal.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $string [optional]

* A string containing text to be escaped. *

* @return string|false A string containing the escaped data. * @since 5.4.4 */ function pg_escape_literal( #[PhpStormStubsElementAvailable(from: '5.4', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $string ): string|false {} /** * Unescape binary for bytea type * @link https://php.net/manual/en/function.pg-unescape-bytea.php * @param string $string

* A string containing PostgreSQL bytea data to be converted into * a PHP binary string. *

* @return string A string containing the unescaped data. */ function pg_unescape_bytea(string $string): string {} /** * Determines the verbosity of messages returned by pg_last_error * and pg_result_error. * @link https://php.net/manual/en/function.pg-set-error-verbosity.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param int $verbosity [optional]

* The required verbosity: PGSQL_ERRORS_TERSE, * PGSQL_ERRORS_DEFAULT * or PGSQL_ERRORS_VERBOSE. *

* @return int|false The previous verbosity level: PGSQL_ERRORS_TERSE, * PGSQL_ERRORS_DEFAULT * or PGSQL_ERRORS_VERBOSE. */ function pg_set_error_verbosity( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, int $verbosity ): int|false {} /** * Gets the client encoding * @link https://php.net/manual/en/function.pg-client-encoding.php * @param resource $connection [optional]

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @return string|false The client encoding, or FALSE on error. */ function pg_client_encoding(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection = null): string {} /** * Set the client encoding * @link https://php.net/manual/en/function.pg-set-client-encoding.php * @param resource $connection

* PostgreSQL database connection resource. When * connection is not present, the default connection * is used. The default connection is the last connection made by * pg_connect or pg_pconnect. *

* @param string $encoding [optional]

* The required client encoding. One of SQL_ASCII, EUC_JP, * EUC_CN, EUC_KR, EUC_TW, * UNICODE, MULE_INTERNAL, LATINX (X=1...9), * KOI8, WIN, ALT, SJIS, * BIG5 or WIN1250. *

*

* The exact list of available encodings depends on your PostgreSQL version, so check your * PostgreSQL manual for a more specific list. *

* @return int 0 on success or -1 on error. */ function pg_set_client_encoding( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $encoding ): int {} /** * Get meta data for table * @link https://php.net/manual/en/function.pg-meta-data.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* The name of the table. *

* @return array|false An array of the table definition, or FALSE on error. */ function pg_meta_data( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, #[PhpStormStubsElementAvailable(from: '8.0')] bool $extended = false ): array|false {} /** * Convert associative array values into suitable for SQL statement * @link https://php.net/manual/en/function.pg-convert.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table against which to convert types. *

* @param array $values

* Data to be converted. *

* @param int $flags [optional]

* Any number of PGSQL_CONV_IGNORE_DEFAULT, * PGSQL_CONV_FORCE_NULL or * PGSQL_CONV_IGNORE_NOT_NULL, combined. *

* @return array|false An array of converted values, or FALSE on error. */ function pg_convert( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, array $values, int $flags = 0 ): array|false {} /** * Insert array into table * @link https://php.net/manual/en/function.pg-insert.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table into which to insert rows. The table table_name must at least * have as many columns as assoc_array has elements. *

* @param array $values

* An array whose keys are field names in the table table_name, * and whose values are the values of those fields that are to be inserted. *

* @param int $flags [optional]

* Any number of PGSQL_CONV_OPTS, * PGSQL_DML_NO_CONV, * PGSQL_DML_EXEC, * PGSQL_DML_ASYNC or * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the * options then query string is returned. *

* @return mixed TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed * via options. */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|string|bool'], default: 'resource|string|bool')] function pg_insert( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC ) {} /** * Update table * @link https://php.net/manual/en/function.pg-update.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table into which to update rows. *

* @param array $values

* An array whose keys are field names in the table table_name, * and whose values are what matched rows are to be updated to. *

* @param array $conditions

* An array whose keys are field names in the table table_name, * and whose values are the conditions that a row must meet to be updated. *

* @param int $flags [optional]

* Any number of PGSQL_CONV_OPTS, * PGSQL_DML_NO_CONV, * PGSQL_DML_EXEC or * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the * options then query string is returned. *

* @return string|bool TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed * via options. */ function pg_update( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC ): string|bool {} /** * Deletes records * @link https://php.net/manual/en/function.pg-delete.php * @param resource $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table from which to delete rows. *

* @param array $conditions

* An array whose keys are field names in the table table_name, * and whose values are the values of those fields that are to be deleted. *

* @param int $flags [optional]

* Any number of PGSQL_CONV_FORCE_NULL, * PGSQL_DML_NO_CONV, * PGSQL_DML_EXEC or * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the * options then query string is returned. *

* @return string|bool TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed * via options. */ function pg_delete( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC ): string|bool {} /** * Select records * @link https://php.net/manual/en/function.pg-select.php * @param resource|PgSql\Connection $connection

* PostgreSQL database connection resource. *

* @param string $table_name

* Name of the table from which to select rows. *

* @param array $conditions

* An array whose keys are field names in the table table_name, * and whose values are the conditions that a row must meet to be retrieved. *

* @param int $flags [optional]

* Any number of PGSQL_CONV_FORCE_NULL, * PGSQL_DML_NO_CONV, * PGSQL_DML_EXEC, * PGSQL_DML_ASYNC or * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the * options then query string is returned. *

* @param int $mode [optional]

* An optional parameter that controls * how the returned array is indexed. * result_type is a constant and can take the * following values: PGSQL_ASSOC, * PGSQL_NUM and PGSQL_BOTH. * Using PGSQL_NUM, pg_fetch_array * will return an array with numerical indices, using * PGSQL_ASSOC it will return only associative indices * while PGSQL_BOTH, the default, will return both * numerical and associative indices. *

* @return array|string|false TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed * via options. */ function pg_select( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $table_name, array $conditions = [], int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC ): array|string|false {} /** * @param $connection * @param $query [optional] * @return mixed */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result|false'], default: 'resource|false')] function pg_exec( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $query ) {} /** * @param $result * @return string|int|false * @deprecated 8.0 */ function pg_getlastoid(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): string|int|false {} /** * @param $result * @return int * @deprecated 8.0 */ function pg_cmdtuples(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): int {} // TODO remove /** * @param $connection [optional] * @return string * @deprecated 8.0 */ function pg_errormessage(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection): string {} /** * @param $result * @return int * @deprecated 8.0 */ function pg_numrows(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): int {} /** * @param $result * @return int * @deprecated 8.0 */ function pg_numfields(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): int {} /** * @param $result * @param $field * @return string * @deprecated 8.0 */ function pg_fieldname(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): string {} /** * @param $result * @param $field * @return int * @deprecated 8.0 */ function pg_fieldsize(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): int {} /** * @param $result * @param $field * @return string * @deprecated 8.0 */ function pg_fieldtype(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, int $field): string {} /** * @param $result * @param $field * @return int * @deprecated 8.0 */ function pg_fieldnum(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, string $field): int {} /** * @param $result * @param $row * @param $field [optional] * @return int|false * @deprecated 8.0 */ function pg_fieldprtlen( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $row = 0, #[PhpStormStubsElementAvailable(from: '8.0')] $row, string|int $field ): int|false {} /** * @param $result * @param $row * @param $field [optional] * @return int|false * @deprecated 8.0 */ function pg_fieldisnull( #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $row = 0, #[PhpStormStubsElementAvailable(from: '8.0')] $row, string|int $field ): int|false {} /** * @param $result * @return bool * @deprecated 8.0 */ function pg_freeresult(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result): bool {} /** * @param PgSql\Result|resource $result * @param $row * @param $field [optional] * @deprecated 8.0 */ function pg_result( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Result'], default: 'resource')] $result, #[PhpStormStubsElementAvailable(from: '8.0')] $row, #[PhpStormStubsElementAvailable(from: '8.0')] string|int $field ): string|null|false {} /** * @param $lob * @deprecated 8.0 */ function pg_loreadall(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob): int {} // TODO remove /** * @param $connection [optional] * @param $oid [optional] * @return string|int|false * @deprecated 8.0 */ function pg_locreate(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid): string|int|false {} /** * @param $connection * @param $oid [optional] * @return bool * @deprecated 8.0 */ function pg_lounlink( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid ): bool {} /** * @param $connection * @param $oid [optional] * @param $mode [optional] * @return resource * @deprecated 8.0 */ #[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob|false'], default: 'resource|false')] function pg_loopen( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid, string $mode ) {} /** * @param $lob * @return bool * @deprecated 8.0 */ function pg_loclose(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob): bool {} /** * @param $lob * @param $length * @return string|false * @deprecated 8.0 */ function pg_loread(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob, int $length = 8192): string|false {} /** * @param $lob * @param $data * @param $length [optional] * @return int|false * @deprecated 8.0 */ function pg_lowrite(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Lob'], default: 'resource')] $lob, string $data, ?int $length): int|false {} /** * @param $connection * @param $filename [optional] * @param $oid [optional] * @return string|int|false * @deprecated 8.0 */ function pg_loimport( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $filename, $oid ): string|int|false {} /** * @param $connection * @param $oid [optional] * @param $filename [optional] * @return bool * @deprecated 8.0 */ function pg_loexport( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, $oid, $filename ): bool {} /** * @param $connection [optional] * @return string * @deprecated 8.0 */ function pg_clientencoding(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection|null'], default: 'resource')] $connection): string {} /** * @param $connection * @param $encoding [optional] * @return int * @deprecated 8.0 */ function pg_setclientencoding( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $connection = null, #[PhpStormStubsElementAvailable(from: '8.0')] #[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection, string $encoding ): int {} /** * Reads input on the connection * @link https://www.php.net/manual/en/function.pg-consume-input.php * @param PgSql\Connection|resource $connection * @return bool true if no error occurred, or false if there was an error. * Note that true does not necessarily indicate that input was waiting to be read. */ function pg_consume_input(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): bool {} /** * Flush outbound query data on the connection * @link https://www.php.net/manual/en/function.pg-flush.php * @param PgSql\Connection|resource $connection * @return int|bool Returns true if the flush was successful or no data was waiting to be flushed, 0 if part of the pending * data was flushed but more remains or false on failure. */ function pg_flush(#[LanguageLevelTypeAware(['8.1' => 'PgSql\Connection'], default: 'resource')] $connection): int|bool {} /** * @since 8.3 */ function pg_set_error_context_visibility(PgSql\Connection $connection, int $visibility): int {} /** * @since 8.3 */ function pg_pipeline_status(PgSql\Connection $connection): int {} /** * @since 8.3 */ function pg_pipeline_sync(PgSql\Connection $connection): bool {} /** * @since 8.3 */ function pg_exit_pipeline_mode(PgSql\Connection $connection): bool {} /** * @since 8.3 */ function pg_enter_pipeline_mode(PgSql\Connection $connection): bool {} /** * @since 8.4 */ function pg_result_memory_size(PgSql\Result $result): int {} /** * @since 8.4 */ function pg_change_password(PgSql\Connection $connection, string $user, #[\SensitiveParameter] string $password): bool {} /** * @since 8.4 */ function pg_put_copy_data(PgSql\Connection $connection, string $cmd): int {} /** * @since 8.4 * @param resource $socket */ function pg_socket_poll($socket, int $read, int $write, int $timeout = -1): int {} /** * @since 8.4 */ function pg_put_copy_end(PgSql\Connection $connection, ?string $error = null): int {} /** * @since 8.4 * @return array */ function pg_jit(?PgSql\Connection $connection = null): array {} define('PGSQL_LIBPQ_VERSION', "16.2"); define('PGSQL_LIBPQ_VERSION_STR', "16.2"); /** * Passed to pg_connect to force the creation of a new connection, * rather than re-using an existing identical connection. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_CONNECT_FORCE_NEW', 2); /** * Passed to pg_fetch_array. Return an associative array of field * names and values. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_ASSOC', 1); /** * Passed to pg_fetch_array. Return a numerically indexed array of field * numbers and values. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_NUM', 2); /** * Passed to pg_fetch_array. Return an array of field values * that is both numerically indexed (by field number) and associated (by field name). * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_BOTH', 3); /** * Returned by pg_connection_status indicating that the database * connection is in an invalid state. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_CONNECTION_BAD', 1); /** * Returned by pg_connection_status indicating that the database * connection is in a valid state. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_CONNECTION_OK', 0); /** * Returned by pg_transaction_status. Connection is * currently idle, not in a transaction. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_TRANSACTION_IDLE', 0); /** * Returned by pg_transaction_status. A command * is in progress on the connection. A query has been sent via the connection * and not yet completed. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_TRANSACTION_ACTIVE', 1); /** * Returned by pg_transaction_status. The connection * is idle, in a transaction block. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_TRANSACTION_INTRANS', 2); /** * Returned by pg_transaction_status. The connection * is idle, in a failed transaction block. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_TRANSACTION_INERROR', 3); /** * Returned by pg_transaction_status. The connection * is bad. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_TRANSACTION_UNKNOWN', 4); /** * Passed to pg_set_error_verbosity. * Specified that returned messages include severity, primary text, * and position only; this will normally fit on a single line. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_ERRORS_TERSE', 0); /** * Passed to pg_set_error_verbosity. * The default mode produces messages that include the above * plus any detail, hint, or context fields (these may span * multiple lines). * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_ERRORS_DEFAULT', 1); /** * Passed to pg_set_error_verbosity. * The verbose mode includes all available fields. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_ERRORS_VERBOSE', 2); /** * Passed to pg_lo_seek. Seek operation is to begin * from the start of the object. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_SEEK_SET', 0); /** * Passed to pg_lo_seek. Seek operation is to begin * from the current position. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_SEEK_CUR', 1); /** * Passed to pg_lo_seek. Seek operation is to begin * from the end of the object. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_SEEK_END', 2); /** * Passed to pg_result_status. Indicates that * numerical result code is desired. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_STATUS_LONG', 1); /** * Passed to pg_result_status. Indicates that * textual result command tag is desired. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_STATUS_STRING', 2); /** * Returned by pg_result_status. The string sent to the server * was empty. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_EMPTY_QUERY', 0); /** * Returned by pg_result_status. Successful completion of a * command returning no data. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_COMMAND_OK', 1); /** * Returned by pg_result_status. Successful completion of a command * returning data (such as a SELECT or SHOW). * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_TUPLES_OK', 2); /** * Returned by pg_result_status. Copy Out (from server) data * transfer started. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_COPY_OUT', 3); /** * Returned by pg_result_status. Copy In (to server) data * transfer started. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_COPY_IN', 4); /** * Returned by pg_result_status. The server's response * was not understood. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_BAD_RESPONSE', 5); /** * Returned by pg_result_status. A nonfatal error * (a notice or warning) occurred. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_NONFATAL_ERROR', 6); /** * Returned by pg_result_status. A fatal error * occurred. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_FATAL_ERROR', 7); /** * Passed to pg_result_error_field. * The severity; the field contents are ERROR, * FATAL, or PANIC (in an error message), or * WARNING, NOTICE, DEBUG, * INFO, or LOG (in a notice message), or a localized * translation of one of these. Always present. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_SEVERITY', 83); /** * Passed to pg_result_error_field. * The SQLSTATE code for the error. The SQLSTATE code identifies the type of error * that has occurred; it can be used by front-end applications to perform specific * operations (such as error handling) in response to a particular database error. * This field is not localizable, and is always present. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_SQLSTATE', 67); /** * Passed to pg_result_error_field. * The primary human-readable error message (typically one line). Always present. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_MESSAGE_PRIMARY', 77); /** * Passed to pg_result_error_field. * Detail: an optional secondary error message carrying more detail about the problem. May run to multiple lines. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_MESSAGE_DETAIL', 68); /** * Passed to pg_result_error_field. * Hint: an optional suggestion what to do about the problem. This is intended to differ from detail in that it * offers advice (potentially inappropriate) rather than hard facts. May run to multiple lines. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_MESSAGE_HINT', 72); /** * Passed to pg_result_error_field. * A string containing a decimal integer indicating an error cursor position as an index into the original * statement string. The first character has index 1, and positions are measured in characters not bytes. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_STATEMENT_POSITION', 80); /** * Passed to pg_result_error_field. * This is defined the same as the PG_DIAG_STATEMENT_POSITION field, but * it is used when the cursor position refers to an internally generated * command rather than the one submitted by the client. The * PG_DIAG_INTERNAL_QUERY field will always appear when this * field appears. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_INTERNAL_POSITION', 112); /** * Passed to pg_result_error_field. * The text of a failed internally-generated command. This could be, for example, a * SQL query issued by a PL/pgSQL function. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_INTERNAL_QUERY', 113); /** * Passed to pg_result_error_field. * An indication of the context in which the error occurred. Presently * this includes a call stack traceback of active procedural language * functions and internally-generated queries. The trace is one entry * per line, most recent first. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_CONTEXT', 87); /** * Passed to pg_result_error_field. * The file name of the PostgreSQL source-code location where the error * was reported. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_SOURCE_FILE', 70); /** * Passed to pg_result_error_field. * The line number of the PostgreSQL source-code location where the * error was reported. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_SOURCE_LINE', 76); /** * Passed to pg_result_error_field. * The name of the PostgreSQL source-code function reporting the error. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_DIAG_SOURCE_FUNCTION', 82); /** * Passed to pg_convert. * Ignore default values in the table during conversion. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_CONV_IGNORE_DEFAULT', 2); /** * Passed to pg_convert. * Use SQL NULL in place of an empty string. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_CONV_FORCE_NULL', 4); /** * Passed to pg_convert. * Ignore conversion of NULL into SQL NOT NULL columns. * @link https://php.net/manual/en/pgsql.constants.php */ define('PGSQL_CONV_IGNORE_NOT_NULL', 8); define('PGSQL_DML_NO_CONV', 256); define('PGSQL_DML_EXEC', 512); define('PGSQL_DML_ASYNC', 1024); define('PGSQL_DML_STRING', 2048); /** * @link https://php.net/manual/en/function.pg-last-notice.php * @since 7.1 */ define('PGSQL_NOTICE_LAST', 1); /** * @link https://php.net/manual/en/function.pg-last-notice.php * @since 7.1 */ define('PGSQL_NOTICE_ALL', 2); /** * @link https://php.net/manual/en/function.pg-last-notice.php * @since 7.1 */ define('PGSQL_NOTICE_CLEAR', 3); const PGSQL_CONNECT_ASYNC = 4; const PGSQL_CONNECTION_AUTH_OK = 5; const PGSQL_CONNECTION_AWAITING_RESPONSE = 4; const PGSQL_CONNECTION_MADE = 3; const PGSQL_CONNECTION_SETENV = 6; const PGSQL_CONNECTION_STARTED = 2; const PGSQL_DML_ESCAPE = 4096; const PGSQL_POLLING_ACTIVE = 4; const PGSQL_POLLING_FAILED = 0; const PGSQL_POLLING_OK = 3; const PGSQL_POLLING_READING = 1; const PGSQL_POLLING_WRITING = 2; const PGSQL_DIAG_SCHEMA_NAME = 115; const PGSQL_DIAG_TABLE_NAME = 116; const PGSQL_DIAG_COLUMN_NAME = 99; const PGSQL_DIAG_DATATYPE_NAME = 100; const PGSQL_DIAG_CONSTRAINT_NAME = 110; const PGSQL_DIAG_SEVERITY_NONLOCALIZED = 86; const PGSQL_ERRORS_SQLSTATE = 0; const PGSQL_TRACE_REGRESS_MODE = 2; const PGSQL_PIPELINE_SYNC = 10; const PGSQL_PIPELINE_ON = 1; const PGSQL_PIPELINE_OFF = 0; const PGSQL_PIPELINE_ABORTED = 2; const PGSQL_SHOW_CONTEXT_NEVER = 0; const PGSQL_SHOW_CONTEXT_ERRORS = 1; const PGSQL_SHOW_CONTEXT_ALWAYS = 2; // End of pgsql v. * @link https://github.com/i-ekho/zmq-phpdoc */ /** * Class ZMQ * @link https://secure.php.net/manual/en/class.zmq.php */ class ZMQ { /** * Exclusive pair pattern */ public const SOCKET_PAIR = 0; /** * Publisher socket */ public const SOCKET_PUB = 1; /** * Subscriber socket */ public const SOCKET_SUB = 2; /** * Request socket */ public const SOCKET_REQ = 3; /** * Reply socket */ public const SOCKET_REP = 4; /** * Alias for SOCKET_DEALER */ public const SOCKET_XREQ = 5; /** * Alias for SOCKET_ROUTER */ public const SOCKET_XREP = 6; /** * Pipeline upstream push socket */ public const SOCKET_PUSH = 8; /** * Pipeline downstream pull socket */ public const SOCKET_PULL = 7; /** * Extended REP socket that can route replies to requesters */ public const SOCKET_ROUTER = 6; /** * Extended REQ socket that load balances to all connected peers */ public const SOCKET_DEALER = 5; /** * Similar to SOCKET_PUB, except you can receive subscriptions as messages. * The subscription message is 0 (unsubscribe) or 1 (subscribe) followed by the topic. */ public const SOCKET_XPUB = 9; /** * Similar to SOCKET_SUB, except you can send subscriptions as messages. See SOCKET_XPUB for format. */ public const SOCKET_XSUB = 10; /** * Used to send and receive TCP data from a non-ØMQ peer. * Available if compiled against ZeroMQ 4.x or higher. */ public const SOCKET_STREAM = 11; /** * The high water mark for inbound and outbound messages is a hard * limit on the maximum number of outstanding messages ØMQ shall queue in memory * for any single peer that the specified socket is communicating with. * Setting this option on a socket will only affect connections made after the option has been set. * On ZeroMQ 3.x this is a wrapper for setting both SNDHWM and RCVHWM. */ public const SOCKOPT_HWM = 1; /** * The ZMQ_SNDHWM option shall set the high water mark for outbound messages on the specified socket. * Available if compiled against ZeroMQ 3.x or higher. */ public const SOCKOPT_SNDHWM = 23; /** * The ZMQ_SNDHWM option shall set the high water mark for inbound messages on the specified socket. * Available if compiled against ZeroMQ 3.x or higher. */ public const SOCKOPT_RCVHWM = 24; /** * Set I/O thread affinity */ public const SOCKOPT_AFFINITY = 4; /** * Set socket identity */ public const SOCKOPT_IDENTITY = 5; /** * Establish message filter. Valid for subscriber socket */ public const SOCKOPT_SUBSCRIBE = 6; /** * Remove message filter. Valid for subscriber socket */ public const SOCKOPT_UNSUBSCRIBE = 7; /** * Set rate for multicast sockets (pgm) (Value: int >= 0) */ public const SOCKOPT_RATE = 8; /** * Set multicast recovery interval (Value: int >= 0) */ public const SOCKOPT_RECOVERY_IVL = 9; /** * Set the initial reconnection interval (Value: int >= 0) */ public const SOCKOPT_RECONNECT_IVL = 18; /** * Set the max reconnection interval (Value: int >= 0) */ public const SOCKOPT_RECONNECT_IVL_MAX = 21; /** * Control multicast loopback (Value: int >= 0) */ public const SOCKOPT_MCAST_LOOP = 10; /** * Set kernel transmit buffer size (Value: int >= 0) */ public const SOCKOPT_SNDBUF = 11; /** * Set kernel receive buffer size (Value: int >= 0) */ public const SOCKOPT_RCVBUF = 12; /** * Receive multi-part messages */ public const SOCKOPT_RCVMORE = 13; /** * Get the socket type. Valid for getSockOpt */ public const SOCKOPT_TYPE = 16; /** * The linger value of the socket. * Specifies how long the socket blocks trying flush messages after it has been closed */ public const SOCKOPT_LINGER = 17; /** * The SOCKOPT_BACKLOG option shall set the maximum length of the queue of outstanding peer connections * for the specified socket; this only applies to connection-oriented transports. */ public const SOCKOPT_BACKLOG = 19; /** * Limits the maximum size of the inbound message. Value -1 means no limit. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_MAXMSGSIZE = 22; /** * Sets the timeout for send operation on the socket. Value -1 means no limit. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_SNDTIMEO = 28; /** * Sets the timeout for receive operation on the socket. Value -1 means no limit. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_RCVTIMEO = 27; /** * Disable IPV6 support if 1. * Available if compiled against ZeroMQ 3.x */ public const SOCKOPT_IPV4ONLY = 31; /** * Retrieve the last connected endpoint - for use with * wildcard ports. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_LAST_ENDPOINT = 32; /** * Idle time for TCP keepalive. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_TCP_KEEPALIVE_IDLE = 36; /** * Count time for TCP keepalive. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_TCP_KEEPALIVE_CNT = 35; /** * Interval for TCP keepalive. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_TCP_KEEPALIVE_INTVL = 37; /** * Set a CIDR string to match against incoming TCP connections. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_DELAY_ATTACH_ON_CONNECT = 39; /** * Set a CIDR string to match against incoming TCP connections. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_TCP_ACCEPT_FILTER = 38; /** * Set the XPUB to receive an application message on each instance of a subscription. * Available if compiled against ZeroMQ 3.x or higher */ public const SOCKOPT_XPUB_VERBOSE = 40; /** * Sets the raw mode on the ROUTER, when set to 1. * In raw mode when using tcp:// transport the socket will read and write without ZeroMQ framing. * Available if compiled against ZeroMQ 4.0 or higher */ public const SOCKOPT_ROUTER_RAW = 41; /** * Enable IPV6. * Available if compiled against ZeroMQ 4.0 or higher */ public const SOCKOPT_IPV6 = 42; /** * The socket limit for this context. * Available if compiled against ZeroMQ 3.x or higher */ public const CTXOPT_MAX_SOCKETS = 2; /** * Poll for incoming data */ public const POLL_IN = 1; /** * Poll for outgoing data */ public const POLL_OUT = 2; /** * Non-blocking operation. * @deprecated use ZMQ::MODE_DONTWAIT instead */ public const MODE_NOBLOCK = 1; /** * Non-blocking operation */ public const MODE_DONTWAIT = 1; /** * Send multi-part message */ public const MODE_SNDMORE = 2; /** * Forwarder device */ public const DEVICE_FORWARDER = 2; /** * Queue device */ public const DEVICE_QUEUE = 3; /** * Streamer device */ public const DEVICE_STREAMER = 1; /** * ZMQ extension internal error */ public const ERR_INTERNAL = -99; /** * Implies that the operation would block when ZMQ::MODE_DONTWAIT is used */ public const ERR_EAGAIN = 11; /** * The operation is not supported by the socket type */ public const ERR_ENOTSUP = 156384713; /** * The operation can not be executed because the socket is not in correct state */ public const ERR_EFSM = 156384763; /** * The context has been terminated */ public const ERR_ETERM = 156384765; /** * Private constructor to prevent direct initialization. This class holds the constants for ZMQ extension. * @link https://secure.php.net/manual/en/zmq.construct.php */ private function __construct() {} } /** * Class ZMQContext * @link https://secure.php.net/manual/en/class.zmqcontext.php */ class ZMQContext { /** * Constructs a new ZMQ context. The context is used to initialize sockets. * A persistent context is required to initialize persistent sockets. * * @link https://secure.php.net/manual/en/zmqcontext.construct.php * * @param int $io_threads Number of io-threads in the context * @param bool $is_persistent Whether the context is persistent. Persistent context is stored over multiple requests and is a requirement for persistent sockets. */ public function __construct($io_threads = 1, $is_persistent = true) {} /** * (PECL zmq >= 1.0.4) * Returns the value of a context option. * * @link https://secure.php.net/manual/en/zmqcontext.getopt.php * * @param string $key An int representing the option. See the ZMQ::CTXOPT_* constants. * @return string|int Returns either a string or an integer depending on key. Throws ZMQContextException on error. * @throws ZMQContextException */ public function getOpt($key) {} /** * (PECL zmq >= 0.5.0) * Shortcut for creating new sockets from the context. * If the context is not persistent the persistent_id parameter is ignored * and the socket falls back to being non-persistent. * The on_new_socket is called only when a new underlying socket structure is created. * * @link https://secure.php.net/manual/en/zmqcontext.getsocket.php * * @param int $type ZMQ::SOCKET_* constant to specify socket type. * @param string $persistent_id If persistent_id is specified the socket will be persisted over multiple requests. * @param callable $on_new_socket Callback function, which is executed when a new socket structure is created. This function does not get invoked if the underlying persistent connection is re-used. The callback takes ZMQSocket and persistent_id as two arguments. * @return ZMQSocket * @throws ZMQSocketException */ public function getSocket($type, $persistent_id = null, $on_new_socket = null) {} /** * (PECL zmq >= 0.5.0) * Whether the context is persistent. * Persistent context is needed for persistent connections as each socket is allocated from a context. * * @link https://secure.php.net/manual/en/zmqcontext.ispersistent.php * * @return bool Returns TRUE if the context is persistent and FALSE if the context is non-persistent. */ public function isPersistent() {} /** * (PECL zmq >= 1.0.4) * Sets a ZMQ context option. The type of the value depends on the key. * See ZMQ Constant Types for more information. * * @link https://secure.php.net/manual/en/zmqcontext.setopt.php * * @param int $key One of the ZMQ::CTXOPT_* constants. * @param mixed $value The value of the parameter. * @return ZMQContext * @throws ZMQContextException */ public function setOpt($key, $value) {} } /** * Class ZMQSocket * @link https://secure.php.net/manual/en/class.zmqsocket.php */ class ZMQSocket { /** * (PECL zmq >= 0.5.0) * Constructs a ZMQSocket object. * The persistent_id parameter can be used to allocated a persistent socket. * A persistent socket has to be allocated from a persistent context and it stays connected over multiple requests. * The persistent_id parameter can be used to recall the same socket over multiple requests. * The on_new_socket is called only when a new underlying socket structure is created. * * @link https://secure.php.net/manual/en/zmqsocket.construct.php * * @param ZMQContext $context

ZMQContext to build this object

* @param int $type

The type of the socket. See ZMQ::SOCKET_* constants.

* @param string $persistent_id [optional]

If persistent_id is specified the socket will be persisted over multiple requests. If context is not persistent the socket falls back to non-persistent mode.

* @param callable $on_new_socket [optional]

Callback function, which is executed when a new socket structure is created. This function does not get invoked if the underlying persistent connection is re-used.

* * @throws ZMQSocketException */ public function __construct(ZMQContext $context, $type, $persistent_id = null, $on_new_socket = null) {} /** * (PECL zmq >= 0.5.0) * Bind the socket to an endpoint. * The endpoint is defined in format transport://address * where transport is one of the following: inproc, ipc, tcp, pgm or epgm. * * @link https://secure.php.net/manual/en/zmqsocket.bind.php * * @param string $dsn The bind dsn, for example transport://address. * @param bool $force Tries to bind even if the socket has already been bound to the given endpoint. * * @return ZMQSocket * @throws ZMQSocketException if binding fails */ public function bind($dsn, $force = false) {} /** * (PECL zmq >= 0.5.0) * Connect the socket to a remote endpoint. * The endpoint is defined in format transport://address * where transport is one of the following: inproc, ipc, tcp, pgm or epgm. * * @link https://secure.php.net/manual/en/zmqsocket.connect.php * * @param string $dsn The bind dsn, for example transport://address. * @param bool $force Tries to bind even if the socket has already been bound to the given endpoint. * * @return ZMQSocket * @throws ZMQSocketException If connection fails */ public function connect($dsn, $force = false) {} /** * (PECL zmq >= 1.0.4) * Disconnect the socket from a previously connected remote endpoint. * The endpoint is defined in format transport://address * where transport is one of the following: inproc, ipc, tcp, pgm or epgm. * * @link https://secure.php.net/manual/en/zmqsocket.disconnect.php * * @param string $dsn The bind dsn, for example transport://address. * * @return ZMQSocket * @throws ZMQSocketException If connection fails */ public function disconnect($dsn) {} /** * Returns a list of endpoints where the socket is connected or bound to. * * @link https://secure.php.net/manual/en/zmqsocket.getendpoints.php * * @return array contains two sub-arrays: 'connect' and 'bind' * @throws ZMQSocketException */ public function getEndpoints() {} /** * Returns the persistent id string assigned of the object and NULL if socket is not persistent. * * @link https://secure.php.net/manual/en/zmqsocket.getpersistentid.php * * @return string|null

* Returns the persistent id string assigned of the object and NULL if socket is not persistent. *

*/ public function getPersistentId() {} /** * Returns the value of a socket option. * This method is available if ZMQ extension has been compiled against ZMQ version 2.0.7 or higher * * @link https://secure.php.net/manual/en/zmqsocket.getsockopt.php * * @since 0MQ 2.0.7 * @param int $key An int representing the option. See the ZMQ::SOCKOPT_* constants. * * @return string|int

* Returns either a string or an integer depending on key. Throws * ZMQSocketException on error. *

* @throws ZMQSocketException */ public function getSockOpt($key) {} /** * Return the socket type. * The socket type can be compared against ZMQ::SOCKET_* constants. * * @link https://secure.php.net/manual/en/zmqsocket.getsockettype.php * * @return int

* Returns an integer representing the socket type. The integer can be compared against * ZMQ::SOCKET_* constants. *

*/ public function getSocketType() {} /** * Check whether the socket is persistent. * * @link https://secure.php.net/manual/en/zmqsocket.ispersistent.php * * @return bool

Returns a boolean based on whether the socket is persistent or not.

*/ public function isPersistent() {} /** * Receive a message from a socket. * By default receiving will block until a message is available unless ZMQ::MODE_NOBLOCK flag is used. * ZMQ::SOCKOPT_RCVMORE socket option can be used for receiving multi-part messages. * Returns the message. * If ZMQ::MODE_NOBLOCK is used and the operation would block bool false shall be returned. * * @link https://secure.php.net/manual/en/zmqsocket.recv.php * @see ZMQSocket::setSockOpt() * * @param int $mode Pass mode flags to receive multipart messages or non-blocking operation. See ZMQ::MODE_* constants. * * @return string|false

Returns the message. Throws ZMQSocketException in error. If ZMQ::MODE_NOBLOCK is used and the operation would block boolean false shall be returned.

* @throws ZMQSocketException if receiving fails. */ public function recv($mode = 0) {} /** * Receive an array multipart message from a socket. * By default receiving will block until a message is available unless ZMQ::MODE_NOBLOCK flag is used. * Returns the array of message parts. * If ZMQ::MODE_NOBLOCK is used and the operation would block bool false shall be returned. * * @link https://secure.php.net/manual/en/zmqsocket.recvmulti.php * * @param int $mode Pass mode flags to receive multipart messages or non-blocking operation. See ZMQ::MODE_* constants. * * @return string[] Returns the array of message parts. Throws ZMQSocketException in error. If ZMQ::MODE_NOBLOCK is used and the operation would block boolean false shall be returned. * @throws ZMQSocketException if receiving fails. */ public function recvMulti($mode = 0) {} /** * Send a message using the socket. The operation can block unless ZMQ::MODE_NOBLOCK is used. * If ZMQ::MODE_NOBLOCK is used and the operation would block bool false shall be returned. * * @link https://secure.php.net/manual/en/zmqsocket.send.php * * @param string $message The message to send * @param int $mode Pass mode flags to receive multipart messages or non-blocking operation. See ZMQ::MODE_* constants. * * * @return ZMQSocket * @throws ZMQSocketException if sending message fails */ public function send($message, $mode = 0) {} /** * Send a multipart message using the socket. The operation can block unless ZMQ::MODE_NOBLOCK is used. * If ZMQ::MODE_NOBLOCK is used and the operation would block bool false shall be returned. * * @link https://secure.php.net/manual/en/zmqsocket.sendmulti.php * * @param array $message The message to send - an array of strings * @param int $mode Pass mode flags to receive multipart messages or non-blocking operation. See ZMQ::MODE_* constants. * * * @return ZMQSocket * @throws ZMQSocketException if sending message fails */ public function sendmulti(array $message, $mode = 0) {} /** * Sets a ZMQ socket option. The type of the value depends on the key. * @see ZMQ Constant Types for more information. * * @link https://secure.php.net/manual/en/zmqsocket.setsockopt.php * * @param int $key One of the ZMQ::SOCKOPT_* constants. * @param mixed $value The value of the parameter. * * @return ZMQSocket * @throws ZMQSocketException */ public function setSockOpt($key, $value) {} /** * Unbind the socket from an endpoint. * The endpoint is defined in format transport://address * where transport is one of the following: inproc, ipc, tcp, pgm or epgm. * * @link https://secure.php.net/manual/en/zmqsocket.unbind.php * * @param string $dsn The previously bound dsn, for example transport://address. * * @return ZMQSocket * @throws ZMQSocketException if binding fails */ public function unbind($dsn) {} } /** * Class ZMQPoll * @link https://secure.php.net/manual/en/class.zmqpoll.php */ class ZMQPoll { /** * (PECL zmq >= 0.5.0) * Adds a new item to the poll set and returns the internal id of the added item. * The item can be removed from the poll set using the returned string id. * Returns a string id of the added item which can be later used to remove the item. * * @link https://secure.php.net/manual/en/zmqpoll.add.php * * @param ZMQSocket $entry ZMQSocket object or a PHP stream resource * @param int $type Defines what activity the socket is polled for. See ZMQ::POLL_IN and ZMQ::POLL_OUT constants. * * @return int Returns a string id of the added item which can be later used to remove the item. Throws ZMQPollException on error. * @throws ZMQPollException if the object has not been initialized with polling */ public function add(ZMQSocket $entry, $type) {} /** * (PECL zmq >= 1.0.4) * Clears all elements from the poll set. * * @link https://secure.php.net/manual/en/zmqpoll.clear.php * * @return ZMQPoll Returns the current object. */ public function clear() {} /** * (PECL zmq >= 0.5.0) * Count the items in the poll set. * * @link https://secure.php.net/manual/en/zmqpoll.count.php * * @return int Returns an integer representing the amount of items in the poll set. */ public function count() {} /** * (PECL zmq >= 0.5.0) * Returns the ids of the objects that had errors in the last poll. * Returns an array containing ids for the items that had errors in the last poll. * Empty array is returned if there were no errors. * * @link https://secure.php.net/manual/en/zmqpoll.getlasterrors.php * * @return int[] */ public function getLastErrors() {} /** * (PECL zmq >= 0.5.0) * Polls the items in the current poll set. * The readable and writable items are returned in the readable and writable parameters. * ZMQPoll::getLastErrors() can be used to check if there were errors. * Returns an int representing amount of items with activity. * * @link https://secure.php.net/manual/en/zmqpoll.poll.php * * @param array &$readable Array where readable ZMQSockets/PHP streams are returned. The array will be cleared at the beginning of the operation. * @param array &$writable Array where writable ZMQSockets/PHP streams are returned. The array will be cleared at the beginning of the operation. * @param int $timeout Timeout for the operation. -1 means that poll waits until at least one item has activity. Please note that starting from version 1.0.0 the poll timeout is defined in milliseconds, rather than microseconds. * * @throws ZMQPollException if polling fails * @return int */ public function poll(array &$readable, array &$writable, $timeout = -1) {} /** * (PECL zmq >= 0.5.0) * Remove item from the poll set. * The item parameter can be ZMQSocket object, a stream resource or the id returned from ZMQPoll::add() method. * Returns true if the item was removed and false if the object with given id does not exist in the poll set. * * @link https://secure.php.net/manual/en/zmqpoll.remove.php * * @param ZMQSocket|string|mixed $item The ZMQSocket object, PHP stream or string id of the item. * @return bool Returns true if the item was removed and false if the object with given id does not exist in the poll set. */ public function remove($item) {} } /** * Class ZMQDevice * @link https://secure.php.net/manual/en/class.zmqdevice.php */ class ZMQDevice { /** * (PECL zmq >= 1.0.4) * Construct a new device. * "ØMQ devices can do intermediation of addresses, services, queues, or any other abstraction you care * to define above the message and socket layers." -- zguide * Call to this method will prepare the device. Usually devices are very long running processes so running this method from interactive script is not recommended. This method throw ZMQDeviceException if the device cannot be started. * * @link https://secure.php.net/manual/en/zmqdevice.construct.php * * @param ZMQSocket $frontend Frontend parameter for the devices. Usually where there messages are coming. * @param ZMQSocket $backend Backend parameter for the devices. Usually where there messages going to. * @param null|ZMQSocket $listener Listener socket, which receives a copy of all messages going both directions. The type of this socket should be SUB, PULL or DEALER. */ public function __construct(ZMQSocket $frontend, ZMQSocket $backend, ZMQSocket $listener = null) {} /** * Gets the idle callback timeout value. * This method returns the idle callback timeout value. * Added in ZMQ extension version 1.1.0. * * @link https://secure.php.net/manual/en/zmqdevice.getidletimeout.php * * @return int This method returns the idle callback timeout value. */ public function getIdleTimeout() {} /** * Gets the timer callback timeout value. * Added in ZMQ extension version 1.1.0. * * @link https://secure.php.net/manual/en/zmqdevice.gettimertimeout.php * * @return int This method returns the timer timeout value. */ public function getTimerTimeout() {} /** * Runs the device. * Call to this method will block until the device is running. * It is not recommended that devices are used from interactive scripts. * * @link https://secure.php.net/manual/en/zmqdevice.run.php * * @throws ZMQDeviceException */ public function run() {} /** * Sets the idle callback function. * If idle timeout is defined the idle callback function shall be called if the internal poll loop times out * without events. If the callback function returns false or a value that evaluates to false the device is stopped. * The callback function signature is callback (mixed $user_data). * * @link https://secure.php.net/manual/en/zmqdevice.setidlecallback.php * * @param callable $cb_func Callback function to invoke when the device is idle. Returning false or a value that evaluates to false from this function will cause the device to stop. * @param int $timeout How often to invoke the idle callback in milliseconds. The idle callback is invoked periodically when there is no activity on the device. The timeout value guarantees that there is at least this amount of milliseconds between invocations of the callback function. * @param mixed $user_data Additional data to pass to the callback function. * * @return ZMQDevice On success this method returns the current object. */ public function setIdleCallback($cb_func, $timeout, $user_data) {} /** * Sets the idle callback timeout value. The idle callback is invoked periodically when the device is idle. * On success this method returns the current object. * * @link https://secure.php.net/manual/en/zmqdevice.setidletimeout.php * * @param int $timeout The idle callback timeout value in milliseconds * * @return ZMQDevice On success this method returns the current object. */ public function setIdleTimeout($timeout) {} /** * Sets the timer callback function. The timer callback will be invoked after timeout has passed. * The difference between idle and timer callbacks are that idle callback is invoked only when the device is idle. * The callback function signature is callback (mixed $user_data). * Added in ZMQ extension version 1.1.0. * * @link https://secure.php.net/manual/en/zmqdevice.settimercallback.php * * @param callable $cb_func Callback function to invoke when the device is idle. Returning false or a value that evaluates to false from this function will cause the device to stop. * @param int $timeout How often to invoke the idle callback in milliseconds. The idle callback is invoked periodically when there is no activity on the device. The timeout value guarantees that there is at least this amount of milliseconds between invocations of the callback function. * @param mixed $user_data Additional data to pass to the callback function. * * @return ZMQDevice */ public function setTimerCallback($cb_func, $timeout, $user_data) {} /** * Sets the timer callback timeout value. The timer callback is invoked periodically if it's set. * Added in ZMQ extension version 1.1.0. * * @link https://secure.php.net/manual/en/zmqdevice.settimertimeout.php * * @param int $timeout The timer callback timeout value. * * @return ZMQDevice */ public function setTimerTimeout($timeout) {} } class ZMQException extends Exception {} class ZMQContextException extends ZMQException {} class ZMQSocketException extends ZMQException {} class ZMQPollException extends ZMQException {} class ZMQDeviceException extends ZMQException {} * The value of pid can be one of the following: * * possible values for pid * * * * * * * * * * * * * * * * *
< -1 * wait for any child process whose process group ID is equal to * the absolute value of pid. *
-1 * wait for any child process; this is the same behaviour that * the wait function exhibits. *
0 * wait for any child process whose process group ID is equal to * that of the calling process. *
> 0 * wait for the child whose process ID is equal to the value of * pid. *
*

*

* Specifying -1 as the pid is * equivalent to the functionality pcntl_wait provides * (minus options). *

* @param int &$status

* pcntl_waitpid will store status information * in the status parameter which can be * evaluated using the following functions: * pcntl_wifexited, * pcntl_wifstopped, * pcntl_wifsignaled, * pcntl_wexitstatus, * pcntl_wtermsig and * pcntl_wstopsig. *

* @param int $flags [optional]

* The value of options is the value of zero * or more of the following two global constants * OR'ed together: * * possible values for options * * * * * * * * *
WNOHANG * return immediately if no child has exited. *
WUNTRACED * return for children which are stopped, and whose status has * not been reported. *
*

* @param array &$resource_usage * @return int pcntl_waitpid returns the process ID of the * child which exited, -1 on error or zero if WNOHANG was used and no * child was available */ function pcntl_waitpid( int $process_id, &$status, int $flags = 0, #[PhpStormStubsElementAvailable(from: '7.0')] &$resource_usage = [] ): int {} /** * Waits on or returns the status of a forked child * @link https://php.net/manual/en/function.pcntl-wait.php * @param int &$status

* pcntl_wait will store status information * in the status parameter which can be * evaluated using the following functions: * pcntl_wifexited, * pcntl_wifstopped, * pcntl_wifsignaled, * pcntl_wexitstatus, * pcntl_wtermsig and * pcntl_wstopsig. *

* @param int $flags [optional]

* If wait3 is available on your system (mostly BSD-style systems), you can * provide the optional flags parameter. If this * parameter is not provided, wait will be used for the system call. If * wait3 is not available, providing a value for flags * will have no effect. The value of flags * is the value of zero or more of the following two constants * OR'ed together: * * Possible values for flags * * * * * * * * *
WNOHANG * Return immediately if no child has exited. *
WUNTRACED * Return for children which are stopped, and whose status has * not been reported. *
*

* @param array &$resource_usage * @return int pcntl_wait returns the process ID of the * child which exited, -1 on error or zero if WNOHANG was provided as an * option (on wait3-available systems) and no child was available. */ function pcntl_wait( &$status, int $flags = 0, #[PhpStormStubsElementAvailable(from: '7.0')] &$resource_usage = [] ): int {} /** * Installs a signal handler * @link https://php.net/manual/en/function.pcntl-signal.php * @param int $signal

* The signal number. *

* @param callable|int $handler

* The signal handler. This may be either a callable, which * will be invoked to handle the signal, or either of the two global * constants SIG_IGN or SIG_DFL, * which will ignore the signal or restore the default signal handler * respectively. *

*

* If a callable is given, it must implement the following * signature: *

*

* voidhandler * intsigno * signo * The signal being handled.

* @param bool $restart_syscalls [optional]

* Specifies whether system call restarting should be used when this * signal arrives. *

* @return bool TRUE on success or FALSE on failure. */ function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): bool {} /** * Calls signal handlers for pending signals * @link https://php.net/manual/en/function.pcntl-signal-dispatch.php * @return bool TRUE on success or FALSE on failure. */ function pcntl_signal_dispatch(): bool {} /** * Checks if status code represents a normal exit * @link https://php.net/manual/en/function.pcntl-wifexited.php * @param int $status

The status * parameter is the status parameter supplied to a successful * call to pcntl_waitpid.

* @return bool TRUE if the child status code represents a normal exit, FALSE * otherwise. */ #[Pure] function pcntl_wifexited(int $status): bool {} /** * Checks whether the child process is currently stopped * @link https://php.net/manual/en/function.pcntl-wifstopped.php * @param int $status

The status * parameter is the status parameter supplied to a successful * call to pcntl_waitpid.

* @return bool TRUE if the child process which caused the return is * currently stopped, FALSE otherwise. */ #[Pure] function pcntl_wifstopped(int $status): bool {} /** * Checks whether the status code represents a termination due to a signal * @link https://php.net/manual/en/function.pcntl-wifsignaled.php * @param int $status

The status * parameter is the status parameter supplied to a successful * call to pcntl_waitpid.

* @return bool TRUE if the child process exited because of a signal which was * not caught, FALSE otherwise. */ #[Pure] function pcntl_wifsignaled(int $status): bool {} /** * Returns the return code of a terminated child * @link https://php.net/manual/en/function.pcntl-wexitstatus.php * @param int $status

The status * parameter is the status parameter supplied to a successful * call to pcntl_waitpid.

* @return int|false the return code, as an integer. */ #[Pure] function pcntl_wexitstatus(int $status): int|false {} /** * @param int $status * @return bool */ #[Pure] function pcntl_wifcontinued(int $status): bool {} /** * Returns the signal which caused the child to terminate * @link https://php.net/manual/en/function.pcntl-wtermsig.php * @param int $status

The status * parameter is the status parameter supplied to a successful * call to pcntl_waitpid.

* @return int|false the signal number, as an integer. */ #[Pure] function pcntl_wtermsig(int $status): int|false {} /** * Returns the signal which caused the child to stop * @link https://php.net/manual/en/function.pcntl-wstopsig.php * @param int $status

The status * parameter is the status parameter supplied to a successful * call to pcntl_waitpid.

* @return int|false the signal number. */ #[Pure] function pcntl_wstopsig(int $status): int|false {} /** * Executes specified program in current process space * @link https://php.net/manual/en/function.pcntl-exec.php * @param string $path

* path must be the path to a binary executable or a * script with a valid path pointing to an executable in the shebang ( * #!/usr/local/bin/perl for example) as the first line. See your system's * man execve(2) page for additional information. *

* @param array $args

* args is an array of argument strings passed to the * program. *

* @param array $env_vars

* envs is an array of strings which are passed as * environment to the program. The array is in the format of name => value, * the key being the name of the environmental variable and the value being * the value of that variable. *

* @return bool FALSE on error and does not return on success. */ function pcntl_exec(string $path, array $args = [], array $env_vars = []): bool {} /** * Set an alarm clock for delivery of a signal * @link https://php.net/manual/en/function.pcntl-alarm.php * @param int $seconds

* The number of seconds to wait. If seconds is * zero, no new alarm is created. *

* @return int the time in seconds that any previously scheduled alarm had * remaining before it was to be delivered, or 0 if there * was no previously scheduled alarm. */ function pcntl_alarm(int $seconds): int {} /** * Retrieve the error number set by the last pcntl function which failed * @link https://php.net/manual/en/function.pcntl-get-last-error.php * @return int error code. * @since 5.3.4 */ #[Pure(true)] function pcntl_get_last_error(): int {} /** * Alias of pcntl_get_last_error * @link https://php.net/manual/en/function.pcntl-errno.php * @return int error code. * @since 5.3.4 */ #[Pure(true)] function pcntl_errno(): int {} /** * Retrieve the system error message associated with the given errno * @link https://php.net/manual/en/function.pcntl-strerror.php * @param int $error_code

*

* @return string|false error description on success or FALSE on failure. * @since 5.3.4 */ #[Pure] #[LanguageLevelTypeAware(["8.0" => "string"], default: "string|false")] function pcntl_strerror(int $error_code): false|string {} /** * Get the priority of any process * @link https://php.net/manual/en/function.pcntl-getpriority.php * @param int|null $process_id [optional]

* If not specified, the pid of the current process (getmypid()) is used. *

* @param int $mode [optional]

* One of PRIO_PGRP, PRIO_USER * or PRIO_PROCESS. *

* @return int|false pcntl_getpriority returns the priority of the process * or FALSE on error. A lower numerical value causes more favorable * scheduling. */ #[Pure] function pcntl_getpriority(?int $process_id, int $mode = PRIO_PROCESS): int|false {} /** * Change the priority of any process * @link https://php.net/manual/en/function.pcntl-setpriority.php * @param int $priority

* priority is generally a value in the range * -20 to 20. The default priority * is 0 while a lower numerical value causes more * favorable scheduling. Because priority levels can differ between * system types and kernel versions, please see your system's setpriority(2) * man page for specific details. *

* @param int|null $process_id [optional]

* If not specified, the pid of the current process (getmypid()) is used. *

* @param int $mode [optional]

* One of PRIO_PGRP, PRIO_USER * or PRIO_PROCESS. *

* @return bool TRUE on success or FALSE on failure. */ function pcntl_setpriority(int $priority, ?int $process_id, int $mode = PRIO_PROCESS): bool {} /** * Sets and retrieves blocked signals * @link https://php.net/manual/en/function.pcntl-sigprocmask.php * @param int $mode

* Sets the behavior of pcntl_sigprocmask. Possible * values: * SIG_BLOCK: Add the signals to the * currently blocked signals. * SIG_UNBLOCK: Remove the signals from the * currently blocked signals. * SIG_SETMASK: Replace the currently * blocked signals by the given list of signals. *

* @param array $signals

* List of signals. *

* @param array &$old_signals [optional]

* The old_signals parameter is set to an array * containing the list of the previously blocked signals. *

* @return bool TRUE on success or FALSE on failure. */ function pcntl_sigprocmask(int $mode, array $signals, &$old_signals): bool {} /** * Waits for signals * @link https://php.net/manual/en/function.pcntl-sigwaitinfo.php * @param array $signals

* Array of signals to wait for. *

* @param array &$info

* The info parameter is set to an array containing * informations about the signal. *

*

* The following elements are set for all signals: * signo: Signal number * errno: An error number * code: Signal code *

*

* The following elements may be set for the SIGCHLD signal: * status: Exit value or signal * utime: User time consumed * stime: System time consumed * pid: Sending process ID * uid: Real user ID of sending process *

*

* The following elements may be set for the SIGILL, * SIGFPE, SIGSEGV and * SIGBUS signals: * addr: Memory location which caused fault *

*

* The following element may be set for the SIGPOLL * signal: * band: Band event * fd: File descriptor number *

* @return int|false On success, pcntl_sigwaitinfo returns a signal number. */ function pcntl_sigwaitinfo(array $signals, &$info = []): int|false {} /** * Waits for signals, with a timeout * @link https://php.net/manual/en/function.pcntl-sigtimedwait.php * @param array $signals

* Array of signals to wait for. *

* @param array &$info

* The siginfo is set to an array containing * informations about the signal. See * pcntl_sigwaitinfo. *

* @param int $seconds [optional]

* Timeout in seconds. *

* @param int $nanoseconds [optional]

* Timeout in nanoseconds. *

* @return int|false On success, pcntl_sigtimedwait returns a signal number. */ function pcntl_sigtimedwait(array $signals, &$info = [], int $seconds = 0, int $nanoseconds = 0): int|false {} /** * Enable/disable asynchronous signal handling or return the old setting.
* If the enable parameter is omitted, it returns whether asynchronous * signal handling is enabled. * @link https://www.php.net/manual/en/function.pcntl-async-signals.php * * @param bool|null $enable

* Whether asynchronous signal handling should be enabled. *

* * @return bool * @since 7.1 */ function pcntl_async_signals( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] ?bool $enable, #[PhpStormStubsElementAvailable(from: '8.0')] ?bool $enable = null ): bool {} /** * Get the current handler for specified signal. * @link https://www.php.net/manual/en/function.pcntl-signal-get-handler.php * * @param int $signal

* The signal number. *

* * @return bool|resource * @since 7.1 */ function pcntl_signal_get_handler(int $signal) {} /** * @param int $flags * @return bool * @since 7.4 */ function pcntl_unshare(int $flags): bool {} /** * @since 8.4 */ function pcntl_waitid(int $idtype = P_ALL, ?int $id = null, &$info = [], int $flags = WEXITED): bool {} /** * @since 8.4 */ function pcntl_getcpuaffinity(?int $process_id = null): array|false {} /** * @since 8.4 */ function pcntl_setcpuaffinity(?int $process_id = null, array $cpu_ids = []): bool {} /** * @since 8.4 */ function pcntl_getcpu(): int {} define('WNOHANG', 1); define('WUNTRACED', 2); define('WCONTINUED', 8); define('SIG_IGN', 1); define('SIG_DFL', 0); define('SIG_ERR', -1); define('SIGHUP', 1); define('SIGINT', 2); define('SIGQUIT', 3); define('SIGILL', 4); define('SIGTRAP', 5); define('SIGABRT', 6); define('SIGIOT', 6); define('SIGBUS', 7); define('SIGFPE', 8); define('SIGKILL', 9); define('SIGUSR1', 10); define('SIGSEGV', 11); define('SIGUSR2', 12); define('SIGPIPE', 13); define('SIGALRM', 14); define('SIGTERM', 15); define('SIGSTKFLT', 16); define('SIGCLD', 17); define('SIGCHLD', 17); define('SIGCONT', 18); define('SIGSTOP', 19); define('SIGTSTP', 20); define('SIGTTIN', 21); define('SIGTTOU', 22); define('SIGURG', 23); define('SIGXCPU', 24); define('SIGXFSZ', 25); define('SIGVTALRM', 26); define('SIGPROF', 27); define('SIGWINCH', 28); define('SIGPOLL', 29); define('SIGIO', 29); define('SIGPWR', 30); define('SIGSYS', 31); define('SIGBABY', 31); define('PRIO_PGRP', 1); define('PRIO_USER', 2); define('PRIO_PROCESS', 0); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SIG_BLOCK', 0); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SIG_UNBLOCK', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SIG_SETMASK', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SIGRTMIN', 35); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SIGRTMAX', 64); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_USER', 0); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_KERNEL', 128); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_QUEUE', -1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_TIMER', -2); define('SI_MESGQ', -3); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_ASYNCIO', -4); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_SIGIO', -5); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SI_TKILL', -6); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('CLD_EXITED', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('CLD_KILLED', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('CLD_DUMPED', 3); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('CLD_TRAPPED', 4); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('CLD_STOPPED', 5); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('CLD_CONTINUED', 6); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('TRAP_BRKPT', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('TRAP_TRACE', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('POLL_IN', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('POLL_OUT', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('POLL_MSG', 3); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('POLL_ERR', 4); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('POLL_PRI', 5); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('POLL_HUP', 6); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_ILLOPC', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_ILLOPN', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_ILLADR', 3); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_ILLTRP', 4); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_PRVOPC', 5); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_PRVREG', 6); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_COPROC', 7); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('ILL_BADSTK', 8); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_INTDIV', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_INTOVF', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_FLTDIV', 3); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_FLTOVF', 4); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_FLTUND', 5); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_FLTRES', 6); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_FLTINV', 7); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('FPE_FLTSUB', 8); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SEGV_MAPERR', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('SEGV_ACCERR', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('BUS_ADRALN', 1); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('BUS_ADRERR', 2); /** * @link https://php.net/manual/en/pcntl.constants.php */ define('BUS_OBJERR', 3); define('PCNTL_EINTR', 4); define('PCNTL_ECHILD', 10); define('PCNTL_EINVAL', 22); define('PCNTL_EAGAIN', 11); define('PCNTL_ESRCH', 3); define('PCNTL_EACCES', 13); define('PCNTL_EPERM', 1); define('PCNTL_ENOMEM', 12); define('PCNTL_E2BIG', 7); define('PCNTL_EFAULT', 14); define('PCNTL_EIO', 5); define('PCNTL_EISDIR', 21); define('PCNTL_ELIBBAD', 80); define('PCNTL_ELOOP', 40); define('PCNTL_EMFILE', 24); define('PCNTL_ENAMETOOLONG', 36); define('PCNTL_ENFILE', 23); define('PCNTL_ENOENT', 2); define('PCNTL_ENOEXEC', 8); define('PCNTL_ENOTDIR', 20); define('PCNTL_ETXTBSY', 26); /** * @since 7.4 */ define('PCNTL_ENOSPC', 28); /** * @since 7.4 */ define('PCNTL_EUSERS', 87); /** * @since 7.4 */ define('CLONE_NEWNS', 131072); /** * @since 7.4 */ define('CLONE_NEWIPC', 134217728); /** * @since 7.4 */ define('CLONE_NEWUTS', 67108864); /** * @since 7.4 */ define('CLONE_NEWNET', 1073741824); /** * @since 7.4 */ define('CLONE_NEWPID', 536870912); /** * @since 7.4 */ define('CLONE_NEWUSER', 268435456); /** * @since 7.4 */ define('CLONE_NEWCGROUP', 33554432); /** * @since 8.4 */ define('P_ALL', 0); /** * @since 8.4 */ define('WEXITED', 4); /** * @since 8.4 */ define('WSTOPPED', 2); /** * @since 8.4 */ define('WNOWAIT', 16777216); /** * @since 8.4 */ define('P_PID', 1); /** * @since 8.4 */ define('P_PGID', 2); /** * @since 8.4 */ define('P_PIDFD', 3); // End of pcntl v. * The language parameter is the language code which consists of the * two letter ISO 639 language code and an optional two letter ISO * 3166 country code after a dash or underscore. *

* @param string $spelling

* The spelling parameter is the requested spelling for languages * with more than one spelling such as English. Known values are * 'american', 'british', and 'canadian'. *

* @param string $jargon

* The jargon parameter contains extra information to distinguish * two different words lists that have the same language and * spelling parameters. *

* @param string $encoding

* The encoding parameter is the encoding that words are expected to * be in. Valid values are 'utf-8', 'iso8859-*', 'koi8-r', * 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned * 32'. This parameter is largely untested, so be careful when * using. *

* @param int $mode

* The mode parameter is the mode in which spellchecker will work. * There are several modes available: * PSPELL_FAST - Fast mode (least number of * suggestions)

* @return int|false the dictionary link identifier on success or FALSE on failure. */ #[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary|false'], default: 'int|false')] function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0) {} /** * Load a new dictionary with personal wordlist * @link https://php.net/manual/en/function.pspell-new-personal.php * @param string $filename

* The file where words added to the personal list will be stored. * It should be an absolute filename beginning with '/' because otherwise * it will be relative to $HOME, which is "/root" for most systems, and * is probably not what you want. *

* @param string $language

* The language code which consists of the two letter ISO 639 language * code and an optional two letter ISO 3166 country code after a dash * or underscore. *

* @param string $spelling

* The requested spelling for languages with more than one spelling such * as English. Known values are 'american', 'british', and 'canadian'. *

* @param string $jargon

* Extra information to distinguish two different words lists that have * the same language and spelling parameters. *

* @param string $encoding

* The encoding that words are expected to be in. Valid values are * utf-8, iso8859-*, * koi8-r, viscii, * cp1252, machine unsigned 16, * machine unsigned 32. *

* @param int $mode

* The mode in which spellchecker will work. There are several modes available: * PSPELL_FAST - Fast mode (least number of * suggestions)

* @return int|false the dictionary link identifier for use in other pspell functions. */ #[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary|false'], default: 'int|false')] function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0) {} /** * Load a new dictionary with settings based on a given config * @link https://php.net/manual/en/function.pspell-new-config.php * @param int $config

* The config parameter is the one returned by * pspell_config_create when the config was created. *

* @return int|false a dictionary link identifier on success. */ #[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary|false'], default: 'int|false')] function pspell_new_config(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config) {} /** * Check a word * @link https://php.net/manual/en/function.pspell-check.php * @param int $dictionary * @param string $word

* The tested word. *

* @return bool TRUE if the spelling is correct, FALSE if not. */ function pspell_check(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary, string $word): bool {} /** * Suggest spellings of a word * @link https://php.net/manual/en/function.pspell-suggest.php * @param int $dictionary * @param string $word

* The tested word. *

* @return array|false an array of possible spellings. */ function pspell_suggest(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary, string $word): array|false {} /** * Store a replacement pair for a word * @link https://php.net/manual/en/function.pspell-store-replacement.php * @param int $dictionary

* A dictionary link identifier, opened with * pspell_new_personal *

* @param string $misspelled

* The misspelled word. *

* @param string $correct

* The fixed spelling for the misspelled word. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_store_replacement(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary, string $misspelled, string $correct): bool {} /** * Add the word to a personal wordlist * @link https://php.net/manual/en/function.pspell-add-to-personal.php * @param int $dictionary * @param string $word

* The added word. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_add_to_personal(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary, string $word): bool {} /** * Add the word to the wordlist in the current session * @link https://php.net/manual/en/function.pspell-add-to-session.php * @param int $dictionary * @param string $word

* The added word. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_add_to_session(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary, string $word): bool {} /** * Clear the current session * @link https://php.net/manual/en/function.pspell-clear-session.php * @param int $dictionary * @return bool TRUE on success or FALSE on failure. */ function pspell_clear_session(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary): bool {} /** * Save the personal wordlist to a file * @link https://php.net/manual/en/function.pspell-save-wordlist.php * @param int $dictionary

* A dictionary link identifier opened with * pspell_new_personal. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_save_wordlist(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Dictionary'], default: 'int')] $dictionary): bool {} /** * Create a config used to open a dictionary * @link https://php.net/manual/en/function.pspell-config-create.php * @param string $language

* The language parameter is the language code which consists of the * two letter ISO 639 language code and an optional two letter ISO * 3166 country code after a dash or underscore. *

* @param string $spelling

* The spelling parameter is the requested spelling for languages * with more than one spelling such as English. Known values are * 'american', 'british', and 'canadian'. *

* @param string $jargon

* The jargon parameter contains extra information to distinguish * two different words lists that have the same language and * spelling parameters. *

* @param string $encoding

* The encoding parameter is the encoding that words are expected to * be in. Valid values are 'utf-8', 'iso8859-*', 'koi8-r', * 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned * 32'. This parameter is largely untested, so be careful when * using. *

* @return int Retuns a pspell config identifier. */ #[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = "") {} /** * Consider run-together words as valid compounds * @link https://php.net/manual/en/function.pspell-config-runtogether.php * @param int $config * @param bool $allow

* TRUE if run-together words should be treated as legal compounds, * FALSE otherwise. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_config_runtogether(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, bool $allow): bool {} /** * Change the mode number of suggestions returned * @link https://php.net/manual/en/function.pspell-config-mode.php * @param int $config * @param int $mode

* The mode parameter is the mode in which spellchecker will work. * There are several modes available: * PSPELL_FAST - Fast mode (least number of * suggestions)

* @return bool TRUE on success or FALSE on failure. */ function pspell_config_mode(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, int $mode): bool {} /** * Ignore words less than N characters long * @link https://php.net/manual/en/function.pspell-config-ignore.php * @param int $config * @param int $min_length

* Words less than n characters will be skipped. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_config_ignore(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, int $min_length): bool {} /** * Set a file that contains personal wordlist * @link https://php.net/manual/en/function.pspell-config-personal.php * @param int $config * @param string $filename

* The personal wordlist. If the file does not exist, it will be created. * The file should be writable by whoever PHP runs as (e.g. nobody). *

* @return bool TRUE on success or FALSE on failure. */ function pspell_config_personal(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, string $filename): bool {} /** * Location of the main word list * @link https://php.net/manual/en/function.pspell-config-dict-dir.php * @param int $config * @param string $directory * @return bool TRUE on success or FALSE on failure. */ function pspell_config_dict_dir(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, string $directory): bool {} /** * location of language data files * @link https://php.net/manual/en/function.pspell-config-data-dir.php * @param int $config * @param string $directory * @return bool TRUE on success or FALSE on failure. */ function pspell_config_data_dir(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, string $directory): bool {} /** * Set a file that contains replacement pairs * @link https://php.net/manual/en/function.pspell-config-repl.php * @param int $config * @param string $filename

* The file should be writable by whoever PHP runs as (e.g. nobody). *

* @return bool TRUE on success or FALSE on failure. */ function pspell_config_repl(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, string $filename): bool {} /** * Determine whether to save a replacement pairs list * along with the wordlist * @link https://php.net/manual/en/function.pspell-config-save-repl.php * @param int $config * @param bool $save

* TRUE if replacement pairs should be saved, FALSE otherwise. *

* @return bool TRUE on success or FALSE on failure. */ function pspell_config_save_repl(#[LanguageLevelTypeAware(['8.1' => 'PSpell\Config'], default: 'int')] $config, bool $save): bool {} define('PSPELL_FAST', 1); define('PSPELL_NORMAL', 2); define('PSPELL_BAD_SPELLERS', 3); define('PSPELL_RUN_TOGETHER', 8); // End of pspell v. * Case sensitive regular expression. *

* @param string $string

* The input string. *

* @param null|array &$regs [optional]

* If matches are found for parenthesized substrings of * pattern and the function is called with the * third argument regs, the matches will be stored * in the elements of the array regs. *

*

* $regs[1] will contain the substring which starts at * the first left parenthesis; $regs[2] will contain * the substring starting at the second, and so on. * $regs[0] will contain a copy of the complete string * matched. *

* @return int the length of the matched string if a match for * pattern was found in string, * or FALSE if no matches were found or an error occurred. *

*

* If the optional parameter regs was not passed or * the length of the matched string is 0, this function returns 1. * @removed 7.0 * @see preg_match() */ #[Deprecated(reason: "Use preg_match() instead", since: "5.3")] function ereg($pattern, $string, ?array &$regs = null) {} /** * Replace regular expression * @link https://php.net/manual/en/function.ereg-replace.php * @param string $pattern

* A POSIX extended regular expression. *

* @param string $replacement

* If pattern contains parenthesized substrings, * replacement may contain substrings of the form * \digit, which will be * replaced by the text matching the digit'th parenthesized substring; * \0 will produce the entire contents of string. * Up to nine substrings may be used. Parentheses may be nested, in which * case they are counted by the opening parenthesis. *

* @param string $string

* The input string. *

* @return string The modified string is returned. If no matches are found in * string, then it will be returned unchanged. * @removed 7.0 * @see preg_replace() */ #[Deprecated(reason: "Use preg_replace() instead", since: "5.3")] function ereg_replace($pattern, $replacement, $string) {} /** * Case insensitive regular expression match * @link https://php.net/manual/en/function.eregi.php * @param string $pattern

* Case insensitive regular expression. *

* @param string $string

* The input string. *

* @param null|array &$regs [optional]

* If matches are found for parenthesized substrings of * pattern and the function is called with the * third argument regs, the matches will be stored * in the elements of the array regs. *

*

* $regs[1] will contain the substring which starts at the first left * parenthesis; $regs[2] will contain the substring starting at the * second, and so on. $regs[0] will contain a copy of the complete string * matched. *

* @return int the length of the matched string if a match for * pattern was found in string, * or FALSE if no matches were found or an error occurred. *

*

* If the optional parameter regs was not passed or * the length of the matched string is 0, this function returns 1. * @removed 7.0 * @see preg_match() */ #[Deprecated(reason: "Use preg_match() instead", since: "5.3")] function eregi($pattern, $string, array &$regs = null) {} /** * Replace regular expression case insensitive * @link https://php.net/manual/en/function.eregi-replace.php * @param string $pattern

* A POSIX extended regular expression. *

* @param string $replacement

* If pattern contains parenthesized substrings, * replacement may contain substrings of the form * \digit, which will be * replaced by the text matching the digit'th parenthesized substring; * \0 will produce the entire contents of string. * Up to nine substrings may be used. Parentheses may be nested, in which * case they are counted by the opening parenthesis. *

* @param string $string

* The input string. *

* @return string The modified string is returned. If no matches are found in * string, then it will be returned unchanged. * @removed 7.0 * @see preg_replace() */ #[Deprecated(reason: "Use preg_replace() instead", since: "5.3")] function eregi_replace($pattern, $replacement, $string) {} /** * Split string into array by regular expression * @link https://php.net/manual/en/function.split.php * @param string $pattern

* Case sensitive regular expression. *

*

* If you want to split on any of the characters which are considered * special by regular expressions, you'll need to escape them first. If * you think split (or any other regex function, for * that matter) is doing something weird, please read the file * regex.7, included in the * regex/ subdirectory of the PHP distribution. It's * in manpage format, so you'll want to do something along the lines of * man /usr/local/src/regex/regex.7 in order to read it. *

* @param string $string

* The input string. *

* @param int $limit [optional]

* If limit is set, the returned array will * contain a maximum of limit elements with the * last element containing the whole rest of * string. *

* @return array an array of strings, each of which is a substring of * string formed by splitting it on boundaries formed * by the case-sensitive regular expression pattern. *

*

* If there are n occurrences of * pattern, the returned array will contain * n+1 items. For example, if * there is no occurrence of pattern, an array with * only one element will be returned. Of course, this is also true if * string is empty. If an error occurs, * split returns FALSE. * @removed 7.0 * @see preg_split() */ #[Deprecated(reason: "Use preg_split() instead", since: "5.3")] function split($pattern, $string, $limit = -1) {} /** * Split string into array by regular expression case insensitive * @link https://php.net/manual/en/function.spliti.php * @param string $pattern

* Case insensitive regular expression. *

*

* If you want to split on any of the characters which are considered * special by regular expressions, you'll need to escape them first. If * you think spliti (or any other regex function, for * that matter) is doing something weird, please read the file * regex.7, included in the * regex/ subdirectory of the PHP distribution. It's * in manpage format, so you'll want to do something along the lines of * man /usr/local/src/regex/regex.7 in order to read it. *

* @param string $string

* The input string. *

* @param int $limit [optional]

* If limit is set, the returned array will * contain a maximum of limit elements with the * last element containing the whole rest of * string. *

* @return array an array of strings, each of which is a substring of * string formed by splitting it on boundaries formed * by the case insensitive regular expression pattern. *

*

* If there are n occurrences of * pattern, the returned array will contain * n+1 items. For example, if * there is no occurrence of pattern, an array with * only one element will be returned. Of course, this is also true if * string is empty. If an error occurs, * spliti returns FALSE. * @removed 7.0 * @see preg_split() */ #[Deprecated(reason: "Use preg_split() instead", since: "5.3")] function spliti($pattern, $string, $limit = -1) {} /** * Make regular expression for case insensitive match * @link https://php.net/manual/en/function.sql-regcase.php * @param string $string

* The input string. *

* @return string a valid regular expression which will match * string, ignoring case. This expression is * string with each alphabetic character converted to * a bracket expression; this bracket expression contains that character's * uppercase and lowercase form. Other characters remain unchanged. * @removed 7.0 */ #[Deprecated(since: '5.3')] function sql_regcase($string) {} // End of ereg v. setProperty('report', 'true'). * * @return XdmNode */ public function getValidationReport() {} /** * Set the parameters required for XQuery Processor * * @param string $name * @param XdmValue $value * @return void */ public function setParameter($name, $value) {} /** * Set properties for Schema Validator. * * @param string $name * @param string $value * @return void */ public function setProperty($name, $value) {} /** * Clear parameter values set * * @return void */ public function clearParameters() {} /** * Clear property values set * * @return void */ public function clearProperties() {} /** * Clear any exception thrown * * @return void */ public function exceptionClear() {} /** * Get the $i'th error code if there are any errors * * @param int $i * @return string */ public function getErrorCode($i) {} /** * Get the $i'th error message if there are any errors * * @param int $i * @return string */ public function getErrorMessage($i) {} /** * Get number of error during execution of the validator * * @return int */ public function getExceptionCount() {} } /** * @link https://www.saxonica.com/saxon-c/documentation/index.html#!api/saxon_c_php_api/saxon_c_php_xdmvalue */ class XdmValue { /** * Get the first item in the sequence * * @return XdmItem */ public function getHead() {} /** * Get the n'th item in the value, counting from zero * * @param int $index * @return XdmItem */ public function itemAt($index) {} /** * Get the number of items in the sequence * * @return int */ public function size() {} /** * Add item to the sequence at the end. * * @param XdmItem $item */ public function addXdmItem($item) {} } /** * @link https://www.saxonica.com/saxon-c/documentation/index.html#!api/saxon_c_php_api/saxon_c_php_xdmitem */ class XdmItem extends XdmValue { /** * Get the string value of the item. For a node, this gets the string value of the node. For an atomic value, it has the same effect as casting the value to a string. In all cases the result is the same as applying the XPath string() function. * * @return string */ public function getStringValue() {} /** * Determine whether the item is a node value or not. * * @return bool */ public function isNode() {} /** * Determine whether the item is an atomic value or not. * * @return bool */ public function isAtomic() {} /** * Provided the item is an atomic value we return the {@link XdmAtomicValue} otherwise return null * * @return XdmAtomicValue|null */ public function getAtomicValue() {} /** * Provided the item is a node value we return the {@link XdmNode} otherwise return null * * @return XdmNode|null */ public function getNodeValue() {} } /** * @link https://www.saxonica.com/saxon-c/documentation/index.html#!api/saxon_c_php_api/saxon_c_php_xdmnode */ class XdmNode extends XdmItem { /** * Get the string value of the item. For a node, this gets the string value of the node. * * @return string */ public function getStringValue() {} /** * Get the kind of node * * @return int */ public function getNodeKind() {} /** * Get the name of the node, as a EQName * * @return string */ public function getNodeName() {} /** * Determine whether the item is an atomic value or a node. This method will return FALSE as the item is not atomic * * @return false */ public function isAtomic() {} /** * Get the count of child node at this current node * * @return int */ public function getChildCount() {} /** * Get the count of attribute nodes at this node * * @return int */ public function getAttributeCount() {} /** * Get the n'th child node at this node. If the child node selected does not exist then return null * * @param int $index * @return XdmNode|null */ public function getChildNode($index) {} /** * Get the parent of this node. If parent node does not exist then return null * * @return XdmNode|null */ public function getParent() {} /** * Get the n'th attribute node at this node. If the attribute node selected does not exist then return null * * @param int $index * @return XdmNode|null */ public function getAttributeNode($index) {} /** * Get the n'th attribute node value at this node. If the attribute node selected does not exist then return null * * @param int $index * @return string|null */ public function getAttributeValue($index) {} } /** * @link https://www.saxonica.com/saxon-c/documentation/index.html#!api/saxon_c_php_api/saxon_c_php_xdmatomicvalue */ class XdmAtomicValue extends XdmItem { /** * Get the string value of the item. For an atomic value, it has the same effect as casting the value to a string. In all cases the result is the same as applying the XPath string() function. * * @return string */ public function getStringValue() {} /** * Get the value converted to a boolean using the XPath casting rules * * @return bool */ public function getBooleanValue() {} /** * Get the value converted to a float using the XPath casting rules. If the value is a string, the XSD 1.1 rules are used, which means that the string "+INF" is recognised * * @return float */ public function getDoubleValue() {} /** * Get the value converted to an integer using the XPath casting rules * * @return int */ public function getLongValue() {} /** * Determine whether the item is an atomic value or a node. Return TRUE if the item is an atomic value * * @return true */ public function isAtomic() {} } * Retrieves information about files cached in the file cache * @link https://secure.php.net/manual/en/function.wincache-fcache-fileinfo.php * @param bool $summaryonly [optional] *

Controls whether the returned array will contain information about individual * cache entries along with the file cache summary.

* @return array|false Array of meta data about file cache or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • total_cache_uptime - total time in seconds that the file cache has been active
  • *
  • total_file_count - total number of files that are currently in the file cache
  • *
  • total_hit_count - number of times the files have been served from the file cache
  • *
  • total_miss_count - number of times the files have not been found in the file cache
  • *
  • file_entries - an array that contains the information about all the cached files: *
      *
    • file_name - absolute file name of the cached file
    • *
    • add_time - time in seconds since the file has been added to the file cache
    • *
    • use_time - time in seconds since the file has been accessed in the file cache
    • *
    • last_check - time in seconds since the file has been checked for modifications
    • *
    • hit_count - number of times the file has been served from the cache
    • *
    • file_size - size of the cached file in bytes
    • *
  • *

*/ function wincache_fcache_fileinfo($summaryonly = false) {} /** * (PHP 5.2+; PECL wincache >= 1.0.0)
* Retrieves information about memory usage by file cache. * @link https://secure.php.net/manual/en/function.wincache-fcache-meminfo.php * @return array|false Array of meta data about file cache memory usage or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • memory_total - amount of memory in bytes allocated for the file cache
  • *
  • memory_free - amount of free memory in bytes available for the file cache
  • *
  • num_used_blks - number of memory blocks used by the file cache
  • *
  • num_free_blks - number of free memory blocks available for the file cache
  • *
  • memory_overhead - amount of memory in bytes used for the file cache internal structures
  • *

*/ function wincache_fcache_meminfo() {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Obtains an exclusive lock on a given key. *

The execution of the current script will be blocked until the lock can be * obtained. Once the lock is obtained, the other scripts that try to request the * lock by using the same key will be blocked, until the current script releases * the lock by using wincache_unlock().

* @link https://secure.php.net/manual/en/function.wincache-lock.php * @param string $key Name of the key in the cache to get the lock on. * @param bool $isglobal [optional] *

Controls whether the scope of the lock is system-wide or local. Local locks * are scoped to the application pool in IIS FastCGI case or to all php processes * that have the same parent process identifier.

* @return bool Returns TRUE on success or FALSE on failure. */ function wincache_lock($key, $isglobal = false) {} /** * (PHP 5.2+; PECL wincache >= 1.0.0)
* Retrieves information about opcode cache content and its usage * @link https://secure.php.net/manual/en/function.wincache-ocache-fileinfo.php * @param bool $summaryonly [optional] *

Controls whether the returned array will contain information about individual * cache entries along with the opcode cache summary.

* @return array|false Array of meta data about opcode cache or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • total_cache_uptime - total time in seconds that the opcode cache has been active
  • *
  • total_file_count - total number of files that are currently in the opcode cache
  • *
  • total_hit_count - number of times the compiled opcode have been served from the cache
  • *
  • total_miss_count - number of times the compiled opcode have not been found in the cache
  • *
  • is_local_cache - true is the cache metadata is for a local cache instance, false * if the metadata is for the global cache
  • *
  • file_entries - an array that contains the information about all the cached files: *
      *
    • file_name - absolute file name of the cached file
    • *
    • add_time - time in seconds since the file has been added to the opcode cache
    • *
    • use_time - time in seconds since the file has been accessed in the opcode cache
    • *
    • last_check - time in seconds since the file has been checked for modifications
    • *
    • hit_count - number of times the file has been served from the cache
    • *
    • function_count - number of functions in the cached file
    • *
    • class_count - number of classes in the cached file
    • *
  • *

*/ function wincache_ocache_fileinfo($summaryonly = false) {} /** * (PHP 5.2+; PECL wincache >= 1.0.0)
* Retrieves information about memory usage by opcode cache. * @link https://secure.php.net/manual/en/function.wincache-ocache-meminfo.php * @return array|false Array of meta data about opcode cache memory usage or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • memory_total - amount of memory in bytes allocated for the opcode cache
  • *
  • memory_free - amount of free memory in bytes available for the opcode cache
  • *
  • num_used_blks - number of memory blocks used by the opcode cache
  • *
  • num_free_blks - number of free memory blocks available for the opcode cache
  • *
  • memory_overhead - amount of memory in bytes used for the opcode cache internal structures
  • *

*/ function wincache_ocache_meminfo() {} /** * (PHP 5.2+; PECL wincache >= 1.0.0)
* Refreshes the cache entries for the files, whose names were passed in the input argument. *

If no argument is specified then refreshes all the entries in the cache.

* @link https://secure.php.net/manual/en/function.wincache-refresh-if-changed.php * @param array $files [optional] *

An array of file names for files that need to be refreshed. An absolute * or relative file paths can be used.

* @return bool Returns TRUE on success or FALSE on failure. */ function wincache_refresh_if_changed(array $files) {} /** * (PHP 5.2+; PECL wincache >= 1.0.0)
* Retrieves information about cached mappings between relative file paths and * corresponding absolute file paths. * @link https://secure.php.net/manual/en/function.wincache-rplist-fileinfo.php * @return array|false Array of meta data about the resolve file path cache or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • total_file_count - total number of file path mappings stored in the cache
  • *
  • rplist_entries - an array that contains the information about all the cached file paths: *
      *
    • resolve_path - path to a file
    • *
    • subkey_data - corresponding absolute path to a file
    • *
  • *

*/ function wincache_rplist_fileinfo() {} /** * (PHP 5.2+; PECL wincache >= 1.0.0)
* Retrieves information about memory usage by resolve file path cache. * @link https://secure.php.net/manual/en/function.wincache-rplist-meminfo.php * @return array|false Array of meta data that describes memory usage by resolve file path cache. or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • memory_total - amount of memory in bytes allocated for the resolve file path cache
  • *
  • memory_free - amount of free memory in bytes available for the resolve file path cache
  • *
  • num_used_blks - number of memory blocks used by the resolve file path cache
  • *
  • num_free_blks - number of free memory blocks available for the resolve file path cache
  • *
  • memory_overhead - amount of memory in bytes used for the internal structures of resolve file path cache
  • *

*/ function wincache_rplist_meminfo() {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Retrieves information about session cache content and its usage. * @link https://secure.php.net/manual/en/function.wincache-scache-info.php * @param bool $summaryonly [optional] *

Controls whether the returned array will contain information about individual * cache entries along with the session cache summary.

* @return array|false Array of meta data about session cache or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • total_cache_uptime - total time in seconds that the session cache has been active
  • *
  • total_item_count - total number of elements that are currently in the session cache
  • *
  • is_local_cache - true is the cache metadata is for a local cache instance, false * if the metadata is for the global cache
  • *
  • total_hit_count - number of times the data has been served from the cache
  • *
  • total_miss_count - number of times the data has not been found in the cache
  • *
  • scache_entries - an array that contains the information about all the cached items: *
      *
    • key_name - name of the key which is used to store the data
    • *
    • value_type - type of value stored by the key
    • *
    • use_time - time in seconds since the file has been accessed in the opcode cache
    • *
    • last_check - time in seconds since the file has been checked for modifications
    • *
    • ttl_seconds - time remaining for the data to live in the cache, 0 meaning infinite
    • *
    • age_seconds - time elapsed from the time data has been added in the cache
    • *
    • hitcount - number of times data has been served from the cache
    • *
  • *

*/ function wincache_scache_info($summaryonly = false) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Retrieves information about memory usage by session cache. * @link https://secure.php.net/manual/en/function.wincache-scache-meminfo.php * @return array|false Array of meta data about session cache memory usage or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • memory_total - amount of memory in bytes allocated for the session cache
  • *
  • memory_free - amount of free memory in bytes available for the session cache
  • *
  • num_used_blks - number of memory blocks used by the session cache
  • *
  • num_free_blks - number of free memory blocks available for the session cache
  • *
  • memory_overhead - amount of memory in bytes used for the session cache internal structures
  • *

*/ function wincache_scache_meminfo() {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Adds a variable in user cache, only if this variable doesn't already exist in the cache. *

The added variable remains in the user cache unless its time to live expires * or it is deleted by using wincache_ucache_delete() or wincache_ucache_clear() functions.

* @link https://secure.php.net/manual/en/function.wincache-ucache-add.php * @param string $key

Store the variable using this key name. If a variable with * same key is already present the function will fail and return FALSE. key is case * sensitive. To override the value even if key is present use wincache_ucache_set() * function instad. key can also take array of name => value pairs where names will * be used as keys. This can be used to add multiple values in the cache in one * operation, thus avoiding race condition.

* @param mixed $value

Value of a variable to store. Value supports all data * types except resources, such as file handles. This parameter is ignored if * first argument is an array. A general guidance is to pass NULL as value while * using array as key.

* @param int $ttl [optional] *

Time for the variable to live in the cache in seconds. After the value * specified in ttl has passed the stored variable will be deleted from the * cache. This parameter takes a default value of 0 which means the variable * will stay in the cache unless explicitly deleted by using wincache_ucache_delete() * or wincache_ucache_clear() functions.

* @return bool If key is string, the function returns TRUE on success and FALSE on failure. *

If key is an array, the function returns: *

    *
  • If all the name => value pairs in the array can be set, function returns an empty array;
  • *
  • If all the name => value pairs in the array cannot be set, function returns FALSE;
  • *
  • If some can be set while others cannot, function returns an array with name=>value pair * for which the addition failed in the user cache.
  • *

*/ function wincache_ucache_add($key, $value, $ttl = 0) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Compares the variable associated with the key with old_value * and if it matches then assigns the new_value to it. * @link https://secure.php.net/manual/en/function.wincache-ucache-cas.php * @param string $key The key that is used to store the variable in the cache. key is case sensitive. * @param int $old_value Old value of the variable pointed by key in the user cache. * The value should be of type long, otherwise the function returns FALSE. * @param int $new_value New value which will get assigned to variable pointer by key * if a match is found. The value should be of type long, otherwise the function returns FALSE. * @return bool Returns TRUE on success or FALSE on failure. */ function wincache_ucache_cas($key, $old_value, $new_value) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Clears/deletes all the values stored in the user cache. * @link https://secure.php.net/manual/en/function.wincache-ucache-clear.php * @return bool Returns TRUE on success or FALSE on failure. */ function wincache_ucache_clear() {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Decrements the value associated with the key by 1 or as specified by dec_by. * @link https://secure.php.net/manual/en/function.wincache-ucache-dec.php * @param string $key

The key that was used to store the variable in the cache. * key is case sensitive.

* @param int $dec_by

The value by which the variable associated with the key will * get decremented. If the argument is a floating point number it will be truncated * to nearest integer. The variable associated with the key should be of type long, * otherwise the function fails and returns FALSE.

* @param bool|null &$success [optional] *

Will be set to TRUE on success and FALSE on failure.

* @return int|false Returns the decremented value on success and FALSE on failure. */ function wincache_ucache_dec($key, $dec_by = 1, &$success) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Deletes the elements in the user cache pointed by key. * @link https://secure.php.net/manual/en/function.wincache-ucache-delete.php * @param string|string[] $key

The key that was used to store the variable in the cache. * key is case sensitive. key can be an array of keys.

* @return bool Returns TRUE on success or FALSE on failure. *

If key is an array then the function returns FALSE if every element of * the array fails to get deleted from the user cache, otherwise returns an * array which consists of all the keys that are deleted.

*/ function wincache_ucache_delete($key) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Checks if a variable with the key exists in the user cache or not. * @link https://secure.php.net/manual/en/function.wincache-ucache-exists.php * @param string $key The key that was used to store the variable in the cache. key is case sensitive. * @return bool Returns TRUE if variable with the key exitsts, otherwise returns FALSE. */ function wincache_ucache_exists($key) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Gets a variable stored in the user cache. * @link https://secure.php.net/manual/en/function.wincache-ucache-get.php * @param string|string[] $key

The key that was used to store the variable in the cache. * key is case sensitive. key can be an array of keys. In this case the return * value will be an array of values of each element in the key array.

* @param bool|null &$success [optional] *

Will be set to TRUE on success and FALSE on failure.

* @return mixed

If key is a string, the function returns the value of the variable * stored with that key. The success is set to TRUE on success and to FALSE on failure.

*

The key is an array, the parameter success is always set to TRUE. The returned array * (name => value pairs) will contain only those name => value pairs for which the get * operation in user cache was successful. If none of the keys in the key array finds a * match in the user cache an empty array will be returned.

*/ function wincache_ucache_get($key, &$success) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Increments the value associated with the key by 1 or as specified by inc_by. * @link https://secure.php.net/manual/en/function.wincache-ucache-inc.php * @param string $key

The key that was used to store the variable in the cache. * key is case sensitive.

* @param int $inc_by

The value by which the variable associated with the key will * get incremented. If the argument is a floating point number it will be truncated * to nearest integer. The variable associated with the key should be of type long, * otherwise the function fails and returns FALSE.

* @param bool|null &$success [optional] *

Will be set to TRUE on success and FALSE on failure.

* @return int|false Returns the incremented value on success and FALSE on failure. */ function wincache_ucache_inc($key, $inc_by = 1, &$success) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Retrieves information about data stored in the user cache. * @link https://secure.php.net/manual/en/function.wincache-ucache-info.php * @param bool $summaryonly [optional] *

Controls whether the returned array will contain information about * individual cache entries along with the user cache summary.

* @param null|string $key [optional] *

The key of an entry in the user cache. If specified then the returned array * will contain information only about that cache entry. If not specified and * summaryonly is set to false then the returned array will contain information * about all entries in the cache.

* @return array|false Array of meta data about user cache or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • total_cache_uptime - total time in seconds that the user cache has been active
  • *
  • total_item_count - total number of elements that are currently in the user cache
  • *
  • is_local_cache - true is the cache metadata is for a local cache instance, false * if the metadata is for the global cache
  • *
  • total_hit_count - number of times the data has been served from the cache
  • *
  • total_miss_count - number of times the data has not been found in the cache
  • *
  • ucache_entries - an array that contains the information about all the cached items: *
      *
    • key_name - name of the key which is used to store the data
    • *
    • value_type - type of value stored by the key
    • *
    • use_time - time in seconds since the file has been accessed in the opcode cache
    • *
    • last_check - time in seconds since the file has been checked for modifications
    • *
    • is_session - indicates if the data is a session variable
    • *
    • ttl_seconds - time remaining for the data to live in the cache, 0 meaning infinite
    • *
    • age_seconds - time elapsed from the time data has been added in the cache
    • *
    • hitcount - number of times data has been served from the cache
    • *
  • *

*/ function wincache_ucache_info(bool $summaryonly = false, $key = null) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Retrieves information about memory usage by user cache. * @link https://secure.php.net/manual/en/function.wincache-ucache-meminfo.php * @return array|false Array of meta data about user cache memory usage or FALSE on failure *

The array returned by this function contains the following elements: *

    *
  • memory_total - amount of memory in bytes allocated for the user cache
  • *
  • memory_free - amount of free memory in bytes available for the user cache
  • *
  • num_used_blks - number of memory blocks used by the user cache
  • *
  • num_free_blks - number of free memory blocks available for the user cache
  • *
  • memory_overhead - amount of memory in bytes used for the user cache internal structures
  • *

*/ function wincache_ucache_meminfo() {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Adds a variable in user cache and overwrites a variable if it already exists in the cache. *

The added or updated variable remains in the user cache unless its time to * live expires or it is deleted by using wincache_ucache_delete() or * wincache_ucache_clear() functions.

* @link https://secure.php.net/manual/en/function.wincache-ucache-set.php * @param string|string[] $key

* Store the variable using this key name. If a variable with same key is already * present the function will overwrite the previous value with the new one. key * is case sensitive. key can also take array of name => value pairs where * names will be used as keys. This can be used to add multiple values in the * cache in one operation, thus avoiding race condition.

* @param mixed $value

* Value of a variable to store. Value supports all data types except resources, * such as file handles. This parameter is ignored if first argument is an array. * A general guidance is to pass NULL as value while using array as key.

* @param int $ttl [optional]

* Time for the variable to live in the cache in seconds. After the value specified * in ttl has passed the stored variable will be deleted from the cache. This * parameter takes a default value of 0 which means the variable will stay in the * cache unless explicitly deleted by using wincache_ucache_delete() or * wincache_ucache_clear() functions.

* @return bool

* If key is string, the function returns TRUE on success and FALSE on failure.

*

If key is an array, the function returns: *

    *
  • If all the name => value pairs in the array can be set, function * returns an empty array;
  • *
  • If all the name => value pairs in the array cannot be set, function * returns FALSE;
  • *
  • If some can be set while others cannot, function returns an array with * name=>value pair for which the addition failed in the user cache.
  • *

*/ function wincache_ucache_set($key, $value, $ttl = 0) {} /** * (PHP 5.2+; PECL wincache >= 1.1.0)
* Releases an exclusive lock that was obtained on a given key by using wincache_lock(). *

If any other process was blocked waiting for the lock on this key, that process will be able to obtain the lock.

* @link https://secure.php.net/manual/en/function.wincache-unlock.php * @param string $key Name of the key in the cache to release the lock on. * @return bool Returns TRUE on success or FALSE on failure. */ function wincache_unlock($key) {} value pairs. * The constant_name must follow the normal constant naming rules. Value must evaluate to a scalar value. * @param bool $case_sensitive The default behaviour for constants is to be declared case-sensitive; * i.e. CONSTANT and Constant represent different values. If this parameter evaluates to FALSE * the constants will be declared as case-insensitive symbols. * @return bool Returns TRUE on success or FALSE on failure. */ function apc_define_constants($key, array $constants, $case_sensitive = true) {} /** * Caches a variable in the data store, only if it's not already stored * @link https://php.net/manual/en/function.apc-add.php * @param string $key Store the variable using this name. Keys are cache-unique, * so attempting to use apc_add() to store data with a key that already exists will not * overwrite the existing data, and will instead return FALSE. (This is the only difference * between apc_add() and apc_store().) * @param mixed $var The variable to store * @param int $ttl Time To Live; store var in the cache for ttl seconds. After the ttl has passed, * the stored variable will be expunged from the cache (on the next request). If no ttl is supplied * (or if the ttl is 0), the value will persist until it is removed from the cache manually, * or otherwise fails to exist in the cache (clear, restart, etc.). * @return bool */ function apc_add($key, $var, $ttl = 0) {} /** * Stores a file in the bytecode cache, bypassing all filters * @link https://php.net/manual/en/function.apc-compile-file.php * @param string|string[] $filename Full or relative path to a PHP file that will be * compiled and stored in the bytecode cache. * @param bool $atomic * @return bool Returns TRUE on success or FALSE on failure. */ function apc_compile_file($filename, $atomic = true) {} /** * Loads a set of constants from the cache * @link https://php.net/manual/en/function.apc-load-constants.php * @param string $key The name of the constant set (that was stored * with apc_define_constants()) to be retrieved. * @param bool $case_sensitive The default behaviour for constants is to be declared case-sensitive; * i.e. CONSTANT and Constant represent different values. If this parameter evaluates to FALSE * the constants will be declared as case-insensitive symbols. * @return bool Returns TRUE on success or FALSE on failure. */ function apc_load_constants($key, $case_sensitive = true) {} /** * Checks if APC key exists * @link https://php.net/manual/en/function.apc-exists.php * @param string|string[] $keys A string, or an array of strings, that contain keys. * @return bool|string[] Returns TRUE if the key exists, otherwise FALSE * Or if an array was passed to keys, then an array is returned that * contains all existing keys, or an empty array if none exist. */ function apc_exists($keys) {} /** * Deletes the given files from the opcode cache * * Accepts a string, array of strings, or APCIterator object. * Returns True/False, or for an Array an Array of failed files. * * @link https://php.net/manual/en/function.apc-delete-file.php * @param string|string[]|APCIterator $keys * @return bool|string[] */ function apc_delete_file($keys) {} /** * Increase a stored number * @link https://php.net/manual/en/function.apc-inc.php * @param string $key The key of the value being increased. * @param int $step The step, or value to increase. * @param bool|null &$success Optionally pass the success or fail boolean value to this referenced variable. * @return int|false Returns the current value of key's value on success, or FALSE on failure. */ function apc_inc($key, $step = 1, &$success = null) {} /** * Decrease a stored number * @link https://php.net/manual/en/function.apc-dec.php * @param string $key The key of the value being decreased. * @param int $step The step, or value to decrease. * @param bool|null &$success Optionally pass the success or fail boolean value to this referenced variable. * @return int|false Returns the current value of key's value on success, or FALSE on failure. */ function apc_dec($key, $step = 1, &$success = null) {} /** * Updates an old value with a new value * @link https://php.net/manual/en/function.apc-cas.php * @param string $key * @param int $old * @param int $new * @return bool */ function apc_cas($key, $old, $new) {} /** * Returns a binary dump of the given files and user variables from the APC cache * * A NULL for files or user_vars signals a dump of every entry, while array() will dump nothing. * * @link https://php.net/manual/en/function.apc-bin-dump.php * @param string[]|null $files The files. Passing in NULL signals a dump of every entry, while passing in array() will dump nothing. * @param string[]|null $user_vars The user vars. Passing in NULL signals a dump of every entry, while passing in array() will dump nothing. * @return string|false|null Returns a binary dump of the given files and user variables from the APC cache, FALSE if APC is not enabled, or NULL if an unknown error is encountered. */ function apc_bin_dump($files = null, $user_vars = null) {} /** * Output a binary dump of the given files and user variables from the APC cache to the named file * @link https://php.net/manual/en/function.apc-bin-dumpfile.php * @param string[]|null $files The file names being dumped. * @param string[]|null $user_vars The user variables being dumped. * @param string $filename The filename where the dump is being saved. * @param int $flags Flags passed to the filename stream. See the file_put_contents() documentation for details. * @param resource $context The context passed to the filename stream. See the file_put_contents() documentation for details. * @return int|false The number of bytes written to the file, otherwise FALSE if APC * is not enabled, filename is an invalid file name, filename can't be opened, * the file dump can't be completed (e.g., the hard drive is out of disk space), * or an unknown error was encountered. */ function apc_bin_dumpfile($files, $user_vars, $filename, $flags = 0, $context = null) {} /** * Load the given binary dump into the APC file/user cache * @link https://php.net/manual/en/function.apc-bin-load.php * @param string $data The binary dump being loaded, likely from apc_bin_dump(). * @param int $flags Either APC_BIN_VERIFY_CRC32, APC_BIN_VERIFY_MD5, or both. * @return bool Returns TRUE if the binary dump data was loaded with success, otherwise FALSE is returned. * FALSE is returned if APC is not enabled, or if the data is not a valid APC binary dump (e.g., unexpected size). */ function apc_bin_load($data, $flags = 0) {} /** * Load the given binary dump from the named file into the APC file/user cache * @link https://php.net/manual/en/function.apc-bin-loadfile.php * @param string $filename The file name containing the dump, likely from apc_bin_dumpfile(). * @param resource $context The files context. * @param int $flags Either APC_BIN_VERIFY_CRC32, APC_BIN_VERIFY_MD5, or both. * @return bool Returns TRUE on success, otherwise FALSE Reasons it may return FALSE include APC * is not enabled, filename is an invalid file name or empty, filename can't be opened, * the file dump can't be completed, or if the data is not a valid APC binary dump (e.g., unexpected size). */ function apc_bin_loadfile($filename, $context = null, $flags = 0) {} /** * The APCIterator class * * The APCIterator class makes it easier to iterate over large APC caches. * This is helpful as it allows iterating over large caches in steps, while grabbing a defined number * of entries per lock instance, so it frees the cache locks for other activities rather than hold up * the entire cache to grab 100 (the default) entries. Also, using regular expression matching is more * efficient as it's been moved to the C level. * * @link https://php.net/manual/en/class.apciterator.php */ class APCIterator implements Iterator { /** * Constructs an APCIterator iterator object * @link https://php.net/manual/en/apciterator.construct.php * @param string $cache The cache type, which will be 'user' or 'file'. * @param string|string[]|null $search A PCRE regular expression that matches against APC key names, * either as a string for a single regular expression, or as an array of regular expressions. * Or, optionally pass in NULL to skip the search. * @param int $format The desired format, as configured with one ore more of the APC_ITER_* constants. * @param int $chunk_size The chunk size. Must be a value greater than 0. The default value is 100. * @param int $list The type to list. Either pass in APC_LIST_ACTIVE or APC_LIST_INACTIVE. */ public function __construct($cache, $search = null, $format = APC_ITER_ALL, $chunk_size = 100, $list = APC_LIST_ACTIVE) {} /** * Rewinds back the iterator to the first element * @link https://php.net/manual/en/apciterator.rewind.php */ public function rewind() {} /** * Checks if the current iterator position is valid * @link https://php.net/manual/en/apciterator.valid.php * @return bool Returns TRUE if the current iterator position is valid, otherwise FALSE. */ public function valid() {} /** * Gets the current item from the APCIterator stack * @link https://php.net/manual/en/apciterator.current.php * @return mixed|false Returns the current item on success, or FALSE if no more items or exist, or on failure. */ public function current() {} /** * Gets the current iterator key * @link https://php.net/manual/en/apciterator.key.php * @return string|int|false Returns the key on success, or FALSE upon failure. */ public function key() {} /** * Moves the iterator pointer to the next element * @link https://php.net/manual/en/apciterator.next.php * @return bool Returns TRUE on success or FALSE on failure. */ public function next() {} /** * Gets the total number of cache hits * @link https://php.net/manual/en/apciterator.gettotalhits.php * @return int|false The number of hits on success, or FALSE on failure. */ public function getTotalHits() {} /** * Gets the total cache size * @link https://php.net/manual/en/apciterator.gettotalsize.php * @return int|bool The total cache size. */ public function getTotalSize() {} /** * Get the total count * @link https://php.net/manual/en/apciterator.gettotalcount.php * @return int|bool The total count. */ public function getTotalCount() {} } /** * Stubs for APCu 5.0.0 */ /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_LIST_ACTIVE', 1); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_LIST_DELETED', 2); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_TYPE', 1); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_KEY', 2); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_FILENAME', 4); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_DEVICE', 8); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_INODE', 16); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_VALUE', 32); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_MD5', 64); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_NUM_HITS', 128); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_MTIME', 256); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_CTIME', 512); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_DTIME', 1024); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_ATIME', 2048); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_REFCOUNT', 4096); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_MEM_SIZE', 8192); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_TTL', 16384); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_NONE', 0); /** * @link https://php.net/manual/en/apcu.constants.php */ define('APC_ITER_ALL', -1); /** * Clears the APCu cache * @link https://php.net/manual/en/function.apcu-clear-cache.php * * @return bool Returns TRUE always. */ function apcu_clear_cache() {} /** * Retrieves APCu Shared Memory Allocation information * @link https://php.net/manual/en/function.apcu-sma-info.php * @param bool $limited When set to FALSE (default) apcu_sma_info() will * return a detailed information about each segment. * * @return array|false Array of Shared Memory Allocation data; FALSE on failure. */ function apcu_sma_info($limited = false) {} /** * Cache a variable in the data store * @link https://php.net/manual/en/function.apcu-store.php * @param string|string[] $key String: Store the variable using this name. Keys are cache-unique, * so storing a second value with the same key will overwrite the original value. * Array: Names in key, variables in value. * @param mixed $var [optional] The variable to store * @param int $ttl [optional] Time To Live; store var in the cache for ttl seconds. After the ttl has passed, * the stored variable will be expunged from the cache (on the next request). If no ttl is supplied * (or if the ttl is 0), the value will persist until it is removed from the cache manually, * or otherwise fails to exist in the cache (clear, restart, etc.). * @return bool|array Returns TRUE on success or FALSE on failure | array with error keys. */ function apcu_store($key, $var, $ttl = 0) {} /** * Fetch a stored variable from the cache * @link https://php.net/manual/en/function.apcu-fetch.php * @param string|string[] $key The key used to store the value (with apcu_store()). * If an array is passed then each element is fetched and returned. * @param bool|null &$success Set to TRUE in success and FALSE in failure. * @return mixed|false The stored variable or array of variables on success; FALSE on failure. */ function apcu_fetch($key, &$success = null) {} /** * Removes a stored variable from the cache * @link https://php.net/manual/en/function.apcu-delete.php * @param string|string[]|APCUIterator $key The key used to store the value (with apcu_store()). * @return bool|string[] Returns TRUE on success or FALSE on failure. For array of keys returns list of failed keys. */ function apcu_delete($key) {} /** * Caches a variable in the data store, only if it's not already stored * @link https://php.net/manual/en/function.apcu-add.php * @param string|array $key Store the variable using this name. Keys are cache-unique, * so attempting to use apcu_add() to store data with a key that already exists will not * overwrite the existing data, and will instead return FALSE. (This is the only difference * between apcu_add() and apcu_store().) * Array: Names in key, variables in value. * @param mixed $var The variable to store * @param int $ttl Time To Live; store var in the cache for ttl seconds. After the ttl has passed, * the stored variable will be expunged from the cache (on the next request). If no ttl is supplied * (or if the ttl is 0), the value will persist until it is removed from the cache manually, * or otherwise fails to exist in the cache (clear, restart, etc.). * @return bool|array Returns TRUE if something has effectively been added into the cache, FALSE otherwise. * Second syntax returns array with error keys. */ function apcu_add($key, $var, $ttl = 0) {} /** * Checks if APCu key exists * @link https://php.net/manual/en/function.apcu-exists.php * @param string|string[] $keys A string, or an array of strings, that contain keys. * @return bool|string[] Returns TRUE if the key exists, otherwise FALSE * Or if an array was passed to keys, then an array is returned that * contains all existing keys, or an empty array if none exist. */ function apcu_exists($keys) {} /** * Increase a stored number * @link https://php.net/manual/en/function.apcu-inc.php * @param string $key The key of the value being increased. * @param int $step The step, or value to increase. * @param int $ttl Time To Live; store var in the cache for ttl seconds. After the ttl has passed, * the stored variable will be expunged from the cache (on the next request). If no ttl is supplied * (or if the ttl is 0), the value will persist until it is removed from the cache manually, * or otherwise fails to exist in the cache (clear, restart, etc.). * @param bool|null &$success Optionally pass the success or fail boolean value to this referenced variable. * @return int|false Returns the current value of key's value on success, or FALSE on failure. */ function apcu_inc($key, $step = 1, &$success = null, $ttl = 0) {} /** * Decrease a stored number * @link https://php.net/manual/en/function.apcu-dec.php * @param string $key The key of the value being decreased. * @param int $step The step, or value to decrease. * @param int $ttl Time To Live; store var in the cache for ttl seconds. After the ttl has passed, * the stored variable will be expunged from the cache (on the next request). If no ttl is supplied * (or if the ttl is 0), the value will persist until it is removed from the cache manually, * or otherwise fails to exist in the cache (clear, restart, etc.). * @param bool|null &$success Optionally pass the success or fail boolean value to this referenced variable. * @return int|false Returns the current value of key's value on success, or FALSE on failure. */ function apcu_dec($key, $step = 1, &$success = null, $ttl = 0) {} /** * Updates an old value with a new value * * apcu_cas() updates an already existing integer value if the old parameter matches the currently stored value * with the value of the new parameter. * * @link https://php.net/manual/en/function.apcu-cas.php * @param string $key The key of the value being updated. * @param int $old The old value (the value currently stored). * @param int $new The new value to update to. * @return bool Returns TRUE on success or FALSE on failure. */ function apcu_cas($key, $old, $new) {} /** * Atomically fetch or generate a cache entry * *

Atomically attempts to find key in the cache, if it cannot be found generator is called, * passing key as the only argument. The return value of the call is then cached with the optionally * specified ttl, and returned. *

* *

Note: When control enters apcu_entry() the lock for the cache is acquired exclusively, it is released when * control leaves apcu_entry(): In effect, this turns the body of generator into a critical section, * disallowing two processes from executing the same code paths concurrently. * In addition, it prohibits the concurrent execution of any other APCu functions, * since they will acquire the same lock. *

* * @link https://php.net/manual/en/function.apcu-entry.php * * @param string $key Identity of cache entry * @param callable $generator A callable that accepts key as the only argument and returns the value to cache. *

Warning * The only APCu function that can be called safely by generator is apcu_entry().

* @param int $ttl [optional] Time To Live; store var in the cache for ttl seconds. * After the ttl has passed, the stored variable will be expunged from the cache (on the next request). * If no ttl is supplied (or if the ttl is 0), the value will persist until it is removed from the cache manually, * or otherwise fails to exist in the cache (clear, restart, etc.). * @return mixed Returns the cached value * @since APCu 5.1.0 */ function apcu_entry($key, callable $generator, $ttl = 0) {} /** * Retrieves cached information from APCu's data store * * @link https://php.net/manual/en/function.apcu-cache-info.php * * @param bool $limited If limited is TRUE, the return value will exclude the individual list of cache entries. * This is useful when trying to optimize calls for statistics gathering. * @return array|false Array of cached data (and meta-data) or FALSE on failure */ function apcu_cache_info($limited = false) {} /** * Whether APCu is usable in the current environment * * @link https://www.php.net/manual/en/function.apcu-enabled.php * * @return bool */ function apcu_enabled() {} /** * @param string $key * @return array|null */ function apcu_key_info($key) {} /** * The APCUIterator class * * The APCUIterator class makes it easier to iterate over large APCu caches. * This is helpful as it allows iterating over large caches in steps, while grabbing a defined number * of entries per lock instance, so it frees the cache locks for other activities rather than hold up * the entire cache to grab 100 (the default) entries. Also, using regular expression matching is more * efficient as it's been moved to the C level. * * @link https://php.net/manual/en/class.apcuiterator.php * @since APCu 5.0.0 */ class APCUIterator implements Iterator { /** * Constructs an APCUIterator iterator object * @link https://php.net/manual/en/apcuiterator.construct.php * @param string|string[]|null $search A PCRE regular expression that matches against APCu key names, * either as a string for a single regular expression, or as an array of regular expressions. * Or, optionally pass in NULL to skip the search. * @param int $format The desired format, as configured with one ore more of the APC_ITER_* constants. * @param int $chunk_size The chunk size. Must be a value greater than 0. The default value is 100. * @param int $list The type to list. Either pass in APC_LIST_ACTIVE or APC_LIST_DELETED. */ public function __construct($search = null, $format = APC_ITER_ALL, $chunk_size = 100, $list = APC_LIST_ACTIVE) {} /** * Rewinds back the iterator to the first element * @link https://php.net/manual/en/apcuiterator.rewind.php */ public function rewind() {} /** * Checks if the current iterator position is valid * @link https://php.net/manual/en/apcuiterator.valid.php * @return bool Returns TRUE if the current iterator position is valid, otherwise FALSE. */ public function valid() {} /** * Gets the current item from the APCUIterator stack * @link https://php.net/manual/en/apcuiterator.current.php * @return mixed|false Returns the current item on success, or FALSE if no more items or exist, or on failure. */ public function current() {} /** * Gets the current iterator key * @link https://php.net/manual/en/apcuiterator.key.php * @return string|int|false Returns the key on success, or FALSE upon failure. */ public function key() {} /** * Moves the iterator pointer to the next element * @link https://php.net/manual/en/apcuiterator.next.php * @return bool Returns TRUE on success or FALSE on failure. */ public function next() {} /** * Gets the total number of cache hits * @link https://php.net/manual/en/apcuiterator.gettotalhits.php * @return int|false The number of hits on success, or FALSE on failure. */ public function getTotalHits() {} /** * Gets the total cache size * @link https://php.net/manual/en/apcuiterator.gettotalsize.php * @return int|false The total cache size. */ public function getTotalSize() {} /** * Get the total count * @link https://php.net/manual/en/apcuiterator.gettotalcount.php * @return int|false The total count. */ public function getTotalCount() {} } * Checks out a working copy from the repository * @link https://php.net/manual/en/function.svn-checkout.php * @param string $repos

* String URL path to directory in repository to check out. *

* @param string $targetpath

* String local path to directory to check out in to *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param int $revision [optional]

* Integer revision number of repository to check out. Default is * HEAD, the most recent revision. *

* @param int $flags [optional]

* Any combination of SVN_NON_RECURSIVE and * SVN_IGNORE_EXTERNALS. *

* @return bool TRUE on success or FALSE on failure. */ function svn_checkout($repos, $targetpath, $revision = SVN_REVISION_HEAD, $flags = 0) {} /** * (PECL svn >= 0.1.0)
* Returns the contents of a file in a repository * @link https://php.net/manual/en/function.svn-cat.php * @param string $repos_url

* String URL path to item in a repository. *

* @param int $revision_no [optional]

* Integer revision number of item to retrieve, default is the HEAD * revision. *

* @return string the string contents of the item from the repository on * success, and FALSE on failure. */ function svn_cat($repos_url, $revision_no = SVN_REVISION_HEAD) {} /** * (PECL svn >= 0.1.0)
* Returns list of directory contents in repository URL, optionally at revision number * @link https://php.net/manual/en/function.svn-ls.php * @param string $repos_url * @param int $revision_no [optional] * @param bool $recurse [optional]

* Enables recursion. *

* @param bool $peg [optional] * @return array On success, this function returns an array file listing in the format * of: *
 * [0] => Array
 * (
 * [created_rev] => integer revision number of last edit
 * [last_author] => string author name of last edit
 * [size] => integer byte file size of file
 * [time] => string date of last edit in form 'M d H:i'
 * or 'M d Y', depending on how old the file is
 * [time_t] => integer unix timestamp of last edit
 * [name] => name of file/directory
 * [type] => type, can be 'file' or 'dir'
 * )
 * [1] => ...
 * 
*/ function svn_ls($repos_url, $revision_no = SVN_REVISION_HEAD, $recurse = false, $peg = false) {} /** * (PECL svn >= 0.1.0)
* Returns the commit log messages of a repository URL * @link https://php.net/manual/en/function.svn-log.php * @param string $repos_url

* Repository URL of the item to retrieve log history from. *

* @param int $start_revision [optional]

* Revision number of the first log to retrieve. Use * SVN_REVISION_HEAD to retrieve the log from * the most recent revision. *

* @param int $end_revision [optional]

* Revision number of the last log to retrieve. Defaults to * start_revision if specified or to * SVN_REVISION_INITIAL otherwise. *

* @param int $limit [optional]

* Number of logs to retrieve. *

* @param int $flags [optional]

* Any combination of SVN_OMIT_MESSAGES, * SVN_DISCOVER_CHANGED_PATHS and * SVN_STOP_ON_COPY. *

* @return array On success, this function returns an array file listing in the format * of: *
 * [0] => Array, ordered most recent (highest) revision first
 * (
 * [rev] => integer revision number
 * [author] => string author name
 * [msg] => string log message
 * [date] => string date formatted per ISO 8601, i.e. date('c')
 * [paths] => Array, describing changed files
 * (
 * [0] => Array
 * (
 * [action] => string letter signifying change
 * [path] => absolute repository path of changed file
 * )
 * [1] => ...
 * )
 * )
 * [1] => ...
 * 
*

*

* The output will always be a numerically indexed array of arrays, * even when there are none or only one log message(s). *

*

* The value of action is a subset of the * status output * in the first column, where possible values are: *

* * Actions * * * * * * * * * * * * * * * * * * * * *
LetterDescription
MItem/props was modified
AItem was added
DItem was deleted
RItem was replaced
*

* If no changes were made to the item, an empty array is returned. */ function svn_log($repos_url, $start_revision = null, $end_revision = null, $limit = 0, $flags = SVN_DISCOVER_CHANGED_PATHS|SVN_STOP_ON_COPY) {} /** * (PECL svn >= 0.1.0)
* Sets an authentication parameter * @link https://php.net/manual/en/function.svn-auth-set-parameter.php * @param string $key

* String key name. Use the authentication constants * defined by this extension to specify a key. *

* @param string $value

* String value to set to parameter at key. Format of value varies * with the parameter. *

* @return void No value is returned. */ function svn_auth_set_parameter($key, $value) {} /** * (PECL svn >= 0.1.0)
* Retrieves authentication parameter * @link https://php.net/manual/en/function.svn-auth-get-parameter.php * @param string $key

* String key name. Use the authentication constants * defined by this extension to specify a key. *

* @return string|null the string value of the parameter at key; * returns NULL if parameter does not exist. */ function svn_auth_get_parameter($key) {} /** * (PECL svn >= 0.1.0)
* Returns the version of the SVN client libraries * @link https://php.net/manual/en/function.svn-client-version.php * @return string String version number, usually in form of x.y.z. */ function svn_client_version() {} function svn_config_ensure() {} /** * (PECL svn >= 0.1.0)
* Recursively diffs two paths * @link https://php.net/manual/en/function.svn-diff.php * @param string $path1

* First path to diff. This can be a URL to a file/directory in an SVN * repository or a local file/directory path. *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * If a local file path has only backslashes and no forward slashes, * this extension will fail to find the path. Always * replace all backslashes with forward slashes when using this * function. * @param int $rev1

* First path's revision number. Use SVN_REVISION_HEAD * to specify the most recent revision. *

* @param string $path2

* Second path to diff. See path1 for description. *

* @param int $rev2

* Second path's revision number. See rev1 * for description. *

* @return array an array-list consisting of two streams: the first is the diff output * and the second contains error stream output. The streams can be * read using fread. Returns FALSE or NULL on * error. *

*

* The diff output will, by default, be in the form of Subversion's * custom unified diff format, but an * external * diff engine may be * used depending on Subversion's configuration. */ function svn_diff($path1, $rev1, $path2, $rev2) {} /** * (PECL svn >= 0.1.0)
* Recursively cleanup a working copy directory, finishing incomplete operations and removing locks * @link https://php.net/manual/en/function.svn-cleanup.php * @param string $workingdir

* String path to local working directory to cleanup *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @return bool TRUE on success or FALSE on failure. */ function svn_cleanup($workingdir) {} /** * (PECL svn >= 0.3.0)
* Revert changes to the working copy * @link https://php.net/manual/en/function.svn-revert.php * @param string $path

* The path to the working repository. *

* @param bool $recursive [optional]

* Optionally make recursive changes. *

* @return bool TRUE on success or FALSE on failure. */ function svn_revert($path, $recursive = false) {} function svn_resolved() {} /** * (PECL svn >= 0.1.0)
* Sends changes from the local working copy to the repository * @link https://php.net/manual/en/function.svn-commit.php * @param string $log

* String log text to commit *

* @param array $targets

* Array of local paths of files to be committed *

* This parameter must be an array, a string for a single * target is not acceptable. * Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param bool $recursive [optional]

* Boolean flag to disable recursive committing of * directories in the targets array. * Default is TRUE. *

* @return array array in form of: *
 * array(
 * 0 => integer revision number of commit
 * 1 => string ISO 8601 date and time of commit
 * 2 => name of committer
 * )
 * 
*

* Returns FALSE on failure. *

*/ function svn_commit($log, array $targets, $recursive = true) {} function svn_lock() {} function svn_unlock() {} /** * (PECL svn >= 0.1.0)
* Schedules the addition of an item in a working directory * @link https://php.net/manual/en/function.svn-add.php * @param string $path

* Path of item to add. *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param bool $recursive [optional]

* If item is directory, whether or not to recursively add * all of its contents. Default is TRUE *

* @param bool $force [optional]

* If true, Subversion will recurse into already versioned directories * in order to add unversioned files that may be hiding in those * directories. Default is FALSE *

* @return bool TRUE on success or FALSE on failure. */ function svn_add($path, $recursive = true, $force = false) {} /** * (PECL svn >= 0.1.0)
* Returns the status of working copy files and directories * @link https://php.net/manual/en/function.svn-status.php * @param string $path

* Local path to file or directory to retrieve status of. *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param int $flags [optional]

* Any combination of SVN_NON_RECURSIVE, * SVN_ALL (regardless of modification status), * SVN_SHOW_UPDATES (entries will be added for items * that are out-of-date), SVN_NO_IGNORE (disregard * svn:ignore properties when scanning for new files) * and SVN_IGNORE_EXTERNALS. *

* @return array a numerically indexed array of associative arrays detailing * the status of items in the repository: *

*
 * Array (
 * [0] => Array (
 * // information on item
 * )
 * [1] => ...
 * )
 * 
*

* The information on the item is an associative array that can contain * the following keys: *

* path * String path to file/directory of this entry on local filesystem. * text_status * Status of item's text. Refer to status constants for possible values. * repos_text_status * Status of item's text in repository. Only accurate if * update was set to TRUE. * Refer to status constants for possible values. * prop_status * Status of item's properties. Refer to status constants for possible values. * repos_prop_status * Status of item's property in repository. Only accurate if * update was set to TRUE. Refer to status constants for possible values. * locked * Whether or not the item is locked. (Only set if TRUE.) * copied * Whether or not the item was copied (scheduled for addition with * history). (Only set if TRUE.) * switched * Whether or not the item was switched using the switch command. * (Only set if TRUE) *

* These keys are only set if the item is versioned: *

* name * Base name of item in repository. * url * URL of item in repository. * repos * Base URL of repository. * revision * Integer revision of item in working copy. * kind * Type of item, i.e. file or directory. Refer to type constants for possible values. * schedule * Scheduled action for item, i.e. addition or deletion. Constants * for these magic numbers are not available, they can * be emulated by using: * * if (!defined('svn_wc_schedule_normal')) { * define('svn_wc_schedule_normal', 0); // nothing special * define('svn_wc_schedule_add', 1); // item will be added * define('svn_wc_schedule_delete', 2); // item will be deleted * define('svn_wc_schedule_replace', 3); // item will be added and deleted * } * * deleted * Whether or not the item was deleted, but parent revision lags * behind. (Only set if TRUE.) * absent * Whether or not the item is absent, that is, Subversion knows that * there should be something there but there isn't. (Only set if * TRUE.) * incomplete * Whether or not the entries file for a directory is incomplete. * (Only set if TRUE.) * cmt_date * Integer Unix timestamp of last commit date. (Unaffected by update.) * cmt_rev * Integer revision of last commit. (Unaffected by update.) * cmt_author * String author of last commit. (Unaffected by update */ function svn_status($path, $flags = 0) {} /** * (PECL svn >= 0.1.0)
* Update working copy * @link https://php.net/manual/en/function.svn-update.php * @param string $path

* Path to local working copy. *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param int $revno [optional]

* Revision number to update to, default is SVN_REVISION_HEAD. *

* @param bool $recurse [optional]

* Whether or not to recursively update directories. *

* @return int|false new revision number on success, returns FALSE on failure. */ function svn_update($path, $revno = SVN_REVISION_HEAD, $recurse = true) {} /** * (PECL svn >= 0.2.0)
* Imports an unversioned path into a repository * @link https://php.net/manual/en/function.svn-import.php * @param string $path

* Path of file or directory to import. *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param string $url

* Repository URL to import into. *

* @param bool $nonrecursive

* Whether or not to refrain from recursively processing directories. *

* @return bool TRUE on success or FALSE on failure. */ function svn_import($path, $url, $nonrecursive) {} function svn_info() {} /** * (PECL svn >= 0.3.0)
* Export the contents of a SVN directory * @link https://php.net/manual/en/function.svn-export.php * @param string $frompath

* The path to the current repository. *

* @param string $topath

* The path to the new repository. *

* @param bool $working_copy [optional]

* If TRUE, it will export uncommitted files from the working copy. *

* @param int $revision_no [optional] * @return bool TRUE on success or FALSE on failure. */ function svn_export($frompath, $topath, $working_copy = true, $revision_no = -1) {} function svn_copy() {} function svn_switch() {} /** * (PECL svn >= 0.3.0)
* Get the SVN blame for a file * @link https://php.net/manual/en/function.svn-blame.php * @param string $repository_url

* The repository URL. *

* @param int $revision_no [optional]

* The revision number. *

* @return array An array of SVN blame information separated by line * which includes the revision number, line number, line of code, * author, and date. */ function svn_blame($repository_url, $revision_no = SVN_REVISION_HEAD) {} /** * (PECL svn >= 0.4.0)
* Delete items from a working copy or repository. * @link https://php.net/manual/en/function.svn-delete.php * @param string $path

* Path of item to delete. *

* Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath or dirname(__FILE__). * @param bool $force [optional]

* If TRUE, the file will be deleted even if it has local modifications. * Otherwise, local modifications will result in a failure. Default is * FALSE *

* @return bool TRUE on success or FALSE on failure. */ function svn_delete($path, $force = false) {} /** * (PECL svn >= 0.4.0)
* Creates a directory in a working copy or repository * @link https://php.net/manual/en/function.svn-mkdir.php * @param string $path

* The path to the working copy or repository. *

* @param string $log_message [optional] * @return bool TRUE on success or FALSE on failure. */ function svn_mkdir($path, $log_message = null) {} /** * @link https://php.net/manual/en/ref.svn.php * @param string $src_path * @param string $dst_path * @param bool $force [optional] * @return mixed */ function svn_move($src_path, $dst_path, $force = false) {} /** * @link https://php.net/manual/en/ref.svn.php * @param string $path * @param bool $recurse [optional] * @param int $revision [optional] * @return mixed */ function svn_proplist($path, $recurse = false, $revision) {} /** * @param string $path * @param string $property_name * @param bool $recurse [optional] * @param int $revision [optional] * @return mixed */ function svn_propget($path, $property_name, $recurse = false, $revision) {} /** * (PECL svn >= 0.1.0)
* Create a new subversion repository at path * @link https://php.net/manual/en/function.svn-repos-create.php * @param string $path

* Its description *

* @param null|array $config [optional]

* Its description *

* @param null|array $fsconfig [optional]

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_repos_create($path, ?array $config = null, ?array $fsconfig = null) {} /** * (PECL svn >= 0.1.0)
* Run recovery procedures on the repository located at path. * @link https://php.net/manual/en/function.svn-repos-recover.php * @param string $path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_repos_recover($path) {} /** * (PECL svn >= 0.1.0)
* Make a hot-copy of the repos at repospath; copy it to destpath * @link https://php.net/manual/en/function.svn-repos-hotcopy.php * @param string $repospath

* Its description *

* @param string $destpath

* Its description *

* @param bool $cleanlogs

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_repos_hotcopy($repospath, $destpath, $cleanlogs) {} /** * (PECL svn >= 0.1.0)
* Open a shared lock on a repository. * @link https://php.net/manual/en/function.svn-repos-open.php * @param string $path

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_repos_open($path) {} /** * (PECL svn >= 0.1.0)
* Gets a handle on the filesystem for a repository * @link https://php.net/manual/en/function.svn-repos-fs.php * @param resource $repos

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_repos_fs($repos) {} /** * (PECL svn >= 0.2.0)
* Create a new transaction * @link https://php.net/manual/en/function.svn-repos-fs-begin-txn-for-commit.php * @param resource $repos

* Its description *

* @param int $rev

* Its description *

* @param string $author

* Its description *

* @param string $log_msg

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_repos_fs_begin_txn_for_commit($repos, $rev, $author, $log_msg) {} /** * (PECL svn >= 0.2.0)
* Commits a transaction and returns the new revision * @link https://php.net/manual/en/function.svn-repos-fs-commit-txn.php * @param resource $txn

* Its description *

* @return int What the function returns, first on success, then on failure. */ function svn_repos_fs_commit_txn($txn) {} /** * (PECL svn >= 0.1.0)
* Get a handle on a specific version of the repository root * @link https://php.net/manual/en/function.svn-fs-revision-root.php * @param resource $fs

* Its description *

* @param int $revnum

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_fs_revision_root($fs, $revnum) {} /** * (PECL svn >= 0.1.0)
* Determines what kind of item lives at path in a given repository fsroot * @link https://php.net/manual/en/function.svn-fs-check-path.php * @param resource $fsroot

* Its description *

* @param string $path

* Its description *

* @return int What the function returns, first on success, then on failure. */ function svn_fs_check_path($fsroot, $path) {} /** * (PECL svn >= 0.1.0)
* Fetches the value of a named property * @link https://php.net/manual/en/function.svn-fs-revision-prop.php * @param resource $fs

* Its description *

* @param int $revnum

* Its description *

* @param string $propname

* Its description *

* @return string What the function returns, first on success, then on failure. */ function svn_fs_revision_prop($fs, $revnum, $propname) {} /** * (PECL svn >= 0.1.0)
* Enumerates the directory entries under path; returns a hash of dir names to file type * @link https://php.net/manual/en/function.svn-fs-dir-entries.php * @param resource $fsroot

* Its description *

* @param string $path

* Its description *

* @return array What the function returns, first on success, then on failure. */ function svn_fs_dir_entries($fsroot, $path) {} /** * (PECL svn >= 0.1.0)
* Returns the revision in which path under fsroot was created * @link https://php.net/manual/en/function.svn-fs-node-created-rev.php * @param resource $fsroot

* Its description *

* @param string $path

* Its description *

* @return int What the function returns, first on success, then on failure. */ function svn_fs_node_created_rev($fsroot, $path) {} /** * (PECL svn >= 0.1.0)
* Returns the number of the youngest revision in the filesystem * @link https://php.net/manual/en/function.svn-fs-youngest-rev.php * @param resource $fs

* Its description *

* @return int What the function returns, first on success, then on failure. */ function svn_fs_youngest_rev($fs) {} /** * (PECL svn >= 0.1.0)
* Returns a stream to access the contents of a file from a given version of the fs * @link https://php.net/manual/en/function.svn-fs-file-contents.php * @param resource $fsroot

* Its description *

* @param string $path

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_fs_file_contents($fsroot, $path) {} /** * (PECL svn >= 0.1.0)
* Returns the length of a file from a given version of the fs * @link https://php.net/manual/en/function.svn-fs-file-length.php * @param resource $fsroot

* Its description *

* @param string $path

* Its description *

* @return int What the function returns, first on success, then on failure. */ function svn_fs_file_length($fsroot, $path) {} /** * (PECL svn >= 0.2.0)
* Creates and returns a transaction root * @link https://php.net/manual/en/function.svn-fs-txn-root.php * @param resource $txn

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_fs_txn_root($txn) {} /** * (PECL svn >= 0.2.0)
* Creates a new empty file, returns true if all is ok, false otherwise * @link https://php.net/manual/en/function.svn-fs-make-file.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_make_file($root, $path) {} /** * (PECL svn >= 0.2.0)
* Creates a new empty directory, returns true if all is ok, false otherwise * @link https://php.net/manual/en/function.svn-fs-make-dir.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_make_dir($root, $path) {} /** * (PECL svn >= 0.2.0)
* Creates and returns a stream that will be used to replace * @link https://php.net/manual/en/function.svn-fs-apply-text.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_fs_apply_text($root, $path) {} /** * (PECL svn >= 0.2.0)
* Copies a file or a directory, returns true if all is ok, false otherwise * @link https://php.net/manual/en/function.svn-fs-copy.php * @param resource $from_root

* Its description *

* @param string $from_path

* Its description *

* @param resource $to_root

* Its description *

* @param string $to_path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_copy($from_root, $from_path, $to_root, $to_path) {} /** * (PECL svn >= 0.2.0)
* Deletes a file or a directory, return true if all is ok, false otherwise * @link https://php.net/manual/en/function.svn-fs-delete.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_delete($root, $path) {} /** * (PECL svn >= 0.2.0)
* Create a new transaction * @link https://php.net/manual/en/function.svn-fs-begin-txn2.php * @param resource $repos

* Its description *

* @param int $rev

* Its description *

* @return resource What the function returns, first on success, then on failure. */ function svn_fs_begin_txn2($repos, $rev) {} /** * (PECL svn >= 0.2.0)
* Return true if the path points to a directory, false otherwise * @link https://php.net/manual/en/function.svn-fs-is-dir.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_is_dir($root, $path) {} /** * (PECL svn >= 0.2.0)
* Return true if the path points to a file, false otherwise * @link https://php.net/manual/en/function.svn-fs-is-file.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_is_file($root, $path) {} /** * (PECL svn >= 0.1.0)
* Returns the value of a property for a node * @link https://php.net/manual/en/function.svn-fs-node-prop.php * @param resource $fsroot

* Its description *

* @param string $path

* Its description *

* @param string $propname

* Its description *

* @return string What the function returns, first on success, then on failure. */ function svn_fs_node_prop($fsroot, $path, $propname) {} /** * (PECL svn >= 0.2.0)
* Return true if everything is ok, false otherwise * @link https://php.net/manual/en/function.svn-fs-change-node-prop.php * @param resource $root

* Its description *

* @param string $path

* Its description *

* @param string $name

* Its description *

* @param string $value

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_change_node_prop($root, $path, $name, $value) {} /** * (PECL svn >= 0.2.0)
* Return true if content is different, false otherwise * @link https://php.net/manual/en/function.svn-fs-contents-changed.php * @param resource $root1

* Its description *

* @param string $path1

* Its description *

* @param resource $root2

* Its description *

* @param string $path2

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_contents_changed($root1, $path1, $root2, $path2) {} /** * (PECL svn >= 0.2.0)
* Return true if props are different, false otherwise * @link https://php.net/manual/en/function.svn-fs-props-changed.php * @param resource $root1

* Its description *

* @param string $path1

* Its description *

* @param resource $root2

* Its description *

* @param string $path2

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_props_changed($root1, $path1, $root2, $path2) {} /** * (PECL svn >= 0.2.0)
* Abort a transaction, returns true if everything is okay, false otherwise * @link https://php.net/manual/en/function.svn-fs-abort-txn.php * @param resource $txn

* Its description *

* @return bool What the function returns, first on success, then on failure. */ function svn_fs_abort_txn($txn) {} /** * Property for default username to use when performing basic authentication * @link https://php.net/manual/en/svn.constants.php */ define('SVN_AUTH_PARAM_DEFAULT_USERNAME', "svn:auth:username"); /** * Property for default password to use when performing basic authentication * @link https://php.net/manual/en/svn.constants.php */ define('SVN_AUTH_PARAM_DEFAULT_PASSWORD', "svn:auth:password"); define('SVN_AUTH_PARAM_NON_INTERACTIVE', "svn:auth:non-interactive"); define('SVN_AUTH_PARAM_DONT_STORE_PASSWORDS', "svn:auth:dont-store-passwords"); define('SVN_AUTH_PARAM_NO_AUTH_CACHE', "svn:auth:no-auth-cache"); define('SVN_AUTH_PARAM_SSL_SERVER_FAILURES', "svn:auth:ssl:failures"); define('SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO', "svn:auth:ssl:cert-info"); define('SVN_AUTH_PARAM_CONFIG', "svn:auth:config-category-servers"); define('SVN_AUTH_PARAM_SERVER_GROUP', "svn:auth:server-group"); define('SVN_AUTH_PARAM_CONFIG_DIR', "svn:auth:config-dir"); /** * Custom property for ignoring SSL cert verification errors * @link https://php.net/manual/en/svn.constants.php */ define('PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS', "php:svn:auth:ignore-ssl-verify-errors"); /** * Configuration key that determines filesystem type * @link https://php.net/manual/en/svn.constants.php */ define('SVN_FS_CONFIG_FS_TYPE', "fs-type"); /** * Filesystem is Berkeley-DB implementation * @link https://php.net/manual/en/svn.constants.php */ define('SVN_FS_TYPE_BDB', "bdb"); /** * Filesystem is native-filesystem implementation * @link https://php.net/manual/en/svn.constants.php */ define('SVN_FS_TYPE_FSFS', "fsfs"); /** * svn:date * @link https://php.net/manual/en/svn.constants.php */ define('SVN_PROP_REVISION_DATE', "svn:date"); /** * svn:original-date * @link https://php.net/manual/en/svn.constants.php */ define('SVN_PROP_REVISION_ORIG_DATE', "svn:original-date"); /** * svn:author * @link https://php.net/manual/en/svn.constants.php */ define('SVN_PROP_REVISION_AUTHOR', "svn:author"); /** * svn:log * @link https://php.net/manual/en/svn.constants.php */ define('SVN_PROP_REVISION_LOG', "svn:log"); define('SVN_REVISION_INITIAL', 1); /** * Magic number (-1) specifying the HEAD revision * @link https://php.net/manual/en/svn.constants.php */ define('SVN_REVISION_HEAD', -1); define('SVN_REVISION_BASE', -2); define('SVN_REVISION_COMMITTED', -3); define('SVN_REVISION_PREV', -4); define('SVN_REVISION_UNSPECIFIED', -5); define('SVN_NON_RECURSIVE', 1); define('SVN_DISCOVER_CHANGED_PATHS', 2); define('SVN_OMIT_MESSAGES', 4); define('SVN_STOP_ON_COPY', 8); define('SVN_ALL', 16); define('SVN_SHOW_UPDATES', 32); define('SVN_NO_IGNORE', 64); /** * Status does not exist * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_NONE', 1); /** * Item is not versioned in working copy * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_UNVERSIONED', 2); /** * Item exists, nothing else is happening * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_NORMAL', 3); /** * Item is scheduled for addition * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_ADDED', 4); /** * Item is versioned but missing from the working copy * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_MISSING', 5); /** * Item is scheduled for deletion * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_DELETED', 6); /** * Item was deleted and then re-added * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_REPLACED', 7); /** * Item (text or properties) was modified * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_MODIFIED', 8); /** * Item's local modifications were merged with repository modifications * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_MERGED', 9); /** * Item's local modifications conflicted with repository modifications * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_CONFLICTED', 10); /** * Item is unversioned but configured to be ignored * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_IGNORED', 11); /** * Unversioned item is in the way of a versioned resource * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_OBSTRUCTED', 12); /** * Unversioned path that is populated using svn:externals * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_EXTERNAL', 13); /** * Directory does not contain complete entries list * @link https://php.net/manual/en/svn.constants.php */ define('SVN_WC_STATUS_INCOMPLETE', 14); /** * Absent * @link https://php.net/manual/en/svn.constants.php */ define('SVN_NODE_NONE', 0); /** * File * @link https://php.net/manual/en/svn.constants.php */ define('SVN_NODE_FILE', 1); /** * Directory * @link https://php.net/manual/en/svn.constants.php */ define('SVN_NODE_DIR', 2); /** * Something Subversion cannot identify * @link https://php.net/manual/en/svn.constants.php */ define('SVN_NODE_UNKNOWN', 3); define('SVN_WC_SCHEDULE_NORMAL', 0); define('SVN_WC_SCHEDULE_ADD', 1); define('SVN_WC_SCHEDULE_DELETE', 2); define('SVN_WC_SCHEDULE_REPLACE', 3); * The location of the image file. This cannot be an URL. * Since 7.2.0 this can either be a path to the file (stream wrappers are also supported as usual) * or a stream resource. *

* @param string|null $required_sections [optional]

* Is a comma separated list of sections that need to be present in file * to produce a result array. If none of the requested * sections could be found the return value is FALSE. * * FILE * FileName, FileSize, FileDateTime, SectionsFound * * * COMPUTED * * html, Width, Height, IsColor, and more if available. Height and * Width are computed the same way getimagesize * does so their values must not be part of any header returned. * Also, html is a height/width text string to be used inside normal * HTML. * * * * ANY_TAG * Any information that has a Tag e.g. IFD0, EXIF, ... * * * IFD0 * * All tagged data of IFD0. In normal imagefiles this contains * image size and so forth. * * * * THUMBNAIL * * A file is supposed to contain a thumbnail if it has a second IFD. * All tagged information about the embedded thumbnail is stored in * this section. * * * * COMMENT * Comment headers of JPEG images. * * * EXIF * * The EXIF section is a sub section of IFD0. It contains * more detailed information about an image. Most of these entries * are digital camera related. * * *

* @param bool $as_arrays [optional]

* Specifies whether or not each section becomes an array. The * sections COMPUTED, * THUMBNAIL, and COMMENT * always become arrays as they may contain values whose names conflict * with other sections. *

* @param bool $read_thumbnail [optional]

* When set to TRUE the thumbnail itself is read. Otherwise, only the * tagged data is read. *

* @return array|false It returns an associative array where the array indexes are * the header names and the array values are the values associated with * those headers. If no data can be returned, * exif_read_data will return FALSE. */ function exif_read_data($file, ?string $required_sections, bool $as_arrays = false, bool $read_thumbnail = false): array|false {} /** * Alias of exif_read_data * @link https://php.net/manual/en/function.read-exif-data.php * @param $filename * @param $sections [optional] * @param $arrays [optional] * @param $thumbnail [optional] * @removed 8.0 */ #[Deprecated(replacement: "exif_read_data(%parametersList%)", since: "7.2")] function read_exif_data($filename, $sections = null, $arrays = false, $thumbnail = false) {} /** * Get the header name for an index * @link https://php.net/manual/en/function.exif-tagname.php * @param int $index

* The Tag ID for which a Tag Name will be looked up. *

* @return string|false the header name, or FALSE if index is * not a defined EXIF tag id. */ function exif_tagname(int $index): string|false {} /** * Retrieve the embedded thumbnail of a TIFF or JPEG image * @link https://php.net/manual/en/function.exif-thumbnail.php * @param string|resource $file

* The location of the image file. This cannot be an URL. * Since 7.2.0 this can either be a path to the file (stream wrappers are also supported as usual) * or a stream resource. *

* @param int &$width [optional]

* The return width of the returned thumbnail. *

* @param int &$height [optional]

* The returned height of the returned thumbnail. *

* @param int &$image_type [optional]

* The returned image type of the returned thumbnail. This is either * TIFF or JPEG. *

* @return string|false the embedded thumbnail, or FALSE if the image contains no * thumbnail. */ function exif_thumbnail($file, &$width, &$height, &$image_type): string|false {} /** * Determine the type of an image * @link https://php.net/manual/en/function.exif-imagetype.php * @param string $filename The image being checked. * @return int|false When a correct signature is found, the appropriate constant value will be * returned otherwise the return value is FALSE. The return value is the * same value that getimagesize returns in index 2 but * exif_imagetype is much faster. *

*

* exif_imagetype will emit an E_NOTICE * and return FALSE if it is unable to read enough bytes from the file to * determine the image type. */ function exif_imagetype(string $filename): int|false {} define('EXIF_USE_MBSTRING', 1); // End of exif v.1.4 $Id$ * Construct a new Judy object. A Judy object can be accessed like a PHP Array. * @link https://php.net/manual/en/judy.construct.php * @param int $judy_type

The Judy type to be used.

*/ public function __construct($judy_type) {} /** * (PECL judy >= 0.1.1)
* Destruct a Judy object. * @link https://php.net/manual/en/judy.destruct.php */ public function __destruct() {} /** * (PECL judy >= 0.1.1)
* Locate the Nth index present in the Judy array. * @link https://php.net/manual/en/judy.bycount.php * @param int $nth_index

Nth index to return. If nth_index equal 1, then it will return the first index in the array.

* @return int

Return the index at the given Nth position.

*/ public function byCount($nth_index) {} /** * (PECL judy >= 0.1.1)
* Count the number of elements in the Judy array. * @link https://php.net/manual/en/judy.count.php * @param int $index_start [optional]

Start counting from the given index. Default is first index.

* @param int $index_end [optional]

Stop counting when reaching this index. Default is last index.

* @return int

Return the number of elements.

*/ public function count($index_start = 0, $index_end = -1) {} /** * (PECL judy >= 0.1.1)
* Search (inclusive) for the first index present that is equal to or greater than the passed Index. * @link https://php.net/manual/en/judy.first.php * @param mixed $index [optional]

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function first($index = 0) {} /** * (PECL judy >= 0.1.1)
* Search (inclusive) for the first absent index that is equal to or greater than the passed Index. * @link https://php.net/manual/en/judy.firstempty.php * @param mixed $index [optional]

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function firstEmpty($index = 0) {} /** * (PECL judy >= 0.1.1)
* Free the entire Judy array. * @link https://php.net/manual/en/judy.free.php */ public function free() {} /** * (PECL judy >= 0.1.1)
* Return an integer corresponding to the Judy type of the current object. * @link https://php.net/manual/en/judy.gettype.php * @return int

Return an integer corresponding to a Judy type.

*/ public function getType() {} /** * (PECL judy >= 0.1.1)
* Search (inclusive) for the last index present that is equal to or less than the passed Index. * @link https://php.net/manual/en/judy.last.php * @param int|string $index [optional]

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function last($index = -1) {} /** * (PECL judy >= 0.1.1)
* Search (inclusive) for the last absent index that is equal to or less than the passed Index. * @link https://php.net/manual/en/judy.lastempty.php * @param int|string $index [optional]

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function lastEmpty($index = -1) {} /** * (PECL judy >= 0.1.1)
* Return the memory used by the Judy array. * @link https://php.net/manual/en/judy.memoryusage.php * @return int

Return the memory used in bytes.

*/ public function memoryUsage() {} /** * (PECL judy >= 0.1.1)
* Search (exclusive) for the next index present that is greater than the passed Index. * @link https://php.net/manual/en/judy.next.php * @param mixed $index

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function next($index) {} /** * (PECL judy >= 0.1.1)
* Search (exclusive) for the next absent index that is greater than the passed Index. * @link https://php.net/manual/en/judy.nextempty.php * @param int|string $index

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function nextEmpty($index) {} /** * (PECL judy >= 0.1.1)
* Whether or not an offset exists. * @link https://php.net/manual/en/judy.offsetexists.php * @param mixed $offset

An offset to check for.

* @return bool

Returns TRUE on success or FALSE on failure.

*/ public function offsetExists($offset) {} /** * (PECL judy >= 0.1.1)
* Returns the value at specified offset. * @link https://php.net/manual/en/judy.offsetget.php * @param mixed $offset

An offset to check for.

* @return mixed

Can return all value types.

*/ public function offsetGet($offset) {} /** * (PECL judy >= 0.1.1)
* Assigns a value to the specified offset. * @link https://php.net/manual/en/judy.offsetset.php * @param mixed $offset

The offset to assign the value to.

* @param mixed $value

The value to set.

*/ public function offsetSet($offset, $value) {} /** * (PECL judy >= 0.1.1)
* Unsets an offset. * @link https://php.net/manual/en/judy.offsetunset.php * @param mixed $offset

The offset to assign the value to.

*/ public function offsetUnset($offset) {} /** * (PECL judy >= 0.1.1)
* Search (exclusive) for the previous index present that is less than the passed Index. * @link https://php.net/manual/en/judy.prev.php * @param mixed $index

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function prev($index) {} /** * (PECL judy >= 0.1.1)
* Search (exclusive) for the previous index absent that is less than the passed Index. * @link https://php.net/manual/en/judy.prevempty.php * @param mixed $index

The index can be an integer or a string corresponding to the index where to start the search.

* @return mixed

Return the corresponding index in the array.

*/ public function prevEmpty($index) {} /** * (PECL judy >= 0.1.1)
* Count the number of elements in the Judy array.
* This method is an alias of const count. * @link https://php.net/manual/en/judy.size.php * @param int $index_start [optional]

Start counting from the given index. Default is first index.

* @param int $index_end [optional]

Stop counting when reaching this index. Default is last index.

* @return int

Return the number of elements.

*/ public function size($index_start = 0, $index_end = -1) {} } // End of judy. * Add a watch to an initialized inotify instance * * @link https://php.net/manual/en/function.inotify-add-watch.php * * @param resource $inotify_instance

resource returned by {@link https://php.net/manual/en/function.inotify-init.php inotify_init()}

* @param string $pathname

File or directory to watch

* @param int $mask

Events to watch for. See {@link https://php.net/manual/en/inotify.constants.php Predefined Constants}.

* * @return int a unique (inotify instance-wide) watch descriptor. */ function inotify_add_watch($inotify_instance, $pathname, $mask) {} /** * (PHP >= 5.2.0, PECL inotify >= 0.1.2)
* Initialize an inotify instance for use with {@see inotify_add_watch} * * @link https://php.net/manual/en/function.inotify-init.php * @return resource|false a stream resource or FALSE on error. */ function inotify_init() {} /** * (PHP >= 5.2.0, PECL inotify >= 0.1.2)
* This function allows to know if {@see inotify_read} will block or not. * If a number upper than zero is returned, there are pending events * and {@see inotify_read} will not block. * * @link https://php.net/manual/en/function.inotify-queue-len.php * * @param resource $inotify_instance

resource returned by {@link https://php.net/manual/en/function.inotify-init.php inotify_init()}

* * @return int a number greater than zero if events are pending, otherwise zero. */ function inotify_queue_len($inotify_instance) {} /** * (PHP >= 5.2.0, PECL inotify >= 0.1.2)
* Read inotify events from an inotify instance. * * @link https://php.net/manual/en/function.inotify-read.php * * @param resource $inotify_instance

resource returned by {@link https://php.net/manual/en/function.inotify-init.php inotify_init()}

* * @return array|false an array of inotify events or FALSE if no events * were pending and inotify_instance is non-blocking. Each event * is an array with the following keys: * *
    *
  • wd is a watch descriptor returned by inotify_add_watch()
  • *
  • mask is a bit mask of events
  • *
  • cookie is a unique id to connect related events (e.g. IN_MOVE_FROM and IN_MOVE_TO)
  • *
  • name is the name of a file (e.g. if a file was modified in a watched directory)
  • *
*/ function inotify_read($inotify_instance) {} /** * (PHP >= 5.2.0, PECL inotify >= 0.1.2)
* Removes the watch $watch_descriptor from the inotify instance $inotify_instance. * * @link https://secure.php.net/manual/en/function.inotify-rm-watch.php * * @param resource $inotify_instance

resource returned by {@link https://php.net/manual/en/function.inotify-init.php inotify_init()}

* @param int $mask

watch to remove from the instance

* * @return bool TRUE on success or FALSE on failure. */ function inotify_rm_watch($inotify_instance, $mask) {} /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_ACCESS = 1; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_MODIFY = 2; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_ATTRIB = 4; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_CLOSE_WRITE = 8; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_CLOSE_NOWRITE = 16; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_OPEN = 32; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_MOVED_FROM = 64; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_MOVED_TO = 128; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_CREATE = 256; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_DELETE = 512; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_DELETE_SELF = 1024; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_MOVE_SELF = 2048; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_UNMOUNT = 8192; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_Q_OVERFLOW = 16384; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_IGNORED = 32768; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_CLOSE = 24; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_MOVE = 192; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_ALL_EVENTS = 4095; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_ONLYDIR = 16777216; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_DONT_FOLLOW = 33554432; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_MASK_ADD = 536870912; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_ISDIR = 1073741824; /** * @link https://php.net/manual/en/inotify.constants.php */ const IN_ONESHOT = 2147483648; // End of inotify v.0.1.6 * Send the YAML representation of a value to a file * @link https://php.net/manual/en/function.yaml-emit-file.php * @param string $filename Path to the file. * @param mixed $data The data being encoded. Can be any type except a resource. * @param int $encoding Output character encoding chosen from YAML_ANY_ENCODING, YAML_UTF8_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF16BE_ENCODING. * @param int $linebreak Output linebreak style chosen from YAML_ANY_BREAK, YAML_CR_BREAK, YAML_LN_BREAK, YAML_CRLN_BREAK. * @param array $callbacks [optional] Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details. * @return bool Returns TRUE on success. */ function yaml_emit_file($filename, $data, $encoding = YAML_ANY_ENCODING, $linebreak = YAML_ANY_BREAK, array $callbacks = []) {} /** * (PHP 5 >= 5.2.0, PECL yaml >= 0.5.0)
* @link https://php.net/manual/en/function.yaml-emit.php * @param mixed $data The data being encoded. Can be any type except a resource. * @param int $encoding [optional] Output character encoding chosen from YAML_ANY_ENCODING, YAML_UTF8_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF16BE_ENCODING. * @param int $linebreak [optional] Output linebreak style chosen from YAML_ANY_BREAK, YAML_CR_BREAK, YAML_LN_BREAK, YAML_CRLN_BREAK. * @param array $callbacks [optional] Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details. * @return string Returns a YAML encoded string on success. */ function yaml_emit($data, $encoding = YAML_ANY_ENCODING, $linebreak = YAML_ANY_BREAK, array $callbacks = []) {} /** * (PHP 5 >= 5.2.0, PECL yaml >= 0.4.0)
* Parse a YAML stream from a file * @link https://php.net/manual/en/function.yaml-parse-file.php * @param string $filename Path to the file. * @param int $pos [optional] Document to extract from stream (-1 for all documents, 0 for first document, ...). * @param int &$ndocs [optional] If ndocs is provided, then it is filled with the number of documents found in stream. * @param array $callbacks [optional] Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details. * @return mixed|false Returns the value encoded in input in appropriate PHP type or FALSE on failure. If pos is -1 an array will be returned with one entry for each document found in the stream. */ function yaml_parse_file($filename, $pos = 0, &$ndocs = null, array $callbacks = []) {} /** * (PHP 5 >= 5.2.0, PECL yaml >= 0.4.0)
* Parse a Yaml stream from a URL * @link https://php.net/manual/en/function.yaml-parse-url.php * @param string $url url should be of the form "scheme://...". PHP will search for a protocol handler (also known as a wrapper) for that scheme. If no wrappers for that protocol are registered, PHP will emit a notice to help you track potential problems in your script and then continue as though filename specifies a regular file. * @param int $pos [optional] Document to extract from stream (-1 for all documents, 0 for first document, ...). * @param int &$ndocs [optional] If ndocs is provided, then it is filled with the number of documents found in stream. * @param array $callbacks [optional] Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details. * @return mixed|false Returns the value encoded in input in appropriate PHP type or FALSE on failure. If pos is -1 an array will be returned with one entry for each document found in the stream. */ function yaml_parse_url($url, $pos = 0, &$ndocs = null, array $callbacks = []) {} /** * (PHP 5 >= 5.2.0, PECL yaml >= 0.4.0)
* Parse a YAML stream * @link https://php.net/manual/en/function.yaml-parse.php * @param string $input The string to parse as a YAML document stream. * @param int $pos [optional] Document to extract from stream (-1 for all documents, 0 for first document, ...). * @param int &$ndocs [optional] If ndocs is provided, then it is filled with the number of documents found in stream. * @param array $callbacks [optional] Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details. * @return mixed|false Returns the value encoded in input in appropriate PHP type or FALSE on failure. If pos is -1 an array will be returned with one entry for each document found in the stream. */ function yaml_parse($input, $pos = 0, &$ndocs = null, array $callbacks = []) {} PDOException
from your own code. * @see https://php.net/manual/en/language.exceptions.php Exceptions in PHP * @link https://php.net/manual/en/class.pdoexception.php */ class PDOException extends RuntimeException { #[LanguageLevelTypeAware(['8.1' => 'array|null'], default: '')] public $errorInfo; protected $code; } /** * Represents a connection between PHP and a database server. * @link https://php.net/manual/en/class.pdo.php */ class PDO { /** * Represents the SQL NULL data type. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-null */ public const PARAM_NULL = 0; /** * Represents the SQL INTEGER data type. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-int */ public const PARAM_INT = 1; /** * Represents the SQL CHAR, VARCHAR, or other string data type. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-str */ public const PARAM_STR = 2; /** * Represents the SQL large object data type. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-lob */ public const PARAM_LOB = 3; /** * Represents a recordset type. Not currently supported by any drivers. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-stmt */ public const PARAM_STMT = 4; /** * Represents a boolean data type. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-bool */ public const PARAM_BOOL = 5; /** * Flag to denote a string uses the national character set. * @since 7.2 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-str-natl */ public const PARAM_STR_NATL = 1073741824; /** * Flag to denote a string uses the regular character set. * @since 7.2 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-str-char */ public const PARAM_STR_CHAR = 536870912; /** * Sets the default string parameter type, this can be one of PDO::PARAM_STR_NATL and PDO::PARAM_STR_CHAR. * @since 7.2 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-default-str-param */ public const ATTR_DEFAULT_STR_PARAM = 21; /** * Specifies that a function created with PDO::sqliteCreateFunction() is deterministic, i.e. it always returns the same result given the same inputs within a single SQL statement. * @since 7.1.4 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.sqlite-deterministic */ public const SQLITE_DETERMINISTIC = 2048; /** * @since 7.3 */ public const SQLITE_OPEN_READONLY = 1; /** * @since 7.3 */ public const SQLITE_OPEN_READWRITE = 2; /** * @since 7.3 */ public const SQLITE_OPEN_CREATE = 4; /** * @since 7.3 */ public const SQLITE_ATTR_OPEN_FLAGS = 1000; /** * Specifies that the parameter is an INOUT parameter for a stored * procedure. You must bitwise-OR this value with an explicit * PDO::PARAM_* data type. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-input-output */ public const PARAM_INPUT_OUTPUT = 2147483648; /** * Allocation event * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-alloc */ public const PARAM_EVT_ALLOC = 0; /** * Deallocation event * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-free */ public const PARAM_EVT_FREE = 1; /** * Event triggered prior to execution of a prepared statement. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-exec-pre */ public const PARAM_EVT_EXEC_PRE = 2; /** * Event triggered subsequent to execution of a prepared statement. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-exec-post */ public const PARAM_EVT_EXEC_POST = 3; /** * Event triggered prior to fetching a result from a resultset. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-fetch-pre */ public const PARAM_EVT_FETCH_PRE = 4; /** * Event triggered subsequent to fetching a result from a resultset. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-fetch-post */ public const PARAM_EVT_FETCH_POST = 5; /** * Event triggered during bound parameter registration * allowing the driver to normalize the parameter name. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.param-evt-normalize */ public const PARAM_EVT_NORMALIZE = 6; /** * Specifies that the fetch method shall return each row as an object with * variable names that correspond to the column names returned in the result * set. PDO::FETCH_LAZY creates the object variable names as they are accessed. * Not valid inside PDOStatement::fetchAll. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-lazy */ public const FETCH_LAZY = 1; /** * Specifies that the fetch method shall return each row as an array indexed * by column name as returned in the corresponding result set. If the result * set contains multiple columns with the same name, * PDO::FETCH_ASSOC returns * only a single value per column name. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-assoc */ public const FETCH_ASSOC = 2; /** * Specifies that the fetch method shall return each row as an array indexed * by column number as returned in the corresponding result set, starting at * column 0. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-num */ public const FETCH_NUM = 3; /** * Specifies that the fetch method shall return each row as an array indexed * by both column name and number as returned in the corresponding result set, * starting at column 0. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-both */ public const FETCH_BOTH = 4; /** * Specifies that the fetch method shall return each row as an object with * property names that correspond to the column names returned in the result * set. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-obj */ public const FETCH_OBJ = 5; /** * Specifies that the fetch method shall return TRUE and assign the values of * the columns in the result set to the PHP variables to which they were * bound with the PDOStatement::bindParam or * PDOStatement::bindColumn methods. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-bound */ public const FETCH_BOUND = 6; /** * Specifies that the fetch method shall return only a single requested * column from the next row in the result set. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-column */ public const FETCH_COLUMN = 7; /** * Specifies that the fetch method shall return a new instance of the * requested class, mapping the columns to named properties in the class. * The magic * __set * method is called if the property doesn't exist in the requested class * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-class */ public const FETCH_CLASS = 8; /** * Specifies that the fetch method shall update an existing instance of the * requested class, mapping the columns to named properties in the class. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-into */ public const FETCH_INTO = 9; /** * Allows completely customize the way data is treated on the fly (only * valid inside PDOStatement::fetchAll). * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-func */ public const FETCH_FUNC = 10; /** * Group return by values. Usually combined with * PDO::FETCH_COLUMN or * PDO::FETCH_KEY_PAIR. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-group */ public const FETCH_GROUP = 65536; /** * Fetch only the unique values. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-unique */ public const FETCH_UNIQUE = 196608; /** * Fetch a two-column result into an array where the first column is a key and the second column * is the value. * @since 5.2.3 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-key-pair */ public const FETCH_KEY_PAIR = 12; /** * Determine the class name from the value of first column. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-classtype */ public const FETCH_CLASSTYPE = 262144; /** * As PDO::FETCH_INTO but object is provided as a serialized string. * Available since PHP 5.1.0. Since PHP 5.3.0 the class constructor is never called if this * flag is set. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-serialize */ public const FETCH_SERIALIZE = 524288; /** * Call the constructor before setting properties. * @since 5.2 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-props-late */ public const FETCH_PROPS_LATE = 1048576; /** * Specifies that the fetch method shall return each row as an array indexed * by column name as returned in the corresponding result set. If the result * set contains multiple columns with the same name, * PDO::FETCH_NAMED returns * an array of values per column name. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-named */ public const FETCH_NAMED = 11; /** * If this value is FALSE, PDO attempts to disable autocommit so that the * connection begins a transaction. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-autocommit */ public const ATTR_AUTOCOMMIT = 0; /** * Setting the prefetch size allows you to balance speed against memory * usage for your application. Not all database/driver combinations support * setting of the prefetch size. A larger prefetch size results in * increased performance at the cost of higher memory usage. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-prefetch */ public const ATTR_PREFETCH = 1; /** * Sets the timeout value in seconds for communications with the database. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-timeout */ public const ATTR_TIMEOUT = 2; /** * @see https://php.net/manual/en/pdo.error-handling.php Errors and error handling * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-errmode */ public const ATTR_ERRMODE = 3; /** * This is a read only attribute; it will return information about the * version of the database server to which PDO is connected. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr- */ public const ATTR_SERVER_VERSION = 4; /** * This is a read only attribute; it will return information about the * version of the client libraries that the PDO driver is using. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-client-version */ public const ATTR_CLIENT_VERSION = 5; /** * This is a read only attribute; it will return some meta information about the * database server to which PDO is connected. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-server-info */ public const ATTR_SERVER_INFO = 6; public const ATTR_CONNECTION_STATUS = 7; /** * Force column names to a specific case specified by the PDO::CASE_* * constants. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-case */ public const ATTR_CASE = 8; /** * Get or set the name to use for a cursor. Most useful when using * scrollable cursors and positioned updates. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-cursor-name */ public const ATTR_CURSOR_NAME = 9; /** * Selects the cursor type. PDO currently supports either * PDO::CURSOR_FWDONLY and * PDO::CURSOR_SCROLL. Stick with * PDO::CURSOR_FWDONLY unless you know that you need a * scrollable cursor. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-cursor */ public const ATTR_CURSOR = 10; /** * Convert empty strings to SQL NULL values on data fetches. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-oracle-nulls */ public const ATTR_ORACLE_NULLS = 11; /** * Request a persistent connection, rather than creating a new connection. * @see https://php.net/manual/en/pdo.connections.php Connections and Connection Management * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-persistent */ public const ATTR_PERSISTENT = 12; /** * Sets the class name of which statements are returned as. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-statement-class */ public const ATTR_STATEMENT_CLASS = 13; /** * Prepend the containing table name to each column name returned in the * result set. The table name and column name are separated by a decimal (.) * character. Support of this attribute is at the driver level; it may not * be supported by your driver. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-fetch-table-names */ public const ATTR_FETCH_TABLE_NAMES = 14; /** * Prepend the containing catalog name to each column name returned in the * result set. The catalog name and column name are separated by a decimal * (.) character. Support of this attribute is at the driver level; it may * not be supported by your driver. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-fetch-catalog-names */ public const ATTR_FETCH_CATALOG_NAMES = 15; /** * Returns the name of the driver. *

* using PDO::ATTR_DRIVER_NAME * * if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { * echo "Running on mysql; doing something mysql specific here\n"; * } * *

* @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-driver-name */ public const ATTR_DRIVER_NAME = 16; /** * Forces all values fetched to be treated as strings. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-stringify-fetches */ public const ATTR_STRINGIFY_FETCHES = 17; /** * Sets the maximum column name length. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-max-column-len */ public const ATTR_MAX_COLUMN_LEN = 18; /** * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-emulate-prepares * @since 5.1.3 */ public const ATTR_EMULATE_PREPARES = 20; /** * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.attr-default-fetch-mode * @since 5.2 */ public const ATTR_DEFAULT_FETCH_MODE = 19; /** * Do not raise an error or exception if an error occurs. The developer is * expected to explicitly check for errors. This is the default mode. * @see https://php.net/manual/en/pdo.error-handling.php Errors and Error Handling * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.errmode-silent */ public const ERRMODE_SILENT = 0; /** * Issue a PHP E_WARNING message if an error occurs. * @see https://php.net/manual/en/pdo.error-handling.php Errors and Error Handling * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.errmode-warning */ public const ERRMODE_WARNING = 1; /** * Throw a PDOException if an error occurs. * @see https://php.net/manual/en/pdo.error-handling.php Errors and Error Handling * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.errmode-exception */ public const ERRMODE_EXCEPTION = 2; /** * Leave column names as returned by the database driver. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.case-natural */ public const CASE_NATURAL = 0; /** * Force column names to lower case. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.case-lower */ public const CASE_LOWER = 2; /** * Force column names to upper case. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.case-upper */ public const CASE_UPPER = 1; /** * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.null-natural */ public const NULL_NATURAL = 0; /** * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.null-empty-string */ public const NULL_EMPTY_STRING = 1; /** * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.null-to-string */ public const NULL_TO_STRING = 2; /** * Corresponds to SQLSTATE '00000', meaning that the SQL statement was * successfully issued with no errors or warnings. This constant is for * your convenience when checking PDO::errorCode or * PDOStatement::errorCode to determine if an error * occurred. You will usually know if this is the case by examining the * return code from the method that raised the error condition anyway. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.err-none */ public const ERR_NONE = '00000'; /** * Fetch the next row in the result set. Valid only for scrollable cursors. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-ori-next */ public const FETCH_ORI_NEXT = 0; /** * Fetch the previous row in the result set. Valid only for scrollable * cursors. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-ori-prior */ public const FETCH_ORI_PRIOR = 1; /** * Fetch the first row in the result set. Valid only for scrollable cursors. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-ori-first */ public const FETCH_ORI_FIRST = 2; /** * Fetch the last row in the result set. Valid only for scrollable cursors. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-ori-last */ public const FETCH_ORI_LAST = 3; /** * Fetch the requested row by row number from the result set. Valid only * for scrollable cursors. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-ori-abs */ public const FETCH_ORI_ABS = 4; /** * Fetch the requested row by relative position from the current position * of the cursor in the result set. Valid only for scrollable cursors. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-ori-rel */ public const FETCH_ORI_REL = 5; /** * Specifies that the default fetch mode shall be used. * @since 8.0.7 * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-default */ public const FETCH_DEFAULT = 0; /** * Create a PDOStatement object with a forward-only cursor. This is the * default cursor choice, as it is the fastest and most common data access * pattern in PHP. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.cursor-fwdonly */ public const CURSOR_FWDONLY = 0; /** * Create a PDOStatement object with a scrollable cursor. Pass the * PDO::FETCH_ORI_* constants to control the rows fetched from the result set. * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.cursor-scroll */ public const CURSOR_SCROLL = 1; /** * If this attribute is set to TRUE on a * PDOStatement, the MySQL driver will use the * buffered versions of the MySQL API. If you're writing portable code, you * should use PDOStatement::fetchAll instead. *

* Forcing queries to be buffered in mysql * * if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { * $stmt = $db->prepare('select * from foo', * array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); * } else { * die("my application only works with mysql; I should use \$stmt->fetchAll() instead"); * } * *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query */ public const MYSQL_ATTR_USE_BUFFERED_QUERY = 1000; /** *

* Enable LOAD LOCAL INFILE. *

*

* Note, this constant can only be used in the driver_options * array when constructing a new database handle. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-local-infile */ public const MYSQL_ATTR_LOCAL_INFILE = 1001; /** *

* Command to execute when connecting to the MySQL server. Will * automatically be re-executed when reconnecting. *

*

* Note, this constant can only be used in the driver_options * array when constructing a new database handle. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-init-command */ public const MYSQL_ATTR_INIT_COMMAND = 1002; /** *

* Maximum buffer size. Defaults to 1 MiB. This constant is not supported when * compiled against mysqlnd. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-max-buffer-size */ public const MYSQL_ATTR_MAX_BUFFER_SIZE = 1005; /** *

* Read options from the named option file instead of from * my.cnf. This option is not available if * mysqlnd is used, because mysqlnd does not read the mysql * configuration files. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-read-default-file */ public const MYSQL_ATTR_READ_DEFAULT_FILE = 1003; /** *

* Read options from the named group from my.cnf or the * file specified with MYSQL_READ_DEFAULT_FILE. This option * is not available if mysqlnd is used, because mysqlnd does not read the mysql * configuration files. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-read-default-group */ public const MYSQL_ATTR_READ_DEFAULT_GROUP = 1004; /** *

* Enable network communication compression. This is not supported when * compiled against mysqlnd. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-compress */ public const MYSQL_ATTR_COMPRESS = 1003; /** *

* Perform direct queries, don't use prepared statements. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-direct-query */ public const MYSQL_ATTR_DIRECT_QUERY = 1004; /** *

* Return the number of found (matched) rows, not the * number of changed rows. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-found-rows */ public const MYSQL_ATTR_FOUND_ROWS = 1005; /** *

* Permit spaces after function names. Makes all functions * names reserved words. *

* @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-ignore-space */ public const MYSQL_ATTR_IGNORE_SPACE = 1006; public const MYSQL_ATTR_SERVER_PUBLIC_KEY = 1012; /** *

* The file path to the SSL key. *

* @since 5.3.7 * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-ssl-key */ public const MYSQL_ATTR_SSL_KEY = 1007; /** *

* The file path to the SSL certificate. *

* @since 5.3.7 * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-ssl-cert */ public const MYSQL_ATTR_SSL_CERT = 1008; /** *

* The file path to the SSL certificate authority. *

* @since 5.3.7 * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-ssl-ca */ public const MYSQL_ATTR_SSL_CA = 1009; /** *

* The file path to the directory that contains the trusted SSL * CA certificates, which are stored in PEM format. *

* @since 5.3.7 * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-ssl-capath */ public const MYSQL_ATTR_SSL_CAPATH = 1010; /** *

* A list of one or more permissible ciphers to use for SSL encryption, * in a format understood by OpenSSL. * For example: DHE-RSA-AES256-SHA:AES128-SHA *

* @since 5.3.7 * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-cipher */ public const MYSQL_ATTR_SSL_CIPHER = 1011; /** *

* Disables multi query execution in both {@see PDO::prepare()} and {@see PDO::query()} when set to FALSE. *

*

* Note, this constant can only be used in the driver_options array when constructing a new database handle. *

* @since 5.5.21 * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-multi-statements */ public const MYSQL_ATTR_MULTI_STATEMENTS = 1013; /** *

* Disables SSL peer verification when set to FALSE. *

* @since 7.0.18 * @since 7.1.4 * @link https://bugs.php.net/bug.php?id=71003 */ public const MYSQL_ATTR_SSL_VERIFY_SERVER_CERT = 1014; /** * @since 8.1 */ public const MYSQL_ATTR_LOCAL_INFILE_DIRECTORY = 1015; #[Deprecated("Use PDO::ATTR_EMULATE_PREPARES instead")] public const PGSQL_ASSOC = 1; /** * @removed 7.1 */ public const PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT = 1000; /** * @since 5.6 */ public const PGSQL_ATTR_DISABLE_PREPARES = 1000; public const PGSQL_BAD_RESPONSE = 5; public const PGSQL_BOTH = 3; public const PGSQL_TRANSACTION_IDLE = 0; public const PGSQL_TRANSACTION_ACTIVE = 1; public const PGSQL_TRANSACTION_INTRANS = 2; public const PGSQL_TRANSACTION_INERROR = 3; public const PGSQL_TRANSACTION_UNKNOWN = 4; public const PGSQL_CONNECT_ASYNC = 4; public const PGSQL_CONNECT_FORCE_NEW = 2; public const PGSQL_CONNECTION_AUTH_OK = 5; public const PGSQL_CONNECTION_AWAITING_RESPONSE = 4; public const PGSQL_CONNECTION_BAD = 1; public const PGSQL_CONNECTION_OK = 0; public const PGSQL_CONNECTION_MADE = 3; public const PGSQL_CONNECTION_SETENV = 6; public const PGSQL_CONNECTION_SSL_STARTUP = 7; public const PGSQL_CONNECTION_STARTED = 2; public const PGSQL_COMMAND_OK = 1; public const PGSQL_CONV_FORCE_NULL = 4; public const PGSQL_CONV_IGNORE_DEFAULT = 2; public const PGSQL_CONV_IGNORE_NOT_NULL = 8; public const PGSQL_COPY_IN = 4; public const PGSQL_COPY_OUT = 3; public const PGSQL_DIAG_CONTEXT = 87; public const PGSQL_DIAG_INTERNAL_POSITION = 112; public const PGSQL_DIAG_INTERNAL_QUERY = 113; public const PGSQL_DIAG_MESSAGE_DETAIL = 68; public const PGSQL_DIAG_MESSAGE_HINT = 72; public const PGSQL_DIAG_MESSAGE_PRIMARY = 77; public const PGSQL_DIAG_SEVERITY = 83; public const PGSQL_DIAG_SOURCE_FILE = 70; public const PGSQL_DIAG_SOURCE_FUNCTION = 82; public const PGSQL_DIAG_SOURCE_LINE = 76; public const PGSQL_DIAG_SQLSTATE = 67; public const PGSQL_DIAG_STATEMENT_POSITION = 80; public const PGSQL_DML_ASYNC = 1024; public const PGSQL_DML_EXEC = 512; public const PGSQL_DML_NO_CONV = 256; public const PGSQL_DML_STRING = 2048; public const PGSQL_DML_ESCAPE = 4096; public const PGSQL_EMPTY_QUERY = 0; public const PGSQL_ERRORS_DEFAULT = 1; public const PGSQL_ERRORS_TERSE = 0; public const PGSQL_ERRORS_VERBOSE = 2; public const PGSQL_FATAL_ERROR = 7; public const PGSQL_NONFATAL_ERROR = 6; public const PGSQL_NOTICE_ALL = 2; public const PGSQL_NOTICE_CLEAR = 3; public const PGSQL_NOTICE_LAST = 1; public const PGSQL_NUM = 2; public const PGSQL_POLLING_ACTIVE = 4; public const PGSQL_POLLING_FAILED = 0; public const PGSQL_POLLING_OK = 3; public const PGSQL_POLLING_READING = 1; public const PGSQL_POLLING_WRITING = 2; public const PGSQL_SEEK_CUR = 1; public const PGSQL_SEEK_END = 2; public const PGSQL_SEEK_SET = 0; public const PGSQL_STATUS_LONG = 1; public const PGSQL_STATUS_STRING = 2; public const PGSQL_TUPLES_OK = 2; public const SQLSRV_TXN_READ_UNCOMMITTED = "READ_UNCOMMITTED"; public const SQLSRV_TXN_READ_COMMITTED = "READ_COMMITTED"; public const SQLSRV_TXN_REPEATABLE_READ = "REPEATABLE_READ"; public const SQLSRV_TXN_SNAPSHOT = "SNAPSHOT"; public const SQLSRV_TXN_SERIALIZABLE = "SERIALIZABLE"; public const SQLSRV_ENCODING_BINARY = 2; public const SQLSRV_ENCODING_SYSTEM = 3; public const SQLSRV_ENCODING_UTF8 = 65001; public const SQLSRV_ENCODING_DEFAULT = 1; public const SQLSRV_ATTR_ENCODING = 1000; public const SQLSRV_ATTR_QUERY_TIMEOUT = 1001; public const SQLSRV_ATTR_DIRECT_QUERY = 1002; public const SQLSRV_ATTR_CURSOR_SCROLL_TYPE = 1003; public const SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE = 1004; public const SQLSRV_ATTR_FETCHES_NUMERIC_TYPE = 1005; public const SQLSRV_ATTR_FETCHES_DATETIME_TYPE = 1006; public const SQLSRV_ATTR_FORMAT_DECIMALS = 1007; public const SQLSRV_ATTR_DECIMAL_PLACES = 1008; public const SQLSRV_ATTR_DATA_CLASSIFICATION = 1009; public const SQLSRV_PARAM_OUT_DEFAULT_SIZE = -1; public const SQLSRV_CURSOR_KEYSET = 1; public const SQLSRV_CURSOR_DYNAMIC = 2; public const SQLSRV_CURSOR_STATIC = 3; public const SQLSRV_CURSOR_BUFFERED = 42; /** * @since 7.4 */ public const SQLITE_ATTR_READONLY_STATEMENT = 1001; /** * @since 7.4 */ public const SQLITE_ATTR_EXTENDED_RESULT_CODES = 1002; /** * Provides a way to specify the action on the database session. * @since 7.2.16 * @since 7.3.3 */ public const OCI_ATTR_ACTION = 1000; /** * Provides a way to specify the client info on the database session. * @since 7.2.16 * @since 7.3.3 */ public const OCI_ATTR_CLIENT_INFO = 1001; /** * Provides a way to specify the client identifier on the database session. * @since 7.2.16 * @since 7.3.3 */ public const OCI_ATTR_CLIENT_IDENTIFIER = 1002; /** * Provides a way to specify the module on the database session. * @since 7.2.16 * @since 7.3.3 */ public const OCI_ATTR_MODULE = 1003; /** * The number of milliseconds to wait for individual round trips to the database to complete before timing out. * @since 8.0 */ public const OCI_ATTR_CALL_TIMEOUT = 1004; /** * Sets the date format. */ public const FB_ATTR_DATE_FORMAT = 1000; /** * Sets the time format. */ public const FB_ATTR_TIME_FORMAT = 1001; /** * Sets the timestamp format. */ public const FB_ATTR_TIMESTAMP_FORMAT = 1002; /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Creates a PDO instance representing a connection to a database * @link https://php.net/manual/en/pdo.construct.php * @param string $dsn * @param string $username [optional] * @param string $password [optional] * @param array $options [optional] * @throws PDOException if the attempt to connect to the requested database fails. */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $dsn, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $username = null, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $password = null, #[LanguageLevelTypeAware(['8.0' => 'array|null'], default: '')] $options = null ) {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Prepares a statement for execution and returns a statement object * @link https://php.net/manual/en/pdo.prepare.php * @param string $query

* This must be a valid SQL statement for the target database server. *

* @param array $options [optional]

* This array holds one or more key=>value pairs to set * attribute values for the PDOStatement object that this method * returns. You would most commonly use this to set the * PDO::ATTR_CURSOR value to * PDO::CURSOR_SCROLL to request a scrollable cursor. * Some drivers have driver specific options that may be set at * prepare-time. *

* @return PDOStatement|false If the database server successfully prepares the statement, * PDO::prepare returns a * PDOStatement object. * If the database server cannot successfully prepare the statement, * PDO::prepare returns FALSE or emits * PDOException (depending on error handling). *

*

* Emulated prepared statements does not communicate with the database server * so PDO::prepare does not check the statement. */ #[TentativeType] public function prepare( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $query, #[LanguageLevelTypeAware(['8.0' => 'array'], default: '')] $options = [] ): PDOStatement|false {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Initiates a transaction *

* Turns off autocommit mode. While autocommit mode is turned off, * changes made to the database via the PDO object instance are not committed * until you end the transaction by calling {@link PDO::commit()}. * Calling {@link PDO::rollBack()} will roll back all changes to the database and * return the connection to autocommit mode. *

*

* Some databases, including MySQL, automatically issue an implicit COMMIT * when a database definition language (DDL) statement * such as DROP TABLE or CREATE TABLE is issued within a transaction. * The implicit COMMIT will prevent you from rolling back any other changes * within the transaction boundary. *

* @link https://php.net/manual/en/pdo.begintransaction.php * @return bool TRUE on success or FALSE on failure. * @throws PDOException If there is already a transaction started or * the driver does not support transactions
* Note: An exception is raised even when the PDO::ATTR_ERRMODE * attribute is not PDO::ERRMODE_EXCEPTION. */ #[TentativeType] public function beginTransaction(): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Commits a transaction * @link https://php.net/manual/en/pdo.commit.php * @return bool TRUE on success or FALSE on failure. * @throws PDOException if there is no active transaction. */ #[TentativeType] public function commit(): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Rolls back a transaction * @link https://php.net/manual/en/pdo.rollback.php * @return bool TRUE on success or FALSE on failure. * @throws PDOException if there is no active transaction. */ #[TentativeType] public function rollBack(): bool {} /** * (PHP 5 >= 5.3.3, Bundled pdo_pgsql, PHP 7)
* Checks if inside a transaction * @link https://php.net/manual/en/pdo.intransaction.php * @return bool TRUE if a transaction is currently active, and FALSE if not. */ #[TentativeType] public function inTransaction(): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Set an attribute * @link https://php.net/manual/en/pdo.setattribute.php * @param int $attribute * @param mixed $value * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setAttribute( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $attribute, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value ): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Execute an SQL statement and return the number of affected rows * @link https://php.net/manual/en/pdo.exec.php * @param string $statement

* The SQL statement to prepare and execute. *

*

* Data inside the query should be properly escaped. *

* @return int|false PDO::exec returns the number of rows that were modified * or deleted by the SQL statement you issued. If no rows were affected, * PDO::exec returns 0. *

* This function may * return Boolean FALSE, but may also return a non-Boolean value which * evaluates to FALSE. Please read the section on Booleans for more * information. Use the === * operator for testing the return value of this * function. *

* The following example incorrectly relies on the return value of * PDO::exec, wherein a statement that affected 0 rows * results in a call to die: * * $db->exec() or die(print_r($db->errorInfo(), true)); * */ #[TentativeType] public function exec(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $statement): int|false {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Executes an SQL statement, returning a result set as a PDOStatement object * @link https://php.net/manual/en/pdo.query.php * @param string $query

* The SQL statement to prepare and execute. *

*

* Data inside the query should be properly escaped. *

* @param int $fetchMode

* The fetch mode must be one of the PDO::FETCH_* constants. *

* @param mixed $arg3

* The second and following parameters are the same as the parameters for PDOStatement::setFetchMode. *

* @param array $ctorargs [optional]

* Arguments of custom class constructor when the mode * parameter is set to PDO::FETCH_CLASS. *

* @return PDOStatement|false PDO::query returns a PDOStatement object, or FALSE * on failure. * @see PDOStatement::setFetchMode For a full description of the second and following parameters. */ #[PhpStormStubsElementAvailable(to: '7.4')] public function query($query, $fetchMode = PDO::ATTR_DEFAULT_FETCH_MODE, $arg3 = null, $ctorargs = []) {} /** * (PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
* Executes an SQL statement, returning a result set as a PDOStatement object * @link https://php.net/manual/en/pdo.query.php * @param string $query

* The SQL statement to prepare and execute. *

*

* Data inside the query should be properly escaped. *

* @param int|null $fetchMode

* The fetch mode must be one of the PDO::FETCH_* constants. *

* @param mixed ...$fetch_mode_args

* Arguments of custom class constructor when the mode * parameter is set to PDO::FETCH_CLASS. *

* @return PDOStatement|false PDO::query returns a PDOStatement object, or FALSE * on failure. * @see PDOStatement::setFetchMode For a full description of the second and following parameters. */ #[PhpStormStubsElementAvailable('8.0')] public function query( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $query, #[LanguageLevelTypeAware(['8.0' => 'int|null'], default: '')] $fetchMode = null, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] ...$fetchModeArgs ) {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Returns the ID of the last inserted row or sequence value * @link https://php.net/manual/en/pdo.lastinsertid.php * @param string $name [optional]

* Name of the sequence object from which the ID should be returned. *

* @return string|false If a sequence name was not specified for the name * parameter, PDO::lastInsertId returns a * string representing the row ID of the last row that was inserted into * the database. *

*

* If a sequence name was specified for the name * parameter, PDO::lastInsertId returns a * string representing the last value retrieved from the specified sequence * object. *

*

* If the PDO driver does not support this capability, * PDO::lastInsertId triggers an * IM001 SQLSTATE. * @throws PDOException On error if PDO::ERRMODE_EXCEPTION option is true. */ #[TentativeType] public function lastInsertId(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $name = null): string|false {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Fetch the SQLSTATE associated with the last operation on the database handle * @link https://php.net/manual/en/pdo.errorcode.php * @return mixed an SQLSTATE, a five characters alphanumeric identifier defined in * the ANSI SQL-92 standard. Briefly, an SQLSTATE consists of a * two characters class value followed by a three characters subclass value. A * class value of 01 indicates a warning and is accompanied by a return code * of SQL_SUCCESS_WITH_INFO. Class values other than '01', except for the * class 'IM', indicate an error. The class 'IM' is specific to warnings * and errors that derive from the implementation of PDO (or perhaps ODBC, * if you're using the ODBC driver) itself. The subclass value '000' in any * class indicates that there is no subclass for that SQLSTATE. *

*

* PDO::errorCode only retrieves error codes for operations * performed directly on the database handle. If you create a PDOStatement * object through PDO::prepare or * PDO::query and invoke an error on the statement * handle, PDO::errorCode will not reflect that error. * You must call PDOStatement::errorCode to return the error * code for an operation performed on a particular statement handle. *

*

* Returns NULL if no operation has been run on the database handle. */ #[TentativeType] public function errorCode(): ?string {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Fetch extended error information associated with the last operation on the database handle * @link https://php.net/manual/en/pdo.errorinfo.php * @return array PDO::errorInfo returns an array of error information * about the last operation performed by this database handle. The array * consists of the following fields: * * Element * Information * * * 0 * SQLSTATE error code (a five characters alphanumeric identifier defined * in the ANSI SQL standard). * * * 1 * Driver-specific error code. * * * 2 * Driver-specific error message. * *

*

* If the SQLSTATE error code is not set or there is no driver-specific * error, the elements following element 0 will be set to NULL. *

*

* PDO::errorInfo only retrieves error information for * operations performed directly on the database handle. If you create a * PDOStatement object through PDO::prepare or * PDO::query and invoke an error on the statement * handle, PDO::errorInfo will not reflect the error * from the statement handle. You must call * PDOStatement::errorInfo to return the error * information for an operation performed on a particular statement handle. */ #[ArrayShape([0 => "string", 1 => "int", 2 => "string"])] #[TentativeType] public function errorInfo(): array {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Retrieve a database connection attribute * @link https://php.net/manual/en/pdo.getattribute.php * @param int $attribute

* One of the PDO::ATTR_* constants. The constants that * apply to database connections are as follows: * PDO::ATTR_AUTOCOMMIT * PDO::ATTR_CASE * PDO::ATTR_CLIENT_VERSION * PDO::ATTR_CONNECTION_STATUS * PDO::ATTR_DRIVER_NAME * PDO::ATTR_ERRMODE * PDO::ATTR_ORACLE_NULLS * PDO::ATTR_PERSISTENT * PDO::ATTR_PREFETCH * PDO::ATTR_SERVER_INFO * PDO::ATTR_SERVER_VERSION * PDO::ATTR_TIMEOUT *

* @return mixed A successful call returns the value of the requested PDO attribute. * An unsuccessful call returns null. */ #[TentativeType] public function getAttribute(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $attribute): mixed {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.1)
* Quotes a string for use in a query. * @link https://php.net/manual/en/pdo.quote.php * @param string $string

* The string to be quoted. *

* @param int $type [optional]

* Provides a data type hint for drivers that have alternate quoting styles. *

* @return string|false a quoted string that is theoretically safe to pass into an * SQL statement. Returns FALSE if the driver does not support quoting in * this way. */ #[TentativeType] public function quote( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $string, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = PDO::PARAM_STR ): string|false {} final public function __wakeup() {} final public function __sleep() {} /** * (PHP 5 >= 5.1.3, PHP 7, PECL pdo >= 1.0.3)
* Return an array of available PDO drivers * @link https://php.net/manual/en/pdo.getavailabledrivers.php * @return array PDO::getAvailableDrivers returns an array of PDO driver names. If * no drivers are available, it returns an empty array. */ #[TentativeType] public static function getAvailableDrivers(): array {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo_sqlite >= 1.0.0)
* Registers an aggregating User Defined Function for use in SQL statements * @link https://php.net/manual/en/pdo.sqlitecreateaggregate.php * @param string $function_name

* The name of the function used in SQL statements. *

* @param callable $step_func

* Callback function called for each row of the result set. Your PHP function should accumulate the result and store it in the aggregation context. *

* @param callable $finalize_func

* Callback function to aggregate the "stepped" data from each row. Once all the rows have been processed, this function will be called and it should then take the data from the aggregation context and return the result. This callback function should return a type understood by SQLite (i.e. scalar type). *

* @param int $num_args [optional]

* Hint to the SQLite parser if the callback function accepts a predetermined number of arguments. *

* @return bool TRUE on success or FALSE on failure. */ public function sqliteCreateAggregate($function_name, $step_func, $finalize_func, $num_args = -1) {} /** * (PHP 5 >= 5.3.11, PHP 7)
* Registers a User Defined Function for use as a collating function in SQL statements * @link https://php.net/manual/en/pdo.sqlitecreatecollation.php * @param string $name

* Name of the SQL collating function to be created or redefined. *

* @param callable $callback

* The name of a PHP function or user-defined function to apply as a callback, defining the behavior of the collation. It should accept two strings and return as strcmp() does, i.e. it should return -1, 1, or 0 if the first string sorts before, sorts after, or is equal to the second. *

* @return bool TRUE on success or FALSE on failure. */ public function sqliteCreateCollation($name, $callback) {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo_sqlite >= 1.0.0)
* Registers a User Defined Function for use in SQL statements * @link https://php.net/manual/en/pdo.sqlitecreatefunction.php * @param string $function_name

* The name of the function used in SQL statements. *

* @param callable $callback

* Callback function to handle the defined SQL function. *

* @param int $num_args [optional]

* The number of arguments that the SQL function takes. If this parameter is -1, * then the SQL function may take any number of arguments. *

* @param int $flags [optional]

* A bitwise conjunction of flags. Currently, only PDO::SQLITE_DETERMINISTIC is supported, * which specifies that the function always returns the same result given the same inputs within * a single SQL statement. *

* @return bool TRUE on success or FALSE on failure. */ public function sqliteCreateFunction($function_name, $callback, $num_args = -1, $flags = 0) {} /** * (PHP 5 >= 5.3.3, PHP 7, PHP 8)
* Copy data from PHP array into table * @link https://www.php.net/manual/en/pdo.pgsqlcopyfromarray.php * @param string $tableName

* String containing table name *

* @param array $rows

* Array of strings with fields separated by separator *

* @param string $separator

* Separator used in rows array *

* @param string $nullAs

* How to interpret null values *

* @param string|null $fields

* List of fields to insert *

* @return bool TRUE on success or FALSE on failure. */ public function pgsqlCopyFromArray($tableName, array $rows, $separator = "\t", $nullAs = "\\\\N", $fields = null) {} /** * (PHP 5 >= 5.3.3, PHP 7, PHP 8)
* Copy data from file into table * @link https://www.php.net/manual/en/pdo.pgsqlcopyfromfile.php * @param string $tableName

* String containing table name *

* @param string $filename

* Filename containing data to import *

* @param string $separator

* Separator used in file specified by filename *

* @param string $nullAs

* How to interpret null values *

* @param string|null $fields

* List of fields to insert *

* @return bool TRUE on success or FALSE on failure. */ public function pgsqlCopyFromFile($tableName, $filename, $separator = "\t", $nullAs = "\\\\N", $fields = null) {} /** * (PHP 5 >= 5.3.3, PHP 7, PHP 8)
* Copy data from database table into PHP array * @link https://www.php.net/manual/en/pdo.pgsqlcopytoarray.php * @param string $tableName

* String containing table name *

* @param string $separator

* Separator used in rows *

* @param string $nullAs

* How to interpret null values *

* @param string|null $fields

* List of fields to insert *

* @return array|false returns an array of rows, or FALSE on failure. */ public function pgsqlCopyToArray($tableName, $separator = "\t", $nullAs = "\\\\N", $fields = null) {} /** * (PHP 5 >= 5.3.3, PHP 7, PHP 8)
* Copy data from table into file * @link https://www.php.net/manual/en/pdo.pgsqlcopytofile.php * @param string $tableName

* String containing table name *

* @param string $filename

* Filename to export data *

* @param string $separator

* Separator used in file specified by filename *

* @param string $nullAs

* How to interpret null values *

* @param string|null $fields

* List of fields to insert *

* @return bool TRUE on success or FALSE on failure. */ public function pgsqlCopyToFile($tableName, $filename, $separator = "\t", $nullAs = "\\\\N", $fields = null) {} /** * (PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)
* Creates a new large object * @link https://www.php.net/manual/en/pdo.pgsqllobcreate.php * @return string|false returns the OID of the newly created large object on success, * or FALSE on failure. */ public function pgsqlLOBCreate() {} /** * (PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)
* Opens an existing large object stream * @link https://www.php.net/manual/en/pdo.pgsqllobopen.php * @param string $oid

* A large object identifier. *

* @param string $mode

* If mode is r, open the stream for reading. If mode is w, open the stream for writing. *

* @return resource|false returns a stream resource on success or FALSE on failure. */ public function pgsqlLOBOpen($oid, $mode = "rb") {} /** * (PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)
* Deletes the large object * @link https://www.php.net/manual/en/pdo.pgsqllobunlink.php * @param string $oid

* A large object identifier. *

* @return bool TRUE on success or FALSE on failure. */ public function pgsqlLOBUnlink($oid) {} /** * (PHP 5 >= 5.6.0, PHP 7, PHP 8)
* Get asynchronous notification * @link https://www.php.net/manual/en/pdo.pgsqlgetnotify.php * @param int $fetchMode

* The format the result set should be returned as, represented as a PDO::FETCH_* constant. *

* @param int $timeoutMilliseconds

* The length of time to wait for a response, in milliseconds. *

* @return array|false if one or more notifications is pending, returns a single row, * with fields message and pid, otherwise FALSE. */ public function pgsqlGetNotify($fetchMode = 1, $timeoutMilliseconds = 0) {} /** * (PHP 5 >= 5.6.0, PHP 7, PHP 8)
* Get the server PID * @link https://www.php.net/manual/en/pdo.pgsqlgetpid.php * @return int The server's PID. */ public function pgsqlGetPid() {} /** * @since 8.4 */ public static function connect(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null): static {} } /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 1.0.0)
* Represents a prepared statement and, after the statement is executed, an * associated result set. * @link https://php.net/manual/en/class.pdostatement.php */ class PDOStatement implements IteratorAggregate { /** * @var string */ #[LanguageLevelTypeAware(['8.1' => 'string'], default: '')] public $queryString; /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Executes a prepared statement * @link https://php.net/manual/en/pdostatement.execute.php * @param array $params [optional]

* An array of values with as many elements as there are bound * parameters in the SQL statement being executed. * All values are treated as PDO::PARAM_STR. *

*

* You cannot bind multiple values to a single parameter; for example, * you cannot bind two values to a single named parameter in an IN() * clause. *

*

* You cannot bind more values than specified; if more keys exist in * input_parameters than in the SQL specified * in the PDO::prepare, then the statement will * fail and an error is emitted. *

* @return bool TRUE on success or FALSE on failure. * @throws PDOException On error if PDO::ERRMODE_EXCEPTION option is true. */ #[TentativeType] public function execute(#[LanguageLevelTypeAware(['8.0' => 'array|null'], default: '')] $params = null): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Fetches the next row from a result set * @link https://php.net/manual/en/pdostatement.fetch.php * @param int $mode [optional]

* Controls how the next row will be returned to the caller. This value * must be one of the PDO::FETCH_* constants, * defaulting to value of PDO::ATTR_DEFAULT_FETCH_MODE * (which defaults to PDO::FETCH_BOTH). *

*

* PDO::FETCH_ASSOC: returns an array indexed by column * name as returned in your result set *

* @param int $cursorOrientation [optional]

* For a PDOStatement object representing a scrollable cursor, this * value determines which row will be returned to the caller. This value * must be one of the PDO::FETCH_ORI_* constants, * defaulting to PDO::FETCH_ORI_NEXT. To request a * scrollable cursor for your PDOStatement object, you must set the * PDO::ATTR_CURSOR attribute to * PDO::CURSOR_SCROLL when you prepare the SQL * statement with PDO::prepare. *

* @param int $cursorOffset [optional] * @return mixed The return value of this function on success depends on the fetch type. In * all cases, FALSE is returned on failure. */ #[TentativeType] public function fetch( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = PDO::FETCH_DEFAULT, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $cursorOrientation = PDO::FETCH_ORI_NEXT, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $cursorOffset = 0 ): mixed {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Binds a parameter to the specified variable name * @link https://php.net/manual/en/pdostatement.bindparam.php * @param mixed $param

* Parameter identifier. For a prepared statement using named * placeholders, this will be a parameter name of the form * :name. For a prepared statement using * question mark placeholders, this will be the 1-indexed position of * the parameter. *

* @param mixed &$var

* Name of the PHP variable to bind to the SQL statement parameter. *

* @param int $type [optional]

* Explicit data type for the parameter using the PDO::PARAM_* * constants. * To return an INOUT parameter from a stored procedure, * use the bitwise OR operator to set the PDO::PARAM_INPUT_OUTPUT bits * for the data_type parameter. *

* @param int $maxLength [optional]

* Length of the data type. To indicate that a parameter is an OUT * parameter from a stored procedure, you must explicitly set the * length. *

* @param mixed $driverOptions [optional]

*

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function bindParam( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $param, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] &$var, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = PDO::PARAM_STR, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $maxLength = 0, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $driverOptions = null ): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Bind a column to a PHP variable * @link https://php.net/manual/en/pdostatement.bindcolumn.php * @param mixed $column

* Number of the column (1-indexed) or name of the column in the result set. * If using the column name, be aware that the name should match the * case of the column, as returned by the driver. *

* @param mixed &$var

* Name of the PHP variable to which the column will be bound. *

* @param int $type [optional]

* Data type of the parameter, specified by the PDO::PARAM_* constants. *

* @param int $maxLength [optional]

* A hint for pre-allocation. *

* @param mixed $driverOptions [optional]

* Optional parameter(s) for the driver. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function bindColumn( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $column, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] &$var, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = PDO::PARAM_STR, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $maxLength = 0, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $driverOptions = null ): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 1.0.0)
* Binds a value to a parameter * @link https://php.net/manual/en/pdostatement.bindvalue.php * @param mixed $param

* Parameter identifier. For a prepared statement using named * placeholders, this will be a parameter name of the form * :name. For a prepared statement using * question mark placeholders, this will be the 1-indexed position of * the parameter. *

* @param mixed $value

* The value to bind to the parameter. *

* @param int $type [optional]

* Explicit data type for the parameter using the PDO::PARAM_* * constants. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function bindValue( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $param, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = PDO::PARAM_STR ): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Returns the number of rows affected by the last SQL statement * @link https://php.net/manual/en/pdostatement.rowcount.php * @return int the number of rows. */ #[TentativeType] public function rowCount(): int {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.9.0)
* Returns a single column from the next row of a result set * @link https://php.net/manual/en/pdostatement.fetchcolumn.php * @param int $column [optional]

* 0-indexed number of the column you wish to retrieve from the row. If * no value is supplied, PDOStatement::fetchColumn * fetches the first column. *

* @return mixed Returns a single column from the next row of a result * set or FALSE if there are no more rows. *

*

* There is no way to return another column from the same row if you * use PDOStatement::fetchColumn to retrieve data. */ #[TentativeType] public function fetchColumn(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $column = 0): mixed {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Returns an array containing all of the result set rows * @link https://php.net/manual/en/pdostatement.fetchall.php * @param int $mode [optional]

* Controls the contents of the returned array as documented in * PDOStatement::fetch. * Defaults to value of PDO::ATTR_DEFAULT_FETCH_MODE * (which defaults to PDO::FETCH_BOTH) *

*

* To return an array consisting of all values of a single column from * the result set, specify PDO::FETCH_COLUMN. You * can specify which column you want with the * column-index parameter. *

*

* To fetch only the unique values of a single column from the result set, * bitwise-OR PDO::FETCH_COLUMN with * PDO::FETCH_UNIQUE. *

*

* To return an associative array grouped by the values of a specified * column, bitwise-OR PDO::FETCH_COLUMN with * PDO::FETCH_GROUP. *

* @param mixed ...$args

* Arguments of custom class constructor when the fetch_style * parameter is PDO::FETCH_CLASS. *

* @return array PDOStatement::fetchAll returns an array containing * all of the remaining rows in the result set. The array represents each * row as either an array of column values or an object with properties * corresponding to each column name. * An empty array is returned if there are zero results to fetch, or false on failure. *

*

* Using this method to fetch large result sets will result in a heavy * demand on system and possibly network resources. Rather than retrieving * all of the data and manipulating it in PHP, consider using the database * server to manipulate the result sets. For example, use the WHERE and * ORDER BY clauses in SQL to restrict results before retrieving and * processing them with PHP. */ #[TentativeType] public function fetchAll( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = PDO::FETCH_DEFAULT, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $fetch_argument = null, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] ...$args ): array {} /** * @template T * * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.4)
* Fetches the next row and returns it as an object. * @link https://php.net/manual/en/pdostatement.fetchobject.php * @param class-string $class [optional]

* Name of the created class. *

* @param array $constructorArgs [optional]

* Elements of this array are passed to the constructor. *

* @return T|stdClass|null an instance of the required class with property names that * correspond to the column names or FALSE on failure. */ #[TentativeType] public function fetchObject( #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $class = "stdClass", #[LanguageLevelTypeAware(['8.0' => 'array'], default: '')] $constructorArgs = [] ): object|false {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Fetch the SQLSTATE associated with the last operation on the statement handle * @link https://php.net/manual/en/pdostatement.errorcode.php * @return string Identical to PDO::errorCode, except that * PDOStatement::errorCode only retrieves error codes * for operations performed with PDOStatement objects. */ #[TentativeType] public function errorCode(): ?string {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
* Fetch extended error information associated with the last operation on the statement handle * @link https://php.net/manual/en/pdostatement.errorinfo.php * @return array PDOStatement::errorInfo returns an array of * error information about the last operation performed by this * statement handle. The array consists of the following fields: * * Element * Information * * * 0 * SQLSTATE error code (a five characters alphanumeric identifier defined * in the ANSI SQL standard). * * * 1 * Driver specific error code. * * * 2 * Driver specific error message. * */ #[ArrayShape([0 => "string", 1 => "int", 2 => "string"])] #[TentativeType] public function errorInfo(): array {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Set a statement attribute * @link https://php.net/manual/en/pdostatement.setattribute.php * @param int $attribute * @param mixed $value * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setAttribute( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $attribute, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value ): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Retrieve a statement attribute * @link https://php.net/manual/en/pdostatement.getattribute.php * @param int $name * @return mixed the attribute value. */ #[TentativeType] public function getAttribute(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $name): mixed {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Returns the number of columns in the result set * @link https://php.net/manual/en/pdostatement.columncount.php * @return int the number of columns in the result set represented by the * PDOStatement object. If there is no result set, * PDOStatement::columnCount returns 0. */ #[TentativeType] public function columnCount(): int {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Returns metadata for a column in a result set * @link https://php.net/manual/en/pdostatement.getcolumnmeta.php * @param int $column

* The 0-indexed column in the result set. *

* @return array|false an associative array containing the following values representing * the metadata for a single column: *

* * Column metadata * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
NameValue
native_typeThe PHP native type used to represent the column value.
driver:decl_typeThe SQL type used to represent the column value in the database. * If the column in the result set is the result of a function, this value * is not returned by PDOStatement::getColumnMeta. *
flagsAny flags set for this column.
nameThe name of this column as returned by the database.
tableThe name of this column's table as returned by the database.
lenThe length of this column. Normally -1 for * types other than floating point decimals.
precisionThe numeric precision of this column. Normally * 0 for types other than floating point * decimals.
pdo_typeThe type of this column as represented by the * PDO::PARAM_* constants.
*

* Returns FALSE if the requested column does not exist in the result set, * or if no result set exists. */ #[TentativeType] #[ArrayShape([ "name" => "string", "len" => "int", "precision" => "int", "oci:decl_type" => "int|string", "native_type" => "string", "scale" => "int", "flags" => "array", "pdo_type" => "int" ])] public function getColumnMeta(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $column): array|false {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Set the default fetch mode for this statement * @link https://php.net/manual/en/pdostatement.setfetchmode.php * @param int $mode

* The fetch mode must be one of the PDO::FETCH_* constants. *

* @param mixed ...$args

Constructor arguments.

* @return bool TRUE on success or FALSE on failure. */ public function setFetchMode($mode, ...$args) {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
* Advances to the next rowset in a multi-rowset statement handle * @link https://php.net/manual/en/pdostatement.nextrowset.php * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function nextRowset(): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.9.0)
* Closes the cursor, enabling the statement to be executed again. * @link https://php.net/manual/en/pdostatement.closecursor.php * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function closeCursor(): bool {} /** * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.9.0)
* Dump an SQL prepared command * @link https://php.net/manual/en/pdostatement.debugdumpparams.php * @return bool|null No value is returned. */ #[TentativeType] public function debugDumpParams(): ?bool {} final public function __wakeup() {} final public function __sleep() {} /** * @return Iterator * @since 8.0 */ public function getIterator(): Iterator {} public function connect() {} } final class PDORow { #[LanguageLevelTypeAware(['8.1' => 'string'], default: '')] public $queryString; } /** * (PHP 5 >= 5.1.3, PHP 7, PECL pdo >= 1.0.3)
* Return an array of available PDO drivers * @link https://php.net/manual/en/pdo.getavailabledrivers.php * @return array PDO::getAvailableDrivers returns an array of PDO driver names. If * no drivers are available, it returns an empty array. */ #[Pure] function pdo_drivers(): array {} function confirm_pdo_ibm_compiled() {} } namespace Pdo { use PDO; /** * @since 8.4 */ class Sqlite extends PDO {} /** * @since 8.4 */ class Mysql extends PDO {} } DomainException
. * @link https://php.net/manual/en/class.rangeexception.php */ class RangeException extends RuntimeException {} /** * Exception thrown when performing an invalid operation on an empty container, such as removing an element. * @link https://php.net/manual/en/class.underflowexception.php */ class UnderflowException extends RuntimeException {} /** * Exception thrown if a value does not match with a set of values. Typically * this happens when a function calls another function and expects the return * value to be of a certain type or value not including arithmetic or buffer * related errors. * @link https://php.net/manual/en/class.unexpectedvalueexception.php */ class UnexpectedValueException extends RuntimeException {} /** * The EmptyIterator class for an empty iterator. * @link https://secure.php.net/manual/en/class.emptyiterator.php */ class EmptyIterator implements Iterator { /** * Return the current element * @link https://php.net/manual/en/iterator.current.php * @return mixed Can return any type. */ #[TentativeType] public function current(): never {} /** * Move forward to next element * @link https://php.net/manual/en/iterator.next.php * @return void Any returned value is ignored. */ #[TentativeType] public function next(): void {} /** * Return the key of the current element * @link https://php.net/manual/en/iterator.key.php * @return mixed The key of the current element. */ #[TentativeType] public function key(): never {} /** * Checks if current position is valid * @link https://php.net/manual/en/iterator.valid.php * @return bool The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ #[TentativeType] #[LanguageLevelTypeAware(['8.2' => 'false'], default: 'bool')] public function valid() {} /** * Rewind the Iterator to the first element * @link https://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. */ #[TentativeType] public function rewind(): void {} } /** * Filtered iterator using the callback to determine which items are accepted or rejected. * @link https://secure.php.net/manual/en/class.callbackfilteriterator.php * @since 5.4 */ class CallbackFilterIterator extends FilterIterator { /** * Creates a filtered iterator using the callback to determine which items are accepted or rejected. * @param Iterator $iterator The iterator to be filtered. * @param callable $callback The callback, which should return TRUE to accept the current item or FALSE otherwise. * May be any valid callable value. * The callback should accept up to three arguments: the current item, the current key and the iterator, respectively. * function my_callback($current, $key, $iterator) * @link https://secure.php.net/manual/en/callbackfilteriterator.construct.php */ public function __construct(Iterator $iterator, callable $callback) {} /** * This method calls the callback with the current value, current key and the inner iterator. * The callback is expected to return TRUE if the current item is to be accepted, or FALSE otherwise. * @link https://secure.php.net/manual/en/callbackfilteriterator.accept.php * @return bool true if the current element is acceptable, otherwise false. */ #[TentativeType] public function accept(): bool {} } /** * (PHP 5 >= 5.4.0)
* RecursiveCallbackFilterIterator from a RecursiveIterator * @link https://secure.php.net/manual/en/class.recursivecallbackfilteriterator.php * @since 5.4 */ class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator { /** * Create a RecursiveCallbackFilterIterator from a RecursiveIterator * @param RecursiveIterator $iterator The recursive iterator to be filtered. * @param callable $callback The callback, which should return TRUE to accept the current item or FALSE otherwise. See Examples. * May be any valid callable value. * @link https://www.php.net/manual/en/recursivecallbackfilteriterator.construct.php */ public function __construct( RecursiveIterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback ) {} /** * Check whether the inner iterator's current element has children * @link https://php.net/manual/en/recursiveiterator.haschildren.php * @return bool Returns TRUE if the current element has children, FALSE otherwise. */ #[TentativeType] public function hasChildren(): bool {} /** * Returns an iterator for the current entry. * @link https://secure.php.net/manual/en/recursivecallbackfilteriterator.haschildren.php * @return RecursiveCallbackFilterIterator containing the children. */ #[TentativeType] public function getChildren(): RecursiveCallbackFilterIterator {} } /** * Classes implementing RecursiveIterator can be used to iterate * over iterators recursively. * @link https://php.net/manual/en/class.recursiveiterator.php */ interface RecursiveIterator extends Iterator { /** * Returns if an iterator can be created for the current entry. * @link https://php.net/manual/en/recursiveiterator.haschildren.php * @return bool true if the current entry can be iterated over, otherwise returns false. */ #[TentativeType] public function hasChildren(): bool; /** * Returns an iterator for the current entry. * @link https://php.net/manual/en/recursiveiterator.getchildren.php * @return RecursiveIterator|null An iterator for the current entry. */ #[TentativeType] public function getChildren(): ?RecursiveIterator; } /** * Can be used to iterate through recursive iterators. * @link https://php.net/manual/en/class.recursiveiteratoriterator.php */ class RecursiveIteratorIterator implements OuterIterator { /** * The default. Lists only leaves in iteration. */ public const LEAVES_ONLY = 0; /** * Lists leaves and parents in iteration with parents coming first. */ public const SELF_FIRST = 1; /** * Lists leaves and parents in iteration with leaves coming first. */ public const CHILD_FIRST = 2; /** * Special flag: Ignore exceptions thrown in accessing children. */ public const CATCH_GET_CHILD = 16; /** * Construct a RecursiveIteratorIterator * @link https://php.net/manual/en/recursiveiteratoriterator.construct.php * @param Traversable $iterator * @param int $mode [optional] The operation mode. See class constants for details. * @param int $flags [optional] A bitmask of special flags. See class constants for details. * @since 5.1.3 */ public function __construct( Traversable $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = self::LEAVES_ONLY, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0 ) {} /** * Rewind the iterator to the first element of the top level inner iterator * @link https://php.net/manual/en/recursiveiteratoriterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Check whether the current position is valid * @link https://php.net/manual/en/recursiveiteratoriterator.valid.php * @return bool true if the current position is valid, otherwise false */ #[TentativeType] public function valid(): bool {} /** * Access the current key * @link https://php.net/manual/en/recursiveiteratoriterator.key.php * @return mixed The key of the current element. */ #[TentativeType] public function key(): mixed {} /** * Access the current element value * @link https://php.net/manual/en/recursiveiteratoriterator.current.php * @return mixed The current elements value. */ #[TentativeType] public function current(): mixed {} /** * Move forward to the next element * @link https://php.net/manual/en/recursiveiteratoriterator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Get the current depth of the recursive iteration * @link https://php.net/manual/en/recursiveiteratoriterator.getdepth.php * @return int The current depth of the recursive iteration. */ #[TentativeType] public function getDepth(): int {} /** * The current active sub iterator * @link https://php.net/manual/en/recursiveiteratoriterator.getsubiterator.php * @param int $level [optional] * @return RecursiveIterator|null The current active sub iterator. */ #[TentativeType] public function getSubIterator(#[LanguageLevelTypeAware(['8.0' => 'int|null'], default: '')] $level): ?RecursiveIterator {} /** * Get inner iterator * @link https://php.net/manual/en/recursiveiteratoriterator.getinneriterator.php * @return RecursiveIterator The current active sub iterator. */ #[TentativeType] public function getInnerIterator(): RecursiveIterator {} /** * Begin Iteration * @link https://php.net/manual/en/recursiveiteratoriterator.beginiteration.php * @return void */ #[TentativeType] public function beginIteration(): void {} /** * End Iteration * @link https://php.net/manual/en/recursiveiteratoriterator.enditeration.php * @return void */ #[TentativeType] public function endIteration(): void {} /** * Has children * @link https://php.net/manual/en/recursiveiteratoriterator.callhaschildren.php * @return bool true if the element has children, otherwise false */ #[TentativeType] public function callHasChildren(): bool {} /** * Get children * @link https://php.net/manual/en/recursiveiteratoriterator.callgetchildren.php * @return RecursiveIterator|null A RecursiveIterator. */ #[TentativeType] public function callGetChildren(): ?RecursiveIterator {} /** * Begin children * @link https://php.net/manual/en/recursiveiteratoriterator.beginchildren.php * @return void */ #[TentativeType] public function beginChildren(): void {} /** * End children * @link https://php.net/manual/en/recursiveiteratoriterator.endchildren.php * @return void */ #[TentativeType] public function endChildren(): void {} /** * Next element * @link https://php.net/manual/en/recursiveiteratoriterator.nextelement.php * @return void */ #[TentativeType] public function nextElement(): void {} /** * Set max depth * @link https://php.net/manual/en/recursiveiteratoriterator.setmaxdepth.php * @param int $maxDepth [optional]

* The maximum allowed depth. Default -1 is used * for any depth. *

* @return void */ #[TentativeType] public function setMaxDepth(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $maxDepth = -1): void {} /** * Get max depth * @link https://php.net/manual/en/recursiveiteratoriterator.getmaxdepth.php * @return int|false The maximum accepted depth, or false if any depth is allowed. */ #[TentativeType] public function getMaxDepth(): int|false {} } /** * Classes implementing OuterIterator can be used to iterate * over iterators. * @link https://php.net/manual/en/class.outeriterator.php */ interface OuterIterator extends Iterator { /** * Returns the inner iterator for the current entry. * @link https://php.net/manual/en/outeriterator.getinneriterator.php * @return Iterator|null The inner iterator for the current entry. */ #[TentativeType] public function getInnerIterator(): ?Iterator; } /** * This iterator wrapper allows the conversion of anything that is * Traversable into an Iterator. * It is important to understand that most classes that do not implement * Iterators have reasons as most likely they do not allow the full * Iterator feature set. If so, techniques should be provided to prevent * misuse, otherwise expect exceptions or fatal errors. * @link https://php.net/manual/en/class.iteratoriterator.php */ class IteratorIterator implements OuterIterator { /** * Create an iterator from anything that is traversable * @link https://php.net/manual/en/iteratoriterator.construct.php * @param Traversable $iterator * @param string|null $class [optional] */ public function __construct(Traversable $iterator, #[PhpStormStubsElementAvailable(from: '8.0')] ?string $class = null) {} /** * Get the inner iterator * @link https://php.net/manual/en/iteratoriterator.getinneriterator.php * @return Iterator|null The inner iterator as passed to IteratorIterator::__construct. */ #[TentativeType] public function getInnerIterator(): ?Iterator {} /** * Rewind to the first element * @link https://php.net/manual/en/iteratoriterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Checks if the iterator is valid * @link https://php.net/manual/en/iteratoriterator.valid.php * @return bool true if the iterator is valid, otherwise false */ #[TentativeType] public function valid(): bool {} /** * Get the key of the current element * @link https://php.net/manual/en/iteratoriterator.key.php * @return mixed The key of the current element. */ #[TentativeType] public function key(): mixed {} /** * Get the current value * @link https://php.net/manual/en/iteratoriterator.current.php * @return mixed The value of the current element. */ #[TentativeType] public function current(): mixed {} /** * Forward to the next element * @link https://php.net/manual/en/iteratoriterator.next.php * @return void */ #[TentativeType] public function next(): void {} } /** * This abstract iterator filters out unwanted values. This class should be extended to * implement custom iterator filters. The FilterIterator::accept * must be implemented in the subclass. * @link https://php.net/manual/en/class.filteriterator.php */ abstract class FilterIterator extends IteratorIterator { /** * Check whether the current element of the iterator is acceptable * @link https://php.net/manual/en/filteriterator.accept.php * @return bool true if the current element is acceptable, otherwise false. */ #[TentativeType] abstract public function accept(): bool; /** * Construct a filterIterator * @link https://php.net/manual/en/filteriterator.construct.php * @param Iterator $iterator */ public function __construct(Iterator $iterator) {} /** * Rewind the iterator * @link https://php.net/manual/en/filteriterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Check whether the current element is valid * @link https://php.net/manual/en/filteriterator.valid.php * @return bool true if the current element is valid, otherwise false */ public function valid() {} /** * Get the current key * @link https://php.net/manual/en/filteriterator.key.php * @return mixed The key of the current element. */ public function key() {} /** * Get the current element value * @link https://php.net/manual/en/filteriterator.current.php * @return mixed The current element value. */ public function current() {} /** * Move the iterator forward * @link https://php.net/manual/en/filteriterator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Get the inner iterator * @link https://php.net/manual/en/filteriterator.getinneriterator.php * @return Iterator The inner iterator. */ public function getInnerIterator() {} } /** * This abstract iterator filters out unwanted values for a RecursiveIterator. * This class should be extended to implement custom filters. * The RecursiveFilterIterator::accept must be implemented in the subclass. * @link https://php.net/manual/en/class.recursivefilteriterator.php */ abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator { /** * Create a RecursiveFilterIterator from a RecursiveIterator * @link https://php.net/manual/en/recursivefilteriterator.construct.php * @param RecursiveIterator $iterator */ public function __construct(RecursiveIterator $iterator) {} /** * Check whether the inner iterator's current element has children * @link https://php.net/manual/en/recursivefilteriterator.haschildren.php * @return bool true if the inner iterator has children, otherwise false */ #[TentativeType] public function hasChildren(): bool {} /** * Return the inner iterator's children contained in a RecursiveFilterIterator * @link https://php.net/manual/en/recursivefilteriterator.getchildren.php * @return RecursiveFilterIterator|null containing the inner iterator's children. */ #[TentativeType] public function getChildren(): ?RecursiveFilterIterator {} } /** * This extended FilterIterator allows a recursive iteration using RecursiveIteratorIterator that only shows those elements which have children. * @link https://php.net/manual/en/class.parentiterator.php */ class ParentIterator extends RecursiveFilterIterator { /** * Determines acceptability * @link https://php.net/manual/en/parentiterator.accept.php * @return bool true if the current element is acceptable, otherwise false. */ #[TentativeType] public function accept(): bool {} /** * Constructs a ParentIterator * @link https://php.net/manual/en/parentiterator.construct.php * @param RecursiveIterator $iterator */ public function __construct(RecursiveIterator $iterator) {} /** * Check whether the inner iterator's current element has children * @link https://php.net/manual/en/recursivefilteriterator.haschildren.php * @return bool true if the inner iterator has children, otherwise false */ public function hasChildren() {} /** * Return the inner iterator's children contained in a RecursiveFilterIterator * @link https://php.net/manual/en/recursivefilteriterator.getchildren.php * @return ParentIterator containing the inner iterator's children. */ public function getChildren() {} } /** * The Seekable iterator. * @link https://php.net/manual/en/class.seekableiterator.php */ interface SeekableIterator extends Iterator { /** * Seeks to a position * @link https://php.net/manual/en/seekableiterator.seek.php * @param int $offset

* The position to seek to. *

* @return void */ #[TentativeType] public function seek(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $offset): void; } /** * The LimitIterator class allows iteration over * a limited subset of items in an Iterator. * @link https://php.net/manual/en/class.limititerator.php */ class LimitIterator extends IteratorIterator { /** * Construct a LimitIterator * @link https://php.net/manual/en/limititerator.construct.php * @param Iterator $iterator The iterator to limit. * @param int $offset [optional] The offset to start at. Must be zero or greater. * @param int $limit [optional] The number of items to iterate. Must be -1 or greater. -1, the default, means no limit. */ public function __construct( Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $offset = 0, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $limit = -1 ) {} /** * Rewind the iterator to the specified starting offset * @link https://php.net/manual/en/limititerator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Check whether the current element is valid * @link https://php.net/manual/en/limititerator.valid.php * @return bool true on success or false on failure. */ #[TentativeType] public function valid(): bool {} /** * Get current key * @link https://php.net/manual/en/limititerator.key.php * @return mixed The key of the current element. */ public function key() {} /** * Get current element * @link https://php.net/manual/en/limititerator.current.php * @return mixed the current element or null if there is none. */ public function current() {} /** * Move the iterator forward * @link https://php.net/manual/en/limititerator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Seek to the given position * @link https://php.net/manual/en/limititerator.seek.php * @param int $offset

* The position to seek to. *

* @return int the offset position after seeking. */ #[TentativeType] public function seek(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $offset): int {} /** * Return the current position * @link https://php.net/manual/en/limititerator.getposition.php * @return int The current position. */ #[TentativeType] public function getPosition(): int {} /** * Get inner iterator * @link https://php.net/manual/en/limititerator.getinneriterator.php * @return Iterator The inner iterator passed to LimitIterator::__construct. */ public function getInnerIterator() {} } /** * This object supports cached iteration over another iterator. * @link https://php.net/manual/en/class.cachingiterator.php */ class CachingIterator extends IteratorIterator implements ArrayAccess, Countable, Stringable { /** * String conversion flag (mutually exclusive): Uses the current element for the iterator's string conversion. * This converts the current element to a string only once, regardless of whether it is needed or not. */ public const CALL_TOSTRING = 1; /** * String conversion flag (mutually exclusive). Uses the current key for the iterator's string conversion. */ public const TOSTRING_USE_KEY = 2; /** * String conversion flag (mutually exclusive). Uses the current element for the iterator's string conversion. * This converts the current element to a string only when (and every time) it is needed. */ public const TOSTRING_USE_CURRENT = 4; /** * String conversion flag (mutually exclusive). Forwards the string conversion to the inner iterator. * This converts the inner iterator to a string only once, regardless of whether it is needed or not. */ public const TOSTRING_USE_INNER = 8; /** * Ignore exceptions thrown in accessing children. Only used with {@see RecursiveCachingIterator}. */ public const CATCH_GET_CHILD = 16; /** * Cache all read data. This is needed to use {@see CachingIterator::getCache}, and ArrayAccess and Countable methods. */ public const FULL_CACHE = 256; /** * Constructs a new CachingIterator. * @link https://php.net/manual/en/cachingiterator.construct.php * @param Iterator $iterator The iterator to cache. * @param int $flags [optional] A bitmask of flags. See CachingIterator class constants for details. */ public function __construct(Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = self::CALL_TOSTRING) {} /** * Rewind the iterator * @link https://php.net/manual/en/cachingiterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Check whether the current element is valid * @link https://php.net/manual/en/cachingiterator.valid.php * @return bool true on success or false on failure. */ #[TentativeType] public function valid(): bool {} /** * Return the key for the current element * @link https://php.net/manual/en/cachingiterator.key.php * @return mixed The key of the current element. */ public function key() {} /** * Return the current element * @link https://php.net/manual/en/cachingiterator.current.php * @return mixed */ public function current() {} /** * Move the iterator forward * @link https://php.net/manual/en/cachingiterator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Check whether the inner iterator has a valid next element * @link https://php.net/manual/en/cachingiterator.hasnext.php * @return bool true on success or false on failure. */ #[TentativeType] public function hasNext(): bool {} /** * Return the string representation of the current iteration based on the flag being used. * @link https://php.net/manual/en/cachingiterator.tostring.php * @return string The string representation of the current iteration based on the flag being used. */ #[TentativeType] public function __toString(): string {} /** * Returns the inner iterator * @link https://php.net/manual/en/cachingiterator.getinneriterator.php * @return Iterator an object implementing the Iterator interface. */ public function getInnerIterator() {} /** * Get flags used * @link https://php.net/manual/en/cachingiterator.getflags.php * @return int Bitmask of the flags */ #[TentativeType] public function getFlags(): int {} /** * The setFlags purpose * @link https://php.net/manual/en/cachingiterator.setflags.php * @param int $flags Bitmask of the flags to set. * @return void */ #[TentativeType] public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): void {} /** * Internal cache array index to retrieve. * @link https://php.net/manual/en/cachingiterator.offsetget.php * @param string $key The index of the element to retrieve. * @return mixed * @throws BadMethodCallException when the {@see CachingIterator::FULL_CACHE} flag is not being used. */ #[TentativeType] public function offsetGet($key): mixed {} /** * Set an element on the internal cache array. * @link https://php.net/manual/en/cachingiterator.offsetset.php * @param string $key The index of the element to be set. * @param string $value The new value for the index. * @return void * @throws BadMethodCallException when the {@see CachingIterator::FULL_CACHE} flag is not being used. */ #[TentativeType] public function offsetSet($key, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Remove an element from the internal cache array. * @link https://php.net/manual/en/cachingiterator.offsetunset.php * @param string $key The index of the element to be unset. * @return void * @throws BadMethodCallException when the {@see CachingIterator::FULL_CACHE} flag is not being used. */ #[TentativeType] public function offsetUnset($key): void {} /** * Return whether an element at the index exists on the internal cache array. * @link https://php.net/manual/en/cachingiterator.offsetexists.php * @param string $key The index being checked. * @return bool true if an entry referenced by the offset exists, false otherwise. * @throws BadMethodCallException when the {@see CachingIterator::FULL_CACHE} flag is not being used. */ #[TentativeType] public function offsetExists($key): bool {} /** * Retrieve the contents of the cache * @link https://php.net/manual/en/cachingiterator.getcache.php * @return array An array containing the cache items. * @throws BadMethodCallException when the {@see CachingIterator::FULL_CACHE} flag is not being used. */ #[TentativeType] public function getCache(): array {} /** * The number of elements in the iterator * @link https://php.net/manual/en/cachingiterator.count.php * @return int The count of the elements iterated over. * @throws BadMethodCallException when the {@see CachingIterator::FULL_CACHE} flag is not being used. * @since 5.2.2 */ #[TentativeType] public function count(): int {} } /** * ... * @link https://php.net/manual/en/class.recursivecachingiterator.php */ class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator { /** * Constructs a new RecursiveCachingIterator. * @link https://php.net/manual/en/recursivecachingiterator.construct.php * @param Iterator $iterator The iterator to cache. * @param int $flags [optional] A bitmask of flags. See CachingIterator class constants for details. */ public function __construct(Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = CachingIterator::CALL_TOSTRING) {} /** * Check whether the current element of the inner iterator has children * @link https://php.net/manual/en/recursivecachingiterator.haschildren.php * @return bool true if the inner iterator has children, otherwise false */ #[TentativeType] public function hasChildren(): bool {} /** * Return the inner iterator's children as a RecursiveCachingIterator * @link https://php.net/manual/en/recursivecachingiterator.getchildren.php * @return RecursiveCachingIterator|null The inner iterator's children, as a RecursiveCachingIterator. */ #[TentativeType] public function getChildren(): ?RecursiveCachingIterator {} } /** * This iterator cannot be rewinded. * @link https://php.net/manual/en/class.norewinditerator.php */ class NoRewindIterator extends IteratorIterator { /** * Construct a NoRewindIterator * @link https://php.net/manual/en/norewinditerator.construct.php * @param Iterator $iterator */ public function __construct(Iterator $iterator) {} /** * Prevents the rewind operation on the inner iterator. * @link https://php.net/manual/en/norewinditerator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Validates the iterator * @link https://php.net/manual/en/norewinditerator.valid.php * @return bool true on success or false on failure. */ #[TentativeType] public function valid(): bool {} /** * Get the current key * @link https://php.net/manual/en/norewinditerator.key.php * @return mixed The key of the current element. */ #[TentativeType] public function key(): mixed {} /** * Get the current value * @link https://php.net/manual/en/norewinditerator.current.php * @return mixed The current value. */ #[TentativeType] public function current(): mixed {} /** * Forward to the next element * @link https://php.net/manual/en/norewinditerator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Get the inner iterator * @link https://php.net/manual/en/norewinditerator.getinneriterator.php * @return Iterator The inner iterator, as passed to NoRewindIterator::__construct. */ public function getInnerIterator() {} } /** * An Iterator that iterates over several iterators one after the other. * @link https://php.net/manual/en/class.appenditerator.php */ class AppendIterator extends IteratorIterator { /** * Constructs an AppendIterator * @link https://php.net/manual/en/appenditerator.construct.php */ public function __construct() {} /** * Appends an iterator * @link https://php.net/manual/en/appenditerator.append.php * @param Iterator $iterator

* The iterator to append. *

* @return void */ #[TentativeType] public function append(Iterator $iterator): void {} /** * Rewinds the Iterator * @link https://php.net/manual/en/appenditerator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Checks validity of the current element * @link https://php.net/manual/en/appenditerator.valid.php * @return bool true on success or false on failure. */ #[TentativeType] public function valid(): bool {} /** * Gets the current key * @link https://php.net/manual/en/appenditerator.key.php * @return mixed The key of the current element. */ public function key() {} /** * Gets the current value * @link https://php.net/manual/en/appenditerator.current.php * @return mixed The current value if it is valid or null otherwise. */ #[TentativeType] public function current(): mixed {} /** * Moves to the next element * @link https://php.net/manual/en/appenditerator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Gets an inner iterator * @link https://php.net/manual/en/appenditerator.getinneriterator.php * @return Iterator the current inner Iterator. */ public function getInnerIterator() {} /** * Gets an index of iterators * @link https://php.net/manual/en/appenditerator.getiteratorindex.php * @return int|null The index of iterators. */ #[TentativeType] public function getIteratorIndex(): ?int {} /** * The getArrayIterator method * @link https://php.net/manual/en/appenditerator.getarrayiterator.php * @return ArrayIterator containing the appended iterators. */ #[TentativeType] public function getArrayIterator(): ArrayIterator {} } /** * The InfiniteIterator allows one to * infinitely iterate over an iterator without having to manually * rewind the iterator upon reaching its end. * @link https://php.net/manual/en/class.infiniteiterator.php */ class InfiniteIterator extends IteratorIterator { /** * Constructs an InfiniteIterator * @link https://php.net/manual/en/infiniteiterator.construct.php * @param Iterator $iterator */ public function __construct(Iterator $iterator) {} /** * Moves the inner Iterator forward or rewinds it * @link https://php.net/manual/en/infiniteiterator.next.php * @return void */ #[TentativeType] public function next(): void {} } /** * This iterator can be used to filter another iterator based on a regular expression. * @link https://php.net/manual/en/class.regexiterator.php */ class RegexIterator extends FilterIterator { /** * Return all matches for the current entry @see preg_match_all */ public const ALL_MATCHES = 2; /** * Return the first match for the current entry @see preg_match */ public const GET_MATCH = 1; /** * Only execute match (filter) for the current entry @see preg_match */ public const MATCH = 0; /** * Replace the current entry (Not fully implemented yet) @see preg_replace */ public const REPLACE = 4; /** * Returns the split values for the current entry @see preg_split */ public const SPLIT = 3; /** * Special flag: Match the entry key instead of the entry value. */ public const USE_KEY = 1; public const INVERT_MATCH = 2; #[LanguageLevelTypeAware(['8.1' => 'string|null'], default: '')] public $replacement; /** * Create a new RegexIterator * @link https://php.net/manual/en/regexiterator.construct.php * @param Iterator $iterator The iterator to apply this regex filter to. * @param string $pattern The regular expression to match. * @param int $mode [optional] Operation mode, see RegexIterator::setMode() for a list of modes. * @param int $flags [optional] Special flags, see RegexIterator::setFlags() for a list of available flags. * @param int $pregFlags [optional] The regular expression flags. These flags depend on the operation mode parameter */ public function __construct( Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $pattern, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = self::MATCH, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $pregFlags = 0 ) {} /** * Get accept status * @link https://php.net/manual/en/regexiterator.accept.php * @return bool true if a match, false otherwise. */ #[TentativeType] public function accept(): bool {} /** * Returns operation mode. * @link https://php.net/manual/en/regexiterator.getmode.php * @return int the operation mode. */ #[TentativeType] public function getMode(): int {} /** * Sets the operation mode. * @link https://php.net/manual/en/regexiterator.setmode.php * @param int $mode

* The operation mode. *

*

* The available modes are listed below. The actual * meanings of these modes are described in the * predefined constants. * * RegexIterator modes * * * * * * * * * * * * * * * * * * * * * * * * *
valueconstant
0 * RegexIterator::MATCH *
1 * RegexIterator::GET_MATCH *
2 * RegexIterator::ALL_MATCHES *
3 * RegexIterator::SPLIT *
4 * RegexIterator::REPLACE *
*

* @return void */ #[TentativeType] public function setMode(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode): void {} /** * Get flags * @link https://php.net/manual/en/regexiterator.getflags.php * @return int the set flags. */ #[TentativeType] public function getFlags(): int {} /** * Sets the flags. * @link https://php.net/manual/en/regexiterator.setflags.php * @param int $flags

* The flags to set, a bitmask of class constants. *

*

* The available flags are listed below. The actual * meanings of these flags are described in the * predefined constants. * * RegexIterator flags * * * * * * * * *
valueconstant
1 * RegexIterator::USE_KEY *
*

* @return void */ #[TentativeType] public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): void {} /** * Returns current regular expression * @link https://secure.php.net/manual/en/regexiterator.getregex.php * @return string * @since 5.4 */ #[TentativeType] public function getRegex(): string {} /** * Returns the regular expression flags. * @link https://php.net/manual/en/regexiterator.getpregflags.php * @return int a bitmask of the regular expression flags. */ #[TentativeType] public function getPregFlags(): int {} /** * Sets the regular expression flags. * @link https://php.net/manual/en/regexiterator.setpregflags.php * @param int $pregFlags

* The regular expression flags. See RegexIterator::__construct * for an overview of available flags. *

* @return void */ #[TentativeType] public function setPregFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $pregFlags): void {} } /** * This recursive iterator can filter another recursive iterator via a regular expression. * @link https://php.net/manual/en/class.recursiveregexiterator.php */ class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator { /** * Creates a new RecursiveRegexIterator. * @link https://php.net/manual/en/recursiveregexiterator.construct.php * @param RecursiveIterator $iterator The iterator to apply this regex filter to. * @param string $pattern The regular expression to match. * @param int $mode [optional] Operation mode, see RegexIterator::setMode() for a list of modes. * @param int $flags [optional] Special flags, see RegexIterator::setFlags() for a list of available flags. * @param int $pregFlags [optional] The regular expression flags. These flags depend on the operation mode parameter */ public function __construct( RecursiveIterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $pattern, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = RegexIterator::MATCH, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $pregFlags = 0 ) {} /** * Returns whether an iterator can be obtained for the current entry. * @link https://php.net/manual/en/recursiveregexiterator.haschildren.php * @return bool true if an iterator can be obtained for the current entry, otherwise returns false. */ #[TentativeType] public function hasChildren(): bool {} /** * Returns an iterator for the current entry. * @link https://php.net/manual/en/recursiveregexiterator.getchildren.php * @return RecursiveRegexIterator An iterator for the current entry, if it can be iterated over by the inner iterator. */ #[TentativeType] public function getChildren(): RecursiveRegexIterator {} } /** * Allows iterating over a RecursiveIterator to generate an ASCII graphic tree. * @link https://php.net/manual/en/class.recursivetreeiterator.php */ class RecursiveTreeIterator extends RecursiveIteratorIterator { public const BYPASS_CURRENT = 4; public const BYPASS_KEY = 8; public const PREFIX_LEFT = 0; public const PREFIX_MID_HAS_NEXT = 1; public const PREFIX_MID_LAST = 2; public const PREFIX_END_HAS_NEXT = 3; public const PREFIX_END_LAST = 4; public const PREFIX_RIGHT = 5; /** * Construct a RecursiveTreeIterator * @link https://php.net/manual/en/recursivetreeiterator.construct.php * @param RecursiveIterator|IteratorAggregate $iterator * @param int $flags [optional] Flags to control the behavior of the RecursiveTreeIterator object. * @param int $cachingIteratorFlags [optional] Flags to affect the behavior of the {@see RecursiveCachingIterator} used internally. * @param int $mode [optional] Flags to affect the behavior of the {@see RecursiveIteratorIterator} used internally. */ public function __construct( $iterator, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = self::BYPASS_KEY, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $cachingIteratorFlags = CachingIterator::CATCH_GET_CHILD, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode = RecursiveIteratorIterator::SELF_FIRST ) {} /** * Rewind iterator * @link https://php.net/manual/en/recursivetreeiterator.rewind.php * @return void */ public function rewind() {} /** * Check validity * @link https://php.net/manual/en/recursivetreeiterator.valid.php * @return bool true if the current position is valid, otherwise false */ public function valid() {} /** * Get the key of the current element * @link https://php.net/manual/en/recursivetreeiterator.key.php * @return string the current key prefixed and postfixed. */ #[TentativeType] public function key(): mixed {} /** * Get current element * @link https://php.net/manual/en/recursivetreeiterator.current.php * @return string the current element prefixed and postfixed. */ #[TentativeType] public function current(): mixed {} /** * Move to next element * @link https://php.net/manual/en/recursivetreeiterator.next.php * @return void */ public function next() {} /** * Begin iteration * @link https://php.net/manual/en/recursivetreeiterator.beginiteration.php * @return RecursiveIterator A RecursiveIterator. */ public function beginIteration() {} /** * End iteration * @link https://php.net/manual/en/recursivetreeiterator.enditeration.php * @return void */ public function endIteration() {} /** * Has children * @link https://php.net/manual/en/recursivetreeiterator.callhaschildren.php * @return bool true if there are children, otherwise false */ public function callHasChildren() {} /** * Get children * @link https://php.net/manual/en/recursivetreeiterator.callgetchildren.php * @return RecursiveIterator A RecursiveIterator. */ public function callGetChildren() {} /** * Begin children * @link https://php.net/manual/en/recursivetreeiterator.beginchildren.php * @return void */ public function beginChildren() {} /** * End children * @link https://php.net/manual/en/recursivetreeiterator.endchildren.php * @return void */ public function endChildren() {} /** * Next element * @link https://php.net/manual/en/recursivetreeiterator.nextelement.php * @return void */ public function nextElement() {} /** * Get the prefix * @link https://php.net/manual/en/recursivetreeiterator.getprefix.php * @return string the string to place in front of current element */ #[TentativeType] public function getPrefix(): string {} /** * @param string $postfix */ #[TentativeType] public function setPostfix(#[PhpStormStubsElementAvailable(from: '7.3')] string $postfix): void {} /** * Set a part of the prefix * @link https://php.net/manual/en/recursivetreeiterator.setprefixpart.php * @param int $part

* One of the RecursiveTreeIterator::PREFIX_* constants. *

* @param string $value

* The value to assign to the part of the prefix specified in part. *

* @return void */ #[TentativeType] public function setPrefixPart( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $part, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $value ): void {} /** * Get current entry * @link https://php.net/manual/en/recursivetreeiterator.getentry.php * @return string the part of the tree built for the current element. */ #[TentativeType] public function getEntry(): string {} /** * Get the postfix * @link https://php.net/manual/en/recursivetreeiterator.getpostfix.php * @return string to place after the current element. */ #[TentativeType] public function getPostfix(): string {} } /** * This class allows objects to work as arrays. * @link https://php.net/manual/en/class.arrayobject.php * @template TKey * @template TValue * @template-implements IteratorAggregate * @template-implements ArrayAccess */ class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable { /** * Properties of the object have their normal functionality when accessed as list (var_dump, foreach, etc.). */ public const STD_PROP_LIST = 1; /** * Entries can be accessed as properties (read and write). */ public const ARRAY_AS_PROPS = 2; /** * Construct a new array object * @link https://php.net/manual/en/arrayobject.construct.php * @param array|object $array The input parameter accepts an array or an Object. * @param int $flags Flags to control the behaviour of the ArrayObject object. * @param class-string $iteratorClass Specify the class that will be used for iteration of the ArrayObject object. ArrayIterator is the default class used. */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'object|array'], default: '')] $array = [], #[PhpStormStubsElementAvailable(from: '5.3')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0, #[PhpStormStubsElementAvailable(from: '5.3')] #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $iteratorClass = "ArrayIterator" ) {} /** * Returns whether the requested index exists * @link https://php.net/manual/en/arrayobject.offsetexists.php * @param TKey $key

* The index being checked. *

* @return bool true if the requested index exists, otherwise false */ #[TentativeType] public function offsetExists(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key): bool {} /** * Returns the value at the specified index * @link https://php.net/manual/en/arrayobject.offsetget.php * @param TKey $key

* The index with the value. *

* @return TValue|null The value at the specified index or null. */ #[TentativeType] public function offsetGet(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key): mixed {} /** * Sets the value at the specified index to newval * @link https://php.net/manual/en/arrayobject.offsetset.php * @param TKey $key

* The index being set. *

* @param TValue $value

* The new value for the index. *

* @return void */ #[TentativeType] public function offsetSet( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value ): void {} /** * Unsets the value at the specified index * @link https://php.net/manual/en/arrayobject.offsetunset.php * @param TKey $key

* The index being unset. *

* @return void */ #[TentativeType] public function offsetUnset(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key): void {} /** * Appends the value * @link https://php.net/manual/en/arrayobject.append.php * @param TValue $value

* The value being appended. *

* @return void */ #[TentativeType] public function append(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Creates a copy of the ArrayObject. * @link https://php.net/manual/en/arrayobject.getarraycopy.php * @return array a copy of the array. When the ArrayObject refers to an object * an array of the public properties of that object will be returned. */ #[TentativeType] public function getArrayCopy(): array {} /** * Get the number of public properties in the ArrayObject * When the ArrayObject is constructed from an array all properties are public. * @link https://php.net/manual/en/arrayobject.count.php * @return int The number of public properties in the ArrayObject. */ #[TentativeType] public function count(): int {} /** * Gets the behavior flags. * @link https://php.net/manual/en/arrayobject.getflags.php * @return int the behavior flags of the ArrayObject. */ #[TentativeType] public function getFlags(): int {} /** * Sets the behavior flags. * @link https://php.net/manual/en/arrayobject.setflags.php * @param int $flags

* The new ArrayObject behavior. * It takes on either a bitmask, or named constants. Using named * constants is strongly encouraged to ensure compatibility for future * versions. *

*

* The available behavior flags are listed below. The actual * meanings of these flags are described in the * predefined constants. * * ArrayObject behavior flags * * * * * * * * * * * * *
valueconstant
1 * ArrayObject::STD_PROP_LIST *
2 * ArrayObject::ARRAY_AS_PROPS *
*

* @return void */ #[TentativeType] public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): void {} /** * Sort the entries by value * @link https://php.net/manual/en/arrayobject.asort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function asort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR) {} /** * Sort the entries by key * @link https://php.net/manual/en/arrayobject.ksort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function ksort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR) {} /** * Sort the entries with a user-defined comparison function and maintain key association * @link https://php.net/manual/en/arrayobject.uasort.php * @param callable(TValue, TValue):int $callback

* Function cmp_function should accept two * parameters which will be filled by pairs of entries. * The comparison function must return an integer less than, equal * to, or greater than zero if the first argument is considered to * be respectively less than, equal to, or greater than the * second. *

*/ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function uasort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback) {} /** * Sort the entries by keys using a user-defined comparison function * @link https://php.net/manual/en/arrayobject.uksort.php * @param callable(TValue, TValue):int $callback

* The callback comparison function. *

*

* Function cmp_function should accept two * parameters which will be filled by pairs of entry keys. * The comparison function must return an integer less than, equal * to, or greater than zero if the first argument is considered to * be respectively less than, equal to, or greater than the * second. *

*/ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function uksort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback) {} /** * Sort entries using a "natural order" algorithm * @link https://php.net/manual/en/arrayobject.natsort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function natsort() {} /** * Sort an array using a case insensitive "natural order" algorithm * @link https://php.net/manual/en/arrayobject.natcasesort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function natcasesort() {} /** * Unserialize an ArrayObject * @link https://php.net/manual/en/arrayobject.unserialize.php * @param string $data

* The serialized ArrayObject. *

* @return void */ #[TentativeType] public function unserialize(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data): void {} /** * Serialize an ArrayObject * @link https://php.net/manual/en/arrayobject.serialize.php * @return string The serialized representation of the ArrayObject. */ #[TentativeType] public function serialize(): string {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} /** * @return array * @since 7.4 */ #[TentativeType] public function __serialize(): array {} /** * @param array $data * @since 7.4 */ #[TentativeType] public function __unserialize(array $data): void {} /** * Create a new iterator from an ArrayObject instance * @link https://php.net/manual/en/arrayobject.getiterator.php * @return ArrayIterator An iterator from an ArrayObject. */ #[TentativeType] public function getIterator(): Iterator {} /** * Exchange the array for another one. * @link https://php.net/manual/en/arrayobject.exchangearray.php * @param mixed $array

* The new array or object to exchange with the current array. *

* @return array the old array. */ #[TentativeType] public function exchangeArray(#[LanguageLevelTypeAware(['8.0' => 'object|array'], default: '')] $array): array {} /** * Sets the iterator classname for the ArrayObject. * @link https://php.net/manual/en/arrayobject.setiteratorclass.php * @param class-string $iteratorClass

* The classname of the array iterator to use when iterating over this object. *

* @return void */ #[TentativeType] public function setIteratorClass(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $iteratorClass): void {} /** * Gets the iterator classname for the ArrayObject. * @link https://php.net/manual/en/arrayobject.getiteratorclass.php * @return class-string the iterator class name that is used to iterate over this object. */ #[TentativeType] public function getIteratorClass(): string {} } /** * This iterator allows to unset and modify values and keys while iterating * over Arrays and Objects. * @link https://php.net/manual/en/class.arrayiterator.php */ class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable { public const STD_PROP_LIST = 1; public const ARRAY_AS_PROPS = 2; /** * Construct an ArrayIterator * @link https://php.net/manual/en/arrayiterator.construct.php * @param array $array The array or object to be iterated on. * @param int $flags Flags to control the behaviour of the ArrayObject object. * @see ArrayObject::setFlags() */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'object|array'], default: '')] $array = [], #[PhpStormStubsElementAvailable(from: '7.0')] #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = 0, #[PhpStormStubsElementAvailable(from: '7.0', to: '7.1')] $iterator_class = null ) {} /** * Check if offset exists * @link https://php.net/manual/en/arrayiterator.offsetexists.php * @param string $key

* The offset being checked. *

* @return bool true if the offset exists, otherwise false */ #[TentativeType] public function offsetExists(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key): bool {} /** * Get value for an offset * @link https://php.net/manual/en/arrayiterator.offsetget.php * @param string $key

* The offset to get the value from. *

* @return mixed The value at offset index. */ #[TentativeType] public function offsetGet(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key): mixed {} /** * Set value for an offset * @link https://php.net/manual/en/arrayiterator.offsetset.php * @param string $key

* The index to set for. *

* @param string $value

* The new value to store at the index. *

* @return void */ #[TentativeType] public function offsetSet( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value ): void {} /** * Unset value for an offset * @link https://php.net/manual/en/arrayiterator.offsetunset.php * @param string $key

* The offset to unset. *

* @return void */ #[TentativeType] public function offsetUnset(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $key): void {} /** * Append an element * @link https://php.net/manual/en/arrayiterator.append.php * @param mixed $value

* The value to append. *

* @return void */ #[TentativeType] public function append(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Get array copy * @link https://php.net/manual/en/arrayiterator.getarraycopy.php * @return array A copy of the array, or array of public properties * if ArrayIterator refers to an object. */ #[TentativeType] public function getArrayCopy(): array {} /** * Count elements * @link https://php.net/manual/en/arrayiterator.count.php * @return int<0,max> The number of elements or public properties in the associated * array or object, respectively. */ #[TentativeType] public function count(): int {} /** * Get flags * @link https://php.net/manual/en/arrayiterator.getflags.php * @return int The current flags. */ #[TentativeType] public function getFlags(): int {} /** * Set behaviour flags * @link https://php.net/manual/en/arrayiterator.setflags.php * @param string $flags

* A bitmask as follows: * 0 = Properties of the object have their normal functionality * when accessed as list (var_dump, foreach, etc.). * 1 = Array indices can be accessed as properties in read/write. *

* @return void */ #[TentativeType] public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): void {} /** * Sort array by values * @link https://php.net/manual/en/arrayiterator.asort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function asort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR) {} /** * Sort array by keys * @link https://php.net/manual/en/arrayiterator.ksort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function ksort(#[PhpStormStubsElementAvailable(from: '8.0')] int $flags = SORT_REGULAR) {} /** * User defined sort * @link https://php.net/manual/en/arrayiterator.uasort.php * @param callable $callback

* The compare function used for the sort. *

*/ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function uasort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback) {} /** * User defined sort * @link https://php.net/manual/en/arrayiterator.uksort.php * @param callable $callback

* The compare function used for the sort. *

*/ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function uksort(#[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback) {} /** * Sort an array naturally * @link https://php.net/manual/en/arrayiterator.natsort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function natsort() {} /** * Sort an array naturally, case insensitive * @link https://php.net/manual/en/arrayiterator.natcasesort.php */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'true'], default: 'bool')] public function natcasesort() {} /** * Unserialize * @link https://php.net/manual/en/arrayiterator.unserialize.php * @param string $data

* The serialized ArrayIterator object to be unserialized. *

* @return void */ #[TentativeType] public function unserialize(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data): void {} /** * Serialize * @link https://php.net/manual/en/arrayiterator.serialize.php * @return string The serialized ArrayIterator. */ #[TentativeType] public function serialize(): string {} /** * Rewind array back to the start * @link https://php.net/manual/en/arrayiterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Return current array entry * @link https://php.net/manual/en/arrayiterator.current.php * @return mixed The current array entry. */ #[TentativeType] public function current(): mixed {} /** * Return current array key * @link https://php.net/manual/en/arrayiterator.key.php * @return string|int|null The key of the current element. */ #[TentativeType] public function key(): string|int|null {} /** * Move to next entry * @link https://php.net/manual/en/arrayiterator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Check whether array contains more entries * @link https://php.net/manual/en/arrayiterator.valid.php * @return bool */ #[TentativeType] public function valid(): bool {} /** * Seek to position * @link https://php.net/manual/en/arrayiterator.seek.php * @param int $offset

* The position to seek to. *

* @return void */ #[TentativeType] public function seek(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $offset): void {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} /** * @return array * @since 7.4 */ #[TentativeType] public function __serialize(): array {} /** * @param array $data * @since 7.4 */ #[TentativeType] public function __unserialize(array $data): void {} } /** * This iterator allows to unset and modify values and keys while iterating over Arrays and Objects * in the same way as the ArrayIterator. Additionally it is possible to iterate * over the current iterator entry. * @link https://php.net/manual/en/class.recursivearrayiterator.php */ class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator { public const CHILD_ARRAYS_ONLY = 4; /** * Returns whether current entry is an array or an object. * @link https://php.net/manual/en/recursivearrayiterator.haschildren.php * @return bool true if the current entry is an array or an object, * otherwise false is returned. */ #[TentativeType] public function hasChildren(): bool {} /** * Returns an iterator for the current entry if it is an array or an object. * @link https://php.net/manual/en/recursivearrayiterator.getchildren.php * @return RecursiveArrayIterator|null An iterator for the current entry, if it is an array or object. */ #[TentativeType] public function getChildren(): ?RecursiveArrayIterator {} } *

* @param string|null $file_extensions [optional]

* By default it checks all include paths to * contain filenames built up by the lowercase class name appended by the * filename extensions .inc and .php. *

* @return void * @since 5.1.2 */ function spl_autoload(string $class, ?string $file_extensions): void {} /** * Register and return default file extensions for spl_autoload * @link https://php.net/manual/en/function.spl-autoload-extensions.php * @param string|null $file_extensions [optional]

* When calling without an argument, it simply returns the current list * of extensions each separated by comma. To modify the list of file * extensions, simply invoke the functions with the new list of file * extensions to use in a single string with each extensions separated * by comma. *

* @return string A comma delimited list of default file extensions for * spl_autoload. * @since 5.1.2 */ function spl_autoload_extensions(?string $file_extensions): string {} /** * Register given function as __autoload() implementation * @link https://php.net/manual/en/function.spl-autoload-register.php * @param callable|null $callback [optional]

* The autoload function being registered. * If no parameter is provided, then the default implementation of * spl_autoload will be registered. *

* @param bool $throw This parameter specifies whether spl_autoload_register() should throw exceptions when the * autoload_function cannot be registered. Ignored since since 8.0. * @param bool $prepend If true, spl_autoload_register() will prepend the autoloader on the autoload stack instead of * appending it. * @return bool true on success or false on failure. * @throws TypeError Since 8.0. * @since 5.1.2 */ function spl_autoload_register(?callable $callback, bool $throw = true, bool $prepend = false): bool {} /** * Unregister given function as __autoload() implementation * @link https://php.net/manual/en/function.spl-autoload-unregister.php * @param callable $callback

* The autoload function being unregistered. *

* @return bool true on success or false on failure. * @since 5.1.2 */ function spl_autoload_unregister(callable $callback): bool {} /** * Return all registered __autoload() functions * @link https://php.net/manual/en/function.spl-autoload-functions.php * @return array|false An array of all registered __autoload functions. * If the autoload stack is not activated then the return value is false. * If no function is registered the return value will be an empty array. * @since 5.1.2 */ #[LanguageLevelTypeAware(["8.0" => "array"], default: "array|false")] function spl_autoload_functions() {} /** * Try all registered __autoload() functions to load the requested class * @link https://php.net/manual/en/function.spl-autoload-call.php * @param string $class

* The class name being searched. *

* @return void * @since 5.1.2 */ function spl_autoload_call(string $class): void {} /** * Return the parent classes of the given class * @link https://php.net/manual/en/function.class-parents.php * @param object|string $object_or_class

* An object (class instance) or a string (class name). *

* @param bool $autoload [optional]

* Whether to allow this function to load the class automatically through * the __autoload magic * method. *

* @return string[]|false An array on success, or false on error. */ #[Pure] function class_parents($object_or_class, bool $autoload = true): array|false {} /** * Return the interfaces which are implemented by the given class * @link https://php.net/manual/en/function.class-implements.php * @param object|string $object_or_class

* An object (class instance) or a string (class name). *

* @param bool $autoload [optional]

* Whether to allow this function to load the class automatically through * the __autoload magic * method. *

* @return string[]|false An array on success, or false on error. */ #[Pure] function class_implements($object_or_class, bool $autoload = true): array|false {} /** * Return hash id for given object * @link https://php.net/manual/en/function.spl-object-hash.php * @param object $object * @return string A string that is unique for each object and is always the same for * the same object. */ #[Pure] function spl_object_hash(object $object): string {} /** * Copy the iterator into an array * @link https://php.net/manual/en/function.iterator-to-array.php * @param Traversable $iterator

* The iterator being copied. *

* @param bool $preserve_keys [optional]

* Whether to use the iterator element keys as index. *

* @return array An array containing the elements of the iterator. */ function iterator_to_array(#[LanguageLevelTypeAware(['8.2' => 'Traversable|array'], default: 'Traversable')] $iterator, bool $preserve_keys = true): array {} /** * Count the elements in an iterator * @link https://php.net/manual/en/function.iterator-count.php * @param Traversable $iterator

* The iterator being counted. *

* @return int The number of elements in iterator. */ #[Pure] function iterator_count(#[LanguageLevelTypeAware(['8.2' => 'Traversable|array'], default: 'Traversable')] $iterator): int {} /** * Call a function for every element in an iterator * @link https://php.net/manual/en/function.iterator-apply.php * @param Traversable $iterator

* The class to iterate over. *

* @param callable $callback

* The callback function to call on every element. * The function must return true in order to * continue iterating over the iterator. *

* @param array|null $args [optional]

* Arguments to pass to the callback function. *

* @return int the iteration count. */ function iterator_apply(Traversable $iterator, callable $callback, ?array $args): int {} // End of SPL v.0.2 /** * Return the traits used by the given class * @param object|string $object_or_class An object (class instance) or a string (class name). * @param bool $autoload Whether to allow this function to load the class automatically through the __autoload() magic method. * @return string[]|false An array on success, or false on error. * @link https://php.net/manual/en/function.class-uses.php * @see class_parents() * @see get_declared_traits() * @since 5.4 */ function class_uses($object_or_class, bool $autoload = true): array|false {} /** * return the integer object handle for given object * @param object $object * @return int * @since 7.2 */ function spl_object_id(object $object): int {} 'string'], default: '')] $filename) {} /** * Gets the path without filename * @link https://php.net/manual/en/splfileinfo.getpath.php * @return string the path to the file. * @since 5.1.2 */ #[TentativeType] public function getPath(): string {} /** * Gets the filename * @link https://php.net/manual/en/splfileinfo.getfilename.php * @return string The filename. * @since 5.1.2 */ #[TentativeType] public function getFilename(): string {} /** * Gets the file extension * @link https://php.net/manual/en/splfileinfo.getextension.php * @return string a string containing the file extension, or an * empty string if the file has no extension. * @since 5.3.6 */ #[TentativeType] public function getExtension(): string {} /** * Gets the base name of the file * @link https://php.net/manual/en/splfileinfo.getbasename.php * @param string $suffix [optional]

* Optional suffix to omit from the base name returned. *

* @return string the base name without path information. * @since 5.2.2 */ #[TentativeType] public function getBasename(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $suffix = ''): string {} /** * Gets the path to the file * @link https://php.net/manual/en/splfileinfo.getpathname.php * @return string The path to the file. * @since 5.1.2 */ #[TentativeType] public function getPathname(): string {} /** * Gets file permissions * @link https://php.net/manual/en/splfileinfo.getperms.php * @return int|false The file permissions on success, or FALSE on failure. * @since 5.1.2 */ #[TentativeType] public function getPerms(): int|false {} /** * Gets the inode for the file * @link https://php.net/manual/en/splfileinfo.getinode.php * @return int|false The inode number for the filesystem object on success, or FALSE on failure. * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getInode(): int|false {} /** * Gets file size * @link https://php.net/manual/en/splfileinfo.getsize.php * @return int|false The filesize in bytes on success, or FALSE on failure. * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getSize(): int|false {} /** * Gets the owner of the file * @link https://php.net/manual/en/splfileinfo.getowner.php * @return int|false The owner id in numerical format on success, or FALSE on failure. * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getOwner(): int|false {} /** * Gets the file group * @link https://php.net/manual/en/splfileinfo.getgroup.php * @return int|false The group id in numerical format on success, or FALSE on failure. * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getGroup(): int|false {} /** * Gets last access time of the file * @link https://php.net/manual/en/splfileinfo.getatime.php * @return int|false The time the file was last accessed on success, or FALSE on failure. * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getATime(): int|false {} /** * Gets the last modified time * @link https://php.net/manual/en/splfileinfo.getmtime.php * @return int|false The last modified time for the file, in a Unix timestamp on success, or FALSE on failure. * @since 5.1.2 */ #[TentativeType] public function getMTime(): int|false {} /** * Gets the inode change time * @link https://php.net/manual/en/splfileinfo.getctime.php * @return int|false The last change time, in a Unix timestamp on success, or FALSE on failure. * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getCTime(): int|false {} /** * Gets file type * @link https://php.net/manual/en/splfileinfo.gettype.php * @return string|false A string representing the type of the entry. May be one of file, link, dir, block, fifo, char, socket, or unknown, or FALSE on failure. * May be one of file, link, * or dir * @since 5.1.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getType(): string|false {} /** * Tells if the entry is writable * @link https://php.net/manual/en/splfileinfo.iswritable.php * @return bool true if writable, false otherwise; * @since 5.1.2 */ #[TentativeType] public function isWritable(): bool {} /** * Tells if file is readable * @link https://php.net/manual/en/splfileinfo.isreadable.php * @return bool true if readable, false otherwise. * @since 5.1.2 */ #[TentativeType] public function isReadable(): bool {} /** * Tells if the file is executable * @link https://php.net/manual/en/splfileinfo.isexecutable.php * @return bool true if executable, false otherwise. * @since 5.1.2 */ #[TentativeType] public function isExecutable(): bool {} /** * Tells if the object references a regular file * @link https://php.net/manual/en/splfileinfo.isfile.php * @return bool true if the file exists and is a regular file (not a link), false otherwise. * @since 5.1.2 */ #[TentativeType] public function isFile(): bool {} /** * Tells if the file is a directory * @link https://php.net/manual/en/splfileinfo.isdir.php * @return bool true if a directory, false otherwise. * @since 5.1.2 */ #[TentativeType] public function isDir(): bool {} /** * Tells if the file is a link * @link https://php.net/manual/en/splfileinfo.islink.php * @return bool true if the file is a link, false otherwise. * @since 5.1.2 */ #[TentativeType] public function isLink(): bool {} /** * Gets the target of a link * @link https://php.net/manual/en/splfileinfo.getlinktarget.php * @return string|false The target of the filesystem link on success, or FALSE on failure. * @since 5.2.2 * @throws \RuntimeException on error. */ #[TentativeType] public function getLinkTarget(): string|false {} /** * Gets absolute path to file * @link https://php.net/manual/en/splfileinfo.getrealpath.php * @return string|false the path to the file, or FALSE if the file does not exist. * @since 5.2.2 */ #[TentativeType] public function getRealPath(): string|false {} /** * Gets an SplFileInfo object for the file * @template T of SplFileInfo * @link https://php.net/manual/en/splfileinfo.getfileinfo.php * @param class-string $class [optional]

* Name of an SplFileInfo derived class to use. *

* @return T An SplFileInfo object created for the file. * @since 5.1.2 */ #[TentativeType] public function getFileInfo(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $class = null): SplFileInfo {} /** * Gets an SplFileInfo object for the path * @template T of SplFileInfo * @link https://php.net/manual/en/splfileinfo.getpathinfo.php * @param class-string $class [optional]

* Name of an SplFileInfo derived class to use. *

* @return T|null A SplFileInfo object for the parent path of the file on success, or NULL on failure. * @since 5.1.2 */ #[TentativeType] public function getPathInfo(#[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $class = null): ?SplFileInfo {} /** * Gets an SplFileObject object for the file * @link https://php.net/manual/en/splfileinfo.openfile.php * @param string $mode [optional]

* The mode for opening the file. See the fopen * documentation for descriptions of possible modes. The default * is read only. *

* @param bool $useIncludePath [optional]

*

* @param resource $context [optional]

*

* @return SplFileObject The opened file as an SplFileObject object. * @since 5.1.2 * @throws \RuntimeException If the file cannot be opened (e.g. insufficient access rights). */ #[TentativeType] public function openFile( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $mode = 'r', #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $useIncludePath = false, $context = null ): SplFileObject {} /** * Sets the class name used with SplFileInfo::openFile * @template T of SplFileObject * @link https://php.net/manual/en/splfileinfo.setfileclass.php * @param class-string $class [optional]

* The class name to use when openFile() is called. *

* @return void * @since 5.1.2 */ #[TentativeType] public function setFileClass(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $class = SplFileObject::class): void {} /** * Sets the class used with getFileInfo and getPathInfo * @template T of SplFileInfo * @link https://php.net/manual/en/splfileinfo.setinfoclass.php * @param class-string $class [optional]

* The class name to use. *

* @return void * @since 5.1.2 */ #[TentativeType] public function setInfoClass(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $class = SplFileInfo::class): void {} /** * Returns the path to the file as a string * @link https://php.net/manual/en/splfileinfo.tostring.php * @return string the path to the file. * @since 5.1.2 */ #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] public function __toString() {} #[TentativeType] final public function _bad_state_ex(): void {} public function __wakeup() {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} } /** * The DirectoryIterator class provides a simple interface for viewing * the contents of filesystem directories. * @link https://php.net/manual/en/class.directoryiterator.php */ class DirectoryIterator extends SplFileInfo implements SeekableIterator { /** * Constructs a new directory iterator from a path * @link https://php.net/manual/en/directoryiterator.construct.php * @param string $directory * @throws UnexpectedValueException if the path cannot be opened. * @throws RuntimeException if the path is an empty string. */ public function __construct(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $directory) {} /** * Determine if current DirectoryIterator item is '.' or '..' * @link https://php.net/manual/en/directoryiterator.isdot.php * @return bool true if the entry is . or .., * otherwise false */ #[TentativeType] public function isDot(): bool {} /** * Rewind the DirectoryIterator back to the start * @link https://php.net/manual/en/directoryiterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Check whether current DirectoryIterator position is a valid file * @link https://php.net/manual/en/directoryiterator.valid.php * @return bool true if the position is valid, otherwise false */ #[TentativeType] public function valid(): bool {} /** * Return the key for the current DirectoryIterator item * @link https://php.net/manual/en/directoryiterator.key.php * @return string The key for the current DirectoryIterator item. */ #[TentativeType] public function key(): mixed {} /** * Return the current DirectoryIterator item. * @link https://php.net/manual/en/directoryiterator.current.php * @return DirectoryIterator The current DirectoryIterator item. */ #[TentativeType] public function current(): mixed {} /** * Move forward to next DirectoryIterator item * @link https://php.net/manual/en/directoryiterator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Seek to a DirectoryIterator item * @link https://php.net/manual/en/directoryiterator.seek.php * @param int $offset

* The zero-based numeric position to seek to. *

* @return void */ #[TentativeType] public function seek(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $offset): void {} } /** * The Filesystem iterator * @link https://php.net/manual/en/class.filesystemiterator.php */ class FilesystemIterator extends DirectoryIterator { public const CURRENT_MODE_MASK = 240; public const CURRENT_AS_PATHNAME = 32; public const CURRENT_AS_FILEINFO = 0; public const CURRENT_AS_SELF = 16; public const KEY_MODE_MASK = 3840; public const KEY_AS_PATHNAME = 0; public const FOLLOW_SYMLINKS = 16384; public const KEY_AS_FILENAME = 256; public const NEW_CURRENT_AND_KEY = 256; public const SKIP_DOTS = 4096; public const UNIX_PATHS = 8192; public const OTHER_MODE_MASK = 28672; /** * Constructs a new filesystem iterator * @link https://php.net/manual/en/filesystemiterator.construct.php * @param string $directory * @param int $flags [optional] * @throws UnexpectedValueException if the path cannot be found. */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $directory, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = FilesystemIterator::KEY_AS_PATHNAME|FilesystemIterator::CURRENT_AS_FILEINFO|FilesystemIterator::SKIP_DOTS ) {} /** * Rewinds back to the beginning * @link https://php.net/manual/en/filesystemiterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Move to the next file * @link https://php.net/manual/en/filesystemiterator.next.php * @return void */ public function next() {} /** * Retrieve the key for the current file * @link https://php.net/manual/en/filesystemiterator.key.php * @return string the pathname or filename depending on the set flags. * See the FilesystemIterator constants. */ #[TentativeType] public function key(): string {} /** * The current file * @link https://php.net/manual/en/filesystemiterator.current.php * @return string|SplFileInfo|self The filename, file information, or $this depending on the set flags. * See the FilesystemIterator constants. */ #[TentativeType] public function current(): SplFileInfo|FilesystemIterator|string {} /** * Get the handling flags * @link https://php.net/manual/en/filesystemiterator.getflags.php * @return int The integer value of the set flags. */ #[TentativeType] public function getFlags(): int {} /** * Sets handling flags * @link https://php.net/manual/en/filesystemiterator.setflags.php * @param int $flags

* The handling flags to set. * See the FilesystemIterator constants. *

* @return void */ #[TentativeType] public function setFlags( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $flags = null, #[PhpStormStubsElementAvailable(from: '8.0')] int $flags ): void {} } /** * The RecursiveDirectoryIterator provides * an interface for iterating recursively over filesystem directories. * @link https://php.net/manual/en/class.recursivedirectoryiterator.php */ class RecursiveDirectoryIterator extends FilesystemIterator implements RecursiveIterator { /** * Constructs a RecursiveDirectoryIterator * @link https://php.net/manual/en/recursivedirectoryiterator.construct.php * @param string $directory * @param int $flags [optional] * @throws UnexpectedValueException if the path cannot be found or is not a directory. * @since 5.1.2 */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $directory, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = FilesystemIterator::KEY_AS_PATHNAME|FilesystemIterator::CURRENT_AS_FILEINFO ) {} /** * Returns whether current entry is a directory and not '.' or '..' * @link https://php.net/manual/en/recursivedirectoryiterator.haschildren.php * @param bool $allowLinks [optional]

*

* @return bool whether the current entry is a directory, but not '.' or '..' */ #[TentativeType] public function hasChildren(#[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $allowLinks = false): bool {} /** * Returns an iterator for the current entry if it is a directory * @link https://php.net/manual/en/recursivedirectoryiterator.getchildren.php * @return RecursiveDirectoryIterator An iterator for the current entry, if it is a directory. */ #[TentativeType] public function getChildren(): RecursiveDirectoryIterator {} /** * Get sub path * @link https://php.net/manual/en/recursivedirectoryiterator.getsubpath.php * @return string The sub path (sub directory). */ #[TentativeType] public function getSubPath(): string {} /** * Get sub path and name * @link https://php.net/manual/en/recursivedirectoryiterator.getsubpathname.php * @return string The sub path (sub directory) and filename. */ #[TentativeType] public function getSubPathname(): string {} /** * Rewinds back to the beginning * @link https://php.net/manual/en/filesystemiterator.rewind.php * @return void */ public function rewind() {} /** * Move to the next file * @link https://php.net/manual/en/filesystemiterator.next.php * @return void */ public function next() {} /** * Retrieve the key for the current file * @link https://php.net/manual/en/filesystemiterator.key.php * @return string the pathname or filename depending on the set flags. * See the FilesystemIterator constants. */ public function key() {} /** * The current file * @link https://php.net/manual/en/filesystemiterator.current.php * @return string|SplFileInfo|self The filename, file information, or $this depending on the set flags. * See the FilesystemIterator constants. */ public function current() {} } /** * Iterates through a file system in a similar fashion to * glob. * @link https://php.net/manual/en/class.globiterator.php */ class GlobIterator extends FilesystemIterator implements Countable { /** * Construct a directory using glob * @link https://php.net/manual/en/globiterator.construct.php * @param $pattern * @param int $flags [optional] */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $pattern, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags = FilesystemIterator::KEY_AS_PATHNAME|FilesystemIterator::CURRENT_AS_FILEINFO ) {} /** * Get the number of directories and files * @link https://php.net/manual/en/globiterator.count.php * @return int<0,max> The number of returned directories and files, as an * integer. */ #[TentativeType] public function count(): int {} } /** * The SplFileObject class offers an object oriented interface for a file. * @link https://php.net/manual/en/class.splfileobject.php */ class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator { /** * Drop newlines at the end of a line. */ public const DROP_NEW_LINE = 1; /** * Read on rewind/next. */ public const READ_AHEAD = 2; /** * Skip empty lines in the file. This requires the {@see READ_AHEAD} flag to work as expected. */ public const SKIP_EMPTY = 4; /** * Read lines as CSV rows. */ public const READ_CSV = 8; /** * Construct a new file object. * * @link https://php.net/manual/en/splfileobject.construct.php * * @param string $filename The file to open * @param string $mode [optional] The mode in which to open the file. See {@see fopen} for a list of allowed modes. * @param bool $useIncludePath [optional] Whether to search in the include_path for filename * @param resource $context [optional] A valid context resource created with {@see stream_context_create} * * @throws RuntimeException When the filename cannot be opened * @throws LogicException When the filename is a directory */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $filename, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $mode = 'r', #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $useIncludePath = false, $context = null ) {} /** * Rewind the file to the first line * @link https://php.net/manual/en/splfileobject.rewind.php * @return void * * @throws RuntimeException If cannot be rewound */ #[TentativeType] public function rewind(): void {} /** * Reached end of file * @link https://php.net/manual/en/splfileobject.eof.php * @return bool true if file is at EOF, false otherwise. */ #[TentativeType] public function eof(): bool {} /** * Not at EOF * @link https://php.net/manual/en/splfileobject.valid.php * @return bool true if not reached EOF, false otherwise. */ #[TentativeType] public function valid(): bool {} /** * Gets line from file * @link https://php.net/manual/en/splfileobject.fgets.php * @return string a string containing the next line from the file. * * @throws RuntimeException If the file cannot be read */ #[TentativeType] public function fgets(): string {} /** * Read from file * @link https://php.net/manual/en/splfileobject.fread.php * @param int $length

* The number of bytes to read. *

* @return string|false returns the string read from the file or FALSE on failure. * @since 5.5.11 */ #[TentativeType] public function fread(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $length): string|false {} /** * Gets line from file and parse as CSV fields * @link https://php.net/manual/en/splfileobject.fgetcsv.php * @param string $separator [optional]

* The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. *

* @param string $enclosure [optional]

* The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. *

* @param string $escape [optional]

* The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. *

* @return array|false|null an indexed array containing the fields read, or false on error. *

*

* A blank line in a CSV file will be returned as an array * comprising a single null field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, * in which case empty lines are skipped. */ #[TentativeType] #[LanguageLevelTypeAware(['8.1' => 'array|false'], default: 'array|false|null')] public function fgetcsv( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $separator = ",", #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $enclosure = "\"", #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $escape = "\\" ) {} /** * Write a field array as a CSV line * @link https://php.net/manual/en/splfileobject.fputcsv.php * @param array $fields An array of values * @param string $separator [optional]

* The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. *

* @param string $enclosure [optional]

* The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. *

* @param string $escape The optional escape parameter sets the escape character (one character only). * @return int|false Returns the length of the written string or FALSE on failure. * @since 5.4 */ #[TentativeType] public function fputcsv( array $fields, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $separator = ',', #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $enclosure = '"', #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $escape = "\\", #[PhpStormStubsElementAvailable('8.1')] string $eol = PHP_EOL ): int|false {} /** * Set the delimiter and enclosure character for CSV * @link https://php.net/manual/en/splfileobject.setcsvcontrol.php * @param string $separator [optional]

* The field delimiter (one character only). *

* @param string $enclosure [optional]

* The field enclosure character (one character only). *

* @param string $escape [optional]

* The field escape character (one character only). *

* @return void */ #[TentativeType] public function setCsvControl( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $separator = ",", #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $enclosure = "\"", #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $escape = "\\" ): void {} /** * Get the delimiter and enclosure character for CSV * @link https://php.net/manual/en/splfileobject.getcsvcontrol.php * @return array an indexed array containing the delimiter and enclosure character. */ #[TentativeType] public function getCsvControl(): array {} /** * Portable file locking * @link https://php.net/manual/en/splfileobject.flock.php * @param int $operation

* operation is one of the following: * LOCK_SH to acquire a shared lock (reader). *

* @param int &$wouldBlock [optional]

* Set to 1 if the lock would block (EWOULDBLOCK errno condition). *

* @return bool true on success or false on failure. */ #[TentativeType] public function flock(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $operation, &$wouldBlock = null): bool {} /** * Flushes the output to the file * @link https://php.net/manual/en/splfileobject.fflush.php * @return bool true on success or false on failure. */ #[TentativeType] public function fflush(): bool {} /** * Return current file position * @link https://php.net/manual/en/splfileobject.ftell.php * @return int|false the position of the file pointer as an integer, or false on error. */ #[TentativeType] public function ftell(): int|false {} /** * Seek to a position * @link https://php.net/manual/en/splfileobject.fseek.php * @param int $offset

* The offset. A negative value can be used to move backwards through the file which * is useful when SEEK_END is used as the whence value. *

* @param int $whence [optional]

* whence values are: * SEEK_SET - Set position equal to offset bytes. * SEEK_CUR - Set position to current location plus offset. * SEEK_END - Set position to end-of-file plus offset. *

*

* If whence is not specified, it is assumed to be SEEK_SET. *

* @return int 0 if the seek was successful, -1 otherwise. Note that seeking * past EOF is not considered an error. */ #[TentativeType] public function fseek( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $offset, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $whence = SEEK_SET ): int {} /** * Gets character from file * @link https://php.net/manual/en/splfileobject.fgetc.php * @return string|false a string containing a single character read from the file or false on EOF. */ #[TentativeType] public function fgetc(): string|false {} /** * Output all remaining data on a file pointer * @link https://php.net/manual/en/splfileobject.fpassthru.php * @return int the number of characters read from handle * and passed through to the output. */ #[TentativeType] public function fpassthru(): int {} /** * Gets line from file and strip HTML tags * @link https://php.net/manual/en/splfileobject.fgetss.php * @param string $allowable_tags [optional]

* You can use the optional third parameter to specify tags which should * not be stripped. *

* @return string|false a string containing the next line of the file with HTML and PHP * code stripped, or false on error. * @removed 8.0 */ #[Deprecated(since: '7.3')] public function fgetss($allowable_tags = null) {} /** * Parses input from file according to a format * @link https://php.net/manual/en/splfileobject.fscanf.php * @param string $format

* The specified format as described in the sprintf documentation. *

* @param mixed &...$vars [optional]

* The optional assigned values. *

* @return array|int|null If only one parameter is passed to this method, the values parsed will be * returned as an array. Otherwise, if optional parameters are passed, the * function will return the number of assigned values. The optional * parameters must be passed by reference. */ #[TentativeType] public function fscanf( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $format, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] &...$vars ): array|int|null {} /** * Write to file * @link https://php.net/manual/en/splfileobject.fwrite.php * @param string $data

* The string to be written to the file. *

* @param int $length [optional]

* If the length argument is given, writing will * stop after length bytes have been written or * the end of string is reached, whichever comes * first. *

* @return int|false the number of bytes written, or 0 (false since 7.4) on error. */ #[LanguageLevelTypeAware(['7.4' => 'int|false'], default: 'int')] #[TentativeType] public function fwrite( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $length = 0 ): int|false {} /** * Gets information about the file * @link https://php.net/manual/en/splfileobject.fstat.php * @return array an array with the statistics of the file; the format of the array * is described in detail on the stat manual page. */ #[TentativeType] public function fstat(): array {} /** * Truncates the file to a given length * @link https://php.net/manual/en/splfileobject.ftruncate.php * @param int $size

* The size to truncate to. *

*

* If size is larger than the file it is extended with null bytes. *

*

* If size is smaller than the file, the extra data will be lost. *

* @return bool true on success or false on failure. */ #[TentativeType] public function ftruncate(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $size): bool {} /** * Retrieve current line of file * @link https://php.net/manual/en/splfileobject.current.php * @return string|array|false Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. */ #[TentativeType] public function current(): string|array|false {} /** * Get line number * @link https://php.net/manual/en/splfileobject.key.php * @return int the current line number. */ #[TentativeType] public function key(): int {} /** * Read next line * @link https://php.net/manual/en/splfileobject.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Sets flags for the SplFileObject * @link https://php.net/manual/en/splfileobject.setflags.php * @param int $flags

* Bit mask of the flags to set. See * SplFileObject constants * for the available flags. *

* @return void */ #[TentativeType] public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): void {} /** * Gets flags for the SplFileObject * @link https://php.net/manual/en/splfileobject.getflags.php * @return int an integer representing the flags. */ #[TentativeType] public function getFlags(): int {} /** * Set maximum line length * @link https://php.net/manual/en/splfileobject.setmaxlinelen.php * @param int $maxLength

* The maximum length of a line. *

* @return void * * @throws DomainException When maxLength is less than zero. */ #[TentativeType] public function setMaxLineLen(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $maxLength): void {} /** * Get maximum line length * @link https://php.net/manual/en/splfileobject.getmaxlinelen.php * @return int<0, max> the maximum line length if one has been set with * SplFileObject::setMaxLineLen, default is 0. */ #[TentativeType] public function getMaxLineLen(): int {} /** * SplFileObject does not have children * @link https://php.net/manual/en/splfileobject.haschildren.php * @return bool false * @since 5.1.2 */ #[TentativeType] #[LanguageLevelTypeAware(['8.2' => 'false'], default: 'bool')] public function hasChildren() {} /** * No purpose * @link https://php.net/manual/en/splfileobject.getchildren.php * @return null|RecursiveIterator An SplFileObject does not have children so this method returns NULL. */ #[TentativeType] #[LanguageLevelTypeAware(['8.2' => 'null'], default: 'null|RecursiveIterator')] public function getChildren() {} /** * Seek to specified line * @link https://php.net/manual/en/splfileobject.seek.php * @param int $line

* The zero-based line number to seek to. *

* @return void * @throws LogicException If the line is negative */ #[TentativeType] public function seek(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $line): void {} /** * Alias of SplFileObject::fgets * @link https://php.net/manual/en/splfileobject.getcurrentline.php * @return string Returns a string containing the next line from the file. * @since 5.1.2 */ #[TentativeType] public function getCurrentLine(): string {} /** * Alias of SplFileObject::current * @link https://php.net/manual/en/splfileobject.tostring.php */ #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] public function __toString() {} } /** * The SplTempFileObject class offers an object oriented interface for a temporary file. * @link https://php.net/manual/en/class.spltempfileobject.php */ class SplTempFileObject extends SplFileObject { /** * Construct a new temporary file object * @link https://php.net/manual/en/spltempfileobject.construct.php * @param int $maxMemory [optional] * @throws RuntimeException if an error occurs. * @since 5.1.2 */ public function __construct(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $maxMemory = 2097152) {} } /** * @template TValue * The SplDoublyLinkedList class provides the main functionalities of a doubly linked list. * @link https://php.net/manual/en/class.spldoublylinkedlist.php * @template-implements Iterator * @template-implements ArrayAccess */ class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable { public const IT_MODE_LIFO = 2; public const IT_MODE_FIFO = 0; public const IT_MODE_DELETE = 1; public const IT_MODE_KEEP = 0; /** * Add/insert a new value at the specified index * @param mixed $index The index where the new value is to be inserted. * @param TValue $value The new value for the index. * @return void * @link https://php.net/spldoublylinkedlist.add * @since 5.5 */ #[TentativeType] public function add( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $index, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value ): void {} /** * Pops a node from the end of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.pop.php * @return TValue The value of the popped node. */ #[TentativeType] public function pop(): mixed {} /** * Shifts a node from the beginning of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.shift.php * @return TValue The value of the shifted node. */ #[TentativeType] public function shift(): mixed {} /** * Pushes an element at the end of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.push.php * @param TValue $value

* The value to push. *

* @return void */ #[TentativeType] public function push(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Prepends the doubly linked list with an element * @link https://php.net/manual/en/spldoublylinkedlist.unshift.php * @param TValue $value

* The value to unshift. *

* @return void */ #[TentativeType] public function unshift(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Peeks at the node from the end of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.top.php * @return TValue The value of the last node. */ #[TentativeType] public function top(): mixed {} /** * Peeks at the node from the beginning of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.bottom.php * @return TValue The value of the first node. */ #[TentativeType] public function bottom(): mixed {} /** * Counts the number of elements in the doubly linked list. * @link https://php.net/manual/en/spldoublylinkedlist.count.php * @return int the number of elements in the doubly linked list. */ #[TentativeType] public function count(): int {} /** * Checks whether the doubly linked list is empty. * @link https://php.net/manual/en/spldoublylinkedlist.isempty.php * @return bool whether the doubly linked list is empty. */ #[TentativeType] public function isEmpty(): bool {} /** * Sets the mode of iteration * @link https://php.net/manual/en/spldoublylinkedlist.setiteratormode.php * @param int $mode

* There are two orthogonal sets of modes that can be set: *

* The direction of the iteration (either one or the other): * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) * @return int */ #[TentativeType] public function setIteratorMode(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $mode): int {} /** * Returns the mode of iteration * @link https://php.net/manual/en/spldoublylinkedlist.getiteratormode.php * @return int the different modes and flags that affect the iteration. */ #[TentativeType] public function getIteratorMode(): int {} /** * Returns whether the requested $index exists * @link https://php.net/manual/en/spldoublylinkedlist.offsetexists.php * @param mixed $index

* The index being checked. *

* @return bool true if the requested index exists, otherwise false */ #[TentativeType] public function offsetExists($index): bool {} /** * Returns the value at the specified $index * @link https://php.net/manual/en/spldoublylinkedlist.offsetget.php * @param mixed $index

* The index with the value. *

* @return TValue The value at the specified index. */ #[TentativeType] public function offsetGet($index): mixed {} /** * Sets the value at the specified $index to $newval * @link https://php.net/manual/en/spldoublylinkedlist.offsetset.php * @param mixed $index

* The index being set. *

* @param TValue $value

* The new value for the index. *

* @return void */ #[TentativeType] public function offsetSet($index, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Unsets the value at the specified $index * @link https://php.net/manual/en/spldoublylinkedlist.offsetunset.php * @param mixed $index

* The index being unset. *

* @return void */ #[TentativeType] public function offsetUnset($index): void {} /** * Rewind iterator back to the start * @link https://php.net/manual/en/spldoublylinkedlist.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Return current array entry * @link https://php.net/manual/en/spldoublylinkedlist.current.php * @return TValue The current node value. */ #[TentativeType] public function current(): mixed {} /** * Return current node index * @link https://php.net/manual/en/spldoublylinkedlist.key.php * @return string|float|int|bool|null The current node index. */ #[TentativeType] public function key(): int {} /** * Move to next entry * @link https://php.net/manual/en/spldoublylinkedlist.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Move to previous entry * @link https://php.net/manual/en/spldoublylinkedlist.prev.php * @return void */ #[TentativeType] public function prev(): void {} /** * Check whether the doubly linked list contains more nodes * @link https://php.net/manual/en/spldoublylinkedlist.valid.php * @return bool true if the doubly linked list contains any more nodes, false otherwise. */ #[TentativeType] public function valid(): bool {} /** * Unserializes the storage * @link https://php.net/manual/en/spldoublylinkedlist.serialize.php * @param string $data The serialized string. * @return void * @since 5.4 */ #[TentativeType] public function unserialize(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data): void {} /** * Serializes the storage * @link https://php.net/manual/en/spldoublylinkedlist.unserialize.php * @return string The serialized string. * @since 5.4 */ #[TentativeType] public function serialize(): string {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} /** * @return array * @since 7.4 */ #[TentativeType] public function __serialize(): array {} /** * @param array $data * @since 7.4 */ #[TentativeType] public function __unserialize(array $data): void {} } /** * @template TValue * The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list. * @link https://php.net/manual/en/class.splqueue.php */ class SplQueue extends SplDoublyLinkedList { /** * Adds an element to the queue. * @link https://php.net/manual/en/splqueue.enqueue.php * @param TValue $value

* The value to enqueue. *

* @return void */ #[TentativeType] public function enqueue(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Dequeues a node from the queue * @link https://php.net/manual/en/splqueue.dequeue.php * @return TValue The value of the dequeued node. */ #[TentativeType] public function dequeue(): mixed {} /** * Sets the mode of iteration * @link https://php.net/manual/en/spldoublylinkedlist.setiteratormode.php * @param int $mode

* There are two orthogonal sets of modes that can be set: *

* The direction of the iteration (either one or the other): * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) * @return void */ public function setIteratorMode($mode) {} } /** * @template TValue * The SplStack class provides the main functionalities of a stack implemented using a doubly linked list. * @link https://php.net/manual/en/class.splstack.php * @template-extends SplDoublyLinkedList */ class SplStack extends SplDoublyLinkedList { /** * Sets the mode of iteration * @link https://php.net/manual/en/spldoublylinkedlist.setiteratormode.php * @param int $mode

* There are two orthogonal sets of modes that can be set: *

* The direction of the iteration (either one or the other): * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) * @return void */ public function setIteratorMode($mode) {} } /** * @template TValue * The SplHeap class provides the main functionalities of an Heap. * @link https://php.net/manual/en/class.splheap.php * @template-implements Iterator */ abstract class SplHeap implements Iterator, Countable { /** * Extracts a node from top of the heap and sift up. * @link https://php.net/manual/en/splheap.extract.php * @return TValue The value of the extracted node. */ #[TentativeType] public function extract(): mixed {} /** * Inserts an element in the heap by sifting it up. * @link https://php.net/manual/en/splheap.insert.php * @param TValue $value

* The value to insert. *

* @return bool */ #[TentativeType] #[LanguageLevelTypeAware(['8.4' => 'true'], default: 'bool')] public function insert(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value) {} /** * Peeks at the node from the top of the heap * @link https://php.net/manual/en/splheap.top.php * @return TValue The value of the node on the top. */ #[TentativeType] public function top(): mixed {} /** * Counts the number of elements in the heap. * @link https://php.net/manual/en/splheap.count.php * @return int the number of elements in the heap. */ #[TentativeType] public function count(): int {} /** * Checks whether the heap is empty. * @link https://php.net/manual/en/splheap.isempty.php * @return bool whether the heap is empty. */ #[TentativeType] public function isEmpty(): bool {} /** * Rewind iterator back to the start (no-op) * @link https://php.net/manual/en/splheap.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Return current node pointed by the iterator * @link https://php.net/manual/en/splheap.current.php * @return TValue The current node value. */ #[TentativeType] public function current(): mixed {} /** * Return current node index * @link https://php.net/manual/en/splheap.key.php * @return int The current node index. */ #[TentativeType] public function key(): int {} /** * Move to the next node * @link https://php.net/manual/en/splheap.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Check whether the heap contains more nodes * @link https://php.net/manual/en/splheap.valid.php * @return bool true if the heap contains any more nodes, false otherwise. */ #[TentativeType] public function valid(): bool {} /** * Recover from the corrupted state and allow further actions on the heap. * @link https://php.net/manual/en/splheap.recoverfromcorruption.php * @return bool */ #[TentativeType] #[LanguageLevelTypeAware(['8.4' => 'true'], default: 'bool')] public function recoverFromCorruption() {} /** * Compare elements in order to place them correctly in the heap while sifting up. * @link https://php.net/manual/en/splheap.compare.php * @param mixed $value1

* The value of the first node being compared. *

* @param mixed $value2

* The value of the second node being compared. *

* @return int Result of the comparison, positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. *

*

* Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. */ abstract protected function compare($value1, $value2); /** * @return bool */ #[TentativeType] public function isCorrupted(): bool {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} } /** * @template TValue * The SplMinHeap class provides the main functionalities of a heap, keeping the minimum on the top. * @link https://php.net/manual/en/class.splminheap.php * @template-extends SplHeap */ class SplMinHeap extends SplHeap { /** * Compare elements in order to place them correctly in the heap while sifting up. * @link https://php.net/manual/en/splminheap.compare.php * @param TValue $value1

* The value of the first node being compared. *

* @param TValue $value2

* The value of the second node being compared. *

* @return int Result of the comparison, positive integer if value1 is lower than value2, 0 if they are equal, negative integer otherwise. *

*

* Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. */ #[TentativeType] protected function compare( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value1, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value2 ): int {} /** * Extracts a node from top of the heap and sift up. * @link https://php.net/manual/en/splheap.extract.php * @return TValue The value of the extracted node. */ public function extract() {} /** * Inserts an element in the heap by sifting it up. * @link https://php.net/manual/en/splheap.insert.php * @param TValue $value

* The value to insert. *

* @return true */ public function insert($value) {} /** * Peeks at the node from the top of the heap * @link https://php.net/manual/en/splheap.top.php * @return TValue The value of the node on the top. */ public function top() {} /** * Counts the number of elements in the heap. * @link https://php.net/manual/en/splheap.count.php * @return int the number of elements in the heap. */ public function count() {} /** * Checks whether the heap is empty. * @link https://php.net/manual/en/splheap.isempty.php * @return bool whether the heap is empty. */ public function isEmpty() {} /** * Rewind iterator back to the start (no-op) * @link https://php.net/manual/en/splheap.rewind.php * @return void */ public function rewind() {} /** * Return current node pointed by the iterator * @link https://php.net/manual/en/splheap.current.php * @return TValue The current node value. */ public function current() {} /** * Return current node index * @link https://php.net/manual/en/splheap.key.php * @return int The current node index. */ public function key() {} /** * Move to the next node * @link https://php.net/manual/en/splheap.next.php * @return void */ public function next() {} /** * Check whether the heap contains more nodes * @link https://php.net/manual/en/splheap.valid.php * @return bool true if the heap contains any more nodes, false otherwise. */ public function valid() {} /** * Recover from the corrupted state and allow further actions on the heap. * @link https://php.net/manual/en/splheap.recoverfromcorruption.php * @return void */ public function recoverFromCorruption() {} } /** * @template TValue * The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top. * @link https://php.net/manual/en/class.splmaxheap.php * @template-extends SplHeap */ class SplMaxHeap extends SplHeap { /** * Compare elements in order to place them correctly in the heap while sifting up. * @link https://php.net/manual/en/splmaxheap.compare.php * @param TValue $value1

* The value of the first node being compared. *

* @param TValue $value2

* The value of the second node being compared. *

* @return int Result of the comparison, positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. *

*

* Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. */ #[TentativeType] protected function compare( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value1, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value2 ): int {} } /** * @template TPriority * @template TValue * The SplPriorityQueue class provides the main functionalities of an * prioritized queue, implemented using a heap. * @link https://php.net/manual/en/class.splpriorityqueue.php * @template-implements Iterator */ class SplPriorityQueue implements Iterator, Countable { public const EXTR_BOTH = 3; public const EXTR_PRIORITY = 2; public const EXTR_DATA = 1; /** * Compare priorities in order to place elements correctly in the heap while sifting up. * @link https://php.net/manual/en/splpriorityqueue.compare.php * @param TPriority $priority1

* The priority of the first node being compared. *

* @param TPriority $priority2

* The priority of the second node being compared. *

* @return int Result of the comparison, positive integer if priority1 is greater than priority2, 0 if they are equal, negative integer otherwise. *

*

* Multiple elements with the same priority will get dequeued in no particular order. */ #[TentativeType] public function compare( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $priority1, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $priority2 ): int {} /** * Inserts an element in the queue by sifting it up. * @link https://php.net/manual/en/splpriorityqueue.insert.php * @param TValue $value

* The value to insert. *

* @param TPriority $priority

* The associated priority. *

* @return true */ #[TentativeType] public function insert( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $priority ): true {} /** * Sets the mode of extraction * @link https://php.net/manual/en/splpriorityqueue.setextractflags.php * @param int $flags

* Defines what is extracted by SplPriorityQueue::current, * SplPriorityQueue::top and * SplPriorityQueue::extract. *

* SplPriorityQueue::EXTR_DATA (0x00000001): Extract the data * @return int */ #[TentativeType] public function setExtractFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): int {} /** * Peeks at the node from the top of the queue * @link https://php.net/manual/en/splpriorityqueue.top.php * @return TValue The value or priority (or both) of the top node, depending on the extract flag. */ #[TentativeType] public function top(): mixed {} /** * Extracts a node from top of the heap and sift up. * @link https://php.net/manual/en/splpriorityqueue.extract.php * @return TValue The value or priority (or both) of the extracted node, depending on the extract flag. */ #[TentativeType] public function extract(): mixed {} /** * Counts the number of elements in the queue. * @link https://php.net/manual/en/splpriorityqueue.count.php * @return int the number of elements in the queue. */ #[TentativeType] public function count(): int {} /** * Checks whether the queue is empty. * @link https://php.net/manual/en/splpriorityqueue.isempty.php * @return bool whether the queue is empty. */ #[TentativeType] public function isEmpty(): bool {} /** * Rewind iterator back to the start (no-op) * @link https://php.net/manual/en/splpriorityqueue.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Return current node pointed by the iterator * @link https://php.net/manual/en/splpriorityqueue.current.php * @return TValue The value or priority (or both) of the current node, depending on the extract flag. */ #[TentativeType] public function current(): mixed {} /** * Return current node index * @link https://php.net/manual/en/splpriorityqueue.key.php * @return int The current node index. */ #[TentativeType] public function key(): int {} /** * Move to the next node * @link https://php.net/manual/en/splpriorityqueue.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Check whether the queue contains more nodes * @link https://php.net/manual/en/splpriorityqueue.valid.php * @return bool true if the queue contains any more nodes, false otherwise. */ #[TentativeType] public function valid(): bool {} /** * Recover from the corrupted state and allow further actions on the queue. * @link https://php.net/manual/en/splpriorityqueue.recoverfromcorruption.php */ #[TentativeType] public function recoverFromCorruption(): true {} /** * @return bool */ #[TentativeType] public function isCorrupted(): bool {} /** * @return int */ #[TentativeType] public function getExtractFlags(): int {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} } /** * @template TValue * The SplFixedArray class provides the main functionalities of array. The * main differences between a SplFixedArray and a normal PHP array is that * the SplFixedArray is of fixed length and allows only integers within * the range as indexes. The advantage is that it allows a faster array * implementation. * @link https://php.net/manual/en/class.splfixedarray.php * @template-implements Iterator * @template-implements ArrayAccess * @template-implements IteratorAggregate */ class SplFixedArray implements Iterator, ArrayAccess, Countable, IteratorAggregate, JsonSerializable { /** * Constructs a new fixed array * @link https://php.net/manual/en/splfixedarray.construct.php * @param int $size [optional] */ public function __construct(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $size = 0) {} /** * Returns the size of the array * @link https://php.net/manual/en/splfixedarray.count.php * @return int the size of the array. */ #[TentativeType] public function count(): int {} /** * Returns a PHP array from the fixed array * @link https://php.net/manual/en/splfixedarray.toarray.php * @return TValue[] a PHP array, similar to the fixed array. */ #[TentativeType] public function toArray(): array {} /** * Import a PHP array in a SplFixedArray instance * @link https://php.net/manual/en/splfixedarray.fromarray.php * @param array $array

* The array to import. *

* @param bool $preserveKeys [optional]

* Try to save the numeric indexes used in the original array. *

* @return SplFixedArray an instance of SplFixedArray * containing the array content. */ #[TentativeType] public static function fromArray( #[LanguageLevelTypeAware(['8.0' => 'array'], default: '')] $array, #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $preserveKeys = true ): SplFixedArray {} /** * Gets the size of the array * @link https://php.net/manual/en/splfixedarray.getsize.php * @return int the size of the array, as an integer. */ #[TentativeType] public function getSize(): int {} /** * Change the size of an array * @link https://php.net/manual/en/splfixedarray.setsize.php * @param int $size

* The new array size. *

* @return bool */ #[LanguageLevelTypeAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setSize(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $size) {} /** * Returns whether the requested index exists * @link https://php.net/manual/en/splfixedarray.offsetexists.php * @param int $index

* The index being checked. *

* @return bool true if the requested index exists, otherwise false */ #[TentativeType] public function offsetExists($index): bool {} /** * Returns the value at the specified index * @link https://php.net/manual/en/splfixedarray.offsetget.php * @param int $index

* The index with the value. *

* @return TValue The value at the specified index. */ #[TentativeType] public function offsetGet($index): mixed {} /** * Sets a new value at a specified index * @link https://php.net/manual/en/splfixedarray.offsetset.php * @param int $index

* The index being set. *

* @param TValue $value

* The new value for the index. *

* @return void */ #[TentativeType] public function offsetSet($index, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value): void {} /** * Unsets the value at the specified $index * @link https://php.net/manual/en/splfixedarray.offsetunset.php * @param int $index

* The index being unset. *

* @return void */ #[TentativeType] public function offsetUnset($index): void {} /** * Rewind iterator back to the start * @link https://php.net/manual/en/splfixedarray.rewind.php * @return void */ public function rewind() {} /** * Return current array entry * @link https://php.net/manual/en/splfixedarray.current.php * @return TValue The current element value. */ public function current() {} /** * Return current array index * @link https://php.net/manual/en/splfixedarray.key.php * @return int The current array index. */ public function key() {} /** * Move to next entry * @link https://php.net/manual/en/splfixedarray.next.php * @return void */ public function next() {} /** * Check whether the array contains more elements * @link https://php.net/manual/en/splfixedarray.valid.php * @return bool true if the array contains any more elements, false otherwise. */ #[TentativeType] public function valid(): bool {} #[TentativeType] public function __wakeup(): void {} #[PhpStormStubsElementAvailable(from: '8.2')] public function __serialize(): array {} #[PhpStormStubsElementAvailable(from: '8.2')] public function __unserialize(array $data): void {} /** * @since 8.0 * @return Iterator */ public function getIterator(): Iterator {} #[PhpStormStubsElementAvailable(from: '8.1')] public function jsonSerialize(): array {} } /** * The SplObserver interface is used alongside * SplSubject to implement the Observer Design Pattern. * @link https://php.net/manual/en/class.splobserver.php */ interface SplObserver { /** * Receive update from subject * @link https://php.net/manual/en/splobserver.update.php * @param SplSubject $subject

* The SplSubject notifying the observer of an update. *

* @return void */ #[TentativeType] public function update(SplSubject $subject): void; } /** * The SplSubject interface is used alongside * SplObserver to implement the Observer Design Pattern. * @link https://php.net/manual/en/class.splsubject.php */ interface SplSubject { /** * Attach an SplObserver * @link https://php.net/manual/en/splsubject.attach.php * @param SplObserver $observer

* The SplObserver to attach. *

* @return void */ #[TentativeType] public function attach(SplObserver $observer): void; /** * Detach an observer * @link https://php.net/manual/en/splsubject.detach.php * @param SplObserver $observer

* The SplObserver to detach. *

* @return void */ #[TentativeType] public function detach(SplObserver $observer): void; /** * Notify an observer * @link https://php.net/manual/en/splsubject.notify.php * @return void */ #[TentativeType] public function notify(): void; } /** * @template TObject of object * @template TValue * The SplObjectStorage class provides a map from objects to data or, by * ignoring data, an object set. This dual purpose can be useful in many * cases involving the need to uniquely identify objects. * @link https://php.net/manual/en/class.splobjectstorage.php * @template-implements Iterator * @template-implements ArrayAccess */ class SplObjectStorage implements Countable, SeekableIterator, Serializable, ArrayAccess { /** * Adds an object in the storage * @link https://php.net/manual/en/splobjectstorage.attach.php * @param TObject $object

* The object to add. *

* @param TValue $info [optional]

* The data to associate with the object. *

* @return void */ #[TentativeType] public function attach( #[LanguageLevelTypeAware(['8.0' => 'object'], default: '')] $object, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $info = null ): void {} /** * Removes an object from the storage * @link https://php.net/manual/en/splobjectstorage.detach.php * @param TObject $object

* The object to remove. *

* @return void */ #[TentativeType] public function detach(#[LanguageLevelTypeAware(['8.0' => 'object'], default: '')] $object): void {} /** * Checks if the storage contains a specific object * @link https://php.net/manual/en/splobjectstorage.contains.php * @param TObject $object

* The object to look for. *

* @return bool true if the object is in the storage, false otherwise. */ #[TentativeType] public function contains(#[LanguageLevelTypeAware(['8.0' => 'object'], default: '')] $object): bool {} /** * Adds all objects from another storage * @link https://php.net/manual/en/splobjectstorage.addall.php * @param SplObjectStorage $storage

* The storage you want to import. *

* @return int */ #[TentativeType] public function addAll(#[LanguageLevelTypeAware(['8.0' => 'SplObjectStorage'], default: '')] $storage): int {} /** * Removes objects contained in another storage from the current storage * @link https://php.net/manual/en/splobjectstorage.removeall.php * @param SplObjectStorage $storage

* The storage containing the elements to remove. *

* @return int */ #[TentativeType] public function removeAll(#[LanguageLevelTypeAware(['8.0' => 'SplObjectStorage'], default: '')] $storage): int {} /** * Removes all objects except for those contained in another storage from the current storage * @link https://php.net/manual/en/splobjectstorage.removeallexcept.php * @param SplObjectStorage $storage

* The storage containing the elements to retain in the current storage. *

* @return int * @since 5.3.6 */ #[TentativeType] public function removeAllExcept(#[LanguageLevelTypeAware(['8.0' => 'SplObjectStorage'], default: '')] $storage): int {} /** * Returns the data associated with the current iterator entry * @link https://php.net/manual/en/splobjectstorage.getinfo.php * @return TValue The data associated with the current iterator position. */ #[TentativeType] public function getInfo(): mixed {} /** * Sets the data associated with the current iterator entry * @link https://php.net/manual/en/splobjectstorage.setinfo.php * @param TValue $info

* The data to associate with the current iterator entry. *

* @return void */ #[TentativeType] public function setInfo(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $info): void {} /** * Returns the number of objects in the storage * @link https://php.net/manual/en/splobjectstorage.count.php * @param int $mode [optional] * @return int The number of objects in the storage. */ #[TentativeType] public function count(#[PhpStormStubsElementAvailable(from: '8.0')] int $mode = COUNT_NORMAL): int {} /** * Rewind the iterator to the first storage element * @link https://php.net/manual/en/splobjectstorage.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Returns if the current iterator entry is valid * @link https://php.net/manual/en/splobjectstorage.valid.php * @return bool true if the iterator entry is valid, false otherwise. */ #[TentativeType] public function valid(): bool {} /** * Returns the index at which the iterator currently is * @link https://php.net/manual/en/splobjectstorage.key.php * @return int The index corresponding to the position of the iterator. */ #[TentativeType] public function key(): int {} /** * Returns the current storage entry * @link https://php.net/manual/en/splobjectstorage.current.php * @return TObject The object at the current iterator position. */ #[TentativeType] public function current(): object {} /** * Move to the next entry * @link https://php.net/manual/en/splobjectstorage.next.php * @return void */ #[TentativeType] public function next(): void {} /** * Unserializes a storage from its string representation * @link https://php.net/manual/en/splobjectstorage.unserialize.php * @param string $data

* The serialized representation of a storage. *

* @return void * @since 5.2.2 */ #[TentativeType] public function unserialize(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data): void {} /** * Serializes the storage * @link https://php.net/manual/en/splobjectstorage.serialize.php * @return string A string representing the storage. * @since 5.2.2 */ #[TentativeType] public function serialize(): string {} /** * Checks whether an object exists in the storage * @link https://php.net/manual/en/splobjectstorage.offsetexists.php * @param TObject $object

* The object to look for. *

* @return bool true if the object exists in the storage, * and false otherwise. */ #[TentativeType] public function offsetExists($object): bool {} /** * Associates data to an object in the storage * @link https://php.net/manual/en/splobjectstorage.offsetset.php * @param TObject $object

* The object to associate data with. *

* @param TValue $info [optional]

* The data to associate with the object. *

* @return void */ #[TentativeType] public function offsetSet( #[LanguageLevelTypeAware(['8.1' => 'mixed'], default: '')] $object, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $info = null ): void {} /** * Removes an object from the storage * @link https://php.net/manual/en/splobjectstorage.offsetunset.php * @param TObject $object

* The object to remove. *

* @return void */ #[TentativeType] public function offsetUnset($object): void {} /** * Returns the data associated with an object * @link https://php.net/manual/en/splobjectstorage.offsetget.php * @param TObject $object

* The object to look for. *

* @return TValue The data previously associated with the object in the storage. */ #[TentativeType] public function offsetGet($object): mixed {} /** * Calculate a unique identifier for the contained objects * @link https://php.net/manual/en/splobjectstorage.gethash.php * @param TObject $object

* object whose identifier is to be calculated. *

* @return string A string with the calculated identifier. * @since 5.4 */ #[TentativeType] public function getHash(#[LanguageLevelTypeAware(['8.0' => 'object'], default: '')] $object): string {} /** * @return array * @since 7.4 */ #[TentativeType] public function __serialize(): array {} /** * @param array $data * @since 7.4 */ #[TentativeType] public function __unserialize(array $data): void {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} /** * @since 8.4 */ public function seek(int $offset): void {} } /** * An Iterator that sequentially iterates over all attached iterators * @link https://php.net/manual/en/class.multipleiterator.php */ class MultipleIterator implements Iterator { public const MIT_NEED_ANY = 0; public const MIT_NEED_ALL = 1; public const MIT_KEYS_NUMERIC = 0; public const MIT_KEYS_ASSOC = 2; /** * Constructs a new MultipleIterator * @link https://php.net/manual/en/multipleiterator.construct.php * @param int $flags Defaults to MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_NUMERIC */ public function __construct( #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] $flags, #[PhpStormStubsElementAvailable(from: '8.0')] int $flags = MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_NUMERIC ) {} /** * Gets the flag information * @link https://php.net/manual/en/multipleiterator.getflags.php * @return int Information about the flags, as an integer. */ #[TentativeType] public function getFlags(): int {} /** * Sets flags * @link https://php.net/manual/en/multipleiterator.setflags.php * @param int $flags

* The flags to set, according to the * Flag Constants *

* @return void */ #[TentativeType] public function setFlags(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $flags): void {} /** * Attaches iterator information * @link https://php.net/manual/en/multipleiterator.attachiterator.php * @param Iterator $iterator

* The new iterator to attach. *

* @param int|string|null $info [optional]

* The associative information for the Iterator, which must be an * integer, a string, or null. *

* @return void Description... */ #[TentativeType] public function attachIterator(Iterator $iterator, #[LanguageLevelTypeAware(['8.0' => 'int|string|null'], default: '')] $info = null): void {} /** * Detaches an iterator * @link https://php.net/manual/en/multipleiterator.detachiterator.php * @param Iterator $iterator

* The iterator to detach. *

* @return void */ #[TentativeType] public function detachIterator(Iterator $iterator): void {} /** * Checks if an iterator is attached * @link https://php.net/manual/en/multipleiterator.containsiterator.php * @param Iterator $iterator

* The iterator to check. *

* @return bool true on success or false on failure. */ #[TentativeType] public function containsIterator(Iterator $iterator): bool {} /** * Gets the number of attached iterator instances * @link https://php.net/manual/en/multipleiterator.countiterators.php * @return int The number of attached iterator instances (as an integer). */ #[TentativeType] public function countIterators(): int {} /** * Rewinds all attached iterator instances * @link https://php.net/manual/en/multipleiterator.rewind.php * @return void */ #[TentativeType] public function rewind(): void {} /** * Checks the validity of sub iterators * @link https://php.net/manual/en/multipleiterator.valid.php * @return bool true if one or all sub iterators are valid depending on flags, * otherwise false */ #[TentativeType] public function valid(): bool {} /** * Gets the registered iterator instances * @link https://php.net/manual/en/multipleiterator.key.php * @return array An array of all registered iterator instances, * or false if no sub iterator is attached. */ #[TentativeType] public function key(): array {} /** * Gets the registered iterator instances * @link https://php.net/manual/en/multipleiterator.current.php * @return array An array containing the current values of each attached iterator, * or false if no iterators are attached. * @throws RuntimeException if mode MIT_NEED_ALL is set and at least one attached iterator is not valid. * @throws InvalidArgumentException if a key is NULL and MIT_KEYS_ASSOC is set. */ #[TentativeType] public function current(): array {} /** * Moves all attached iterator instances forward * @link https://php.net/manual/en/multipleiterator.next.php * @return void */ #[TentativeType] public function next(): void {} /** * @return array * @since 7.4 */ #[TentativeType] public function __debugInfo(): array {} } * Shall start recording coverage information * @return void */ function start() {} /** * (PHP >= 7.0, PECL pcov >= 1.0.0)
* Shall stop recording coverage information * @return void */ function stop() {} /** * (PHP >= 7.0, PECL pcov >= 1.0.0)
* Shall collect coverage information * @param int $type [optional]

* pcov\all shall collect coverage information for all files * pcov\inclusive shall collect coverage information for the specified files * pcov\exclusive shall collect coverage information for all but the specified files *

* @param array $filter

* path of files (realpath) that should be filtered *

* @return array */ function collect(int $type = all, array $filter = []) {} /** * (PHP >= 7.0, PECL pcov >= 1.0.0)
* Shall clear stored information * @param bool $files [optional]

* set true to clear file tables * Note: clearing the file tables may have surprising consequences *

* @return void */ function clear(bool $files = false) {} /** * (PHP >= 7.0, PECL pcov >= 1.0.0)
* Shall return list of files waiting to be collected * @return array */ function waiting() {} /** * (PHP >= 7.0, PECL pcov >= 1.0.0)
* Shall return the current size of the trace and cfg arena * @return int */ function memory() {} } . */ /** * Helper autocomplete for phpredis extension * * @author Tawana Musewe * @link https://github.com/tbtmuse/phpredis-sentinel-phpdoc */ class RedisSentinel { /** * Creates a Redis Sentinel * * @param string $host Sentinel IP address or hostname * @param int $port Sentinel Port * @param float $timeout Value in seconds (optional, default is 0 meaning unlimited) * @param string|null $persistent Persistent connection id (optional, default is null meaning not persistent) * @param int $retryInterval Value in milliseconds (optional, default is 0) * @param float $readTimeout Value in seconds (optional, default is 0 meaning unlimited) * * @example * // 1s timeout, 100ms delay between reconnection attempts. * $sentinel = new RedisSentinel('127.0.0.1', 26379, 1, null, 100); */ public function __construct( string $host, int $port, float $timeout = 0, ?string $persistent = null, int $retryInterval = 0, float $readTimeout = 0 ) {} /** * Creates a Redis Sentinel * * Accepts and array of options. * * Available options: * - 'host' => string, Sentinel IP address or hostname * - 'port' => int, Sentinel Port (optional, default is 26379) * - 'connectTimeout' => float, Value in seconds (optional, default is 0 meaning unlimited) * - 'persistent' => string, Persistent connection id (optional, default is NULL meaning not persistent) * - 'retryInterval' => int, Value in milliseconds (optional, default is 0) * - 'readTimeout' => float, Value in seconds (optional, default is 0 meaning unlimited) * - 'auth' => string|array, Authentication credentials (optional, default is NULL meaning NOAUTH) * * @param array $options Associative array of options * * @example $sentinel = new RedisSentinel(['host' => '127.0.0.1']); // default parameters * * @since >= 6.0.0 */ public function __construct(array $options) {} /** * Check if the current Sentinel configuration is able to reach the quorum needed to failover a master, and the * majority needed to authorize the failover. This command should be used in monitoring systems to check if a * Sentinel deployment is ok. * * @param string $master Name of master * * @return bool True in case of success, False in case of failure. * * @example $sentinel->ckquorum('mymaster'); * * @since >= 5.2.0 */ public function ckquorum(string $master): bool {} /** * Force a failover as if the master was not reachable, and without asking for agreement to other Sentinels * (however a new version of the configuration will be published so that the other Sentinels will update * their configurations). * * @param string $master Name of master * * @return bool True in case of success, False in case of failure. * * @example $sentinel->failover('mymaster'); * * @since >= 5.2.0 */ public function failover(string $master): bool {} /** * Force Sentinel to rewrite its configuration on disk, including the current Sentinel state. * * Normally Sentinel rewrites the configuration every time something changes in its state (in the context of the * subset of the state which is persisted on disk across restart). However sometimes it is possible that the * configuration file is lost because of operation errors, disk failures, package upgrade scripts or configuration * managers. In those cases a way to to force Sentinel to rewrite the configuration file is handy. * * This command works even if the previous configuration file is completely missing. * * @return bool True in case of success, False in case of failure. * * @example $sentinel->flushconfig(); * * @since >= 5.2.0 */ public function flushconfig(): bool {} /** * Return the ip and port number of the master with that name. If a failover is in progress or terminated * successfully for this master it returns the address and port of the promoted replica. * * @param string $master Name of master * * @return array|false ['address', 'port'] in case of success, False in case of failure. * * @example $sentinel->getMasterAddrByName('mymaster'); * * @since >= 5.2.0 */ public function getMasterAddrByName(string $master) {} /** * Return the state and info of the specified master * * @param string $master Name of master * * @return array|false Associative array with info in case of success, False in case of failure. * * @example $sentinel->master('mymaster'); * * @since >= 5.2.0 */ public function master(string $master) {} /** * Return a list of monitored masters and their state * * @return array|false Array of arrays with info for each master in case of success, FALSE in case of failure. * * @example $sentinel->masters(); * * @since >= 5.2.0 */ public function masters() {} /** * Ping the sentinel * * @return bool True in case of success, False in case of failure * * @example $sentinel->ping(); * * @since >= 5.2.0 */ public function ping(): bool {} /** * Reset all the masters with matching name. The pattern argument is a glob-style pattern. * The reset process clears any previous state in a master (including a failover in progress), and removes every * replica and sentinel already discovered and associated with the master. * * @param string $pattern Glob-style pattern * * @return bool True in case of success, False in case of failure * * @example $sentinel->reset('*'); * * @since >= 5.2.0 */ public function reset(string $pattern): bool {} /** * Return a list of sentinel instances for this master, and their state * * @param string $master Name of master * * @return array|false Array of arrays with info for each sentinel in case of success, False in case of failure * * @example $sentinel->sentinels('mymaster'); * * @since >= 5.2.0 */ public function sentinels(string $master) {} /** * Return a list of sentinel instances for this master, and their state * * @param string $master Name of master * * @return array|false Array of arrays with info for each replica in case of success, False in case of failure * * @example $sentinel->slaves('mymaster'); * * @since >= 5.2.0 */ public function slaves(string $master) {} } * @link https://github.com/zgb7mtr/phpredis_cluster_phpdoc * * @method mixed eval($script, $args = array(), $numKeys = 0) */ class RedisCluster { public const AFTER = 'after'; public const BEFORE = 'before'; /** * Options */ public const OPT_SERIALIZER = 1; public const OPT_PREFIX = 2; public const OPT_READ_TIMEOUT = 3; public const OPT_SCAN = 4; public const OPT_SLAVE_FAILOVER = 5; /** * Cluster options */ public const FAILOVER_NONE = 0; public const FAILOVER_ERROR = 1; public const FAILOVER_DISTRIBUTE = 2; public const FAILOVER_DISTRIBUTE_SLAVES = 3; /** * SCAN options */ public const SCAN_NORETRY = 0; public const SCAN_RETRY = 1; /** * @since 5.3.0 */ public const SCAN_PREFIX = 2; /** * @since 5.3.0 */ public const SCAN_NOPREFIX = 3; /** * Serializers */ public const SERIALIZER_NONE = 0; public const SERIALIZER_PHP = 1; public const SERIALIZER_IGBINARY = 2; public const SERIALIZER_MSGPACK = 3; public const SERIALIZER_JSON = 4; /** * Multi */ public const ATOMIC = 0; public const MULTI = 1; public const PIPELINE = 2; /** * Type */ public const REDIS_NOT_FOUND = 0; public const REDIS_STRING = 1; public const REDIS_SET = 2; public const REDIS_LIST = 3; public const REDIS_ZSET = 4; public const REDIS_HASH = 5; /** * Creates a Redis Cluster client * * @param string|null $name * @param array|null $seeds * @param int|float $timeout * @param int|float $readTimeout * @param bool $persistent * @param mixed $auth * @param array|null $context * @throws RedisClusterException * * @example *
     * // Declaring a cluster with an array of seeds
     * $redisCluster = new RedisCluster(null,['127.0.0.1:6379']);
     *
     * // Loading a cluster configuration by name
     * // In order to load a named array, one must first define the seed nodes in redis.ini.
     * // The following lines would define the cluster 'mycluster', and be loaded automatically by phpredis.
     *
     * // # In redis.ini
     * // redis.clusters.seeds = "mycluster[]=localhost:7000&test[]=localhost:7001"
     * // redis.clusters.timeout = "mycluster=5"
     * // redis.clusters.read_timeout = "mycluster=10"
     * // redis.clusters.auth = "mycluster=password" OR ['user' => 'foo', 'pass' => 'bar] as example
     *
     * //Then, this cluster can be loaded by doing the following
     *
     * $redisClusterPro = new RedisCluster('mycluster');
     * $redisClusterDev = new RedisCluster('test');
     * 
*/ public function __construct($name, $seeds = null, $timeout = null, $readTimeout = null, $persistent = false, $auth = null, $context = null) {} /** * Disconnects from the RedisCluster instance, except when pconnect is used. */ public function close() {} /** * Get the value related to the specified key * * @param string $key * * @return string|false If key didn't exist, FALSE is returned. Otherwise, the value related to this key is * returned. * * @link https://redis.io/commands/get * @example *
     * $redisCluster->get('key');
     * 
*/ public function get($key) {} /** * Set the string value in argument as value of the key. * * @since If you're using Redis >= 2.6.12, you can pass extended options as explained in example * * @param string $key * @param string $value * @param int|array $timeout If you pass an integer, phpredis will redirect to SETEX, and will try to use Redis * >= 2.6.12 extended options if you pass an array with valid values. * * @return bool TRUE if the command is successful. * * @link https://redis.io/commands/set * @example *
     * // Simple key -> value set
     * $redisCluster->set('key', 'value');
     *
     * // Will redirect, and actually make an SETEX call
     * $redisCluster->set('key','value', 10);
     *
     * // Will set the key, if it doesn't exist, with a ttl of 10 seconds
     * $redisCluster->set('key', 'value', Array('nx', 'ex'=>10));
     *
     * // Will set a key, if it does exist, with a ttl of 1000 milliseconds
     * $redisCluster->set('key', 'value', Array('xx', 'px'=>1000));
     * 
*/ public function set($key, $value, $timeout = null) {} /** * Returns the values of all specified keys. * * For every key that does not hold a string value or does not exist, * the special value false is returned. Because of this, the operation never fails. * * @param array $array * * @return array * * @link https://redis.io/commands/mget * @example *
     * $redisCluster->del('x', 'y', 'z', 'h');    // remove x y z
     * $redisCluster->mset(array('x' => 'a', 'y' => 'b', 'z' => 'c'));
     * $redisCluster->hset('h', 'field', 'value');
     * var_dump($redisCluster->mget(array('x', 'y', 'z', 'h')));
     * // Output:
     * // array(3) {
     * // [0]=>
     * // string(1) "a"
     * // [1]=>
     * // string(1) "b"
     * // [2]=>
     * // string(1) "c"
     * // [3]=>
     * // bool(false)
     * // }
     * 
*/ public function mget(array $array) {} /** * Sets multiple key-value pairs in one atomic command. * MSETNX only returns TRUE if all the keys were set (see SETNX). * * @param array $array Pairs: array(key => value, ...) * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/mset * @example *
     * $redisCluster->mset(array('key0' => 'value0', 'key1' => 'value1'));
     * var_dump($redisCluster->get('key0'));
     * var_dump($redisCluster->get('key1'));
     * // Output:
     * // string(6) "value0"
     * // string(6) "value1"
     * 
*/ public function mset(array $array) {} /** * @see mset() * * @param array $array * * @return int 1 (if the keys were set) or 0 (no key was set) * @link https://redis.io/commands/msetnx */ public function msetnx(array $array) {} /** * Remove specified keys. * * @param int|string|array $key1 An array of keys, or an undefined number of parameters, each a key: key1 key2 key3 * ... keyN * @param int|string ...$otherKeys * * @return int Number of keys deleted. * @link https://redis.io/commands/del * @example *
     * $redisCluster->set('key1', 'val1');
     * $redisCluster->set('key2', 'val2');
     * $redisCluster->set('key3', 'val3');
     * $redisCluster->set('key4', 'val4');
     * $redisCluster->del('key1', 'key2');          // return 2
     * $redisCluster->del(array('key3', 'key4'));   // return 2
     * 
*/ public function del($key1, ...$otherKeys) {} /** * Set the string value in argument as value of the key, with a time to live. * * @param string $key * @param int $ttl * @param mixed $value * * @return bool TRUE if the command is successful. * @link https://redis.io/commands/setex * @example *
     * $redisCluster->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.
     * 
*/ public function setex($key, $ttl, $value) {} /** * PSETEX works exactly like SETEX with the sole difference that the expire time is specified in milliseconds * instead of seconds. * * @param string $key * @param int $ttl * @param string $value * * @return bool TRUE if the command is successful. * @link https://redis.io/commands/psetex * @example *
     * $redisCluster->psetex('key', 1000, 'value'); // sets key → value, with 1s TTL.
     * 
*/ public function psetex($key, $ttl, $value) {} /** * Set the string value in argument as value of the key if the key doesn't already exist in the database. * * @param string $key * @param string $value * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/setnx * @example *
     * $redisCluster->setnx('key', 'value');   // return TRUE
     * $redisCluster->setnx('key', 'value');   // return FALSE
     * 
*/ public function setnx($key, $value) {} /** * Sets a value and returns the previous entry at that key. * * @param string $key * @param string $value * * @return string A string, the previous value located at this key. * @link https://redis.io/commands/getset * @example *
     * $redisCluster->set('x', '42');
     * $exValue = $redisCluster->getSet('x', 'lol');   // return '42', replaces x by 'lol'
     * $newValue = $redisCluster->get('x');            // return 'lol'
     * 
*/ public function getSet($key, $value) {} /** * Verify if the specified key exists. * * @param string $key * * @return bool If the key exists, return TRUE, otherwise return FALSE. * @link https://redis.io/commands/exists * @example *
     * $redisCluster->set('key', 'value');
     * $redisCluster->exists('key');               //  TRUE
     * $redisCluster->exists('NonExistingKey');    // FALSE
     * 
*/ public function exists($key) {} /** * Returns the keys that match a certain pattern. * * @param string $pattern pattern, using '*' as a wildcard. * * @return array of STRING: The keys that match a certain pattern. * @link https://redis.io/commands/keys * @example *
     * $allKeys = $redisCluster->keys('*');   // all keys will match this.
     * $keyWithUserPrefix = $redisCluster->keys('user*');
     * 
*/ public function keys($pattern) {} /** * Returns the type of data pointed by a given key. * * @param string $key * * @return int * * Depending on the type of the data pointed by the key, * this method will return the following value: * - string: RedisCluster::REDIS_STRING * - set: RedisCluster::REDIS_SET * - list: RedisCluster::REDIS_LIST * - zset: RedisCluster::REDIS_ZSET * - hash: RedisCluster::REDIS_HASH * - other: RedisCluster::REDIS_NOT_FOUND * @link https://redis.io/commands/type * @example $redisCluster->type('key'); */ public function type($key) {} /** * Returns and removes the first element of the list. * * @param string $key * * @return string|false if command executed successfully BOOL FALSE in case of failure (empty list) * @link https://redis.io/commands/lpop * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');
     * var_dump( $redisCluster->lRange('key1', 0, -1) );
     * // Output:
     * // array(3) {
     * //   [0]=> string(1) "A"
     * //   [1]=> string(1) "B"
     * //   [2]=> string(1) "C"
     * // }
     * $redisCluster->lPop('key1');
     * var_dump( $redisCluster->lRange('key1', 0, -1) );
     * // Output:
     * // array(2) {
     * //   [0]=> string(1) "B"
     * //   [1]=> string(1) "C"
     * // }
     * 
*/ public function lPop($key) {} /** * Returns and removes the last element of the list. * * @param string $key * * @return string|false if command executed successfully BOOL FALSE in case of failure (empty list) * @link https://redis.io/commands/rpop * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');
     * var_dump( $redisCluster->lRange('key1', 0, -1) );
     * // Output:
     * // array(3) {
     * //   [0]=> string(1) "A"
     * //   [1]=> string(1) "B"
     * //   [2]=> string(1) "C"
     * // }
     * $redisCluster->rPop('key1');
     * var_dump( $redisCluster->lRange('key1', 0, -1) );
     * // Output:
     * // array(2) {
     * //   [0]=> string(1) "A"
     * //   [1]=> string(1) "B"
     * // }
     * 
*/ public function rPop($key) {} /** * Set the list at index with the new value. * * @param string $key * @param int $index * @param string $value * * @return bool TRUE if the new value is setted. FALSE if the index is out of range, or data type identified by key * is not a list. * @link https://redis.io/commands/lset * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');  // key1 => [ 'A', 'B', 'C' ]
     * $redisCluster->lGet('key1', 0);     // 'A'
     * $redisCluster->lSet('key1', 0, 'X');
     * $redisCluster->lGet('key1', 0);     // 'X'
     * 
*/ public function lSet($key, $index, $value) {} /** * Removes and returns a random element from the set value at Key. * * @param string $key * * @return string "popped" value * bool FALSE if set identified by key is empty or doesn't exist. * @link https://redis.io/commands/spop * @example *
     * $redisCluster->sAdd('key1' , 'set1');
     * $redisCluster->sAdd('key1' , 'set2');
     * $redisCluster->sAdd('key1' , 'set3');
     * var_dump($redisCluster->sMembers('key1'));// 'key1' => {'set3', 'set1', 'set2'}
     * $redisCluster->sPop('key1');// 'set1'
     * var_dump($redisCluster->sMembers('key1'));// 'key1' => {'set3', 'set2'}
     * $redisCluster->sPop('key1');// 'set3',
     * var_dump($redisCluster->sMembers('key1'));// 'key1' => {'set2'}
     * 
*/ public function sPop($key) {} /** * Adds the string values to the head (left) of the list. Creates the list if the key didn't exist. * If the key exists and is not a list, FALSE is returned. * * @param string $key * @param string $value1 String, value to push in key * @param string $value2 Optional * @param string $valueN Optional * * @return int|false The new length of the list in case of success, FALSE in case of Failure. * @link https://redis.io/commands/lpush * @example *
     * $redisCluster->lPush('l', 'v1', 'v2', 'v3', 'v4')   // int(4)
     * var_dump( $redisCluster->lRange('l', 0, -1) );
     * //// Output:
     * // array(4) {
     * //   [0]=> string(2) "v4"
     * //   [1]=> string(2) "v3"
     * //   [2]=> string(2) "v2"
     * //   [3]=> string(2) "v1"
     * // }
     * 
*/ public function lPush($key, $value1, $value2 = null, $valueN = null) {} /** * Adds the string values to the tail (right) of the list. Creates the list if the key didn't exist. * If the key exists and is not a list, FALSE is returned. * * @param string $key * @param string $value1 String, value to push in key * @param string $value2 Optional * @param string $valueN Optional * * @return int|false The new length of the list in case of success, FALSE in case of Failure. * @link https://redis.io/commands/rpush * @example *
     * $redisCluster->rPush('r', 'v1', 'v2', 'v3', 'v4');    // int(4)
     * var_dump( $redisCluster->lRange('r', 0, -1) );
     * //// Output:
     * // array(4) {
     * //   [0]=> string(2) "v1"
     * //   [1]=> string(2) "v2"
     * //   [2]=> string(2) "v3"
     * //   [3]=> string(2) "v4"
     * // }
     * 
*/ public function rPush($key, $value1, $value2 = null, $valueN = null) {} /** * BLPOP is a blocking list pop primitive. * It is the blocking version of LPOP because it blocks the connection when * there are no elements to pop from any of the given lists. * An element is popped from the head of the first list that is non-empty, * with the given keys being checked in the order that they are given. * * @param array $keys Array containing the keys of the lists * Or STRING Key1 STRING Key2 STRING Key3 ... STRING Keyn * @param int $timeout Timeout * * @return array array('listName', 'element') * @link https://redis.io/commands/blpop * @example *
     * // Non blocking feature
     * $redisCluster->lPush('key1', 'A');
     * $redisCluster->del('key2');
     *
     * $redisCluster->blPop('key1', 'key2', 10); // array('key1', 'A')
     * // OR
     * $redisCluster->blPop(array('key1', 'key2'), 10); // array('key1', 'A')
     *
     * $redisCluster->brPop('key1', 'key2', 10); // array('key1', 'A')
     * // OR
     * $redisCluster->brPop(array('key1', 'key2'), 10); // array('key1', 'A')
     *
     * // Blocking feature
     *
     * // process 1
     * $redisCluster->del('key1');
     * $redisCluster->blPop('key1', 10);
     * // blocking for 10 seconds
     *
     * // process 2
     * $redisCluster->lPush('key1', 'A');
     *
     * // process 1
     * // array('key1', 'A') is returned
     * 
*/ public function blPop(array $keys, $timeout) {} /** * BRPOP is a blocking list pop primitive. * It is the blocking version of RPOP because it blocks the connection when * there are no elements to pop from any of the given lists. * An element is popped from the tail of the first list that is non-empty, * with the given keys being checked in the order that they are given. * See the BLPOP documentation(https://redis.io/commands/blpop) for the exact semantics, * since BRPOP is identical to BLPOP with the only difference being that * it pops elements from the tail of a list instead of popping from the head. * * @param array $keys Array containing the keys of the lists * Or STRING Key1 STRING Key2 STRING Key3 ... STRING Keyn * @param int $timeout Timeout * * @return array array('listName', 'element') * @link https://redis.io/commands/brpop * @example *
     * // Non blocking feature
     * $redisCluster->lPush('key1', 'A');
     * $redisCluster->del('key2');
     *
     * $redisCluster->blPop('key1', 'key2', 10); // array('key1', 'A')
     * // OR
     * $redisCluster->blPop(array('key1', 'key2'), 10); // array('key1', 'A')
     *
     * $redisCluster->brPop('key1', 'key2', 10); // array('key1', 'A')
     * // OR
     * $redisCluster->brPop(array('key1', 'key2'), 10); // array('key1', 'A')
     *
     * // Blocking feature
     *
     * // process 1
     * $redisCluster->del('key1');
     * $redisCluster->blPop('key1', 10);
     * // blocking for 10 seconds
     *
     * // process 2
     * $redisCluster->lPush('key1', 'A');
     *
     * // process 1
     * // array('key1', 'A') is returned
     * 
*/ public function brPop(array $keys, $timeout) {} /** * Adds the string value to the tail (right) of the list if the ist exists. FALSE in case of Failure. * * @param string $key * @param string $value String, value to push in key * * @return int|false The new length of the list in case of success, FALSE in case of Failure. * @link https://redis.io/commands/rpushx * @example *
     * $redisCluster->del('key1');
     * $redisCluster->rPushx('key1', 'A'); // returns 0
     * $redisCluster->rPush('key1', 'A'); // returns 1
     * $redisCluster->rPushx('key1', 'B'); // returns 2
     * $redisCluster->rPushx('key1', 'C'); // returns 3
     * // key1 now points to the following list: [ 'A', 'B', 'C' ]
     * 
*/ public function rPushx($key, $value) {} /** * Adds the string value to the head (left) of the list if the list exists. * * @param string $key * @param string $value String, value to push in key * * @return int|false The new length of the list in case of success, FALSE in case of Failure. * @link https://redis.io/commands/lpushx * @example *
     * $redisCluster->del('key1');
     * $redisCluster->lPushx('key1', 'A');     // returns 0
     * $redisCluster->lPush('key1', 'A');      // returns 1
     * $redisCluster->lPushx('key1', 'B');     // returns 2
     * $redisCluster->lPushx('key1', 'C');     // returns 3
     * // key1 now points to the following list: [ 'C', 'B', 'A' ]
     * 
*/ public function lPushx($key, $value) {} /** * Insert value in the list before or after the pivot value. the parameter options * specify the position of the insert (before or after). If the list didn't exists, * or the pivot didn't exists, the value is not inserted. * * @param string $key * @param string $position RedisCluster::BEFORE | RedisCluster::AFTER * @param string $pivot * @param string $value * * @return int The number of the elements in the list, -1 if the pivot didn't exists. * @link https://redis.io/commands/linsert * @example *
     * $redisCluster->del('key1');
     * $redisCluster->lInsert('key1', RedisCluster::AFTER, 'A', 'X');    // 0
     *
     * $redisCluster->lPush('key1', 'A');
     * $redisCluster->lPush('key1', 'B');
     * $redisCluster->lPush('key1', 'C');
     *
     * $redisCluster->lInsert('key1', RedisCluster::BEFORE, 'C', 'X');   // 4
     * $redisCluster->lRange('key1', 0, -1);                      // array('X', 'C', 'B', 'A')
     *
     * $redisCluster->lInsert('key1', RedisCluster::AFTER, 'C', 'Y');    // 5
     * $redisCluster->lRange('key1', 0, -1);                      // array('X', 'C', 'Y', 'B', 'A')
     *
     * $redisCluster->lInsert('key1', RedisCluster::AFTER, 'W', 'value'); // -1
     * 
*/ public function lInsert($key, $position, $pivot, $value) {} /** * Return the specified element of the list stored at the specified key. * 0 the first element, 1 the second ... -1 the last element, -2 the penultimate ... * Return FALSE in case of a bad index or a key that doesn't point to a list. * * @param string $key * @param int $index * * @return string|false the element at this index * Bool FALSE if the key identifies a non-string data type, or no value corresponds to this index in the list Key. * @link https://redis.io/commands/lindex * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');  // key1 => [ 'A', 'B', 'C' ]
     * $redisCluster->lGet('key1', 0);     // 'A'
     * $redisCluster->lGet('key1', -1);    // 'C'
     * $redisCluster->lGet('key1', 10);    // `FALSE`
     * 
*/ public function lIndex($key, $index) {} /** * Removes the first count occurrences of the value element from the list. * If count is zero, all the matching elements are removed. If count is negative, * elements are removed from tail to head. * * @param string $key * @param string $value * @param int $count * * @return int the number of elements to remove * bool FALSE if the value identified by key is not a list. * @link https://redis.io/commands/lrem * @example *
     * $redisCluster->lPush('key1', 'A');
     * $redisCluster->lPush('key1', 'B');
     * $redisCluster->lPush('key1', 'C');
     * $redisCluster->lPush('key1', 'A');
     * $redisCluster->lPush('key1', 'A');
     *
     * $redisCluster->lRange('key1', 0, -1);   // array('A', 'A', 'C', 'B', 'A')
     * $redisCluster->lRem('key1', 'A', 2);    // 2
     * $redisCluster->lRange('key1', 0, -1);   // array('C', 'B', 'A')
     * 
*/ public function lRem($key, $value, $count) {} /** * A blocking version of rpoplpush, with an integral timeout in the third parameter. * * @param string $srcKey * @param string $dstKey * @param int $timeout * * @return string|false The element that was moved in case of success, FALSE in case of timeout. * @link https://redis.io/commands/brpoplpush */ public function brpoplpush($srcKey, $dstKey, $timeout) {} /** * Pops a value from the tail of a list, and pushes it to the front of another list. * Also return this value. * * @since redis >= 1.2 * * @param string $srcKey * @param string $dstKey * * @return string|false The element that was moved in case of success, FALSE in case of failure. * @link https://redis.io/commands/rpoplpush * @example *
     * $redisCluster->del('x', 'y');
     *
     * $redisCluster->lPush('x', 'abc');
     * $redisCluster->lPush('x', 'def');
     * $redisCluster->lPush('y', '123');
     * $redisCluster->lPush('y', '456');
     *
     * // move the last of x to the front of y.
     * var_dump($redisCluster->rpoplpush('x', 'y'));
     * var_dump($redisCluster->lRange('x', 0, -1));
     * var_dump($redisCluster->lRange('y', 0, -1));
     *
     * ////Output:
     * //
     * //string(3) "abc"
     * //array(1) {
     * //  [0]=>
     * //  string(3) "def"
     * //}
     * //array(3) {
     * //  [0]=>
     * //  string(3) "abc"
     * //  [1]=>
     * //  string(3) "456"
     * //  [2]=>
     * //  string(3) "123"
     * //}
     * 
*/ public function rpoplpush($srcKey, $dstKey) {} /** * Returns the size of a list identified by Key. If the list didn't exist or is empty, * the command returns 0. If the data type identified by Key is not a list, the command return FALSE. * * @param string $key * * @return int The size of the list identified by Key exists. * bool FALSE if the data type identified by Key is not list * @link https://redis.io/commands/llen * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');  // key1 => [ 'A', 'B', 'C' ]
     * $redisCluster->lLen('key1');       // 3
     * $redisCluster->rPop('key1');
     * $redisCluster->lLen('key1');       // 2
     * 
*/ public function lLen($key) {} /** * Returns the set cardinality (number of elements) of the set stored at key. * * @param string $key * * @return int the cardinality (number of elements) of the set, or 0 if key does not exist. * @link https://redis.io/commands/scard * @example *
     * $redisCluster->sAdd('key1' , 'set1');
     * $redisCluster->sAdd('key1' , 'set2');
     * $redisCluster->sAdd('key1' , 'set3');   // 'key1' => {'set1', 'set2', 'set3'}
     * $redisCluster->sCard('key1');           // 3
     * $redisCluster->sCard('keyX');           // 0
     * 
*/ public function sCard($key) {} /** * Returns all the members of the set value stored at key. * This has the same effect as running SINTER with one argument key. * * @param string $key * * @return array All elements of the set. * @link https://redis.io/commands/smembers * @example *
     * $redisCluster->del('s');
     * $redisCluster->sAdd('s', 'a');
     * $redisCluster->sAdd('s', 'b');
     * $redisCluster->sAdd('s', 'a');
     * $redisCluster->sAdd('s', 'c');
     * var_dump($redisCluster->sMembers('s'));
     *
     * ////Output:
     * //
     * //array(3) {
     * //  [0]=>
     * //  string(1) "b"
     * //  [1]=>
     * //  string(1) "c"
     * //  [2]=>
     * //  string(1) "a"
     * //}
     * // The order is random and corresponds to redis' own internal representation of the set structure.
     * 
*/ public function sMembers($key) {} /** * Returns if member is a member of the set stored at key. * * @param string $key * @param string $value * * @return bool TRUE if value is a member of the set at key key, FALSE otherwise. * @link https://redis.io/commands/sismember * @example *
     * $redisCluster->sAdd('key1' , 'set1');
     * $redisCluster->sAdd('key1' , 'set2');
     * $redisCluster->sAdd('key1' , 'set3'); // 'key1' => {'set1', 'set2', 'set3'}
     *
     * $redisCluster->sIsMember('key1', 'set1'); // TRUE
     * $redisCluster->sIsMember('key1', 'setX'); // FALSE
     * 
*/ public function sIsMember($key, $value) {} /** * Adds a values to the set value stored at key. * If this value is already in the set, FALSE is returned. * * @param string $key Required key * @param mixed $value1 Required value * @param mixed $value2 Optional value * @param mixed $valueN Optional value * * @return int|false The number of elements added to the set * @link https://redis.io/commands/sadd * @example *
     * $redisCluster->sAdd('k', 'v1');                // int(1)
     * $redisCluster->sAdd('k', 'v1', 'v2', 'v3');    // int(2)
     * 
*/ public function sAdd($key, $value1, $value2 = null, $valueN = null) {} /** * Adds a values to the set value stored at key. * If this value is already in the set, FALSE is returned. * * @param string $key Required key * @param array $valueArray * * @return int|false The number of elements added to the set * @example *
     * $redisCluster->sAddArray('k', ['v1', 'v2', 'v3']);
     * //This is a feature in php only. Same as $redisCluster->sAdd('k', 'v1', 'v2', 'v3');
     * 
*/ public function sAddArray($key, array $valueArray) {} /** * Removes the specified members from the set value stored at key. * * @param string $key * @param string $member1 * @param string $member2 * @param string $memberN * * @return int The number of elements removed from the set. * @link https://redis.io/commands/srem * @example *
     * var_dump( $redisCluster->sAdd('k', 'v1', 'v2', 'v3') );    // int(3)
     * var_dump( $redisCluster->sRem('k', 'v2', 'v3') );          // int(2)
     * var_dump( $redisCluster->sMembers('k') );
     * //// Output:
     * // array(1) {
     * //   [0]=> string(2) "v1"
     * // }
     * 
*/ public function sRem($key, $member1, $member2 = null, $memberN = null) {} /** * Performs the union between N sets and returns it. * * @param string $key1 Any number of keys corresponding to sets in redis. * @param string $key2 ... * @param string $keyN ... * * @return array of strings: The union of all these sets. * @link https://redis.io/commands/sunionstore * @example *
     * $redisCluster->del('s0', 's1', 's2');
     *
     * $redisCluster->sAdd('s0', '1');
     * $redisCluster->sAdd('s0', '2');
     * $redisCluster->sAdd('s1', '3');
     * $redisCluster->sAdd('s1', '1');
     * $redisCluster->sAdd('s2', '3');
     * $redisCluster->sAdd('s2', '4');
     *
     * var_dump($redisCluster->sUnion('s0', 's1', 's2'));
     *
     * //// Output:
     * //
     * //array(4) {
     * //  [0]=>
     * //  string(1) "3"
     * //  [1]=>
     * //  string(1) "4"
     * //  [2]=>
     * //  string(1) "1"
     * //  [3]=>
     * //  string(1) "2"
     * //}
     * 
*/ public function sUnion($key1, $key2, $keyN = null) {} /** * Performs the same action as sUnion, but stores the result in the first key * * @param string $dstKey the key to store the diff into. * @param string $key1 Any number of keys corresponding to sets in redis. * @param string $key2 ... * @param string $keyN ... * * @return int Any number of keys corresponding to sets in redis. * @link https://redis.io/commands/sunionstore * @example *
     * $redisCluster->del('s0', 's1', 's2');
     *
     * $redisCluster->sAdd('s0', '1');
     * $redisCluster->sAdd('s0', '2');
     * $redisCluster->sAdd('s1', '3');
     * $redisCluster->sAdd('s1', '1');
     * $redisCluster->sAdd('s2', '3');
     * $redisCluster->sAdd('s2', '4');
     *
     * var_dump($redisCluster->sUnionStore('dst', 's0', 's1', 's2'));
     * var_dump($redisCluster->sMembers('dst'));
     *
     * //// Output:
     * //
     * //int(4)
     * //array(4) {
     * //  [0]=>
     * //  string(1) "3"
     * //  [1]=>
     * //  string(1) "4"
     * //  [2]=>
     * //  string(1) "1"
     * //  [3]=>
     * //  string(1) "2"
     * //}
     * 
*/ public function sUnionStore($dstKey, $key1, $key2, $keyN = null) {} /** * Returns the members of a set resulting from the intersection of all the sets * held at the specified keys. If just a single key is specified, then this command * produces the members of this set. If one of the keys is missing, FALSE is returned. * * @param string $key1 keys identifying the different sets on which we will apply the intersection. * @param string $key2 ... * @param string $keyN ... * * @return array contain the result of the intersection between those keys. * If the intersection between the different sets is empty, the return value will be empty array. * @link https://redis.io/commands/sinterstore * @example *
     * $redisCluster->sAdd('key1', 'val1');
     * $redisCluster->sAdd('key1', 'val2');
     * $redisCluster->sAdd('key1', 'val3');
     * $redisCluster->sAdd('key1', 'val4');
     *
     * $redisCluster->sAdd('key2', 'val3');
     * $redisCluster->sAdd('key2', 'val4');
     *
     * $redisCluster->sAdd('key3', 'val3');
     * $redisCluster->sAdd('key3', 'val4');
     *
     * var_dump($redisCluster->sInter('key1', 'key2', 'key3'));
     *
     * // Output:
     * //
     * //array(2) {
     * //  [0]=>
     * //  string(4) "val4"
     * //  [1]=>
     * //  string(4) "val3"
     * //}
     * 
*/ public function sInter($key1, $key2, $keyN = null) {} /** * Performs a sInter command and stores the result in a new set. * * @param string $dstKey the key to store the diff into. * @param string $key1 are intersected as in sInter. * @param string $key2 ... * @param string $keyN ... * * @return int|false The cardinality of the resulting set, or FALSE in case of a missing key. * @link https://redis.io/commands/sinterstore * @example *
     * $redisCluster->sAdd('key1', 'val1');
     * $redisCluster->sAdd('key1', 'val2');
     * $redisCluster->sAdd('key1', 'val3');
     * $redisCluster->sAdd('key1', 'val4');
     *
     * $redisCluster->sAdd('key2', 'val3');
     * $redisCluster->sAdd('key2', 'val4');
     *
     * $redisCluster->sAdd('key3', 'val3');
     * $redisCluster->sAdd('key3', 'val4');
     *
     * var_dump($redisCluster->sInterStore('output', 'key1', 'key2', 'key3'));
     * var_dump($redisCluster->sMembers('output'));
     *
     * //// Output:
     * //
     * //int(2)
     * //array(2) {
     * //  [0]=>
     * //  string(4) "val4"
     * //  [1]=>
     * //  string(4) "val3"
     * //}
     * 
*/ public function sInterStore($dstKey, $key1, $key2, $keyN = null) {} /** * Performs the difference between N sets and returns it. * * @param string $key1 Any number of keys corresponding to sets in redis. * @param string $key2 ... * @param string $keyN ... * * @return array of strings: The difference of the first set will all the others. * @link https://redis.io/commands/sdiff * @example *
     * $redisCluster->del('s0', 's1', 's2');
     *
     * $redisCluster->sAdd('s0', '1');
     * $redisCluster->sAdd('s0', '2');
     * $redisCluster->sAdd('s0', '3');
     * $redisCluster->sAdd('s0', '4');
     *
     * $redisCluster->sAdd('s1', '1');
     * $redisCluster->sAdd('s2', '3');
     *
     * var_dump($redisCluster->sDiff('s0', 's1', 's2'));
     *
     * //// Output:
     * //
     * //array(2) {
     * //  [0]=>
     * //  string(1) "4"
     * //  [1]=>
     * //  string(1) "2"
     * //}
     * 
*/ public function sDiff($key1, $key2, $keyN = null) {} /** * Performs the same action as sDiff, but stores the result in the first key * * @param string $dstKey the key to store the diff into. * @param string $key1 Any number of keys corresponding to sets in redis * @param string $key2 ... * @param string $keyN ... * * @return int|false The cardinality of the resulting set, or FALSE in case of a missing key. * @link https://redis.io/commands/sdiffstore * @example *
     * $redisCluster->del('s0', 's1', 's2');
     *
     * $redisCluster->sAdd('s0', '1');
     * $redisCluster->sAdd('s0', '2');
     * $redisCluster->sAdd('s0', '3');
     * $redisCluster->sAdd('s0', '4');
     *
     * $redisCluster->sAdd('s1', '1');
     * $redisCluster->sAdd('s2', '3');
     *
     * var_dump($redisCluster->sDiffStore('dst', 's0', 's1', 's2'));
     * var_dump($redisCluster->sMembers('dst'));
     *
     * //// Output:
     * //
     * //int(2)
     * //array(2) {
     * //  [0]=>
     * //  string(1) "4"
     * //  [1]=>
     * //  string(1) "2"
     * //}
     * 
*/ public function sDiffStore($dstKey, $key1, $key2, $keyN = null) {} /** * Returns a random element(s) from the set value at Key, without removing it. * * @param string $key * @param int $count [optional] * * @return string|array value(s) from the set * bool FALSE if set identified by key is empty or doesn't exist and count argument isn't passed. * @link https://redis.io/commands/srandmember * @example *
     * $redisCluster->sAdd('key1' , 'one');
     * $redisCluster->sAdd('key1' , 'two');
     * $redisCluster->sAdd('key1' , 'three');              // 'key1' => {'one', 'two', 'three'}
     *
     * var_dump( $redisCluster->sRandMember('key1') );     // 'key1' => {'one', 'two', 'three'}
     *
     * // string(5) "three"
     *
     * var_dump( $redisCluster->sRandMember('key1', 2) );  // 'key1' => {'one', 'two', 'three'}
     *
     * // array(2) {
     * //   [0]=> string(2) "one"
     * //   [1]=> string(2) "three"
     * // }
     * 
*/ public function sRandMember($key, $count = null) {} /** * Get the length of a string value. * * @param string $key * * @return int * @link https://redis.io/commands/strlen * @example *
     * $redisCluster->set('key', 'value');
     * $redisCluster->strlen('key'); // 5
     * 
*/ public function strlen($key) {} /** * Remove the expiration timer from a key. * * @param string $key * * @return bool TRUE if a timeout was removed, FALSE if the key didn’t exist or didn’t have an expiration timer. * @link https://redis.io/commands/persist * @example $redisCluster->persist('key'); */ public function persist($key) {} /** * Returns the remaining time to live of a key that has a timeout. * This introspection capability allows a Redis client to check how many seconds a given key will continue to be * part of the dataset. In Redis 2.6 or older the command returns -1 if the key does not exist or if the key exist * but has no associated expire. Starting with Redis 2.8 the return value in case of error changed: Returns -2 if * the key does not exist. Returns -1 if the key exists but has no associated expire. * * @param string $key * * @return int the time left to live in seconds. * @link https://redis.io/commands/ttl * @example $redisCluster->ttl('key'); */ public function ttl($key) {} /** * Returns the remaining time to live of a key that has an expire set, * with the sole difference that TTL returns the amount of remaining time in seconds while PTTL returns it in * milliseconds. In Redis 2.6 or older the command returns -1 if the key does not exist or if the key exist but has * no associated expire. Starting with Redis 2.8 the return value in case of error changed: Returns -2 if the key * does not exist. Returns -1 if the key exists but has no associated expire. * * @param string $key * * @return int the time left to live in milliseconds. * @link https://redis.io/commands/pttl * @example $redisCluster->pttl('key'); */ public function pttl($key) {} /** * Returns the cardinality of an ordered set. * * @param string $key * * @return int the set's cardinality * @link https://redis.io/commands/zsize * @example *
     * $redisCluster->zAdd('key', 0, 'val0');
     * $redisCluster->zAdd('key', 2, 'val2');
     * $redisCluster->zAdd('key', 10, 'val10');
     * $redisCluster->zCard('key');            // 3
     * 
*/ public function zCard($key) {} /** * Returns the number of elements of the sorted set stored at the specified key which have * scores in the range [start,end]. Adding a parenthesis before start or end excludes it * from the range. +inf and -inf are also valid limits. * * @param string $key * @param string $start * @param string $end * * @return int the size of a corresponding zRangeByScore. * @link https://redis.io/commands/zcount * @example *
     * $redisCluster->zAdd('key', 0, 'val0');
     * $redisCluster->zAdd('key', 2, 'val2');
     * $redisCluster->zAdd('key', 10, 'val10');
     * $redisCluster->zCount('key', 0, 3); // 2, corresponding to array('val0', 'val2')
     * 
*/ public function zCount($key, $start, $end) {} /** * Deletes the elements of the sorted set stored at the specified key which have scores in the range [start,end]. * * @param string $key * @param string $start double or "+inf" or "-inf" as a string * @param string $end double or "+inf" or "-inf" as a string * * @return int The number of values deleted from the sorted set * @link https://redis.io/commands/zremrangebyscore * @example *
     * $redisCluster->zAdd('key', 0, 'val0');
     * $redisCluster->zAdd('key', 2, 'val2');
     * $redisCluster->zAdd('key', 10, 'val10');
     * $redisCluster->zRemRangeByScore('key', '0', '3'); // 2
     * 
*/ public function zRemRangeByScore($key, $start, $end) {} /** * Returns the score of a given member in the specified sorted set. * * @param string $key * @param string $member * * @return float * @link https://redis.io/commands/zscore * @example *
     * $redisCluster->zAdd('key', 2.5, 'val2');
     * $redisCluster->zScore('key', 'val2'); // 2.5
     * 
*/ public function zScore($key, $member) {} /** * Adds the specified member with a given score to the sorted set stored at key. * * @param string $key Required key * @param float $score1 Required score * @param string $value1 Required value * @param float $score2 Optional score * @param string $value2 Optional value * @param float $scoreN Optional score * @param string $valueN Optional value * * @return int Number of values added * @link https://redis.io/commands/zadd * @example *
     * $redisCluster->zAdd('z', 1, 'v2', 2, 'v2', 3, 'v3', 4, 'v4' );  // int(3)
     * $redisCluster->zRem('z', 'v2', 'v3');                           // int(2)
     * var_dump( $redisCluster->zRange('z', 0, -1) );
     *
     * //// Output:
     * // array(1) {
     * //   [0]=> string(2) "v4"
     * // }
     * 
*/ public function zAdd($key, $score1, $value1, $score2 = null, $value2 = null, $scoreN = null, $valueN = null) {} /** * Increments the score of a member from a sorted set by a given amount. * * @param string $key * @param float $value (double) value that will be added to the member's score * @param string $member * * @return float the new value * @link https://redis.io/commands/zincrby * @example *
     * $redisCluster->del('key');
     * $redisCluster->zIncrBy('key', 2.5, 'member1');// key or member1 didn't exist, so member1's score is to 0 ;
     *                                              //before the increment and now has the value 2.5
     * $redisCluster->zIncrBy('key', 1, 'member1');    // 3.5
     * 
*/ public function zIncrBy($key, $value, $member) {} /** * Returns the length of a hash, in number of items * * @param string $key * * @return int|false the number of items in a hash, FALSE if the key doesn't exist or isn't a hash. * @link https://redis.io/commands/hlen * @example *
     * $redisCluster->del('h');
     * $redisCluster->hSet('h', 'key1', 'hello');
     * $redisCluster->hSet('h', 'key2', 'plop');
     * $redisCluster->hLen('h'); // returns 2
     * 
*/ public function hLen($key) {} /** * Returns the keys in a hash, as an array of strings. * * @param string $key * * @return array An array of elements, the keys of the hash. This works like PHP's array_keys(). * @link https://redis.io/commands/hkeys * @example *
     * $redisCluster->del('h');
     * $redisCluster->hSet('h', 'a', 'x');
     * $redisCluster->hSet('h', 'b', 'y');
     * $redisCluster->hSet('h', 'c', 'z');
     * $redisCluster->hSet('h', 'd', 't');
     * var_dump($redisCluster->hKeys('h'));
     *
     * //// Output:
     * //
     * // array(4) {
     * // [0]=>
     * // string(1) "a"
     * // [1]=>
     * // string(1) "b"
     * // [2]=>
     * // string(1) "c"
     * // [3]=>
     * // string(1) "d"
     * // }
     * // The order is random and corresponds to redis' own internal representation of the set structure.
     * 
*/ public function hKeys($key) {} /** * Returns the values in a hash, as an array of strings. * * @param string $key * * @return array An array of elements, the values of the hash. This works like PHP's array_values(). * @link https://redis.io/commands/hvals * @example *
     * $redisCluster->del('h');
     * $redisCluster->hSet('h', 'a', 'x');
     * $redisCluster->hSet('h', 'b', 'y');
     * $redisCluster->hSet('h', 'c', 'z');
     * $redisCluster->hSet('h', 'd', 't');
     * var_dump($redisCluster->hVals('h'));
     *
     * //// Output:
     * //
     * // array(4) {
     * //   [0]=>
     * //   string(1) "x"
     * //   [1]=>
     * //   string(1) "y"
     * //   [2]=>
     * //   string(1) "z"
     * //   [3]=>
     * //   string(1) "t"
     * // }
     * // The order is random and corresponds to redis' own internal representation of the set structure.
     * 
*/ public function hVals($key) {} /** * Gets a value from the hash stored at key. * If the hash table doesn't exist, or the key doesn't exist, FALSE is returned. * * @param string $key * @param string $hashKey * * @return string|false The value, if the command executed successfully BOOL FALSE in case of failure * @link https://redis.io/commands/hget * @example *
     * $redisCluster->del('h');
     * $redisCluster->hSet('h', 'a', 'x');
     * $redisCluster->hGet('h', 'a'); // 'X'
     * 
*/ public function hGet($key, $hashKey) {} /** * Returns the whole hash, as an array of strings indexed by strings. * * @param string $key * * @return array An array of elements, the contents of the hash. * @link https://redis.io/commands/hgetall * @example *
     * $redisCluster->del('h');
     * $redisCluster->hSet('h', 'a', 'x');
     * $redisCluster->hSet('h', 'b', 'y');
     * $redisCluster->hSet('h', 'c', 'z');
     * $redisCluster->hSet('h', 'd', 't');
     * var_dump($redisCluster->hGetAll('h'));
     *
     * //// Output:
     * //
     * // array(4) {
     * //   ["a"]=>
     * //   string(1) "x"
     * //   ["b"]=>
     * //   string(1) "y"
     * //   ["c"]=>
     * //   string(1) "z"
     * //   ["d"]=>
     * //   string(1) "t"
     * // }
     * // The order is random and corresponds to redis' own internal representation of the set structure.
     * 
*/ public function hGetAll($key) {} /** * Verify if the specified member exists in a key. * * @param string $key * @param string $hashKey * * @return bool If the member exists in the hash table, return TRUE, otherwise return FALSE. * @link https://redis.io/commands/hexists * @example *
     * $redisCluster->hSet('h', 'a', 'x');
     * $redisCluster->hExists('h', 'a');               //  TRUE
     * $redisCluster->hExists('h', 'NonExistingKey');  // FALSE
     * 
*/ public function hExists($key, $hashKey) {} /** * Increments the value of a member from a hash by a given amount. * * @param string $key * @param string $hashKey * @param int $value (integer) value that will be added to the member's value * * @return int the new value * @link https://redis.io/commands/hincrby * @example *
     * $redisCluster->del('h');
     * $redisCluster->hIncrBy('h', 'x', 2); // returns 2: h[x] = 2 now.
     * $redisCluster->hIncrBy('h', 'x', 1); // h[x] ← 2 + 1. Returns 3
     * 
*/ public function hIncrBy($key, $hashKey, $value) {} /** * Adds a value to the hash stored at key. If this value is already in the hash, FALSE is returned. * * @param string $key * @param string $hashKey * @param mixed $value * * @return int * 1 if value didn't exist and was added successfully, * 0 if the value was already present and was replaced, FALSE if there was an error. * @link https://redis.io/commands/hset * @example *
     * $redisCluster->del('h')
     * $redisCluster->hSet('h', 'key1', 'hello');  // 1, 'key1' => 'hello' in the hash at "h"
     * $redisCluster->hGet('h', 'key1');           // returns "hello"
     *
     * $redisCluster->hSet('h', 'key1', 'plop');   // 0, value was replaced.
     * $redisCluster->hGet('h', 'key1');           // returns "plop"
     * 
*/ public function hSet($key, $hashKey, $value) {} /** * Adds a value to the hash stored at key only if this field isn't already in the hash. * * @param string $key * @param string $hashKey * @param string $value * * @return bool TRUE if the field was set, FALSE if it was already present. * @link https://redis.io/commands/hsetnx * @example *
     * $redisCluster->del('h')
     * $redisCluster->hSetNx('h', 'key1', 'hello'); // TRUE, 'key1' => 'hello' in the hash at "h"
     * $redisCluster->hSetNx('h', 'key1', 'world'); // FALSE, 'key1' => 'hello' in the hash at "h". No change since the
     * field wasn't replaced.
     * 
*/ public function hSetNx($key, $hashKey, $value) {} /** * Retrieve the values associated to the specified fields in the hash. * * @param string $key * @param array $hashKeys * * @return array Array An array of elements, the values of the specified fields in the hash, * with the hash keys as array keys. * @link https://redis.io/commands/hmget * @example *
     * $redisCluster->del('h');
     * $redisCluster->hSet('h', 'field1', 'value1');
     * $redisCluster->hSet('h', 'field2', 'value2');
     * $redisCluster->hMGet('h', array('field1', 'field2')); // returns array('field1' => 'value1', 'field2' =>
     * 'value2')
     * 
*/ public function hMGet($key, $hashKeys) {} /** * Fills in a whole hash. Non-string values are converted to string, using the standard (string) cast. * NULL values are stored as empty strings * * @param string $key * @param array $hashKeys key → value array * * @return bool * @link https://redis.io/commands/hmset * @example *
     * $redisCluster->del('user:1');
     * $redisCluster->hMSet('user:1', array('name' => 'Joe', 'salary' => 2000));
     * $redisCluster->hIncrBy('user:1', 'salary', 100); // Joe earns 100 more now.
     * 
*/ public function hMSet($key, $hashKeys) {} /** * Removes a values from the hash stored at key. * If the hash table doesn't exist, or the key doesn't exist, FALSE is returned. * * @param string $key * @param string $hashKey1 * @param string $hashKey2 * @param string $hashKeyN * * @return int Number of deleted fields * @link https://redis.io/commands/hdel * @example *
     * $redisCluster->hMSet('h',
     *               array(
     *                    'f1' => 'v1',
     *                    'f2' => 'v2',
     *                    'f3' => 'v3',
     *                    'f4' => 'v4',
     *               ));
     *
     * var_dump( $redisCluster->hDel('h', 'f1') );        // int(1)
     * var_dump( $redisCluster->hDel('h', 'f2', 'f3') );  // int(2)
     *
     * var_dump( $redisCluster->hGetAll('h') );
     *
     * //// Output:
     * //
     * //  array(1) {
     * //    ["f4"]=> string(2) "v4"
     * //  }
     * 
*/ public function hDel($key, $hashKey1, $hashKey2 = null, $hashKeyN = null) {} /** * Increment the float value of a hash field by the given amount * * @param string $key * @param string $field * @param float $increment * * @return float * @link https://redis.io/commands/hincrbyfloat * @example *
     * $redisCluster->hset('h', 'float', 3);
     * $redisCluster->hset('h', 'int',   3);
     * var_dump( $redisCluster->hIncrByFloat('h', 'float', 1.5) ); // float(4.5)
     *
     * var_dump( $redisCluster->hGetAll('h') );
     *
     * //// Output:
     * //
     * // array(2) {
     * //   ["float"]=>
     * //   string(3) "4.5"
     * //   ["int"]=>
     * //   string(1) "3"
     * // }
     * 
*/ public function hIncrByFloat($key, $field, $increment) {} /** * Dump a key out of a redis database, the value of which can later be passed into redis using the RESTORE command. * The data that comes out of DUMP is a binary representation of the key as Redis stores it. * * @param string $key * * @return string|false The Redis encoded value of the key, or FALSE if the key doesn't exist * @link https://redis.io/commands/dump * @example *
     * $redisCluster->set('foo', 'bar');
     * $val = $redisCluster->dump('foo'); // $val will be the Redis encoded key value
     * 
*/ public function dump($key) {} /** * Returns the rank of a given member in the specified sorted set, starting at 0 for the item * with the smallest score. zRevRank starts at 0 for the item with the largest score. * * @param string $key * @param string $member * * @return int the item's score. * @link https://redis.io/commands/zrank * @example *
     * $redisCluster->del('z');
     * $redisCluster->zAdd('key', 1, 'one');
     * $redisCluster->zAdd('key', 2, 'two');
     * $redisCluster->zRank('key', 'one');     // 0
     * $redisCluster->zRank('key', 'two');     // 1
     * $redisCluster->zRevRank('key', 'one');  // 1
     * $redisCluster->zRevRank('key', 'two');  // 0
     * 
*/ public function zRank($key, $member) {} /** * @see zRank() * * @param string $key * @param string $member * * @return int the item's score * @link https://redis.io/commands/zrevrank */ public function zRevRank($key, $member) {} /** * Increment the number stored at key by one. * * @param string $key * * @return int the new value * @link https://redis.io/commands/incr * @example *
     * $redisCluster->incr('key1'); // key1 didn't exists, set to 0 before the increment and now has the value 1
     * $redisCluster->incr('key1'); // 2
     * $redisCluster->incr('key1'); // 3
     * $redisCluster->incr('key1'); // 4
     * 
*/ public function incr($key) {} /** * Decrement the number stored at key by one. * * @param string $key * * @return int the new value * @link https://redis.io/commands/decr * @example *
     * $redisCluster->decr('key1'); // key1 didn't exists, set to 0 before the increment and now has the value -1
     * $redisCluster->decr('key1'); // -2
     * $redisCluster->decr('key1'); // -3
     * 
*/ public function decr($key) {} /** * Increment the number stored at key by one. If the second argument is filled, it will be used as the integer * value of the increment. * * @param string $key key * @param int $value value that will be added to key (only for incrBy) * * @return int the new value * @link https://redis.io/commands/incrby * @example *
     * $redisCluster->incr('key1');        // key1 didn't exists, set to 0 before the increment and now has the value 1
     * $redisCluster->incr('key1');        // 2
     * $redisCluster->incr('key1');        // 3
     * $redisCluster->incr('key1');        // 4
     * $redisCluster->incrBy('key1', 10);  // 14
     * 
*/ public function incrBy($key, $value) {} /** * Decrement the number stored at key by one. If the second argument is filled, it will be used as the integer * value of the decrement. * * @param string $key * @param int $value that will be subtracted to key (only for decrBy) * * @return int the new value * @link https://redis.io/commands/decrby * @example *
     * $redisCluster->decr('key1');        // key1 didn't exists, set to 0 before the increment and now has the value -1
     * $redisCluster->decr('key1');        // -2
     * $redisCluster->decr('key1');        // -3
     * $redisCluster->decrBy('key1', 10);  // -13
     * 
*/ public function decrBy($key, $value) {} /** * Increment the float value of a key by the given amount * * @param string $key * @param float $increment * * @return float * @link https://redis.io/commands/incrbyfloat * @example *
     * $redisCluster->set('x', 3);
     * var_dump( $redisCluster->incrByFloat('x', 1.5) );   // float(4.5)
     *
     * var_dump( $redisCluster->get('x') );                // string(3) "4.5"
     * 
*/ public function incrByFloat($key, $increment) {} /** * Sets an expiration date (a timeout) on an item. * * @param string $key The key that will disappear. * @param int $ttl The key's remaining Time To Live, in seconds. * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/expire * @example *
     * $redisCluster->set('x', '42');
     * $redisCluster->expire('x', 3);  // x will disappear in 3 seconds.
     * sleep(5);                    // wait 5 seconds
     * $redisCluster->get('x');            // will return `FALSE`, as 'x' has expired.
     * 
*/ public function expire($key, $ttl) {} /** * Sets an expiration date (a timeout in milliseconds) on an item. * * @param string $key The key that will disappear. * @param int $ttl The key's remaining Time To Live, in milliseconds. * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/pexpire * @example *
     * $redisCluster->set('x', '42');
     * $redisCluster->pExpire('x', 11500); // x will disappear in 11500 milliseconds.
     * $redisCluster->ttl('x');            // 12
     * $redisCluster->pttl('x');           // 11500
     * 
*/ public function pExpire($key, $ttl) {} /** * Sets an expiration date (a timestamp) on an item. * * @param string $key The key that will disappear. * @param int $timestamp Unix timestamp. The key's date of death, in seconds from Epoch time. * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/expireat * @example *
     * $redisCluster->set('x', '42');
     * $now = time();               // current timestamp
     * $redisCluster->expireAt('x', $now + 3); // x will disappear in 3 seconds.
     * sleep(5);                        // wait 5 seconds
     * $redisCluster->get('x');                // will return `FALSE`, as 'x' has expired.
     * 
*/ public function expireAt($key, $timestamp) {} /** * Sets an expiration date (a timestamp) on an item. Requires a timestamp in milliseconds * * @param string $key The key that will disappear. * @param int $timestamp Unix timestamp. The key's date of death, in seconds from Epoch time. * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/pexpireat * @example *
     * $redisCluster->set('x', '42');
     * $redisCluster->pExpireAt('x', 1555555555005);
     * $redisCluster->ttl('x');                       // 218270121
     * $redisCluster->pttl('x');                      // 218270120575
     * 
*/ public function pExpireAt($key, $timestamp) {} /** * Append specified string to the string stored in specified key. * * @param string $key * @param string $value * * @return int Size of the value after the append * @link https://redis.io/commands/append * @example *
     * $redisCluster->set('key', 'value1');
     * $redisCluster->append('key', 'value2'); // 12
     * $redisCluster->get('key');              // 'value1value2'
     * 
*/ public function append($key, $value) {} /** * Return a single bit out of a larger string * * @param string $key * @param int $offset * * @return int the bit value (0 or 1) * @link https://redis.io/commands/getbit * @example *
     * $redisCluster->set('key', "\x7f");  // this is 0111 1111
     * $redisCluster->getBit('key', 0);    // 0
     * $redisCluster->getBit('key', 1);    // 1
     * 
*/ public function getBit($key, $offset) {} /** * Changes a single bit of a string. * * @param string $key * @param int $offset * @param bool|int $value bool or int (1 or 0) * * @return int 0 or 1, the value of the bit before it was set. * @link https://redis.io/commands/setbit * @example *
     * $redisCluster->set('key', "*");     // ord("*") = 42 = 0x2f = "0010 1010"
     * $redisCluster->setBit('key', 5, 1); // returns 0
     * $redisCluster->setBit('key', 7, 1); // returns 0
     * $redisCluster->get('key');          // chr(0x2f) = "/" = b("0010 1111")
     * 
*/ public function setBit($key, $offset, $value) {} /** * Bitwise operation on multiple keys. * * @param string $operation either "AND", "OR", "NOT", "XOR" * @param string $retKey return key * @param string $key1 * @param string $key2 * @param string $key3 * * @return int The size of the string stored in the destination key. * @link https://redis.io/commands/bitop * @example *
     * $redisCluster->set('bit1', '1'); // 11 0001
     * $redisCluster->set('bit2', '2'); // 11 0010
     *
     * $redisCluster->bitOp('AND', 'bit', 'bit1', 'bit2'); // bit = 110000
     * $redisCluster->bitOp('OR',  'bit', 'bit1', 'bit2'); // bit = 110011
     * $redisCluster->bitOp('NOT', 'bit', 'bit1', 'bit2'); // bit = 110011
     * $redisCluster->bitOp('XOR', 'bit', 'bit1', 'bit2'); // bit = 11
     * 
*/ public function bitOp($operation, $retKey, $key1, $key2, $key3 = null) {} /** * Return the position of the first bit set to 1 or 0 in a string. The position is returned, thinking of the * string as an array of bits from left to right, where the first byte's most significant bit is at position 0, * the second byte's most significant bit is at position 8, and so forth. * * @param string $key * @param int $bit * @param int $start * @param int $end * * @return int The command returns the position of the first bit set to 1 or 0 according to the request. * If we look for set bits (the bit argument is 1) and the string is empty or composed of just * zero bytes, -1 is returned. If we look for clear bits (the bit argument is 0) and the string * only contains bit set to 1, the function returns the first bit not part of the string on the * right. So if the string is three bytes set to the value 0xff the command BITPOS key 0 will * return 24, since up to bit 23 all the bits are 1. Basically, the function considers the right * of the string as padded with zeros if you look for clear bits and specify no range or the * start argument only. However, this behavior changes if you are looking for clear bits and * specify a range with both start and end. If no clear bit is found in the specified range, the * function returns -1 as the user specified a clear range and there are no 0 bits in that range. * @link https://redis.io/commands/bitpos * @example *
     * $redisCluster->set('key', '\xff\xff');
     * $redisCluster->bitpos('key', 1); // int(0)
     * $redisCluster->bitpos('key', 1, 1); // int(8)
     * $redisCluster->bitpos('key', 1, 3); // int(-1)
     * $redisCluster->bitpos('key', 0); // int(16)
     * $redisCluster->bitpos('key', 0, 1); // int(16)
     * $redisCluster->bitpos('key', 0, 1, 5); // int(-1)
     * 
*/ public function bitpos($key, $bit, $start = 0, $end = null) {} /** * Count bits in a string. * * @param string $key * * @return int The number of bits set to 1 in the value behind the input key. * @link https://redis.io/commands/bitcount * @example *
     * $redisCluster->set('bit', '345'); // // 11 0011  0011 0100  0011 0101
     * var_dump( $redisCluster->bitCount('bit', 0, 0) ); // int(4)
     * var_dump( $redisCluster->bitCount('bit', 1, 1) ); // int(3)
     * var_dump( $redisCluster->bitCount('bit', 2, 2) ); // int(4)
     * var_dump( $redisCluster->bitCount('bit', 0, 2) ); // int(11)
     * 
*/ public function bitCount($key) {} /** * @see lIndex() * * @param string $key * @param int $index * * @link https://redis.io/commands/lindex */ public function lGet($key, $index) {} /** * Return a substring of a larger string * * @param string $key * @param int $start * @param int $end * * @return string the substring * @link https://redis.io/commands/getrange * @example *
     * $redisCluster->set('key', 'string value');
     * $redisCluster->getRange('key', 0, 5);   // 'string'
     * $redisCluster->getRange('key', -5, -1); // 'value'
     * 
*/ public function getRange($key, $start, $end) {} /** * Trims an existing list so that it will contain only a specified range of elements. * * @param string $key * @param int $start * @param int $stop * * @return array|false Bool return FALSE if the key identify a non-list value. * @link https://redis.io/commands/ltrim * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');
     * $redisCluster->lRange('key1', 0, -1); // array('A', 'B', 'C')
     * $redisCluster->lTrim('key1', 0, 1);
     * $redisCluster->lRange('key1', 0, -1); // array('A', 'B')
     * 
*/ public function lTrim($key, $start, $stop) {} /** * Returns the specified elements of the list stored at the specified key in * the range [start, end]. start and stop are interpretated as indices: 0 the first element, * 1 the second ... -1 the last element, -2 the penultimate ... * * @param string $key * @param int $start * @param int $end * * @return array containing the values in specified range. * @link https://redis.io/commands/lrange * @example *
     * $redisCluster->rPush('key1', 'A');
     * $redisCluster->rPush('key1', 'B');
     * $redisCluster->rPush('key1', 'C');
     * $redisCluster->lRange('key1', 0, -1); // array('A', 'B', 'C')
     * 
*/ public function lRange($key, $start, $end) {} /** * Deletes the elements of the sorted set stored at the specified key which have rank in the range [start,end]. * * @param string $key * @param int $start * @param int $end * * @return int The number of values deleted from the sorted set * @link https://redis.io/commands/zremrangebyrank * @example *
     * $redisCluster->zAdd('key', 1, 'one');
     * $redisCluster->zAdd('key', 2, 'two');
     * $redisCluster->zAdd('key', 3, 'three');
     * $redisCluster->zRemRangeByRank('key', 0, 1); // 2
     * $redisCluster->zRange('key', 0, -1, true); // array('three' => 3)
     * 
*/ public function zRemRangeByRank($key, $start, $end) {} /** * Publish messages to channels. Warning: this function will probably change in the future. * * @param string $channel a channel to publish to * @param string $message string * * @link https://redis.io/commands/publish * @return int Number of clients that received the message * @example $redisCluster->publish('chan-1', 'hello, world!'); // send message. */ public function publish($channel, $message) {} /** * Renames a key. * * @param string $srcKey * @param string $dstKey * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/rename * @example *
     * $redisCluster->set('x', '42');
     * $redisCluster->rename('x', 'y');
     * $redisCluster->get('y');   // → 42
     * $redisCluster->get('x');   // → `FALSE`
     * 
*/ public function rename($srcKey, $dstKey) {} /** * Renames a key. * * Same as rename, but will not replace a key if the destination already exists. * This is the same behaviour as setNx. * * @param string $srcKey * @param string $dstKey * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/renamenx * @example *
     * $redisCluster->set('x', '42');
     * $redisCluster->renameNx('x', 'y');
     * $redisCluster->get('y');   // → 42
     * $redisCluster->get('x');   // → `FALSE`
     * 
*/ public function renameNx($srcKey, $dstKey) {} /** * When called with a single key, returns the approximated cardinality computed by the HyperLogLog data * structure stored at the specified variable, which is 0 if the variable does not exist. * * @param string|array $key * * @return int * @link https://redis.io/commands/pfcount * @example *
     * $redisCluster->pfAdd('key1', array('elem1', 'elem2'));
     * $redisCluster->pfAdd('key2', array('elem3', 'elem2'));
     * $redisCluster->pfCount('key1'); // int(2)
     * $redisCluster->pfCount(array('key1', 'key2')); // int(3)
     * 
*/ public function pfCount($key) {} /** * Adds all the element arguments to the HyperLogLog data structure stored at the key. * * @param string $key * @param array $elements * * @return bool * @link https://redis.io/commands/pfadd * @example $redisCluster->pfAdd('key', array('elem1', 'elem2')) */ public function pfAdd($key, array $elements) {} /** * Merge multiple HyperLogLog values into an unique value that will approximate the cardinality * of the union of the observed Sets of the source HyperLogLog structures. * * @param string $destKey * @param array $sourceKeys * * @return bool * @link https://redis.io/commands/pfmerge * @example *
     * $redisCluster->pfAdd('key1', array('elem1', 'elem2'));
     * $redisCluster->pfAdd('key2', array('elem3', 'elem2'));
     * $redisCluster->pfMerge('key3', array('key1', 'key2'));
     * $redisCluster->pfCount('key3'); // int(3)
     * 
*/ public function pfMerge($destKey, array $sourceKeys) {} /** * Changes a substring of a larger string. * * @param string $key * @param int $offset * @param string $value * * @return string the length of the string after it was modified. * @link https://redis.io/commands/setrange * @example *
     * $redisCluster->set('key', 'Hello world');
     * $redisCluster->setRange('key', 6, "redis"); // returns 11
     * $redisCluster->get('key');                  // "Hello redis"
     * 
*/ public function setRange($key, $offset, $value) {} /** * Restore a key from the result of a DUMP operation. * * @param string $key The key name * @param int $ttl How long the key should live (if zero, no expire will be set on the key) * @param string $value (binary). The Redis encoded key value (from DUMP) * * @return bool * @link https://redis.io/commands/restore * @example *
     * $redisCluster->set('foo', 'bar');
     * $val = $redisCluster->dump('foo');
     * $redisCluster->restore('bar', 0, $val); // The key 'bar', will now be equal to the key 'foo'
     * 
*/ public function restore($key, $ttl, $value) {} /** * Moves the specified member from the set at srcKey to the set at dstKey. * * @param string $srcKey * @param string $dstKey * @param string $member * * @return bool If the operation is successful, return TRUE. * If the srcKey and/or dstKey didn't exist, and/or the member didn't exist in srcKey, FALSE is returned. * @link https://redis.io/commands/smove * @example *
     * $redisCluster->sAdd('key1' , 'set11');
     * $redisCluster->sAdd('key1' , 'set12');
     * $redisCluster->sAdd('key1' , 'set13');          // 'key1' => {'set11', 'set12', 'set13'}
     * $redisCluster->sAdd('key2' , 'set21');
     * $redisCluster->sAdd('key2' , 'set22');          // 'key2' => {'set21', 'set22'}
     * $redisCluster->sMove('key1', 'key2', 'set13');  // 'key1' =>  {'set11', 'set12'}
     *                                          // 'key2' =>  {'set21', 'set22', 'set13'}
     * 
*/ public function sMove($srcKey, $dstKey, $member) {} /** * Returns a range of elements from the ordered set stored at the specified key, * with values in the range [start, end]. start and stop are interpreted as zero-based indices: * 0 the first element, * 1 the second ... * -1 the last element, * -2 the penultimate ... * * @param string $key * @param int $start * @param int $end * @param bool $withscores * * @return array Array containing the values in specified range. * @link https://redis.io/commands/zrange * @example *
     * $redisCluster->zAdd('key1', 0, 'val0');
     * $redisCluster->zAdd('key1', 2, 'val2');
     * $redisCluster->zAdd('key1', 10, 'val10');
     * $redisCluster->zRange('key1', 0, -1); // array('val0', 'val2', 'val10')
     * // with scores
     * $redisCluster->zRange('key1', 0, -1, true); // array('val0' => 0, 'val2' => 2, 'val10' => 10)
     * 
*/ public function zRange($key, $start, $end, $withscores = null) {} /** * Returns the elements of the sorted set stored at the specified key in the range [start, end] * in reverse order. start and stop are interpretated as zero-based indices: * 0 the first element, * 1 the second ... * -1 the last element, * -2 the penultimate ... * * @param string $key * @param int $start * @param int $end * @param bool $withscore * * @return array Array containing the values in specified range. * @link https://redis.io/commands/zrevrange * @example *
     * $redisCluster->zAdd('key', 0, 'val0');
     * $redisCluster->zAdd('key', 2, 'val2');
     * $redisCluster->zAdd('key', 10, 'val10');
     * $redisCluster->zRevRange('key', 0, -1); // array('val10', 'val2', 'val0')
     *
     * // with scores
     * $redisCluster->zRevRange('key', 0, -1, true); // array('val10' => 10, 'val2' => 2, 'val0' => 0)
     * 
*/ public function zRevRange($key, $start, $end, $withscore = null) {} /** * Returns the elements of the sorted set stored at the specified key which have scores in the * range [start,end]. Adding a parenthesis before start or end excludes it from the range. * +inf and -inf are also valid limits. * * zRevRangeByScore returns the same items in reverse order, when the start and end parameters are swapped. * * @param string $key * @param int $start * @param int $end * @param array $options Two options are available: * - withscores => TRUE, * - and limit => array($offset, $count) * * @return array Array containing the values in specified range. * @link https://redis.io/commands/zrangebyscore * @example *
     * $redisCluster->zAdd('key', 0, 'val0');
     * $redisCluster->zAdd('key', 2, 'val2');
     * $redisCluster->zAdd('key', 10, 'val10');
     * $redisCluster->zRangeByScore('key', 0, 3);
     * // array('val0', 'val2')
     * $redisCluster->zRangeByScore('key', 0, 3, array('withscores' => TRUE);
     * // array('val0' => 0, 'val2' => 2)
     * $redisCluster->zRangeByScore('key', 0, 3, array('limit' => array(1, 1));
     * // array('val2' => 2)
     * $redisCluster->zRangeByScore('key', 0, 3, array('limit' => array(1, 1));
     * // array('val2')
     * $redisCluster->zRangeByScore('key', 0, 3, array('withscores' => TRUE, 'limit' => array(1, 1));
     * // array('val2'=> 2)
     * 
*/ public function zRangeByScore($key, $start, $end, array $options = []) {} /** * @see zRangeByScore() * * @param string $key * @param int $start * @param int $end * @param array $options * * @return array */ public function zRevRangeByScore($key, $start, $end, array $options = []) {} /** * Returns a range of members in a sorted set, by lexicographical range * * @param string $key The ZSET you wish to run against. * @param int $min The minimum alphanumeric value you wish to get. * @param int $max The maximum alphanumeric value you wish to get. * @param int $offset Optional argument if you wish to start somewhere other than the first element. * @param int $limit Optional argument if you wish to limit the number of elements returned. * * @return array Array containing the values in the specified range. * @link https://redis.io/commands/zrangebylex * @example *
     * foreach (array('a', 'b', 'c', 'd', 'e', 'f', 'g') as $k => $char) {
     *     $redisCluster->zAdd('key', $k, $char);
     * }
     *
     * $redisCluster->zRangeByLex('key', '-', '[c'); // array('a', 'b', 'c')
     * $redisCluster->zRangeByLex('key', '-', '(c'); // array('a', 'b')
     * $redisCluster->zRevRangeByLex('key', '(c','-'); // array('b', 'a')
     * 
*/ public function zRangeByLex($key, $min, $max, $offset = null, $limit = null) {} /** * @see zRangeByLex() * * @param string $key * @param int $min * @param int $max * @param int $offset * @param int $limit * * @return array * @link https://redis.io/commands/zrevrangebylex */ public function zRevRangeByLex($key, $min, $max, $offset = null, $limit = null) {} /** * Count the number of members in a sorted set between a given lexicographical range. * * @param string $key * @param int $min * @param int $max * * @return int The number of elements in the specified score range. * @link https://redis.io/commands/zlexcount * @example *
     * foreach (array('a', 'b', 'c', 'd', 'e', 'f', 'g') as $k => $char) {
     *     $redisCluster->zAdd('key', $k, $char);
     * }
     * $redisCluster->zLexCount('key', '[b', '[f'); // 5
     * 
*/ public function zLexCount($key, $min, $max) {} /** * Remove all members in a sorted set between the given lexicographical range. * * @param string $key The ZSET you wish to run against. * @param string $min The minimum alphanumeric value you wish to get. * @param string $max The maximum alphanumeric value you wish to get. * * @return int|false the number of elements removed. * @link https://redis.io/commands/zremrangebylex * @example *
     * foreach (array('a', 'b', 'c', 'd', 'e', 'f', 'g') as $k => $char) {
     *     $redisCluster->zAdd('key', $k, $char);
     * }
     * $redisCluster->zRemRangeByLex('key', '(b','[d'); // 2 , remove element 'c' and 'd'
     * $redisCluster->zRange('key',0,-1);// array('a','b','e','f','g')
     * 
*/ public function zRemRangeByLex(string $key, string $min, string $max) {} /** * Add multiple sorted sets and store the resulting sorted set in a new key * * @param string $Output * @param array $ZSetKeys * @param null|array $Weights * @param string $aggregateFunction Either "SUM", "MIN", or "MAX": defines the behaviour to use on * duplicate entries during the zUnion. * * @return int The number of values in the new sorted set. * @link https://redis.io/commands/zunionstore * @example *
     * $redisCluster->del('k1');
     * $redisCluster->del('k2');
     * $redisCluster->del('k3');
     * $redisCluster->del('ko1');
     * $redisCluster->del('ko2');
     * $redisCluster->del('ko3');
     *
     * $redisCluster->zAdd('k1', 0, 'val0');
     * $redisCluster->zAdd('k1', 1, 'val1');
     *
     * $redisCluster->zAdd('k2', 2, 'val2');
     * $redisCluster->zAdd('k2', 3, 'val3');
     *
     * $redisCluster->zUnionStore('ko1', array('k1', 'k2')); // 4, 'ko1' => array('val0', 'val1', 'val2', 'val3')
     *
     * // Weighted zUnionStore
     * $redisCluster->zUnionStore('ko2', array('k1', 'k2'), array(1, 1)); // 4, 'ko2' => array('val0', 'val1', 'val2','val3')
     * $redisCluster->zUnionStore('ko3', array('k1', 'k2'), array(5, 1)); // 4, 'ko3' => array('val0', 'val2', 'val3','val1')
     * 
*/ public function zUnionStore($Output, $ZSetKeys, ?array $Weights = null, $aggregateFunction = 'SUM') {} /** * Intersect multiple sorted sets and store the resulting sorted set in a new key * * @param string $Output * @param array $ZSetKeys * @param null|array $Weights * @param string $aggregateFunction Either "SUM", "MIN", or "MAX": * defines the behaviour to use on duplicate entries during the zInterStore. * * @return int The number of values in the new sorted set. * @link https://redis.io/commands/zinterstore * @example *
     * $redisCluster->del('k1');
     * $redisCluster->del('k2');
     * $redisCluster->del('k3');
     *
     * $redisCluster->del('ko1');
     * $redisCluster->del('ko2');
     * $redisCluster->del('ko3');
     * $redisCluster->del('ko4');
     *
     * $redisCluster->zAdd('k1', 0, 'val0');
     * $redisCluster->zAdd('k1', 1, 'val1');
     * $redisCluster->zAdd('k1', 3, 'val3');
     *
     * $redisCluster->zAdd('k2', 2, 'val1');
     * $redisCluster->zAdd('k2', 3, 'val3');
     *
     * $redisCluster->zInterStore('ko1', array('k1', 'k2'));               // 2, 'ko1' => array('val1', 'val3')
     * $redisCluster->zInterStore('ko2', array('k1', 'k2'), array(1, 1));  // 2, 'ko2' => array('val1', 'val3')
     *
     * // Weighted zInterStore
     * $redisCluster->zInterStore('ko3', array('k1', 'k2'), array(1, 5), 'min'); // 2, 'ko3' => array('val1', 'val3')
     * $redisCluster->zInterStore('ko4', array('k1', 'k2'), array(1, 5), 'max'); // 2, 'ko4' => array('val3', 'val1')
     * 
*/ public function zInterStore($Output, $ZSetKeys, array $Weights = null, $aggregateFunction = 'SUM') {} /** * Deletes a specified member from the ordered set. * * @param string $key * @param string $member1 * @param string $member2 * @param string $memberN * * @return int Number of deleted values * @link https://redis.io/commands/zrem * @example *
     * $redisCluster->zAdd('z', 1, 'v1', 2, 'v2', 3, 'v3', 4, 'v4' );  // int(2)
     * $redisCluster->zRem('z', 'v2', 'v3');                           // int(2)
     * var_dump( $redisCluster->zRange('z', 0, -1) );
     * //// Output:
     * //
     * // array(2) {
     * //   [0]=> string(2) "v1"
     * //   [1]=> string(2) "v4"
     * // }
     * 
*/ public function zRem($key, $member1, $member2 = null, $memberN = null) {} /** * Sort * * @param string $key * @param array $option array(key => value, ...) - optional, with the following keys and values: * - 'by' => 'some_pattern_*', * - 'limit' => array(0, 1), * - 'get' => 'some_other_pattern_*' or an array of patterns, * - 'sort' => 'asc' or 'desc', * - 'alpha' => TRUE, * - 'store' => 'external-key' * * @return array * An array of values, or a number corresponding to the number of elements stored if that was used. * @link https://redis.io/commands/sort * @example *
     * $redisCluster->del('s');
     * $redisCluster->sadd('s', 5);
     * $redisCluster->sadd('s', 4);
     * $redisCluster->sadd('s', 2);
     * $redisCluster->sadd('s', 1);
     * $redisCluster->sadd('s', 3);
     *
     * var_dump($redisCluster->sort('s')); // 1,2,3,4,5
     * var_dump($redisCluster->sort('s', array('sort' => 'desc'))); // 5,4,3,2,1
     * var_dump($redisCluster->sort('s', array('sort' => 'desc', 'store' => 'out'))); // (int)5
     * 
*/ public function sort($key, $option = null) {} /** * Describes the object pointed to by a key. * The information to retrieve (string) and the key (string). * Info can be one of the following: * - "encoding" * - "refcount" * - "idletime" * * @param string $string * @param string $key * * @return string|false for "encoding", int for "refcount" and "idletime", FALSE if the key doesn't exist. * @link https://redis.io/commands/object * @example *
     * $redisCluster->object("encoding", "l"); // → ziplist
     * $redisCluster->object("refcount", "l"); // → 1
     * $redisCluster->object("idletime", "l"); // → 400 (in seconds, with a precision of 10 seconds).
     * 
*/ public function object($string = '', $key = '') {} /** * Subscribe to channels. Warning: this function will probably change in the future. * * @param array $channels an array of channels to subscribe to * @param string|array $callback either a string or an array($instance, 'method_name'). * The callback function receives 3 parameters: the redis instance, the channel * name, and the message. * * @return mixed Any non-null return value in the callback will be returned to the caller. * @link https://redis.io/commands/subscribe * @example *
     * function f($redisCluster, $chan, $msg) {
     *  switch($chan) {
     *      case 'chan-1':
     *          ...
     *          break;
     *
     *      case 'chan-2':
     *                     ...
     *          break;
     *
     *      case 'chan-2':
     *          ...
     *          break;
     *      }
     * }
     *
     * $redisCluster->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f'); // subscribe to 3 chans
     * 
*/ public function subscribe($channels, $callback) {} /** * Subscribe to channels by pattern * * @param array $patterns The number of elements removed from the set. * @param string|array $callback Either a string or an array with an object and method. * The callback will get four arguments ($redis, $pattern, $channel, $message) * * @return mixed Any non-null return value in the callback will be returned to the caller. * * @link https://redis.io/commands/psubscribe * @example *
     * function psubscribe($redisCluster, $pattern, $chan, $msg) {
     *  echo "Pattern: $pattern\n";
     *  echo "Channel: $chan\n";
     *  echo "Payload: $msg\n";
     * }
     * 
*/ public function psubscribe($patterns, $callback) {} /** * Unsubscribes the client from the given channels, or from all of them if none is given. * * @param $channels * @param $callback */ public function unSubscribe($channels, $callback) {} /** * Unsubscribes the client from the given patterns, or from all of them if none is given. * * @param $channels * @param $callback */ public function punSubscribe($channels, $callback) {} /** * Evaluate a LUA script serverside, from the SHA1 hash of the script instead of the script itself. * In order to run this command Redis will have to have already loaded the script, either by running it or via * the SCRIPT LOAD command. * * @param string $scriptSha * @param array $args * @param int $numKeys * * @return mixed @see eval() * @see eval() * @link https://redis.io/commands/evalsha * @example *
     * $script = 'return 1';
     * $sha = $redisCluster->script('load', $script);
     * $redisCluster->evalSha($sha); // Returns 1
     * 
*/ public function evalSha($scriptSha, $args = [], $numKeys = 0) {} /** * Scan the keyspace for keys. * * @param int &$iterator Iterator, initialized to NULL. * @param string|array $node Node identified by key or host/port array * @param string $pattern Pattern to match. * @param int $count Count of keys per iteration (only a suggestion to Redis). * * @return array|false This function will return an array of keys or FALSE if there are no more keys. * @link https://redis.io/commands/scan * @example *
     * $iterator = null;
     * while($keys = $redisCluster->scan($iterator)) {
     *     foreach($keys as $key) {
     *         echo $key . PHP_EOL;
     *     }
     * }
     * 
*/ public function scan(&$iterator, $node, $pattern = null, $count = 0) {} /** * Scan a set for members. * * @param string $key The set to search. * @param int &$iterator LONG (reference) to the iterator as we go. * @param null $pattern String, optional pattern to match against. * @param int $count How many members to return at a time (Redis might return a different amount). * * @return array|false PHPRedis will return an array of keys or FALSE when we're done iterating. * @link https://redis.io/commands/sscan * @example *
     * $iterator = null;
     * while ($members = $redisCluster->sScan('set', $iterator)) {
     *     foreach ($members as $member) {
     *         echo $member . PHP_EOL;
     *     }
     * }
     * 
*/ public function sScan($key, &$iterator, $pattern = null, $count = 0) {} /** * Scan a sorted set for members, with optional pattern and count. * * @param string $key String, the set to scan. * @param int &$iterator Long (reference), initialized to NULL. * @param string $pattern String (optional), the pattern to match. * @param int $count How many keys to return per iteration (Redis might return a different number). * * @return array|false PHPRedis will return matching keys from Redis, or FALSE when iteration is complete. * @link https://redis.io/commands/zscan * @example *
     * $iterator = null;
     * while ($members = $redis-zscan('zset', $iterator)) {
     *     foreach ($members as $member => $score) {
     *         echo $member . ' => ' . $score . PHP_EOL;
     *     }
     * }
     * 
*/ public function zScan($key, &$iterator, $pattern = null, $count = 0) {} /** * Scan a HASH value for members, with an optional pattern and count. * * @param string $key * @param int &$iterator * @param string $pattern Optional pattern to match against. * @param int $count How many keys to return in a go (only a sugestion to Redis). * * @return array An array of members that match our pattern. * @link https://redis.io/commands/hscan * @example *
     * $iterator = null;
     * while($elements = $redisCluster->hscan('hash', $iterator)) {
     *    foreach($elements as $key => $value) {
     *         echo $key . ' => ' . $value . PHP_EOL;
     *     }
     * }
     * 
*/ public function hScan($key, &$iterator, $pattern = null, $count = 0) {} /** * Detect whether we're in ATOMIC/MULTI/PIPELINE mode. * * @return int Either RedisCluster::ATOMIC, RedisCluster::MULTI or RedisCluster::PIPELINE * @example $redisCluster->getMode(); */ public function getMode() {} /** * The last error message (if any) * * @return string|null A string with the last returned script based error message, or NULL if there is no error * @example *
     * $redisCluster->eval('this-is-not-lua');
     * $err = $redisCluster->getLastError();
     * // "ERR Error compiling script (new function): user_script:1: '=' expected near '-'"
     * 
*/ public function getLastError() {} /** * Clear the last error message * * @return bool true * @example *
     * $redisCluster->set('x', 'a');
     * $redisCluster->incr('x');
     * $err = $redisCluster->getLastError();
     * // "ERR value is not an integer or out of range"
     * $redisCluster->clearLastError();
     * $err = $redisCluster->getLastError();
     * // NULL
     * 
*/ public function clearLastError() {} /** * Get client option * * @param int $option parameter * * @return int|string Parameter value. * @example * // return RedisCluster::SERIALIZER_NONE, RedisCluster::SERIALIZER_PHP, or RedisCluster::SERIALIZER_IGBINARY. * $redisCluster->getOption(RedisCluster::OPT_SERIALIZER); */ public function getOption($option) {} /** * Set client option. * * @param int $option parameter * @param int|string $value parameter value * * @return bool TRUE on success, FALSE on error. * @example *
     * $redisCluster->setOption(RedisCluster::OPT_SERIALIZER, RedisCluster::SERIALIZER_NONE);        // don't serialize data
     * $redisCluster->setOption(RedisCluster::OPT_SERIALIZER, RedisCluster::SERIALIZER_PHP);         // use built-in serialize/unserialize
     * $redisCluster->setOption(RedisCluster::OPT_SERIALIZER, RedisCluster::SERIALIZER_IGBINARY);    // use igBinary serialize/unserialize
     * $redisCluster->setOption(RedisCluster::OPT_PREFIX, 'myAppName:');                             // use custom prefix on all keys
     * 
*/ public function setOption($option, $value) {} /** * A utility method to prefix the value with the prefix setting for phpredis. * * @param mixed $value The value you wish to prefix * * @return string If a prefix is set up, the value now prefixed. If there is no prefix, the value will be returned unchanged. * @example *
     * $redisCluster->setOption(RedisCluster::OPT_PREFIX, 'my-prefix:');
     * $redisCluster->_prefix('my-value'); // Will return 'my-prefix:my-value'
     * 
*/ public function _prefix($value) {} /** * A utility method to serialize values manually. This method allows you to serialize a value with whatever * serializer is configured, manually. This can be useful for serialization/unserialization of data going in * and out of EVAL commands as phpredis can't automatically do this itself. Note that if no serializer is * set, phpredis will change Array values to 'Array', and Objects to 'Object'. * * @param mixed $value The value to be serialized. * * @return mixed * @example *
     * $redisCluster->setOption(RedisCluster::OPT_SERIALIZER, RedisCluster::SERIALIZER_NONE);
     * $redisCluster->_serialize("foo"); // returns "foo"
     * $redisCluster->_serialize(Array()); // Returns "Array"
     * $redisCluster->_serialize(new stdClass()); // Returns "Object"
     *
     * $redisCluster->setOption(RedisCluster::OPT_SERIALIZER, RedisCluster::SERIALIZER_PHP);
     * $redisCluster->_serialize("foo"); // Returns 's:3:"foo";'
     * 
*/ public function _serialize($value) {} /** * A utility method to unserialize data with whatever serializer is set up. If there is no serializer set, the * value will be returned unchanged. If there is a serializer set up, and the data passed in is malformed, an * exception will be thrown. This can be useful if phpredis is serializing values, and you return something from * redis in a LUA script that is serialized. * * @param string $value The value to be unserialized * * @return mixed * @example *
     * $redisCluster->setOption(RedisCluster::OPT_SERIALIZER, RedisCluster::SERIALIZER_PHP);
     * $redisCluster->_unserialize('a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}'); // Will return Array(1,2,3)
     * 
*/ public function _unserialize($value) {} /** * Return all redis master nodes * * @return array * @example *
     * $redisCluster->_masters(); // Will return [[0=>'127.0.0.1','6379'],[0=>'127.0.0.1','6380']]
     * 
*/ public function _masters() {} /** * Enter and exit transactional mode. * * @param int $mode RedisCluster::MULTI|RedisCluster::PIPELINE * Defaults to RedisCluster::MULTI. * A RedisCluster::MULTI block of commands runs as a single transaction; * a RedisCluster::PIPELINE block is simply transmitted faster to the server, but without any guarantee * of atomicity. discard cancels a transaction. * * @return RedisCluster returns the RedisCluster instance and enters multi-mode. * Once in multi-mode, all subsequent method calls return the same object until exec() is called. * @link https://redis.io/commands/multi * @example *
     * $ret = $redisCluster->multi()
     *      ->set('key1', 'val1')
     *      ->get('key1')
     *      ->set('key2', 'val2')
     *      ->get('key2')
     *      ->exec();
     *
     * //$ret == array (
     * //    0 => TRUE,
     * //    1 => 'val1',
     * //    2 => TRUE,
     * //    3 => 'val2');
     * 
*/ public function multi($mode = RedisCluster::MULTI) {} /** * @see multi() * @return void|array * @link https://redis.io/commands/exec */ public function exec() {} /** * @see multi() * @link https://redis.io/commands/discard */ public function discard() {} /** * Watches a key for modifications by another client. If the key is modified between WATCH and EXEC, * the MULTI/EXEC transaction will fail (return FALSE). unwatch cancels all the watching of all keys by this client. * * @param string|array $key : a list of keys * * @return void * @link https://redis.io/commands/watch * @example *
     * $redisCluster->watch('x');
     * // long code here during the execution of which other clients could well modify `x`
     * $ret = $redisCluster->multi()
     *          ->incr('x')
     *          ->exec();
     * // $ret = FALSE if x has been modified between the call to WATCH and the call to EXEC.
     * 
*/ public function watch($key) {} /** * @see watch() * @link https://redis.io/commands/unwatch */ public function unwatch() {} /** * Performs a synchronous save at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return bool TRUE in case of success, FALSE in case of failure. * If a save is already running, this command will fail and return FALSE. * @link https://redis.io/commands/save * @example * $redisCluster->save('x'); //key * $redisCluster->save(['127.0.0.1',6379]); //[host,port] */ public function save($nodeParams) {} /** * Performs a background save at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return bool TRUE in case of success, FALSE in case of failure. * If a save is already running, this command will fail and return FALSE. * @link https://redis.io/commands/bgsave */ public function bgsave($nodeParams) {} /** * Removes all entries from the current database at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return bool Always TRUE. * @link https://redis.io/commands/flushdb */ public function flushDB($nodeParams) {} /** * Removes all entries from all databases at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return bool Always TRUE. * @link https://redis.io/commands/flushall */ public function flushAll($nodeParams) {} /** * Returns the current database's size at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return int DB size, in number of keys. * @link https://redis.io/commands/dbsize * @example *
     * $count = $redisCluster->dbSize('x');
     * echo "Redis has $count keys\n";
     * 
*/ public function dbSize($nodeParams) {} /** * Starts the background rewrite of AOF (Append-Only File) at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return bool TRUE in case of success, FALSE in case of failure. * @link https://redis.io/commands/bgrewriteaof * @example $redisCluster->bgrewriteaof('x'); */ public function bgrewriteaof($nodeParams) {} /** * Returns the timestamp of the last disk save at a specific node. * * @param string|array $nodeParams key or [host,port] * * @return int timestamp. * @link https://redis.io/commands/lastsave * @example $redisCluster->lastSave('x'); */ public function lastSave($nodeParams) {} /** * Returns an associative array of strings and integers * * @param string $option Optional. The option to provide redis. * SERVER | CLIENTS | MEMORY | PERSISTENCE | STATS | REPLICATION | CPU | CLASTER | KEYSPACE * | COMANDSTATS * * Returns an associative array of strings and integers, with the following keys: * - redis_version * - redis_git_sha1 * - redis_git_dirty * - redis_build_id * - redis_mode * - os * - arch_bits * - multiplexing_api * - atomicvar_api * - gcc_version * - process_id * - run_id * - tcp_port * - uptime_in_seconds * - uptime_in_days * - hz * - lru_clock * - executable * - config_file * - connected_clients * - client_longest_output_list * - client_biggest_input_buf * - blocked_clients * - used_memory * - used_memory_human * - used_memory_rss * - used_memory_rss_human * - used_memory_peak * - used_memory_peak_human * - used_memory_peak_perc * - used_memory_peak * - used_memory_overhead * - used_memory_startup * - used_memory_dataset * - used_memory_dataset_perc * - total_system_memory * - total_system_memory_human * - used_memory_lua * - used_memory_lua_human * - maxmemory * - maxmemory_human * - maxmemory_policy * - mem_fragmentation_ratio * - mem_allocator * - active_defrag_running * - lazyfree_pending_objects * - mem_fragmentation_ratio * - loading * - rdb_changes_since_last_save * - rdb_bgsave_in_progress * - rdb_last_save_time * - rdb_last_bgsave_status * - rdb_last_bgsave_time_sec * - rdb_current_bgsave_time_sec * - rdb_last_cow_size * - aof_enabled * - aof_rewrite_in_progress * - aof_rewrite_scheduled * - aof_last_rewrite_time_sec * - aof_current_rewrite_time_sec * - aof_last_bgrewrite_status * - aof_last_write_status * - aof_last_cow_size * - changes_since_last_save * - aof_current_size * - aof_base_size * - aof_pending_rewrite * - aof_buffer_length * - aof_rewrite_buffer_length * - aof_pending_bio_fsync * - aof_delayed_fsync * - loading_start_time * - loading_total_bytes * - loading_loaded_bytes * - loading_loaded_perc * - loading_eta_seconds * - total_connections_received * - total_commands_processed * - instantaneous_ops_per_sec * - total_net_input_bytes * - total_net_output_bytes * - instantaneous_input_kbps * - instantaneous_output_kbps * - rejected_connections * - maxclients * - sync_full * - sync_partial_ok * - sync_partial_err * - expired_keys * - evicted_keys * - keyspace_hits * - keyspace_misses * - pubsub_channels * - pubsub_patterns * - latest_fork_usec * - migrate_cached_sockets * - slave_expires_tracked_keys * - active_defrag_hits * - active_defrag_misses * - active_defrag_key_hits * - active_defrag_key_misses * - role * - master_replid * - master_replid2 * - master_repl_offset * - second_repl_offset * - repl_backlog_active * - repl_backlog_size * - repl_backlog_first_byte_offset * - repl_backlog_histlen * - master_host * - master_port * - master_link_status * - master_last_io_seconds_ago * - master_sync_in_progress * - slave_repl_offset * - slave_priority * - slave_read_only * - master_sync_left_bytes * - master_sync_last_io_seconds_ago * - master_link_down_since_seconds * - connected_slaves * - min-slaves-to-write * - min-replicas-to-write * - min_slaves_good_slaves * - used_cpu_sys * - used_cpu_user * - used_cpu_sys_children * - used_cpu_user_children * - cluster_enabled * * @link https://redis.io/commands/info * @return array * @example *
     * $redisCluster->info();
     *
     * or
     *
     * $redisCluster->info("COMMANDSTATS"); //Information on the commands that have been run (>=2.6 only)
     * $redisCluster->info("CPU"); // just CPU information from Redis INFO
     * 
*/ public function info($option = null) {} /** * @since redis >= 2.8.12. * Returns the role of the instance in the context of replication * * @param string|array $nodeParams key or [host,port] * * @return array * @link https://redis.io/commands/role * @example *
     * $redisCluster->role(['127.0.0.1',6379]);
     * // [ 0=>'master',1 => 3129659, 2 => [ ['127.0.0.1','9001','3129242'], ['127.0.0.1','9002','3129543'] ] ]
     * 
*/ public function role($nodeParams) {} /** * Returns a random key at the specified node * * @param string|array $nodeParams key or [host,port] * * @return string an existing key in redis. * @link https://redis.io/commands/randomkey * @example *
     * $key = $redisCluster->randomKey('x');
     * $surprise = $redisCluster->get($key);  // who knows what's in there.
     * 
*/ public function randomKey($nodeParams) {} /** * Return the specified node server time. * * @param string|array $nodeParams key or [host,port] * * @return array If successfully, the time will come back as an associative array with element zero being the * unix timestamp, and element one being microseconds. * @link https://redis.io/commands/time * @example *
     * var_dump( $redisCluster->time('x') );
     * //// Output:
     * //
     * // array(2) {
     * //   [0] => string(10) "1342364352"
     * //   [1] => string(6) "253002"
     * // }
     * 
*/ public function time($nodeParams) {} /** * Check the specified node status * * @param string|array $nodeParams key or [host,port] * * @return string STRING: +PONG on success. Throws a RedisClusterException object on connectivity error, as described * above. * @link https://redis.io/commands/ping */ public function ping($nodeParams) {} /** * Returns message. * * @param string|array $nodeParams key or [host,port] * @param string $msg * * @return mixed */ public function echo($nodeParams, $msg) {} /** * Returns Array reply of details about all Redis Cluster commands. * * @return mixed array | bool */ public function command() {} /** * Send arbitrary things to the redis server at the specified node * * @param string|array $nodeParams key or [host,port] * @param string $command Required command to send to the server. * @param mixed $arguments Optional variable amount of arguments to send to the server. * * @return mixed */ public function rawCommand($nodeParams, $command, $arguments) {} /** * @since redis >= 3.0 * Executes cluster command * * @param string|array $nodeParams key or [host,port] * @param string $command Required command to send to the server. * @param mixed $arguments Optional variable amount of arguments to send to the server. * * @return mixed * @link https://redis.io/commands#cluster * @example *
     * $redisCluster->cluster(['127.0.0.1',6379],'INFO');
     * 
*/ public function cluster($nodeParams, $command, $arguments) {} /** * Allows you to get information of the cluster client * * @param string|array $nodeParams key or [host,port] * @param string $subCmd can be: 'LIST', 'KILL', 'GETNAME', or 'SETNAME' * @param string $args optional arguments */ public function client($nodeParams, $subCmd, $args) {} /** * Get or Set the redis config keys. * * @param string|array $nodeParams key or [host,port] * @param string $operation either `GET` or `SET` * @param string $key for `SET`, glob-pattern for `GET`. See https://redis.io/commands/config-get for examples. * @param string $value optional string (only for `SET`) * * @return array Associative array for `GET`, key -> value * @link https://redis.io/commands/config-get * @link https://redis.io/commands/config-set * @example *
     * $redisCluster->config(['127.0.0.1',6379], "GET", "*max-*-entries*");
     * $redisCluster->config(['127.0.0.1',6379], "SET", "dir", "/var/run/redis/dumps/");
     * 
*/ public function config($nodeParams, $operation, $key, $value) {} /** * A command allowing you to get information on the Redis pub/sub system. * * @param string|array $nodeParams key or [host,port] * * @param string $keyword String, which can be: "channels", "numsub", or "numpat" * @param string|array $argument Optional, variant. * For the "channels" subcommand, you can pass a string pattern. * For "numsub" an array of channel names * * @return array|int Either an integer or an array. * - channels Returns an array where the members are the matching channels. * - numsub Returns a key/value array where the keys are channel names and * values are their counts. * - numpat Integer return containing the number active pattern subscriptions. * @link https://redis.io/commands/pubsub * @example *
     * $redisCluster->pubsub(['127.0.0.1',6379], 'channels'); // All channels
     * $redisCluster->pubsub(['127.0.0.1',6379], 'channels', '*pattern*'); // Just channels matching your pattern
     * $redisCluster->pubsub(['127.0.0.1',6379], 'numsub', array('chan1', 'chan2')); // Get subscriber counts for
     * 'chan1' and 'chan2'
     * $redisCluster->pubsub(['127.0.0.1',6379], 'numpat'); // Get the number of pattern subscribers
     * 
*/ public function pubsub($nodeParams, $keyword, $argument) {} /** * Execute the Redis SCRIPT command to perform various operations on the scripting subsystem. * * @param string|array $nodeParams key or [host,port] * @param string $command load | flush | kill | exists * @param string $script * * @return mixed * @link https://redis.io/commands/script-load * @link https://redis.io/commands/script-kill * @link https://redis.io/commands/script-flush * @link https://redis.io/commands/script-exists * @example *
     * $redisCluster->script(['127.0.0.1',6379], 'load', $script);
     * $redisCluster->script(['127.0.0.1',6379], 'flush');
     * $redisCluster->script(['127.0.0.1',6379], 'kill');
     * $redisCluster->script(['127.0.0.1',6379], 'exists', $script1, [$script2, $script3, ...]);
     * 
* * SCRIPT LOAD will return the SHA1 hash of the passed script on success, and FALSE on failure. * SCRIPT FLUSH should always return TRUE * SCRIPT KILL will return true if a script was able to be killed and false if not * SCRIPT EXISTS will return an array with TRUE or FALSE for each passed script */ public function script($nodeParams, $command, $script) {} /** * This function is used in order to read and reset the Redis slow queries log. * * @param string|array $nodeParams key or [host,port] * @param string $command * @param mixed $argument * * @link https://redis.io/commands/slowlog * @example *
     * $redisCluster->slowLog(['127.0.0.1',6379],'get','2');
     * 
*/ public function slowLog($nodeParams, $command, $argument) {} /** * Add one or more geospatial items in the geospatial index represented using a sorted set * * @param string $key * @param float $longitude * @param float $latitude * @param string $member * * @link https://redis.io/commands/geoadd * @example *
     * $redisCluster->geoAdd('Sicily', 13.361389, 38.115556, 'Palermo'); // int(1)
     * $redisCluster->geoAdd('Sicily', 15.087269, 37.502669, "Catania"); // int(1)
     * 
*/ public function geoAdd($key, $longitude, $latitude, $member) {} /** * Returns members of a geospatial index as standard geohash strings * * @param string $key * @param string $member1 * @param string $member2 * @param string $memberN * * @example *
     * $redisCluster->geoAdd('Sicily', 13.361389, 38.115556, 'Palermo'); // int(1)
     * $redisCluster->geoAdd('Sicily', 15.087269, 37.502669, "Catania"); // int(1)
     * $redisCluster->geohash('Sicily','Palermo','Catania');//['sqc8b49rny0','sqdtr74hyu0']
     * 
*/ public function geohash($key, $member1, $member2 = null, $memberN = null) {} /** * Returns longitude and latitude of members of a geospatial index * * @param string $key * @param string $member1 * @param string $member2 * @param string $memberN * @example *
     * $redisCluster->geoAdd('Sicily', 15.087269, 37.502669, "Catania"); // int(1)
     * $redisCluster->geopos('Sicily','Palermo');//[['13.36138933897018433','38.11555639549629859']]
     * 
*/ public function geopos($key, $member1, $member2 = null, $memberN = null) {} /** * Returns the distance between two members of a geospatial index * * @param string $key * @param string $member1 * @param string $member2 * @param string $unit The unit must be one of the following, and defaults to meters: * m for meters. * km for kilometers. * mi for miles. * ft for feet. * * @link https://redis.io/commands/geoadd * @example *
     * $redisCluster->geoAdd('Sicily', 13.361389, 38.115556, 'Palermo'); // int(1)
     * $redisCluster->geoAdd('Sicily', 15.087269, 37.502669, "Catania"); // int(1)
     * $redisCluster->geoDist('Sicily', 'Palermo' ,'Catania'); // float(166274.1516)
     * $redisCluster->geoDist('Sicily', 'Palermo','Catania', 'km'); // float(166.2742)
     * 
*/ public function geoDist($key, $member1, $member2, $unit = 'm') {} /** * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point * * @param string $key * @param float $longitude * @param float $latitude * @param float $radius * @param string $radiusUnit String can be: "m" for meters; "km" for kilometers , "mi" for miles, or "ft" for feet. * @param array $options * * @link https://redis.io/commands/georadius * @example *
     * $redisCluster->del('Sicily');
     * $redisCluster->geoAdd('Sicily', 12.361389, 35.115556, 'Palermo'); // int(1)
     * $redisCluster->geoAdd('Sicily', 15.087269, 37.502669, "Catania"); // int(1)
     * $redisCluster->geoAdd('Sicily', 13.3585, 35.330022, "Agrigento"); // int(1)
     *
     * var_dump( $redisCluster->geoRadius('Sicily',13.3585, 35.330022, 300, 'km', ['WITHDIST' ,'DESC']) );
     *
     * array(3) {
     *    [0]=>
     *   array(2) {
     *        [0]=>
     *     string(7) "Catania"
     *        [1]=>
     *     string(8) "286.9362"
     *   }
     *   [1]=>
     *   array(2) {
     *        [0]=>
     *     string(7) "Palermo"
     *        [1]=>
     *     string(7) "93.6874"
     *   }
     *   [2]=>
     *   array(2) {
     *        [0]=>
     *     string(9) "Agrigento"
     *        [1]=>
     *     string(6) "0.0002"
     *   }
     * }
     * var_dump( $redisCluster->geoRadiusByMember('Sicily','Agrigento', 100, 'km', ['WITHDIST' ,'DESC']) );
     *
     * * array(2) {
     *    [0]=>
     *   array(2) {
     *        [0]=>
     *     string(7) "Palermo"
     *        [1]=>
     *     string(7) "93.6872"
     *   }
     *   [1]=>
     *   array(2) {
     *        [0]=>
     *     string(9) "Agrigento"
     *        [1]=>
     *     string(6) "0.0000"
     *   }
     * }
     *
     * 
     */
    public function geoRadius($key, $longitude, $latitude, $radius, $radiusUnit, array $options) {}

    /**
     * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member
     *
     * @see geoRadius
     *
     * @param string $key
     * @param string $member
     * @param float  $radius
     * @param string $radiusUnit
     * @param array  $options
     */
    public function geoRadiusByMember($key, $member, $radius, $radiusUnit, array $options) {}
}

class RedisClusterException extends Exception {}

     * $redis->info();
     * 
*/ public function info(): bool|array {} } 'localhost', * 'port' => 6379, * 'readTimeout' => 2.5, * 'connectTimeout' => 2.5, * 'persistent' => true, * // Valid formats: NULL, ['user', 'pass'], 'pass', or ['pass'] * 'auth' => ['phpredis', 'phpredis'], * // See PHP stream options for valid SSL configuration settings. * 'ssl' => ['verify_peer' => false], * // How quickly to retry a connection after we time out or it closes. * // Note that this setting is overridden by 'backoff' strategies. * 'retryInterval' => 100, * // Which backoff algorithm to use. 'decorrelated jitter' is * // likely the best one for most solution, but there are many * // to choose from: * // REDIS_BACKOFF_ALGORITHM_DEFAULT * // REDIS_BACKOFF_ALGORITHM_CONSTANT * // REDIS_BACKOFF_ALGORITHM_UNIFORM * // REDIS_BACKOFF_ALGORITHM_EXPONENTIAL * // REDIS_BACKOFF_ALGORITHM_FULL_JITTER * // REDIS_BACKOFF_ALGORITHM_EQUAL_JITTER * // REDIS_BACKOFF_ALGORITHM_DECORRELATED_JITTER * // 'base', and 'cap' are in milliseconds and represent the first * // delay redis will use when reconnecting, and the maximum delay * // we will reach while retrying. * 'backoff' => [ * 'algorithm' => Redis::BACKOFF_ALGORITHM_DECORRELATED_JITTER, * 'base' => 500, * 'cap' => 750, * ] * ]; * Note: If you do wish to connect via the constructor, only 'host' is * strictly required, which will cause PhpRedis to connect to that * host on Redis' default port (6379). * @param array|null $options * @see https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ * @see Redis::connect() */ public function __construct(?array $options = null) {} public function __destruct() {} /** * Compress a value with the currently configured compressor as set with * Redis::setOption(). * @param string $value The value to be compressed * @return string The compressed result * @see Redis::setOption() */ public function _compress(string $value): string {} /** * Uncompress the provided argument that has been compressed with the * currently configured compressor as set with Redis::setOption(). * @param string $value The compressed value to uncompress. * @return string The uncompressed result. * @see Redis::setOption() */ public function _uncompress(string $value): string {} /** * Prefix the passed argument with the currently set key prefix as set * with Redis::setOption(). * @param string $key The key/string to prefix * @return string The prefixed string */ public function _prefix(string $key): string {} /** * Serialize the provided value with the currently set serializer as set * with Redis::setOption(). * @param mixed $value The value to serialize * @return string The serialized result * @see Redis::setOption() */ public function _serialize(mixed $value): string {} /** * Unserialize the passed argument with the currently set serializer as set * with Redis::setOption(). * @param string $value The value to unserialize * @return mixed The unserialized result * @see Redis::setOption() */ public function _unserialize(string $value): mixed {} /** * Pack the provided value with the configured serializer and compressor * as set with Redis::setOption(). * @param mixed $value The value to pack * @return string The packed result having been serialized and * compressed. */ public function _pack(mixed $value): string {} /** * Unpack the provided value with the configured compressor and serializer * as set with Redis::setOption(). * @param string $value The value which has been serialized and compressed. * @return mixed The uncompressed and eserialized value. */ public function _unpack(string $value): mixed {} public function acl(string $subcmd, string ...$args): mixed {} /** * Append data to a Redis STRING key. * @param string $key The key in question * @param mixed $value The data to append to the key. * @return Redis|int|false The new string length of the key or false on failure. * @see https://redis.io/commands/append * @example * $redis->set('foo', 'hello); * $redis->append('foo', 'world'); */ public function append(string $key, mixed $value): Redis|int|false {} /** * Authenticate a Redis connection after its been established. * $redis->auth('password'); * $redis->auth(['password']); * $redis->auth(['username', 'password']); * @see https://redis.io/commands/auth * @param mixed $credentials A string password, or an array with one or two string elements. * @return Redis|bool Whether the AUTH was successful. */ public function auth(#[\SensitiveParameter] mixed $credentials): Redis|bool {} /** * Execute a save of the Redis database in the background. * @see https://redis.io/commands/bgsave * @return Redis|bool Whether the command was successful. */ public function bgSave(): Redis|bool {} /** * Asynchronously rewrite Redis' append-only file * @see https://redis.io/commands/bgrewriteaof * @return Redis|bool Whether the command was successful. */ public function bgrewriteaof(): Redis|bool {} /** * Count the number of set bits in a Redis string. * @see https://redis.io/commands/bitcount/ * @param string $key The key in question (must be a string key) * @param int $start The index where Redis should start counting. If omitted it * defaults to zero, which means the start of the string. * @param int $end The index where Redis should stop counting. If omitted it * defaults to -1, meaning the very end of the string. * @param bool $bybit Whether or not Redis should treat $start and $end as bit * positions, rather than bytes. * @return Redis|int|false The number of bits set in the requested range. */ public function bitcount(string $key, int $start = 0, int $end = -1, bool $bybit = false): Redis|int|false {} public function bitop(string $operation, string $deskey, string $srckey, string ...$other_keys): Redis|int|false {} /** * Return the position of the first bit set to 0 or 1 in a string. * @see https://redis.io/commands/bitpos/ * @param string $key The key to check (must be a string) * @param bool $bit Whether to look for an unset (0) or set (1) bit. * @param int $start Where in the string to start looking. * @param int $end Where in the string to stop looking. * @param bool $bybit If true, Redis will treat $start and $end as BIT values and not bytes, so if start * was 0 and end was 2, Redis would only search the first two bits. * @return Redis|int|false The position of the first set or unset bit. **/ public function bitpos(string $key, bool $bit, int $start = 0, int $end = -1, bool $bybit = false): Redis|int|false {} /** * Pop an element off the beginning of a Redis list or lists, potentially blocking up to a specified * timeout. This method may be called in two distinct ways, of which examples are provided below. * @see https://redis.io/commands/blpop/ * @param string|array $key_or_keys This can either be a string key or an array of one or more * keys. * @param string|float|int $timeout_or_key If the previous argument was a string key, this can either * be an additional key, or the timeout you wish to send to * the command. * @return Redis|array|null|false Can return various things depending on command and data in Redis. * @example * $redis->blPop('list1', 'list2', 'list3', 1.5); * $relay->blPop(['list1', 'list2', 'list3'], 1.5); */ public function blPop(string|array $key_or_keys, string|float|int $timeout_or_key, mixed ...$extra_args): Redis|array|null|false {} /** * Pop an element off of the end of a Redis list or lists, potentially blocking up to a specified timeout. * The calling convention is identical to Redis::blPop() so see that documentation for more details. * @see https://redis.io/commands/brpop/ * @see Redis::blPop() */ public function brPop(string|array $key_or_keys, string|float|int $timeout_or_key, mixed ...$extra_args): Redis|array|null|false {} /** * Pop an element from the end of a Redis list, pushing it to the beginning of another Redis list, * optionally blocking up to a specified timeout. * @see https://redis.io/commands/brpoplpush/ * @param string $src The source list * @param string $dst The destination list * @param int|float $timeout The number of seconds to wait. Note that you must be connected * to Redis >= 6.0.0 to send a floating point timeout. */ public function brpoplpush(string $src, string $dst, int|float $timeout): Redis|string|false {} /** * POP the maximum scoring element off of one or more sorted sets, blocking up to a specified * timeout if no elements are available. * Following are examples of the two main ways to call this method. * **NOTE**: We reccomend calling this function with an array and a timeout as the other strategy * may be deprecated in future versions of PhpRedis * @see https://redis.io/commands/bzpopmax * @param string|array $key Either a string key or an array of one or more keys. * @param string|int $timeout_or_key If the previous argument was an array, this argument * must be a timeout value. Otherwise it could also be * another key. * @param mixed $extra_args Can consist of additional keys, until the last argument * which needs to be a timeout. * @return Redis|array|false The popped elements. * @example * $redis->bzPopMax('key1', 'key2', 'key3', 1.5); * $redis->bzPopMax(['key1', 'key2', 'key3'], 1.5); */ public function bzPopMax(string|array $key, string|int $timeout_or_key, mixed ...$extra_args): Redis|array|false {} /** * POP the minimum scoring element off of one or more sorted sets, blocking up to a specified timeout * if no elements are available * This command is identical in semantics to bzPopMax so please see that method for more information. * @see https://redis.io/commands/bzpopmin * @see Redis::bzPopMax() */ public function bzPopMin(string|array $key, string|int $timeout_or_key, mixed ...$extra_args): Redis|array|false {} /** * POP one or more elements from one or more sorted sets, blocking up to a specified amount of time * when no elements are available. * @param float $timeout How long to block if there are no element available * @param array $keys The sorted sets to pop from * @param string $from The string 'MIN' or 'MAX' (case insensitive) telling Redis whether you wish to * pop the lowest or highest scoring members from the set(s). * @param int $count Pop up to how many elements. * @return Redis|array|null|false This function will return an array of popped elements, or false * depending on whether any elements could be popped within the * specified timeout. * NOTE: If Redis::OPT_NULL_MULTIBULK_AS_NULL is set to true via Redis::setOption(), this method will * instead return NULL when Redis doesn't pop any elements. */ public function bzmpop(float $timeout, array $keys, string $from, int $count = 1): Redis|array|null|false {} /** * POP one or more of the highest or lowest scoring elements from one or more sorted sets. * @see https://redis.io/commands/zmpop * @param array $keys One or more sorted sets * @param string $from The string 'MIN' or 'MAX' (case insensitive) telling Redis whether you want to * pop the lowest or highest scoring elements. * @param int $count Pop up to how many elements at once. * @return Redis|array|null|false An array of popped elements or false if none could be popped. */ public function zmpop(array $keys, string $from, int $count = 1): Redis|array|null|false {} /** * Pop one or more elements from one or more Redis LISTs, blocking up to a specified timeout when * no elements are available. * @see https://redis.io/commands/blmpop * @param float $timeout The number of seconds Redis will block when no elements are available. * @param array $keys One or more Redis LISTs to pop from. * @param string $from The string 'LEFT' or 'RIGHT' (case insensitive), telling Redis whether * to pop elements from the beginning or end of the LISTs. * @param int $count Pop up to how many elements at once. * @return Redis|array|null|false One or more elements popped from the list(s) or false if all LISTs * were empty. */ public function blmpop(float $timeout, array $keys, string $from, int $count = 1): Redis|array|null|false {} /** * Pop one or more elements off of one or more Redis LISTs. * @see https://redis.io/commands/lmpop * @param array $keys An array with one or more Redis LIST key names. * @param string $from The string 'LEFT' or 'RIGHT' (case insensitive), telling Redis whether to pop\ * elements from the beginning or end of the LISTs. * @param int $count The maximum number of elements to pop at once. * @return Redis|array|null|false One or more elements popped from the LIST(s) or false if all the LISTs * were empty. */ public function lmpop(array $keys, string $from, int $count = 1): Redis|array|null|false {} /** * Reset any last error on the connection to NULL * @return bool This should always return true or throw an exception if we're not connected. * @see Redis::getLastError() * @example * $redis = new Redis(['host' => 'localhost']); * $redis->set('string', 'this_is_a_string'); * $redis->smembers('string'); * var_dump($redis->getLastError()); * $redis->clearLastError(); * var_dump($redis->getLastError()); */ public function clearLastError(): bool {} public function client(string $opt, mixed ...$args): mixed {} public function close(): bool {} public function command(?string $opt = null, mixed ...$args): mixed {} /** * Execute the Redis CONFIG command in a variety of ways. * What the command does in particular depends on the `$operation` qualifier. * Operations that PhpRedis supports are: RESETSTAT, REWRITE, GET, and SET. * @param string $operation The CONFIG operation to execute (e.g. GET, SET, REWRITE). * @param array|string|null $key_or_settings One or more keys or values. * @param string|null $value The value if this is a `CONFIG SET` operation. * @return mixed * @see https://redis.io/commands/config * @example * $redis->config('GET', 'timeout'); * $redis->config('GET', ['timeout', 'databases']); * $redis->config('SET', 'timeout', 30); * $redis->config('SET', ['timeout' => 30, 'loglevel' => 'warning']); */ public function config(string $operation, array|string|null $key_or_settings = null, ?string $value = null): mixed {} public function connect( string $host, int $port = 6379, float $timeout = 0, ?string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0, ?array $context = null ): bool {} /** * Make a copy of a key. * $redis = new Redis(['host' => 'localhost']); * @param string $src The key to copy * @param string $dst The name of the new key created from the source key. * @param array|null $options An array with modifiers on how COPY should operate. * * $options = [ * 'REPLACE' => true|false # Whether to replace an existing key. * 'DB' => int # Copy key to specific db. * ]; * * @return Redis|bool True if the copy was completed and false if not. * @see https://redis.io/commands/copy * @example * $redis->pipeline() * ->select(1) * ->del('newkey') * ->select(0) * ->del('newkey') * ->mset(['source1' => 'value1', 'exists' => 'old_value']) * ->exec(); * var_dump($redis->copy('source1', 'newkey')); * var_dump($redis->copy('source1', 'newkey', ['db' => 1])); * var_dump($redis->copy('source1', 'exists')); * var_dump($redis->copy('source1', 'exists', ['REPLACE' => true])); */ public function copy(string $src, string $dst, ?array $options = null): Redis|bool {} /** * Return the number of keys in the currently selected Redis database. * @see https://redis.io/commands/dbsize * @return Redis|int|false The number of keys or false on failure. * @example * $redis = new Redis(['host' => 'localhost']); * $redis->flushdb(); * $redis->set('foo', 'bar'); * var_dump($redis->dbsize()); * $redis->mset(['a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd']); * var_dump($redis->dbsize()); */ public function dbSize(): Redis|int|false {} public function debug(string $key): Redis|string {} /** * Decrement a Redis integer by 1 or a provided value. * @param string $key The key to decrement * @param int $by How much to decrement the key. Note that if this value is * not sent or is set to `1`, PhpRedis will actually invoke * the 'DECR' command. If it is any value other than `1` * PhpRedis will actually send the `DECRBY` command. * @return Redis|int|false The new value of the key or false on failure. * @see https://redis.io/commands/decr * @see https://redis.io/commands/decrby * @example $redis->decr('counter'); * @example $redis->decr('counter', 2); */ public function decr(string $key, int $by = 1): Redis|int|false {} /** * Decrement a redis integer by a value * @param string $key The integer key to decrement. * @param int $value How much to decrement the key. * @return Redis|int|false The new value of the key or false on failure. * @see https://redis.io/commands/decrby * @example $redis->decrby('counter', 1); * @example $redis->decrby('counter', 2); */ public function decrBy(string $key, int $value): Redis|int|false {} /** * Delete one or more keys from Redis. * This method can be called in two distinct ways. The first is to pass a single array * of keys to delete, and the second is to pass N arguments, all names of keys. See * below for an example of both strategies. * @param array|string $key Either an array with one or more key names or a string with * the name of a key. * @param string ...$other_keys One or more additional keys passed in a variadic fashion. * @return Redis|int|false The number of keys that were deleted * @see https://redis.io/commands/del * @example $redis->del('key:0', 'key:1'); * @example $redis->del(['key:2', 'key:3', 'key:4']); */ public function del(array|string $key, string ...$other_keys): Redis|int|false {} /** * @deprecated */ public function delete(array|string $key, string ...$other_keys): Redis|int|false {} /** * Discard a transaction currently in progress. * @return Redis|bool True if we could discard the transaction. * @example * $redis->getMode(); * $redis->set('foo', 'bar'); * $redis->discard(); * $redis->getMode(); */ public function discard(): Redis|bool {} /** * Dump Redis' internal binary representation of a key. * $redis->zRange('new-zset', 0, -1, true); * * @param string $key The key to dump. * @return Redis|string A binary string representing the key's value. * @see https://redis.io/commands/dump * @example * $redis->zadd('zset', 0, 'zero', 1, 'one', 2, 'two'); * $binary = $redis->dump('zset'); * $redis->restore('new-zset', 0, $binary); */ public function dump(string $key): Redis|string {} /** * Have Redis repeat back an arbitrary string to the client. * @param string $str The string to echo * @return Redis|string|false The string sent to Redis or false on failure. * @see https://redis.io/commands/echo * @example $redis->echo('Hello, World'); */ public function echo(string $str): Redis|string|false {} /** * Execute a LUA script on the redis server. * @see https://redis.io/commands/eval/ * @param string $script A string containing the LUA script * @param array $args An array of arguments to pass to this script * @param int $num_keys How many of the arguments are keys. This is needed * as redis distinguishes between key name arguments * and other data. * @return mixed LUA scripts may return arbitrary data so this method can return * strings, arrays, nested arrays, etc. */ public function eval(string $script, array $args = [], int $num_keys = 0): mixed {} /** * This is simply the read-only variant of eval, meaning the underlying script * may not modify data in redis. * @see Redis::eval_ro() */ public function eval_ro(string $script_sha, array $args = [], int $num_keys = 0): mixed {} /** * Execute a LUA script on the server but instead of sending the script, send * the SHA1 hash of the script. * @param string $sha1 The SHA1 hash of the lua code. Note that the script * must already exist on the server, either having been * loaded with `SCRIPT LOAD` or having been executed directly * with `EVAL` first. * @param array $args Arguments to send to the script. * @param int $num_keys The number of arguments that are keys * @return mixed Returns whatever the specific script does. * @see https://redis.io/commands/evalsha/ * @see Redis::eval(); */ public function evalsha(string $sha1, array $args = [], int $num_keys = 0): mixed {} /** * This is simply the read-only variant of evalsha, meaning the underlying script * may not modify data in redis. * @see Redis::evalsha() */ public function evalsha_ro(string $sha1, array $args = [], int $num_keys = 0): mixed {} /** * Execute either a MULTI or PIPELINE block and return the array of replies. * @return Redis|array|false The array of pipeline'd or multi replies or false on failure. * @see https://redis.io/commands/exec * @see https://redis.io/commands/multi * @see Redis::pipeline() * @see Redis::multi() * @example * $res = $redis->multi() * ->set('foo', 'bar') * ->get('foo') * ->del('list') * ->rpush('list', 'one', 'two', 'three') * ->exec(); */ public function exec(): Redis|array|false {} /** * Test if one or more keys exist. * @param mixed $key Either an array of keys or a string key * @param mixed $other_keys If the previous argument was a string, you may send any number of * additional keys to test. * @return Redis|int|bool The number of keys that do exist and false on failure * @see https://redis.io/commands/exists * @example $redis->exists(['k1', 'k2', 'k3']); * @example $redis->exists('k4', 'k5', 'notakey'); */ public function exists(mixed $key, mixed ...$other_keys): Redis|int|bool {} /** * Sets an expiration in seconds on the key in question. If connected to * redis-server >= 7.0.0 you may send an additional "mode" argument which * modifies how the command will execute. * @param string $key The key to set an expiration on. * @param int $timeout The number of seconds after which key will be automatically deleted. * @param string|null $mode A two character modifier that changes how the * command works. * * NX - Set expiry only if key has no expiry * XX - Set expiry only if key has an expiry * LT - Set expiry only when new expiry is < current expiry * GT - Set expiry only when new expiry is > current expiry * * @return Redis|bool True if an expiration was set and false otherwise. * @see https://redis.io/commands/expire */ public function expire(string $key, int $timeout, ?string $mode = null): Redis|bool {} /* * Set a key's expiration to a specific Unix timestamp in seconds. * * If connected to Redis >= 7.0.0 you can pass an optional 'mode' argument. * @see Redis::expire() For a description of the mode argument. * * @param string $key The key to set an expiration on. * * @return Redis|bool True if an expiration was set, false if not. * */ /** * Set a key to expire at an exact unix timestamp. * @param string $key The key to set an expiration on. * @param int $timestamp The unix timestamp to expire at. * @param string|null $mode An option 'mode' that modifies how the command acts (see {@link Redis::expire}). * @return Redis|bool True if an expiration was set, false if not. * @see https://redis.io/commands/expireat * @see https://redis.io/commands/expire * @see Redis::expire() */ public function expireAt(string $key, int $timestamp, ?string $mode = null): Redis|bool {} public function failover(?array $to = null, bool $abort = false, int $timeout = 0): Redis|bool {} /** * Get the expiration of a given key as a unix timestamp * @param string $key The key to check. * @return Redis|int|false The timestamp when the key expires, or -1 if the key has no expiry * and -2 if the key doesn't exist. * @see https://redis.io/commands/expiretime * @example * $redis->setEx('mykey', 60, 'myval'); * $redis->expiretime('mykey'); */ public function expiretime(string $key): Redis|int|false {} /** * Get the expriation timestamp of a given Redis key but in milliseconds. * @see https://redis.io/commands/pexpiretime * @see Redis::expiretime() * @param string $key The key to check * @return Redis|int|false The expiration timestamp of this key (in milliseconds) or -1 if the * key has no expiration, and -2 if it does not exist. */ public function pexpiretime(string $key): Redis|int|false {} /** * Invoke a function. * @param string $fn The name of the function * @param array $keys Optional list of keys * @param array $args Optional list of args * @return mixed Function may return arbitrary data so this method can return * strings, arrays, nested arrays, etc. * @see https://redis.io/commands/fcall */ public function fcall(string $fn, array $keys = [], array $args = []): mixed {} /** * This is a read-only variant of the FCALL command that cannot execute commands that modify data. * @param string $fn The name of the function * @param array $keys Optional list of keys * @param array $args Optional list of args * @return mixed Function may return arbitrary data so this method can return * strings, arrays, nested arrays, etc. * @see https://redis.io/commands/fcall_ro */ public function fcall_ro(string $fn, array $keys = [], array $args = []): mixed {} /** * Deletes every key in all Redis databases * @param bool $sync Whether to perform the task in a blocking or non-blocking way. * @return Redis|bool * @see https://redis.io/commands/flushall */ public function flushAll(?bool $sync = null): Redis|bool {} /** * Deletes all the keys of the currently selected database. * @param bool $sync Whether to perform the task in a blocking or non-blocking way. * @return Redis|bool * @see https://redis.io/commands/flushdb */ public function flushDB(?bool $sync = null): Redis|bool {} /** * Functions is an API for managing code to be executed on the server. * @param string $operation The subcommand you intend to execute. Valid options are as follows * 'LOAD' - Create a new library with the given library name and code. * 'DELETE' - Delete the given library. * 'LIST' - Return general information on all the libraries * 'STATS' - Return information about the current function running * 'KILL' - Kill the current running function * 'FLUSH' - Delete all the libraries * 'DUMP' - Return a serialized payload representing the current libraries * 'RESTORE' - Restore the libraries represented by the given payload * @param mixed ...$args Additional arguments * @return Redis|bool|string|array Depends on subcommand. * @see https://redis.io/commands/function */ public function function(string $operation, mixed ...$args): Redis|bool|string|array {} /** * Add one or more members to a geospacial sorted set * @param string $key The sorted set to add data to. * @param float $lng The longitude of the first member * @param float $lat The lattitude of the first member. * @param mixed ...$other_triples_and_options You can continue to pass longitude, lattitude, and member * arguments to add as many members as you wish. Optionally, the final argument may be * a string with options for the command @return Redis|int|false The number of added elements is returned. If the 'CH' option is specified, * the return value is the number of members *changed*. * @see Redis documentation for the options. * @example $redis->geoAdd('cities', -121.8374, 39.7284, 'Chico', -122.03218, 37.322, 'Cupertino'); * @example $redis->geoadd('cities', -121.837478, 39.728494, 'Chico', ['XX', 'CH']); * @see https://redis.io/commands/geoadd */ public function geoadd(string $key, float $lng, float $lat, string $member, mixed ...$other_triples_and_options): Redis|int|false {} /** * Get the distance between two members of a geospacially encoded sorted set. * @param string $key The Sorted set to query. * @param string $src The first member. * @param string $dst The second member. * @param string|null $unit Which unit to use when computing distance, defaulting to meters. * * M - meters * KM - kilometers * FT - feet * MI - miles * * @return Redis|float|false The calculated distance in whichever units were specified or false * if one or both members did not exist. * @example $redis->geodist('cities', 'Chico', 'Cupertino', 'mi'); * @see https://redis.io/commands/geodist */ public function geodist(string $key, string $src, string $dst, ?string $unit = null): Redis|float|false {} /** * Retrieve one or more GeoHash encoded strings for members of the set. * @param string $key The key to query * @param string $member The first member to request * @param string ...$other_members One or more additional members to request. * @return Redis|array|false An array of GeoHash encoded values. * @see https://redis.io/commands/geohash * @see https://en.wikipedia.org/wiki/Geohash * @example $redis->geohash('cities', 'Chico', 'Cupertino'); */ public function geohash(string $key, string $member, string ...$other_members): Redis|array|false {} /** * Return the longitude and lattitude for one or more members of a geospacially encoded sorted set. * @param string $key The set to query. * @param string $member The first member to query. * @param string ...$other_members One or more members to query. * @return Redis|array|false array of longitude and lattitude pairs. * @see https://redis.io/commands/geopos * @example $redis->geopos('cities', 'Seattle', 'New York'); */ public function geopos(string $key, string $member, string ...$other_members): Redis|array|false {} /** * Retrieve members of a geospacially sorted set that are within a certain radius of a location. * @param string $key The set to query * @param float $lng The longitude of the location to query. * @param float $lat The latitude of the location to query. * @param float $radius The radius of the area to include. * @param string $unit The unit of the provided radius (defaults to 'meters). * See {@link Redis::geodist} for possible units. * @param array $options An array of options that modifies how the command behaves. * * $options = [ * 'WITHCOORD', # Return members and their coordinates. * 'WITHDIST', # Return members and their distances from the center. * 'WITHHASH', # Return members GeoHash string. * 'ASC' | 'DESC', # The sort order of returned members * # Limit to N returned members. Optionally a two element array may be * # passed as the `LIMIT` argument, and the `ANY` argument. * 'COUNT' => [], or [, ] * # Instead of returning members, store them in the specified key. * 'STORE' => * # Store the distances in the specified key * 'STOREDIST' => * ]; * * @return mixed This command can return various things, depending on the options passed. * @see https://redis.io/commands/georadius * @example $redis->georadius('cities', 47.608013, -122.335167, 1000, 'km'); */ public function georadius(string $key, float $lng, float $lat, float $radius, string $unit, array $options = []): mixed {} /** * A readonly variant of `GEORADIUS` that may be executed on replicas. * @see Redis::georadius */ public function georadius_ro(string $key, float $lng, float $lat, float $radius, string $unit, array $options = []): mixed {} /** * Similar to `GEORADIUS` except it uses a member as the center of the query. * @param string $key The key to query. * @param string $member The member to treat as the center of the query. * @param float $radius The radius from the member to include. * @param string $unit The unit of the provided radius * See {@link Redis::geodist} for possible units. * @param array $options An array with various options to modify the command's behavior. * See {@link Redis::georadius} for options. * @return mixed This command can return various things depending on options. * @example $redis->georadiusbymember('cities', 'Seattle', 200, 'mi'); */ public function georadiusbymember(string $key, string $member, float $radius, string $unit, array $options = []): mixed {} /** * This is the read-only variant of `GEORADIUSBYMEMBER` that can be run on replicas. */ public function georadiusbymember_ro(string $key, string $member, float $radius, string $unit, array $options = []): mixed {} /** * Search a geospacial sorted set for members in various ways. * @param string $key The set to query. * @param array|string $position Either a two element array with longitude and lattitude, or * a string representing a member of the set. * @param array|int|float $shape Either a number representine the radius of a circle to search, or * a two element array representing the width and height of a box * to search. * @param string $unit The unit of our shape. See {@link Redis::geodist} for possible units. * @param array $options @see {@link Redis::georadius} for options. Note that the `STORE` * options are not allowed for this command. */ public function geosearch(string $key, array|string $position, array|int|float $shape, string $unit, array $options = []): array {} /** * Search a geospacial sorted set for members within a given area or range, storing the results into * a new set. * @param string $dst The destination where results will be stored. * @param string $src The key to query. * @param array|string $position Either a two element array with longitude and lattitude, or * a string representing a member of the set. * @param array|int|float $shape Either a number representine the radius of a circle to search, or * a two element array representing the width and height of a box * to search. * @param string $unit The unit of our shape. See {@link Redis::geodist} for possible units. * @param array $options * * $options = [ * 'ASC' | 'DESC', # The sort order of returned members * 'WITHDIST' # Also store distances. * # Limit to N returned members. Optionally a two element array may be * # passed as the `LIMIT` argument, and the `ANY` argument. * 'COUNT' => [], or [, ] * ]; * */ public function geosearchstore(string $dst, string $src, array|string $position, array|int|float $shape, string $unit, array $options = []): Redis|array|int|false {} /** * Retrieve a string keys value. * @param string $key The key to query * @return mixed The keys value or false if it did not exist. * @see https://redis.io/commands/get * @example $redis->get('foo'); */ public function get(string $key): mixed {} /** * Get the authentication information on the connection, if any. * @return mixed The authentication information used to authenticate the connection. * @see Redis::auth() */ public function getAuth(): mixed {} /** * Get the bit at a given index in a string key. * @param string $key The key to query. * @param int $idx The Nth bit that we want to query. * @example $redis->getbit('bitmap', 1337); * @see https://redis.io/commands/getbit */ public function getBit(string $key, int $idx): Redis|int|false {} /** * Get the value of a key and optionally set it's expiration. * @param string $key The key to query * @param array $options Options to modify how the command works. * * $options = [ * 'EX' => # Expire in N seconds * 'PX' => # Expire in N milliseconds * 'EXAT' => # Expire at a unix timestamp (in seconds) * 'PXAT' => # Expire at a unix timestamp (in milliseconds); * 'PERSIST' # Remove any configured expiration on the key. * ]; * * @return Redis|string|bool The key's value or false if it didn't exist. * @see https://redis.io/comands/getex * @example $redis->getEx('mykey', ['EX' => 60]); */ public function getEx(string $key, array $options = []): Redis|string|bool {} /** * Get the database number PhpRedis thinks we're connected to. * This value is updated internally in PhpRedis each time {@link Redis::select} is called. * @return int The database we're connected to. * @see Redis::select() * @see https://redis.io/commands/select */ public function getDBNum(): int {} /** * Get a key from Redis and delete it in an atomic operation. * @param string $key The key to get/delete. * @return Redis|string|bool The value of the key or false if it didn't exist. * @see https://redis.io/commands/getdel * @example $redis->getdel('token:123'); */ public function getDel(string $key): Redis|string|bool {} /** * Return the host or Unix socket we are connected to. * @return string The host or Unix socket. */ public function getHost(): string {} /** * Get the last error returned to us from Redis, if any. * @return string|null The error string or NULL if there is none. */ public function getLastError(): ?string {} /** * Returns whether the connection is in ATOMIC, MULTI, or PIPELINE mode * @return int The mode we're in. */ public function getMode(): int {} /** * Retrieve the value of a configuration setting as set by Redis::setOption() * @return mixed The setting itself or false on failure * @see Redis::setOption() for a detailed list of options and their values. */ public function getOption(int $option): mixed {} /** * Get the persistent connection ID, if there is one. * @return string|null The ID or NULL if we don't have one. */ public function getPersistentID(): ?string {} /** * Get the port we are connected to. This number will be zero if we are connected to a unix socket. * @return int The port. */ public function getPort(): int {} /** * Retrieve a substring of a string by index. * @param string $key The string to query. * @param int $start The zero-based starting index. * @param int $end The zero-based ending index. * @return Redis|string|false The substring or false on failure. * @see https://redis.io/commands/getrange * @example * $redis->set('silly-word', 'Supercalifragilisticexpialidocious'); * echo $redis->getRange('silly-word', 0, 4) . "\n"; */ public function getRange(string $key, int $start, int $end): Redis|string|false {} /** * Get the longest common subsequence between two string keys. * @param string $key1 The first key to check * @param string $key2 The second key to check * @param array|null $options An optional array of modifiers for the comand. * * $options = [ * 'MINMATCHLEN' => int # Exclude matching substrings that are less than this value * 'WITHMATCHLEN' => bool # Whether each match should also include its length. * 'LEN' # Return the length of the longest subsequence * 'IDX' # Each returned match will include the indexes where the * # match occurs in each string. * ]; * * NOTE: 'LEN' cannot be used with 'IDX'. * @return Redis|string|array|int|false Various reply types depending on options. * @see https://redis.io/commands/lcs * @example * $redis->set('seq1', 'gtaggcccgcacggtctttaatgtatccctgtttaccatgccatacctgagcgcatacgc'); * $redis->set('seq2', 'aactcggcgcgagtaccaggccaaggtcgttccagagcaaagactcgtgccccgctgagc'); * echo $redis->lcs('seq1', 'seq2') . "\n"; */ public function lcs(string $key1, string $key2, ?array $options = null): Redis|string|array|int|false {} /** * Get the currently set read timeout on the connection. * @return float The timeout. */ public function getReadTimeout(): float {} /** * Sets a key and returns any previously set value, if the key already existed. * @param string $key The key to set. * @param mixed $value The value to set the key to. * @return Redis|string|false The old value of the key or false if it didn't exist. * @see https://redis.io/commands/getset * @example * $redis->getset('captain', 'Pike'); * $redis->getset('captain', 'Kirk'); */ public function getset(string $key, mixed $value): Redis|string|false {} /** * Retrieve any set connection timeout * @return float|false The currently set timeout or false on failure (e.g. we aren't connected). */ public function getTimeout(): float|false {} /** * Get the number of bytes sent and received on the socket. * @return array An array in the form [$sent_bytes, $received_bytes] */ public function getTransferredBytes(): array {} /** * Reset the number of bytes sent and received on the socket. * @return void */ public function clearTransferredBytes(): void {} /** * Remove one or more fields from a hash. * @param string $key The hash key in question. * @param string $field The first field to remove * @param string ...$other_fields One or more additional fields to remove. * @return Redis|int|false The number of fields actually removed. * @see https://redis.io/commands/hdel * @example $redis->hDel('communication', 'Alice', 'Bob'); */ public function hDel(string $key, string $field, string ...$other_fields): Redis|int|false {} /** * Checks whether a field exists in a hash. * @param string $key The hash to query. * @param string $field The field to check * @return Redis|bool True if it exists, false if not. * @see https://redis.io/commands/hexists * @example $redis->hExists('communication', 'Alice'); */ public function hExists(string $key, string $field): Redis|bool {} public function hGet(string $key, string $member): mixed {} /** * Read every field and value from a hash. * @param string $key The hash to query. * @return Redis|array|false All fields and values or false if the key didn't exist. * @see https://redis.io/commands/hgetall * @example $redis->hgetall('myhash'); */ public function hGetAll(string $key): Redis|array|false {} /** * Increment a hash field's value by an integer * @param string $key The hash to modify * @param string $field The field to increment * @param int $value How much to increment the value. * @return Redis|int|false The new value of the field. * @see https://redis.io/commands/hincrby * @example * $redis->hMSet('player:1', ['name' => 'Alice', 'score' => 0]); * $redis->hincrby('player:1', 'score', 10); */ public function hIncrBy(string $key, string $field, int $value): Redis|int|false {} /** * Increment a hash field by a floating point value * @param string $key The hash with the field to increment. * @param string $field The field to increment. * @return Redis|float|false The field value after incremented. * @see https://redis.io/commands/hincrbyfloat * @example * $redis->hincrbyfloat('numbers', 'tau', 2 * 3.1415926); */ public function hIncrByFloat(string $key, string $field, float $value): Redis|float|false {} /** * Retrieve all of the fields of a hash. * @param string $key The hash to query. * @return Redis|array|false The fields in the hash or false if the hash doesn't exist. * @see https://redis.io/commands/hkeys * @example $redis->hkeys('myhash'); */ public function hKeys(string $key): Redis|array|false {} /** * Get the number of fields in a hash. * @see https://redis.io/commands/hlen * @param string $key The hash to check. * @return Redis|int|false The number of fields or false if the key didn't exist. * @example $redis->hlen('myhash'); */ public function hLen(string $key): Redis|int|false {} /** * Get one or more fields from a hash. * @param string $key The hash to query. * @param array $fields One or more fields to query in the hash. * @return Redis|array|false The fields and values or false if the key didn't exist. * @see https://redis.io/commands/hmget * @example $redis->hMGet('player:1', ['name', 'score']); */ public function hMget(string $key, array $fields): Redis|array|false {} /** * Add or update one or more hash fields and values * @param string $key The hash to create/update * @param array $fieldvals An associative array with fields and their values. * @return Redis|bool True if the operation was successful * @see https://redis.io/commands/hmset * @example $redis->hmset('updates', ['status' => 'starting', 'elapsed' => 0]); */ public function hMset(string $key, array $fieldvals): Redis|bool {} /** * Get one or more random field from a hash. * @param string $key The hash to query. * @param array|null $options An array of options to modify how the command behaves. * * $options = [ * 'COUNT' => int # An optional number of fields to return. * 'WITHVALUES' => bool # Also return the field values. * ]; * * @return Redis|array|string One or more random fields (and possibly values). * @see https://redis.io/commands/hrandfield * @example $redis->hrandfield('settings'); * @example $redis->hrandfield('settings', ['count' => 2, 'withvalues' => true]); */ public function hRandField(string $key, ?array $options = null): Redis|string|array {} public function hSet(string $key, string $member, mixed $value): Redis|int|false {} /** * Set a hash field and value, but only if that field does not exist * @param string $key The hash to update. * @param string $field The value to set. * @return Redis|bool True if the field was set and false if not. * @see https://redis.io/commands/hsetnx * @example * $redis->hsetnx('player:1', 'lock', 'enabled'); * $redis->hsetnx('player:1', 'lock', 'enabled'); */ public function hSetNx(string $key, string $field, string $value): Redis|bool {} /** * Get the string length of a hash field * @param string $key The hash to query. * @param string $field The field to query. * @return Redis|int|false The string length of the field or false. * @example * $redis = new Redis(['host' => 'localhost']); * $redis->del('hash'); * $redis->hmset('hash', ['50bytes' => str_repeat('a', 50)]); * $redis->hstrlen('hash', '50bytes'); * @see https://redis.io/commands/hstrlen */ public function hStrLen(string $key, string $field): Redis|int|false {} /** * Get all of the values from a hash. * @param string $key The hash to query. * @return Redis|array|false The values from the hash. * @see https://redis.io/commands/hvals * @example $redis->hvals('player:1'); */ public function hVals(string $key): Redis|array|false {} /** * Iterate over the fields and values of a hash in an incremental fashion. * @see https://redis.io/commands/hscan * @see https://redis.io/commands/scan * @param string $key The hash to query. * @param int|null $iterator The scan iterator, which should be initialized to NULL before the first call. * This value will be updated after every call to hscan, until it reaches zero * meaning the scan is complete. * @param string|null $pattern An optional glob-style pattern to filter fields with. * @param int $count An optional hint to Redis about how many fields and values to return per HSCAN. * @return Redis|array|bool An array with a subset of fields and values. * @example * $redis = new Redis(['host' => 'localhost']); * $redis->del('big-hash'); * for ($i = 0; $i < 1000; $i++) { * $fields["field:$i"] = "value:$i"; * } * $redis->hmset('big-hash', $fields); * $it = null; * do { * // Scan the hash but limit it to fields that match '*:1?3' * $fields = $redis->hscan('big-hash', $it, '*:1?3'); * foreach ($fields as $field => $value) { * echo "[$field] => $value\n"; * } * } while ($it != 0); */ public function hscan(string $key, ?int &$iterator, ?string $pattern = null, int $count = 0): Redis|array|bool {} /** * Increment a key's value, optionally by a specifc amount. * @see https://redis.io/commands/incr * @see https://redis.io/commands/incrby * @param string $key The key to increment * @param int $by An optional amount to increment by. * @return Redis|int|false The new value of the key after incremented. * @example $redis->incr('mycounter'); * @example $redis->incr('mycounter', 10); */ public function incr(string $key, int $by = 1): Redis|int|false {} /** * Increment a key by a specific integer value * @see https://redis.io/commands/incrby * @param string $key The key to increment. * @param int $value The amount to increment. * @example * $redis->set('primes', 2); * $redis->incrby('primes', 1); * $redis->incrby('primes', 2); * $redis->incrby('primes', 2); * $redis->incrby('primes', 4); */ public function incrBy(string $key, int $value): Redis|int|false {} /** * Increment a numeric key by a floating point value. * @param string $key The key to increment * @param float $value How much to increment (or decrement) the value. * @return Redis|float|false The new value of the key or false if the key didn't contain a string. * @example * $redis->incrbyfloat('tau', 3.1415926); * $redis->incrbyfloat('tau', 3.1415926); */ public function incrByFloat(string $key, float $value): Redis|float|false {} /** * Retrieve information about the connected redis-server. If no arguments are passed to * this function, redis will return every info field. Alternatively you may pass a specific * section you want returned (e.g. 'server', or 'memory') to receive only information pertaining * to that section. * If connected to Redis server >= 7.0.0 you may pass multiple optional sections. * @see https://redis.io/commands/info/ * @param string ...$sections Optional section(s) you wish Redis server to return. * @return Redis|array|false */ public function info(string ...$sections): Redis|array|false {} /** * Check if we are currently connected to a Redis instance. * @return bool True if we are, false if not */ public function isConnected(): bool {} /** @return Redis|array|false */ public function keys(string $pattern) {} public function lInsert(string $key, string $pos, mixed $pivot, mixed $value) {} /** * Retrieve the lenght of a list. * @param string $key The list * @return Redis|int|false The number of elements in the list or false on failure. */ public function lLen(string $key): Redis|int|false {} /** * Move an element from one list into another. * @param string $src The source list. * @param string $dst The destination list * @param string $wherefrom Where in the source list to retrieve the element. This can be either * - `Redis::LEFT`, or `Redis::RIGHT`. * @param string $whereto Where in the destination list to put the element. This can be either * - `Redis::LEFT`, or `Redis::RIGHT`. * @return Redis|string|false The element removed from the source list. * @example * $redis->rPush('numbers', 'one', 'two', 'three'); * $redis->lMove('numbers', 'odds', Redis::LEFT, Redis::LEFT); */ public function lMove(string $src, string $dst, string $wherefrom, string $whereto): Redis|string|false {} /** * Move an element from one list to another, blocking up to a timeout until an element is available. * @param string $src The source list * @param string $dst The destination list * @param string $wherefrom Where in the source list to extract the element. * - `Redis::LEFT`, or `Redis::RIGHT`. * @param string $whereto Where in the destination list to put the element. * - `Redis::LEFT`, or `Redis::RIGHT`. * @param float $timeout How long to block for an element. * @return Redis|string|false * @example * $redis->lPush('numbers', 'one'); * $redis->blmove('numbers', 'odds', Redis::LEFT, Redis::LEFT 1.0); * // This call will block, if no additional elements are in 'numbers' * $redis->blmove('numbers', 'odds', Redis::LEFT, Redis::LEFT, 1.0); */ public function blmove(string $src, string $dst, string $wherefrom, string $whereto, float $timeout): Redis|string|false {} /** * Pop one or more elements off a list. * @param string $key The list to pop from. * @param int $count Optional number of elements to remove. By default one element is popped. * @return Redis|bool|string|array Will return the element(s) popped from the list or false/NULL * if none was removed. * @see https://redis.io/commands/lpop * @example $redis->lpop('mylist'); * @example $redis->lpop('mylist', 4); */ public function lPop(string $key, int $count = 0): Redis|bool|string|array {} /** * Retrieve the index of an element in a list. * @param string $key The list to query. * @param mixed $value The value to search for. * @param array|null $options Options to configure how the command operates * * $options = [ * # How many matches to return. By default a single match is returned. * # If count is set to zero, it means unlimited. * 'COUNT' => * # Specify which match you want returned. `RANK` 1 means "the first match" * # 2 means the second, and so on. If passed as a negative number the * # RANK is computed right to left, so a `RANK` of -1 means "the last match". * 'RANK' => * # This argument allows you to limit how many elements Redis will search before * # returning. This is useful to prevent Redis searching very long lists while * # blocking the client. * 'MAXLEN => * ]; * * @return Redis|null|bool|int|array Returns one or more of the matching indexes, or null/false if none were found. */ public function lPos(string $key, mixed $value, ?array $options = null): Redis|null|bool|int|array {} /** * Prepend one or more elements to a list. * @param string $key The list to prepend. * @param mixed $elements One or more elements to prepend. * @return Redis|int|false The new length of the list after prepending. * @see https://redis.io/commands/lpush * @example $redis->lPush('mylist', 'cat', 'bear', 'aligator'); */ public function lPush(string $key, mixed ...$elements): Redis|int|false {} /** * Append one or more elements to a list. * @param string $key The list to append to. * @param mixed $elements one or more elements to append. * @return Redis|int|false The new length of the list * @see https://redis.io/commands/rpush * @example $redis->rPush('mylist', 'xray', 'yankee', 'zebra'); */ public function rPush(string $key, mixed ...$elements): Redis|int|false {} /** * Prepend an element to a list but only if the list exists * @param string $key The key to prepend to. * @param mixed $value The value to prepend. * @return Redis|int|false The new length of the list. */ public function lPushx(string $key, mixed $value): Redis|int|false {} /** * Append an element to a list but only if the list exists * @param string $key The key to prepend to. * @param mixed $value The value to prepend. * @return Redis|int|false The new length of the list. */ public function rPushx(string $key, mixed $value): Redis|int|false {} /** * Set a list element at an index to a specific value. * @param string $key The list to modify. * @param int $index The position of the element to change. * @param mixed $value The new value. * @return Redis|bool True if the list was modified. * @see https://redis.io/commands/lset */ public function lSet(string $key, int $index, mixed $value): Redis|bool {} /** * Retrieve the last time Redis' database was persisted to disk. * @return int The unix timestamp of the last save time * @see https://redis.io/commands/lastsave */ public function lastSave(): int {} /** * Get the element of a list by its index. * @param string $key The key to query * @param int $index The index to check. * @return mixed The index or NULL/false if the element was not found. */ public function lindex(string $key, int $index): mixed {} /** * Retrieve elements from a list. * @param string $key The list to query. * @param int $start The beginning index to retrieve. This number can be negative * meaning start from the end of the list. * @param int $end The end index to retrieve. This can also be negative to start * from the end of the list. * @return Redis|array|false The range of elements between the indexes. * @example $redis->lrange('mylist', 0, -1); // the whole list * @example $redis->lrange('mylist', -2, -1); // the last two elements in the list. */ public function lrange(string $key, int $start, int $end): Redis|array|false {} /** * Remove one or more matching elements from a list. * @param string $key The list to truncate. * @param mixed $value The value to remove. * @param int $count How many elements matching the value to remove. * @return Redis|int|false The number of elements removed. * @see https://redis.io/commands/lrem */ public function lrem(string $key, mixed $value, int $count = 0): Redis|int|false {} /** * Trim a list to a subrange of elements. * @param string $key The list to trim * @param int $start The starting index to keep * @param int $end The ending index to keep. * @return Redis|bool true if the list was trimmed. * @example $redis->ltrim('mylist', 0, 3); // Keep the first four elements */ public function ltrim(string $key, int $start, int $end): Redis|bool {} /** * Get one ore more string keys. * @param array $keys The keys to retrieve * @return Redis|array an array of keys with their values. * @example $redis->mget(['key1', 'key2']); */ public function mget(array $keys): Redis|array {} public function migrate( string $host, int $port, string|array $key, int $dstdb, int $timeout, bool $copy = false, bool $replace = false, #[\SensitiveParameter] mixed $credentials = null ): Redis|bool {} /** * Move a key to a different database on the same redis instance. * @param string $key The key to move * @return Redis|bool True if the key was moved */ public function move(string $key, int $index): Redis|bool {} /** * Set one ore more string keys. * @param array $key_values An array with keys and their values. * @return Redis|bool True if the keys could be set. * @see https://redis.io/commands/mset * @example $redis->mSet(['foo' => 'bar', 'baz' => 'bop']); */ public function mset(array $key_values): Redis|bool {} /** * Set one ore more string keys but only if none of the key exist. * @param array $key_values An array of keys with their values. * @return Redis|bool True if the keys were set and false if not. * @see https://redis.io/commands/msetnx * @example $redis->msetnx(['foo' => 'bar', 'baz' => 'bop']); */ public function msetnx(array $key_values): Redis|bool {} /** * Begin a transaction. * @param int $value The type of transaction to start. This can either be `Redis::MULTI` or * `Redis::PIPELINE'. * @return Redis|bool True if the transaction could be started. * @see https://redis.io/commands/multi * @example * $redis->multi(); * $redis->set('foo', 'bar'); * $redis->get('foo'); * $redis->exec(); */ public function multi(int $value = Redis::MULTI): bool|Redis {} public function object(string $subcommand, string $key): Redis|int|string|false {} /** * @deprecated */ public function open(string $host, int $port = 6379, float $timeout = 0, ?string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0, ?array $context = null): bool {} public function pconnect(string $host, int $port = 6379, float $timeout = 0, ?string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0, ?array $context = null): bool {} /** * Remove the expiration from a key. * @param string $key The key to operate against. * @return Redis|bool True if a timeout was removed and false if it was not or the key didn't exist. */ public function persist(string $key): Redis|bool {} /** * Sets an expiration in milliseconds on a given key. If connected to Redis >= 7.0.0 * you can pass an optional mode argument that modifies how the command will execute. * @param string $key The key to set an expiration on. * @param int $timeout The number of milliseconds after which key will be automatically deleted. * @param string|null $mode A two character modifier that changes how the * command works. * @return bool True if an expiry was set on the key, and false otherwise. * @see Redis::expire() for a description of the mode argument. */ public function pexpire(string $key, int $timeout, ?string $mode = null): bool {} /** * Set a key's expiration to a specific Unix Timestamp in milliseconds. If connected to * Redis >= 7.0.0 you can pass an optional 'mode' argument. * @param string $key The key to set an expiration on. * @param int $timestamp The unix timestamp to expire at. * @param string|null $mode A two character modifier that changes how the * command works. * @return Redis|bool True if an expiration was set on the key, false otherwise. * @see Redis::expire() For a description of the mode argument. */ public function pexpireAt(string $key, int $timestamp, ?string $mode = null): Redis|bool {} /** * Add one or more elements to a Redis HyperLogLog key * @see https://redis.io/commands/pfadd * @param string $key The key in question. * @param array $elements One or more elements to add. * @return Redis|int Returns 1 if the set was altered, and zero if not. */ public function pfadd(string $key, array $elements): Redis|int {} /** * Retrieve the cardinality of a Redis HyperLogLog key. * @see https://redis.io/commands/pfcount * @param array|string $key_or_keys Either one key or an array of keys * @return Redis|int|false The estimated cardinality of the set. */ public function pfcount(array|string $key_or_keys): Redis|int|false {} /** * Merge one or more source HyperLogLog sets into a destination set. * @see https://redis.io/commands/pfmerge * @param string $dst The destination key. * @param array $srckeys One or more source keys. * @return Redis|bool Always returns true. */ public function pfmerge(string $dst, array $srckeys): Redis|bool {} /** * PING the redis server with an optional string argument. * @see https://redis.io/commands/ping * @param string|null $message An optional string message that Redis will reply with, if passed. * @return Redis|string|false If passed no message, this command will simply return `true`. * If a message is passed, it will return the message. * @example $redis->ping(); * @example $redis->ping('beep boop'); */ public function ping(?string $message = null): Redis|string|bool {} /** * Enter into pipeline mode. * Pipeline mode is the highest performance way to send many commands to Redis * as they are aggregated into one stream of commands and then all sent at once * when the user calls Redis::exec(). * NOTE: That this is shorthand for Redis::multi(Redis::PIPELINE) * @return Redis|bool The redis object is returned, to facilitate method chaining. * @example * $redis->pipeline() * ->set('foo', 'bar') * ->del('mylist') * ->rpush('mylist', 'a', 'b', 'c') * ->exec(); */ public function pipeline(): bool|Redis {} /** * @deprecated */ public function popen(string $host, int $port = 6379, float $timeout = 0, ?string $persistent_id = null, int $retry_interval = 0, float $read_timeout = 0, ?array $context = null): bool {} /** * Set a key with an expiration time in milliseconds * @param string $key The key to set * @param int $expire The TTL to set, in milliseconds. * @param mixed $value The value to set the key to. * @return Redis|bool True if the key could be set. * @example $redis->psetex('mykey', 1000, 'myval'); */ public function psetex(string $key, int $expire, mixed $value): Redis|bool {} /** * Subscribe to one or more glob-style patterns * @param array $patterns One or more patterns to subscribe to. * @param callable $cb A callback with the following prototype: * * function ($redis, $channel, $message) { } * * @return bool True if we were subscribed. * @see https://redis.io/commands/psubscribe */ public function psubscribe(array $patterns, callable $cb): bool {} /** * Get a keys time to live in milliseconds. * @param string $key The key to check. * @return Redis|int|false The key's TTL or one of two special values if it has none. * * -1 - The key has no TTL. * -2 - The key did not exist. * * @see https://redis.io/commands/pttl * @example $redis->pttl('ttl-key'); */ public function pttl(string $key): Redis|int|false {} /** * Publish a message to a pubsub channel * @see https://redis.io/commands/publish * @param string $channel The channel to publish to. * @param string $message The message itself. * @return Redis|int|false The number of subscribed clients to the given channel. */ public function publish(string $channel, string $message): Redis|int|false {} public function pubsub(string $command, mixed $arg = null): mixed {} /** * Unsubscribe from one or more channels by pattern * @see https://redis.io/commands/punsubscribe * @see https://redis.io/commands/subscribe * @see Redis::subscribe() * @param array $patterns One or more glob-style patterns of channel names. * @return Redis|array|bool The array of subscribed patterns or false on failure. */ public function punsubscribe(array $patterns): Redis|array|bool {} /** * Pop one or more elements from the end of a list. * @param string $key A redis LIST key name. * @param int $count The maximum number of elements to pop at once. * NOTE: The `count` argument requires Redis >= 6.2.0 * @return Redis|array|string|bool One ore more popped elements or false if all were empty. * @see https://redis.io/commands/rpop * @example $redis->rPop('mylist'); * @example $redis->rPop('mylist', 4); */ public function rPop(string $key, int $count = 0): Redis|array|string|bool {} /** * Return a random key from the current database * @see https://redis.io/commands/randomkey * @return Redis|string|false A random key name or false if no keys exist */ public function randomKey(): Redis|string|false {} /** * Execute any arbitrary Redis command by name. * @param string $command The command to execute * @param mixed $args One or more arguments to pass to the command. * @return mixed Can return any number of things depending on command executed. * @example $redis->rawCommand('del', 'mystring', 'mylist'); * @example $redis->rawCommand('set', 'mystring', 'myvalue'); * @example $redis->rawCommand('rpush', 'mylist', 'one', 'two', 'three'); */ public function rawcommand(string $command, mixed ...$args): mixed {} /** * Unconditionally rename a key from $old_name to $new_name * @see https://redis.io/commands/rename * @param string $old_name The original name of the key * @param string $new_name The new name for the key * @return Redis|bool True if the key was renamed or false if not. */ public function rename(string $old_name, string $new_name): Redis|bool {} /** * Renames $key_src to $key_dst but only if newkey does not exist. * @see https://redis.io/commands/renamenx * @param string $key_src The source key name * @param string $key_dst The destination key name. * @return Redis|bool True if the key was renamed, false if not. * @example * $redis->set('src', 'src_key'); * $redis->set('existing-dst', 'i_exist'); * $redis->renamenx('src', 'dst'); * $redis->renamenx('dst', 'existing-dst'); */ public function renameNx(string $key_src, string $key_dst): Redis|bool {} /** * Reset the state of the connection. * @return Redis|bool Should always return true unless there is an error. */ public function reset(): Redis|bool {} /** * Restore a key by the binary payload generated by the DUMP command. * @param string $key The name of the key you wish to create. * @param int $ttl What Redis should set the key's TTL (in milliseconds) to once it is created. * Zero means no TTL at all. * @param string $value The serialized binary value of the string (generated by DUMP). * @param array|null $options An array of additional options that modifies how the command operates. * * $options = [ * 'ABSTTL' # If this is present, the `$ttl` provided by the user should * # be an absolute timestamp, in milliseconds() * 'REPLACE' # This flag instructs Redis to store the key even if a key with * # that name already exists. * 'IDLETIME' => int # Tells Redis to set the keys internal 'idletime' value to a * # specific number (see the Redis command OBJECT for more info). * 'FREQ' => int # Tells Redis to set the keys internal 'FREQ' value to a specific * # number (this relates to Redis' LFU eviction algorithm). * ]; * * @return Redis|bool True if the key was stored, false if not. * @see https://redis.io/commands/restore * @see https://redis.io/commands/dump * @see Redis::dump() * @example * $redis->sAdd('captains', 'Janeway', 'Picard', 'Sisko', 'Kirk', 'Archer'); * $serialized = $redis->dump('captains'); * $redis->restore('captains-backup', 0, $serialized); */ public function restore(string $key, int $ttl, string $value, ?array $options = null): Redis|bool {} /** * Query whether the connected instance is a primary or replica * @return mixed Will return an array with the role of the connected instance unless there is * an error. */ public function role(): mixed {} /** * Atomically pop an element off the end of a Redis LIST and push it to the beginning of * another. * @param string $srckey The source key to pop from. * @param string $dstkey The destination key to push to. * @return Redis|string|false The popped element or false if the source key was empty. * @see https://redis.io/commands/rpoplpush * @example * $redis->pipeline() * ->del('list1', 'list2') * ->rpush('list1', 'list1-1', 'list1-2') * ->rpush('list2', 'list2-1', 'list2-2') * ->exec(); * $redis->rpoplpush('list2', 'list1'); */ public function rpoplpush(string $srckey, string $dstkey): Redis|string|false {} /** * Add one or more values to a Redis SET key. * @param string $key The key name * @param mixed $value A value to add to the set. * @param mixed ...$other_values One or more additional values to add * @return Redis|int|false The number of values added to the set. * @see https://redis.io/commands/sadd * @example * $redis->del('myset'); * $redis->sadd('myset', 'foo', 'bar', 'baz'); * $redis->sadd('myset', 'foo', 'new'); */ public function sAdd(string $key, mixed $value, mixed ...$other_values): Redis|int|false {} /** * Add one ore more values to a Redis SET key. This is an alternative to Redis::sadd() but * instead of being variadic, takes a single array of values. * @see https://redis.io/commands/sadd * @see Redis::sadd() * @param string $key The set to add values to. * @param array $values One or more members to add to the set. * @return int The number of members added to the set. * @example * $redis->del('myset'); * $redis->sAddArray('myset', ['foo', 'bar', 'baz']); * $redis->sAddArray('myset', ['foo', 'new']); */ public function sAddArray(string $key, array $values): int {} /** * Given one or more Redis SETS, this command returns all of the members from the first * set that are not in any subsequent set. * @param string $key The first set * @param string ...$other_keys One or more additional sets * @return Redis|array|false Returns the elements from keys 2..N that don't exist in the * first sorted set, or false on failure. * @see https://redis.io/commands/sdiff * @example * $redis->pipeline() * ->del('set1', 'set2', 'set3') * ->sadd('set1', 'apple', 'banana', 'carrot', 'date') * ->sadd('set2', 'carrot') * ->sadd('set3', 'apple', 'carrot', 'eggplant') * ->exec(); * $redis->sdiff('set1', 'set2', 'set3'); */ public function sDiff(string $key, string ...$other_keys): Redis|array|false {} /** * This method performs the same operation as SDIFF except it stores the resulting diff * values in a specified destination key. * @see https://redis.io/commands/sdiffstore * @see Redis::sdiff() * @param string $dst The key where to store the result * @param string $key The first key to perform the DIFF on * @param string ...$other_keys One or more additional keys. * @return Redis|int|false The number of values stored in the destination set or false on failure. */ public function sDiffStore(string $dst, string $key, string ...$other_keys): Redis|int|false {} /** * Given one or more Redis SET keys, this command will return all of the elements that are * in every one. * @see https://redis.io/commands/sinter * @param array|string $key The first SET key to intersect. * @param string ...$other_keys One or more Redis SET keys. * @example * $redis->pipeline() * ->del('alice_likes', 'bob_likes', 'bill_likes') * ->sadd('alice_likes', 'asparagus', 'broccoli', 'carrot', 'potato') * ->sadd('bob_likes', 'asparagus', 'carrot', 'potato') * ->sadd('bill_likes', 'broccoli', 'potato') * ->exec(); * var_dump($redis->sinter('alice_likes', 'bob_likes', 'bill_likes')); * */ public function sInter(array|string $key, string ...$other_keys): Redis|array|false {} /** * Compute the intersection of one or more sets and return the cardinality of the result. * @param array $keys One or more set key names. * @param int $limit A maximum cardinality to return. This is useful to put an upper bound * on the amount of work Redis will do. * @return Redis|int|false The * @see https://redis.io/commands/sintercard * @example * $redis->sAdd('set1', 'apple', 'pear', 'banana', 'carrot'); * $redis->sAdd('set2', 'apple', 'banana'); * $redis->sAdd('set3', 'pear', 'banana'); * $redis->sInterCard(['set1', 'set2', 'set3']); * ?> * */ public function sintercard(array $keys, int $limit = -1): Redis|int|false {} /** * Perform the intersection of one or more Redis SETs, storing the result in a destination * key, rather than returning them. * @param array|string $key Either a string key, or an array of keys (with at least two * elements, consisting of the destination key name and one * or more source keys names. * @param string ...$other_keys If the first argument was a string, subsequent arguments should * be source key names. * @return Redis|int|false The number of values stored in the destination key or false on failure. * @see https://redis.io/commands/sinterstore * @see Redis::sinter() * @example $redis->sInterStore(['dst', 'src1', 'src2', 'src3']); * @example $redis->sInterStore('dst', 'src1', 'src'2', 'src3'); * ?> * */ public function sInterStore(array|string $key, string ...$other_keys): Redis|int|false {} /** * Retrieve every member from a set key. * @param string $key The set name. * @return Redis|array|false Every element in the set or false on failure. * @see https://redis.io/commands/smembers * @example * $redis->sAdd('tng-crew', ...['Picard', 'Riker', 'Data', 'Worf', 'La Forge', 'Troi', 'Crusher', 'Broccoli']); * $redis->sMembers('tng-crew'); */ public function sMembers(string $key): Redis|array|false {} /** * Check if one or more values are members of a set. * @see https://redis.io/commands/smismember * @see https://redis.io/commands/smember * @see Redis::smember() * @param string $key The set to query. * @param string $member The first value to test if exists in the set. * @param string ...$other_members Any number of additional values to check. * @return Redis|array|false An array of integers representing whether each passed value * was a member of the set. * @example * $redis->sAdd('ds9-crew', ...["Sisko", "Kira", "Dax", "Worf", "Bashir", "O'Brien"]); * $members = $redis->sMIsMember('ds9-crew', ...['Sisko', 'Picard', 'Data', 'Worf']); */ public function sMisMember(string $key, string $member, string ...$other_members): Redis|array|false {} /** * Pop a member from one set and push it onto another. This command will create the * destination set if it does not currently exist. * @see https://redis.io/commands/smove * @param string $src The source set. * @param string $dst The destination set. * @param mixed $value The member you wish to move. * @return Redis|bool True if the member was moved, and false if it wasn't in the set. * @example * $redis->sAdd('numbers', 'zero', 'one', 'two', 'three', 'four'); * $redis->sMove('numbers', 'evens', 'zero'); * $redis->sMove('numbers', 'evens', 'two'); * $redis->sMove('numbers', 'evens', 'four'); */ public function sMove(string $src, string $dst, mixed $value): Redis|bool {} /** * Remove one or more elements from a set. * @see https://redis.io/commands/spop * @param string $key The set in question. * @param int $count An optional number of members to pop. This defaults to * removing one element. * @example * $redis->del('numbers', 'evens'); * $redis->sAdd('numbers', 'zero', 'one', 'two', 'three', 'four'); * $redis->sPop('numbers'); */ public function sPop(string $key, int $count = 0): Redis|string|array|false {} /** * Retrieve one or more random members of a set. * @param string $key The set to query. * @param int $count An optional count of members to return. * If this value is positive, Redis will return *up to* the requested * number but with unique elements that will never repeat. This means * you may recieve fewer then `$count` replies. * If the number is negative, Redis will return the exact number requested * but the result may contain duplicate elements. * @return Redis|array|string|false One or more random members or false on failure. * @see https://redis.io/commands/srandmember * @example $redis->sRandMember('myset'); * @example $redis->sRandMember('myset', 10); * @example $redis->sRandMember('myset', -10); */ public function sRandMember(string $key, int $count = 0): Redis|string|array|false {} /** * Returns the union of one or more Redis SET keys. * @see https://redis.io/commands/sunion * @param string $key The first SET to do a union with * @param string ...$other_keys One or more subsequent keys * @return Redis|array|false The union of the one or more input sets or false on failure. * @example $redis->sunion('set1', 'set2'); */ public function sUnion(string $key, string ...$other_keys): Redis|array|false {} /** * Perform a union of one or more Redis SET keys and store the result in a new set * @see https://redis.io/commands/sunionstore * @see Redis::sunion() * @param string $dst The destination key * @param string $key The first source key * @param string ...$other_keys One or more additional source keys * @return Redis|int|false The number of elements stored in the destination SET or * false on failure. */ public function sUnionStore(string $dst, string $key, string ...$other_keys): Redis|int|false {} /** * Persist the Redis database to disk. This command will block the server until the save is * completed. For a nonblocking alternative, see Redis::bgsave(). * @see https://redis.io/commands/save * @see Redis::bgsave() * @return Redis|bool Returns true unless an error occurs. */ public function save(): Redis|bool {} /** * Incrementally scan the Redis keyspace, with optional pattern and type matching. * A note about Redis::SCAN_NORETRY and Redis::SCAN_RETRY. * For convenience, PhpRedis can retry SCAN commands itself when Redis returns an empty array of * keys with a nonzero iterator. This can happen when matching against a pattern that very few * keys match inside a key space with a great many keys. The following example demonstrates how * to use Redis::scan() with the option disabled and enabled. * @param int|null $iterator The cursor returned by Redis for every subsequent call to SCAN. On * the initial invocation of the call, it should be initialized by the * caller to NULL. Each time SCAN is invoked, the iterator will be * updated to a new number, until finally Redis will set the value to * zero, indicating that the scan is complete. * @param string|null $pattern An optional glob-style pattern for matching key names. If passed as * NULL, it is the equivalent of sending '*' (match every key). * @param int $count A hint to redis that tells it how many keys to return in a single * call to SCAN. The larger the number, the longer Redis may block * clients while iterating the key space. * @param string|null $type An optional argument to specify which key types to scan (e.g. * 'STRING', 'LIST', 'SET') * @return array|false An array of keys, or false if no keys were returned for this * invocation of scan. Note that it is possible for Redis to return * zero keys before having scanned the entire key space, so the caller * should instead continue to SCAN until the iterator reference is * returned to zero. * @see https://redis.io/commands/scan * @see Redis::setOption() * @example * $redis = new Redis(['host' => 'localhost']); * $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY); * $it = null; * do { * $keys = $redis->scan($it, '*zorg*'); * foreach ($keys as $key) { * echo "KEY: $key\n"; * } * } while ($it != 0); * $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); * $it = null; * // When Redis::SCAN_RETRY is enabled, we can use simpler logic, as we will never receive an * // empty array of keys when the iterator is nonzero. * while ($keys = $redis->scan($it, '*zorg*')) { * foreach ($keys as $key) { * echo "KEY: $key\n"; * } * } */ public function scan(?int &$iterator, ?string $pattern = null, int $count = 0, ?string $type = null): array|false {} /** * Retrieve the number of members in a Redis set. * @param string $key The set to get the cardinality of. * @return Redis|int|false The cardinality of the set or false on failure. * @see https://redis.io/commands/scard * @example $redis->scard('set'); * */ public function scard(string $key): Redis|int|false {} /** * An administrative command used to interact with LUA scripts stored on the server. * @see https://redis.io/commands/script * @param string $command The script suboperation to execute. * @param mixed $args One ore more additional argument * @return mixed This command returns various things depending on the specific operation executed. * @example $redis->script('load', 'return 1'); * @example $redis->script('exists', sha1('return 1')); */ public function script(string $command, mixed ...$args): mixed {} /** * Select a specific Redis database. * @param int $db The database to select. Note that by default Redis has 16 databases (0-15). * @return Redis|bool true on success and false on failure * @see https://redis.io/commands/select * @example $redis->select(1); */ public function select(int $db): Redis|bool {} /** * Create or set a Redis STRING key to a value. * @param string $key The key name to set. * @param mixed $value The value to set the key to. * @param array|int $options Either an array with options for how to perform the set or an * integer with an expiration. If an expiration is set PhpRedis * will actually send the `SETEX` command. * OPTION DESCRIPTION * ------------ -------------------------------------------------------------- * ['EX' => 60] expire 60 seconds. * ['PX' => 6000] expire in 6000 milliseconds. * ['EXAT' => time() + 10] expire in 10 seconds. * ['PXAT' => time()*1000 + 1000] expire in 1 second. * ['KEEPTTL' => true] Redis will not update the key's current TTL. * ['XX'] Only set the key if it already exists. * ['NX'] Only set the key if it doesn't exist. * ['GET'] Instead of returning `+OK` return the previous value of the * key or NULL if the key didn't exist. * @return Redis|string|bool True if the key was set or false on failure. * @see https://redis.io/commands/set * @see https://redis.io/commands/setex * @example $redis->set('key', 'value'); * @example $redis->set('key', 'expires_in_60_seconds', 60); */ public function set(string $key, mixed $value, mixed $options = null): Redis|string|bool {} /** * Set a specific bit in a Redis string to zero or one * @see https://redis.io/commands/setbit * @param string $key The Redis STRING key to modify * @param bool $value Whether to set the bit to zero or one. * @return Redis|int|false The original value of the bit or false on failure. * @example * $redis->set('foo', 'bar'); * $redis->setbit('foo', 7, 1); */ public function setBit(string $key, int $idx, bool $value): Redis|int|false {} /** * Update or append to a Redis string at a specific starting index * @see https://redis.io/commands/setrange * @param string $key The key to update * @param int $index Where to insert the provided value * @param string $value The value to copy into the string. * @return Redis|int|false The new length of the string or false on failure * @example * $redis->set('message', 'Hello World'); * $redis->setRange('message', 6, 'Redis'); */ public function setRange(string $key, int $index, string $value): Redis|int|false {} /** * Set a configurable option on the Redis object. * Following are a list of options you can set: * | OPTION | TYPE | DESCRIPTION | * | --------------- | ---- | ----------- | * | OPT_MAX_RETRIES | int | The maximum number of times Redis will attempt to reconnect if it gets disconnected, before throwing an exception. | * | OPT_SCAN | enum | Redis::OPT_SCAN_RETRY, or Redis::OPT_SCAN_NORETRY. Whether PhpRedis should automatically SCAN again when zero keys but a nonzero iterator are returned. | * | OPT_SERIALIZER | enum | Set the automatic data serializer.
`Redis::SERIALIZER_NONE`
`Redis::SERIALIZER_PHP`
`Redis::SERIALIZER_IGBINARY`
`Redis::SERIALIZER_MSGPACK`, `Redis::SERIALIZER_JSON`| * | OPT_PREFIX | string | A string PhpRedis will use to prefix every key we read or write. | * | OPT_READ_TIMEOUT | float | How long PhpRedis will block for a response from Redis before throwing a 'read error on connection' exception. | * | OPT_TCP_KEEPALIVE | bool | Set or disable TCP_KEEPALIVE on the connection. | * | OPT_COMPRESSION | enum | Set the compression algorithm
`Redis::COMPRESSION_NONE`
`Redis::COMPRESSION_LZF`
`Redis::COMPRESSION_LZ4`
`Redis::COMPRESSION_ZSTD` | * | OPT_REPLY_LITERAL | bool | If set to true, PhpRedis will return the literal string Redis returns for LINE replies (e.g. '+OK'), rather than `true`. | * | OPT_COMPRESSION_LEVEL | int | Set a specific compression level if Redis is compressing data. | * | OPT_NULL_MULTIBULK_AS_NULL | bool | Causes PhpRedis to return `NULL` rather than `false` for NULL MULTIBULK replies | * | OPT_BACKOFF_ALGORITHM | enum | The exponential backoff strategy to use. | * | OPT_BACKOFF_BASE | int | The minimum delay between retries when backing off. | * | OPT_BACKOFF_CAP | int | The maximum delay between replies when backing off. | * @param int $option The option constant. * @param mixed $value The option value. * @return bool true if the setting was updated, false if not. * @see Redis::__construct() for details about backoff strategies. * @see Redis::getOption() */ public function setOption(int $option, mixed $value): bool {} /** * Set a Redis STRING key with a specific expiration in seconds. * @param string $key The name of the key to set. * @param int $expire The key's expiration in seconds. * @param mixed $value The value to set the key. * @return Redis|bool True on success or false on failure. * @example $redis->setex('60s-ttl', 60, 'some-value'); */ public function setex(string $key, int $expire, mixed $value) {} /** * Set a key to a value, but only if that key does not already exist. * @see https://redis.io/commands/setnx * @param string $key The key name to set. * @param mixed $value What to set the key to. * @return Redis|bool Returns true if the key was set and false otherwise. * @example $redis->setnx('existing-key', 'existing-value'); * @example $redis->setnx('new-key', 'new-value'); */ public function setnx(string $key, mixed $value): Redis|bool {} /** * Check whether a given value is the member of a Redis SET. * @param string $key The redis set to check. * @param mixed $value The value to test. * @return Redis|bool True if the member exists and false if not. * @example $redis->sismember('myset', 'mem1', 'mem2'); */ public function sismember(string $key, mixed $value): Redis|bool {} /** * Turn a redis instance into a replica of another or promote a replica * to a primary. * This method and the corresponding command in Redis has been marked deprecated * and users should instead use Redis::replicaof() if connecting to redis-server * >= 5.0.0. * @deprecated * @see https://redis.io/commands/slaveof * @see https://redis.io/commands/replicaof * @see Redis::replicaof() */ public function slaveof(?string $host = null, int $port = 6379): Redis|bool {} /** * Used to turn a Redis instance into a replica of another, or to remove * replica status promoting the instance to a primary. * @see https://redis.io/commands/replicaof * @see https://redis.io/commands/slaveof * @see Redis::slaveof() * @param string|null $host The host of the primary to start replicating. * @param int $port The port of the primary to start replicating. * @return Redis|bool Success if we were successfully able to start replicating a primary or * were able to promote teh replicat to a primary. * @example * $redis = new Redis(['host' => 'localhost']); * // Attempt to become a replica of a Redis instance at 127.0.0.1:9999 * $redis->replicaof('127.0.0.1', 9999); * // When passed no arguments, PhpRedis will deliver the command `REPLICAOF NO ONE` * // attempting to promote the instance to a primary. * $redis->replicaof(); */ public function replicaof(?string $host = null, int $port = 6379): Redis|bool {} /** * Update one or more keys last modified metadata. * @see https://redis.io/commands/touch/ * @param array|string $key_or_array * @param string ...$more_keys One or more keys to send to the command. * @return Redis|int|false This command returns the number of keys that exist and * had their last modified time reset */ public function touch(array|string $key_or_array, string ...$more_keys): Redis|int|false {} /** * Interact with Redis' slowlog functionality in various ways, depending * on the value of 'operation'. * @param string $operation The operation you wish to perform. This can * be one of the following values: * 'GET' - Retrieve the Redis slowlog as an array. * 'LEN' - Retrieve the length of the slowlog. * 'RESET' - Remove all slowlog entries. * @param int $length This optional argument can be passed when operation * is 'get' and will specify how many elements to retrieve. * If omitted Redis will send up to a default number of * entries, which is configurable. * Note: With Redis >= 7.0.0 you can send -1 to mean "all". * @return mixed * @see https://redis.io/commands/slowlog/ * @example $redis->slowlog('get', -1); // Retrieve all slowlog entries. * @example $redis->slowlog('len'); // Retrieve slowlog length. * @example $redis->slowlog('reset'); // Reset the slowlog. */ public function slowlog(string $operation, int $length = 0): mixed {} /** * Sort the contents of a Redis key in various ways. * @see https://redis.io/commands/sort/ * @param string $key The key you wish to sort * @param array|null $options Various options controlling how you would like the * data sorted. See blow for a detailed description * of this options array. * @return mixed This command can either return an array with the sorted data * or the number of elements placed in a destination set when * using the STORE option. * @example * $options = [ * 'SORT' => 'ASC'|| 'DESC' // Sort in descending or descending order. * 'ALPHA' => true || false // Whether to sort alphanumerically. * 'LIMIT' => [0, 10] // Return a subset of the data at offset, count * 'BY' => 'weight_*' // For each element in the key, read data from the * external key weight_* and sort based on that value. * 'GET' => 'weight_*' // For each element in the source key, retrieve the * data from key weight_* and return that in the result * rather than the source keys' element. This can * be used in combination with 'BY' * ]; */ public function sort(string $key, ?array $options = null): mixed {} /** * This is simply a read-only variant of the sort command * @see Redis::sort() */ public function sort_ro(string $key, ?array $options = null): mixed {} /** * @deprecated */ public function sortAsc(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * @deprecated */ public function sortAscAlpha(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * @deprecated */ public function sortDesc(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * @deprecated */ public function sortDescAlpha(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * Remove one or more values from a Redis SET key. * @see https://redis.io/commands/srem * @param string $key The Redis SET key in question. * @param mixed $value The first value to remove. * @param mixed ...$other_values One or more additional values to remove. * @return Redis|int|false The number of values removed from the set or false on failure. * @example $redis->sRem('set1', 'mem1', 'mem2', 'not-in-set'); */ public function srem(string $key, mixed $value, mixed ...$other_values): Redis|int|false {} /** * Scan the members of a redis SET key. * @see https://redis.io/commands/sscan * @see https://redis.io/commands/scan * @see Redis::setOption() * @param string $key The Redis SET key in question. * @param int|null $iterator A reference to an iterator which should be initialized to NULL that * PhpRedis will update with the value returned from Redis after each * subsequent call to SSCAN. Once this cursor is zero you know all * members have been traversed. * @param string|null $pattern An optional glob style pattern to match against, so Redis only * returns the subset of members matching this pattern. * @param int $count A hint to Redis as to how many members it should scan in one command * before returning members for that iteration. * @return array|false * @example * $redis->del('myset'); * for ($i = 0; $i < 10000; $i++) { * $redis->sAdd('myset', "member:$i"); * } * $redis->sadd('myset', 'foofoo'); * $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY); * $scanned = 0; * $it = null; * // Without Redis::SCAN_RETRY we may receive empty results and * // a nonzero iterator. * do { * // Scan members containing '5' * $members = $redis->sscan('myset', $it, '*5*'); * foreach ($members as $member) { * echo "NORETRY: $member\n"; * $scanned++; * } * } while ($it != 0); * echo "TOTAL: $scanned\n"; * $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); * $scanned = 0; * $it = null; * // With Redis::SCAN_RETRY PhpRedis will never return an empty array * // when the cursor is non-zero * while (($members = $redis->sscan('myset', $it, '*5*'))) { * foreach ($members as $member) { * echo "RETRY: $member\n"; * $scanned++; * } * } */ public function sscan(string $key, ?int &$iterator, ?string $pattern = null, int $count = 0): array|false {} /** * Subscribes the client to the specified shard channels. * @param array $channels One or more channel names. * @param callable $cb The callback PhpRedis will invoke when we receive a message * from one of the subscribed channels. * @return bool True on success, false on faiilure. Note that this command will block the * client in a subscribe loop, waiting for messages to arrive. * @see https://redis.io/commands/ssubscribe * @example * $redis = new Redis(['host' => 'localhost']); * $redis->ssubscribe(['channel-1', 'channel-2'], function ($redis, $channel, $message) { * echo "[$channel]: $message\n"; * // Unsubscribe from the message channel when we read 'quit' * if ($message == 'quit') { * echo "Unsubscribing from '$channel'\n"; * $redis->sunsubscribe([$channel]); * } * }); * // Once we read 'quit' from both channel-1 and channel-2 the subscribe loop will be * // broken and this command will execute. * echo "Subscribe loop ended\n"; */ public function ssubscribe(array $channels, callable $cb): bool {} /** * Retrieve the length of a Redis STRING key. * @param string $key The key we want the length of. * @return Redis|int|false The length of the string key if it exists, zero if it does not, and * false on failure. * @see https://redis.io/commands/strlen * @example $redis->strlen('mykey'); */ public function strlen(string $key): Redis|int|false {} /** * Subscribe to one or more Redis pubsub channels. * @param array $channels One or more channel names. * @param callable $cb The callback PhpRedis will invoke when we receive a message * from one of the subscribed channels. * @return bool True on success, false on faiilure. Note that this command will block the * client in a subscribe loop, waiting for messages to arrive. * @see https://redis.io/commands/subscribe * @example * $redis = new Redis(['host' => 'localhost']); * $redis->subscribe(['channel-1', 'channel-2'], function ($redis, $channel, $message) { * echo "[$channel]: $message\n"; * // Unsubscribe from the message channel when we read 'quit' * if ($message == 'quit') { * echo "Unsubscribing from '$channel'\n"; * $redis->unsubscribe([$channel]); * } * }); * // Once we read 'quit' from both channel-1 and channel-2 the subscribe loop will be * // broken and this command will execute. * echo "Subscribe loop ended\n"; */ public function subscribe(array $channels, callable $cb): bool {} /** * Unsubscribes the client from the given shard channels, * or from all of them if none is given. * @param array $channels One or more channels to unsubscribe from. * @return Redis|array|bool The array of unsubscribed channels. * @see https://redis.io/commands/sunsubscribe * @see Redis::ssubscribe() * @example * $redis->ssubscribe(['channel-1', 'channel-2'], function ($redis, $channel, $message) { * if ($message == 'quit') { * echo "$channel => 'quit' detected, unsubscribing!\n"; * $redis->sunsubscribe([$channel]); * } else { * echo "$channel => $message\n"; * } * }); * echo "We've unsubscribed from both channels, exiting\n"; */ public function sunsubscribe(array $channels): Redis|array|bool {} /** * Atomically swap two Redis databases so that all of the keys in the source database will * now be in the destination database and vice-versa. * Note: This command simply swaps Redis' internal pointer to the database and is therefore * very fast, regardless of the size of the underlying databases. * @param int $src The source database number * @param int $dst The destination database number * @return Redis|bool Success if the databases could be swapped and false on failure. * @see https://redis.io/commands/swapdb * @see Redis::del() * @example * $redis->select(0); * $redis->set('db0-key', 'db0-value'); * $redis->swapdb(0, 1); * $redis->get('db0-key'); */ public function swapdb(int $src, int $dst): Redis|bool {} /** * Retrieve the server time from the connected Redis instance. * @see https://redis.io/commands/time * @return Redis|array A two element array consisting of a Unix Timestamp and the number of microseconds * elapsed since the second. * @example $redis->time(); */ public function time(): Redis|array {} /** * Get the amount of time a Redis key has before it will expire, in seconds. * @param string $key The Key we want the TTL for. * @return Redis|int|false (a) The number of seconds until the key expires, or -1 if the key has * no expiration, and -2 if the key does not exist. In the event of an * error, this command will return false. * @see https://redis.io/commands/ttl * @example $redis->ttl('mykey'); */ public function ttl(string $key): Redis|int|false {} /** * Get the type of a given Redis key. * @see https://redis.io/commands/type * @param string $key The key to check * @return Redis|int|false The Redis type constant or false on failure. * The Redis class defines several type constants that correspond with Redis key types. * Redis::REDIS_NOT_FOUND * Redis::REDIS_STRING * Redis::REDIS_SET * Redis::REDIS_LIST * Redis::REDIS_ZSET * Redis::REDIS_HASH * Redis::REDIS_STREAM * @example * foreach ($redis->keys('*') as $key) { * echo "$key => " . $redis->type($key) . "\n"; * } */ public function type(string $key): Redis|int|false {} /** * Delete one or more keys from the Redis database. Unlike this operation, the actual * deletion is asynchronous, meaning it is safe to delete large keys without fear of * Redis blocking for a long period of time. * @param array|string $key Either an array with one or more keys or a string with * the first key to delete. * @param string ...$other_keys If the first argument passed to this method was a string * you may pass any number of additional key names. * @return Redis|int|false The number of keys deleted or false on failure. * @see https://redis.io/commands/unlink * @see https://redis.io/commands/del * @see Redis::del() * @example $redis->unlink('key1', 'key2', 'key3'); * @example $redis->unlink(['key1', 'key2', 'key3']); */ public function unlink(array|string $key, string ...$other_keys): Redis|int|false {} /** * Unsubscribe from one or more subscribed channels. * @param array $channels One or more channels to unsubscribe from. * @return Redis|array|bool The array of unsubscribed channels. * @see https://redis.io/commands/unsubscribe * @see Redis::subscribe() * @example * $redis->subscribe(['channel-1', 'channel-2'], function ($redis, $channel, $message) { * if ($message == 'quit') { * echo "$channel => 'quit' detected, unsubscribing!\n"; * $redis->unsubscribe([$channel]); * } else { * echo "$channel => $message\n"; * } * }); * echo "We've unsubscribed from both channels, exiting\n"; */ public function unsubscribe(array $channels): Redis|array|bool {} /** * Remove any previously WATCH'ed keys in a transaction. * @see https://redis.io/commands/unwatch * @see https://redis.io/commands/unwatch * @see Redis::watch() * @return Redis|bool on success and false on failure. */ public function unwatch(): Redis|bool {} /** * Watch one or more keys for conditional execution of a transaction. * @param array|string $key Either an array with one or more key names, or a string key name * @param string ...$other_keys If the first argument was passed as a string, any number of additional * string key names may be passed variadically. * @return Redis|bool * @see https://redis.io/commands/watch * @see https://redis.io/commands/unwatch * @example * $redis1 = new Redis(['host' => 'localhost']); * $redis2 = new Redis(['host' => 'localhost']); * // Start watching 'incr-key' * $redis1->watch('incr-key'); * // Retrieve its value. * $val = $redis1->get('incr-key'); * // A second client modifies 'incr-key' after we read it. * $redis2->set('incr-key', 0); * // Because another client changed the value of 'incr-key' after we read it, this * // is no longer a proper increment operation, but because we are `WATCH`ing the * // key, this transaction will fail and we can try again. * // * // If were to comment out the above `$redis2->set('incr-key', 0)` line the * // transaction would succeed. * $redis1->multi(); * $redis1->set('incr-key', $val + 1); * $res = $redis1->exec(); * // bool(false) * var_dump($res); */ public function watch(array|string $key, string ...$other_keys): Redis|bool {} /** * Block the client up to the provided timeout until a certain number of replicas have confirmed * recieving them. * @see https://redis.io/commands/wait * @param int $numreplicas The number of replicas we want to confirm write operaions * @param int $timeout How long to wait (zero meaning forever). * @return int|false The number of replicas that have confirmed or false on failure. */ public function wait(int $numreplicas, int $timeout): int|false {} /** * Acknowledge one ore more messages that are pending (have been consumed using XREADGROUP but * not yet acknowledged by XACK.) * @param string $key The stream to query. * @param string $group The consumer group to use. * @param array $ids An array of stream entry IDs. * @return int|false The number of acknowledged messages * @see https://redis.io/commands/xack * @see https://redis.io/commands/xreadgroup * @see Redis::xack() * @example * $redis->xAdd('ships', '*', ['name' => 'Enterprise']); * $redis->xAdd('ships', '*', ['name' => 'Defiant']); * $redis->xGroup('CREATE', 'ships', 'Federation', '0-0'); * // Consume a single message with the consumer group 'Federation' * $ship = $redis->xReadGroup('Federation', 'Picard', ['ships' => '>'], 1); * /* Retrieve the ID of the message we read. * assert(isset($ship['ships'])); * $id = key($ship['ships']); * // The message we just read is now pending. * $res = $redis->xPending('ships', 'Federation')); * var_dump($res); * // We can tell Redis we were able to process the message by using XACK * $res = $redis->xAck('ships', 'Federation', [$id]); * assert($res === 1); * // The message should no longer be pending. * $res = $redis->xPending('ships', 'Federation'); * var_dump($res); */ public function xack(string $key, string $group, array $ids): int|false {} /** * Append a message to a stream. * @param string $key The stream name. * @param string $id The ID for the message we want to add. This can be the special value '*' * which means Redis will generate the ID that appends the message to the * end of the stream. It can also be a value in the form -* which will * generate an ID that appends to the end ot entries with the same value * (if any exist). * @param int $maxlen If specified Redis will append the new message but trim any number of the * oldest messages in the stream until the length is <= $maxlen. * @param bool $approx Used in conjunction with `$maxlen`, this flag tells Redis to trim the stream * but in a more efficient way, meaning the trimming may not be exactly to * `$maxlen` values. * @param bool $nomkstream If passed as `TRUE`, the stream must exist for Redis to append the message. * @see https://redis.io/commands/xadd * @example $redis->xAdd('ds9-season-1', '1-1', ['title' => 'Emissary Part 1']); * @example $redis->xAdd('ds9-season-1', '1-2', ['title' => 'A Man Alone']); */ public function xadd(string $key, string $id, array $values, int $maxlen = 0, bool $approx = false, bool $nomkstream = false): Redis|string|false {} /** * This command allows a consumer to claim pending messages that have been idle for a specified period of time. * Its purpose is to provide a mechanism for picking up messages that may have had a failed consumer. * @see https://redis.io/commands/xautoclaim * @see https://redis.io/commands/xclaim * @see https://redis.io/docs/data-types/streams-tutorial/ * @param string $key The stream to check. * @param string $group The consumer group to query. * @param string $consumer Which consumer to check. * @param int $min_idle The minimum time in milliseconds for the message to have been pending. * @param string $start The minimum message id to check. * @param int $count An optional limit on how many messages are returned. * @param bool $justid If the client only wants message IDs and not all of their data. * @return Redis|array|bool An array of pending IDs or false if there are none, or on failure. * @example * $redis->xGroup('CREATE', 'ships', 'combatants', '0-0', true); * $redis->xAdd('ships', '1424-74205', ['name' => 'Defiant']); * // Consume the ['name' => 'Defiant'] message * $msgs = $redis->xReadGroup('combatants', "Jem'Hadar", ['ships' => '>'], 1); * // The "Jem'Hadar" consumer has the message presently * $pending = $redis->xPending('ships', 'combatants'); * var_dump($pending); * // Asssume control of the pending message with a different consumer. * $res = $redis->xAutoClaim('ships', 'combatants', 'Sisko', 0, '0-0'); * // Now the 'Sisko' consumer owns the message * $pending = $redis->xPending('ships', 'combatants'); * var_dump($pending); */ public function xautoclaim(string $key, string $group, string $consumer, int $min_idle, string $start, int $count = -1, bool $justid = false): Redis|bool|array {} /** * This method allows a consumer to take ownership of pending stream entries, by ID. Another * command that does much the same thing but does not require passing specific IDs is `Redis::xAutoClaim`. * @see https://redis.io/commands/xclaim * @see https://redis.io/commands/xautoclaim. * @param string $key The stream we wish to claim messages for. * @param string $group Our consumer group. * @param string $consumer Our consumer. * @param int $min_idle The minimum idle-time in milliseconds a message must have for ownership to be transferred. * @param array $options An options array that modifies how the command operates. * * # Following is an options array describing every option you can pass. Note that * # 'IDLE', and 'TIME' are mutually exclusive. * $options = [ * 'IDLE' => 3 # Set the idle time of the message to a 3. By default * # the idle time is set to zero. * 'TIME' => 1000*time() # Same as IDLE except it takes a unix timestamp in * # milliseconds. * 'RETRYCOUNT' => 0 # Set the retry counter to zero. By default XCLAIM * # doesn't modify the counter. * 'FORCE' # Creates the pending message entry even if IDs are * # not already * # in the PEL with another client. * 'JUSTID' # Return only an array of IDs rather than the messages * # themselves. * ]; * * @return Redis|array|bool An array of claimed messags or false on failure. * @example * $redis->xGroup('CREATE', 'ships', 'combatants', '0-0', true); * $redis->xAdd('ships', '1424-74205', ['name' => 'Defiant']); * // Consume the ['name' => 'Defiant'] message * $msgs = $redis->xReadGroup('combatants', "Jem'Hadar", ['ships' => '>'], 1); * // The "Jem'Hadar" consumer has the message presently * $pending = $redis->xPending('ships', 'combatants'); * var_dump($pending); * assert($pending && isset($pending[1])); * // Claim the message by ID. * $claimed = $redis->xClaim('ships', 'combatants', 'Sisko', 0, [$pending[1]], ['JUSTID']); * var_dump($claimed); * // Now the 'Sisko' consumer owns the message * $pending = $redis->xPending('ships', 'combatants'); * var_dump($pending); */ public function xclaim(string $key, string $group, string $consumer, int $min_idle, array $ids, array $options): Redis|array|bool {} /** * Remove one or more specific IDs from a stream. * @param string $key The stream to modify. * @param array $ids One or more message IDs to remove. * @return Redis|int|false The number of messages removed or false on failure. * @example $redis->xDel('stream', ['1-1', '2-1', '3-1']); */ public function xdel(string $key, array $ids): Redis|int|false {} /** * XGROUP * Perform various operation on consumer groups for a particular Redis STREAM. What the command does * is primarily based on which operation is passed. * @see https://redis.io/commands/xgroup/ * @param string $operation The subcommand you intend to execute. Valid options are as follows * 'HELP' - Redis will return information about the command * Requires: none * 'CREATE' - Create a consumer group. * Requires: Key, group, consumer. * 'SETID' - Set the ID of an existing consumer group for the stream. * Requires: Key, group, id. * 'CREATECONSUMER' - Create a new consumer group for the stream. You must * also pass key, group, and the consumer name you wish to * create. * Requires: Key, group, consumer. * 'DELCONSUMER' - Delete a consumer from group attached to the stream. * Requires: Key, group, consumer. * 'DESTROY' - Delete a consumer group from a stream. * Requires: Key, group. * @param string|null $key The STREAM we're operating on. * @param string|null $group The consumer group we want to create/modify/delete. * @param string|null $id_or_consumer The STREAM id (e.g. '$') or consumer group. See the operation section * for information about which to send. * @param bool $mkstream This flag may be sent in combination with the 'CREATE' operation, and * cause Redis to also create the STREAM if it doesn't currently exist. * @param int $entries_read * @return mixed This command return various results depending on the operation performed. */ public function xgroup( string $operation, ?string $key = null, ?string $group = null, ?string $id_or_consumer = null, bool $mkstream = false, int $entries_read = -2 ): mixed {} /** * Retrieve information about a stream key. * @param string $operation The specific info operation to perform. * @param string|null $arg1 The first argument (depends on operation) * @param string|null $arg2 The second argument * @param int $count The COUNT argument to `XINFO STREAM` * @return mixed This command can return different things depending on the operation being called. * @see https://redis.io/commands/xinfo * @example $redis->xInfo('CONSUMERS', 'stream'); * @example $redis->xInfo('GROUPS', 'stream'); * @example $redis->xInfo('STREAM', 'stream'); */ public function xinfo(string $operation, ?string $arg1 = null, ?string $arg2 = null, int $count = -1): mixed {} /** * Get the number of messages in a Redis STREAM key. * @param string $key The Stream to check. * @return Redis|int|false The number of messages or false on failure. * @see https://redis.io/commands/xlen * @example $redis->xLen('stream'); */ public function xlen(string $key): Redis|int|false {} /** * Interact with stream messages that have been consumed by a consumer group but not yet * acknowledged with XACK. * @see https://redis.io/commands/xpending * @see https://redis.io/commands/xreadgroup * @param string $key The stream to inspect. * @param string $group The user group we want to see pending messages from. * @param string|null $start The minimum ID to consider. * @param string|null $end The maximum ID to consider. * @param int $count Optional maximum number of messages to return. * @param string|null $consumer If provided, limit the returned messages to a specific consumer. * @return Redis|array|false The pending messages belonging to the stream or false on failure. */ public function xpending(string $key, string $group, ?string $start = null, ?string $end = null, int $count = -1, ?string $consumer = null): Redis|array|false {} /** * Get a range of entries from a STREAM key. * @param string $key The stream key name to list. * @param string $start The minimum ID to return. * @param string $end The maximum ID to return. * @param int $count An optional maximum number of entries to return. * @return Redis|array|bool The entries in the stream within the requested range or false on failure. * @see https://redis.io/commands/xrange * @example $redis->xRange('stream', '0-1', '0-2'); * @example $redis->xRange('stream', '-', '+'); */ public function xrange(string $key, string $start, string $end, int $count = -1): Redis|array|bool {} /** * Consume one or more unconsumed elements in one or more streams. * @param array $streams An associative array with stream name keys and minimum id values. * @param int $count An optional limit to how many entries are returnd *per stream* * @param int $block An optional maximum number of milliseconds to block the caller if no * data is available on any of the provided streams. * @return Redis|array|bool An array of read elements or false if there aren't any. * @see https://redis.io/commands/xread * @example * $redis->xAdd('s03', '3-1', ['title' => 'The Search, Part I']); * $redis->xAdd('s03', '3-2', ['title' => 'The Search, Part II']); * $redis->xAdd('s03', '3-3', ['title' => 'The House Of Quark']); * $redis->xAdd('s04', '4-1', ['title' => 'The Way of the Warrior']); * $redis->xAdd('s04', '4-3', ['title' => 'The Visitor']); * $redis->xAdd('s04', '4-4', ['title' => 'Hippocratic Oath']); * $redis->xRead(['s03' => '3-2', 's04' => '4-1']); */ public function xread(array $streams, int $count = -1, int $block = -1): Redis|array|bool {} /** * Read one or more messages using a consumer group. * @param string $group The consumer group to use. * @param string $consumer The consumer to use. * @param array $streams An array of stream names and message IDs * @param int $count Optional maximum number of messages to return * @param int $block How long to block if there are no messages available. * @return Redis|array|bool Zero or more unread messages or false on failure. * @see https://redis.io/commands/xreadgroup * @example * $redis->xGroup('CREATE', 'episodes', 'ds9', '0-0', true); * $redis->xAdd('episodes', '1-1', ['title' => 'Emissary: Part 1']); * $redis->xAdd('episodes', '1-2', ['title' => 'A Man Alone']); * $messages = $redis->xReadGroup('ds9', 'sisko', ['episodes' => '>']); * // After having read the two messages, add another * $redis->xAdd('episodes', '1-3', ['title' => 'Emissary: Part 2']); * // Acknowledge the first two read messages * foreach ($messages as $stream => $stream_messages) { * $ids = array_keys($stream_messages); * $redis->xAck('stream', 'ds9', $ids); * } * // We can now pick up where we left off, and will only get the final message * $msgs = $redis->xReadGroup('ds9', 'sisko', ['episodes' => '>']); */ public function xreadgroup(string $group, string $consumer, array $streams, int $count = 1, int $block = 1): Redis|array|bool {} /** * Get a range of entries from a STREAM ke in reverse cronological order. * @param string $key The stream key to query. * @param string $end The maximum message ID to include. * @param string $start The minimum message ID to include. * @param int $count An optional maximum number of messages to include. * @return Redis|array|bool The entries within the requested range, from newest to oldest. * @see https://redis.io/commands/xrevrange * @see https://redis.io/commands/xrange * @example $redis->xRevRange('stream', '0-2', '0-1'); * @example $redis->xRevRange('stream', '+', '-'); */ public function xrevrange(string $key, string $end, string $start, int $count = -1): Redis|array|bool {} /** * Truncate a STREAM key in various ways. * @param string $key The STREAM key to trim. * @param string $threshold This can either be a maximum length, or a minimum id. * MAXLEN - An integer describing the maximum desired length of the stream after the command. * MINID - An ID that will become the new minimum ID in the stream, as Redis will trim all * messages older than this ID. * @param bool $approx Whether redis is allowed to do an approximate trimming of the stream. This is * more efficient for Redis given how streams are stored internally. * @param bool $minid When set to `true`, users should pass a minimum ID to the `$threshold` argument. * @param int $limit An optional upper bound on how many entries to trim during the command. * @return Redis|int|false The number of entries deleted from the stream. * @see https://redis.io/commands/xtrim * @example $redis->xTrim('stream', 3); * @example $redis->xTrim('stream', '2-1', false, true); */ public function xtrim(string $key, string $threshold, bool $approx = false, bool $minid = false, int $limit = -1): Redis|int|false {} /** * Add one or more elements and scores to a Redis sorted set. * @param string $key The sorted set in question. * @param array|float $score_or_options Either the score for the first element, or an array of options. * * $options = [ * 'NX', # Only update elements that already exist * 'NX', # Only add new elements but don't update existing ones. * 'LT' # Only update existing elements if the new score is * # less than the existing one. * 'GT' # Only update existing elements if the new score is * # greater than the existing one. * 'CH' # Instead of returning the number of elements added, * # Redis will return the number Of elements that were * # changed in the operation. * 'INCR' # Instead of setting each element to the provide score, * # increment the element by the * # provided score, much like ZINCRBY. When this option * # is passed, you may only send a single score and member. * ]; * Note: 'GX', 'LT', and 'NX' cannot be passed together, and PhpRedis * will send whichever one is last in the options array. * @param mixed $more_scores_and_mems A variadic number of additional scores and members. * @return Redis|int|float|false The return value varies depending on the options passed. * Following is information about the options that may be passed as the second argument: * @see https://redis.io/commands/zadd * @example $redis->zadd('zs', 1, 'first', 2, 'second', 3, 'third'); * @example $redis->zAdd('zs', ['XX'], 8, 'second', 99, 'new-element'); */ public function zAdd(string $key, array|float $score_or_options, mixed ...$more_scores_and_mems): Redis|int|float|false {} /** * Return the number of elements in a sorted set. * @param string $key The sorted set to retreive cardinality from. * @return Redis|int|false The number of elements in the set or false on failure * @see https://redis.io/commands/zcard * @example $redis->zCard('zs'); */ public function zCard(string $key): Redis|int|false {} /** * Count the number of members in a sorted set with scores inside a provided range. * @param string $key The sorted set to check. * @param string $start The minimum score to include in the count * @param string $end The maximum score to include in the count * NOTE: In addition to a floating point score you may pass the special values of '-inf' and * '+inf' meaning negative and positive infinity, respectively. * @see https://redis.io/commands/zcount * @example $redis->zCount('fruit-rankings', '0', '+inf'); * @example $redis->zCount('fruit-rankings', 50, 60); * @example $redis->zCount('fruit-rankings', '-inf', 0); */ public function zCount(string $key, string $start, string $end): Redis|int|false {} /** * Create or increment the score of a member in a Redis sorted set * @param string $key The sorted set in question. * @param float $value How much to increment the score. * @return Redis|float|false The new score of the member or false on failure. * @see https://redis.io/commands/zincrby * @example $redis->zIncrBy('zs', 5.0, 'bananas'); * @example $redis->zIncrBy('zs', 2.0, 'eggplants'); */ public function zIncrBy(string $key, float $value, mixed $member): Redis|float|false {} /** * Count the number of elements in a sorted set whos members fall within the provided * lexographical range. * @param string $key The sorted set to check. * @param string $min The minimum matching lexographical string * @param string $max The maximum matching lexographical string * @return Redis|int|false The number of members that fall within the range or false on failure. * @see https://redis.io/commands/zlexcount * @example * $redis->zAdd('captains', 0, 'Janeway', 0, 'Kirk', 0, 'Picard', 0, 'Sisko', 0, 'Archer'); * $redis->zLexCount('captains', '[A', '[S'); */ public function zLexCount(string $key, string $min, string $max): Redis|int|false {} /** * Retrieve the score of one or more members in a sorted set. * @see https://redis.io/commands/zmscore * @param string $key The sorted set * @param mixed $member The first member to return the score from * @param mixed $other_members One or more additional members to return the scores of. * @return Redis|array|false An array of the scores of the requested elements. * @example * $redis->zAdd('zs', 0, 'zero', 1, 'one', 2, 'two', 3, 'three'); * $redis->zMScore('zs', 'zero', 'two'); * $redis->zMScore('zs', 'one', 'not-a-member'); */ public function zMscore(string $key, mixed $member, mixed ...$other_members): Redis|array|false {} /** * Pop one or more of the highest scoring elements from a sorted set. * @param string $key The sorted set to pop elements from. * @param int|null $count An optional count of elements to pop. * @return Redis|array|false All of the popped elements with scores or false on fialure. * @see https://redis.io/commands/zpopmax * @example * $redis->zAdd('zs', 0, 'zero', 1, 'one', 2, 'two', 3, 'three'); * $redis->zPopMax('zs'); * $redis->zPopMax('zs', 2);. */ public function zPopMax(string $key, ?int $count = null): Redis|array|false {} /** * Pop one or more of the lowest scoring elements from a sorted set. * @param string $key The sorted set to pop elements from. * @param int|null $count An optional count of elements to pop. * @return Redis|array|false The popped elements with their scores or false on failure. * @see https://redis.io/commands/zpopmin * @example * $redis->zAdd('zs', 0, 'zero', 1, 'one', 2, 'two', 3, 'three'); * $redis->zPopMin('zs'); * $redis->zPopMin('zs', 2); */ public function zPopMin(string $key, ?int $count = null): Redis|array|false {} /** * Retrieve a range of elements of a sorted set between a start and end point. * How the command works in particular is greatly affected by the options that * are passed in. * @param string $key The sorted set in question. * @param mixed $start The starting index we want to return. * @param mixed $end The final index we want to return. * @param array|bool|null $options This value may either be an array of options to pass to * the command, or for historical purposes a boolean which * controls just the 'WITHSCORES' option. * * $options = [ * 'WITHSCORES' => true, # Return both scores and members. * 'LIMIT' => [10, 10], # Start at offset 10 and return 10 elements. * 'REV' # Return the elements in reverse order * 'BYSCORE', # Treat `start` and `end` as scores instead * 'BYLEX' # Treat `start` and `end` as lexicographical values. * ]; * * Note: 'BYLEX' and 'BYSCORE' are mutually exclusive. * @return Redis|array|false An array with matching elements or false on failure. * @see https://redis.io/commands/zrange/ * @example $redis->zRange('zset', 0, -1); * @example $redis->zRange('zset', '-inf', 'inf', ['byscore']); */ public function zRange(string $key, string|int $start, string|int $end, array|bool|null $options = null): Redis|array|false {} /** * Retrieve a range of elements from a sorted set by legographical range. * @param string $key The sorted set to retreive elements from * @param string $min The minimum legographical value to return * @param string $max The maximum legographical value to return * @param int $offset An optional offset within the matching values to return * @param int $count An optional count to limit the replies to (used in conjunction with offset) * @return Redis|array|false An array of matching elements or false on failure. * @see https://redis.io/commands/zrangebylex * @example * $redis = new Redis(['host' => 'localhost']); * $redis->zAdd('captains', 0, 'Janeway', 0, 'Kirk', 0, 'Picard', 0, 'Sisko', 0, 'Archer'); * $redis->zRangeByLex('captains', '[A', '[S'); * $redis->zRangeByLex('captains', '[A', '[S', 2, 2); */ public function zRangeByLex(string $key, string $min, string $max, int $offset = -1, int $count = -1): Redis|array|false {} /** * Retrieve a range of members from a sorted set by their score. * @param string $key The sorted set to query. * @param string $start The minimum score of elements that Redis should return. * @param string $end The maximum score of elements that Redis should return. * @param array $options Options that change how Redis will execute the command. * OPTION TYPE MEANING * 'WITHSCORES' bool Whether to also return scores. * 'LIMIT' [offset, count] Limit the reply to a subset of elements. * @return Redis|array|false The number of matching elements or false on failure. * @see https://redis.io/commands/zrangebyscore * @example $redis->zRangeByScore('zs', 20, 30, ['WITHSCORES' => true]); * @example $redis->zRangeByScore('zs', 20, 30, ['WITHSCORES' => true, 'LIMIT' => [5, 5]]); */ public function zRangeByScore(string $key, string $start, string $end, array $options = []): Redis|array|false {} /** * This command is similar to ZRANGE except that instead of returning the values directly * it will store them in a destination key provided by the user * @param string $dstkey The key to store the resulting element(s) * @param string $srckey The source key with element(s) to retrieve * @param string $start The starting index to store * @param string $end The ending index to store * @param array|bool|null $options Our options array that controls how the command will function. * @return Redis|int|false The number of elements stored in $dstkey or false on failure. * @see https://redis.io/commands/zrange/ * @see Redis::zRange * See {@link Redis::zRange} for a full description of the possible options. */ public function zrangestore( string $dstkey, string $srckey, string $start, string $end, array|bool|null $options = null ): Redis|int|false {} /** * Retrieve one or more random members from a Redis sorted set. * @param string $key The sorted set to pull random members from. * @param array|null $options One or more options that determine exactly how the command operates. * OPTION TYPE MEANING * 'COUNT' int The number of random members to return. * 'WITHSCORES' bool Whether to return scores and members instead of * @return Redis|string|array One ore more random elements. * @see https://redis.io/commands/zrandmember * @example $redis->zRandMember('zs', ['COUNT' => 2, 'WITHSCORES' => true]); */ public function zRandMember(string $key, ?array $options = null): Redis|string|array {} /** * Get the rank of a member of a sorted set, by score. * @param string $key The sorted set to check. * @param mixed $member The member to test. * @return Redis|int|false The rank of the requested member. * @see https://redis.io/commands/zrank * @example $redis->zRank('zs', 'zero'); * @example $redis->zRank('zs', 'three'); */ public function zRank(string $key, mixed $member): Redis|int|false {} /** * Remove one or more members from a Redis sorted set. * @param mixed $key The sorted set in question. * @param mixed $member The first member to remove. * @param mixed $other_members One or more members to remove passed in a variadic fashion. * @return Redis|int|false The number of members that were actually removed or false on failure. * @see https://redis.io/commands/zrem * @example $redis->zRem('zs', 'mem:0', 'mem:1', 'mem:2', 'mem:6', 'mem:7', 'mem:8', 'mem:9'); */ public function zRem(mixed $key, mixed $member, mixed ...$other_members): Redis|int|false {} /** * Remove zero or more elements from a Redis sorted set by legographical range. * @param string $key The sorted set to remove elements from. * @param string $min The start of the lexographical range to remove. * @param string $max The end of the lexographical range to remove * @return Redis|int|false The number of elements removed from the set or false on failure. * @see https://redis.io/commands/zremrangebylex * @see Redis::zrangebylex() * @example $redis->zRemRangeByLex('zs', '[a', '(b'); * @example $redis->zRemRangeByLex('zs', '(banana', '(eggplant'); */ public function zRemRangeByLex(string $key, string $min, string $max): Redis|int|false {} /** * Remove one or more members of a sorted set by their rank. * @param string $key The sorted set where we wnat to remove members. * @param int $start The rank when we want to start removing members * @param int $end The rank we want to stop removing membersk. * @return Redis|int|false The number of members removed from the set or false on failure. * @see https://redis.io/commands/zremrangebyrank * @example $redis->zRemRangeByRank('zs', 0, 3); */ public function zRemRangeByRank(string $key, int $start, int $end): Redis|int|false {} /** * Remove one or more members of a sorted set by their score. * @param string $key The sorted set where we wnat to remove members. * @param string $start The lowest score to remove. * @param string $end The highest score to remove. * @return Redis|int|false The number of members removed from the set or false on failure. * @see https://redis.io/commands/zremrangebyrank * @example * $redis->zAdd('zs', 2, 'two', 4, 'four', 6, 'six'); * $redis->zRemRangeByScore('zs', 2, 4); */ public function zRemRangeByScore(string $key, string $start, string $end): Redis|int|false {} /** * List the members of a Redis sorted set in reverse order * @param string $key The sorted set in question. * @param int $start The index to start listing elements * @param int $end The index to stop listing elements. * @param mixed $scores Whether or not Redis should also return each members score. See * the example below demonstrating how it may be used. * @return Redis|array|false The members (and possibly scores) of the matching elements or false * on failure. * @see https://redis.io/commands/zrevrange * @example $redis->zRevRange('zs', 0, -1); * @example $redis->zRevRange('zs', 2, 3); * @example $redis->zRevRange('zs', 0, -1, true); * @example $redis->zRevRange('zs', 0, -1, ['withscores' => true]); */ public function zRevRange(string $key, int $start, int $end, mixed $scores = null): Redis|array|false {} /** * List members of a Redis sorted set within a legographical range, in reverse order. * @param string $key The sorted set to list * @param string $max The maximum legographical element to include in the result. * @param string $min The minimum lexographical element to include in the result. * @param int $offset An option offset within the matching elements to start at. * @param int $count An optional count to limit the replies to. * @return Redis|array|false The matching members or false on failure. * @see https://redis.io/commands/zrevrangebylex * @see Redis::zrangebylex() * @example $redis->zRevRangeByLex('captains', '[Q', '[J'); * @example $redis->zRevRangeByLex('captains', '[Q', '[J', 1, 2); */ public function zRevRangeByLex(string $key, string $max, string $min, int $offset = -1, int $count = -1): Redis|array|false {} /** * List elements from a Redis sorted set by score, highest to lowest * @param string $key The sorted set to query. * @param string $max The highest score to include in the results. * @param string $min The lowest score to include in the results. * @param array|bool $options An options array that modifies how the command executes. * * $options = [ * 'WITHSCORES' => true|false # Whether or not to return scores * 'LIMIT' => [offset, count] # Return a subset of the matching members * ]; * * NOTE: For legacy reason, you may also simply pass `true` for the * options argument, to mean `WITHSCORES`. * @return Redis|array|false The matching members in reverse order of score or false on failure. * @see https://redis.io/commands/zrevrangebyscore * @example * $redis->zadd('oldest-people', 122.4493, 'Jeanne Calment', 119.2932, 'Kane Tanaka', * 119.2658, 'Sarah Knauss', 118.7205, 'Lucile Randon', * 117.7123, 'Nabi Tajima', 117.6301, 'Marie-Louise Meilleur', * 117.5178, 'Violet Brown', 117.3753, 'Emma Morano', * 117.2219, 'Chiyo Miyako', 117.0740, 'Misao Okawa'); * $redis->zRevRangeByScore('oldest-people', 122, 119); * $redis->zRevRangeByScore('oldest-people', 'inf', 118); * $redis->zRevRangeByScore('oldest-people', '117.5', '-inf', ['LIMIT' => [0, 1]]); */ public function zRevRangeByScore(string $key, string $max, string $min, array|bool $options = []): Redis|array|false {} /** * Retrieve a member of a sorted set by reverse rank. * @param string $key The sorted set to query. * @param mixed $member The member to look up. * @return Redis|int|false The reverse rank (the rank if counted high to low) of the member or * false on failure. * @see https://redis.io/commands/zrevrank * @example * $redis->zAdd('ds9-characters', 10, 'Sisko', 9, 'Garak', 8, 'Dax', 7, 'Odo'); * $redis->zrevrank('ds9-characters', 'Sisko'); * $redis->zrevrank('ds9-characters', 'Garak'); */ public function zRevRank(string $key, mixed $member): Redis|int|false {} /** * Get the score of a member of a sorted set. * @param string $key The sorted set to query. * @param mixed $member The member we wish to query. * @return Redis|float|false The score of the requested element or false if it is not found. * @see https://redis.io/commands/zscore * @example * $redis->zAdd('telescopes', 11.9, 'LBT', 10.4, 'GTC', 10, 'HET'); * $redis->zScore('telescopes', 'LBT'); */ public function zScore(string $key, mixed $member): Redis|float|false {} /** * Given one or more sorted set key names, return every element that is in the first * set but not any of the others. * @param array $keys One ore more sorted sets. * @param array|null $options An array which can contain ['WITHSCORES' => true] if you want Redis to * return members and scores. * @return Redis|array|false An array of members or false on failure. * @see https://redis.io/commands/zdiff * @example * $redis->zAdd('primes', 1, 'one', 3, 'three', 5, 'five'); * $redis->zAdd('evens', 2, 'two', 4, 'four'); * $redis->zAdd('mod3', 3, 'three', 6, 'six'); * $redis->zDiff(['primes', 'evens', 'mod3']); */ public function zdiff(array $keys, ?array $options = null): Redis|array|false {} /** * Store the difference of one or more sorted sets in a destination sorted set. * See {@link Redis::zdiff} for a more detailed description of how the diff operation works. * @param string $dst The destination set name. * @param array $keys One or more source key names * @return Redis|int|false The number of elements stored in the destination set or false on * failure. * @see https://redis.io/commands/zdiff * @see Redis::zdiff() */ public function zdiffstore(string $dst, array $keys): Redis|int|false {} /** * Compute the intersection of one or more sorted sets and return the members * @param array $keys One ore more sorted sets. * @param array|null $weights An optional array of weights to be applied to each set when performing * the intersection. * @param array|null $options Options for how Redis should combine duplicate elements when performing the * intersection. See Redis::zunion() for details. * @return Redis|array|false All of the members that exist in every set. * @see https://redis.io/commands/zinter * @example * $redis->zAdd('TNG', 2, 'Worf', 2.5, 'Data', 4.0, 'Picard'); * $redis->zAdd('DS9', 2.5, 'Worf', 3.0, 'Kira', 4.0, 'Sisko'); * $redis->zInter(['TNG', 'DS9']); * $redis->zInter(['TNG', 'DS9'], NULL, ['withscores' => true]); * $redis->zInter(['TNG', 'DS9'], NULL, ['withscores' => true, 'aggregate' => 'max']); */ public function zinter(array $keys, ?array $weights = null, ?array $options = null): Redis|array|false {} /** * Similar to ZINTER but instead of returning the intersected values, this command returns the * cardinality of the intersected set. * @see https://redis.io/commands/zintercard * @see https://redis.io/commands/zinter * @see Redis::zinter() * @param array $keys One ore more sorted set key names. * @param int $limit An optional upper bound on the returned cardinality. If set to a value * greater than zero, Redis will stop processing the intersection once the * resulting cardinality reaches this limit. * @return Redis|int|false The cardinality of the intersection or false on failure. * @example * $redis->zAdd('zs1', 1, 'one', 2, 'two', 3, 'three', 4, 'four'); * $redis->zAdd('zs2', 2, 'two', 4, 'four'); * $redis->zInterCard(['zs1', 'zs2']); */ public function zintercard(array $keys, int $limit = -1): Redis|int|false {} /** * Compute the intersection of one ore more sorted sets storing the result in a new sorted set. * @param string $dst The destination sorted set to store the intersected values. * @param array $keys One ore more sorted set key names. * @param array|null $weights An optional array of floats to weight each passed input set. * @param string|null $aggregate An optional aggregation method to use. * 'SUM' - Store sum of all intersected members (this is the default). * 'MIN' - Store minimum value for each intersected member. * 'MAX' - Store maximum value for each intersected member. * @return Redis|int|false The total number of members writtern to the destination set or false on failure. * @see https://redis.io/commands/zinterstore * @see https://redis.io/commands/zinter * @example * $redis->zAdd('zs1', 3, 'apples', 2, 'pears'); * $redis->zAdd('zs2', 4, 'pears', 3, 'bananas'); * $redis->zAdd('zs3', 2, 'figs', 3, 'pears'); * $redis->zInterStore('fruit-sum', ['zs1', 'zs2', 'zs3']); * $redis->zInterStore('fruit-max', ['zs1', 'zs2', 'zs3'], NULL, 'MAX'); */ public function zinterstore(string $dst, array $keys, ?array $weights = null, ?string $aggregate = null): Redis|int|false {} /** * Scan the members of a sorted set incrementally, using a cursor * @param string $key The sorted set to scan. * @param int|null $iterator A reference to an iterator that should be initialized to NULL initially, that * will be updated after each subsequent call to ZSCAN. Once the iterator * has returned to zero the scan is complete * @param string|null $pattern An optional glob-style pattern that limits which members are returned during * the scanning process. * @param int $count A hint for Redis that tells it how many elements it should test before returning * from the call. The higher the more work Redis may do in any one given call to * ZSCAN potentially blocking for longer periods of time. * @return Redis|array|false An array of elements or false on failure. * @see https://redis.io/commands/zscan * @see https://redis.io/commands/scan * @see Redis::scan() * NOTE: See Redis::scan() for detailed example code on how to call SCAN like commands. */ public function zscan(string $key, ?int &$iterator, ?string $pattern = null, int $count = 0): Redis|array|false {} /** * Retrieve the union of one or more sorted sets * @param array $keys One ore more sorted set key names * @param array|null $weights An optional array with floating point weights used when performing the union. * Note that if this argument is passed, it must contain the same number of * elements as the $keys array. * @param array|null $options An array that modifies how this command functions. * * $options = [ * # By default when members exist in more than one set Redis will SUM * # total score for each match. Instead, it can return the AVG, MIN, * # or MAX value based on this option. * 'AGGREGATE' => 'sum' | 'min' | 'max' * # Whether Redis should also return each members aggregated score. * 'WITHSCORES' => true | false * ] * * @return Redis|array|false The union of each sorted set or false on failure * @example * $redis->del('store1', 'store2', 'store3'); * $redis->zAdd('store1', 1, 'apples', 3, 'pears', 6, 'bananas'); * $redis->zAdd('store2', 3, 'apples', 5, 'coconuts', 2, 'bananas'); * $redis->zAdd('store3', 2, 'bananas', 6, 'apples', 4, 'figs'); * $redis->zUnion(['store1', 'store2', 'store3'], NULL, ['withscores' => true]); * $redis->zUnion(['store1', 'store3'], [2, .5], ['withscores' => true]); * $redis->zUnion(['store1', 'store3'], [2, .5], ['withscores' => true, 'aggregate' => 'MIN']); */ public function zunion(array $keys, ?array $weights = null, ?array $options = null): Redis|array|false {} /** * Perform a union on one or more Redis sets and store the result in a destination sorted set. * @param string $dst The destination set to store the union. * @param array $keys One or more input keys on which to perform our union. * @param array|null $weights An optional weights array used to weight each input set. * @param string|null $aggregate An optional modifier in how Redis will combine duplicate members. * Valid: 'MIN', 'MAX', 'SUM'. * @return Redis|int|false The number of members stored in the destination set or false on failure. * @see https://redis.io/commands/zunionstore * @see Redis::zunion() * @example * $redis->zAdd('zs1', 1, 'one', 3, 'three'); * $redis->zAdd('zs1', 2, 'two', 4, 'four'); * $redis->zadd('zs3', 1, 'one', 7, 'five'); * $redis->zUnionStore('dst', ['zs1', 'zs2', 'zs3']); */ public function zunionstore(string $dst, array $keys, ?array $weights = null, ?string $aggregate = null): Redis|int|false {} } class RedisException extends RuntimeException {} */ interface Traversable extends iterable {} /** * Interface to create an external Iterator. * @link https://php.net/manual/en/class.iteratoraggregate.php * @template TKey * @template-covariant TValue * @template-extends Traversable */ interface IteratorAggregate extends Traversable { /** * Retrieve an external iterator * @link https://php.net/manual/en/iteratoraggregate.getiterator.php * @return Traversable|TValue[] An instance of an object implementing Iterator or * Traversable * @throws Exception on failure. */ #[TentativeType] public function getIterator(): Traversable; } /** * Interface for external iterators or objects that can be iterated * themselves internally. * @link https://php.net/manual/en/class.iterator.php * @template TKey * @template-covariant TValue * @template-extends Traversable */ interface Iterator extends Traversable { /** * Return the current element * @link https://php.net/manual/en/iterator.current.php * @return TValue Can return any type. */ #[TentativeType] public function current(): mixed; /** * Move forward to next element * @link https://php.net/manual/en/iterator.next.php * @return void Any returned value is ignored. */ #[TentativeType] public function next(): void; /** * Return the key of the current element * @link https://php.net/manual/en/iterator.key.php * @return TKey|null TKey on success, or null on failure. */ #[TentativeType] public function key(): mixed; /** * Checks if current position is valid * @link https://php.net/manual/en/iterator.valid.php * @return bool The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ #[TentativeType] public function valid(): bool; /** * Rewind the Iterator to the first element * @link https://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. */ #[TentativeType] public function rewind(): void; } /** * Interface to provide accessing objects as arrays. * @link https://php.net/manual/en/class.arrayaccess.php * @template TKey * @template TValue */ interface ArrayAccess { /** * Whether a offset exists * @link https://php.net/manual/en/arrayaccess.offsetexists.php * @param TKey $offset

* An offset to check for. *

* @return bool true on success or false on failure. *

*

* The return value will be casted to boolean if non-boolean was returned. */ #[TentativeType] public function offsetExists(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $offset): bool; /** * Offset to retrieve * @link https://php.net/manual/en/arrayaccess.offsetget.php * @param TKey $offset

* The offset to retrieve. *

* @return TValue Can return all value types. */ #[TentativeType] public function offsetGet(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $offset): mixed; /** * Offset to set * @link https://php.net/manual/en/arrayaccess.offsetset.php * @param TKey $offset

* The offset to assign the value to. *

* @param TValue $value

* The value to set. *

* @return void */ #[TentativeType] public function offsetSet( #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $offset, #[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $value ): void; /** * Offset to unset * @link https://php.net/manual/en/arrayaccess.offsetunset.php * @param TKey $offset

* The offset to unset. *

* @return void */ #[TentativeType] public function offsetUnset(#[LanguageLevelTypeAware(['8.0' => 'mixed'], default: '')] $offset): void; } /** * Interface for customized serializing.
* As of PHP 8.1.0, a class which implements Serializable without also implementing `__serialize()` and `__unserialize()` * will generate a deprecation warning. * @link https://php.net/manual/en/class.serializable.php */ interface Serializable { /** * String representation of object. * @link https://php.net/manual/en/serializable.serialize.php * @return string|null The string representation of the object or null * @throws Exception Returning other type than string or null */ public function serialize(); /** * Constructs the object. * @link https://php.net/manual/en/serializable.unserialize.php * @param string $data The string representation of the object. * @return void */ public function unserialize(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $data); } /** * Throwable is the base interface for any object that can be thrown via a throw statement in PHP 7, * including Error and Exception. * @link https://php.net/manual/en/class.throwable.php * @since 7.0 */ interface Throwable extends Stringable { /** * Gets the message * @link https://php.net/manual/en/throwable.getmessage.php * @return string * @since 7.0 */ public function getMessage(): string; /** * Gets the exception code * @link https://php.net/manual/en/throwable.getcode.php * @return int

* Returns the exception code as integer in * {@see Exception} but possibly as other type in * {@see Exception} descendants (for example as * string in {@see PDOException}). *

* @since 7.0 */ public function getCode(); /** * Gets the file in which the exception occurred * @link https://php.net/manual/en/throwable.getfile.php * @return string Returns the name of the file from which the object was thrown. * @since 7.0 */ public function getFile(): string; /** * Gets the line on which the object was instantiated * @link https://php.net/manual/en/throwable.getline.php * @return int Returns the line number where the thrown object was instantiated. * @since 7.0 */ public function getLine(): int; /** * Gets the stack trace * @link https://php.net/manual/en/throwable.gettrace.php * @return array

* Returns the stack trace as an array in the same format as * {@see debug_backtrace()}. *

* @since 7.0 */ public function getTrace(): array; /** * Gets the stack trace as a string * @link https://php.net/manual/en/throwable.gettraceasstring.php * @return string Returns the stack trace as a string. * @since 7.0 */ public function getTraceAsString(): string; /** * Returns the previous Throwable * @link https://php.net/manual/en/throwable.getprevious.php * @return null|Throwable Returns the previous {@see Throwable} if available, or NULL otherwise. * @since 7.0 */ #[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: '')] public function getPrevious(); /** * Gets a string representation of the thrown object * @link https://php.net/manual/en/throwable.tostring.php * @return string

Returns the string representation of the thrown object.

* @since 7.0 */ public function __toString(); } /** * Exception is the base class for * all Exceptions. * @link https://php.net/manual/en/class.exception.php */ class Exception implements Throwable { /** The error message */ protected $message; /** The error code */ protected $code; /** The filename where the error happened */ #[LanguageLevelTypeAware(['8.1' => 'string'], default: '')] protected $file; /** The line where the error happened */ #[LanguageLevelTypeAware(['8.1' => 'int'], default: '')] protected $line; /** * Clone the exception * Tries to clone the Exception, which results in Fatal error. * @link https://php.net/manual/en/exception.clone.php * @return void */ #[PhpStormStubsElementAvailable(from: "5.4", to: "8.0")] final private function __clone(): void {} /** * Clone the exception * Tries to clone the Exception, which results in Fatal error. * @link https://php.net/manual/en/exception.clone.php * @return void */ #[PhpStormStubsElementAvailable("8.1")] private function __clone(): void {} /** * Construct the exception. Note: The message is NOT binary safe. * @link https://php.net/manual/en/exception.construct.php * @param string $message [optional] The Exception message to throw. * @param int $code [optional] The Exception code. * @param null|Throwable $previous [optional] The previous throwable used for the exception chaining. */ #[Pure] public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $message = "", #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $code = 0, #[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: 'Throwable')] $previous = null ) {} /** * Gets the Exception message * @link https://php.net/manual/en/exception.getmessage.php * @return string the Exception message as a string. */ #[Pure] final public function getMessage(): string {} /** * Gets the Exception code * @link https://php.net/manual/en/exception.getcode.php * @return mixed|int the exception code as integer in * Exception but possibly as other type in * Exception descendants (for example as * string in PDOException). */ #[Pure] final public function getCode() {} /** * Gets the file in which the exception occurred * @link https://php.net/manual/en/exception.getfile.php * @return string the filename in which the exception was created. */ #[Pure] final public function getFile(): string {} /** * Gets the line in which the exception occurred * @link https://php.net/manual/en/exception.getline.php * @return int the line number where the exception was created. */ #[Pure] final public function getLine(): int {} /** * Gets the stack trace * @link https://php.net/manual/en/exception.gettrace.php * @return array the Exception stack trace as an array. */ #[Pure] final public function getTrace(): array {} /** * Returns previous Exception * @link https://php.net/manual/en/exception.getprevious.php * @return null|Throwable Returns the previous {@see Throwable} if available, or NULL otherwise. * or null otherwise. */ #[Pure] final public function getPrevious(): ?Throwable {} /** * Gets the stack trace as a string * @link https://php.net/manual/en/exception.gettraceasstring.php * @return string the Exception stack trace as a string. */ #[Pure] final public function getTraceAsString(): string {} /** * String representation of the exception * @link https://php.net/manual/en/exception.tostring.php * @return string the string representation of the exception. */ #[TentativeType] public function __toString(): string {} #[TentativeType] public function __wakeup(): void {} } /** * Error is the base class for all internal PHP error exceptions. * @link https://php.net/manual/en/class.error.php * @since 7.0 */ class Error implements Throwable { /** The error message */ protected $message; /** The error code */ protected $code; /** The filename where the error happened */ #[LanguageLevelTypeAware(['8.1' => 'string'], default: '')] protected $file; /** The line where the error happened */ #[LanguageLevelTypeAware(['8.1' => 'int'], default: '')] protected $line; /** * Construct the error object. * @link https://php.net/manual/en/error.construct.php * @param string $message [optional] The Error message to throw. * @param int $code [optional] The Error code. * @param null|Throwable $previous [optional] The previous throwable used for the exception chaining. */ #[Pure] public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $message = "", #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $code = 0, #[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: 'Throwable')] $previous = null ) {} /*** * Gets the message * @link https://php.net/manual/en/throwable.getmessage.php * @return string * @since 7.0 */ final public function getMessage(): string {} /** * Gets the exception code * @link https://php.net/manual/en/throwable.getcode.php * @return int

* Returns the exception code as integer in * {@see Exception} but possibly as other type in * {@see Exception} descendants (for example as * string in {@see PDOException}). *

* @since 7.0 */ final public function getCode() {} /** * Gets the file in which the exception occurred * @link https://php.net/manual/en/throwable.getfile.php * @return string Returns the name of the file from which the object was thrown. * @since 7.0 */ final public function getFile(): string {} /** * Gets the line on which the object was instantiated * @link https://php.net/manual/en/throwable.getline.php * @return int Returns the line number where the thrown object was instantiated. * @since 7.0 */ final public function getLine(): int {} /** * Gets the stack trace * @link https://php.net/manual/en/throwable.gettrace.php * @return array

* Returns the stack trace as an array in the same format as * {@see debug_backtrace()}. *

* @since 7.0 */ final public function getTrace(): array {} /** * Gets the stack trace as a string * @link https://php.net/manual/en/throwable.gettraceasstring.php * @return string Returns the stack trace as a string. * @since 7.0 */ final public function getTraceAsString(): string {} /** * Returns the previous Throwable * @link https://php.net/manual/en/throwable.getprevious.php * @return null|Throwable Returns the previous {@see Throwable} if available, or NULL otherwise. * @since 7.0 */ final public function getPrevious(): ?Throwable {} /** * Gets a string representation of the thrown object * @link https://php.net/manual/en/throwable.tostring.php * @return string

Returns the string representation of the thrown object.

* @since 7.0 */ public function __toString(): string {} /** * Clone the error * Error can not be clone, so this method results in fatal error. * @return void * @link https://php.net/manual/en/error.clone.php */ #[PhpStormStubsElementAvailable(from: "7.0", to: "8.0")] final private function __clone(): void {} /** * Clone the error * Error can not be clone, so this method results in fatal error. * @return void * @link https://php.net/manual/en/error.clone.php */ #[PhpStormStubsElementAvailable('8.1')] private function __clone(): void {} #[TentativeType] public function __wakeup(): void {} } class ValueError extends Error {} /** * There are three scenarios where a TypeError may be thrown. * The first is where the argument type being passed to a function does not match its corresponding declared * parameter type. The second is where a value being returned from a function does not match the declared function return type. The third is where an * invalid number of arguments are passed to a built-in PHP function (strict mode only). * @link https://php.net/manual/en/class.typeerror.php * @since 7.0 */ class TypeError extends Error {} /** * ParseError is thrown when an error occurs while parsing PHP code, such as when {@see eval()} is called. * @link https://php.net/manual/en/class.parseerror.php * @since 7.0 */ class ParseError extends CompileError {} /** * ArgumentCountError is thrown when too few arguments are passed to a user * defined routine. * * @since 7.1 * @see https://php.net/migration71.incompatible#migration71.incompatible.too-few-arguments-exception */ class ArgumentCountError extends TypeError {} /** * ArithmeticError is thrown when an error occurs while performing mathematical operations. * In PHP 7.0, these errors include attempting to perform a bitshift by a negative amount, * and any call to {@see intdiv()} that would result in a value outside the possible bounds of an integer. * @link https://php.net/manual/en/class.arithmeticerror.php * @since 7.0 */ class ArithmeticError extends Error {} /** * Class CompileError * @link https://secure.php.net/manual/en/class.compileerror.php * @since 7.3 */ class CompileError extends Error {} /** * DivisionByZeroError is thrown when an attempt is made to divide a number by zero. * @link https://php.net/manual/en/class.divisionbyzeroerror.php * @since 7.0 */ class DivisionByZeroError extends ArithmeticError {} /** * @since 8.0 */ class UnhandledMatchError extends Error {} /** * @since 8.4 */ class RequestParseBodyException extends Exception {} /** * An Error Exception. * @link https://php.net/manual/en/class.errorexception.php */ class ErrorException extends Exception { #[LanguageLevelTypeAware(['8.1' => 'int'], default: '')] protected $severity; /** * Constructs the exception * @link https://php.net/manual/en/errorexception.construct.php * @param string $message [optional] The Exception message to throw. * @param int $code [optional] The Exception code. * @param int $severity [optional] The severity level of the exception. * @param string $filename [optional] The filename where the exception is thrown. * @param int $line [optional] The line number where the exception is thrown. * @param Exception $previous [optional] The previous exception used for the exception chaining. */ #[Pure] public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $message = "", #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $code = 0, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $severity = 1, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $filename = null, #[LanguageLevelTypeAware(['8.0' => 'int|null'], default: '')] $line = null, #[LanguageLevelTypeAware(['8.0' => 'Throwable|null'], default: 'Throwable')] $previous = null ) {} /** * Gets the exception severity * @link https://php.net/manual/en/errorexception.getseverity.php * @return int the severity level of the exception. */ final public function getSeverity(): int {} } /** * Class used to represent anonymous functions. *

Anonymous functions, implemented in PHP 5.3, yield objects of this type. * This fact used to be considered an implementation detail, but it can now be relied upon. * Starting with PHP 5.4, this class has methods that allow further control of the anonymous function after it has been created. *

Besides the methods listed here, this class also has an __invoke method. * This is for consistency with other classes that implement calling magic, as this method is not used for calling the function. * @link https://secure.php.net/manual/en/class.closure.php */ final class Closure { /** * This method exists only to disallow instantiation of the Closure class. * Objects of this class are created in the fashion described on the anonymous functions page. * @link https://secure.php.net/manual/en/closure.construct.php */ private function __construct() {} /** * This is for consistency with other classes that implement calling magic, * as this method is not used for calling the function. * @param mixed ...$_ [optional] * @return mixed * @link https://secure.php.net/manual/en/class.closure.php */ public function __invoke(...$_) {} /** * Duplicates the closure with a new bound object and class scope * @link https://secure.php.net/manual/en/closure.bindto.php * @param object|null $newThis The object to which the given anonymous function should be bound, or NULL for the closure to be unbound. * @param object|class-string|null $newScope The class scope to which associate the closure is to be associated, or 'static' to keep the current one. * If an object is given, the type of the object will be used instead. * This determines the visibility of protected and private methods of the bound object. * @return Closure|null Returns the newly created Closure object or null on failure */ #[Pure] public function bindTo(?object $newThis, object|string|null $newScope = 'static'): ?Closure {} /** * This method is a static version of Closure::bindTo(). * See the documentation of that method for more information. * @link https://secure.php.net/manual/en/closure.bind.php * @param Closure $closure The anonymous functions to bind. * @param object|null $newThis The object to which the given anonymous function should be bound, or NULL for the closure to be unbound. * @param object|class-string|null $newScope The class scope to which associate the closure is to be associated, or 'static' to keep the current one. * If an object is given, the type of the object will be used instead. * This determines the visibility of protected and private methods of the bound object. * @return Closure|null Returns the newly created Closure object or null on failure */ #[Pure] public static function bind(Closure $closure, ?object $newThis, object|string|null $newScope = 'static'): ?Closure {} /** * Temporarily binds the closure to newthis, and calls it with any given parameters. * @link https://php.net/manual/en/closure.call.php * @param object $newThis The object to bind the closure to for the duration of the call. * @param mixed $args [optional] Zero or more parameters, which will be given as parameters to the closure. * @return mixed * @since 7.0 */ public function call(object $newThis, mixed ...$args): mixed {} /** * @param callable $callback * @return Closure * @since 7.1 */ public static function fromCallable(callable $callback): Closure {} } /** * Classes implementing Countable can be used with the * count function. * @link https://php.net/manual/en/class.countable.php */ interface Countable { /** * Count elements of an object * @link https://php.net/manual/en/countable.count.php * @return int<0,max> The custom count as an integer. *

* The return value is cast to an integer. *

*/ #[TentativeType] public function count(): int; } /** * Weak references allow the programmer to retain a reference to an * object which does not prevent the object from being destroyed. * They are useful for implementing cache like structures. * @template T of object * @link https://www.php.net/manual/en/class.weakreference.php * @since 7.4 */ final class WeakReference { /** * This method exists only to disallow instantiation of the WeakReference * class. Weak references are to be instantiated with the factory method * WeakReference::create(). */ public function __construct() {} /** * Create a new weak reference. * @link https://www.php.net/manual/en/weakreference.create.php * @template TIn of object * @param TIn $object Any object. * @return WeakReference The freshly instantiated object. * @since 7.4 */ #[Pure] public static function create(object $object): WeakReference {} /** * Gets a weakly referenced object. If the object has already been * destroyed, NULL is returned. * @link https://www.php.net/manual/en/weakreference.get.php * @return T|null * @since 7.4 */ #[Pure] public function get(): ?object {} } /** * Weak maps allow creating a map from objects to arbitrary values * (similar to SplObjectStorage) without preventing the objects that are used * as keys from being garbage collected. If an object key is garbage collected, * it will simply be removed from the map. * * @since 8.0 * * @template TKey of object * @template TValue * @template-implements IteratorAggregate */ final class WeakMap implements ArrayAccess, Countable, IteratorAggregate { /** * Returns {@see true} if the value for the object is contained in * the {@see WeakMap} and {@see false} instead. * * @param TKey $object Any object * @return bool */ #[Pure] public function offsetExists($object): bool {} /** * Returns the existsing value by an object. * * @param TKey $object Any object * @return TValue Value associated with the key object */ #[Pure] public function offsetGet($object): mixed {} /** * Sets a new value for an object. * * @param TKey $object Any object * @param TValue $value Any value * @return void */ public function offsetSet($object, mixed $value): void {} /** * Force removes an object value from the {@see WeakMap} instance. * * @param TKey $object Any object * @return void */ public function offsetUnset($object): void {} /** * Returns an iterator in the "[object => mixed]" format. * * @return Iterator */ #[Pure] public function getIterator(): Iterator {} /** * Returns the number of items in the {@see WeakMap} instance. * * @return int<0,max> */ #[Pure] public function count(): int {} } /** * Stringable interface denotes a class as having a __toString() method. * * @since 8.0 */ interface Stringable { /** * Magic method {@see https://www.php.net/manual/en/language.oop5.magic.php#object.tostring} * allows a class to decide how it will react when it is treated like a string. * * @return string Returns string representation of the object that * implements this interface (and/or "__toString" magic method). */ public function __toString(): string; } /** * @since 8.0 */ #[Attribute(Attribute::TARGET_CLASS)] final class Attribute { public int $flags; /** * Marks that attribute declaration is allowed only in classes. */ public const TARGET_CLASS = 1; /** * Marks that attribute declaration is allowed only in functions. */ public const TARGET_FUNCTION = 2; /** * Marks that attribute declaration is allowed only in class methods. */ public const TARGET_METHOD = 4; /** * Marks that attribute declaration is allowed only in class properties. */ public const TARGET_PROPERTY = 8; /** * Marks that attribute declaration is allowed only in class constants. */ public const TARGET_CLASS_CONSTANT = 16; /** * Marks that attribute declaration is allowed only in function or method parameters. */ public const TARGET_PARAMETER = 32; /** * Marks that attribute declaration is allowed anywhere. */ public const TARGET_ALL = 63; /** * Notes that an attribute declaration in the same place is * allowed multiple times. */ public const IS_REPEATABLE = 64; /** * @param int $flags A value in the form of a bitmask indicating the places * where attributes can be defined. */ public function __construct(#[ExpectedValues(flagsFromClass: Attribute::class)] int $flags = self::TARGET_ALL) {} } /** * @since 8.0 */ final class InternalIterator implements Iterator { private function __construct() {} public function current(): mixed {} public function next(): void {} public function key(): mixed {} public function valid(): bool {} public function rewind(): void {} } /** * @since 8.1 */ interface UnitEnum { public readonly string $name; /** * @return static[] */ #[Pure] public static function cases(): array; } /** * @since 8.1 */ interface BackedEnum extends UnitEnum { public readonly int|string $value; /** * Translates a string or int into the corresponding Enum * case, if any. If there is no matching case defined, it will throw a * ValueError. * @param int|string $value * @throws ValueError * @throws TypeError * @return static * @link https://www.php.net/manual/en/backedenum.from.php */ #[Pure] public static function from(int|string $value): static; /** * Translates a string or int into the corresponding Enum * case, if any. If there is no matching case defined, it will return null. * @param int|string $value * @return static|null A case instance of this enumeration, or null if not * found. * @link https://www.php.net/manual/en/backedenum.tryfrom.php */ #[Pure] public static function tryFrom(int|string $value): ?static; } /** * @since 8.1 * @internal * * Internal interface to ensure precise type inference */ interface IntBackedEnum extends BackedEnum { public readonly int $value; /** * @param int $value * @return static */ #[Pure] public static function from(int $value): static; /** * @param int $value * @return static|null */ #[Pure] public static function tryFrom(int $value): ?static; } /** * @since 8.1 * @internal * * Internal interface to ensure precise type inference */ interface StringBackedEnum extends BackedEnum { public readonly string $value; #[Pure] public static function from(string $value): static; #[Pure] public static function tryFrom(string $value): ?static; } /** * @since 8.1 * * @template TStart * @template TResume * @template TReturn * @template TSuspend */ final class Fiber { /** * @param callable $callback Function to invoke when starting the fiber. */ public function __construct(callable $callback) {} /** * Starts execution of the fiber. Returns when the fiber suspends or terminates. * * @param TStart ...$args Arguments passed to fiber function. * * @return TSuspend|null Value from the first suspension point or NULL if the fiber returns. * * @throws FiberError If the fiber has already been started. * @throws Throwable If the fiber callable throws an uncaught exception. */ public function start(mixed ...$args): mixed {} /** * Resumes the fiber, returning the given value from {@see Fiber::suspend()}. * Returns when the fiber suspends or terminates. * * @param TResume $value * * @return TSuspend|null Value from the next suspension point or NULL if the fiber returns. * * @throws FiberError If the fiber has not started, is running, or has terminated. * @throws Throwable If the fiber callable throws an uncaught exception. */ public function resume(mixed $value = null): mixed {} /** * Throws the given exception into the fiber from {@see Fiber::suspend()}. * Returns when the fiber suspends or terminates. * * @param Throwable $exception * * @return TSuspend|null Value from the next suspension point or NULL if the fiber returns. * * @throws FiberError If the fiber has not started, is running, or has terminated. * @throws Throwable If the fiber callable throws an uncaught exception. */ public function throw(Throwable $exception): mixed {} /** * @return bool True if the fiber has been started. */ public function isStarted(): bool {} /** * @return bool True if the fiber is suspended. */ public function isSuspended(): bool {} /** * @return bool True if the fiber is currently running. */ public function isRunning(): bool {} /** * @return bool True if the fiber has completed execution (returned or threw). */ public function isTerminated(): bool {} /** * @return TReturn Return value of the fiber callback. NULL is returned if the fiber does not have a return statement. * * @throws FiberError If the fiber has not terminated or the fiber threw an exception. */ public function getReturn(): mixed {} /** * @return Fiber|null Returns the currently executing fiber instance or NULL if in {main}. */ public static function getCurrent(): ?Fiber {} /** * Suspend execution of the fiber. The fiber may be resumed with {@see Fiber::resume()} or {@see Fiber::throw()}. * * Cannot be called from {main}. * * @param TSuspend $value Value to return from {@see Fiber::resume()} or {@see Fiber::throw()}. * * @return TResume Value provided to {@see Fiber::resume()}. * * @throws FiberError Thrown if not within a fiber (i.e., if called from {main}). * @throws Throwable Exception provided to {@see Fiber::throw()}. */ public static function suspend(mixed $value = null): mixed {} } /** * @since 8.1 */ final class FiberError extends Error { public function __construct() {} } /** * @since 8.1 */ #[Attribute(Attribute::TARGET_METHOD)] final class ReturnTypeWillChange { public function __construct() {} } /** * @since 8.2 */ #[Attribute(Attribute::TARGET_CLASS)] final class AllowDynamicProperties { public function __construct() {} } /** * @since 8.2 */ #[Attribute(Attribute::TARGET_PARAMETER)] final class SensitiveParameter { public function __construct() {} } /** * @since 8.2 */ final class SensitiveParameterValue { private readonly mixed $value; public function __construct(mixed $value) {} public function getValue(): mixed {} public function __debugInfo(): array {} } /** * @since 8.3 */ #[Attribute(Attribute::TARGET_METHOD)] final class Override { public function __construct() {} } /** * @since 8.4 */ #[Attribute(Attribute::TARGET_METHOD|Attribute::TARGET_FUNCTION|Attribute::TARGET_CLASS_CONSTANT)] final class Deprecated { public readonly ?string $message; public readonly ?string $since; public function __construct(?string $message = null, ?string $since = null) {} } set_error_handler), the application aborts as it * was an E_ERROR. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_RECOVERABLE_ERROR', 4096); /** * Run-time warnings (non-fatal errors). Execution of the script is not * halted. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_WARNING', 2); /** * Compile-time parse errors. Parse errors should only be generated by * the parser. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_PARSE', 4); /** * Run-time notices. Indicate that the script encountered something that * could indicate an error, but could also happen in the normal course of * running a script. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_NOTICE', 8); /** * Enable to have PHP suggest changes * to your code which will ensure the best interoperability * and forward compatibility of your code. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_STRICT', 2048); /** * Run-time notices. Enable this to receive warnings about code * that will not work in future versions. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_DEPRECATED', 8192); /** * Fatal errors that occur during PHP's initial startup. This is like an * E_ERROR, except it is generated by the core of PHP. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_CORE_ERROR', 16); /** * Warnings (non-fatal errors) that occur during PHP's initial startup. * This is like an E_WARNING, except it is generated * by the core of PHP. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_CORE_WARNING', 32); /** * Fatal compile-time errors. This is like an E_ERROR, * except it is generated by the Zend Scripting Engine. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_COMPILE_ERROR', 64); /** * Compile-time warnings (non-fatal errors). This is like an * E_WARNING, except it is generated by the Zend * Scripting Engine. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_COMPILE_WARNING', 128); /** * User-generated error message. This is like an * E_ERROR, except it is generated in PHP code by * using the PHP function trigger_error. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_USER_ERROR', 256); /** * User-generated warning message. This is like an * E_WARNING, except it is generated in PHP code by * using the PHP function trigger_error. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_USER_WARNING', 512); /** * User-generated notice message. This is like an * E_NOTICE, except it is generated in PHP code by * using the PHP function trigger_error. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_USER_NOTICE', 1024); /** * User-generated warning message. This is like an * E_DEPRECATED, except it is generated in PHP code by * using the PHP function trigger_error. * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_USER_DEPRECATED', 16384); /** * All errors and warnings, as supported, except of level * E_STRICT prior to PHP 5.4.0. * Value of E_ALL is 32767 since PHP 5.4.x, * 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously * @link https://php.net/manual/en/errorfunc.constants.php */ define('E_ALL', 32767); define('DEBUG_BACKTRACE_PROVIDE_OBJECT', 1); define('DEBUG_BACKTRACE_IGNORE_ARGS', 2); define('S_MEMORY', 1); define('S_VARS', 4); define('S_FILES', 8); define('S_INCLUDE', 16); define('S_SQL', 32); define('S_EXECUTOR', 64); define('S_MAIL', 128); define('S_SESSION', 256); define('S_MISC', 2); define('S_INTERNAL', 536870912); define('S_ALL', 511); define('true', (bool)1, true); define('false', (bool)0, true); define('null', null, true); define('ZEND_THREAD_SAFE', false); define('ZEND_DEBUG_BUILD', false); define('PHP_WINDOWS_VERSION_BUILD', 0); define('PHP_WINDOWS_VERSION_MAJOR', 0); define('PHP_WINDOWS_VERSION_MINOR', 0); define('PHP_WINDOWS_VERSION_PLATFORM', 0); define('PHP_WINDOWS_VERSION_PRODUCTTYPE', 0); define('PHP_WINDOWS_VERSION_SP_MAJOR', 0); define('PHP_WINDOWS_VERSION_SP_MINOR', 0); define('PHP_WINDOWS_VERSION_SUITEMASK', 0); define('PHP_WINDOWS_NT_DOMAIN_CONTROLLER', 2); define('PHP_WINDOWS_NT_SERVER', 3); define('PHP_WINDOWS_NT_WORKSTATION', 1); /** * @since 7.4 */ define('PHP_WINDOWS_EVENT_CTRL_C', 0); /** * @since 7.4 */ define('PHP_WINDOWS_EVENT_CTRL_BREAK', 1); define('PHP_VERSION', "5.3.6-13ubuntu3.2"); define('PHP_MAJOR_VERSION', 5); define('PHP_MINOR_VERSION', 3); define('PHP_RELEASE_VERSION', 6); define('PHP_EXTRA_VERSION', "-13ubuntu3.2"); define('PHP_VERSION_ID', 50306); define('PHP_ZTS', 0); define('PHP_DEBUG', 0); define('PHP_OS', "Linux"); /** * The operating system family PHP was built for. Either of 'Windows', 'BSD', 'Darwin', 'Solaris', 'Linux' or 'Unknown'. Available as of PHP 7.2.0. * @since 7.2 */ define('PHP_OS_FAMILY', "Linux"); define('PHP_SAPI', "cli"); /** * @since 7.4 */ define('PHP_CLI_PROCESS_TITLE', 1); define('DEFAULT_INCLUDE_PATH', ".:/usr/share/php:/usr/share/pear"); define('PEAR_INSTALL_DIR', "/usr/share/php"); define('PEAR_EXTENSION_DIR', "/usr/lib/php5/20090626"); define('PHP_EXTENSION_DIR', "/usr/lib/php5/20090626"); /** * Specifies where the binaries were installed into. * @link https://php.net/manual/en/reserved.constants.php */ define('PHP_BINARY', '/usr/local/php/bin/php'); define('PHP_PREFIX', "/usr"); define('PHP_BINDIR', "/usr/bin"); define('PHP_LIBDIR', "/usr/lib/php5"); define('PHP_DATADIR', "/usr/share"); define('PHP_SYSCONFDIR', "/etc"); define('PHP_LOCALSTATEDIR', "/var"); define('PHP_CONFIG_FILE_PATH', "/etc/php5/cli"); define('PHP_CONFIG_FILE_SCAN_DIR', "/etc/php5/cli/conf.d"); define('PHP_SHLIB_SUFFIX', "so"); define('PHP_EOL', "\n"); define('SUHOSIN_PATCH', 1); define('SUHOSIN_PATCH_VERSION', "0.9.10"); define('PHP_MAXPATHLEN', 4096); define('PHP_INT_MAX', 9223372036854775807); define('PHP_INT_MIN', -9223372036854775808); define('PHP_INT_SIZE', 8); /** * Number of decimal digits that can be rounded into a float and back without precision loss. Available as of PHP 7.2.0. * @since 7.2 */ define('PHP_FLOAT_DIG', 15); /** * Smallest representable positive number x, so that x + 1.0 != 1.0. Available as of PHP 7.2.0. * @since 7.2 */ define('PHP_FLOAT_EPSILON', 2.2204460492503e-16); /** * Largest representable floating point number. Available as of PHP 7.2.0. * @since 7.2 */ define('PHP_FLOAT_MAX', 1.7976931348623e+308); /** * Smallest representable floating point number. Available as of PHP 7.2.0. * @since 7.2 */ define('PHP_FLOAT_MIN', 2.2250738585072e-308); define('ZEND_MULTIBYTE', 0); define('PHP_OUTPUT_HANDLER_START', 1); define('PHP_OUTPUT_HANDLER_CONT', 2); define('PHP_OUTPUT_HANDLER_END', 4); define('UPLOAD_ERR_OK', 0); define('UPLOAD_ERR_INI_SIZE', 1); define('UPLOAD_ERR_FORM_SIZE', 2); define('UPLOAD_ERR_PARTIAL', 3); define('UPLOAD_ERR_NO_FILE', 4); define('UPLOAD_ERR_NO_TMP_DIR', 6); define('UPLOAD_ERR_CANT_WRITE', 7); define('UPLOAD_ERR_EXTENSION', 8); define('STDIN', fopen('php://stdin', 'r')); define('STDOUT', fopen('php://stdout', 'w')); define('STDERR', fopen('php://stderr', 'w')); define('PHP_FD_SETSIZE', 1024); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_WRITE', 0); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_FLUSH', 4); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_CLEAN', 2); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_FINAL', 8); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_CLEANABLE', 16); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_FLUSHABLE', 32); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_REMOVABLE', 64); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_STDFLAGS', 112); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_STARTED', 4096); /** @link https://php.net/manual/en/outcontrol.constants.php */ define('PHP_OUTPUT_HANDLER_DISABLED', 8192); /** * @since 8.4 */ const PHP_SBINDIR = '/usr/local/sbin', PHP_OUTPUT_HANDLER_PROCESSED = 16384; /** * Specifies where the manpages were installed into. * @since 5.3.7 * @link https://php.net/manual/en/reserved.constants.php */ define('PHP_MANDIR', '/usr/local/php/php/man'); * The argument offset. Function arguments are counted starting from * zero. *

* @return mixed|false the specified argument, or false on error. */ #[Pure] function func_get_arg(int $position): mixed {} /** * Returns an array comprising a function's argument list * @link https://php.net/manual/en/function.func-get-args.php * @return array an array in which each element is a copy of the corresponding * member of the current user-defined function's argument list. */ #[Pure] function func_get_args(): array {} /** * Get string length * @link https://php.net/manual/en/function.strlen.php * @param string $string

* The string being measured for length. *

* @return int<0,max> The length of the string on success, * and 0 if the string is empty. */ #[Pure] function strlen(string $string): int {} /** * Binary safe string comparison * @link https://php.net/manual/en/function.strcmp.php * @param string $string1

* The first string. *

* @param string $string2

* The second string. *

* @return int less 0 if str1 is less than * str2; > 0 if str1 * is greater than str2, and 0 if they are * equal. */ #[Pure] function strcmp(string $string1, string $string2): int {} /** * Binary safe string comparison of the first n characters * @link https://php.net/manual/en/function.strncmp.php * @param string $string1

* The first string. *

* @param string $string2

* The second string. *

* @param int $length

* Number of characters to use in the comparison. *

* @return int less 0 if str1 is less than * str2; > 0 if str1 * is greater than str2, and 0 if they are * equal. */ #[Pure] function strncmp(string $string1, string $string2, int $length): int {} /** * Binary safe case-insensitive string comparison * @link https://php.net/manual/en/function.strcasecmp.php * @param string $string1

* The first string *

* @param string $string2

* The second string *

* @return int less than 0 if str1 is less than * str2; > 0 if str1 * is greater than str2, and 0 if they are * equal. */ #[Pure] function strcasecmp(string $string1, string $string2): int {} /** * Binary safe case-insensitive string comparison of the first n characters * @link https://php.net/manual/en/function.strncasecmp.php * @param string $string1

* The first string. *

* @param string $string2

* The second string. *

* @param int $length

* The length of strings to be used in the comparison. *

* @return int less than 0 if str1 is less than * str2; > 0 if str1 is * greater than str2, and 0 if they are equal. */ #[Pure] function strncasecmp(string $string1, string $string2, int $length): int {} /** * The function returns {@see true} if the passed $haystack starts from the * $needle string or {@see false} otherwise. * * @param string $haystack * @param string $needle * @return bool * @since 8.0 */ #[Pure] function str_starts_with(string $haystack, string $needle): bool {} /** * The function returns {@see true} if the passed $haystack ends with the * $needle string or {@see false} otherwise. * * @param string $haystack * @param string $needle * @return bool * @since 8.0 */ #[Pure] function str_ends_with(string $haystack, string $needle): bool {} /** * Checks if $needle is found in $haystack and returns a boolean value * (true/false) whether or not the $needle was found. * * @param string $haystack * @param string $needle * @return bool * @since 8.0 */ #[Pure] function str_contains(string $haystack, string $needle): bool {} /** * @since 8.3 */ function str_decrement(string $string): string {} /** * @since 8.3 */ function str_increment(string $string): string {} /** * Return the current key and value pair from an array and advance the array cursor * @link https://php.net/manual/en/function.each.php * @param array|ArrayObject &$array

* The input array. *

* @return array the current key and value pair from the array * array. This pair is returned in a four-element * array, with the keys 0, 1, * key, and value. Elements * 0 and key contain the key name of * the array element, and 1 and value * contain the data. *

*

* If the internal pointer for the array points past the end of the * array contents, each returns * false. * @removed 8.0 */ #[Deprecated(reason: "Use a foreach loop instead", since: "7.2")] function each(&$array): array {} /** * Sets which PHP errors are reported * @link https://php.net/manual/en/function.error-reporting.php * @param int|null $error_level [optional]

* The new error_reporting * level. It takes on either a bitmask, or named constants. Using named * constants is strongly encouraged to ensure compatibility for future * versions. As error levels are added, the range of integers increases, * so older integer-based error levels will not always behave as expected. *

*

* The available error level constants and the actual * meanings of these error levels are described in the * predefined constants. * * error_reporting level constants and bit values * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
valueconstant
1 * E_ERROR *
2 * E_WARNING *
4 * E_PARSE *
8 * E_NOTICE *
16 * E_CORE_ERROR *
32 * E_CORE_WARNING *
64 * E_COMPILE_ERROR *
128 * E_COMPILE_WARNING *
256 * E_USER_ERROR *
512 * E_USER_WARNING *
1024 * E_USER_NOTICE *
32767 * E_ALL *
2048 * E_STRICT *
4096 * E_RECOVERABLE_ERROR *
8192 * E_DEPRECATED *
16384 * E_USER_DEPRECATED *
*

* @return int the old error_reporting * level or the current level if no level parameter is * given. */ function error_reporting(?int $error_level): int {} /** * Defines a named constant * @link https://php.net/manual/en/function.define.php * @param string $constant_name

* The name of the constant. *

* @param null|array|bool|int|float|string $value

* The value of the constant. * In PHP 5, value must be a scalar value (integer, float, string, boolean, or null). * In PHP 7, array values are also accepted. * It is possible to define resource constants, * however it is not recommended and may cause unpredictable behavior. *

* @param bool $case_insensitive [optional]

* If set to true, the constant will be defined case-insensitive. * The default behavior is case-sensitive; i.e. * CONSTANT and Constant represent * different values. * Defining case-insensitive constants is deprecated as of PHP 7.3.0. *

*

* Case-insensitive constants are stored as lower-case. *

* @return bool true on success or false on failure. */ function define( string $constant_name, #[LanguageLevelTypeAware(['8.1' => 'mixed'], default: 'null|array|bool|int|float|string')] $value, #[Deprecated(since: "7.3")] bool $case_insensitive = false ): bool {} /** * Checks whether a given named constant exists * @link https://php.net/manual/en/function.defined.php * @param string $constant_name

* The constant name. *

* @return bool true if the named constant given by name * has been defined, false otherwise. */ #[Pure(true)] function defined(string $constant_name): bool {} /** * Returns the name of the class of an object * @link https://php.net/manual/en/function.get-class.php * @param object $object [optional]

* The tested object. This parameter may be omitted when inside a class. *

* @return string

The name of the class of which object is an * instance. * If object is omitted when inside a class, the * name of that class is returned.

*/ #[Pure] function get_class(object $object): string {} /** * the "Late Static Binding" class name * @link https://php.net/manual/en/function.get-called-class.php * @return string */ #[Pure] function get_called_class(): string {} /** * Retrieves the parent class name for object or class * @link https://php.net/manual/en/function.get-parent-class.php * @param object|string $object_or_class [optional]

* The tested object or class name *

* @return string|false

The name of the parent class of the class of which * object is an instance or the name. *

*

* If the object does not have a parent false will be returned. *

*

* If called without parameter outside object, this function returns false.

*/ #[Pure] function get_parent_class(object|string $object_or_class): string|false {} /** * Checks if the class method exists * @link https://php.net/manual/en/function.method-exists.php * @param object|string $object_or_class

* An object instance or a class name *

* @param string $method

* The method name *

* @return bool true if the method given by method_name * has been defined for the given object, false * otherwise. */ #[Pure] function method_exists($object_or_class, string $method): bool {} /** * Checks if the object or class has a property * @link https://php.net/manual/en/function.property-exists.php * @param object|string $object_or_class

* The class name or an object of the class to test for *

* @param string $property

* The name of the property *

* @return bool true if the property exists, false if it doesn't exist or * null in case of an error. */ #[Pure] function property_exists($object_or_class, string $property): bool {} /** * Checks if the trait exists * @param string $trait Name of the trait to check * @param bool $autoload [optional] Whether to autoload if not already loaded. * @return bool Returns TRUE if trait exists, FALSE if not, NULL in case of an error. * @link https://secure.php.net/manual/en/function.trait-exists.php * @since 5.4 */ function trait_exists(string $trait, bool $autoload = true): bool {} /** * Checks if the class has been defined * @link https://php.net/manual/en/function.class-exists.php * @param string $class

* The class name. The name is matched in a case-insensitive manner. *

* @param bool $autoload [optional]

* Whether or not to call autoload by default. *

* @return bool true if class_name is a defined class, * false otherwise. */ function class_exists(string $class, bool $autoload = true): bool {} /** * Checks if the interface has been defined * @link https://php.net/manual/en/function.interface-exists.php * @param string $interface

* The interface name *

* @param bool $autoload [optional]

* Whether to call autoload or not by default. *

* @return bool true if the interface given by * interface_name has been defined, false otherwise. * @since 5.0.2 */ function interface_exists(string $interface, bool $autoload = true): bool {} /** * Return true if the given function has been defined * @link https://php.net/manual/en/function.function-exists.php * @param string $function

* The function name, as a string. *

* @return bool true if function_name exists and is a * function, false otherwise. *

*

* This function will return false for constructs, such as * include_once and echo. */ #[Pure(true)] function function_exists(string $function): bool {} /** * Checks if the enum has been defined * @link https://php.net/manual/en/function.enum-exists.php * @param string $enum

* The enum name. The name is matched in a case-insensitive manner. *

* @param bool $autoload [optional]

* Whether or not to call autoload by default. *

* @return bool true if enum is a defined enum, * false otherwise. * @since 8.1 */ function enum_exists(string $enum, bool $autoload = true): bool {} /** * Creates an alias for a class * @link https://php.net/manual/en/function.class-alias.php * @param string $class The original class. * @param string $alias The alias name for the class. * @param bool $autoload [optional] Whether to autoload if the original class is not found. * @return bool true on success or false on failure. */ function class_alias(string $class, string $alias, bool $autoload = true): bool {} /** * Returns an array with the names of included or required files * @link https://php.net/manual/en/function.get-included-files.php * @return string[] an array of the names of all files. *

* The script originally called is considered an "included file," so it will * be listed together with the files referenced by * include and family. *

*

* Files that are included or required multiple times only show up once in * the returned array. *

*/ #[Pure(true)] function get_included_files(): array {} /** * Alias of get_included_files * @link https://php.net/manual/en/function.get-required-files.php * @return string[] */ #[Pure(true)] function get_required_files(): array {} /** * checks if the object has this class as one of its parents or implements it * @link https://php.net/manual/en/function.is-subclass-of.php * @param object|string $object_or_class

* A class name or an object instance *

* @param string $class

* The class name *

* @param bool $allow_string [optional]

* If this parameter set to false, string class name as object is not allowed. * This also prevents from calling autoloader if the class doesn't exist. *

* @return bool This function returns true if the object object, * belongs to a class which is a subclass of * class_name, false otherwise. */ #[Pure] function is_subclass_of(mixed $object_or_class, string $class, bool $allow_string = true): bool {} /** * Checks if the object is of this class or has this class as one of its parents * @link https://php.net/manual/en/function.is-a.php * @param object|string $object_or_class

* The tested object *

* @param string $class

* The class name *

* @param bool $allow_string [optional]

* If this parameter set to FALSE, string class name as object * is not allowed. This also prevents from calling autoloader if the class doesn't exist. *

* @return bool TRUE if the object is of this class or has this class as one of * its parents, FALSE otherwise. */ #[Pure] function is_a(mixed $object_or_class, string $class, bool $allow_string = false): bool {} /** * Get the default properties of the class * @link https://php.net/manual/en/function.get-class-vars.php * @param string $class

* The class name *

* @return array an associative array of declared properties visible from the * current scope, with their default value. * The resulting array elements are in the form of * varname => value. */ #[Pure] function get_class_vars(string $class): array {} /** * Gets the properties of the given object * @link https://php.net/manual/en/function.get-object-vars.php * @param object $object

* An object instance. *

* @return array an associative array of defined object accessible non-static properties * for the specified object in scope. If a property have * not been assigned a value, it will be returned with a null value. */ #[Pure] function get_object_vars(object $object): array {} /** * Gets the class methods' names * @link https://php.net/manual/en/function.get-class-methods.php * @param object|string $object_or_class

* The class name or an object instance *

* @return string[] an array of method names defined for the class specified by * class_name. In case of an error, it returns null. */ #[Pure] function get_class_methods(object|string $object_or_class): array {} /** * Generates a user-level error/warning/notice message * @link https://php.net/manual/en/function.trigger-error.php * @param string $message

* The designated error message for this error. It's limited to 1024 * characters in length. Any additional characters beyond 1024 will be * truncated. *

* @param int $error_level [optional]

* The designated error type for this error. It only works with the E_USER * family of constants, and will default to E_USER_NOTICE. *

* @return bool This function returns false if wrong error_type is * specified, true otherwise. */ #[LanguageLevelTypeAware(['8.4' => 'true'], default: 'bool')] function trigger_error(string $message, int $error_level = E_USER_NOTICE) {} /** * Alias of trigger_error * @link https://php.net/manual/en/function.user-error.php * @param string $message * @param int $error_level [optional] * @return bool This function returns false if wrong error_type is * specified, true otherwise. */ #[LanguageLevelTypeAware(['8.4' => 'true'], default: 'bool')] function user_error(string $message, int $error_level = E_USER_NOTICE) {} /** * Sets a user-defined error handler function * @link https://php.net/manual/en/function.set-error-handler.php * @param callable|null $callback

* The user function needs to accept two parameters: the error code, and a * string describing the error. Then there are three optional parameters * that may be supplied: the filename in which the error occurred, the * line number in which the error occurred, and the context in which the * error occurred (an array that points to the active symbol table at the * point the error occurred). The function can be shown as: *

*

* handler * interrno * stringerrstr * stringerrfile * interrline * arrayerrcontext * errno * The first parameter, errno, contains the * level of the error raised, as an integer.

* The user function should stop execution if necessary by calling `exit()`. * If the function returns a value other than false, script execution will * continue with the next statement after the one that caused an error. * If the function returns false, the standard PHP error handler is called. * @param int $error_levels [optional]

* Can be used to mask the triggering of the * error_handler function just like the error_reporting ini setting * controls which errors are shown. Without this mask set the * error_handler will be called for every error * regardless to the setting of the error_reporting setting. *

* @return callable|null a string containing the previously defined error handler (if any). If * the built-in error handler is used null is returned. null is also returned * in case of an error such as an invalid callback. If the previous error handler * was a class method, this function will return an indexed array with the class * and the method name. * * Note that error_handler chaining is possible by passing the output value as a reference: * ``` * $previousErrorHandler = set_error_handler( * static function (int $errNo, string $errstr, string $errFile, int $errLine) use (&$previousErrorHandler): bool { * // Handle specific scenarios * * return $previousErrorHandler !== null ? (bool) $previousErrorHandler(...func_get_args()) : false; * } * ); * ``` */ function set_error_handler(?callable $callback, int $error_levels = E_ALL|E_STRICT) {} /** * Restores the previous error handler function * @link https://php.net/manual/en/function.restore-error-handler.php * @return bool This function always returns true. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] function restore_error_handler(): bool {} /** * Sets a user-defined exception handler function * @link https://php.net/manual/en/function.set-exception-handler.php * @param callable|null $callback

* Name of the function to be called when an uncaught exception occurs. * This function must be defined before calling * set_exception_handler. This handler function * needs to accept one parameter, which will be the exception object that * was thrown. * NULL may be passed instead, to reset this handler to its default state. *

* @return callable|null the name of the previously defined exception handler, or null on error. If * no previous handler was defined, null is also returned. */ function set_exception_handler(?callable $callback) {} /** * Restores the previously defined exception handler function * @link https://php.net/manual/en/function.restore-exception-handler.php * @return bool This function always returns true. */ #[LanguageLevelTypeAware(['8.2' => 'true'], default: 'bool')] function restore_exception_handler(): bool {} /** * Returns an array with the name of the defined classes * @link https://php.net/manual/en/function.get-declared-classes.php * @return string[] an array of the names of the declared classes in the current script. *

* Note that depending on what extensions you have compiled or * loaded into PHP, additional classes could be present. This means that * you will not be able to define your own classes using these * names. There is a list of predefined classes in the Predefined Classes section of * the appendices. *

*/ #[Pure(true)] function get_declared_classes(): array {} /** * Returns an array of all declared interfaces * @link https://php.net/manual/en/function.get-declared-interfaces.php * @return string[] an array of the names of the declared interfaces in the current * script. */ #[Pure(true)] function get_declared_interfaces(): array {} /** * Returns an array of all declared traits * @return array with names of all declared traits in values. Returns NULL in case of a failure. * @link https://secure.php.net/manual/en/function.get-declared-traits.php * @see class_uses() * @since 5.4 */ #[Pure(true)] function get_declared_traits(): array {} /** * Returns an array of all defined functions * @link https://php.net/manual/en/function.get-defined-functions.php * @param bool $exclude_disabled [optional] Whether disabled functions should be excluded from the return value. * @return array an multidimensional array containing a list of all defined * functions, both built-in (internal) and user-defined. The internal * functions will be accessible via $arr["internal"], and * the user defined ones using $arr["user"] (see example * below). */ #[Pure(true)] function get_defined_functions(#[PhpStormStubsElementAvailable(from: '7.1')] bool $exclude_disabled = true): array {} /** * Returns an array of all defined variables * @link https://php.net/manual/en/function.get-defined-vars.php * @return array A multidimensional array with all the variables. */ #[Pure(true)] function get_defined_vars(): array {} /** * Create an anonymous (lambda-style) function * @link https://php.net/manual/en/function.create-function.php * @param string $args

* The function arguments. *

* @param string $code

* The function code. *

* @return string|false a unique function name as a string, or false on error. * @removed 8.0 */ #[Deprecated(reason: "Use anonymous functions instead", since: "7.2")] function create_function(string $args, string $code): false|string {} /** * Returns the resource type * @link https://php.net/manual/en/function.get-resource-type.php * @param resource $resource

* The evaluated resource handle. *

* @return string If the given handle is a resource, this function * will return a string representing its type. If the type is not identified * by this function, the return value will be the string * Unknown. */ function get_resource_type($resource): string {} /** * Returns an array with the names of all modules compiled and loaded * @link https://php.net/manual/en/function.get-loaded-extensions.php * @param bool $zend_extensions [optional]

* Only return Zend extensions, if not then regular extensions, like * mysqli are listed. Defaults to false (return regular extensions). *

* @return string[] an indexed array of all the modules names. */ #[Pure] function get_loaded_extensions(bool $zend_extensions = false): array {} /** * Find out whether an extension is loaded * @link https://php.net/manual/en/function.extension-loaded.php * @param string $extension

* The extension name. *

*

* You can see the names of various extensions by using * phpinfo or if you're using the * CGI or CLI version of * PHP you can use the -m switch to * list all available extensions: *

 * $ php -m
 * [PHP Modules]
 * xml
 * tokenizer
 * standard
 * sockets
 * session
 * posix
 * pcre
 * overload
 * mysql
 * mbstring
 * ctype
 * [Zend Modules]
 * 
*

* @return bool true if the extension identified by name * is loaded, false otherwise. */ #[Pure] function extension_loaded(string $extension): bool {} /** * Returns an array with the names of the functions of a module * @link https://php.net/manual/en/function.get-extension-funcs.php * @param string $extension

* The module name. *

*

* This parameter must be in lowercase. *

* @return string[]|false an array with all the functions, or false if * module_name is not a valid extension. */ #[Pure] function get_extension_funcs(string $extension): array|false {} /** * Returns an associative array with the names of all the constants and their values * @link https://php.net/manual/en/function.get-defined-constants.php * @param bool $categorize [optional]

* Causing this function to return a multi-dimensional * array with categories in the keys of the first dimension and constants * and their values in the second dimension. * * define("MY_CONSTANT", 1); * print_r(get_defined_constants(true)); * * The above example will output something similar to: *

 * Array
 * (
 * [Core] => Array
 * (
 * [E_ERROR] => 1
 * [E_WARNING] => 2
 * [E_PARSE] => 4
 * [E_NOTICE] => 8
 * [E_CORE_ERROR] => 16
 * [E_CORE_WARNING] => 32
 * [E_COMPILE_ERROR] => 64
 * [E_COMPILE_WARNING] => 128
 * [E_USER_ERROR] => 256
 * [E_USER_WARNING] => 512
 * [E_USER_NOTICE] => 1024
 * [E_STRICT] => 2048
 * [E_RECOVERABLE_ERROR] => 4096
 * [E_DEPRECATED] => 8192
 * [E_USER_DEPRECATED] => 16384
 * [E_ALL] => 32767
 * [TRUE] => 1
 * )
 * [pcre] => Array
 * (
 * [PREG_PATTERN_ORDER] => 1
 * [PREG_SET_ORDER] => 2
 * [PREG_OFFSET_CAPTURE] => 256
 * [PREG_SPLIT_NO_EMPTY] => 1
 * [PREG_SPLIT_DELIM_CAPTURE] => 2
 * [PREG_SPLIT_OFFSET_CAPTURE] => 4
 * [PREG_GREP_INVERT] => 1
 * )
 * [user] => Array
 * (
 * [MY_CONSTANT] => 1
 * )
 * )
 * 
*

* @return array */ #[Pure(true)] function get_defined_constants(bool $categorize = false): array {} /** * Generates a backtrace * @link https://php.net/manual/en/function.debug-backtrace.php * @param int $options [optional]

* As of 5.3.6, this parameter is a bitmask for the following options:

* debug_backtrace options * * * * * * * * * *
DEBUG_BACKTRACE_PROVIDE_OBJECT * Whether or not to populate the "object" index. *
DEBUG_BACKTRACE_IGNORE_ARGS * Whether or not to omit the "args" index, and thus all the function/method arguments, * to save memory. *
*

* Before 5.3.6, the only values recognized are true or false, which are the same as * setting or not setting the DEBUG_BACKTRACE_PROVIDE_OBJECT option respectively. *

* @param int $limit [optional]

* As of 5.4.0, this parameter can be used to limit the number of stack frames returned. * By default (limit=0) it returns all stack frames. *

* @return array

an array of associative arrays. The possible returned elements * are as follows: *

*

* Possible returned elements from debug_backtrace *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
NameTypeDescription
functionstring * The current function name. See also * __FUNCTION__. *
lineinteger * The current line number. See also * __LINE__. *
filestring * The current file name. See also * __FILE__. *
classstring * The current class name. See also * __CLASS__ *
objectobject * The current object. *
typestring * The current call type. If a method call, "->" is returned. If a static * method call, "::" is returned. If a function call, nothing is returned. *
argsarray * If inside a function, this lists the functions arguments. If * inside an included file, this lists the included file name(s). *
*/ function debug_backtrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array {} /** * Prints a backtrace * @link https://php.net/manual/en/function.debug-print-backtrace.php * @param int $options [optional]

* As of 5.3.6, this parameter is a bitmask for the following options: * debug_print_backtrace options * * * * * *
DEBUG_BACKTRACE_IGNORE_ARGS * Whether or not to omit the "args" index, and thus all the function/method arguments, * to save memory. *
*

* @param int $limit [optional]

* As of 5.4.0, this parameter can be used to limit the number of stack frames printed. * By default (limit = 0) it prints all stack frames. *

* @return void */ function debug_print_backtrace( int $options = 0, #[PhpStormStubsElementAvailable(from: '7.0')] int $limit = 0 ): void {} /** * Forces collection of any existing garbage cycles * @link https://php.net/manual/en/function.gc-collect-cycles.php * @return int number of collected cycles. */ function gc_collect_cycles(): int {} /** * Returns status of the circular reference collector * @link https://php.net/manual/en/function.gc-enabled.php * @return bool true if the garbage collector is enabled, false otherwise. */ #[Pure(true)] function gc_enabled(): bool {} /** * Activates the circular reference collector * @link https://php.net/manual/en/function.gc-enable.php * @return void */ function gc_enable(): void {} /** * Deactivates the circular reference collector * @link https://php.net/manual/en/function.gc-disable.php * @return void */ function gc_disable(): void {} /** * Gets information about the garbage collector * @link https://php.net/manual/en/function.gc-status.php * @return int[] associative array with the following elements: *
    *
  • "runs"
  • *
  • "collected"
  • *
  • "threshold"
  • *
  • "roots"
  • *
* @since 7.3 */ #[ArrayShape(["runs" => "int", "collected" => "int", "threshold" => "int", "roots" => "int"])] #[Pure(true)] function gc_status(): array {} /** * Reclaims memory used by the Zend Engine memory manager * @link https://php.net/manual/en/function.gc-mem-caches.php * @return int Returns the number of bytes freed. * @since 7.0 */ function gc_mem_caches(): int {} /** * Returns active resources * @link https://php.net/manual/en/function.get-resources.php * @param string|null $type [optional]

* * If defined, this will cause get_resources() to only return resources of the given type. A list of resource types is available. * * If the string Unknown is provided as the type, then only resources that are of an unknown type will be returned. * * If omitted, all resources will be returned. *

* @return resource[] Returns an array of currently active resources, indexed by resource number. * @since 7.0 */ #[Pure(true)] function get_resources(?string $type): array {} * You may specify a string with which to prompt the user. *

* @return string|false a single string from the user. The line returned has the ending newline removed. * If there is no more data to read, then FALSE is returned. */ function readline(?string $prompt): string|false {} /** * Gets/sets various internal readline variables * @link https://php.net/manual/en/function.readline-info.php * @param string|null $var_name [optional]

* A variable name. *

* @param string $value [optional]

* If provided, this will be the new value of the setting. *

* @return mixed If called with no parameters, this function returns an array of * values for all the setting readline uses. The elements will * be indexed by the following values: done, end, erase_empty_line, * library_version, line_buffer, mark, pending_input, point, prompt, * readline_name, and terminal_name. *

*

* If called with one or two parameters, the old value is returned. */ #[ArrayShape([ 'line_buffer' => 'string', 'point' => 'int', 'end' => 'int', 'mark' => 'int', 'done' => 'int', 'pending_input' => 'int', 'prompt' => 'string', 'terminal_name' => 'string', 'completion_append_character' => 'string', 'completion_suppress_append' => 'bool', 'erase_empty_line' => 'int', 'library_version' => 'string', 'readline_name' => 'string', 'attempted_completion_over' => 'int', ])] function readline_info(?string $var_name, $value): mixed {} /** * Adds a line to the history * @link https://php.net/manual/en/function.readline-add-history.php * @param string $prompt

* The line to be added in the history. *

* @return bool TRUE on success or FALSE on failure. */ function readline_add_history(string $prompt): bool {} /** * Clears the history * @link https://php.net/manual/en/function.readline-clear-history.php * @return bool TRUE on success or FALSE on failure. */ function readline_clear_history(): bool {} /** * Lists the history * @link https://php.net/manual/en/function.readline-list-history.php * @return array an array of the entire command line history. The elements are * indexed by integers starting at zero. */ function readline_list_history(): array {} /** * Reads the history * @link https://php.net/manual/en/function.readline-read-history.php * @param string|null $filename [optional]

* Path to the filename containing the command history. *

* @return bool TRUE on success or FALSE on failure. */ function readline_read_history(?string $filename): bool {} /** * Writes the history * @link https://php.net/manual/en/function.readline-write-history.php * @param string|null $filename [optional]

* Path to the saved file. *

* @return bool TRUE on success or FALSE on failure. */ function readline_write_history(?string $filename): bool {} /** * Registers a completion function * @link https://php.net/manual/en/function.readline-completion-function.php * @param callable $callback

* You must supply the name of an existing function which accepts a * partial command line and returns an array of possible matches. *

* @return bool TRUE on success or FALSE on failure. */ function readline_completion_function(callable $callback): bool {} /** * Initializes the readline callback interface and terminal, prints the prompt and returns immediately * @link https://php.net/manual/en/function.readline-callback-handler-install.php * @param string $prompt

* The prompt message. *

* @param callable $callback

* The callback function takes one parameter; the * user input returned. *

* @return bool TRUE on success or FALSE on failure. */ function readline_callback_handler_install(string $prompt, callable $callback): bool {} /** * Reads a character and informs the readline callback interface when a line is received * @link https://php.net/manual/en/function.readline-callback-read-char.php * @return void No value is returned. */ function readline_callback_read_char(): void {} /** * Removes a previously installed callback handler and restores terminal settings * @link https://php.net/manual/en/function.readline-callback-handler-remove.php * @return bool TRUE if a previously installed callback handler was removed, or * FALSE if one could not be found. */ function readline_callback_handler_remove(): bool {} /** * Redraws the display * @link https://php.net/manual/en/function.readline-redisplay.php * @return void No value is returned. */ function readline_redisplay(): void {} /** * Inform readline that the cursor has moved to a new line * @link https://php.net/manual/en/function.readline-on-new-line.php * @return void No value is returned. */ function readline_on_new_line(): void {} define('READLINE_LIB', "readline"); // End of readline v.5.5.3-1ubuntu2.1 * The input charset. *

* @param string $to_encoding

* The output charset. *

*

* If you append the string //TRANSLIT to * out_charset transliteration is activated. This * means that when a character can't be represented in the target charset, * it can be approximated through one or several similarly looking * characters. If you append the string //IGNORE, * characters that cannot be represented in the target charset are silently * discarded. Otherwise, str is cut from the first * illegal character and an E_NOTICE is generated. *

* @param string $string

* The string to be converted. *

* @return string|false the converted string or FALSE on failure. */ #[Pure] function iconv(string $from_encoding, string $to_encoding, string $string): string|false {} /** * Convert character encoding as output buffer handler * @link https://php.net/manual/en/function.ob-iconv-handler.php * @param string $contents * @param int $status * @return string See ob_start for information about this handler * return values. */ #[Pure] function ob_iconv_handler(string $contents, int $status): string {} /** * Retrieve internal configuration variables of iconv extension * @link https://php.net/manual/en/function.iconv-get-encoding.php * @param string $type [optional]

* The value of the optional type can be: * all * input_encoding * output_encoding * internal_encoding *

* @return string|string[]|false the current value of the internal configuration variable if * successful or FALSE on failure. *

* If type is omitted or set to "all", * iconv_get_encoding returns an array that * stores all these variables. *

*/ #[Pure] #[ArrayShape(["input_encoding" => "string", "output_encoding" => "string", "internal_encoding" => "string"])] function iconv_get_encoding(string $type = "all"): array|string|false {} /** * Set current setting for character encoding conversion * @link https://php.net/manual/en/function.iconv-set-encoding.php * @param string $type

* The value of type can be any one of these: * input_encoding * output_encoding * internal_encoding *

* @param string $encoding

* The character set. *

* @return bool TRUE on success or FALSE on failure. */ function iconv_set_encoding(string $type, string $encoding): bool {} /** * Returns the character count of string * @link https://php.net/manual/en/function.iconv-strlen.php * @param string $string

* The string. *

* @param string|null $encoding

* If charset parameter is omitted, * str is assumed to be encoded in * iconv.internal_encoding. *

* @return int|false the character count of str, as an integer. False on error. */ #[Pure] function iconv_strlen(string $string, ?string $encoding = null): int|false {} /** * Cut out part of a string * @link https://php.net/manual/en/function.iconv-substr.php * @param string $string

* The original string. *

* @param int $offset

* If offset is non-negative, * iconv_substr cuts the portion out of * str beginning at offset'th * character, counting from zero. *

*

* If offset is negative, * iconv_substr cuts out the portion beginning * at the position, offset characters * away from the end of str. *

* @param int|null $length [optional]

* If length is given and is positive, the return * value will contain at most length characters * of the portion that begins at offset * (depending on the length of string). *

*

* If negative length is passed, * iconv_substr cuts the portion out of * str from the offset'th * character up to the character that is * length characters away from the end of the string. * In case offset is also negative, the start position * is calculated beforehand according to the rule explained above. *

* @param string|null $encoding

* If charset parameter is omitted, * string are assumed to be encoded in * iconv.internal_encoding. *

*

* Note that offset and length * parameters are always deemed to represent offsets that are * calculated on the basis of the character set determined by * charset, whilst the counterpart * substr always takes these for byte offsets. *

* @return string|false the portion of str specified by the * offset and length parameters. *

* If str is shorter than offset * characters long, FALSE will be returned. *

*/ #[Pure] function iconv_substr(string $string, int $offset, ?int $length, ?string $encoding = null): string|false {} /** * Finds position of first occurrence of a needle within a haystack * @link https://php.net/manual/en/function.iconv-strpos.php * @param string $haystack

* The entire string. *

* @param string $needle

* The searched substring. *

* @param int $offset [optional]

* The optional offset parameter specifies * the position from which the search should be performed. *

* @param string|null $encoding

* If charset parameter is omitted, * string are assumed to be encoded in * iconv.internal_encoding. *

* @return int<0,max>|false the numeric position of the first occurrence of * needle in haystack. *

* If needle is not found, * iconv_strpos will return FALSE. *

*/ #[Pure] function iconv_strpos(string $haystack, string $needle, int $offset = 0, ?string $encoding = null): int|false {} /** * Finds the last occurrence of a needle within a haystack * @link https://php.net/manual/en/function.iconv-strrpos.php * @param string $haystack

* The entire string. *

* @param string $needle

* The searched substring. *

* @param string|null $encoding

* If charset parameter is omitted, * string are assumed to be encoded in * iconv.internal_encoding. *

* @return int|false the numeric position of the last occurrence of * needle in haystack. *

* If needle is not found, * iconv_strrpos will return FALSE. *

*/ #[Pure] function iconv_strrpos(string $haystack, string $needle, ?string $encoding = null): int|false {} /** * Composes a MIME header field * @link https://php.net/manual/en/function.iconv-mime-encode.php * @param string $field_name

* The field name. *

* @param string $field_value

* The field value. *

* @param array $options

* You can control the behaviour of iconv_mime_encode * by specifying an associative array that contains configuration items * to the optional third parameter preferences. * The items supported by iconv_mime_encode are * listed below. Note that item names are treated case-sensitive. * * Configuration items supported by iconv_mime_encode * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ItemTypeDescriptionDefault valueExample
schemestring * Specifies the method to encode a field value by. The value of * this item may be either "B" or "Q", where "B" stands for * base64 encoding scheme and "Q" stands for * quoted-printable encoding scheme. * BB
input-charsetstring * Specifies the character set in which the first parameter * field_name and the second parameter * field_value are presented. If not given, * iconv_mime_encode assumes those parameters * are presented to it in the * iconv.internal_encoding * ini setting. * * iconv.internal_encoding * ISO-8859-1
output-charsetstring * Specifies the character set to use to compose the * MIME header. * * iconv.internal_encoding * UTF-8
line-lengthinteger * Specifies the maximum length of the header lines. The resulting * header is "folded" to a set of multiple lines in case * the resulting header field would be longer than the value of this * parameter, according to * RFC2822 - Internet Message Format. * If not given, the length will be limited to 76 characters. * 76996
line-break-charsstring * Specifies the sequence of characters to append to each line * as an end-of-line sign when "folding" is performed on a long header * field. If not given, this defaults to "\r\n" * (CR LF). Note that * this parameter is always treated as an ASCII string regardless * of the value of input-charset. * \r\n\n
*

* @return string|false an encoded MIME field on success, * or FALSE if an error occurs during the encoding. */ #[Pure] function iconv_mime_encode(string $field_name, string $field_value, array $options = []): string|false {} /** * Decodes a MIME header field * @link https://php.net/manual/en/function.iconv-mime-decode.php * @param string $string

* The encoded header, as a string. *

* @param int $mode [optional]

* mode determines the behaviour in the event * iconv_mime_decode encounters a malformed * MIME header field. You can specify any combination * of the following bitmasks. * * Bitmasks acceptable to iconv_mime_decode * * * * * * * * * * * * * * * *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT * If set, the given header is decoded in full conformance with the * standards defined in RFC2047. * This option is disabled by default because there are a lot of * broken mail user agents that don't follow the specification and don't * produce correct MIME headers. *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR * If set, iconv_mime_decode_headers * attempts to ignore any grammatical errors and continue to process * a given header. *
*

* @param string|null $encoding

* The optional charset parameter specifies the * character set to represent the result by. If omitted, * iconv.internal_encoding * will be used. *

* @return string|false a decoded MIME field on success, * or FALSE if an error occurs during the decoding. */ #[Pure] function iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string|false {} /** * Decodes multiple MIME header fields at once * @link https://php.net/manual/en/function.iconv-mime-decode-headers.php * @param string $headers

* The encoded headers, as a string. *

* @param int $mode [optional]

* mode determines the behaviour in the event * iconv_mime_decode_headers encounters a malformed * MIME header field. You can specify any combination * of the following bitmasks. *
* Bitmasks acceptable to iconv_mime_decode_headers

* * * * * * * * * * * * * * * * *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT * If set, the given header is decoded in full conformance with the * standards defined in RFC2047. * This option is disabled by default because there are a lot of * broken mail user agents that don't follow the specification and don't * produce correct MIME headers. *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR * If set, iconv_mime_decode_headers * attempts to ignore any grammatical errors and continue to process * a given header. *
* @param string|null $encoding

* The optional charset parameter specifies the * character set to represent the result by. If omitted, * iconv.internal_encoding * will be used. *

* @return array|false an associative array that holds a whole set of * MIME header fields specified by * encoded_headers on success, or FALSE * if an error occurs during the decoding. *

* Each key of the return value represents an individual * field name and the corresponding element represents a field value. * If more than one field of the same name are present, * iconv_mime_decode_headers automatically incorporates * them into a numerically indexed array in the order of occurrence. *

*/ #[Pure] function iconv_mime_decode_headers(string $headers, int $mode = 0, ?string $encoding = null): array|false {} /** * string * @link https://php.net/manual/en/iconv.constants.php */ define('ICONV_IMPL', "libiconv"); /** * string * @link https://php.net/manual/en/iconv.constants.php */ define('ICONV_VERSION', 2.17); /** * integer * @link https://php.net/manual/en/iconv.constants.php */ define('ICONV_MIME_DECODE_STRICT', 1); /** * integer * @link https://php.net/manual/en/iconv.constants.php */ define('ICONV_MIME_DECODE_CONTINUE_ON_ERROR', 2); // End of iconv v. Create and initialize new event base

* *

Returns new event base, which can be used later in {@link event_base_set}(), {@link event_base_loop}() and other functions.

* * @link https://php.net/event_base_new * * @return resource|false returns valid event base resource on success or FALSE on error. */ function event_base_new() {} /** *

Destroy event base

*

(PECL libevent >= 0.0.1)

* *

Destroys the specified event_base and frees all the resources associated. * Note that it's not possible to destroy an event base with events attached to it.

* * @link https://php.net/event_base_free * * @param resource $event_base Valid event base resource. * * @return void */ function event_base_free($event_base) {} /** *

Handle events

*

(PECL libevent >= 0.0.1)

* *

Starts event loop for the specified event base.

* *

By default, the {@link event_base_loop}() function runs an event_base until * there are no more events registered in it. To run the loop, it repeatedly * checks whether any of the registered events has triggered (for example, * if a read event's file descriptor is ready to read, or if a timeout event's * timeout is ready to expire). Once this happens, it marks all triggered events * as "active", and starts to run them. *

* *

You can change the behavior of event_base_loop() by setting one or more flags * in its flags argument. If EVLOOP_ONCE is set, then the loop will wait until some * events become active, then run active events until there are no more to run, then * return. If EVLOOP_NONBLOCK is set, then the loop will not wait for events to trigger: * it will only check whether any events are ready to trigger immediately, * and run their callbacks if so. *

* * @link https://php.net/event_base_loop * * @param resource $event_base Valid event base resource. * @param int $flags [optional] Optional parameter, which can take any combination of EVLOOP_ONCE and EVLOOP_NONBLOCK. * * @return int

* Returns 0 if it exited normally, * -1 if it exited because of some unhandled error in the backend * and 1 if no events were registered. *

*/ function event_base_loop($event_base, $flags = null) {} /** *

Tells the event_base to exit its loop immediately.

*

(PECL libevent >= 0.0.1)

* *

It differs from {@link event_base_loopexit}() in that if the event_base is currently * running callbacks for any active events, it will exit immediately after finishing the * one it's currently processing. The behaviour is similar to break statement.

* * @link https://php.net/event_base_loopbreak * * @param resource $event_base Valid event base resource. * * @return bool returns TRUE on success or FALSE on error. */ function event_base_loopbreak($event_base) {} /** *

Tells an event_base to stop looping after a given time has elapsed

*

(PECL libevent >= 0.0.1)

* *

If the event_base is currently running callbacks for any active events, * it will continue running them, and not exit until they have all been run.

* *

If event loop isn't running {@link event_base_loopexit}() schedules the next instance * of the event loop to stop right after the next round of callbacks are run (as if it had * been invoked with EVLOOP_ONCE).

* * @link https://php.net/event_base_loopexit * * @param resource $event_base

* Valid event base resource. *

* @param int $timeout [optional]

* Optional timeout parameter (in microseconds). If lower than 1, * the event_base stops looping without a delay. *

* * @return bool returns TRUE on success or FALSE on error. */ function event_base_loopexit($event_base, $timeout = -1) {} /** *

Associate event base with an event

*

(PECL libevent >= 0.0.1)

* *

Associates the event_base with the event.

* * @link https://php.net/event_base_set * * @param resource $event Valid event resource. * @param resource $base Valid event base resource. * * @return bool returns TRUE on success or FALSE on error. */ function event_base_set($event, $base) {} /** *

Set the number of different event priority levels

*

(PECL libevent >= 0.0.2)

* *

By default all events are scheduled with the same priority (npriorities/2). * Using {@link event_base_priority_init}() you can change the number of event priority * levels and then set a desired priority for each event.

* * @link https://php.net/event_base_priority_init * * @param resource $event_base Valid event base resource. * @param int $npriorities The number of event priority levels. * * @return bool returns TRUE on success or FALSE on error. */ function event_base_priority_init($event_base, $npriorities) {} /** *

Creates and returns a new event resource.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_new * * @return resource|false returns a new event resource on success or FALSE on error. */ function event_new() {} /** *

Free event resource.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_free * * @param resource $event Valid event resource. * * @return void */ function event_free($event) {} /** *

Add an event to the set of monitored events

*

(PECL libevent >= 0.0.1)

* *

Schedules the execution of the non-pending event (makes it pending in it's * configured base) when the event specified in {@link event_set}() occurs or in * at least the time specified by the timeout argument. If timeout was not specified, * not timeout is set. The event must be already initialized by * {@link event_set}() and {@link event_base_set}() functions. * If the event already has a timeout set, * it is replaced by the new one.

* *

If you call {@link event_add}() on an event that is already pending, * it will leave it pending, and reschedule it with the provided timeout.

* * @link https://php.net/event_add * * @param resource $event

* Valid event resource. *

* @param int $timeout [optional]

* Optional timeout (in microseconds). *

* * @return bool returns TRUE on success or FALSE on error. */ function event_add($event, $timeout = -1) {} /** *

Prepares the event to be used in {@link event_add}().

*

(PECL libevent >= 0.0.1)

* *

The event is prepared to call the function specified by the callback * on the events specified in parameter events, which is a set of the following * flags: EV_TIMEOUT, EV_SIGNAL, EV_READ, EV_WRITE and EV_PERSIST.

* *

EV_SIGNAL support was added in version 0.0.4

* *

After initializing the event, use {@link event_base_set}() to associate the event with its event base.

* *

In case of matching event, these three arguments are passed to the callback function: * * * * * * * * * * * * * *
$fdSignal number or resource indicating the stream.
$eventsA flag indicating the event. Consists of the following flags: EV_TIMEOUT, EV_SIGNAL, EV_READ, EV_WRITE and EV_PERSIST.
$argOptional parameter, previously passed to {@link event_set}() as arg.
*

* * @link https://php.net/event_set * * @param resource $event

* Valid event resource. *

* @param resource|int $fd

* Valid PHP stream resource. The stream must be castable to file descriptor, * so you most likely won't be able to use any of filtered streams. *

* @param int $events

* A set of flags indicating the desired event, can be EV_READ and/or EV_WRITE. * The additional flag EV_PERSIST makes the event to persist until {@link event_del}() is * called, otherwise the callback is invoked only once. *

* @param callable $callback

* Callback function to be called when the matching event occurs. *

* @param mixed $arg [optional]

* Optional callback parameter. *

* * @return bool returns TRUE on success or FALSE on error. */ function event_set($event, $fd, $events, $callback, $arg = null) {} /** *

Remove an event from the set of monitored events.

*

(PECL libevent >= 0.0.1)

* *

Calling {@link event_del}() on an initialized event makes it non-pending * and non-active. If the event was not pending or active, there is no effect.

* * @link https://php.net/event_del * * @param resource $event Valid event resource. * * @return bool returns TRUE on success or FALSE on error. */ function event_del($event) {} /** *

Create new buffered event

*

(PECL libevent >= 0.0.1)

* *

Libevent provides an abstraction layer on top of the regular event API. * Using buffered event you don't need to deal with the I/O manually, instead * it provides input and output buffers that get filled and drained automatically.

* *

Every bufferevent has two data-related callbacks: a read callback and a write * callback. By default, the read callback is called whenever any data is read from * the underlying transport, and the write callback is called whenever enough data * from the output buffer is emptied to the underlying transport. You can override * the behavior of these functions by adjusting the read and write "watermarks" * of the bufferevent (see {@link event_buffer_watermark_set}()).

* *

A bufferevent also has an "error" or "event" callback that gets invoked to tell * the application about non-data-oriented events, like when a connection is closed or * an error occurs.

* * @link https://php.net/event_buffer_new * * @param resource $stream Valid PHP stream resource. Must be castable to file descriptor. * @param callable|null $readcb Callback to invoke where there is data to read, or NULL if no callback is desired. * @param callable|null $writecb Callback to invoke where the descriptor is ready for writing, or NULL if no callback is desired. * @param callable $errorcb Callback to invoke where there is an error on the descriptor, cannot be NULL. * @param mixed $arg An argument that will be passed to each of the callbacks (optional). * * @return resource|false returns new buffered event resource on success or FALSE on error. */ function event_buffer_new($stream, $readcb, $writecb, $errorcb, $arg = null) {} /** *

Destroys the specified buffered event and frees all the resources associated.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_buffer_free * * @param resource $bevent Valid buffered event resource. * * @return void */ function event_buffer_free($bevent) {} /** *

Associate buffered event with an event base

*

(PECL libevent >= 0.0.1)

* *

Assign the specified bevent to the event_base.

* * @link https://php.net/event_buffer_base_set * * @param resource $bevent Valid buffered event resource. * @param resource $event_base Valid event base resource. * * @return bool returns TRUE on success or FALSE on error. */ function event_buffer_base_set($bevent, $event_base) {} /** *

Assign a priority to a buffered event. Use it after * initializing event, but before adding an event to the event_base.

*

(PECL libevent >= 0.0.1)

* *

When multiple events trigger at the same time, Libevent * does not define any order with respect to when their callbacks * will be executed. You can define some events as more important * than others by using priorities.

* *

When multiple events of multiple priorities become active, * the low-priority events are not run. Instead, Libevent runs * the high priority events, then checks for events again. Only * when no high-priority events are active are the low-priority * events run.

* *

When you do not set the priority for an event, the default * is the number of queues in the event base, divided by 2.

* * @link https://php.net/event_buffer_priority_set * * @see event_base_priority_init * * @param resource $bevent

* Valid buffered event resource. *

* @param int $priority

* Priority level. Cannot be less than 0 and cannot exceed * maximum priority level of the event base (see {@link event_base_priority_init}()). *

* * @return bool returns TRUE on success or FALSE on error. */ function event_buffer_priority_set($bevent, $priority) {} /** *

Writes data to the specified buffered event.

*

(PECL libevent >= 0.0.1)

* *

The data is appended to the output buffer and written * to the descriptor when it becomes available for writing.

* * @link https://php.net/event_buffer_write * * @param resource $bevent Valid buffered event resource. * @param string $data The data to be written. * @param int $data_size Optional size parameter. {@link event_buffer_write}() writes all the data by default * * @return bool returns TRUE on success or FALSE on error. */ function event_buffer_write($bevent, $data, $data_size = -1) {} /** *

Reads data from the input buffer of the buffered event.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_buffer_read * * @param resource $bevent Valid buffered event resource. * @param int $data_size Data size in bytes. * * @return string */ function event_buffer_read($bevent, $data_size) {} /** *

Enables the specified buffered event.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_buffer_enable * * @param resource $bevent Valid buffered event resource. * @param int $events Any combination of EV_READ and EV_WRITE. * * @return bool returns TRUE on success or FALSE on error. */ function event_buffer_enable($bevent, $events) {} /** *

Disable a buffered event

*

(PECL libevent >= 0.0.1)

* *

Disables the specified buffered event.

* * @link https://php.net/event_buffer_disable * * @param resource $bevent Valid buffered event resource. * @param int $events Any combination of EV_READ and EV_WRITE. * * @return bool returns TRUE on success or FALSE on error. */ function event_buffer_disable($bevent, $events) {} /** *

Sets the read and write timeouts for the specified buffered event.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_buffer_timeout_set * * @param resource $bevent Valid buffered event resource. * @param int $read_timeout Read timeout (in seconds). * @param int $write_timeout Write timeout (in seconds). * * @return void */ function event_buffer_timeout_set($bevent, $read_timeout, $write_timeout) {} /** *

Set the watermarks for read and write events.

*

(PECL libevent >= 0.0.1)

* *

Every bufferevent has four watermarks:

* *

Read low-water mark
* Whenever a read occurs that leaves the bufferevent's input buffer at this * level or higher, the bufferevent's read callback is invoked. Defaults to 0, * so that every read results in the read callback being invoked.

* *

Read high-water mark
* If the bufferevent's input buffer ever gets to this level, the bufferevent * stops reading until enough data is drained from the input buffer to take us * below it again. Defaults to unlimited, so that we never stop reading because * of the size of the input buffer.

* *

Write low-water mark
* Whenever a write occurs that takes us to this level or below, we invoke the write * callback. Defaults to 0, so that a write callback is not invoked unless the output * buffer is emptied.

* *

Write high-water mark
* Not used by a bufferevent directly, this watermark can have special meaning when * a bufferevent is used as the underlying transport of another bufferevent.

* *

Libevent does not invoke read callback unless there is at least lowmark * bytes in the input buffer; if the read buffer is beyond the highmark, * reading is stopped. On output, the write callback is invoked whenever * the buffered data falls below the lowmark.

* * @link https://php.net/event_buffer_watermark_set * * @param resource $bevent Valid buffered event resource. * @param int $events Any combination of EV_READ and EV_WRITE. * @param int $lowmark Low watermark. * @param int $highmark High watermark. * * @return void */ function event_buffer_watermark_set($bevent, $events, $lowmark, $highmark) {} /** *

Changes the file descriptor on which the buffered event operates.

*

(PECL libevent >= 0.0.1)

* * @link https://php.net/event_buffer_fd_set * * @param resource $bevent Valid buffered event resource. * @param resource $fd Valid PHP stream, must be castable to file descriptor. * * @return void */ function event_buffer_fd_set($bevent, $fd) {} /** *

Set or reset callbacks for a buffered event

*

(PECL libevent >= 0.0.4)

* *

Sets or changes existing callbacks for the buffered event.

* * @link https://php.net/event_buffer_set_callback * * @param resource $bevent Valid buffered event resource. * @param callable|null $readcb Callback to invoke where there is data to read, or NULL if no callback is desired. * @param callable|null $writecb Callback to invoke where the descriptor is ready for writing, or NULL if no callback is desired. * @param callable $errorcb Callback to invoke where there is an error on the descriptor, cannot be NULL. * @param mixed $arg An argument that will be passed to each of the callbacks (optional). * * @return bool returns TRUE on success or FALSE on error. */ function event_buffer_set_callback($bevent, $readcb, $writecb, $errorcb, $arg = null) {} /** *

Alias of {@link event_new}().

* * @return resource|false returns valid event base resource on success or FALSE on error. */ function event_timer_new() {} /** *

Prepares the timer event to be used in {@link event_add}().

* *

The event is prepared to call the function specified by the callback * on the timeout event (EV_TIMEOUT).

* *

After initializing the event, use {@link event_base_set}() to associate the event with its event base.

* *

In case of matching event, these three arguments are passed to the callback function: * * * * * * * * * * * * * *
$fdnull
$eventsA flag indicating the event. EV_TIMEOUT.
$argOptional parameter, previously passed to {@link event_timer_set}() as arg.
*

* * @param resource $event

* Valid event resource. *

* @param callable $callback

* Callback function to be called when the matching event occurs. *

* @param mixed $arg [optional]

* Optional callback parameter. *

* * @return void */ function event_timer_set($event, $callback, $arg = null) {} /** *

Checks if a specific event is pending or scheduled.

* * @param resource $event

* Valid event resource. *

* @param int $timeout [optional]

* Optional timeout (in microseconds). *

* * @return bool TRUE if event is not scheduled (added) FALSE otherwise */ function event_timer_pending($event, $timeout = -1) {} /** *

Alias of {@link event_add}().

* * @param resource $event

* Valid event resource. *

* @param int $timeout [optional]

* Optional timeout (in microseconds). *

* * @return bool returns TRUE on success or FALSE on error. */ function event_timer_add($event, $timeout = -1) {} /** *

Alias of {@link event_del}().

* * @param resource $event Valid event resource. * * @return bool returns TRUE on success or FALSE on error. */ function event_timer_del($event) {} // End of PECL libevent v.0.0.4 * For a cataloged connection to a database, this parameter * represents the connection alias in the DB2 client catalog. *

*

* For an uncataloged connection to a database, * this parameter represents a complete DSN in the following format: * DRIVER=driver;DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password; *

* @param string|null $username

* The username with which you are connecting to the database, or null if * the $database parameter contains a DSN which already provides the username for * the connection. *

* @param string|null $password

* The password with which you are connecting to the database, or null if * the $database parameter contains a DSN which already provides the password for * the connection. *

* @param array $options

* An associative array of connection options that affect the behavior * of the connection, where valid array keys include: * autocommit *

* Passing the DB2_AUTOCOMMIT_ON value turns * autocommit on for this connection handle. *

*

* Passing the DB2_AUTOCOMMIT_OFF value turns * autocommit off for this connection handle. *

* @return resource|false A connection handle resource if the connection attempt is * successful. If the connection attempt fails, db2_connect * returns false. */ function db2_connect(#[\SensitiveParameter] string $database, ?string $username, #[\SensitiveParameter] ?string $password, array $options = []) {} /** * Commits a transaction * @link https://php.net/manual/en/function.db2-commit.php * @param resource $connection

* A valid database connection resource variable as returned from * db2_connect or db2_pconnect. *

* @return bool true on success or false on failure. */ function db2_commit($connection): bool {} /** * Returns a persistent connection to a database * @link https://php.net/manual/en/function.db2-pconnect.php * @param string $database

* For a cataloged connection to a database, this parameter * represents the connection alias in the DB2 client catalog. *

*

* For an uncataloged connection to a database, * this parameter represents a complete DSN in the following format: * DRIVER=driver;DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password; *

* @param string|null $username

* The username with which you are connecting to the database, or null if * the $database parameter contains a DSN which already provides the username for * the connection. *

* @param string|null $password

* The password with which you are connecting to the database, or null if * the $database parameter contains a DSN which already provides the password for * the connection. *

* @param array $options

* An associative array of connection options that affect the behavior * of the connection, where valid array keys include: * autocommit *

*

* Passing the DB2_AUTOCOMMIT_ON value turns * autocommit on for this connection handle. *

*

* Passing the DB2_AUTOCOMMIT_OFF value turns * autocommit off for this connection handle. *

* @return resource|false A connection handle resource if the connection attempt is * successful. db2_pconnect tries to reuse an existing * connection resource that exactly matches the * database, username, and * password parameters. If the connection attempt fails, * db2_pconnect returns false. */ function db2_pconnect(#[\SensitiveParameter] string $database, ?string $username, #[\SensitiveParameter] ?string $password, array $options = []) {} /** * Closes a persistent database connection * * This function closes a persistent DB2 client connection. * * @link https://php.net/manual/en/function.db2-pclose.php * * @param resource $connection Specifies a persistent DB2 client connection. * * @return bool Returns true on success or false on failure. */ function db2_pclose($connection): bool {} /** * Returns or sets the AUTOCOMMIT state for a database connection * @link https://php.net/manual/en/function.db2-autocommit.php * @param resource $connection

* A valid database connection resource variable as returned from * db2_connect or db2_pconnect. *

* @param int $value

* One of the following constants:

*

* DB2_AUTOCOMMIT_OFF * Turns AUTOCOMMIT off. *

*

* DB2_AUTOCOMMIT_ON * Turns AUTOCOMMIT on. *

* @return int|bool

When db2_autocommit receives only the * connection parameter, it returns the current state * of AUTOCOMMIT for the requested connection as an integer value. A value of * 0 indicates that AUTOCOMMIT is off, while a value of 1 indicates that * AUTOCOMMIT is on. *

*

* When db2_autocommit receives both the * connection parameter and * autocommit parameter, it attempts to set the * AUTOCOMMIT state of the requested connection to the corresponding state. * true on success or false on failure.

*/ function db2_autocommit($connection, int $value = null): int|bool {} /** * Binds a PHP variable to an SQL statement parameter * @link https://php.net/manual/en/function.db2-bind-param.php * @param resource $stmt

* A prepared statement returned from db2_prepare. *

* @param int $parameter_number * @param string $variable_name * @param int $parameter_type * @param int $data_type * @param int $precision

* Specifies the precision with which the variable should be bound to the * database. This parameter can also be used for retrieving XML output values * from stored procedures. A non-negative value specifies the maximum size of * the XML data that will be retrieved from the database. If this parameter * is not used, a default of 1MB will be assumed for retrieving the XML * output value from the stored procedure. *

* @param int $scale

* Specifies the scale with which the variable should be bound to the * database. *

* @return bool true on success or false on failure. */ function db2_bind_param($stmt, int $parameter_number, string $variable_name, int $parameter_type = DB2_PARAM_IN, int $data_type = 0, int $precision = -1, int $scale = 0): bool {} /** * Closes a database connection * @link https://php.net/manual/en/function.db2-close.php * @param resource $connection

* Specifies an active DB2 client connection. *

* @return bool true on success or false on failure. */ function db2_close($connection): bool {} /** * Returns a result set listing the columns and associated privileges for a table * @link https://php.net/manual/en/function.db2-column-privileges.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string|null $schema

* The schema which contains the tables. To match all schemas, pass null * or an empty string. *

* @param string|null $table_name * @param string|null $column_name * @return resource|false a statement resource with a result set containing rows describing * the column privileges for columns matching the specified parameters. The * rows are composed of the following columns: * * Column name * Description * * * TABLE_CAT * Name of the catalog. The value is NULL if this table does not * have catalogs. * * * TABLE_SCHEM * Name of the schema. * * * TABLE_NAME * Name of the table or view. * * * COLUMN_NAME * Name of the column. * * * GRANTOR * Authorization ID of the user who granted the privilege. * * * GRANTEE * Authorization ID of the user to whom the privilege was * granted. * * * PRIVILEGE * The privilege for the column. * * * IS_GRANTABLE * Whether the GRANTEE is permitted to grant this privilege to * other users. * */ function db2_column_privileges($connection, ?string $qualifier = null, ?string $schema = null, ?string $table_name = null, ?string $column_name = null) {} function db2_columnprivileges() {} /** * Returns a result set listing the columns and associated metadata for a table * @link https://php.net/manual/en/function.db2-columns.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string $schema

* The schema which contains the tables. To match all schemas, pass * '%'. *

* @param string $table_name * @param string $column_name * @return resource|false A statement resource with a result set containing rows describing * the columns matching the specified parameters. The rows are composed of * the following columns: * * Column name * Description * * * TABLE_CAT * Name of the catalog. The value is NULL if this table does not * have catalogs. * * * TABLE_SCHEM * Name of the schema. * * * TABLE_NAME * Name of the table or view. * * * COLUMN_NAME * Name of the column. * * * DATA_TYPE * The SQL data type for the column represented as an integer value. * * * TYPE_NAME * A string representing the data type for the column. * * * COLUMN_SIZE * An integer value representing the size of the column. * * * BUFFER_LENGTH * * Maximum number of bytes necessary to store data from this column. * * * * DECIMAL_DIGITS * * The scale of the column, or null where scale is not applicable. * * * * NUM_PREC_RADIX * * An integer value of either 10 (representing * an exact numeric data type), 2 (representing an * approximate numeric data type), or null (representing a data type for * which radix is not applicable). * * * * NULLABLE * An integer value representing whether the column is nullable or * not. * * * REMARKS * Description of the column. * * * COLUMN_DEF * Default value for the column. * * * SQL_DATA_TYPE * An integer value representing the size of the column. * * * SQL_DATETIME_SUB * * Returns an integer value representing a datetime subtype code, * or null for SQL data types to which this does not apply. * * * * CHAR_OCTET_LENGTH * * Maximum length in octets for a character data type column, which * matches COLUMN_SIZE for single-byte character set data, or null for * non-character data types. * * * * ORDINAL_POSITION * The 1-indexed position of the column in the table. * * * IS_NULLABLE * * A string value where 'YES' means that the column is nullable and * 'NO' means that the column is not nullable. * * */ function db2_columns($connection, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} /** * Returns a result set listing the foreign keys for a table * @link https://php.net/manual/en/function.db2-foreign-keys.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string|null $schema

* The schema which contains the tables. If schema * is null, db2_foreign_keys matches the schema for * the current connection. *

* @param string $table_name * @return resource|false A statement resource with a result set containing rows describing * the foreign keys for the specified table. The result set is composed of the * following columns: * * Column name * Description * * * PKTABLE_CAT * * Name of the catalog for the table containing the primary key. The * value is NULL if this table does not have catalogs. * * * * PKTABLE_SCHEM * * Name of the schema for the table containing the primary key. * * * * PKTABLE_NAME * Name of the table containing the primary key. * * * PKCOLUMN_NAME * Name of the column containing the primary key. * * * FKTABLE_CAT * * Name of the catalog for the table containing the foreign key. The * value is NULL if this table does not have catalogs. * * * * FKTABLE_SCHEM * * Name of the schema for the table containing the foreign key. * * * * FKTABLE_NAME * Name of the table containing the foreign key. * * * FKCOLUMN_NAME * Name of the column containing the foreign key. * * * KEY_SEQ * 1-indexed position of the column in the key. * * * UPDATE_RULE * * Integer value representing the action applied to the foreign key * when the SQL operation is UPDATE. * * * * DELETE_RULE * * Integer value representing the action applied to the foreign key * when the SQL operation is DELETE. * * * * FK_NAME * The name of the foreign key. * * * PK_NAME * The name of the primary key. * * * DEFERRABILITY * * An integer value representing whether the foreign key deferrability is * SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, or * SQL_NOT_DEFERRABLE. * * */ function db2_foreign_keys($connection, ?string $qualifier, ?string $schema, string $table_name) {} function db2_foreignkeys() {} /** * Returns a result set listing primary keys for a table * @link https://php.net/manual/en/function.db2-primary-keys.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string|null $schema

* The schema which contains the tables. If schema * is null, db2_primary_keys matches the schema for * the current connection. *

* @param string $table_name * @return resource|false A statement resource with a result set containing rows describing * the primary keys for the specified table. The result set is composed of the * following columns: * * Column name * Description * * * TABLE_CAT * * Name of the catalog for the table containing the primary key. The * value is NULL if this table does not have catalogs. * * * * TABLE_SCHEM * * Name of the schema for the table containing the primary key. * * * * TABLE_NAME * Name of the table containing the primary key. * * * COLUMN_NAME * Name of the column containing the primary key. * * * KEY_SEQ * 1-indexed position of the column in the key. * * * PK_NAME * The name of the primary key. * */ function db2_primary_keys($connection, ?string $qualifier, ?string $schema, string $table_name) {} function db2_primarykeys() {} /** * Returns a result set listing stored procedure parameters * @link https://php.net/manual/en/function.db2-procedure-columns.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string $schema

* The schema which contains the procedures. This parameter accepts a * search pattern containing _ and % * as wildcards. *

* @param string $procedure

* The name of the procedure. This parameter accepts a * search pattern containing _ and % * as wildcards. *

* @param string|null $parameter

* The name of the parameter. This parameter accepts a search pattern * containing _ and % as wildcards. * If this parameter is null, all parameters for the specified stored * procedures are returned. *

* @return resource|false A statement resource with a result set containing rows describing * the parameters for the stored procedures matching the specified parameters. * The rows are composed of the following columns: * * Column name * Description * * * PROCEDURE_CAT * The catalog that contains the procedure. The value is null if * this table does not have catalogs. * * * PROCEDURE_SCHEM * Name of the schema that contains the stored procedure. * * * PROCEDURE_NAME * Name of the procedure. * * * COLUMN_NAME * Name of the parameter. * * * COLUMN_TYPE * *

* An integer value representing the type of the parameter: * * Return value * Parameter type * * * 1 (SQL_PARAM_INPUT) * Input (IN) parameter. * * * 2 (SQL_PARAM_INPUT_OUTPUT) * Input/output (INOUT) parameter. * * * 3 (SQL_PARAM_OUTPUT) * Output (OUT) parameter. * *

* * * * DATA_TYPE * The SQL data type for the parameter represented as an integer * value. * * * TYPE_NAME * A string representing the data type for the parameter. * * * COLUMN_SIZE * An integer value representing the size of the parameter. * * * BUFFER_LENGTH * * Maximum number of bytes necessary to store data for this parameter. * * * * DECIMAL_DIGITS * * The scale of the parameter, or null where scale is not applicable. * * * * NUM_PREC_RADIX * * An integer value of either 10 (representing * an exact numeric data type), 2 (representing an * approximate numeric data type), or null (representing a data type for * which radix is not applicable). * * * * NULLABLE * An integer value representing whether the parameter is nullable * or not. * * * REMARKS * Description of the parameter. * * * COLUMN_DEF * Default value for the parameter. * * * SQL_DATA_TYPE * An integer value representing the size of the parameter. * * * SQL_DATETIME_SUB * * Returns an integer value representing a datetime subtype code, * or null for SQL data types to which this does not apply. * * * * CHAR_OCTET_LENGTH * * Maximum length in octets for a character data type parameter, which * matches COLUMN_SIZE for single-byte character set data, or null for * non-character data types. * * * * ORDINAL_POSITION * The 1-indexed position of the parameter in the CALL * statement. * * * IS_NULLABLE * * A string value where 'YES' means that the parameter accepts or * returns null values and 'NO' means that the parameter does not * accept or return null values. * * */ function db2_procedure_columns($connection, ?string $qualifier, string $schema, string $procedure, ?string $parameter) {} function db2_procedurecolumns() {} /** * Returns a result set listing the stored procedures registered in a database * @link https://php.net/manual/en/function.db2-procedures.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string $schema

* The schema which contains the procedures. This parameter accepts a * search pattern containing _ and % * as wildcards. *

* @param string $procedure

* The name of the procedure. This parameter accepts a * search pattern containing _ and % * as wildcards. *

* @return resource|false A statement resource with a result set containing rows describing * the stored procedures matching the specified parameters. The rows are * composed of the following columns: * * Column name * Description * * * PROCEDURE_CAT * The catalog that contains the procedure. The value is null if * this table does not have catalogs. * * * PROCEDURE_SCHEM * Name of the schema that contains the stored procedure. * * * PROCEDURE_NAME * Name of the procedure. * * * NUM_INPUT_PARAMS * Number of input (IN) parameters for the stored procedure. * * * NUM_OUTPUT_PARAMS * Number of output (OUT) parameters for the stored procedure. * * * NUM_RESULT_SETS * Number of result sets returned by the stored procedure. * * * REMARKS * Any comments about the stored procedure. * * * PROCEDURE_TYPE * Always returns 1, indicating that the stored * procedure does not return a return value. * */ function db2_procedures($connection, ?string $qualifier, string $schema, string $procedure) {} /** * Returns a result set listing the unique row identifier columns for a table * @link https://php.net/manual/en/function.db2-special-columns.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string $schema

* The schema which contains the tables. *

* @param string $table_name

* The name of the table. *

* @param int $scope

* Integer value representing the minimum duration for which the * unique row identifier is valid. This can be one of the following * values: * * Integer value * SQL constant * Description * * * 0 * SQL_SCOPE_CURROW * Row identifier is valid only while the cursor is positioned * on the row. * * * 1 * SQL_SCOPE_TRANSACTION * Row identifier is valid for the duration of the * transaction. * * * 2 * SQL_SCOPE_SESSION * Row identifier is valid for the duration of the * connection. * *

* @return resource|false A statement resource with a result set containing rows with unique * row identifier information for a table. The rows are composed of the * following columns: * * Column name * Description * * * SCOPE * *

* * Integer value * SQL constant * Description * * * 0 * SQL_SCOPE_CURROW * Row identifier is valid only while the cursor is positioned * on the row. * * * 1 * SQL_SCOPE_TRANSACTION * Row identifier is valid for the duration of the * transaction. * * * 2 * SQL_SCOPE_SESSION * Row identifier is valid for the duration of the * connection. * *

* * * * COLUMN_NAME * Name of the unique column. * * * DATA_TYPE * SQL data type for the column. * * * TYPE_NAME * Character string representation of the SQL data type for the * column. * * * COLUMN_SIZE * An integer value representing the size of the column. * * * BUFFER_LENGTH * * Maximum number of bytes necessary to store data from this column. * * * * DECIMAL_DIGITS * * The scale of the column, or null where scale is not applicable. * * * * NUM_PREC_RADIX * * An integer value of either 10 (representing * an exact numeric data type), 2 (representing an * approximate numeric data type), or null (representing a data type for * which radix is not applicable). * * * * PSEUDO_COLUMN * Always returns 1. * */ function db2_special_columns($connection, ?string $qualifier, string $schema, string $table_name, int $scope) {} function db2_specialcolumns() {} /** * Returns a result set listing the index and statistics for a table * @link https://php.net/manual/en/function.db2-statistics.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string|null $schema

* The schema that contains the targeted table. If this parameter is * null, the statistics and indexes are returned for the schema of the * current user. *

* @param string $table_name

* The name of the table. *

* @param bool $unique

* Whether to return the only the unique indexes or all the indexes in the table. *

*

* Return only the information for unique indexes on the table. *

* @return resource|false A statement resource with a result set containing rows describing * the statistics and indexes for the base tables matching the specified * parameters. The rows are composed of the following columns: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Column nameDescription
TABLE_CATThe catalog that contains the table. The value is null if * this table does not have catalogs.
TABLE_SCHEMName of the schema that contains the table.
TABLE_NAMEName of the table.
NON_UNIQUE * *

* An boolean value representing whether the index prohibits unique * values, or whether the row represents statistics on the table itself:

* * * * * * * * * * * * * * * * *
Return valueParameter type
false (SQL_FALSE)The index allows duplicate values.
true (SQL_TRUE)The index values must be unique.
nullThis row is statistics information for the table itself.
*
INDEX_QUALIFIERA string value representing the qualifier that would have to be * prepended to INDEX_NAME to fully qualify the index.
INDEX_NAMEA string representing the name of the index.
TYPE *

* An integer value representing the type of information contained in * this row of the result set:

* * * * * * * * * * * * * * * * * * * * * *
Return valueParameter type
0 (SQL_TABLE_STAT)The row contains statistics about the table itself.
1 (SQL_INDEX_CLUSTERED)The row contains information about a clustered index.
2 (SQL_INDEX_HASH)The row contains information about a hashed index.
3 (SQL_INDEX_OTHER)The row contains information about a type of index that * is neither clustered nor hashed.
*
ORDINAL_POSITIONThe 1-indexed position of the column in the index. null if * the row contains statistics information about the table itself.
COLUMN_NAMEThe name of the column in the index. null if the row * contains statistics information about the table itself.
ASC_OR_DESC * A if the column is sorted in ascending order, * D if the column is sorted in descending order, * null if the row contains statistics information about the table * itself. *
CARDINALITY *

* If the row contains information about an index, this column contains * an integer value representing the number of unique values in the * index. *

*

* If the row contains information about the table itself, this column * contains an integer value representing the number of rows in the * table. *

*
PAGES *

* If the row contains information about an index, this column contains * an integer value representing the number of pages used to store the * index. *

*

* If the row contains information about the table itself, this column * contains an integer value representing the number of pages used to * store the table. *

*
FILTER_CONDITIONAlways returns null.
*/ function db2_statistics($connection, ?string $qualifier, ?string $schema, string $table_name, bool $unique) {} /** * Returns a result set listing the tables and associated privileges in a database * @link https://php.net/manual/en/function.db2-table-privileges.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string|null $schema

* The schema which contains the tables. This parameter accepts a * search pattern containing _ and % * as wildcards. *

* @param string|null $table_name

* The name of the table. This parameter accepts a search pattern * containing _ and % as wildcards. *

* @return resource|false A statement resource with a result set containing rows describing * the privileges for the tables that match the specified parameters. The rows * are composed of the following columns: * * Column name * Description * * * TABLE_CAT * The catalog that contains the table. The value is null if * this table does not have catalogs. * * * TABLE_SCHEM * Name of the schema that contains the table. * * * TABLE_NAME * Name of the table. * * * GRANTOR * Authorization ID of the user who granted the privilege. * * * GRANTEE * Authorization ID of the user to whom the privilege was * granted. * * * PRIVILEGE * * The privilege that has been granted. This can be one of ALTER, * CONTROL, DELETE, INDEX, INSERT, REFERENCES, SELECT, or UPDATE. * * * * IS_GRANTABLE * * A string value of "YES" or "NO" indicating whether the grantee * can grant the privilege to other users. * * */ function db2_table_privileges($connection, ?string $qualifier = null, ?string $schema = null, ?string $table_name = null) {} function db2_tableprivileges() {} /** * Returns a result set listing the tables and associated metadata in a database * @link https://php.net/manual/en/function.db2-tables.php * @param resource $connection

* A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. *

* @param string|null $qualifier

* A qualifier for DB2 databases running on OS/390 or z/OS servers. For * other databases, pass null or an empty string. *

* @param string|null $schema

* The schema which contains the tables. This parameter accepts a * search pattern containing _ and % * as wildcards. *

* @param string|null $table_name * @param string|null $table_type * @return resource|false A statement resource with a result set containing rows describing * the tables that match the specified parameters. The rows are composed of * the following columns: * * Column name * Description * * * TABLE_CAT * The catalog that contains the table. The value is null if * this table does not have catalogs. * * * TABLE_SCHEM * Name of the schema that contains the table. * * * TABLE_NAME * Name of the table. * * * TABLE_TYPE * Table type identifier for the table. * * * REMARKS * Description of the table. * */ function db2_tables($connection, ?string $qualifier = null, ?string $schema = null, ?string $table_name = null, ?string $table_type = null) {} /** * Executes an SQL statement directly * @link https://php.net/manual/en/function.db2-exec.php * @param resource $connection

* A valid database connection resource variable as returned from * db2_connect or db2_pconnect. *

* @param string $statement

* An SQL statement. The statement cannot contain any parameter markers. *

* @param array $options

* An associative array containing statement options. You can use this * parameter to request a scrollable cursor on database servers that * support this functionality. * cursor *

*

* Passing the DB2_FORWARD_ONLY value requests a * forward-only cursor for this SQL statement. This is the default * type of cursor, and it is supported by all database servers. It is * also much faster than a scrollable cursor. *

*

* Passing the DB2_SCROLLABLE value requests a * scrollable cursor for this SQL statement. This type of cursor * enables you to fetch rows non-sequentially from the database * server. However, it is only supported by DB2 servers, and is much * slower than forward-only cursors. *

* @return resource|false A statement resource if the SQL statement was issued successfully, * or false if the database failed to execute the SQL statement. */ function db2_exec($connection, string $statement, array $options = []) {} /** * Prepares an SQL statement to be executed * @link https://php.net/manual/en/function.db2-prepare.php * @param resource $connection

* A valid database connection resource variable as returned from * db2_connect or db2_pconnect. *

* @param string $statement

* An SQL statement, optionally containing one or more parameter markers.. *

* @param array $options

* An associative array containing statement options. You can use this * parameter to request a scrollable cursor on database servers that * support this functionality. * cursor *

*

* Passing the DB2_FORWARD_ONLY value requests a * forward-only cursor for this SQL statement. This is the default * type of cursor, and it is supported by all database servers. It is * also much faster than a scrollable cursor. *

*

* Passing the DB2_SCROLLABLE value requests a * scrollable cursor for this SQL statement. This type of cursor * enables you to fetch rows non-sequentially from the database * server. However, it is only supported by DB2 servers, and is much * slower than forward-only cursors. *

* @return resource|false A statement resource if the SQL statement was successfully parsed and * prepared by the database server. Returns false if the database server * returned an error. You can determine which error was returned by calling * db2_stmt_error or db2_stmt_errormsg. */ function db2_prepare($connection, string $statement, array $options = []) {} /** * Executes a prepared SQL statement * @link https://php.net/manual/en/function.db2-execute.php * @param resource $stmt

* A prepared statement returned from db2_prepare. *

* @param array $parameters

* An array of input parameters matching any parameter markers contained * in the prepared statement. *

* @return bool true on success or false on failure. */ function db2_execute($stmt, array $parameters = []): bool {} /** * Returns a string containing the last SQL statement error message * @link https://php.net/manual/en/function.db2-stmt-errormsg.php * @param resource|null $stmt

* A valid statement resource or NULL. *

* @return string a string containing the error message and SQLCODE value for the * last error that occurred issuing an SQL statement. */ function db2_stmt_errormsg($stmt = null) {} /** * Returns the last connection error message and SQLCODE value * @link https://php.net/manual/en/function.db2-conn-errormsg.php * @param resource|null $connection

* A connection resource associated with a connection that initially * succeeded, but which over time became invalid. *

* @return string a string containing the error message and SQLCODE value resulting * from a failed connection attempt. If there is no error associated with the last * connection attempt, db2_conn_errormsg returns an empty * string. */ function db2_conn_errormsg($connection = null) {} /** * Returns a string containing the SQLSTATE returned by the last connection attempt * @link https://php.net/manual/en/function.db2-conn-error.php * @param resource|null $connection

* A connection resource associated with a connection that initially * succeeded, but which over time became invalid. *

* @return string the SQLSTATE value resulting from a failed connection attempt. * Returns an empty string if there is no error associated with the last * connection attempt. */ function db2_conn_error($connection = null) {} /** * Returns a string containing the SQLSTATE returned by an SQL statement * @link https://php.net/manual/en/function.db2-stmt-error.php * @param resource|null $stmt

* A valid statement resource or NULL. *

* @return string a string containing an SQLSTATE value. */ function db2_stmt_error($stmt = null) {} /** * Requests the next result set from a stored procedure * @link https://php.net/manual/en/function.db2-next-result.php * @param resource $stmt

* A prepared statement returned from db2_exec or * db2_execute. *

* @return resource|false A new statement resource containing the next result set if the * stored procedure returned another result set. Returns false if the stored * procedure did not return another result set. */ function db2_next_result($stmt) {} /** * Returns the number of fields contained in a result set * @link https://php.net/manual/en/function.db2-num-fields.php * @param resource $stmt

* A valid statement resource containing a result set. *

* @return int|false An integer value representing the number of fields in the result * set associated with the specified statement resource. Returns false if * the statement resource is not a valid input value. */ function db2_num_fields($stmt): int|false {} /** * Returns the number of rows affected by an SQL statement * @link https://php.net/manual/en/function.db2-num-rows.php * @param resource $stmt

* A valid stmt resource containing a result set. *

* @return int|false the number of rows affected by the last SQL statement issued by * the specified statement handle, or false in case of failure. */ function db2_num_rows($stmt): int|false {} /** * Returns the name of the column in the result set * @link https://php.net/manual/en/function.db2-field-name.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return string|false A string containing the name of the specified column. If the * specified column does not exist in the result * set, db2_field_name returns false. */ function db2_field_name($stmt, int|string $column): string|false {} /** * Returns the maximum number of bytes required to display a column * @link https://php.net/manual/en/function.db2-field-display-size.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return int|false An integer value with the maximum number of bytes required to * display the specified column. If the column does not exist in the result * set, db2_field_display_size returns false. */ function db2_field_display_size($stmt, int|string $column): int|false {} /** * Returns the position of the named column in a result set * @link https://php.net/manual/en/function.db2-field-num.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return int|false An integer containing the 0-indexed position of the named column in * the result set. If the specified column does not exist in the result set, * db2_field_num returns false. */ function db2_field_num($stmt, int|string $column): int|false {} /** * Returns the precision of the indicated column in a result set * @link https://php.net/manual/en/function.db2-field-precision.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return int|false An integer containing the precision of the specified column. If the * specified column does not exist in the result set, * db2_field_precision returns false. */ function db2_field_precision($stmt, int|string $column): int|false {} /** * Returns the scale of the indicated column in a result set * @link https://php.net/manual/en/function.db2-field-scale.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return int|false An integer containing the scale of the specified column. If the * specified column does not exist in the result set, * db2_field_scale returns false. */ function db2_field_scale($stmt, int|string $column): int|false {} /** * Returns the data type of the indicated column in a result set * @link https://php.net/manual/en/function.db2-field-type.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return string|false A string containing the defined data type of the specified column. * If the specified column does not exist in the result set, * db2_field_type returns false. */ function db2_field_type($stmt, int|string $column): string|false {} /** * Returns the width of the current value of the indicated column in a result set * @link https://php.net/manual/en/function.db2-field-width.php * @param resource $stmt

* Specifies a statement resource containing a result set. *

* @param int|string $column

* Specifies the column in the result set. This can either be an integer * representing the 0-indexed position of the column, or a string * containing the name of the column. *

* @return int|false An integer containing the width of the specified character or * binary data type column in a result set. If the specified column does not * exist in the result set, db2_field_width returns * false. */ function db2_field_width($stmt, int|string $column): int|false {} /** * Returns the cursor type used by a statement resource * @link https://php.net/manual/en/function.db2-cursor-type.php * @param resource $stmt

* A valid statement resource. *

* @return int either DB2_FORWARD_ONLY if the statement * resource uses a forward-only cursor or DB2_SCROLLABLE if * the statement resource uses a scrollable cursor. */ function db2_cursor_type($stmt): int {} /** * Rolls back a transaction * @link https://php.net/manual/en/function.db2-rollback.php * @param resource $connection

* A valid database connection resource variable as returned from * db2_connect or db2_pconnect. *

* @return bool true on success or false on failure. */ function db2_rollback($connection): bool {} /** * Frees resources associated with the indicated statement resource * @link https://php.net/manual/en/function.db2-free-stmt.php * @param resource $stmt

* A valid statement resource. *

* @return bool true on success or false on failure. */ function db2_free_stmt($stmt): bool {} /** * Returns a single column from a row in the result set * @link https://php.net/manual/en/function.db2-result.php * @param resource $stmt

* A valid stmt resource. *

* @param int|string $column

* Either an integer mapping to the 0-indexed field in the result set, or * a string matching the name of the column. *

* @return mixed the value of the requested field if the field exists in the result * set. Returns NULL if the field does not exist, and issues a warning. */ function db2_result($stmt, int|string $column): mixed {} /** * Sets the result set pointer to the next row or requested row * @link https://php.net/manual/en/function.db2-fetch-row.php * @param resource $stmt

* A valid stmt resource. *

* @param int $row_number

* With scrollable cursors, you can request a specific row number in the * result set. Row numbering is 1-indexed. *

* @return bool true if the requested row exists in the result set. Returns * false if the requested row does not exist in the result set. */ function db2_fetch_row($stmt, int $row_number = null) {} /** * Returns an array, indexed by column name, representing a row in a result set * @link https://php.net/manual/en/function.db2-fetch-assoc.php * @param resource $stmt

* A valid stmt resource containing a result set. *

* @param int $row_number

* Requests a specific 1-indexed row from the result set. Passing this * parameter results in a PHP warning if the result set uses a * forward-only cursor. *

* @return array|false An associative array with column values indexed by the column name * representing the next or requested row in the result set. Returns false if * there are no rows left in the result set, or if the row requested by * row_number does not exist in the result set. */ function db2_fetch_assoc($stmt, int $row_number = null): array|false {} /** * Returns an array, indexed by column position, representing a row in a result set * @link https://php.net/manual/en/function.db2-fetch-array.php * @param resource $stmt

* A valid stmt resource containing a result set. *

* @param int $row_number

* Requests a specific 1-indexed row from the result set. Passing this * parameter results in a PHP warning if the result set uses a * forward-only cursor. *

* @return array|false A 0-indexed array with column values indexed by the column position * representing the next or requested row in the result set. Returns false if * there are no rows left in the result set, or if the row requested by * row_number does not exist in the result set. */ function db2_fetch_array($stmt, int $row_number = null): array|false {} /** * Returns an array, indexed by both column name and position, representing a row in a result set * @link https://php.net/manual/en/function.db2-fetch-both.php * @param resource $stmt

* A valid stmt resource containing a result set. *

* @param int $row_number

* Requests a specific 1-indexed row from the result set. Passing this * parameter results in a PHP warning if the result set uses a * forward-only cursor. *

* @return array|false An associative array with column values indexed by both the column * name and 0-indexed column number. The array represents the next or * requested row in the result set. Returns false if there are no rows left * in the result set, or if the row requested by * row_number does not exist in the result set. */ function db2_fetch_both($stmt, int $row_number = null): array|false {} /** * Frees resources associated with a result set * @link https://php.net/manual/en/function.db2-free-result.php * @param resource $stmt

* A valid statement resource. *

* @return bool true on success or false on failure. */ function db2_free_result($stmt): bool {} /** * Set options for connection or statement resources * @link https://php.net/manual/en/function.db2-set-option.php * @param resource $resource

* A valid statement resource as returned from * db2_prepare or a valid connection resource as * returned from db2_connect or * db2_pconnect. *

* @param array $options

* An associative array containing valid statement or connection * options. This parameter can be used to change autocommit values, * cursor types (scrollable or forward), and to specify the case of * the column names (lower, upper, or natural) that will appear in a * result set. * autocommit *

* Passing DB2_AUTOCOMMIT_ON turns * autocommit on for the specified connection resource. *

*

* Passing DB2_AUTOCOMMIT_OFF turns * autocommit off for the specified connection resource. *

* @param int $type

* An integer value that specifies the type of resource that was * passed into the function. The type of resource and this value * must correspond. *

* Passing 1 as the value specifies that * a connection resource has been passed into the function. *

*

* Passing any integer not equal to 1 as * the value specifies that a statement resource has been * passed into the function. *

* @return bool true on success or false on failure. */ function db2_set_option($resource, array $options, int $type): bool {} function db2_setoption(): bool {} /** * Returns an object with properties representing columns in the fetched row * @link https://php.net/manual/en/function.db2-fetch-object.php * @param resource $stmt

* A valid stmt resource containing a result set. *

* @param int $row_number

* Requests a specific 1-indexed row from the result set. Passing this * parameter results in a PHP warning if the result set uses a * forward-only cursor. *

* @return stdClass|false An object representing a single row in the result set. The * properties of the object map to the names of the columns in the result set. *

*

* The IBM DB2, Cloudscape, and Apache Derby database servers typically fold * column names to upper-case, so the object properties will reflect that case. *

*

* If your SELECT statement calls a scalar function to modify the value * of a column, the database servers return the column number as the name of * the column in the result set. If you prefer a more descriptive column name * and object property, you can use the AS clause to assign a name to the * column in the result set. *

*

* Returns false if no row was retrieved. */ function db2_fetch_object($stmt, int $row_number = null): stdClass|false {} /** * Returns an object with properties that describe the DB2 database server * @link https://php.net/manual/en/function.db2-server-info.php * @param resource $connection

* Specifies an active DB2 client connection. *

* @return stdClass|false An object on a successful call. Returns false on failure. */ function db2_server_info($connection): stdClass|false {} /** * Returns an object with properties that describe the DB2 database client * @link https://php.net/manual/en/function.db2-client-info.php * @param resource $connection

* Specifies an active DB2 client connection. *

* @return stdClass|false An object on a successful call. Returns false on failure. */ function db2_client_info($connection): stdClass|false {} /** * Used to escape certain characters * @link https://php.net/manual/en/function.db2-escape-string.php * @param string $string_literal

* The string that contains special characters that need to be modified. * Characters that are prepended with a backslash are \x00, * \n, \r, \, * ', " and \x1a. *

* @return string string_literal with the special characters * noted above prepended with backslashes. */ function db2_escape_string(string $string_literal): string {} /** * Gets a user defined size of LOB files with each invocation * @link https://php.net/manual/en/function.db2-lob-read.php * @param resource $stmt

* A valid stmt resource containing LOB data. *

* @param int $colnum

* A valid column number in the result set of the stmt resource. *

* @param int $length

* The size of the LOB data to be retrieved from the stmt resource. *

* @return string|false The amount of data the user specifies. Returns * false if the data cannot be retrieved. */ function db2_lob_read($stmt, int $colnum, int $length): string|false {} /** * Retrieves an option value for a statement resource or a connection resource * @link https://php.net/manual/en/function.db2-get-option.php * @param resource $resource

* A valid statement resource as returned from * db2_prepare or a valid connection resource as * returned from db2_connect or * db2_pconnect. *

* @param string $option

* A valid statement or connection options. The following new options are available * as of ibm_db2 version 1.6.0. They provide useful tracking information * that can be set during execution with db2_get_option. *

*

* Note: Prior versions of ibm_db2 do not support these new options. *

*

* When the value in each option is being set, some servers might not handle * the entire length provided and might truncate the value. *

*

* To ensure that the data specified in each option is converted correctly * when transmitted to a host system, use only the characters A through Z, * 0 through 9, and the underscore (_) or period (.). *

*

* SQL_ATTR_INFO_USERID - A pointer to a null-terminated * character string used to identify the client user ID sent to the host * database server when using DB2 Connect. *

*

* Note: DB2 for z/OS and OS/390 servers support up to a length of 16 characters. * This user-id is not to be confused with the authentication user-id, it is for * identification purposes only and is not used for any authorization. *

* @return string|false The current setting of the connection attribute provided on success * or false on failure. */ function db2_get_option($resource, string $option): string|false {} /** * Returns the auto generated ID of the last insert query that successfully executed on this connection. * @link https://php.net/manual/en/function.db2-last-insert-id.php * The result of this function is not affected by any of the following: *
  • A single row INSERT statement with a VALUES clause for a table without an identity column. *
  • A multiple row INSERT statement with a VALUES clause. *
  • An INSERT statement with a fullselect. *
  • A ROLLBACK TO SAVEPOINT statement. *
* @param resource $resource A valid connection resource as returned from db2_connect() or db2_pconnect(). * The value of this parameter cannot be a statement resource or result set resource. * @return string|null Returns the auto generated ID of last insert query that successfully executed on this connection * or NULL if no ID was found. */ function db2_last_insert_id($resource): ?string {} /** * Specifies that binary data shall be returned as is. This is the default * mode. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_BINARY', 1); /** * Specifies that binary data shall be converted to a hexadecimal encoding * and returned as an ASCII string. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_CONVERT', 2); /** * Specifies that binary data shall be converted to a null value. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_PASSTHRU', 3); /** * Specifies a scrollable cursor for a statement resource. This mode enables * random access to rows in a result set, but currently is supported only by * IBM DB2 Universal Database. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_SCROLLABLE', 1); /** * Specifies a forward-only cursor for a statement resource. This is the * default cursor type and is supported on all database servers. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_FORWARD_ONLY', 0); /** * Specifies the PHP variable should be bound as an IN parameter for a * stored procedure. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_PARAM_IN', 1); /** * Specifies the PHP variable should be bound as an OUT parameter for a * stored procedure. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_PARAM_OUT', 4); /** * Specifies the PHP variable should be bound as an INOUT parameter for a * stored procedure. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_PARAM_INOUT', 2); /** * Specifies that the column should be bound directly to a file for input. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_PARAM_FILE', 11); /** * Specifies that autocommit should be turned on. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_AUTOCOMMIT_ON', 1); /** * Specifies that autocommit should be turned off. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_AUTOCOMMIT_OFF', 0); /** * Specifies that deferred prepare should be turned on for the specified statement resource. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_DEFERRED_PREPARE_ON', 1); /** * Specifies that deferred prepare should be turned off for the specified statement resource. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_DEFERRED_PREPARE_OFF', 0); /** * Specifies that the variable should be bound as a DOUBLE, FLOAT, or REAL * data type. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_DOUBLE', 8); /** * Specifies that the variable should be bound as a SMALLINT, INTEGER, or * BIGINT data type. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_LONG', 4); /** * Specifies that the variable should be bound as a CHAR or VARCHAR data type. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_CHAR', 1); define('DB2_XML', -370); /** * Specifies that column names will be returned in their natural case. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_CASE_NATURAL', 0); /** * Specifies that column names will be returned in lower case. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_CASE_LOWER', 1); /** * Specifies that column names will be returned in upper case. * @link https://php.net/manual/en/ibm-db2.constants.php */ define('DB2_CASE_UPPER', 2); // End of ibm_db2 v.1.6.0 TRUE if PHP is running as an Apache 1 module, the Apache version is non-multithreaded, and the child_terminate PHP directive is enabled (disabled by default). If these conditions are not met, FALSE is returned and an error of level E_WARNING is generated. */ function apache_child_terminate() {} /** * Get a list of loaded Apache modules * @link https://php.net/manual/en/function.apache-get-modules.php * @return array of loaded Apache modules. */ #[Pure] function apache_get_modules() {} /** * Fetch the Apache version * @link https://php.net/manual/en/function.apache-get-version.php * @return string|false the Apache version on success or FALSE on failure. */ #[Pure] function apache_get_version() {} /** * Get an Apache subprocess_env variable * Retrieve an Apache environment variable specified by $variable. * This function requires Apache 2 otherwise it's undefined. * @link https://php.net/manual/en/function.apache-getenv.php * @param string $variable

* The Apache environment variable. *

* @param bool $walk_to_top

* Whether to get the top-level variable available to all Apache layers. *

* @return string|false The value of the Apache environment variable on success, or FALSE on failure. */ #[Pure] function apache_getenv($variable, $walk_to_top = false) {} /** * Perform a partial request for the specified URI and return all info about it * This performs a partial request for a URI. It goes just far enough to obtain all the important information about the given resource. * This function is supported when PHP is installed as an Apache module or by the NSAPI server module in Netscape/iPlanet/SunONE webservers. * @link https://php.net/manual/en/function.apache-lookup-uri.php * @param string $filename

* The filename (URI) that's being requested. *

* @return object of related URI information. */ function apache_lookup_uri($filename) {} /** * Get and set apache request notes * This function is a wrapper for Apache's table_get and table_set. It edits the table of notes that exists during a request. The table's purpose is to allow Apache modules to communicate. * The main use for apache_note() is to pass information from one module to another within the same request. * @link https://php.net/manual/en/function.apache-note.php * @param string $note_name

* The name of the note. *

* @param string $note_value

* The value of the note. *

* @return string|false If called with one argument, it returns the current value of note note_name. If called with two arguments, it sets the value of note note_name to note_value and returns the previous value of note note_name. If the note cannot be retrieved, FALSE is returned. */ function apache_note($note_name, $note_value = '') {} /** * Reset the Apache write timer * apache_reset_timeout() resets the Apache write timer, which defaults to 300 seconds. With set_time_limit(0); ignore_user_abort(true) and periodic apache_reset_timeout() calls, Apache can theoretically run forever. * This function requires Apache 1. * @link https://php.net/manual/en/function.apache-reset-timeout.php * @return bool TRUE on success or FALSE on failure. */ function apache_reset_timeout() {} /** * Fetch all HTTP response headers * @link https://php.net/manual/en/function.apache-response-headers.php * @return array|false An array of all Apache response headers on success or FALSE on failure. */ function apache_response_headers() {} /** * Sets the value of the Apache environment variable specified by variable. * Note: When setting an Apache environment variable, the corresponding $_SERVER variable is not changed. * @link https://php.net/manual/en/function.apache-setenv.php * @param string $variable

* The environment variable that's being set. *

* @param string $value

* The new variable value. *

* @param bool $walk_to_top

* Whether to set the top-level variable available to all Apache layers. *

* @return bool TRUE on success or FALSE on failure. */ function apache_setenv($variable, $value, $walk_to_top = false) {} /** * Perform an Apache sub-request * virtual() is an Apache-specific function which is similar to in mod_include. It performs an Apache sub-request. It is useful for including CGI scripts or .shtml files, or anything else that you would parse through Apache. Note that for a CGI script, the script must generate valid CGI headers. At the minimum that means it must generate a Content-Type header. * To run the sub-request, all buffers are terminated and flushed to the browser, pending headers are sent too. * This function is supported when PHP is installed as an Apache module or by the NSAPI server module in Netscape/iPlanet/SunONE webservers. * @link https://secure.php.net/manual/en/function.virtual.php * @param string $filename

* The file that the virtual command will be performed on. *

* @return bool Performs the virtual command on success, or returns FALSE on failure. */ function virtual($filename) {} IntlChar provides access to a number of utility methods that can be used to access information about Unicode characters.

*

The methods and constants adhere closely to the names and behavior used by the underlying ICU library.

* @since 7.0 */ class IntlChar { public const UNICODE_VERSION = 13.0; public const CODEPOINT_MIN = 0; public const CODEPOINT_MAX = 1114111; public const FOLD_CASE_DEFAULT = 0; public const FOLD_CASE_EXCLUDE_SPECIAL_I = 1; public const PROPERTY_ALPHABETIC = 0; public const PROPERTY_BINARY_START = 0; public const PROPERTY_ASCII_HEX_DIGIT = 1; public const PROPERTY_BIDI_CONTROL = 2; public const PROPERTY_BIDI_MIRRORED = 3; public const PROPERTY_DASH = 4; public const PROPERTY_DEFAULT_IGNORABLE_CODE_POINT = 5; public const PROPERTY_DEPRECATED = 6; public const PROPERTY_DIACRITIC = 7; public const PROPERTY_EXTENDER = 8; public const PROPERTY_FULL_COMPOSITION_EXCLUSION = 9; public const PROPERTY_GRAPHEME_BASE = 10; public const PROPERTY_GRAPHEME_EXTEND = 11; public const PROPERTY_GRAPHEME_LINK = 12; public const PROPERTY_HEX_DIGIT = 13; public const PROPERTY_HYPHEN = 14; public const PROPERTY_ID_CONTINUE = 15; public const PROPERTY_ID_START = 16; public const PROPERTY_IDEOGRAPHIC = 17; public const PROPERTY_IDS_BINARY_OPERATOR = 18; public const PROPERTY_IDS_TRINARY_OPERATOR = 19; public const PROPERTY_JOIN_CONTROL = 20; public const PROPERTY_LOGICAL_ORDER_EXCEPTION = 21; public const PROPERTY_LOWERCASE = 22; public const PROPERTY_MATH = 23; public const PROPERTY_NONCHARACTER_CODE_POINT = 24; public const PROPERTY_QUOTATION_MARK = 25; public const PROPERTY_RADICAL = 26; public const PROPERTY_SOFT_DOTTED = 27; public const PROPERTY_TERMINAL_PUNCTUATION = 28; public const PROPERTY_UNIFIED_IDEOGRAPH = 29; public const PROPERTY_UPPERCASE = 30; public const PROPERTY_WHITE_SPACE = 31; public const PROPERTY_XID_CONTINUE = 32; public const PROPERTY_XID_START = 33; public const PROPERTY_CASE_SENSITIVE = 34; public const PROPERTY_S_TERM = 35; public const PROPERTY_VARIATION_SELECTOR = 36; public const PROPERTY_NFD_INERT = 37; public const PROPERTY_NFKD_INERT = 38; public const PROPERTY_NFC_INERT = 39; public const PROPERTY_NFKC_INERT = 40; public const PROPERTY_SEGMENT_STARTER = 41; public const PROPERTY_PATTERN_SYNTAX = 42; public const PROPERTY_PATTERN_WHITE_SPACE = 43; public const PROPERTY_POSIX_ALNUM = 44; public const PROPERTY_POSIX_BLANK = 45; public const PROPERTY_POSIX_GRAPH = 46; public const PROPERTY_POSIX_PRINT = 47; public const PROPERTY_POSIX_XDIGIT = 48; public const PROPERTY_CASED = 49; public const PROPERTY_CASE_IGNORABLE = 50; public const PROPERTY_CHANGES_WHEN_LOWERCASED = 51; public const PROPERTY_CHANGES_WHEN_UPPERCASED = 52; public const PROPERTY_CHANGES_WHEN_TITLECASED = 53; public const PROPERTY_CHANGES_WHEN_CASEFOLDED = 54; public const PROPERTY_CHANGES_WHEN_CASEMAPPED = 55; public const PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED = 56; public const PROPERTY_BINARY_LIMIT = 65; public const PROPERTY_BIDI_CLASS = 4096; public const PROPERTY_INT_START = 4096; public const PROPERTY_BLOCK = 4097; public const PROPERTY_CANONICAL_COMBINING_CLASS = 4098; public const PROPERTY_DECOMPOSITION_TYPE = 4099; public const PROPERTY_EAST_ASIAN_WIDTH = 4100; public const PROPERTY_GENERAL_CATEGORY = 4101; public const PROPERTY_JOINING_GROUP = 4102; public const PROPERTY_JOINING_TYPE = 4103; public const PROPERTY_LINE_BREAK = 4104; public const PROPERTY_NUMERIC_TYPE = 4105; public const PROPERTY_SCRIPT = 4106; public const PROPERTY_HANGUL_SYLLABLE_TYPE = 4107; public const PROPERTY_NFD_QUICK_CHECK = 4108; public const PROPERTY_NFKD_QUICK_CHECK = 4109; public const PROPERTY_NFC_QUICK_CHECK = 4110; public const PROPERTY_NFKC_QUICK_CHECK = 4111; public const PROPERTY_LEAD_CANONICAL_COMBINING_CLASS = 4112; public const PROPERTY_TRAIL_CANONICAL_COMBINING_CLASS = 4113; public const PROPERTY_GRAPHEME_CLUSTER_BREAK = 4114; public const PROPERTY_SENTENCE_BREAK = 4115; public const PROPERTY_WORD_BREAK = 4116; public const PROPERTY_BIDI_PAIRED_BRACKET_TYPE = 4117; public const PROPERTY_INT_LIMIT = 4121; public const PROPERTY_GENERAL_CATEGORY_MASK = 8192; public const PROPERTY_MASK_START = 8192; public const PROPERTY_MASK_LIMIT = 8193; public const PROPERTY_NUMERIC_VALUE = 12288; public const PROPERTY_DOUBLE_START = 12288; public const PROPERTY_DOUBLE_LIMIT = 12289; public const PROPERTY_AGE = 16384; public const PROPERTY_STRING_START = 16384; public const PROPERTY_BIDI_MIRRORING_GLYPH = 16385; public const PROPERTY_CASE_FOLDING = 16386; public const PROPERTY_ISO_COMMENT = 16387; public const PROPERTY_LOWERCASE_MAPPING = 16388; public const PROPERTY_NAME = 16389; public const PROPERTY_SIMPLE_CASE_FOLDING = 16390; public const PROPERTY_SIMPLE_LOWERCASE_MAPPING = 16391; public const PROPERTY_SIMPLE_TITLECASE_MAPPING = 16392; public const PROPERTY_SIMPLE_UPPERCASE_MAPPING = 16393; public const PROPERTY_TITLECASE_MAPPING = 16394; public const PROPERTY_UNICODE_1_NAME = 16395; public const PROPERTY_UPPERCASE_MAPPING = 16396; public const PROPERTY_BIDI_PAIRED_BRACKET = 16397; public const PROPERTY_STRING_LIMIT = 16398; public const PROPERTY_SCRIPT_EXTENSIONS = 28672; public const PROPERTY_OTHER_PROPERTY_START = 28672; public const PROPERTY_OTHER_PROPERTY_LIMIT = 28673; public const PROPERTY_INVALID_CODE = -1; public const CHAR_CATEGORY_UNASSIGNED = 0; public const CHAR_CATEGORY_GENERAL_OTHER_TYPES = 0; public const CHAR_CATEGORY_UPPERCASE_LETTER = 1; public const CHAR_CATEGORY_LOWERCASE_LETTER = 2; public const CHAR_CATEGORY_TITLECASE_LETTER = 3; public const CHAR_CATEGORY_MODIFIER_LETTER = 4; public const CHAR_CATEGORY_OTHER_LETTER = 5; public const CHAR_CATEGORY_NON_SPACING_MARK = 6; public const CHAR_CATEGORY_ENCLOSING_MARK = 7; public const CHAR_CATEGORY_COMBINING_SPACING_MARK = 8; public const CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER = 9; public const CHAR_CATEGORY_LETTER_NUMBER = 10; public const CHAR_CATEGORY_OTHER_NUMBER = 11; public const CHAR_CATEGORY_SPACE_SEPARATOR = 12; public const CHAR_CATEGORY_LINE_SEPARATOR = 13; public const CHAR_CATEGORY_PARAGRAPH_SEPARATOR = 14; public const CHAR_CATEGORY_CONTROL_CHAR = 15; public const CHAR_CATEGORY_FORMAT_CHAR = 16; public const CHAR_CATEGORY_PRIVATE_USE_CHAR = 17; public const CHAR_CATEGORY_SURROGATE = 18; public const CHAR_CATEGORY_DASH_PUNCTUATION = 19; public const CHAR_CATEGORY_START_PUNCTUATION = 20; public const CHAR_CATEGORY_END_PUNCTUATION = 21; public const CHAR_CATEGORY_CONNECTOR_PUNCTUATION = 22; public const CHAR_CATEGORY_OTHER_PUNCTUATION = 23; public const CHAR_CATEGORY_MATH_SYMBOL = 24; public const CHAR_CATEGORY_CURRENCY_SYMBOL = 25; public const CHAR_CATEGORY_MODIFIER_SYMBOL = 26; public const CHAR_CATEGORY_OTHER_SYMBOL = 27; public const CHAR_CATEGORY_INITIAL_PUNCTUATION = 28; public const CHAR_CATEGORY_FINAL_PUNCTUATION = 29; public const CHAR_CATEGORY_CHAR_CATEGORY_COUNT = 30; public const CHAR_DIRECTION_LEFT_TO_RIGHT = 0; public const CHAR_DIRECTION_RIGHT_TO_LEFT = 1; public const CHAR_DIRECTION_EUROPEAN_NUMBER = 2; public const CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR = 3; public const CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR = 4; public const CHAR_DIRECTION_ARABIC_NUMBER = 5; public const CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR = 6; public const CHAR_DIRECTION_BLOCK_SEPARATOR = 7; public const CHAR_DIRECTION_SEGMENT_SEPARATOR = 8; public const CHAR_DIRECTION_WHITE_SPACE_NEUTRAL = 9; public const CHAR_DIRECTION_OTHER_NEUTRAL = 10; public const CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING = 11; public const CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE = 12; public const CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC = 13; public const CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING = 14; public const CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE = 15; public const CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT = 16; public const CHAR_DIRECTION_DIR_NON_SPACING_MARK = 17; public const CHAR_DIRECTION_BOUNDARY_NEUTRAL = 18; public const CHAR_DIRECTION_FIRST_STRONG_ISOLATE = 19; public const CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE = 20; public const CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE = 21; public const CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE = 22; public const CHAR_DIRECTION_CHAR_DIRECTION_COUNT = 23; public const BLOCK_CODE_NO_BLOCK = 0; public const BLOCK_CODE_BASIC_LATIN = 1; public const BLOCK_CODE_LATIN_1_SUPPLEMENT = 2; public const BLOCK_CODE_LATIN_EXTENDED_A = 3; public const BLOCK_CODE_LATIN_EXTENDED_B = 4; public const BLOCK_CODE_IPA_EXTENSIONS = 5; public const BLOCK_CODE_SPACING_MODIFIER_LETTERS = 6; public const BLOCK_CODE_COMBINING_DIACRITICAL_MARKS = 7; public const BLOCK_CODE_GREEK = 8; public const BLOCK_CODE_CYRILLIC = 9; public const BLOCK_CODE_ARMENIAN = 10; public const BLOCK_CODE_HEBREW = 11; public const BLOCK_CODE_ARABIC = 12; public const BLOCK_CODE_SYRIAC = 13; public const BLOCK_CODE_THAANA = 14; public const BLOCK_CODE_DEVANAGARI = 15; public const BLOCK_CODE_BENGALI = 16; public const BLOCK_CODE_GURMUKHI = 17; public const BLOCK_CODE_GUJARATI = 18; public const BLOCK_CODE_ORIYA = 19; public const BLOCK_CODE_TAMIL = 20; public const BLOCK_CODE_TELUGU = 21; public const BLOCK_CODE_KANNADA = 22; public const BLOCK_CODE_MALAYALAM = 23; public const BLOCK_CODE_SINHALA = 24; public const BLOCK_CODE_THAI = 25; public const BLOCK_CODE_LAO = 26; public const BLOCK_CODE_TIBETAN = 27; public const BLOCK_CODE_MYANMAR = 28; public const BLOCK_CODE_GEORGIAN = 29; public const BLOCK_CODE_HANGUL_JAMO = 30; public const BLOCK_CODE_ETHIOPIC = 31; public const BLOCK_CODE_CHEROKEE = 32; public const BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS = 33; public const BLOCK_CODE_OGHAM = 34; public const BLOCK_CODE_RUNIC = 35; public const BLOCK_CODE_KHMER = 36; public const BLOCK_CODE_MONGOLIAN = 37; public const BLOCK_CODE_LATIN_EXTENDED_ADDITIONAL = 38; public const BLOCK_CODE_GREEK_EXTENDED = 39; public const BLOCK_CODE_GENERAL_PUNCTUATION = 40; public const BLOCK_CODE_SUPERSCRIPTS_AND_SUBSCRIPTS = 41; public const BLOCK_CODE_CURRENCY_SYMBOLS = 42; public const BLOCK_CODE_COMBINING_MARKS_FOR_SYMBOLS = 43; public const BLOCK_CODE_LETTERLIKE_SYMBOLS = 44; public const BLOCK_CODE_NUMBER_FORMS = 45; public const BLOCK_CODE_ARROWS = 46; public const BLOCK_CODE_MATHEMATICAL_OPERATORS = 47; public const BLOCK_CODE_MISCELLANEOUS_TECHNICAL = 48; public const BLOCK_CODE_CONTROL_PICTURES = 49; public const BLOCK_CODE_OPTICAL_CHARACTER_RECOGNITION = 50; public const BLOCK_CODE_ENCLOSED_ALPHANUMERICS = 51; public const BLOCK_CODE_BOX_DRAWING = 52; public const BLOCK_CODE_BLOCK_ELEMENTS = 53; public const BLOCK_CODE_GEOMETRIC_SHAPES = 54; public const BLOCK_CODE_MISCELLANEOUS_SYMBOLS = 55; public const BLOCK_CODE_DINGBATS = 56; public const BLOCK_CODE_BRAILLE_PATTERNS = 57; public const BLOCK_CODE_CJK_RADICALS_SUPPLEMENT = 58; public const BLOCK_CODE_KANGXI_RADICALS = 59; public const BLOCK_CODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS = 60; public const BLOCK_CODE_CJK_SYMBOLS_AND_PUNCTUATION = 61; public const BLOCK_CODE_HIRAGANA = 62; public const BLOCK_CODE_KATAKANA = 63; public const BLOCK_CODE_BOPOMOFO = 64; public const BLOCK_CODE_HANGUL_COMPATIBILITY_JAMO = 65; public const BLOCK_CODE_KANBUN = 66; public const BLOCK_CODE_BOPOMOFO_EXTENDED = 67; public const BLOCK_CODE_ENCLOSED_CJK_LETTERS_AND_MONTHS = 68; public const BLOCK_CODE_CJK_COMPATIBILITY = 69; public const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A = 70; public const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS = 71; public const BLOCK_CODE_YI_SYLLABLES = 72; public const BLOCK_CODE_YI_RADICALS = 73; public const BLOCK_CODE_HANGUL_SYLLABLES = 74; public const BLOCK_CODE_HIGH_SURROGATES = 75; public const BLOCK_CODE_HIGH_PRIVATE_USE_SURROGATES = 76; public const BLOCK_CODE_LOW_SURROGATES = 77; public const BLOCK_CODE_PRIVATE_USE_AREA = 78; public const BLOCK_CODE_PRIVATE_USE = 78; public const BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS = 79; public const BLOCK_CODE_ALPHABETIC_PRESENTATION_FORMS = 80; public const BLOCK_CODE_ARABIC_PRESENTATION_FORMS_A = 81; public const BLOCK_CODE_COMBINING_HALF_MARKS = 82; public const BLOCK_CODE_CJK_COMPATIBILITY_FORMS = 83; public const BLOCK_CODE_SMALL_FORM_VARIANTS = 84; public const BLOCK_CODE_ARABIC_PRESENTATION_FORMS_B = 85; public const BLOCK_CODE_SPECIALS = 86; public const BLOCK_CODE_HALFWIDTH_AND_FULLWIDTH_FORMS = 87; public const BLOCK_CODE_OLD_ITALIC = 88; public const BLOCK_CODE_GOTHIC = 89; public const BLOCK_CODE_DESERET = 90; public const BLOCK_CODE_BYZANTINE_MUSICAL_SYMBOLS = 91; public const BLOCK_CODE_MUSICAL_SYMBOLS = 92; public const BLOCK_CODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS = 93; public const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B = 94; public const BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT = 95; public const BLOCK_CODE_TAGS = 96; public const BLOCK_CODE_CYRILLIC_SUPPLEMENT = 97; public const BLOCK_CODE_CYRILLIC_SUPPLEMENTARY = 97; public const BLOCK_CODE_TAGALOG = 98; public const BLOCK_CODE_HANUNOO = 99; public const BLOCK_CODE_BUHID = 100; public const BLOCK_CODE_TAGBANWA = 101; public const BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A = 102; public const BLOCK_CODE_SUPPLEMENTAL_ARROWS_A = 103; public const BLOCK_CODE_SUPPLEMENTAL_ARROWS_B = 104; public const BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B = 105; public const BLOCK_CODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS = 106; public const BLOCK_CODE_KATAKANA_PHONETIC_EXTENSIONS = 107; public const BLOCK_CODE_VARIATION_SELECTORS = 108; public const BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A = 109; public const BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B = 110; public const BLOCK_CODE_LIMBU = 111; public const BLOCK_CODE_TAI_LE = 112; public const BLOCK_CODE_KHMER_SYMBOLS = 113; public const BLOCK_CODE_PHONETIC_EXTENSIONS = 114; public const BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS = 115; public const BLOCK_CODE_YIJING_HEXAGRAM_SYMBOLS = 116; public const BLOCK_CODE_LINEAR_B_SYLLABARY = 117; public const BLOCK_CODE_LINEAR_B_IDEOGRAMS = 118; public const BLOCK_CODE_AEGEAN_NUMBERS = 119; public const BLOCK_CODE_UGARITIC = 120; public const BLOCK_CODE_SHAVIAN = 121; public const BLOCK_CODE_OSMANYA = 122; public const BLOCK_CODE_CYPRIOT_SYLLABARY = 123; public const BLOCK_CODE_TAI_XUAN_JING_SYMBOLS = 124; public const BLOCK_CODE_VARIATION_SELECTORS_SUPPLEMENT = 125; public const BLOCK_CODE_ANCIENT_GREEK_MUSICAL_NOTATION = 126; public const BLOCK_CODE_ANCIENT_GREEK_NUMBERS = 127; public const BLOCK_CODE_ARABIC_SUPPLEMENT = 128; public const BLOCK_CODE_BUGINESE = 129; public const BLOCK_CODE_CJK_STROKES = 130; public const BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT = 131; public const BLOCK_CODE_COPTIC = 132; public const BLOCK_CODE_ETHIOPIC_EXTENDED = 133; public const BLOCK_CODE_ETHIOPIC_SUPPLEMENT = 134; public const BLOCK_CODE_GEORGIAN_SUPPLEMENT = 135; public const BLOCK_CODE_GLAGOLITIC = 136; public const BLOCK_CODE_KHAROSHTHI = 137; public const BLOCK_CODE_MODIFIER_TONE_LETTERS = 138; public const BLOCK_CODE_NEW_TAI_LUE = 139; public const BLOCK_CODE_OLD_PERSIAN = 140; public const BLOCK_CODE_PHONETIC_EXTENSIONS_SUPPLEMENT = 141; public const BLOCK_CODE_SUPPLEMENTAL_PUNCTUATION = 142; public const BLOCK_CODE_SYLOTI_NAGRI = 143; public const BLOCK_CODE_TIFINAGH = 144; public const BLOCK_CODE_VERTICAL_FORMS = 145; public const BLOCK_CODE_NKO = 146; public const BLOCK_CODE_BALINESE = 147; public const BLOCK_CODE_LATIN_EXTENDED_C = 148; public const BLOCK_CODE_LATIN_EXTENDED_D = 149; public const BLOCK_CODE_PHAGS_PA = 150; public const BLOCK_CODE_PHOENICIAN = 151; public const BLOCK_CODE_CUNEIFORM = 152; public const BLOCK_CODE_CUNEIFORM_NUMBERS_AND_PUNCTUATION = 153; public const BLOCK_CODE_COUNTING_ROD_NUMERALS = 154; public const BLOCK_CODE_SUNDANESE = 155; public const BLOCK_CODE_LEPCHA = 156; public const BLOCK_CODE_OL_CHIKI = 157; public const BLOCK_CODE_CYRILLIC_EXTENDED_A = 158; public const BLOCK_CODE_VAI = 159; public const BLOCK_CODE_CYRILLIC_EXTENDED_B = 160; public const BLOCK_CODE_SAURASHTRA = 161; public const BLOCK_CODE_KAYAH_LI = 162; public const BLOCK_CODE_REJANG = 163; public const BLOCK_CODE_CHAM = 164; public const BLOCK_CODE_ANCIENT_SYMBOLS = 165; public const BLOCK_CODE_PHAISTOS_DISC = 166; public const BLOCK_CODE_LYCIAN = 167; public const BLOCK_CODE_CARIAN = 168; public const BLOCK_CODE_LYDIAN = 169; public const BLOCK_CODE_MAHJONG_TILES = 170; public const BLOCK_CODE_DOMINO_TILES = 171; public const BLOCK_CODE_SAMARITAN = 172; public const BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED = 173; public const BLOCK_CODE_TAI_THAM = 174; public const BLOCK_CODE_VEDIC_EXTENSIONS = 175; public const BLOCK_CODE_LISU = 176; public const BLOCK_CODE_BAMUM = 177; public const BLOCK_CODE_COMMON_INDIC_NUMBER_FORMS = 178; public const BLOCK_CODE_DEVANAGARI_EXTENDED = 179; public const BLOCK_CODE_HANGUL_JAMO_EXTENDED_A = 180; public const BLOCK_CODE_JAVANESE = 181; public const BLOCK_CODE_MYANMAR_EXTENDED_A = 182; public const BLOCK_CODE_TAI_VIET = 183; public const BLOCK_CODE_MEETEI_MAYEK = 184; public const BLOCK_CODE_HANGUL_JAMO_EXTENDED_B = 185; public const BLOCK_CODE_IMPERIAL_ARAMAIC = 186; public const BLOCK_CODE_OLD_SOUTH_ARABIAN = 187; public const BLOCK_CODE_AVESTAN = 188; public const BLOCK_CODE_INSCRIPTIONAL_PARTHIAN = 189; public const BLOCK_CODE_INSCRIPTIONAL_PAHLAVI = 190; public const BLOCK_CODE_OLD_TURKIC = 191; public const BLOCK_CODE_RUMI_NUMERAL_SYMBOLS = 192; public const BLOCK_CODE_KAITHI = 193; public const BLOCK_CODE_EGYPTIAN_HIEROGLYPHS = 194; public const BLOCK_CODE_ENCLOSED_ALPHANUMERIC_SUPPLEMENT = 195; public const BLOCK_CODE_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT = 196; public const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C = 197; public const BLOCK_CODE_MANDAIC = 198; public const BLOCK_CODE_BATAK = 199; public const BLOCK_CODE_ETHIOPIC_EXTENDED_A = 200; public const BLOCK_CODE_BRAHMI = 201; public const BLOCK_CODE_BAMUM_SUPPLEMENT = 202; public const BLOCK_CODE_KANA_SUPPLEMENT = 203; public const BLOCK_CODE_PLAYING_CARDS = 204; public const BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS = 205; public const BLOCK_CODE_EMOTICONS = 206; public const BLOCK_CODE_TRANSPORT_AND_MAP_SYMBOLS = 207; public const BLOCK_CODE_ALCHEMICAL_SYMBOLS = 208; public const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D = 209; public const BLOCK_CODE_ARABIC_EXTENDED_A = 210; public const BLOCK_CODE_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS = 211; public const BLOCK_CODE_CHAKMA = 212; public const BLOCK_CODE_MEETEI_MAYEK_EXTENSIONS = 213; public const BLOCK_CODE_MEROITIC_CURSIVE = 214; public const BLOCK_CODE_MEROITIC_HIEROGLYPHS = 215; public const BLOCK_CODE_MIAO = 216; public const BLOCK_CODE_SHARADA = 217; public const BLOCK_CODE_SORA_SOMPENG = 218; public const BLOCK_CODE_SUNDANESE_SUPPLEMENT = 219; public const BLOCK_CODE_TAKRI = 220; public const BLOCK_CODE_BASSA_VAH = 221; public const BLOCK_CODE_CAUCASIAN_ALBANIAN = 222; public const BLOCK_CODE_COPTIC_EPACT_NUMBERS = 223; public const BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_EXTENDED = 224; public const BLOCK_CODE_DUPLOYAN = 225; public const BLOCK_CODE_ELBASAN = 226; public const BLOCK_CODE_GEOMETRIC_SHAPES_EXTENDED = 227; public const BLOCK_CODE_GRANTHA = 228; public const BLOCK_CODE_KHOJKI = 229; public const BLOCK_CODE_KHUDAWADI = 230; public const BLOCK_CODE_LATIN_EXTENDED_E = 231; public const BLOCK_CODE_LINEAR_A = 232; public const BLOCK_CODE_MAHAJANI = 233; public const BLOCK_CODE_MANICHAEAN = 234; public const BLOCK_CODE_MENDE_KIKAKUI = 235; public const BLOCK_CODE_MODI = 236; public const BLOCK_CODE_MRO = 237; public const BLOCK_CODE_MYANMAR_EXTENDED_B = 238; public const BLOCK_CODE_NABATAEAN = 239; public const BLOCK_CODE_OLD_NORTH_ARABIAN = 240; public const BLOCK_CODE_OLD_PERMIC = 241; public const BLOCK_CODE_ORNAMENTAL_DINGBATS = 242; public const BLOCK_CODE_PAHAWH_HMONG = 243; public const BLOCK_CODE_PALMYRENE = 244; public const BLOCK_CODE_PAU_CIN_HAU = 245; public const BLOCK_CODE_PSALTER_PAHLAVI = 246; public const BLOCK_CODE_SHORTHAND_FORMAT_CONTROLS = 247; public const BLOCK_CODE_SIDDHAM = 248; public const BLOCK_CODE_SINHALA_ARCHAIC_NUMBERS = 249; public const BLOCK_CODE_SUPPLEMENTAL_ARROWS_C = 250; public const BLOCK_CODE_TIRHUTA = 251; public const BLOCK_CODE_WARANG_CITI = 252; public const BLOCK_CODE_COUNT = 309; public const BLOCK_CODE_INVALID_CODE = -1; public const BPT_NONE = 0; public const BPT_OPEN = 1; public const BPT_CLOSE = 2; public const BPT_COUNT = 3; public const EA_NEUTRAL = 0; public const EA_AMBIGUOUS = 1; public const EA_HALFWIDTH = 2; public const EA_FULLWIDTH = 3; public const EA_NARROW = 4; public const EA_WIDE = 5; public const EA_COUNT = 6; public const UNICODE_CHAR_NAME = 0; public const UNICODE_10_CHAR_NAME = 1; public const EXTENDED_CHAR_NAME = 2; public const CHAR_NAME_ALIAS = 3; public const CHAR_NAME_CHOICE_COUNT = 4; public const SHORT_PROPERTY_NAME = 0; public const LONG_PROPERTY_NAME = 1; public const PROPERTY_NAME_CHOICE_COUNT = 2; public const DT_NONE = 0; public const DT_CANONICAL = 1; public const DT_COMPAT = 2; public const DT_CIRCLE = 3; public const DT_FINAL = 4; public const DT_FONT = 5; public const DT_FRACTION = 6; public const DT_INITIAL = 7; public const DT_ISOLATED = 8; public const DT_MEDIAL = 9; public const DT_NARROW = 10; public const DT_NOBREAK = 11; public const DT_SMALL = 12; public const DT_SQUARE = 13; public const DT_SUB = 14; public const DT_SUPER = 15; public const DT_VERTICAL = 16; public const DT_WIDE = 17; public const DT_COUNT = 18; public const JT_NON_JOINING = 0; public const JT_JOIN_CAUSING = 1; public const JT_DUAL_JOINING = 2; public const JT_LEFT_JOINING = 3; public const JT_RIGHT_JOINING = 4; public const JT_TRANSPARENT = 5; public const JT_COUNT = 6; public const JG_NO_JOINING_GROUP = 0; public const JG_AIN = 1; public const JG_ALAPH = 2; public const JG_ALEF = 3; public const JG_BEH = 4; public const JG_BETH = 5; public const JG_DAL = 6; public const JG_DALATH_RISH = 7; public const JG_E = 8; public const JG_FEH = 9; public const JG_FINAL_SEMKATH = 10; public const JG_GAF = 11; public const JG_GAMAL = 12; public const JG_HAH = 13; public const JG_TEH_MARBUTA_GOAL = 14; public const JG_HAMZA_ON_HEH_GOAL = 14; public const JG_HE = 15; public const JG_HEH = 16; public const JG_HEH_GOAL = 17; public const JG_HETH = 18; public const JG_KAF = 19; public const JG_KAPH = 20; public const JG_KNOTTED_HEH = 21; public const JG_LAM = 22; public const JG_LAMADH = 23; public const JG_MEEM = 24; public const JG_MIM = 25; public const JG_NOON = 26; public const JG_NUN = 27; public const JG_PE = 28; public const JG_QAF = 29; public const JG_QAPH = 30; public const JG_REH = 31; public const JG_REVERSED_PE = 32; public const JG_SAD = 33; public const JG_SADHE = 34; public const JG_SEEN = 35; public const JG_SEMKATH = 36; public const JG_SHIN = 37; public const JG_SWASH_KAF = 38; public const JG_SYRIAC_WAW = 39; public const JG_TAH = 40; public const JG_TAW = 41; public const JG_TEH_MARBUTA = 42; public const JG_TETH = 43; public const JG_WAW = 44; public const JG_YEH = 45; public const JG_YEH_BARREE = 46; public const JG_YEH_WITH_TAIL = 47; public const JG_YUDH = 48; public const JG_YUDH_HE = 49; public const JG_ZAIN = 50; public const JG_FE = 51; public const JG_KHAPH = 52; public const JG_ZHAIN = 53; public const JG_BURUSHASKI_YEH_BARREE = 54; public const JG_FARSI_YEH = 55; public const JG_NYA = 56; public const JG_ROHINGYA_YEH = 57; public const JG_MANICHAEAN_ALEPH = 58; public const JG_MANICHAEAN_AYIN = 59; public const JG_MANICHAEAN_BETH = 60; public const JG_MANICHAEAN_DALETH = 61; public const JG_MANICHAEAN_DHAMEDH = 62; public const JG_MANICHAEAN_FIVE = 63; public const JG_MANICHAEAN_GIMEL = 64; public const JG_MANICHAEAN_HETH = 65; public const JG_MANICHAEAN_HUNDRED = 66; public const JG_MANICHAEAN_KAPH = 67; public const JG_MANICHAEAN_LAMEDH = 68; public const JG_MANICHAEAN_MEM = 69; public const JG_MANICHAEAN_NUN = 70; public const JG_MANICHAEAN_ONE = 71; public const JG_MANICHAEAN_PE = 72; public const JG_MANICHAEAN_QOPH = 73; public const JG_MANICHAEAN_RESH = 74; public const JG_MANICHAEAN_SADHE = 75; public const JG_MANICHAEAN_SAMEKH = 76; public const JG_MANICHAEAN_TAW = 77; public const JG_MANICHAEAN_TEN = 78; public const JG_MANICHAEAN_TETH = 79; public const JG_MANICHAEAN_THAMEDH = 80; public const JG_MANICHAEAN_TWENTY = 81; public const JG_MANICHAEAN_WAW = 82; public const JG_MANICHAEAN_YODH = 83; public const JG_MANICHAEAN_ZAYIN = 84; public const JG_STRAIGHT_WAW = 85; public const JG_COUNT = 102; public const GCB_OTHER = 0; public const GCB_CONTROL = 1; public const GCB_CR = 2; public const GCB_EXTEND = 3; public const GCB_L = 4; public const GCB_LF = 5; public const GCB_LV = 6; public const GCB_LVT = 7; public const GCB_T = 8; public const GCB_V = 9; public const GCB_SPACING_MARK = 10; public const GCB_PREPEND = 11; public const GCB_REGIONAL_INDICATOR = 12; public const GCB_COUNT = 18; public const WB_OTHER = 0; public const WB_ALETTER = 1; public const WB_FORMAT = 2; public const WB_KATAKANA = 3; public const WB_MIDLETTER = 4; public const WB_MIDNUM = 5; public const WB_NUMERIC = 6; public const WB_EXTENDNUMLET = 7; public const WB_CR = 8; public const WB_EXTEND = 9; public const WB_LF = 10; public const WB_MIDNUMLET = 11; public const WB_NEWLINE = 12; public const WB_REGIONAL_INDICATOR = 13; public const WB_HEBREW_LETTER = 14; public const WB_SINGLE_QUOTE = 15; public const WB_DOUBLE_QUOTE = 16; public const WB_COUNT = 23; public const SB_OTHER = 0; public const SB_ATERM = 1; public const SB_CLOSE = 2; public const SB_FORMAT = 3; public const SB_LOWER = 4; public const SB_NUMERIC = 5; public const SB_OLETTER = 6; public const SB_SEP = 7; public const SB_SP = 8; public const SB_STERM = 9; public const SB_UPPER = 10; public const SB_CR = 11; public const SB_EXTEND = 12; public const SB_LF = 13; public const SB_SCONTINUE = 14; public const SB_COUNT = 15; public const LB_UNKNOWN = 0; public const LB_AMBIGUOUS = 1; public const LB_ALPHABETIC = 2; public const LB_BREAK_BOTH = 3; public const LB_BREAK_AFTER = 4; public const LB_BREAK_BEFORE = 5; public const LB_MANDATORY_BREAK = 6; public const LB_CONTINGENT_BREAK = 7; public const LB_CLOSE_PUNCTUATION = 8; public const LB_COMBINING_MARK = 9; public const LB_CARRIAGE_RETURN = 10; public const LB_EXCLAMATION = 11; public const LB_GLUE = 12; public const LB_HYPHEN = 13; public const LB_IDEOGRAPHIC = 14; public const LB_INSEPARABLE = 15; public const LB_INSEPERABLE = 15; public const LB_INFIX_NUMERIC = 16; public const LB_LINE_FEED = 17; public const LB_NONSTARTER = 18; public const LB_NUMERIC = 19; public const LB_OPEN_PUNCTUATION = 20; public const LB_POSTFIX_NUMERIC = 21; public const LB_PREFIX_NUMERIC = 22; public const LB_QUOTATION = 23; public const LB_COMPLEX_CONTEXT = 24; public const LB_SURROGATE = 25; public const LB_SPACE = 26; public const LB_BREAK_SYMBOLS = 27; public const LB_ZWSPACE = 28; public const LB_NEXT_LINE = 29; public const LB_WORD_JOINER = 30; public const LB_H2 = 31; public const LB_H3 = 32; public const LB_JL = 33; public const LB_JT = 34; public const LB_JV = 35; public const LB_CLOSE_PARENTHESIS = 36; public const LB_CONDITIONAL_JAPANESE_STARTER = 37; public const LB_HEBREW_LETTER = 38; public const LB_REGIONAL_INDICATOR = 39; public const LB_COUNT = 43; public const NT_NONE = 0; public const NT_DECIMAL = 1; public const NT_DIGIT = 2; public const NT_NUMERIC = 3; public const NT_COUNT = 4; public const HST_NOT_APPLICABLE = 0; public const HST_LEADING_JAMO = 1; public const HST_VOWEL_JAMO = 2; public const HST_TRAILING_JAMO = 3; public const HST_LV_SYLLABLE = 4; public const HST_LVT_SYLLABLE = 5; public const HST_COUNT = 6; public const NO_NUMERIC_VALUE = -123456789; /** * @since 8.4 */ public const PROPERTY_IDS_UNARY_OPERATOR = 72; /** * @since 8.4 */ public const PROPERTY_ID_COMPAT_MATH_START = 73; /** * @since 8.4 */ public const PROPERTY_ID_COMPAT_MATH_CONTINUE = 74; /** * Check a binary Unicode property for a code point * @link https://php.net/manual/en/intlchar.hasbinaryproperty.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @param int $property The Unicode property to lookup (see the IntlChar::PROPERTY_* constants). * @return bool|null Returns TRUE or FALSE according to the binary Unicode property value for codepoint. * Also FALSE if property is out of bounds or if the Unicode version does not have data for the property at all, or not for this code point. * Or NULL if codepoint is out of bounds. * @since 7.0 */ #[Pure] #[TentativeType] public static function hasBinaryProperty( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property ): ?bool {} /** * @link https://php.net/manual/en/intlchar.charage.php * Get the "age" of the code point * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return array|null The Unicode version number, as an array. For example, version 1.3.31.2 would be represented as [1, 3, 31, 2]. * Or NULL if codepoint is out of bounds. * @since 7.0 */ #[TentativeType] public static function charAge(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?array {} /** * @link https://php.net/manual/en/intlchar.chardigitvalue.php * Get the decimal digit value of a decimal digit character * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|null The decimal digit value of codepoint, or -1 if it is not a decimal digit character. * Or NULL if codepoint is out of bounds. * @since 7.0 */ #[TentativeType] public static function charDigitValue(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?int {} /** * Get bidirectional category value for a code point * @link https://php.net/manual/en/intlchar.chardirection.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return int|null

The bidirectional category value; one of the following constants: *

*
    *
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT
  • *
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT
  • *
  • IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER
  • *
  • IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR
  • *
  • IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR
  • *
  • IntlChar::CHAR_DIRECTION_ARABIC_NUMBER
  • *
  • IntlChar::CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR
  • *
  • IntlChar::CHAR_DIRECTION_BLOCK_SEPARATOR
  • *
  • IntlChar::CHAR_DIRECTION_SEGMENT_SEPARATOR
  • *
  • IntlChar::CHAR_DIRECTION_WHITE_SPACE_NEUTRAL
  • *
  • IntlChar::CHAR_DIRECTION_OTHER_NEUTRAL
  • *
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING
  • *
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE
  • *
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC
  • *
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING
  • *
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE
  • *
  • IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT
  • *
  • IntlChar::CHAR_DIRECTION_DIR_NON_SPACING_MARK
  • *
  • IntlChar::CHAR_DIRECTION_BOUNDARY_NEUTRAL
  • *
  • IntlChar::CHAR_DIRECTION_FIRST_STRONG_ISOLATE
  • *
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE
  • *
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE
  • *
  • IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE
  • *
  • IntlChar::CHAR_DIRECTION_CHAR_DIRECTION_COUNT
  • *
* Or NULL if codepoint is out of bounds. * @since 7.0 */ #[TentativeType] public static function charDirection(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?int {} /** * @link https://php.net/manual/en/intlchar.charfromname.php * Find Unicode character by name and return its code point value * @param string $name

Full name of the Unicode character.

* @param int $type [optional]

* Which set of names to use for the lookup. Can be any of these constants: *

    *
  • IntlChar::UNICODE_CHAR_NAME (default)
  • *
  • IntlChar::UNICODE_10_CHAR_NAME
  • *
  • IntlChar::EXTENDED_CHAR_NAME
  • *
  • IntlChar::CHAR_NAME_ALIAS
  • *
  • IntlChar::CHAR_NAME_CHOICE_COUNT
  • *
* @return int|null The Unicode value of the code point with the given name (as an integer), or NULL if there is no such code point. * @since 7.0 */ #[TentativeType] public static function charFromName( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = IntlChar::UNICODE_CHAR_NAME ): ?int {} /** * @link https://php.net/manual/en/intlchar.charmirror.php * Get the "mirror-image" character for a code point * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|string|null Returns another Unicode code point that may serve as a mirror-image substitute, or codepoint itself if there is no such mapping or codepoint does not have the Bidi_Mirrored property. * The return type will be integer unless the code point was passed as a UTF-8 string, in which case a string will be returned. * Or NULL if codepoint will be out of bound. */ #[TentativeType] public static function charMirror(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): string|int|null {} /** * Retrieve the name of a Unicode character * @link https://php.net/manual/en/intlchar.charname.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @param int $type [optional] Which set of names to use for the lookup. Can be any of these constants: *
    *
  • IntlChar::UNICODE_CHAR_NAME (default)
  • *
  • IntlChar::UNICODE_10_CHAR_NAME
  • *
  • IntlChar::EXTENDED_CHAR_NAME
  • *
  • IntlChar::CHAR_NAME_ALIAS
  • *
  • IntlChar::CHAR_NAME_CHOICE_COUNT
  • *
* @return string|null The corresponding name, or an empty string if there is no name for this character, or NULL if codepoint is out of bounds. * @since 7.0 */ #[TentativeType] public static function charName( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = IntlChar::UNICODE_CHAR_NAME ): ?string {} /** * Get the general category value for a code point * @link https://php.net/manual/en/intlchar.chartype.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|null Returns the general category type, which may be one of the following constants: *

    *
  • IntlChar::CHAR_CATEGORY_UNASSIGNED
  • *
  • IntlChar::CHAR_CATEGORY_GENERAL_OTHER_TYPES
  • *
  • IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER
  • *
  • IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER
  • *
  • IntlChar::CHAR_CATEGORY_TITLECASE_LETTER
  • *
  • IntlChar::CHAR_CATEGORY_MODIFIER_LETTER
  • *
  • IntlChar::CHAR_CATEGORY_OTHER_LETTER
  • *
  • IntlChar::CHAR_CATEGORY_NON_SPACING_MARK
  • *
  • IntlChar::CHAR_CATEGORY_ENCLOSING_MARK
  • *
  • IntlChar::CHAR_CATEGORY_COMBINING_SPACING_MARK
  • *
  • IntlChar::CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER
  • *
  • IntlChar::CHAR_CATEGORY_LETTER_NUMBER
  • *
  • IntlChar::CHAR_CATEGORY_OTHER_NUMBER
  • *
  • IntlChar::CHAR_CATEGORY_SPACE_SEPARATOR
  • *
  • IntlChar::CHAR_CATEGORY_LINE_SEPARATOR
  • *
  • IntlChar::CHAR_CATEGORY_PARAGRAPH_SEPARATOR
  • *
  • IntlChar::CHAR_CATEGORY_CONTROL_CHAR
  • *
  • IntlChar::CHAR_CATEGORY_FORMAT_CHAR
  • *
  • IntlChar::CHAR_CATEGORY_PRIVATE_USE_CHAR
  • *
  • IntlChar::CHAR_CATEGORY_SURROGATE
  • *
  • IntlChar::CHAR_CATEGORY_DASH_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_START_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_END_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_CONNECTOR_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_OTHER_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_MATH_SYMBOL
  • *
  • IntlChar::CHAR_CATEGORY_CURRENCY_SYMBOL
  • *
  • IntlChar::CHAR_CATEGORY_MODIFIER_SYMBOL
  • *
  • IntlChar::CHAR_CATEGORY_OTHER_SYMBOL
  • *
  • IntlChar::CHAR_CATEGORY_INITIAL_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_FINAL_PUNCTUATION
  • *
  • IntlChar::CHAR_CATEGORY_CHAR_CATEGORY_COUNT
*

Or NULL if codepoint is out of bound.

'int|string'], default: '')] $codepoint): ?int {} /** * Return Unicode character by code point value * @link https://php.net/manual/en/intlchar.chr.php * @param mixed $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return string|null A string containing the single character specified by the Unicode code point value. * Or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function chr(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?string {} /** * Get the decimal digit value of a code point for a given radix * @link https://php.net/manual/en/intlchar.digit.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @param int $base

The radix (defaults to 10).

* @return int|false|null Returns the numeric value represented by the character in the specified radix, * or FALSE if there is no value or if the value exceeds the radix, * or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function digit( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $base = 10 ): int|false|null {} /** * Enumerate all assigned Unicode characters within a range * @link https://php.net/manual/en/intlchar.enumcharnames.php * @param int|string $start The first code point in the enumeration range. * @param int|string $end One more than the last code point in the enumeration range (the first one after the range). * @param callable $callback

* The function that is to be called for each character name. The following three arguments will be passed into it: *

    *
  • integer $codepoint - The numeric code point value
  • *
  • integer $nameChoice - The same value as the nameChoice parameter below
  • *
  • string $name - The name of the character
  • *
* @param int $type [optional]

* Selector for which kind of names to enumerate. Can be any of these constants: *

    *
  • IntlChar::UNICODE_CHAR_NAME (default)
  • *
  • IntlChar::UNICODE_10_CHAR_NAME
  • *
  • IntlChar::EXTENDED_CHAR_NAME
  • *
  • IntlChar::CHAR_NAME_ALIAS
  • *
  • IntlChar::CHAR_NAME_CHOICE_COUNT
  • *
* @since 7.0 */ #[TentativeType] #[LanguageLevelTypeAware(['8.3' => 'bool'], default: 'bool|null')] public static function enumCharNames( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $start, #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $end, #[LanguageLevelTypeAware(['8.0' => 'callable'], default: '')] $callback, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = IntlChar::UNICODE_CHAR_NAME ) {} /** * Enumerate all code points with their Unicode general categories * @link https://php.net/manual/en/intlchar.enumchartypes.php * @param callable $callback

* The function that is to be called for each contiguous range of code points with the same general category. * The following three arguments will be passed into it: *

    *
  • integer $start - The starting code point of the range
  • *
  • integer $end - The ending code point of the range
  • *
  • integer $name - The category type (one of the IntlChar::CHAR_CATEGORY_* constants)
  • *
* @since 7.0 */ #[TentativeType] public static function enumCharTypes( #[PhpStormStubsElementAvailable(from: '7.0', to: '7.4')] $callback = null, #[PhpStormStubsElementAvailable(from: '8.0')] callable $callback ): void {} /** * Perform case folding on a code point * @link https://php.net/manual/en/intlchar.foldcase.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @param int $options [optional] Either IntlChar::FOLD_CASE_DEFAULT (default) or IntlChar::FOLD_CASE_EXCLUDE_SPECIAL_I. * @return int|string|null Returns the Simple_Case_Folding of the code point, if any; otherwise the code point itself. * Returns NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function foldCase( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $options = IntlChar::FOLD_CASE_DEFAULT ): string|int|null {} /** * Get character representation for a given digit and radix * @link https://php.net/manual/en/intlchar.fordigit.php * @param int $digit

The number to convert to a character.

* @param int $base [optional]

The radix (defaults to 10).

* @return int The character representation (as a string) of the specified digit in the specified radix. * @since 7.0 */ #[TentativeType] public static function forDigit( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $digit, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $base = 10 ): int {} /** * Get the paired bracket character for a code point * @link https://php.net/manual/en/intlchar.getbidipairedbracket.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return int|string|null Returns the paired bracket code point, or codepoint itself if there is no such mapping. * The return type will be integer unless the code point was passed as a UTF-8 string, in which case a string will be returned. * Or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function getBidiPairedBracket(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): string|int|null {} /** * Get the Unicode allocation block containing a code point * @link https://php.net/manual/en/intlchar.getblockcode.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|null Returns the block value for codepoint, or NULL if codepoint is out of bound. * See the IntlChar::BLOCK_CODE_* constants for possible return values. * @since 7.0 */ #[TentativeType] public static function getBlockCode(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?int {} /** * Get the combining class of a code point * @link https://php.net/manual/en/intlchar.getcombiningclass.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|null Returns the combining class of the character. * Or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function getCombiningClass(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?int {} /** * Get the FC_NFKC_Closure property for a code point * @link https://php.net/manual/en/intlchar.getfc-nfkc-closure.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return string|false|null Returns the FC_NFKC_Closure property string for the codepoint, or an empty string if there is none, * or NULL if codepoint is out of bound, * or FALSE if there was an error. * @since 7.0 */ #[TentativeType] public static function getFC_NFKC_Closure(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): string|false|null {} /** * Get the max value for a Unicode property * @link https://php.net/manual/en/intlchar.getintpropertymaxvalue.php * @param int $property The Unicode property to lookup (see the IntlChar::PROPERTY_* constants). * @return int The maximum value returned by {@see IntlChar::getIntPropertyValue()} for a Unicode property. <=0 if the property selector is out of range. * @since 7.0 */ #[TentativeType] public static function getIntPropertyMaxValue(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property): int {} /** * Get the min value for a Unicode property * @link https://php.net/manual/en/intlchar.getintpropertyminvalue.php * @param int $property The Unicode property to lookup (see the IntlChar::PROPERTY_* constants). * @return int The minimum value returned by {@see IntlChar::getIntPropertyValue()} for a Unicode property. 0 if the property selector is out of range. * @since 7.0 */ #[TentativeType] public static function getIntPropertyMinValue(#[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property): int {} /** * Get the value for a Unicode property for a code point * @link https://php.net/manual/en/intlchar.getintpropertyvalue.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @param int $property The Unicode property to lookup (see the IntlChar::PROPERTY_* constants). * @return int|null

* Returns the numeric value that is directly the property value or, for enumerated properties, corresponds to the * numeric value of the enumerated constant of the respective property value enumeration type. *

*

* Returns 0 or 1 (for FALSE/TRUE) for binary Unicode properties. *

*

* Returns a bit-mask for mask properties. *

*

* Returns 0 if property is out of bounds or if the Unicode version does not * have data for the property at all, or not for this code point. *

*

* Returns NULL if codepoint is out of bound. *

* @since 7.0 */ #[TentativeType] public static function getIntPropertyValue( #[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property ): ?int {} /** * Get the numeric value for a Unicode code point * @link https://php.net/manual/en/intlchar.getnumericvalue.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return float|null Numeric value of codepoint, or float(-123456789) if none is defined, or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function getNumericValue(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?float {} /** * Get the property constant value for a given property name * @link https://php.net/manual/en/intlchar.getpropertyenum.php * @param string $alias The property name to be matched. The name is compared using "loose matching" as described in PropertyAliases.txt. * @return int Returns an IntlChar::PROPERTY_ constant value, or IntlChar::PROPERTY_INVALID_CODE if the given name does not match any property. * @since 7.0 */ #[TentativeType] public static function getPropertyEnum(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $alias): int {} /** * Get the Unicode name for a property * @link https://php.net/manual/en/intlchar.getpropertyname.php * @param int $property

The Unicode property to lookup (see the IntlChar::PROPERTY_* constants).

*

IntlChar::PROPERTY_INVALID_CODE should not be used. Also, if property is out of range, FALSE is returned.

* @param int $type

Selector for which name to get. If out of range, FALSE is returned.

*

All properties have a long name. Most have a short name, but some do not. Unicode allows for additional names; if present these will be returned by adding 1, 2, etc. to IntlChar::LONG_PROPERTY_NAME.

* @return string|false

* Returns the name, or FALSE if either the property or the nameChoice * is out of range. *

*

* If a given nameChoice returns FALSE, then all larger values of * nameChoice will return FALSE, with one exception: if FALSE is returned for * IntlChar::SHORT_PROPERTY_NAME, then IntlChar::LONG_PROPERTY_NAME * (and higher) may still return a non-FALSE value. *

* @since 7.0 */ #[TentativeType] public static function getPropertyName( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = IntlChar::LONG_PROPERTY_NAME ): string|false {} /** * Get the property value for a given value name * @link https://php.net/manual/en/intlchar.getpropertyvalueenum.php * @param int $property

The Unicode property to lookup (see the IntlChar::PROPERTY_* constants). * If out of range, or this method doesn't work with the given value, IntlChar::PROPERTY_INVALID_CODE is returned

* @param string $name

The value name to be matched. The name is compared using "loose matching" as described in PropertyValueAliases.txt.

* @return int Returns the corresponding value integer, or IntlChar::PROPERTY_INVALID_CODE if the given name does not match any value of the given property, or if the property is invalid. * @since 7.0 */ #[TentativeType] public static function getPropertyValueEnum( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property, #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $name ): int {} /** * Get the Unicode name for a property value * @link https://php.net/manual/en/intlchar.getpropertyvaluename.php * @param int $property

* The Unicode property to lookup (see the IntlChar::PROPERTY_* constants). * If out of range, or this method doesn't work with the given value, FALSE is returned. *

* @param int $value

* Selector for a value for the given property. If out of range, FALSE is returned. *

*

* In general, valid values range from 0 up to some maximum. There are a couple exceptions: *

    *
  • * IntlChar::PROPERTY_BLOCK values begin at the non-zero value IntlChar::BLOCK_CODE_BASIC_LATIN *
  • *
  • * IntlChar::PROPERTY_CANONICAL_COMBINING_CLASS values are not contiguous and range from 0..240. *
  • *
* @param int $type [optional]

* Selector for which name to get. If out of range, FALSE is returned. * All values have a long name. Most have a short name, but some do not. Unicode allows for additional names; if present these will be returned by adding 1, 2, etc. to IntlChar::LONG_PROPERTY_NAME. *

* @return string|false Returns the name, or FALSE if either the property or the nameChoice is out of range. * If a given nameChoice returns FALSE, then all larger values of nameChoice will return FALSE, with one exception: if FALSE is returned for IntlChar::SHORT_PROPERTY_NAME, then IntlChar::LONG_PROPERTY_NAME (and higher) may still return a non-FALSE value. * @since 7.0 */ #[TentativeType] public static function getPropertyValueName( #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $property, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $value, #[LanguageLevelTypeAware(['8.0' => 'int'], default: '')] $type = IntlChar::LONG_PROPERTY_NAME ): string|false {} /** * Get the Unicode version * @link https://php.net/manual/en/intlchar.getunicodeversion.php * @return array An array containing the Unicode version number. * @since 7.0 */ #[TentativeType] public static function getUnicodeVersion(): array {} /** * Check if code point is an alphanumeric character * @link https://php.net/manual/en/intlchar.isalnum.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is an alphanumeric character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isalnum(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a letter character * @link https://php.net/manual/en/intlchar.isalpha.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a letter character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isalpha(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a base character * @link https://php.net/manual/en/intlchar.isbase.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a base character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isbase(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a "blank" or "horizontal space" character * @link https://php.net/manual/en/intlchar.isblank.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is either a "blank" or "horizontal space" character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isblank(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a control character * @link https://php.net/manual/en/intlchar.iscntrl.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a control character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function iscntrl(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check whether the code point is defined * @link https://php.net/manual/en/intlchar.isdefined.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a defined character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isdefined(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a digit character * @link https://php.net/manual/en/intlchar.isdigit.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a digit character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isdigit(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a graphic character * @link https://php.net/manual/en/intlchar.isgraph.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a "graphic" character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isgraph(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is an ignorable character * @link https://php.net/manual/en/intlchar.isidignorable.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is ignorable in identifiers, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isIDIgnorable(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is permissible in an identifier * @link https://php.net/manual/en/intlchar.isidpart.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is the code point may occur in an identifier, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isIDPart(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is permissible as the first character in an identifier * @link https://php.net/manual/en/intlchar.isidstart.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint may start an identifier, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isIDStart(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is an ISO control code * @link https://php.net/manual/en/intlchar.isisocontrol.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is an ISO control code, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isISOControl(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is permissible in a Java identifier * @link https://php.net/manual/en/intlchar.isjavaidpart.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint may occur in a Java identifier, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isJavaIDPart(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is permissible as the first character in a Java identifier * @link https://php.net/manual/en/intlchar.isjavaidstart.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint may start a Java identifier, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isJavaIDStart(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a space character according to Java * @link https://php.net/manual/en/intlchar.isjavaspacechar.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a space character according to Java, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isJavaSpaceChar(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a lowercase letter * @link https://php.net/manual/en/intlchar.islower.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), * or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return bool|null Returns TRUE if codepoint is an Ll lowercase letter, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function islower(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point has the Bidi_Mirrored property * @link https://php.net/manual/en/intlchar.ismirrored.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return bool|null Returns TRUE if codepoint has the Bidi_Mirrored property, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isMirrored(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a printable character * @link https://php.net/manual/en/intlchar.isprint.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return bool|null Returns TRUE if codepoint is a printable character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isprint(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is punctuation character * @link https://php.net/manual/en/intlchar.ispunct.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), * or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return bool|null Returns TRUE if codepoint is a punctuation character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function ispunct(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a space character * @link https://php.net/manual/en/intlchar.isspace.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a space character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isspace(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a titlecase letter * @link https://php.net/manual/en/intlchar.istitle.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a titlecase letter, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function istitle(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point has the Alphabetic Unicode property * @link https://php.net/manual/en/intlchar.isualphabetic.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint has the Alphabetic Unicode property, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isUAlphabetic(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point has the Lowercase Unicode property * @link https://php.net/manual/en/intlchar.isulowercase.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint has the Lowercase Unicode property, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isULowercase(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point has the general category "Lu" (uppercase letter) * @link https://php.net/manual/en/intlchar.isupper.php * @param int|string $codepoint

The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), * or the character encoded as a UTF-8 string (e.g. "\u{2603}")

* @return bool|null Returns TRUE if codepoint is an Lu uppercase letter, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isupper(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point has the Uppercase Unicode property * @link https://php.net/manual/en/intlchar.isuuppercase.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint has the Uppercase Unicode property, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isUUppercase(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point has the White_Space Unicode property * @link https://php.net/manual/en/intlchar.isuwhitespace.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint has the White_Space Unicode property, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isUWhiteSpace(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a whitespace character according to ICU * @link https://php.net/manual/en/intlchar.iswhitespace.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a whitespace character according to ICU, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isWhitespace(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Check if code point is a hexadecimal digit * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return bool|null Returns TRUE if codepoint is a hexadecimal character, FALSE if not, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function isxdigit(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): ?bool {} /** * Return Unicode code point value of character * @link https://php.net/manual/en/intlchar.ord.php * @param int|string $character

A Unicode character.

* @return int|null Returns the Unicode code point value as an integer, NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function ord(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $character): ?int {} /** * Make Unicode character lowercase * @link https://php.net/manual/en/intlchar.tolower.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|string|null Returns the Simple_Lowercase_Mapping of the code point, if any; otherwise the code point itself. * The return type will be integer unless the code point was passed as a UTF-8 string, in which case a string will be returned. * Or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function tolower(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): string|int|null {} /** * Make Unicode character titlecase * @link https://php.net/manual/en/intlchar.totitle.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|string|null Returns the Simple_Titlecase_Mapping of the code point, if any; otherwise the code point itself. * The return type will be integer unless the code point was passed as a UTF-8 string, in which case a string will be returned. * Or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function totitle(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): string|int|null {} /** * Make Unicode character uppercase * @link https://php.net/manual/en/intlchar.toupper.php * @param int|string $codepoint The integer codepoint value (e.g. 0x2603 for U+2603 SNOWMAN), or the character encoded as a UTF-8 string (e.g. "\u{2603}") * @return int|string|null Returns the Simple_Uppercase_Mapping of the code point, if any; otherwise the code point itself. * The return type will be integer unless the code point was passed as a UTF-8 string, in which case a string will be returned. * Or NULL if codepoint is out of bound. * @since 7.0 */ #[TentativeType] public static function toupper(#[LanguageLevelTypeAware(['8.0' => 'int|string'], default: '')] $codepoint): string|int|null {} } * Sort strings with different accents from the back of the string. This * attribute is automatically set to * On * for the French locales and a few others. Users normally would not need * to explicitly set this attribute. There is a string comparison * performance cost when it is set On, * but sort key length is unaffected. Possible values are: * Collator::ON * Collator::OFF(default) * Collator::DEFAULT_VALUE *

*

* FRENCH_COLLATION rules *

* F=OFF cote < coté < côte < côté * F=ON cote < côte < coté < côté *

*

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const FRENCH_COLLATION = 0; /** *

* The Alternate attribute is used to control the handling of the so called * variable characters in the UCA: whitespace, punctuation and symbols. If * Alternate is set to NonIgnorable * (N), then differences among these characters are of the same importance * as differences among letters. If Alternate is set to * Shifted * (S), then these characters are of only minor importance. The * Shifted value is often used in combination with * Strength * set to Quaternary. In such a case, whitespace, punctuation, and symbols * are considered when comparing strings, but only if all other aspects of * the strings (base letters, accents, and case) are identical. If * Alternate is not set to Shifted, then there is no difference between a * Strength of 3 and a Strength of 4. For more information and examples, * see Variable_Weighting in the * UCA. * The reason the Alternate values are not simply * On and Off * is that additional Alternate values may be added in the future. The UCA * option Blanked is expressed with Strength set to 3, and Alternate set to * Shifted. The default for most locales is NonIgnorable. If Shifted is * selected, it may be slower if there are many strings that are the same * except for punctuation; sort key length will not be affected unless the * strength level is also increased. *

*

* Possible values are: * Collator::NON_IGNORABLE(default) * Collator::SHIFTED * Collator::DEFAULT_VALUE *

*

* ALTERNATE_HANDLING rules *

* S=3, A=N di Silva < Di Silva < diSilva < U.S.A. < USA * S=3, A=S di Silva = diSilva < Di Silva < U.S.A. = USA * S=4, A=S di Silva < diSilva < Di Silva < U.S.A. < USA *

*

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const ALTERNATE_HANDLING = 1; /** *

* The Case_First attribute is used to control whether uppercase letters * come before lowercase letters or vice versa, in the absence of other * differences in the strings. The possible values are * Uppercase_First * (U) and Lowercase_First * (L), plus the standard Default * and Off. * There is almost no difference between the Off and Lowercase_First * options in terms of results, so typically users will not use * Lowercase_First: only Off or Uppercase_First. (People interested in the * detailed differences between X and L should consult the Collation * Customization). Specifying either L or U won't affect string comparison * performance, but will affect the sort key length. *

*

* Possible values are: * Collator::OFF(default) * Collator::LOWER_FIRST * Collator::UPPER_FIRST * Collator:DEFAULT *

*

* CASE_FIRST rules *

* C=X or C=L "china" < "China" < "denmark" < "Denmark" * C=U "China" < "china" < "Denmark" < "denmark" *

*

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const CASE_FIRST = 2; /** *

* The Case_Level attribute is used when ignoring accents but not case. In * such a situation, set Strength to be Primary, * and Case_Level to be On. * In most locales, this setting is Off by default. There is a small * string comparison performance and sort key impact if this attribute is * set to be On. *

*

* Possible values are: * Collator::OFF(default) * Collator::ON * Collator::DEFAULT_VALUE *

*

* CASE_LEVEL rules *

* S=1, E=X role = Role = rôle * S=1, E=O role = rôle < Role *

*

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const CASE_LEVEL = 3; /** *

* The Normalization setting determines whether text is thoroughly * normalized or not in comparison. Even if the setting is off (which is * the default for many locales), text as represented in common usage will * compare correctly (for details, see UTN #5). Only if the accent marks * are in noncanonical order will there be a problem. If the setting is * On, * then the best results are guaranteed for all possible text input. * There is a medium string comparison performance cost if this attribute * is On, * depending on the frequency of sequences that require normalization. * There is no significant effect on sort key length. If the input text is * known to be in NFD or NFKD normalization forms, there is no need to * enable this Normalization option. *

*

* Possible values are: * Collator::OFF(default) * Collator::ON * Collator::DEFAULT_VALUE *

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const NORMALIZATION_MODE = 4; /** *

* The ICU Collation Service supports many levels of comparison (named * "Levels", but also known as "Strengths"). Having these categories * enables ICU to sort strings precisely according to local conventions. * However, by allowing the levels to be selectively employed, searching * for a string in text can be performed with various matching conditions. * For more detailed information, see * collator_set_strength chapter. *

*

* Possible values are: * Collator::PRIMARY * Collator::SECONDARY * Collator::TERTIARY(default) * Collator::QUATERNARY * Collator::IDENTICAL * Collator::DEFAULT_VALUE *

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const STRENGTH = 5; /** *

* Compatibility with JIS x 4061 requires the introduction of an additional * level to distinguish Hiragana and Katakana characters. If compatibility * with that standard is required, then this attribute should be set * On, * and the strength set to Quaternary. This will affect sort key length * and string comparison string comparison performance. *

*

* Possible values are: * Collator::OFF(default) * Collator::ON * Collator::DEFAULT_VALUE *

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const HIRAGANA_QUATERNARY_MODE = 6; /** *

* When turned on, this attribute generates a collation key for the numeric * value of substrings of digits. This is a way to get '100' to sort AFTER * '2'. *

*

* Possible values are: * Collator::OFF(default) * Collator::ON * Collator::DEFAULT_VALUE *

* @link https://php.net/manual/en/class.collator.php#intl.collator-constants */ public const NUMERIC_COLLATION = 7; public const SORT_REGULAR = 0; public const SORT_STRING = 1; public const SORT_NUMERIC = 2; /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a collator * @link https://php.net/manual/en/collator.construct.php * @param string $locale */ #[Pure] public function __construct(#[LanguageAware(['8.0' => 'string'], default: '')] $locale) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a collator * @link https://php.net/manual/en/collator.create.php * @param string $locale

* The locale containing the required collation rules. Special values for * locales can be passed in - if null is passed for the locale, the * default locale collation rules will be used. If empty string ("") or * "root" are passed, UCA rules will be used. *

* @return Collator|null Return new instance of Collator object, or NULL * on error. */ #[TentativeType] public static function create(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?Collator {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Compare two Unicode strings * @link https://php.net/manual/en/collator.compare.php * @param string $string1

* The first string to compare. *

* @param string $string2

* The second string to compare. *

* @return int|false Return comparison result:

*

*

* 1 if str1 is greater than * str2 ; *

*

* 0 if str1 is equal to * str2; *

*

* -1 if str1 is less than * str2 . *

* On error * boolean * FALSE * is returned. */ #[Pure] #[TentativeType] public function compare( #[LanguageAware(['8.0' => 'string'], default: '')] $string1, #[LanguageAware(['8.0' => 'string'], default: '')] $string2 ): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sort array using specified collator * @link https://php.net/manual/en/collator.sort.php * @param string[] &$array

* Array of strings to sort. *

* @param int $flags [optional]

* Optional sorting type, one of the following: *

*

* Collator::SORT_REGULAR * - compare items normally (don't change types) *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function sort( array &$array, #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Collator::SORT_REGULAR])] $flags = 0 ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sort array using specified collator and sort keys * @link https://php.net/manual/en/collator.sortwithsortkeys.php * @param string[] &$array

Array of strings to sort

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function sortWithSortKeys( array &$array, #[ElementAvailable(from: '5.3', to: '5.6')] $flags = [] ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sort array maintaining index association * @link https://php.net/manual/en/collator.asort.php * @param string[] &$array

Array of strings to sort.

* @param int $flags [optional]

* Optional sorting type, one of the following: * Collator::SORT_REGULAR * - compare items normally (don't change types) *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function asort( array &$array, #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Collator::SORT_REGULAR])] $flags = 0 ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get collation attribute value * @link https://php.net/manual/en/collator.getattribute.php * @param int $attribute

* Attribute to get value for. *

* @return int|false Attribute value, or boolean FALSE on error. */ #[Pure] #[TentativeType] public function getAttribute(#[LanguageAware(['8.0' => 'int'], default: '')] $attribute): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set collation attribute * @link https://php.net/manual/en/collator.setattribute.php * @param int $attribute

Attribute.

* @param int $value

* Attribute value. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setAttribute( #[LanguageAware(['8.0' => 'int'], default: '')] $attribute, #[LanguageAware(['8.0' => 'int'], default: '')] $value ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get current collation strength * @link https://php.net/manual/en/collator.getstrength.php * @return int current collation strength, or boolean FALSE on error. */ #[Pure] #[TentativeType] public function getStrength(): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set collation strength * @link https://php.net/manual/en/collator.setstrength.php * @param int $strength

Strength to set.

*

* Possible values are: * Collator::PRIMARY *

* @return bool TRUE on success or FALSE on failure. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setStrength(#[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Collator::PRIMARY])] $strength) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get collator's last error code * @link https://php.net/manual/en/collator.geterrorcode.php * @return int|false Error code returned by the last Collator API function call. */ #[Pure] #[TentativeType] public function getErrorCode(): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the locale name of the collator * @link https://php.net/manual/en/collator.getlocale.php * @param int $type

* You can choose between valid and actual locale ( * Locale::VALID_LOCALE and * Locale::ACTUAL_LOCALE, * respectively). *

* @return string|false Real locale name from which the collation data comes. If the collator was * instantiated from rules or an error occurred, returns * boolean FALSE. */ #[Pure] #[TentativeType] public function getLocale( #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Locale::VALID_LOCALE, Locale::ACTUAL_LOCALE])] $type ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get text for collator's last error code * @link https://php.net/manual/en/collator.geterrormessage.php * @return string|false Description of an error occurred in the last Collator API function call. */ #[Pure] #[TentativeType] public function getErrorMessage(): string|false {} /** * (PHP 5 >= 5.3.2, PECL intl >= 1.0.3)
* Get sorting key for a string * @link https://php.net/manual/en/collator.getsortkey.php * @param string $string

* The string to produce the key from. *

* @return string|false the collation key for the string. Collation keys can be compared directly instead of strings. */ #[Pure] #[TentativeType] public function getSortKey( #[LanguageAware(['8.0' => 'string'], default: '')] $string, #[ElementAvailable(from: '5.3', to: '5.6')] $arg2 ): string|false {} } class NumberFormatter { public const CURRENCY_ACCOUNTING = 12; /** * Decimal format defined by pattern * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PATTERN_DECIMAL = 0; /** * Decimal format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DECIMAL = 1; /** * Currency format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const CURRENCY = 2; /** * Percent format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PERCENT = 3; /** * Scientific format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const SCIENTIFIC = 4; /** * Spellout rule-based format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const SPELLOUT = 5; /** * Ordinal rule-based format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ORDINAL = 6; /** * Duration rule-based format * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DURATION = 7; /** * Rule-based format defined by pattern * @link https://php.net/manual/en/class.locale.php#intl.locale-constants */ public const PATTERN_RULEBASED = 9; /** * Alias for PATTERN_DECIMAL * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const IGNORE = 0; /** * Default format for the locale * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DEFAULT_STYLE = 1; /** * Rounding mode to round towards positive infinity. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_CEILING = 0; /** * Rounding mode to round towards negative infinity. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_FLOOR = 1; /** * Rounding mode to round towards zero. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_DOWN = 2; /** * Rounding mode to round away from zero. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_UP = 3; /** * Rounding mode to round towards the "nearest neighbor" unless both * neighbors are equidistant, in which case, round towards the even * neighbor. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_HALFEVEN = 4; /** * Rounding mode to round towards "nearest neighbor" unless both neighbors * are equidistant, in which case round down. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_HALFDOWN = 5; /** * Rounding mode to round towards "nearest neighbor" unless both neighbors * are equidistant, in which case round up. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUND_HALFUP = 6; /** * Pad characters inserted before the prefix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PAD_BEFORE_PREFIX = 0; /** * Pad characters inserted after the prefix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PAD_AFTER_PREFIX = 1; /** * Pad characters inserted before the suffix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PAD_BEFORE_SUFFIX = 2; /** * Pad characters inserted after the suffix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PAD_AFTER_SUFFIX = 3; /** * Parse integers only. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PARSE_INT_ONLY = 0; /** * Use grouping separator. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const GROUPING_USED = 1; /** * Always show decimal point. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DECIMAL_ALWAYS_SHOWN = 2; /** * Maximum integer digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MAX_INTEGER_DIGITS = 3; /** * Minimum integer digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MIN_INTEGER_DIGITS = 4; /** * Integer digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const INTEGER_DIGITS = 5; /** * Maximum fraction digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MAX_FRACTION_DIGITS = 6; /** * Minimum fraction digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MIN_FRACTION_DIGITS = 7; /** * Fraction digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const FRACTION_DIGITS = 8; /** * Multiplier. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MULTIPLIER = 9; /** * Grouping size. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const GROUPING_SIZE = 10; /** * Rounding Mode. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUNDING_MODE = 11; /** * Rounding increment. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ROUNDING_INCREMENT = 12; /** * The width to which the output of format() is padded. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const FORMAT_WIDTH = 13; /** * The position at which padding will take place. See pad position * constants for possible argument values. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PADDING_POSITION = 14; /** * Secondary grouping size. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const SECONDARY_GROUPING_SIZE = 15; /** * Use significant digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const SIGNIFICANT_DIGITS_USED = 16; /** * Minimum significant digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MIN_SIGNIFICANT_DIGITS = 17; /** * Maximum significant digits. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MAX_SIGNIFICANT_DIGITS = 18; /** * Lenient parse mode used by rule-based formats. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const LENIENT_PARSE = 19; /** * Positive prefix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const POSITIVE_PREFIX = 0; /** * Positive suffix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const POSITIVE_SUFFIX = 1; /** * Negative prefix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const NEGATIVE_PREFIX = 2; /** * Negative suffix. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const NEGATIVE_SUFFIX = 3; /** * The character used to pad to the format width. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PADDING_CHARACTER = 4; /** * The ISO currency code. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const CURRENCY_CODE = 5; /** * The default rule set. This is only available with rule-based * formatters. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DEFAULT_RULESET = 6; /** * The public rule sets. This is only available with rule-based * formatters. This is a read-only attribute. The public rulesets are * returned as a single string, with each ruleset name delimited by ';' * (semicolon). * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PUBLIC_RULESETS = 7; /** * The decimal separator. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DECIMAL_SEPARATOR_SYMBOL = 0; /** * The grouping separator. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const GROUPING_SEPARATOR_SYMBOL = 1; /** * The pattern separator. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PATTERN_SEPARATOR_SYMBOL = 2; /** * The percent sign. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PERCENT_SYMBOL = 3; /** * Zero. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ZERO_DIGIT_SYMBOL = 4; /** * Character representing a digit in the pattern. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DIGIT_SYMBOL = 5; /** * The minus sign. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MINUS_SIGN_SYMBOL = 6; /** * The plus sign. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PLUS_SIGN_SYMBOL = 7; /** * The currency symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const CURRENCY_SYMBOL = 8; /** * The international currency symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const INTL_CURRENCY_SYMBOL = 9; /** * The monetary separator. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MONETARY_SEPARATOR_SYMBOL = 10; /** * The exponential symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const EXPONENTIAL_SYMBOL = 11; /** * Per mill symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PERMILL_SYMBOL = 12; /** * Escape padding character. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PAD_ESCAPE_SYMBOL = 13; /** * Infinity symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const INFINITY_SYMBOL = 14; /** * Not-a-number symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const NAN_SYMBOL = 15; /** * Significant digit symbol. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const SIGNIFICANT_DIGIT_SYMBOL = 16; /** * The monetary grouping separator. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const MONETARY_GROUPING_SEPARATOR_SYMBOL = 17; /** * Derive the type from variable type * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const TYPE_DEFAULT = 0; /** * Format/parse as 32-bit integer * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const TYPE_INT32 = 1; /** * Format/parse as 64-bit integer * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const TYPE_INT64 = 2; /** * Format/parse as floating point value * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const TYPE_DOUBLE = 3; /** * Format/parse as currency value * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants * @deprecated 8.3 */ public const TYPE_CURRENCY = 4; /** * @since 8.4 */ public const ROUND_TOWARD_ZERO = 2; /** * @since 8.4 */ public const ROUND_AWAY_FROM_ZERO = 3; /** * @since 8.4 */ public const ROUND_HALFODD = 8; /** * @link https://www.php.net/manual/en/class.numberformatter.php * @param string $locale * @param int $style * @param string $pattern [optional] */ #[Pure] public function __construct( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([NumberFormatter::DECIMAL, NumberFormatter::PATTERN_DECIMAL, NumberFormatter::PATTERN_RULEBASED, NumberFormatter::CURRENCY, NumberFormatter::PERCENT, NumberFormatter::SCIENTIFIC, NumberFormatter::SPELLOUT, NumberFormatter::ORDINAL, NumberFormatter::DURATION, NumberFormatter::PATTERN_RULEBASED, NumberFormatter::CURRENCY_ACCOUNTING, NumberFormatter::DEFAULT_STYLE, NumberFormatter::IGNORE])] $style, #[LanguageAware(['8.0' => 'string|null'], default: '')] $pattern = null ) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a number formatter * @link https://php.net/manual/en/numberformatter.create.php * @param string $locale

* Locale in which the number would be formatted (locale name, e.g. en_CA). *

* @param int $style

* Style of the formatting, one of the * format style constants. If * NumberFormatter::PATTERN_DECIMAL * or NumberFormatter::PATTERN_RULEBASED * is passed then the number format is opened using the given pattern, * which must conform to the syntax described in * ICU DecimalFormat * documentation or * ICU RuleBasedNumberFormat * documentation, respectively. *

* @param string $pattern [optional]

* Pattern string if the chosen style requires a pattern. *

* @return NumberFormatter|false NumberFormatter object or FALSE on error. */ #[TentativeType] public static function create( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([NumberFormatter::PATTERN_DECIMAL, NumberFormatter::PATTERN_RULEBASED, NumberFormatter::CURRENCY, NumberFormatter::PERCENT, NumberFormatter::SCIENTIFIC, NumberFormatter::SPELLOUT, NumberFormatter::ORDINAL, NumberFormatter::DURATION, NumberFormatter::PATTERN_RULEBASED, NumberFormatter::CURRENCY_ACCOUNTING, NumberFormatter::DEFAULT_STYLE, NumberFormatter::IGNORE])] $style, #[LanguageAware(['8.0' => 'string|null'], default: '')] $pattern = null ): ?NumberFormatter {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format a number * @link https://php.net/manual/en/numberformatter.format.php * @param int|float $num

* The value to format. Can be integer or float, * other values will be converted to a numeric value. *

* @param int $type [optional]

* The * formatting type to use. *

* @return string|false the string containing formatted value, or FALSE on error. */ #[Pure] #[TentativeType] public function format( #[LanguageAware(['8.0' => 'int|float'], default: '')] $num, #[LanguageAware(['8.0' => 'int'], default: '')] $type = 0 ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse a number * @link https://php.net/manual/en/numberformatter.parse.php * @param string $string * @param int $type [optional]

* The * formatting type to use. By default, * NumberFormatter::TYPE_DOUBLE is used. *

* @param int &$offset [optional]

* Offset in the string at which to begin parsing. On return, this value * will hold the offset at which parsing ended. *

* @return mixed The value of the parsed number or FALSE on error. */ #[TentativeType] public function parse( #[LanguageAware(['8.0' => 'string'], default: '')] $string, #[LanguageAware(['8.0' => 'int'], default: '')] $type = NumberFormatter::TYPE_DOUBLE, &$offset = null ): int|float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format a currency value * @link https://php.net/manual/en/numberformatter.formatcurrency.php * @param float $amount

* The numeric currency value. *

* @param string $currency

* The 3-letter ISO 4217 currency code indicating the currency to use. *

* @return string|false String representing the formatted currency value. */ #[Pure] #[TentativeType] public function formatCurrency( #[LanguageAware(['8.0' => 'float'], default: '')] $amount, #[LanguageAware(['8.0' => 'string'], default: '')] $currency ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse a currency number * @link https://php.net/manual/en/numberformatter.parsecurrency.php * @param string $string * @param string &$currency

* Parameter to receive the currency name (3-letter ISO 4217 currency * code). *

* @param int &$offset [optional]

* Offset in the string at which to begin parsing. On return, this value * will hold the offset at which parsing ended. *

* @return float|false The parsed numeric value or FALSE on error. */ #[TentativeType] public function parseCurrency(#[LanguageAware(['8.0' => 'string'], default: '')] $string, &$currency, &$offset = null): float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set an attribute * @link https://php.net/manual/en/numberformatter.setattribute.php * @param int $attribute

* Attribute specifier - one of the * numeric attribute constants. *

* @param int $value

* The attribute value. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setAttribute( #[LanguageAware(['8.0' => 'int'], default: '')] $attribute, #[LanguageAware(['8.0' => 'int|float'], default: '')] $value ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get an attribute * @link https://php.net/manual/en/numberformatter.getattribute.php * @param int $attribute

* Attribute specifier - one of the * numeric attribute constants. *

* @return int|float|false Return attribute value on success, or FALSE on error. */ #[Pure] #[TentativeType] public function getAttribute(#[LanguageAware(['8.0' => 'int'], default: '')] $attribute): int|float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set a text attribute * @link https://php.net/manual/en/numberformatter.settextattribute.php * @param int $attribute

* Attribute specifier - one of the * text attribute * constants. *

* @param string $value

* Text for the attribute value. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setTextAttribute( #[LanguageAware(['8.0' => 'int'], default: '')] $attribute, #[LanguageAware(['8.0' => 'string'], default: '')] $value ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get a text attribute * @link https://php.net/manual/en/numberformatter.gettextattribute.php * @param int $attribute

* Attribute specifier - one of the * text attribute constants. *

* @return string|false Return attribute value on success, or FALSE on error. */ #[Pure] #[TentativeType] public function getTextAttribute(#[LanguageAware(['8.0' => 'int'], default: '')] $attribute): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set a symbol value * @link https://php.net/manual/en/numberformatter.setsymbol.php * @param int $symbol

* Symbol specifier, one of the * format symbol constants. *

* @param string $value

* Text for the symbol. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setSymbol( #[LanguageAware(['8.0' => 'int'], default: '')] $symbol, #[LanguageAware(['8.0' => 'string'], default: '')] $value ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get a symbol value * @link https://php.net/manual/en/numberformatter.getsymbol.php * @param int $symbol

* Symbol specifier, one of the * format symbol constants. *

* @return string|false The symbol string or FALSE on error. */ #[Pure] #[TentativeType] public function getSymbol(#[LanguageAware(['8.0' => 'int'], default: '')] $symbol): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set formatter pattern * @link https://php.net/manual/en/numberformatter.setpattern.php * @param string $pattern

* Pattern in syntax described in * ICU DecimalFormat * documentation. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setPattern(#[LanguageAware(['8.0' => 'string'], default: '')] $pattern): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter pattern * @link https://php.net/manual/en/numberformatter.getpattern.php * @return string|false Pattern string that is used by the formatter, or FALSE if an error happens. */ #[Pure] #[TentativeType] public function getPattern(): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter locale * @link https://php.net/manual/en/numberformatter.getlocale.php * @param int $type [optional]

* You can choose between valid and actual locale ( * Locale::VALID_LOCALE, * Locale::ACTUAL_LOCALE, * respectively). The default is the actual locale. *

* @return string|false The locale name used to create the formatter. */ #[Pure] #[TentativeType] public function getLocale( #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Locale::VALID_LOCALE, Locale::ACTUAL_LOCALE])] $type = 0 ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter's last error code. * @link https://php.net/manual/en/numberformatter.geterrorcode.php * @return int error code from last formatter call. */ #[Pure] #[TentativeType] public function getErrorCode(): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter's last error message. * @link https://php.net/manual/en/numberformatter.geterrormessage.php * @return string error message from last formatter call. */ #[Pure] #[TentativeType] public function getErrorMessage(): string {} } class Normalizer { public const NFKC_CF = 48; public const FORM_KC_CF = 48; /** * Default normalization options * @link https://secure.php.net/manual/en/class.normalizer.php */ public const OPTION_DEFAULT = ""; /** * No decomposition/composition * @link https://secure.php.net/manual/en/class.normalizer.php * @removed 8.0 */ public const NONE = "1"; /** * Normalization Form D (NFD) - Canonical Decomposition * @link https://secure.php.net/manual/en/class.normalizer.php */ public const FORM_D = 4; public const NFD = 4; /** * Normalization Form KD (NFKD) - Compatibility Decomposition * @link https://secure.php.net/manual/en/class.normalizer.php */ public const FORM_KD = 8; public const NFKD = 8; /** * Normalization Form C (NFC) - Canonical Decomposition followed by * Canonical Composition * @link https://secure.php.net/manual/en/class.normalizer.php */ public const FORM_C = 16; public const NFC = 16; /** * Normalization Form KC (NFKC) - Compatibility Decomposition, followed by * Canonical Composition * @link https://secure.php.net/manual/en/class.normalizer.php */ public const FORM_KC = 32; public const NFKC = 32; /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Normalizes the input provided and returns the normalized string * @link https://php.net/manual/en/normalizer.normalize.php * @param string $string

The input string to normalize

* @param int $form

One of the normalization forms.

* @return string|false The normalized string or FALSE if an error occurred. */ #[TentativeType] public static function normalize( #[LanguageAware(['8.0' => 'string'], default: '')] $string, #[ElementAvailable(from: '5.3', to: '5.6')] $form, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $form = Normalizer::FORM_C, #[ElementAvailable(from: '5.3', to: '5.6')] $arg3 ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Checks if the provided string is already in the specified normalization form. * @link https://php.net/manual/en/normalizer.isnormalized.php * @param string $string

The input string to normalize

* @param int $form

* One of the normalization forms. *

* @return bool TRUE if normalized, FALSE otherwise or if there an error */ #[TentativeType] public static function isNormalized( #[LanguageAware(['8.0' => 'string'], default: '')] $string, #[ElementAvailable(from: '5.3', to: '5.6')] $form, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $form = Normalizer::FORM_C, #[ElementAvailable(from: '5.3', to: '5.6')] $arg3 ): bool {} /** * @param string $string

The input string to normalize

* @param int $form * @return string|null

Returns a string containing the Decomposition_Mapping property, if present in the UCD. * Returns null if there is no Decomposition_Mapping property for the character.

* @link https://www.php.net/manual/en/normalizer.getrawdecomposition.php * @since 7.3 */ #[TentativeType] public static function getRawDecomposition( string $string, #[ElementAvailable(from: '8.0')] int $form = 16 ): ?string {} } class Locale { /** * This is locale the data actually comes from. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const ACTUAL_LOCALE = 0; /** * This is the most specific locale supported by ICU. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const VALID_LOCALE = 1; /** * Used as locale parameter with the methods of the various locale affected classes, * such as NumberFormatter. This constant would make the methods to use default * locale. * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const DEFAULT_LOCALE = null; /** * Language subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const LANG_TAG = "language"; /** * Extended language subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const EXTLANG_TAG = "extlang"; /** * Script subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const SCRIPT_TAG = "script"; /** * Region subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const REGION_TAG = "region"; /** * Variant subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const VARIANT_TAG = "variant"; /** * Grandfathered Language subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const GRANDFATHERED_LANG_TAG = "grandfathered"; /** * Private subtag * @link https://php.net/manual/en/class.numberformatter.php#intl.numberformatter-constants */ public const PRIVATE_TAG = "private"; /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the default locale value from the INTL global 'default_locale' * @link https://php.net/manual/en/locale.getdefault.php * @return string The current runtime locale */ #[TentativeType] public static function getDefault(): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* sets the default runtime locale * @link https://php.net/manual/en/locale.setdefault.php * @param string $locale

* Is a BCP 47 compliant language tag containing the *

* @return bool TRUE on success or FALSE on failure. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public static function setDefault(#[LanguageAware(['8.0' => 'string'], default: '')] $locale) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the primary language for the input locale * @link https://php.net/manual/en/locale.getprimarylanguage.php * @param string $locale

* The locale to extract the primary language code from *

* @return string|null The language code associated with the language or NULL in case of error. */ #[TentativeType] public static function getPrimaryLanguage(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the script for the input locale * @link https://php.net/manual/en/locale.getscript.php * @param string $locale

* The locale to extract the script code from *

* @return string|null The script subtag for the locale or NULL if not present */ #[TentativeType] public static function getScript(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the region for the input locale * @link https://php.net/manual/en/locale.getregion.php * @param string $locale

* The locale to extract the region code from *

* @return string|null The region subtag for the locale or NULL if not present */ #[TentativeType] public static function getRegion(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the keywords for the input locale * @link https://php.net/manual/en/locale.getkeywords.php * @param string $locale

* The locale to extract the keywords from *

* @return array|false|null Associative array containing the keyword-value pairs for this locale */ #[TentativeType] public static function getKeywords(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): array|false|null {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for script of the input locale * @link https://php.net/manual/en/locale.getdisplayscript.php * @param string $locale

* The locale to return a display script for *

* @param string $displayLocale

* Optional format locale to use to display the script name *

* @return string|false Display name of the script for the $locale in the format appropriate for * $in_locale. */ #[TentativeType] public static function getDisplayScript( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $displayLocale, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string|null'], default: '')] $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for region of the input locale * @link https://php.net/manual/en/locale.getdisplayregion.php * @param string $locale

* The locale to return a display region for. *

* @param string $displayLocale

* Optional format locale to use to display the region name *

* @return string|false display name of the region for the $locale in the format appropriate for * $in_locale. */ #[TentativeType] public static function getDisplayRegion( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $displayLocale, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string|null'], default: '')] $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for the input locale * @link https://php.net/manual/en/locale.getdisplayname.php * @param string $locale

* The locale to return a display name for. *

* @param string $displayLocale

optional format locale

* @return string|false Display name of the locale in the format appropriate for $in_locale. */ #[TentativeType] public static function getDisplayName( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $displayLocale, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string|null'], default: '')] $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for language of the inputlocale * @link https://php.net/manual/en/locale.getdisplaylanguage.php * @param string $locale

* The locale to return a display language for *

* @param string $displayLocale

* Optional format locale to use to display the language name *

* @return string|false display name of the language for the $locale in the format appropriate for * $in_locale. */ #[TentativeType] public static function getDisplayLanguage( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $displayLocale, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string|null'], default: '')] $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for variants of the input locale * @link https://php.net/manual/en/locale.getdisplayvariant.php * @param string $locale

* The locale to return a display variant for *

* @param string $displayLocale

* Optional format locale to use to display the variant name *

* @return string|false Display name of the variant for the $locale in the format appropriate for * $in_locale. */ #[TentativeType] public static function getDisplayVariant( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $displayLocale, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string|null'], default: '')] $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns a correctly ordered and delimited locale ID * @link https://php.net/manual/en/locale.composelocale.php * @param array $subtags

* an array containing a list of key-value pairs, where the keys identify * the particular locale ID subtags, and the values are the associated * subtag values. *

* The 'variant' and 'private' subtags can take maximum 15 values * whereas 'extlang' can take maximum 3 values.e.g. Variants are allowed * with the suffix ranging from 0-14. Hence the keys for the input array * can be variant0, variant1, ...,variant14. In the returned locale id, * the subtag is ordered by suffix resulting in variant0 followed by * variant1 followed by variant2 and so on. *

*

* The 'variant', 'private' and 'extlang' multiple values can be specified both * as array under specific key (e.g. 'variant') and as multiple numbered keys * (e.g. 'variant0', 'variant1', etc.). *

*

* @return string|false The corresponding locale identifier. */ #[TentativeType] public static function composeLocale(array $subtags): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns a key-value array of locale ID subtag elements. * @link https://php.net/manual/en/locale.parselocale.php * @param string $locale

* The locale to extract the subtag array from. Note: The 'variant' and * 'private' subtags can take maximum 15 values whereas 'extlang' can take * maximum 3 values. *

* @return array|null an array containing a list of key-value pairs, where the keys * identify the particular locale ID subtags, and the values are the * associated subtag values. The array will be ordered as the locale id * subtags e.g. in the locale id if variants are '-varX-varY-varZ' then the * returned array will have variant0=>varX , variant1=>varY , * variant2=>varZ */ #[TentativeType] public static function parseLocale(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?array {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the variants for the input locale * @link https://php.net/manual/en/locale.getallvariants.php * @param string $locale

* The locale to extract the variants from *

* @return array|null The array containing the list of all variants subtag for the locale * or NULL if not present */ #[TentativeType] public static function getAllVariants(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?array {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Checks if a language tag filter matches with locale * @link https://php.net/manual/en/locale.filtermatches.php * @param string $languageTag

* The language tag to check *

* @param string $locale

* The language range to check against *

* @param bool $canonicalize

* If true, the arguments will be converted to canonical form before * matching. *

* @return bool|null TRUE if $locale matches $langtag FALSE otherwise. */ #[TentativeType] public static function filterMatches( #[LanguageAware(['8.0' => 'string'], default: '')] $languageTag, #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $canonicalize, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'bool'], default: '')] $canonicalize = false ): ?bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Searches the language tag list for the best match to the language * @link https://php.net/manual/en/locale.lookup.php * @param array $languageTag

* An array containing a list of language tags to compare to * locale. Maximum 100 items allowed. *

* @param string $locale

* The locale to use as the language range when matching. *

* @param bool $canonicalize

* If true, the arguments will be converted to canonical form before * matching. *

* @param string $defaultLocale

* The locale to use if no match is found. *

* @return string|null The closest matching language tag or default value. */ #[TentativeType] public static function lookup( array $languageTag, #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '5.6')] $canonicalize, #[ElementAvailable(from: '5.3', to: '5.6')] $defaultLocale, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'bool'], default: '')] $canonicalize = false, #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string|null'], default: '')] $defaultLocale = null ): ?string {} /** * @link https://php.net/manual/en/locale.canonicalize.php * @param string $locale * @return string|null */ #[TentativeType] public static function canonicalize(#[LanguageAware(['8.0' => 'string'], default: '')] $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Tries to find out best available locale based on HTTP "Accept-Language" header * @link https://php.net/manual/en/locale.acceptfromhttp.php * @param string $header

* The string containing the "Accept-Language" header according to format in RFC 2616. *

* @return string|false The corresponding locale identifier. */ #[TentativeType] public static function acceptFromHttp(#[LanguageAware(['8.0' => 'string'], default: '')] $header): string|false {} } class MessageFormatter { /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Constructs a new Message Formatter * @link https://php.net/manual/en/messageformatter.create.php * @param string $locale

* The locale to use when formatting arguments *

* @param string $pattern

* The pattern string to stick arguments into. * The pattern uses an 'apostrophe-friendly' syntax; it is run through * umsg_autoQuoteApostrophe * before being interpreted. *

* @throws IntlException on failure. */ #[Pure] public function __construct( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'string'], default: '')] $pattern ) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Constructs a new Message Formatter * @link https://php.net/manual/en/messageformatter.create.php * @param string $locale

* The locale to use when formatting arguments *

* @param string $pattern

* The pattern string to stick arguments into. * The pattern uses an 'apostrophe-friendly' syntax; it is run through * umsg_autoQuoteApostrophe * before being interpreted. *

* @return MessageFormatter|null The formatter object */ #[TentativeType] public static function create( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'string'], default: '')] $pattern ): ?MessageFormatter {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format the message * @link https://php.net/manual/en/messageformatter.format.php * @param array $values

* Arguments to insert into the format string *

* @return string|false The formatted string, or FALSE if an error occurred */ #[Pure] #[TentativeType] public function format(array $values): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Quick format message * @link https://php.net/manual/en/messageformatter.formatmessage.php * @param string $locale

* The locale to use for formatting locale-dependent parts *

* @param string $pattern

* The pattern string to insert things into. * The pattern uses an 'apostrophe-friendly' syntax; it is run through * umsg_autoQuoteApostrophe * before being interpreted. *

* @param array $values

* The array of values to insert into the format string *

* @return string|false The formatted pattern string or FALSE if an error occurred */ #[TentativeType] public static function formatMessage( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'string'], default: '')] $pattern, array $values ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse input string according to pattern * @link https://php.net/manual/en/messageformatter.parse.php * @param string $string

* The string to parse *

* @return array|false An array containing the items extracted, or FALSE on error */ #[Pure] #[TentativeType] public function parse(#[LanguageAware(['8.0' => 'string'], default: '')] $string): array|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Quick parse input string * @link https://php.net/manual/en/messageformatter.parsemessage.php * @param string $locale

* The locale to use for parsing locale-dependent parts *

* @param string $pattern

* The pattern with which to parse the value. *

* @param string $message

* The string to parse, conforming to the pattern. *

* @return array|false An array containing items extracted, or FALSE on error */ #[TentativeType] public static function parseMessage( #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'string'], default: '')] $pattern, #[LanguageAware(['8.0' => 'string'], default: '')] $message ): array|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the pattern used by the formatter * @link https://php.net/manual/en/messageformatter.setpattern.php * @param string $pattern

* The pattern string to use in this message formatter. * The pattern uses an 'apostrophe-friendly' syntax; it is run through * umsg_autoQuoteApostrophe * before being interpreted. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setPattern(#[LanguageAware(['8.0' => 'string'], default: '')] $pattern): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the pattern used by the formatter * @link https://php.net/manual/en/messageformatter.getpattern.php * @return string|false The pattern string for this message formatter */ #[Pure] #[TentativeType] public function getPattern(): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the locale for which the formatter was created. * @link https://php.net/manual/en/messageformatter.getlocale.php * @return string The locale name */ #[Pure] #[TentativeType] public function getLocale(): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error code from last operation * @link https://php.net/manual/en/messageformatter.geterrorcode.php * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. */ #[Pure] #[TentativeType] public function getErrorCode(): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error text from the last operation * @link https://php.net/manual/en/messageformatter.geterrormessage.php * @return string Description of the last error. */ #[Pure] #[TentativeType] public function getErrorMessage(): string {} } class IntlDateFormatter { /** * Completely specified style (Tuesday, April 12, 1952 AD or 3:30:42pm PST) * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const FULL = 0; /** * Long style (January 12, 1952 or 3:30:32pm) * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const LONG = 1; /** * Medium style (Jan 12, 1952) * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const MEDIUM = 2; /** * Most abbreviated style, only essential data (12/13/52 or 3:30pm) * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const SHORT = 3; /** * Do not include this element * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const NONE = -1; /** * Gregorian Calendar * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const GREGORIAN = 1; /** * Non-Gregorian Calendar * @link https://php.net/manual/en/class.intldateformatter.php#intl.intldateformatter-constants */ public const TRADITIONAL = 0; public const RELATIVE_FULL = 128; public const RELATIVE_LONG = 129; public const RELATIVE_MEDIUM = 130; public const RELATIVE_SHORT = 131; public const PATTERN = -2; /** * @param string|null $locale * @param int $dateType * @param int $timeType * @param mixed|null $timezone [optional] * @param mixed|null $calendar [optional] * @param string $pattern [optional] */ #[Pure] public function __construct( #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '8.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $dateType, #[ElementAvailable(from: '5.3', to: '8.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $timeType, #[ElementAvailable(from: '8.1')] int $dateType = 0, #[ElementAvailable(from: '8.1')] int $timeType = 0, $timezone = null, $calendar = null, #[LanguageAware(['8.0' => 'string|null'], default: '')] $pattern = null ) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a date formatter * @link https://php.net/manual/en/intldateformatter.create.php * @param string $locale

* Locale to use when formatting or parsing; default is specified in the ini setting intl.default_locale. *

* @param int $dateType

* Date type to use (none, * short, medium, * long, full). * This is one of the * IntlDateFormatter constants. *

* @param int $timeType

* Time type to use (none, * short, medium, * long, full). * This is one of the * IntlDateFormatter constants. *

* @param string $timezone [optional]

* Time zone ID, default is system default. *

* @param int $calendar [optional]

* Calendar to use for formatting or parsing; default is Gregorian. * This is one of the * IntlDateFormatter calendar constants. *

* @param string $pattern [optional]

* Optional pattern to use when formatting or parsing. * Possible patterns are documented at http://userguide.icu-project.org/formatparse/datetime. *

* @return IntlDateFormatter|null */ #[TentativeType] public static function create( #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale, #[ElementAvailable(from: '5.3', to: '8.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $dateType, #[ElementAvailable(from: '5.3', to: '8.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $timeType, #[ElementAvailable(from: '8.1')] int $dateType = 0, #[ElementAvailable(from: '8.1')] int $timeType = 0, $timezone = null, #[LanguageAware(['8.0' => 'IntlCalendar|int|null'], default: '')] $calendar = null, #[LanguageAware(['8.0' => 'string|null'], default: '')] $pattern = null ): ?IntlDateFormatter {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the datetype used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.getdatetype.php * @return int|false The current date type value of the formatter. */ #[Pure] #[TentativeType] public function getDateType(): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the timetype used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.gettimetype.php * @return int|false The current date type value of the formatter. */ #[Pure] #[TentativeType] public function getTimeType(): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the calendar used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.getcalendar.php * @return int|false The calendar being used by the formatter. */ #[Pure] #[TentativeType] public function getCalendar(): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* sets the calendar used to the appropriate calendar, which must be * @link https://php.net/manual/en/intldateformatter.setcalendar.php * @param int $calendar

* The calendar to use. * Default is IntlDateFormatter::GREGORIAN. *

* @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function setCalendar(#[LanguageAware(['8.0' => 'IntlCalendar|int|null'], default: '')] $calendar): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the timezone-id used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.gettimezoneid.php * @return string|false ID string for the time zone used by this formatter. */ #[Pure] #[TentativeType] public function getTimeZoneId(): string|false {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Get copy of formatter's calendar object * @link https://secure.php.net/manual/en/intldateformatter.getcalendarobject.php * @return IntlCalendar|false|null A copy of the internal calendar object used by this formatter. */ #[Pure] #[TentativeType] public function getCalendarObject(): IntlCalendar|false|null {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Get formatter's timezone * @link https://secure.php.net/manual/en/intldateformatter.gettimezone.php * @return IntlTimeZone|false The associated IntlTimeZone object or FALSE on failure. */ #[Pure] #[TentativeType] public function getTimeZone(): IntlTimeZone|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sets the time zone to use * @link https://php.net/manual/en/intldateformatter.settimezoneid.php * @param string $zone

* The time zone ID string of the time zone to use. * If NULL or the empty string, the default time zone for the runtime is used. *

* @return bool TRUE on success or FALSE on failure. * @removed 7.0 * @see IntlDateFormatter::setTimeZone() */ #[Deprecated(replacement: "%class%->setTimeZone(%parametersList%)", since: "5.5")] public function setTimeZoneId($zone) {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Sets formatter's timezone * @link https://php.net/manual/en/intldateformatter.settimezone.php * @param mixed $timezone

* The timezone to use for this formatter. This can be specified in the * following forms: *

    *
  • *

    * NULL, in which case the default timezone will be used, as specified in * the ini setting {@link "https://secure.php.net/manual/en/datetime.configuration.php#ini.date.timezone" date.timezone} or * through the function {@link "https://secure.php.net/manual/en/function.date-default-timezone-set.php" date_default_timezone_set()} and as * returned by {@link "https://secure.php.net/manual/en/function.date-default-timezone-get.php" date_default_timezone_get()}. *

    *
  • *
  • *

    * An {@link "https://secure.php.net/manual/en/class.intltimezone.php" IntlTimeZone}, which will be used directly. *

    *
  • *
  • *

    * A {@link "https://secure.php.net/manual/en/class.datetimezone.php" DateTimeZone}. Its identifier will be extracted * and an ICU timezone object will be created; the timezone will be backed * by ICU's database, not PHP's. *

    *
  • *
  • *

    * A {@link "https://secure.php.net/manual/en/language.types.string.php" string}, which should be a valid ICU timezone identifier. * See IntlTimeZone::createTimeZoneIDEnumeration(). Raw offsets such as "GMT+08:30" are also accepted. *

    *
  • *
*

* @return bool|null TRUE on success or FALSE on failure. */ #[TentativeType] #[LanguageAware(['8.3' => 'bool'], default: 'bool|null')] public function setTimeZone($timezone) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the pattern used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.setpattern.php * @param string $pattern

* New pattern string to use. * Possible patterns are documented at http://userguide.icu-project.org/formatparse/datetime. *

* @return bool TRUE on success or FALSE on failure. * Bad formatstrings are usually the cause of the failure. */ #[TentativeType] public function setPattern(#[LanguageAware(['8.0' => 'string'], default: '')] $pattern): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the pattern used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.getpattern.php * @return string|false The pattern string being used to format/parse. */ #[Pure] #[TentativeType] public function getPattern(): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the locale used by formatter * @link https://php.net/manual/en/intldateformatter.getlocale.php * @param int $type [optional] * @return string|false the locale of this formatter or 'false' if error */ #[Pure] #[TentativeType] public function getLocale( #[ElementAvailable(from: '8.0')] #[LanguageAware(['8.0' => 'int'], default: '')] $type = 0 ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the leniency of the parser * @link https://php.net/manual/en/intldateformatter.setlenient.php * @param bool $lenient

* Sets whether the parser is lenient or not, default is TRUE (lenient). *

* @return void */ #[TentativeType] public function setLenient(#[LanguageAware(['8.0' => 'bool'], default: '')] $lenient): void {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the lenient used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.islenient.php * @return bool TRUE if parser is lenient, FALSE if parser is strict. By default the parser is lenient. */ #[Pure] #[TentativeType] public function isLenient(): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format the date/time value as a string * @link https://php.net/manual/en/intldateformatter.format.php * @param mixed $datetime

* Value to format. This may be a DateTime object, * an integer representing a Unix timestamp value (seconds * since epoch, UTC) or an array in the format output by * localtime. *

* @return string|false The formatted string or, if an error occurred, FALSE. */ #[TentativeType] public function format( #[ElementAvailable(from: '5.3', to: '7.4')] $datetime = null, #[ElementAvailable(from: '8.0')] $datetime, #[ElementAvailable(from: '5.3', to: '7.4')] $array = null ): string|false {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Formats an object * @link https://secure.php.net/manual/en/intldateformatter.formatobject.php * @param object $datetime

* An object of type {@link "https://secure.php.net/manual/en/class.intlcalendar.php" IntlCalendar} or {@link "https://secure.php.net/manual/en/class.datetime.php" DateTime}. The timezone information in the object will be used. *

* @param mixed $format [optional]

* How to format the date/time. This can either be an {@link "https://secure.php.net/manual/en/language.types.array.php" array} with * two elements (first the date style, then the time style, these being one * of the constants IntlDateFormatter::NONE, * IntlDateFormatter::SHORT, * IntlDateFormatter::MEDIUM, * IntlDateFormatter::LONG, * IntlDateFormatter::FULL), a long with * the value of one of these constants (in which case it will be used both * for the time and the date) or a {@link "https://secure.php.net/manual/en/language.types.string.php" string} with the format * described in {@link "http://www.icu-project.org/apiref/icu4c/classSimpleDateFormat.html#details" the ICU documentation}. * If NULL, the default style will be used. *

* @param string|null $locale [optional]

* The locale to use, or NULL to use the {@link "https://secure.php.net/manual/en/intl.configuration.php#ini.intl.default-locale" default one}.

* @return string|false A string with result or FALSE on failure. */ #[TentativeType] public static function formatObject($datetime, $format = null, #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale = null): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse string to a timestamp value * @link https://php.net/manual/en/intldateformatter.parse.php * @param string $string

* string to convert to a time *

* @param int &$offset [optional]

* Position at which to start the parsing in $value (zero-based). * If no error occurs before $value is consumed, $parse_pos will contain -1 * otherwise it will contain the position at which parsing ended (and the error occurred). * This variable will contain the end position if the parse fails. * If $parse_pos > strlen($value), the parse fails immediately. *

* @return int|float|false timestamp parsed value */ #[TentativeType] public function parse(#[LanguageAware(['8.0' => 'string'], default: '')] $string, &$offset = null): int|float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse string to a field-based time value * @link https://php.net/manual/en/intldateformatter.localtime.php * @param string $string

* string to convert to a time *

* @param int &$offset [optional]

* Position at which to start the parsing in $value (zero-based). * If no error occurs before $value is consumed, $parse_pos will contain -1 * otherwise it will contain the position at which parsing ended . * If $parse_pos > strlen($value), the parse fails immediately. *

* @return array|false Localtime compatible array of integers : contains 24 hour clock value in tm_hour field */ #[TentativeType] public function localtime(#[LanguageAware(['8.0' => 'string'], default: '')] $string, &$offset = null): array|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error code from last operation * @link https://php.net/manual/en/intldateformatter.geterrorcode.php * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. */ #[Pure] #[TentativeType] public function getErrorCode(): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error text from the last operation. * @link https://php.net/manual/en/intldateformatter.geterrormessage.php * @return string Description of the last error. */ #[Pure] #[TentativeType] public function getErrorMessage(): string {} /** * @since 8.4 */ public function parseToCalendar(string $string, &$offset = null): int|float|false {} } class ResourceBundle implements IteratorAggregate, Countable { /** * @link https://www.php.net/manual/en/resourcebundle.create.php * @param string $locale

Locale for which the resources should be loaded (locale name, e.g. en_CA).

* @param string $bundle

The directory where the data is stored or the name of the .dat file.

* @param bool $fallback [optional]

Whether locale should match exactly or fallback to parent locale is allowed.

*/ #[Pure] public function __construct( #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale, #[LanguageAware(['8.0' => 'string|null'], default: '')] $bundle, #[LanguageAware(['8.0' => 'bool'], default: '')] $fallback = true ) {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Create a resource bundle * @link https://php.net/manual/en/resourcebundle.create.php * @param string $locale

* Locale for which the resources should be loaded (locale name, e.g. en_CA). *

* @param string $bundle

* The directory where the data is stored or the name of the .dat file. *

* @param bool $fallback [optional]

* Whether locale should match exactly or fallback to parent locale is allowed. *

* @return ResourceBundle|null ResourceBundle object or null on error. */ #[TentativeType] public static function create( #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale, #[LanguageAware(['8.0' => 'string|null'], default: '')] $bundle, #[LanguageAware(['8.0' => 'bool'], default: '')] $fallback = true ): ?ResourceBundle {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get data from the bundle * @link https://php.net/manual/en/resourcebundle.get.php * @param string|int $index

* Data index, must be string or integer. *

* @param bool $fallback * @return mixed the data located at the index or NULL on error. Strings, integers and binary data strings * are returned as corresponding PHP types, integer array is returned as PHP array. Complex types are * returned as ResourceBundle object. */ #[Pure] #[TentativeType] #[LanguageAware(['8.4' => 'ResourceBundle|array|string|int|null'], default: 'mixed')] public function get(#[LanguageAware(['8.4' => 'string|int'], default: '')] $index, #[LanguageAware(['8.0' => 'bool'], default: '')] $fallback = true) {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get number of elements in the bundle * @link https://php.net/manual/en/resourcebundle.count.php * @return int<0,max> number of elements in the bundle. */ #[Pure] #[TentativeType] public function count(): int {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get supported locales * @link https://php.net/manual/en/resourcebundle.locales.php * @param string $bundle

* Path of ResourceBundle for which to get available locales, or * empty string for default locales list. *

* @return array|false the list of locales supported by the bundle. */ #[TentativeType] public static function getLocales(#[LanguageAware(['8.0' => 'string'], default: '')] $bundle): array|false {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get bundle's last error code. * @link https://php.net/manual/en/resourcebundle.geterrorcode.php * @return int error code from last bundle object call. */ #[Pure] #[TentativeType] public function getErrorCode(): int {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get bundle's last error message. * @link https://php.net/manual/en/resourcebundle.geterrormessage.php * @return string error message from last bundle object's call. */ #[Pure] #[TentativeType] public function getErrorMessage(): string {} /** * @return Iterator * @since 8.0 */ #[Pure] public function getIterator(): Iterator {} } /** * @since 5.4 */ class Transliterator { public const FORWARD = 0; public const REVERSE = 1; /** * Starting 8.2 $id is readonly to unlock subclassing it */ #[LanguageAware(['8.1' => 'string'], default: '')] public readonly string $id; /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Private constructor to deny instantiation * @link https://php.net/manual/en/transliterator.construct.php */ final private function __construct() {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Create a transliterator * @link https://php.net/manual/en/transliterator.create.php * @param string $id

* The id. *

* @param int $direction [optional]

* The direction, defaults to * Transliterator::FORWARD. * May also be set to * Transliterator::REVERSE. *

* @return Transliterator|null a Transliterator object on success, * or NULL on failure. */ #[TentativeType] public static function create( #[LanguageAware(['8.0' => 'string'], default: '')] $id, #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Transliterator::FORWARD, Transliterator::REVERSE])] $direction = 0 ): ?Transliterator {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Create transliterator from rules * @link https://php.net/manual/en/transliterator.createfromrules.php * @param string $rules

* The rules. *

* @param int $direction [optional]

* The direction, defaults to * {@see Transliterator::FORWARD}. * May also be set to * {@see Transliterator::REVERSE}. *

* @return Transliterator|null a Transliterator object on success, * or NULL on failure. */ #[TentativeType] public static function createFromRules( #[LanguageAware(['8.0' => 'string'], default: '')] $rules, #[LanguageAware(['8.0' => 'int'], default: '')] #[EV([Transliterator::FORWARD, Transliterator::REVERSE])] $direction = 0 ): ?Transliterator {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Create an inverse transliterator * @link https://php.net/manual/en/transliterator.createinverse.php * @return Transliterator|null a Transliterator object on success, * or NULL on failure */ #[Pure] #[TentativeType] public function createInverse(): ?Transliterator {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Get transliterator IDs * @link https://php.net/manual/en/transliterator.listids.php * @return array|false An array of registered transliterator IDs on success, * or FALSE on failure. */ #[TentativeType] public static function listIDs(): array|false {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Transliterate a string * @link https://php.net/manual/en/transliterator.transliterate.php * @param string $string

* The string to be transformed. *

* @param int $start [optional]

* The start index (in UTF-16 code units) from which the string will start * to be transformed, inclusive. Indexing starts at 0. The text before will * be left as is. *

* @param int $end [optional]

* The end index (in UTF-16 code units) until which the string will be * transformed, exclusive. Indexing starts at 0. The text after will be * left as is. *

* @return string|false The transfomed string on success, or FALSE on failure. */ #[Pure] #[TentativeType] public function transliterate( #[LanguageAware(['8.0' => 'string'], default: '')] $string, #[LanguageAware(['8.0' => 'int'], default: '')] $start = 0, #[LanguageAware(['8.0' => 'int'], default: '')] $end = -1 ): string|false {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Get last error code * @link https://php.net/manual/en/transliterator.geterrorcode.php * @return int|false The error code on success, * or FALSE if none exists, or on failure. */ #[Pure] #[TentativeType] public function getErrorCode(): int|false {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Get last error message * @link https://php.net/manual/en/transliterator.geterrormessage.php * @return string|false The error code on success, * or FALSE if none exists, or on failure. */ #[Pure] #[TentativeType] public function getErrorMessage(): string|false {} } /** * @link https://php.net/manual/en/class.spoofchecker.php */ class Spoofchecker { public const SINGLE_SCRIPT_CONFUSABLE = 1; public const MIXED_SCRIPT_CONFUSABLE = 2; public const WHOLE_SCRIPT_CONFUSABLE = 4; public const ANY_CASE = 8; public const SINGLE_SCRIPT = 16; public const INVISIBLE = 32; public const CHAR_LIMIT = 64; public const ASCII = 268435456; public const HIGHLY_RESTRICTIVE = 805306368; public const MODERATELY_RESTRICTIVE = 1073741824; public const MINIMALLY_RESTRICTIVE = 1342177280; public const UNRESTRICTIVE = 1610612736; public const SINGLE_SCRIPT_RESTRICTIVE = 536870912; public const MIXED_NUMBERS = 1; public const HIDDEN_OVERLAY = 2; /** * @since 8.4 */ public const IGNORE_SPACE = 1; /** * @since 8.4 */ public const CASE_INSENSITIVE = 2; /** * @since 8.4 */ public const ADD_CASE_MAPPINGS = 4; /** * @since 8.4 */ public const SIMPLE_CASE_INSENSITIVE = 6; /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Constructor * @link https://php.net/manual/en/spoofchecker.construct.php */ #[Pure] public function __construct() {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Checks if a given text contains any suspicious characters * @link https://php.net/manual/en/spoofchecker.issuspicious.php * @param string $string

*

* @param string &$errorCode [optional]

*

* @return bool */ #[TentativeType] public function isSuspicious(#[LanguageAware(['8.0' => 'string'], default: '')] $string, &$errorCode = null): bool {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Checks if a given text contains any confusable characters * @link https://php.net/manual/en/spoofchecker.areconfusable.php * @param string $string1

*

* @param string $string2

*

* @param int &$errorCode [optional]

*

* @return bool */ #[TentativeType] public function areConfusable( #[LanguageAware(['8.0' => 'string'], default: '')] $string1, #[LanguageAware(['8.0' => 'string'], default: '')] $string2, &$errorCode = null ): bool {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Locales to use when running checks * @link https://php.net/manual/en/spoofchecker.setallowedlocales.php * @param string $locales

*

* @return void */ #[TentativeType] public function setAllowedLocales(#[LanguageAware(['8.0' => 'string'], default: '')] $locales): void {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Set the checks to run * @link https://php.net/manual/en/spoofchecker.setchecks.php * @param int $checks

*

* @return void */ #[TentativeType] public function setChecks(#[LanguageAware(['8.0' => 'int'], default: '')] $checks): void {} /** * @param int $level */ #[TentativeType] public function setRestrictionLevel(#[LanguageAware(['8.0' => 'int'], default: '')] $level): void {} /** * @since 8.4 */ public function setAllowedChars(string $pattern, int $patternOptions = 0): void {} } /** * @since 5.5 */ class IntlGregorianCalendar extends IntlCalendar { /** * @link https://www.php.net/manual/en/intlgregoriancalendar.construct * @param int $timezoneOrYear [optional] * @param int $localeOrMonth [optional] * @param int $day [optional] * @param int $hour [optional] * @param int $minute [optional] * @param int $second [optional] */ public function __construct($timezoneOrYear, $localeOrMonth, $day, $hour, $minute, $second) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @param mixed $timeZone * @param string $locale * @return IntlGregorianCalendar */ public static function createInstance($timeZone = null, $locale = null) {} /** * @param float $timestamp */ #[TentativeType] public function setGregorianChange(#[LanguageAware(['8.0' => 'float'], default: '')] $timestamp): bool {} /** * @return float */ #[Pure] #[TentativeType] public function getGregorianChange(): float {} /** * @param int $year * @return bool */ #[Pure] #[TentativeType] public function isLeapYear(#[LanguageAware(['8.0' => 'int'], default: '')] $year): bool {} /** * @since 8.3 */ public static function createFromDate(int $year, int $month, int $dayOfMonth): static {} /** * @since 8.3 */ public static function createFromDateTime(int $year, int $month, int $dayOfMonth, int $hour, int $minute, ?int $second = null): static {} } /** * @since 5.5 */ class IntlCalendar { /* Constants */ public const FIELD_ERA = 0; public const FIELD_YEAR = 1; public const FIELD_MONTH = 2; public const FIELD_WEEK_OF_YEAR = 3; public const FIELD_WEEK_OF_MONTH = 4; public const FIELD_DATE = 5; public const FIELD_DAY_OF_YEAR = 6; public const FIELD_DAY_OF_WEEK = 7; public const FIELD_DAY_OF_WEEK_IN_MONTH = 8; public const FIELD_AM_PM = 9; public const FIELD_HOUR = 10; public const FIELD_HOUR_OF_DAY = 11; public const FIELD_MINUTE = 12; public const FIELD_SECOND = 13; public const FIELD_MILLISECOND = 14; public const FIELD_ZONE_OFFSET = 15; public const FIELD_DST_OFFSET = 16; public const FIELD_YEAR_WOY = 17; public const FIELD_DOW_LOCAL = 18; public const FIELD_EXTENDED_YEAR = 19; public const FIELD_JULIAN_DAY = 20; public const FIELD_MILLISECONDS_IN_DAY = 21; public const FIELD_IS_LEAP_MONTH = 22; public const FIELD_FIELD_COUNT = 23; public const FIELD_DAY_OF_MONTH = 5; public const DOW_SUNDAY = 1; public const DOW_MONDAY = 2; public const DOW_TUESDAY = 3; public const DOW_WEDNESDAY = 4; public const DOW_THURSDAY = 5; public const DOW_FRIDAY = 6; public const DOW_SATURDAY = 7; public const DOW_TYPE_WEEKDAY = 0; public const DOW_TYPE_WEEKEND = 1; public const DOW_TYPE_WEEKEND_OFFSET = 2; public const DOW_TYPE_WEEKEND_CEASE = 3; public const WALLTIME_FIRST = 1; public const WALLTIME_LAST = 0; public const WALLTIME_NEXT_VALID = 2; /* Methods */ /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Add a (signed) amount of time to a field * @link https://secure.php.net/manual/en/intlcalendar.add.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. * These are integer values between 0 and * IntlCalendar::FIELD_COUNT. *

* @param int $value

The signed amount to add to the current field. If the amount is positive, the instant will be moved forward; if it is negative, the instant wil be moved into the past. The unit is implicit to the field type. * For instance, hours for IntlCalendar::FIELD_HOUR_OF_DAY.

* @return bool Returns TRUE on success or FALSE on failure. */ #[TentativeType] public function add( #[LanguageAware(['8.0' => 'int'], default: '')] $field, #[LanguageAware(['8.0' => 'int'], default: '')] $value ): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether this object's time is after that of the passed object * https://secure.php.net/manual/en/intlcalendar.after.php * @param IntlCalendar $other

The calendar whose time will be checked against this object's time.

* @return bool * Returns TRUE if this object's current time is after that of the * calendar argument's time. Returns FALSE otherwise. * Also returns FALSE on failure. You can use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to detect error conditions. */ #[Pure] #[TentativeType] public function after(IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether this object's time is before that of the passed object * @link https://secure.php.net/manual/en/intlcalendar.before.php * @param IntlCalendar $other

The calendar whose time will be checked against this object's time.

* @return bool * Returns TRUE if this object's current time is before that of the * calendar argument's time. Returns FALSE otherwise. * Also returns FALSE on failure. You can use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to detect error conditions. */ #[Pure] #[TentativeType] public function before(IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Clear a field or all fields * @link https://secure.php.net/manual/en/intlcalendar.clear.php * @param int $field [optional]

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return bool Returns TRUE on success or FALSE on failure. Failure can only occur is invalid arguments are provided. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function clear(#[LanguageAware(['8.0' => 'int|null'], default: '')] $field = null) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Private constructor for disallowing instantiation * @link https://secure.php.net/manual/en/intlcalendar.construct.php */ private function __construct() {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create a new IntlCalendar * @link https://secure.php.net/manual/en/intlcalendar.createinstance.php * @param mixed $timezone [optional]

* The timezone to use. *

* *
    *
  • *

    * NULL, in which case the default timezone will be used, as specified in * the ini setting {@link https://secure.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone} or * through the function {@link https://secure.php.net/manual/en/function.date-default-timezone-set.php date_default_timezone_set()} and as * returned by {@link https://secure.php.net/manual/en/function.date-default-timezone-get.php date_default_timezone_get()}. *

    *
  • *
  • *

    * An {@link https://secure.php.net/manual/en/class.intltimezone.php IntlTimeZone}, which will be used directly. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/class.datetimezone.php DateTimeZone}. Its identifier will be extracted * and an ICU timezone object will be created; the timezone will be backed * by ICU's database, not PHP's. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/language.types.string.php string}, which should be a valid ICU timezone identifier. * See IntlTimeZone::createTimeZoneIDEnumeration(). Raw * offsets such as "GMT+08:30" are also accepted. *

    *
  • *
*

* @param string|null $locale [optional]

* A locale to use or NULL to use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.default-locale the default locale}. *

* @return IntlCalendar|null * The created {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} instance or NULL on * failure. */ #[TentativeType] public static function createInstance($timezone = null, #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale = null): ?IntlCalendar {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Compare time of two IntlCalendar objects for equality * @link https://secure.php.net/manual/en/intlcalendar.equals.php * @param IntlCalendar $other * @return bool

* Returns TRUE if the current time of both this and the passed in * {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} object are the same, or FALSE * otherwise. The value FALSE can also be returned on failure. This can only * happen if bad arguments are passed in. In any case, the two cases can be * distinguished by calling {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()}. *

*/ #[Pure] #[TentativeType] public function equals(#[LanguageAware(['8.0' => 'IntlCalendar'], default: '')] $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Calculate difference between given time and this object's time * @link https://secure.php.net/manual/en/intlcalendar.fielddifference.php * @param float $timestamp

* The time against which to compare the quantity represented by the * field. For the result to be positive, the time * given for this parameter must be ahead of the time of the object the * method is being invoked on. *

* @param int $field

* The field that represents the quantity being compared. *

* *

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false Returns a (signed) difference of time in the unit associated with the * specified field or FALSE on failure. */ #[Pure] #[TentativeType] public function fieldDifference( #[LanguageAware(['8.0' => 'float'], default: '')] $timestamp, #[LanguageAware(['8.0' => 'int'], default: '')] $field ): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a2)
* Create an IntlCalendar from a DateTime object or string * @link https://secure.php.net/manual/en/intlcalendar.fromdatetime.php * @param mixed $datetime

* A {@link https://secure.php.net/manual/en/class.datetime.php DateTime} object or a {@link https://secure.php.net/manual/en/language.types.string.php string} that * can be passed to {@link https://secure.php.net/manual/en/datetime.construct.php DateTime::__construct()}. *

* @param $locale [optional] * @return IntlCalendar|null * The created {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} object or NULL in case of * failure. If a {@link https://secure.php.net/manual/en/language.types.string.php string} is passed, any exception that occurs * inside the {@link https://secure.php.net/manual/en/class.datetime.php DateTime} constructor is propagated. */ #[TentativeType] public static function fromDateTime( #[LanguageAware(['8.0' => 'DateTime|string'], default: '')] $datetime, #[LanguageAware(['8.0' => 'string|null'], default: '')] #[ElementAvailable(from: '8.0')] $locale ): ?IntlCalendar {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the value for a field * @link https://secure.php.net/manual/en/intlcalendar.get.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false An integer with the value of the time field. */ #[Pure] #[TentativeType] public function get(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* The maximum value for a field, considering the object's current time * @link https://secure.php.net/manual/en/intlcalendar.getactualmaximum.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing the maximum value in the units associated * with the given field or FALSE on failure. */ #[Pure] #[TentativeType] public function getActualMaximum(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* The minimum value for a field, considering the object's current time * @link https://secure.php.net/manual/en/intlcalendar.getactualminimum.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. * These are integer values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing the minimum value in the field's * unit or FALSE on failure. */ #[Pure] #[TentativeType] public function getActualMinimum(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get array of locales for which there is data * @link https://secure.php.net/manual/en/intlcalendar.getavailablelocales.php * @return string[] An array of strings, one for which locale. */ #[TentativeType] public static function getAvailableLocales(): array {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Tell whether a day is a weekday, weekend or a day that has a transition between the two * @param int $dayOfWeek

* One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY. *

* @return int|false * Returns one of the constants * IntlCalendar::DOW_TYPE_WEEKDAY, * IntlCalendar::DOW_TYPE_WEEKEND, * IntlCalendar::DOW_TYPE_WEEKEND_OFFSET or * IntlCalendar::DOW_TYPE_WEEKEND_CEASE or FALSE on failure. */ #[Pure] #[TentativeType] public function getDayOfWeekType(#[LanguageAware(['8.0' => 'int'], default: '')] $dayOfWeek): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error code on the object * @link https://secure.php.net/manual/en/intlcalendar.geterrorcode.php * @return int|false An ICU error code indicating either success, failure or a warning. */ #[Pure] #[TentativeType] public function getErrorCode(): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error message on the object * @link https://secure.php.net/manual/en/intlcalendar.geterrormessage.php * @return string|false The error message associated with last error that occurred in a function call on this object, or a string indicating the non-existance of an error. */ #[Pure] #[TentativeType] public function getErrorMessage(): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the first day of the week for the calendar's locale * @link https://secure.php.net/manual/en/intlcalendar.getfirstdayofweek.php * @return int|false * One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY or FALSE on failure. */ #[Pure] #[TentativeType] public function getFirstDayOfWeek(): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the largest local minimum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getgreatestminimum.php * @param int $field * One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. * @return int|false * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing a field value, in the field's * unit, or FALSE on failure. */ #[Pure] #[TentativeType] public function getGreatestMinimum(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get set of locale keyword values * @param string $keyword

* The locale keyword for which relevant values are to be queried. Only * 'calendar' is supported. *

* @param string $locale

* The locale onto which the keyword/value pair are to be appended. *

* @param bool $onlyCommon *

* Whether to show only the values commonly used for the specified locale. *

* @return Iterator|false An iterator that yields strings with the locale keyword values or FALSE on failure. */ #[TentativeType] public static function getKeywordValuesForLocale( #[LanguageAware(['8.0' => 'string'], default: '')] $keyword, #[LanguageAware(['8.0' => 'string'], default: '')] $locale, #[LanguageAware(['8.0' => 'bool'], default: '')] $onlyCommon ): IntlIterator|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the smallest local maximum for a field * @link https://secure.php.net/manual/en/intlcalendar.getleastmaximum.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false * An {@link https://secure.php.net/manual/en/language.types.integer.ph int} representing a field value in the field's * unit or FALSE on failure. */ #[Pure] #[TentativeType] public function getLeastMaximum(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the locale associated with the object * @link https://secure.php.net/manual/en/intlcalendar.getlocale.php * @param int $type

* Whether to fetch the actual locale (the locale from which the calendar * data originates, with Locale::ACTUAL_LOCALE) or the * valid locale, i.e., the most specific locale supported by ICU relatively * to the requested locale – see Locale::VALID_LOCALE. * From the most general to the most specific, the locales are ordered in * this fashion – actual locale, valid locale, requested locale. *

* @return string|false */ #[Pure] #[TentativeType] public function getLocale(#[LanguageAware(['8.0' => 'int'], default: '')] $type): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the global maximum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getmaximum.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false */ #[Pure] #[TentativeType] public function getMaximum(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get minimal number of days the first week in a year or month can have * @link https://secure.php.net/manual/en/intlcalendar.getminimaldaysinfirstweek.php * @return int|false * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing a number of days or FALSE on failure. */ #[Pure] #[TentativeType] public function getMinimalDaysInFirstWeek(): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the global minimum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getminimum.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false * An int representing a value for the given field in the field's unit or FALSE on failure. */ #[Pure] #[TentativeType] public function getMinimum(#[LanguageAware(['8.0' => 'int'], default: '')] $field): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get number representing the current time * @return float A float representing a number of milliseconds since the epoch, not counting leap seconds. */ #[TentativeType] public static function getNow(): float {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get behavior for handling repeating wall time * @link https://secure.php.net/manual/en/intlcalendar.getrepeatedwalltimeoption.php * @return int * One of the constants IntlCalendar::WALLTIME_FIRST or * IntlCalendar::WALLTIME_LAST. */ #[Pure] #[TentativeType] public function getRepeatedWallTimeOption(): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get behavior for handling skipped wall time * @link https://secure.php.net/manual/en/intlcalendar.getskippedwalltimeoption.php * @return int * One of the constants IntlCalendar::WALLTIME_FIRST, * IntlCalendar::WALLTIME_LAST or * IntlCalendar::WALLTIME_NEXT_VALID. */ #[Pure] #[TentativeType] public function getSkippedWallTimeOption(): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get time currently represented by the object * @return float|false * A {@link https://secure.php.net/manual/en/language.types.float.php float} representing the number of milliseconds elapsed since the * reference time (1 Jan 1970 00:00:00 UTC). */ #[Pure] #[TentativeType] public function getTime(): float|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the object's timezone * @link https://secure.php.net/manual/en/intlcalendar.gettimezone.php * @return IntlTimeZone|false * An {@link https://secure.php.net/manual/en/class.intltimezone.php IntlTimeZone} object corresponding to the one used * internally in this object. */ #[Pure] #[TentativeType] public function getTimeZone(): IntlTimeZone|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the calendar type * @link https://secure.php.net/manual/en/intlcalendar.gettype.php * @return string * A {@link https://secure.php.net/manual/en/language.types.string.php string} representing the calendar type, such as * 'gregorian', 'islamic', etc. */ #[Pure] #[TentativeType] public function getType(): string {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get time of the day at which weekend begins or ends * @link https://secure.php.net/manual/en/intlcalendar.getweekendtransition.php * @param string $dayOfWeek

* One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY. *

* @return int|false * The number of milliseconds into the day at which the the weekend begins or * ends or FALSE on failure. */ #[Pure] #[TentativeType] public function getWeekendTransition(#[LanguageAware(['8.0' => 'int'], default: '')] $dayOfWeek): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether the object's time is in Daylight Savings Time * @link https://secure.php.net/manual/en/intlcalendar.indaylighttime.php * @return bool * Returns TRUE if the date is in Daylight Savings Time, FALSE otherwise. * The value FALSE may also be returned on failure, for instance after * specifying invalid field values on non-lenient mode; use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or query * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to disambiguate. */ #[Pure] #[TentativeType] public function inDaylightTime(): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether another calendar is equal but for a different time * @link https://secure.php.net/manual/en/intlcalendar.isequivalentto.php * @param IntlCalendar $other The other calendar against which the comparison is to be made. * @return bool * Assuming there are no argument errors, returns TRUE iif the calendars are equivalent except possibly for their set time. */ #[Pure] #[TentativeType] public function isEquivalentTo(IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether date/time interpretation is in lenient mode * @link https://secure.php.net/manual/en/intlcalendar.islenient.php * @return bool * A {@link https://secure.php.net/manual/en/language.types.boolean.php bool} representing whether the calendar is set to lenient mode. */ #[Pure] #[TentativeType] public function isLenient(): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether a certain date/time is in the weekend * @link https://secure.php.net/manual/en/intlcalendar.isweekend.php * @param float|null $timestamp [optional]

* An optional timestamp representing the number of milliseconds since the * epoch, excluding leap seconds. If NULL, this object's current time is * used instead. *

* @return bool *

A {@link https://secure.php.net/manual/en/language.types.boolean.php bool} indicating whether the given or this object's time occurs * in a weekend. *

*

* The value FALSE may also be returned on failure, for instance after giving * a date out of bounds on non-lenient mode; use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or query * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to disambiguate.

*/ #[Pure] #[TentativeType] public function isWeekend(#[LanguageAware(['8.0' => 'float|null'], default: '')] $timestamp = null): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Add value to field without carrying into more significant fields * @link https://secure.php.net/manual/en/intlcalendar.roll.php * @param int $field *

One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time * {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @param mixed $value

* The (signed) amount to add to the field, TRUE for rolling up (adding * 1), or FALSE for rolling down (subtracting * 1). *

* @return bool Returns TRUE on success or FALSE on failure. */ #[TentativeType] public function roll(#[LanguageAware(['8.0' => 'int'], default: '')] $field, $value): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether a field is set * @link https://secure.php.net/manual/en/intlcalendar.isset.php * @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time * {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. * These are integer values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return bool Assuming there are no argument errors, returns TRUE iif the field is set. */ #[TentativeType] public function PS_UNRESERVE_PREFIX_isSet(#[LanguageAware(['8.0' => 'int'], default: '')] $field): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set a time field or several common fields at once * @link https://secure.php.net/manual/en/intlcalendar.set.php * @param int $year

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @param int $month

* The new value for IntlCalendar::FIELD_MONTH. *

* @param int $dayOfMonth [optional]

* The new value for IntlCalendar::FIELD_DAY_OF_MONTH. * The month sequence is zero-based, i.e., January is represented by 0, * February by 1, ..., December is 11 and Undecember (if the calendar has * it) is 12. *

* @param int $hour [optional] *

* The new value for IntlCalendar::FIELD_HOUR_OF_DAY. *

* @param int $minute [optional] *

* The new value for IntlCalendar::FIELD_MINUTE. *

* @param int $second [optional]

* The new value for IntlCalendar::FIELD_SECOND. *

* @return bool Returns TRUE on success and FALSE on failure. */ public function set($year, $month, $dayOfMonth = null, $hour = null, $minute = null, $second = null) {} /** * (PHP 5 >= 5.5.0 PECL intl >= 3.0.0a1)
* Set a time field or several common fields at once * @link https://secure.php.net/manual/en/intlcalendar.set.php * @param int $field One of the IntlCalendar date/time field constants. These are integer values between 0 and IntlCalendar::FIELD_COUNT. * @param int $value The new value of the given field. * @return bool Returns TRUE on success and FALSE on failure. * @since 5.5 */ public function set($field, $value) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set the day on which the week is deemed to start * @link https://secure.php.net/manual/en/intlcalendar.setfirstdayofweek.php * @param int $dayOfWeek

* One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY. *

* @return bool Returns TRUE on success. Failure can only happen due to invalid parameters. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setFirstDayOfWeek(#[LanguageAware(['8.0' => 'int'], default: '')] $dayOfWeek) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set whether date/time interpretation is to be lenient * @link https://secure.php.net/manual/en/intlcalendar.setlenient.php * @param bool $lenient

* Use TRUE to activate the lenient mode; FALSE otherwise. *

* @return bool Returns TRUE on success. Failure can only happen due to invalid parameters. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setLenient(#[LanguageAware(['8.0' => 'bool'], default: '')] $lenient) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set behavior for handling repeating wall times at negative timezone offset transitions * @link https://secure.php.net/manual/en/intlcalendar.setrepeatedwalltimeoption.php * @param int $option

* One of the constants IntlCalendar::WALLTIME_FIRST or * IntlCalendar::WALLTIME_LAST. *

* @return bool * Returns TRUE on success. Failure can only happen due to invalid parameters. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setRepeatedWallTimeOption(#[LanguageAware(['8.0' => 'int'], default: '')] $option) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set behavior for handling skipped wall times at positive timezone offset transitions * @link https://secure.php.net/manual/en/intlcalendar.setskippedwalltimeoption.php * @param int $option

* One of the constants IntlCalendar::WALLTIME_FIRST, * IntlCalendar::WALLTIME_LAST or * IntlCalendar::WALLTIME_NEXT_VALID. *

* @return bool *

* Returns TRUE on success. Failure can only happen due to invalid parameters. *

*/ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setSkippedWallTimeOption(#[LanguageAware(['8.0' => 'int'], default: '')] $option) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set the calendar time in milliseconds since the epoch * @link https://secure.php.net/manual/en/intlcalendar.settime.php * @param float $timestamp

* An instant represented by the number of number of milliseconds between * such instant and the epoch, ignoring leap seconds. *

* @return bool * Returns TRUE on success and FALSE on failure. */ #[TentativeType] public function setTime(#[LanguageAware(['8.0' => 'float'], default: '')] $timestamp): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set the timezone used by this calendar * @link https://secure.php.net/manual/en/intlcalendar.settimezone.php * @param mixed $timezone

* The new timezone to be used by this calendar. It can be specified in the * following ways: * *

    *
  • *

    * NULL, in which case the default timezone will be used, as specified in * the ini setting {@link https://secure.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone} or * through the function {@link https://secure.php.net/manual/en/function.date-default-timezone-set.php date_default_timezone_set()} and as * returned by {@link https://secure.php.net/manual/en/function.date-default-timezone-get.php date_default_timezone_get()}. *

    *
  • *
  • *

    * An {@link https://secure.php.net/manual/en/class.intltimezone.php IntlTimeZone}, which will be used directly. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/class.datetimezone.php DateTimeZone}. Its identifier will be extracted * and an ICU timezone object will be created; the timezone will be backed * by ICU's database, not PHP's. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/language.types.string.php string}, which should be a valid ICU timezone identifier. * See b>IntlTimeZone::createTimeZoneIDEnumeration(). Raw * offsets such as "GMT+08:30" are also accepted. *

    *
  • *
* @return bool Returns TRUE on success and FALSE on failure. */ #[TentativeType] public function setTimeZone($timezone): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a2)
* Convert an IntlCalendar into a DateTime object * @link https://secure.php.net/manual/en/intlcalendar.todatetime.php * @return DateTime|false * A {@link https://secure.php.net/manual/en/class.datetime.php DateTime} object with the same timezone as this * object (though using PHP's database instead of ICU's) and the same time, * except for the smaller precision (second precision instead of millisecond). * Returns FALSE on failure. */ #[Pure] #[TentativeType] public function toDateTime(): DateTime|false {} /** * @link https://www.php.net/manual/en/intlcalendar.setminimaldaysinfirstweek.php * @param int $days * @return bool */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] #[TentativeType] public function setMinimalDaysInFirstWeek(#[LanguageAware(['8.0' => 'int'], default: '')] $days) {} /** * @since 8.3 */ public function setDate(int $year, int $month, int $dayOfMonth): void {} /** * @since 8.3 */ public function setDateTime(int $year, int $month, int $dayOfMonth, int $hour, int $minute, ?int $second = null): void {} } /** * @since 5.5 */ class IntlIterator implements Iterator { #[TentativeType] public function current(): mixed {} #[TentativeType] public function key(): mixed {} #[TentativeType] public function next(): void {} #[TentativeType] public function rewind(): void {} #[TentativeType] public function valid(): bool {} } /** * @since 5.5 */ class IntlException extends Exception {} /** * @since 5.5 */ class IntlTimeZone { /* Constants */ public const DISPLAY_SHORT = 1; public const DISPLAY_LONG = 2; public const DISPLAY_SHORT_GENERIC = 3; public const DISPLAY_LONG_GENERIC = 4; public const DISPLAY_SHORT_GMT = 5; public const DISPLAY_LONG_GMT = 6; public const DISPLAY_SHORT_COMMONLY_USED = 7; public const DISPLAY_GENERIC_LOCATION = 8; public const TYPE_ANY = 0; public const TYPE_CANONICAL = 1; public const TYPE_CANONICAL_LOCATION = 2; /* Methods */ private function __construct() {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the number of IDs in the equivalency group that includes the given ID * @link https://secure.php.net/manual/en/intltimezone.countequivalentids.php * @param string $timezoneId * @return int|false number of IDs or FALSE on failure */ #[TentativeType] public static function countEquivalentIDs(#[LanguageAware(['8.0' => 'string'], default: '')] $timezoneId): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create a new copy of the default timezone for this host * @link https://secure.php.net/manual/en/intltimezone.createdefault.php * @return IntlTimeZone */ #[TentativeType] public static function createDefault(): IntlTimeZone {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get an enumeration over time zone IDs associated with the given country or offset * @link https://secure.php.net/manual/en/intltimezone.createenumeration.php * @param mixed $countryOrRawOffset [optional] * @return IntlIterator|false an iterator or FALSE on failure */ #[TentativeType] public static function createEnumeration($countryOrRawOffset): IntlIterator|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create a timezone object for the given ID * @link https://secure.php.net/manual/en/intltimezone.createtimezone.php * @param string $timezoneId * @return IntlTimeZone|null a timezone object or NULL on failure */ #[TentativeType] public static function createTimeZone(#[LanguageAware(['8.0' => 'string'], default: '')] $timezoneId): ?IntlTimeZone {} /** * (PHP 5 >=5.5.0)
* Get an enumeration over system time zone IDs with the given filter conditions * @link https://secure.php.net/manual/en/intltimezone.createtimezoneidenumeration.php * @param int $type * @param string|null $region [optional] * @param int $rawOffset [optional] * @return IntlIterator|false an iterator or FALSE on failure */ #[TentativeType] public static function createTimeZoneIDEnumeration( #[LanguageAware(['8.0' => 'int'], default: '')] $type, #[LanguageAware(['8.0' => 'string|null'], default: '')] $region = null, #[LanguageAware(['8.0' => 'int|null'], default: '')] $rawOffset = null ): IntlIterator|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create a timezone object from DateTimeZone * @link https://secure.php.net/manual/en/intltimezone.fromdatetimezone.php * @param DateTimeZone $timezone * @return IntlTimeZone|null a timezone object or NULL on failure */ #[TentativeType] public static function fromDateTimeZone(#[LanguageAware(['8.0' => 'DateTimeZone'], default: '')] $timezone): ?IntlTimeZone {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the canonical system timezone ID or the normalized custom time zone ID for the given time zone ID * @link https://secure.php.net/manual/en/intltimezone.getcanonicalid.php * @param string $timezoneId * @param bool &$isSystemId [optional] * @return string|false the timezone ID or FALSE on failure */ #[TentativeType] public static function getCanonicalID(#[LanguageAware(['8.0' => 'string'], default: '')] $timezoneId, &$isSystemId): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get a name of this time zone suitable for presentation to the user * @param bool $dst [optional] * @param int $style [optional] * @param string $locale [optional] * @return string|false the timezone name or FALSE on failure */ #[Pure] #[TentativeType] public function getDisplayName( #[LanguageAware(['8.0' => 'bool'], default: '')] $dst = false, #[LanguageAware(['8.0' => 'int'], default: '')] $style = 2, #[LanguageAware(['8.0' => 'string|null'], default: '')] $locale ): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the amount of time to be added to local standard time to get local wall clock time * @link https://secure.php.net/manual/en/intltimezone.getequivalentid.php * @return int */ #[Pure] #[TentativeType] public function getDSTSavings(): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get an ID in the equivalency group that includes the given ID * @link https://secure.php.net/manual/en/intltimezone.getequivalentid.php * @param string $timezoneId * @param int $offset * @return string|false the time zone ID or FALSE on failure */ #[TentativeType] public static function getEquivalentID( #[LanguageAware(['8.0' => 'string'], default: '')] $timezoneId, #[LanguageAware(['8.0' => 'int'], default: '')] $offset ): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error code on the object * @link https://secure.php.net/manual/en/intltimezone.geterrorcode.php * @return int|false */ #[Pure] #[TentativeType] public function getErrorCode(): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error message on the object * @link https://secure.php.net/manual/en/intltimezone.geterrormessage.php * @return string|false */ #[Pure] #[TentativeType] public function getErrorMessage(): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create GMT (UTC) timezone * @link https://secure.php.net/manual/en/intltimezone.getgmt.php * @return IntlTimeZone */ #[TentativeType] public static function getGMT(): IntlTimeZone {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get timezone ID * @return string|false */ #[Pure] #[TentativeType] public function getID(): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the time zone raw and GMT offset for the given moment in time * @link https://secure.php.net/manual/en/intltimezone.getoffset.php * @param float $timestamp * moment in time for which to return offsets, in units of milliseconds from * January 1, 1970 0:00 GMT, either GMT time or local wall time, depending on * `local'. * @param bool $local * if true, `date' is local wall time; otherwise it is in GMT time. * @param int &$rawOffset * output parameter to receive the raw offset, that is, the offset not * including DST adjustments * @param int &$dstOffset * output parameter to receive the DST offset, that is, the offset to be added * to `rawOffset' to obtain the total offset between local and GMT time. If * DST is not in effect, this value is zero; otherwise it is a positive value, * typically one hour. * @return bool boolean indication of success */ #[TentativeType] public function getOffset( #[LanguageAware(['8.0' => 'float'], default: '')] $timestamp, #[LanguageAware(['8.0' => 'bool'], default: '')] $local, &$rawOffset, &$dstOffset ): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the raw GMT offset (before taking daylight savings time into account * @link https://secure.php.net/manual/en/intltimezone.getrawoffset.php * @return int */ #[Pure] #[TentativeType] public function getRawOffset(): int {} /** * (PHP 5 >=5.5.0)
* Get the region code associated with the given system time zone ID * @link https://secure.php.net/manual/en/intltimezone.getregion.php * @param string $timezoneId * @return string|false region or FALSE on failure */ #[TentativeType] public static function getRegion(#[LanguageAware(['8.0' => 'string'], default: '')] $timezoneId): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the timezone data version currently used by ICU * @link https://secure.php.net/manual/en/intltimezone.gettzdataversion.php * @return string|false */ #[TentativeType] public static function getTZDataVersion(): string|false {} /** * (PHP 5 >=5.5.0)
* Get the "unknown" time zone * @link https://secure.php.net/manual/en/intltimezone.getunknown.php * @return IntlTimeZone */ #[TentativeType] public static function getUnknown(): IntlTimeZone {} /** * (PHP 7 >=7.1.0)
* Translates a system timezone (e.g. "America/Los_Angeles") into a Windows * timezone (e.g. "Pacific Standard Time"). * @link https://secure.php.net/manual/en/intltimezone.getwindowsid.php * @param string $timezoneId * @return string|false the Windows timezone or FALSE on failure * @since 7.1 */ #[TentativeType] public static function getWindowsID(string $timezoneId): string|false {} /** * @link https://www.php.net/manual/en/intltimezone.getidforwindowsid.php * @param string $timezoneId * @param string|null $region * @return string|false the Windows timezone or FALSE on failure * @since 7.1 */ #[TentativeType] public static function getIDForWindowsID(string $timezoneId, ?string $region = null): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Check if this zone has the same rules and offset as another zone * @link https://secure.php.net/manual/en/intltimezone.hassamerules.php * @param IntlTimeZone $other * @return bool */ #[Pure] #[TentativeType] public function hasSameRules(IntlTimeZone $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Convert to DateTimeZone object * @link https://secure.php.net/manual/en/intltimezone.todatetimezone.php * @return DateTimeZone|false the DateTimeZone object or FALSE on failure */ #[Pure] #[TentativeType] public function toDateTimeZone(): DateTimeZone|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Check if this time zone uses daylight savings time * @link https://secure.php.net/manual/en/intltimezone.usedaylighttime.php * @return bool */ #[TentativeType] public function useDaylightTime(): bool {} /** * @since 8.4 */ public static function getIanaID(string $timezoneId): string|false {} } /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a collator * @link https://php.net/manual/en/collator.create.php * @param string $locale

* The locale containing the required collation rules. Special values for * locales can be passed in - if null is passed for the locale, the * default locale collation rules will be used. If empty string ("") or * "root" are passed, UCA rules will be used. *

* @return Collator|null Return new instance of Collator object, or NULL * on error. */ #[Pure] function collator_create(string $locale): ?Collator {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Compare two Unicode strings * @link https://php.net/manual/en/collator.compare.php * @param Collator $object * @param string $string1

* The first string to compare. *

* @param string $string2

* The second string to compare. *

* @return int|false Return comparison result:

*

*

* 1 if string1 is greater than * string2 ; *

*

* 0 if string1 is equal to * string2; *

*

* -1 if string1 is less than * string2 . *

* On error * boolean * FALSE * is returned. */ #[Pure] function collator_compare(Collator $object, string $string1, string $string2): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get collation attribute value * @link https://php.net/manual/en/collator.getattribute.php * @param Collator $object * @param int $attribute

* Attribute to get value for. *

* @return int|false Attribute value, or boolean FALSE on error. */ #[Pure] function collator_get_attribute(Collator $object, int $attribute): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set collation attribute * @link https://php.net/manual/en/collator.setattribute.php * @param Collator $object * @param int $attribute

Attribute.

* @param int $value

* Attribute value. *

* @return bool TRUE on success or FALSE on failure. */ function collator_set_attribute(Collator $object, int $attribute, int $value): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get current collation strength * @link https://php.net/manual/en/collator.getstrength.php * @param Collator $object * @return int current collation strength */ #[Pure] function collator_get_strength(Collator $object): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set collation strength * @link https://php.net/manual/en/collator.setstrength.php * @param Collator $object * @param int $strength

Strength to set.

*

* Possible values are: * Collator::PRIMARY *

* @return bool TRUE on success or FALSE on failure. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] function collator_set_strength(Collator $object, int $strength) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sort array using specified collator * @link https://php.net/manual/en/collator.sort.php * @param Collator $object * @param string[] &$array

* Array of strings to sort. *

* @param int $flags

* Optional sorting type, one of the following: *

*

* Collator::SORT_REGULAR * - compare items normally (don't change types) *

* @return bool TRUE on success or FALSE on failure. */ function collator_sort(Collator $object, array &$array, int $flags = 0): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sort array using specified collator and sort keys * @link https://php.net/manual/en/collator.sortwithsortkeys.php * @param Collator $object * @param string[] &$array

Array of strings to sort

* @return bool TRUE on success or FALSE on failure. */ function collator_sort_with_sort_keys( Collator $object, array &$array, #[ElementAvailable(from: '5.3', to: '5.6')] $sort_flags = [] ): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sort array maintaining index association * @link https://php.net/manual/en/collator.asort.php * @param Collator $object * @param string[] &$array

Array of strings to sort.

* @param int $flags

* Optional sorting type, one of the following: * Collator::SORT_REGULAR * - compare items normally (don't change types) *

* @return bool TRUE on success or FALSE on failure. */ function collator_asort(Collator $object, array &$array, int $flags = 0): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the locale name of the collator * @link https://php.net/manual/en/collator.getlocale.php * @param Collator $object * @param int $type

* You can choose between valid and actual locale ( * Locale::VALID_LOCALE and * Locale::ACTUAL_LOCALE, * respectively). The default is the actual locale. *

* @return string|false Real locale name from which the collation data comes. If the collator was * instantiated from rules or an error occurred, returns * boolean FALSE. */ #[Pure] function collator_get_locale(Collator $object, int $type): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get collator's last error code * @link https://php.net/manual/en/collator.geterrorcode.php * @param Collator $object * @return int|false Error code returned by the last Collator API function call. */ #[Pure(true)] function collator_get_error_code(Collator $object): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get text for collator's last error code * @link https://php.net/manual/en/collator.geterrormessage.php * @param Collator $object * @return string|false Description of an error occurred in the last Collator API function call. */ #[Pure] function collator_get_error_message(Collator $object): string|false {} /** * (PHP 5 >= 5.3.2, PHP 7, PECL intl >= 1.0.3)
* Get sorting key for a string * @link https://php.net/manual/en/collator.getsortkey.php * @param Collator $object * @param string $string

* The string to produce the key from. *

* @return string|false the collation key for the string. Collation keys can be compared directly instead of strings. */ #[Pure] function collator_get_sort_key( Collator $object, string $string, #[ElementAvailable(from: '5.3', to: '5.6')] $arg3 ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a number formatter * @link https://php.net/manual/en/numberformatter.create.php * @param string $locale

* Locale in which the number would be formatted (locale name, e.g. en_CA). *

* @param int $style

* Style of the formatting, one of the * format style constants. If * NumberFormatter::PATTERN_DECIMAL * or NumberFormatter::PATTERN_RULEBASED * is passed then the number format is opened using the given pattern, * which must conform to the syntax described in * ICU DecimalFormat * documentation or * ICU RuleBasedNumberFormat * documentation, respectively. *

* @param string|null $pattern [optional]

* Pattern string if the chosen style requires a pattern. *

* @return NumberFormatter|null NumberFormatter object or NULL on error. */ #[Pure] function numfmt_create(string $locale, int $style, #[LanguageAware(['8.0' => 'string|null'], default: 'string')] $pattern = null): ?NumberFormatter {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format a number * @link https://php.net/manual/en/numberformatter.format.php * @param NumberFormatter $formatter * @param int|float $num

* The value to format. Can be integer or float, * other values will be converted to a numeric value. *

* @param int $type

* The * formatting type to use. *

* @return string|false the string containing formatted value, or FALSE on error. */ #[Pure] function numfmt_format(NumberFormatter $formatter, int|float $num, int $type = 0): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse a number * @link https://php.net/manual/en/numberformatter.parse.php * @param NumberFormatter $formatter * @param string $string * @param int $type [optional]

* The * formatting type to use. By default, * NumberFormatter::TYPE_DOUBLE is used. *

* @param int &$offset [optional]

* Offset in the string at which to begin parsing. On return, this value * will hold the offset at which parsing ended. *

* @return int|float|false The value of the parsed number or FALSE on error. */ #[Pure] function numfmt_parse(NumberFormatter $formatter, string $string, int $type = NumberFormatter::TYPE_DOUBLE, &$offset = null): int|float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format a currency value * @link https://php.net/manual/en/numberformatter.formatcurrency.php * @param NumberFormatter $formatter * @param float $amount

* The numeric currency value. *

* @param string $currency

* The 3-letter ISO 4217 currency code indicating the currency to use. *

* @return string|false String representing the formatted currency value. */ #[Pure] function numfmt_format_currency(NumberFormatter $formatter, float $amount, string $currency): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse a currency number * @link https://php.net/manual/en/numberformatter.parsecurrency.php * @param NumberFormatter $formatter * @param string $string * @param string &$currency

* Parameter to receive the currency name (3-letter ISO 4217 currency * code). *

* @param int &$offset [optional]

* Offset in the string at which to begin parsing. On return, this value * will hold the offset at which parsing ended. *

* @return float|false The parsed numeric value or FALSE on error. */ function numfmt_parse_currency(NumberFormatter $formatter, string $string, &$currency, &$offset = null): float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set an attribute * @link https://php.net/manual/en/numberformatter.setattribute.php * @param NumberFormatter $formatter * @param int $attribute

* Attribute specifier - one of the * numeric attribute constants. *

* @param int|float $value

* The attribute value. *

* @return bool TRUE on success or FALSE on failure. */ function numfmt_set_attribute(NumberFormatter $formatter, int $attribute, int|float $value): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get an attribute * @link https://php.net/manual/en/numberformatter.getattribute.php * @param NumberFormatter $formatter * @param int $attribute

* Attribute specifier - one of the * numeric attribute constants. *

* @return int|float|false Return attribute value on success, or FALSE on error. */ #[Pure] function numfmt_get_attribute(NumberFormatter $formatter, int $attribute): int|float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set a text attribute * @link https://php.net/manual/en/numberformatter.settextattribute.php * @param NumberFormatter $formatter * @param int $attribute

* Attribute specifier - one of the * text attribute * constants. *

* @param string $value

* Text for the attribute value. *

* @return bool TRUE on success or FALSE on failure. */ function numfmt_set_text_attribute(NumberFormatter $formatter, int $attribute, string $value): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get a text attribute * @link https://php.net/manual/en/numberformatter.gettextattribute.php * @param NumberFormatter $formatter * @param int $attribute

* Attribute specifier - one of the * text attribute constants. *

* @return string|false Return attribute value on success, or FALSE on error. */ #[Pure] function numfmt_get_text_attribute(NumberFormatter $formatter, int $attribute): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set a symbol value * @link https://php.net/manual/en/numberformatter.setsymbol.php * @param NumberFormatter $formatter * @param int $symbol

* Symbol specifier, one of the * format symbol constants. *

* @param string $value

* Text for the symbol. *

* @return bool TRUE on success or FALSE on failure. */ function numfmt_set_symbol(NumberFormatter $formatter, int $symbol, string $value): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get a symbol value * @link https://php.net/manual/en/numberformatter.getsymbol.php * @param NumberFormatter $formatter * @param int $symbol

* Symbol specifier, one of the * format symbol constants. *

* @return string|false The symbol string or FALSE on error. */ #[Pure] function numfmt_get_symbol(NumberFormatter $formatter, int $symbol): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set formatter pattern * @link https://php.net/manual/en/numberformatter.setpattern.php * @param NumberFormatter $formatter * @param string $pattern

* Pattern in syntax described in * ICU DecimalFormat * documentation. *

* @return bool TRUE on success or FALSE on failure. */ function numfmt_set_pattern(NumberFormatter $formatter, string $pattern): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter pattern * @link https://php.net/manual/en/numberformatter.getpattern.php * @param NumberFormatter $formatter * @return string|false Pattern string that is used by the formatter, or FALSE if an error happens. */ #[Pure] function numfmt_get_pattern(NumberFormatter $formatter): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter locale * @link https://php.net/manual/en/numberformatter.getlocale.php * @param NumberFormatter $formatter * @param int $type

* You can choose between valid and actual locale ( * Locale::VALID_LOCALE, * Locale::ACTUAL_LOCALE, * respectively). The default is the actual locale. *

* @return string|false The locale name used to create the formatter. */ #[Pure] function numfmt_get_locale(NumberFormatter $formatter, int $type = 0): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter's last error code. * @link https://php.net/manual/en/numberformatter.geterrorcode.php * @param NumberFormatter $formatter * @return int error code from last formatter call. */ #[Pure(true)] function numfmt_get_error_code(NumberFormatter $formatter): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get formatter's last error message. * @link https://php.net/manual/en/numberformatter.geterrormessage.php * @param NumberFormatter $formatter * @return string error message from last formatter call. */ #[Pure(true)] function numfmt_get_error_message(NumberFormatter $formatter): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Normalizes the input provided and returns the normalized string * @link https://php.net/manual/en/normalizer.normalize.php * @param string $string

The input string to normalize

* @param int $form [optional]

One of the normalization forms.

* @return string|false The normalized string or FALSE if an error occurred. */ #[Pure] function normalizer_normalize(string $string, int $form = Normalizer::FORM_C): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Checks if the provided string is already in the specified normalization * form. * @link https://php.net/manual/en/normalizer.isnormalized.php * @param string $string

The input string to normalize

* @param int $form [optional]

* One of the normalization forms. *

* @return bool TRUE if normalized, FALSE otherwise or if there an error */ #[Pure] function normalizer_is_normalized(string $string, int $form = Normalizer::FORM_C): bool {} /** * Gets the default locale value from the intl global 'default_locale' * @link https://php.net/manual/en/function.locale-get-default.php * @return string a string with the current Locale. */ #[Pure] function locale_get_default(): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the default runtime Locale * @link https://php.net/manual/en/function.locale-set-default.php * @param string $locale

* The new Locale name. A comprehensive list of the supported locales is * available at . *

* @return bool TRUE on success or FALSE on failure. */ #[LanguageAware(['8.4' => 'true'], default: 'bool')] function locale_set_default(string $locale) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the primary language for the input locale * @link https://php.net/manual/en/locale.getprimarylanguage.php * @param string $locale

* The locale to extract the primary language code from *

* @return string|null The language code associated with the language or NULL in case of error. */ #[Pure] function locale_get_primary_language(string $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the script for the input locale * @link https://php.net/manual/en/locale.getscript.php * @param string $locale

* The locale to extract the script code from *

* @return string|null The script subtag for the locale or NULL if not present */ #[Pure] function locale_get_script(string $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the region for the input locale * @link https://php.net/manual/en/locale.getregion.php * @param string $locale

* The locale to extract the region code from *

* @return string|null The region subtag for the locale or NULL if not present */ #[Pure] function locale_get_region(string $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the keywords for the input locale * @link https://php.net/manual/en/locale.getkeywords.php * @param string $locale

* The locale to extract the keywords from *

* @return array|false|null Associative array containing the keyword-value pairs for this locale */ #[Pure] function locale_get_keywords(string $locale): array|false|null {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for script of the input locale * @link https://php.net/manual/en/locale.getdisplayscript.php * @param string $locale

* The locale to return a display script for *

* @param string|null $displayLocale

* Optional format locale to use to display the script name *

* @return string|false Display name of the script for the $locale in the format appropriate for * $in_locale. */ #[Pure] function locale_get_display_script( string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] ?string $displayLocale, #[ElementAvailable(from: '7.0')] ?string $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for region of the input locale * @link https://php.net/manual/en/locale.getdisplayregion.php * @param string $locale

* The locale to return a display region for. *

* @param string|null $displayLocale

* Optional format locale to use to display the region name *

* @return string|false display name of the region for the $locale in the format appropriate for * $in_locale. */ #[Pure] function locale_get_display_region( string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] ?string $displayLocale, #[ElementAvailable(from: '7.0')] ?string $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for the input locale * @link https://php.net/manual/en/locale.getdisplayname.php * @param string $locale

* The locale to return a display name for. *

* @param string|null $displayLocale

optional format locale

* @return string|false Display name of the locale in the format appropriate for $in_locale. */ #[Pure] function locale_get_display_name( string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] ?string $displayLocale, #[ElementAvailable(from: '7.0')] ?string $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for language of the inputlocale * @link https://php.net/manual/en/locale.getdisplaylanguage.php * @param string $locale

* The locale to return a display language for *

* @param string|null $displayLocale

* Optional format locale to use to display the language name *

* @return string|false display name of the language for the $locale in the format appropriate for * $in_locale. */ #[Pure] function locale_get_display_language( string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] ?string $displayLocale, #[ElementAvailable(from: '7.0')] ?string $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns an appropriately localized display name for variants of the input locale * @link https://php.net/manual/en/locale.getdisplayvariant.php * @param string $locale

* The locale to return a display variant for *

* @param string|null $displayLocale

* Optional format locale to use to display the variant name *

* @return string|false Display name of the variant for the $locale in the format appropriate for * $in_locale. */ #[Pure] function locale_get_display_variant( string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] ?string $displayLocale, #[ElementAvailable(from: '7.0')] ?string $displayLocale = null ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns a correctly ordered and delimited locale ID * @link https://php.net/manual/en/locale.composelocale.php * @param string[] $subtags

* an array containing a list of key-value pairs, where the keys identify * the particular locale ID subtags, and the values are the associated * subtag values. *

* The 'variant' and 'private' subtags can take maximum 15 values * whereas 'extlang' can take maximum 3 values.e.g. Variants are allowed * with the suffix ranging from 0-14. Hence the keys for the input array * can be variant0, variant1, ...,variant14. In the returned locale id, * the subtag is ordered by suffix resulting in variant0 followed by * variant1 followed by variant2 and so on. *

*

* The 'variant', 'private' and 'extlang' multiple values can be specified both * as array under specific key (e.g. 'variant') and as multiple numbered keys * (e.g. 'variant0', 'variant1', etc.). *

*

* @return string|false The corresponding locale identifier. */ #[Pure] function locale_compose(array $subtags): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns a key-value array of locale ID subtag elements. * @link https://php.net/manual/en/locale.parselocale.php * @param string $locale

* The locale to extract the subtag array from. Note: The 'variant' and * 'private' subtags can take maximum 15 values whereas 'extlang' can take * maximum 3 values. *

* @return string[]|null an array containing a list of key-value pairs, where the keys * identify the particular locale ID subtags, and the values are the * associated subtag values. The array will be ordered as the locale id * subtags e.g. in the locale id if variants are '-varX-varY-varZ' then the * returned array will have variant0=>varX , variant1=>varY , * variant2=>varZ */ #[Pure] function locale_parse(string $locale): ?array {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Gets the variants for the input locale * @link https://php.net/manual/en/locale.getallvariants.php * @param string $locale

* The locale to extract the variants from *

* @return array|null The array containing the list of all variants subtag for the locale * or NULL if not present */ #[Pure] function locale_get_all_variants(string $locale): ?array {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Checks if a language tag filter matches with locale * @link https://php.net/manual/en/locale.filtermatches.php * @param string $languageTag

* The language tag to check *

* @param string $locale

* The language range to check against *

* @param bool $canonicalize

* If true, the arguments will be converted to canonical form before * matching. *

* @return bool|null TRUE if $locale matches $langtag FALSE otherwise. */ #[Pure] function locale_filter_matches( string $languageTag, string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] bool $canonicalize, #[ElementAvailable(from: '7.0')] bool $canonicalize = false ): ?bool {} /** * Canonicalize the locale string * @param string $locale * * @return null|string */ #[Pure] function locale_canonicalize(string $locale): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Searches the language tag list for the best match to the language * @link https://php.net/manual/en/locale.lookup.php * @param string[] $languageTag

* An array containing a list of language tags to compare to * locale. Maximum 100 items allowed. *

* @param string $locale

* The locale to use as the language range when matching. *

* @param bool $canonicalize

* If true, the arguments will be converted to canonical form before * matching. *

* @param string|null $defaultLocale

* The locale to use if no match is found. *

* @return string|null The closest matching language tag or default value. */ #[Pure] function locale_lookup( array $languageTag, string $locale, #[ElementAvailable(from: '5.3', to: '5.6')] bool $canonicalize, #[ElementAvailable(from: '5.3', to: '5.6')] ?string $defaultLocale, #[ElementAvailable(from: '7.0')] bool $canonicalize = false, #[ElementAvailable(from: '7.0')] ?string $defaultLocale = null, ): ?string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Tries to find out best available locale based on HTTP "Accept-Language" header * @link https://php.net/manual/en/locale.acceptfromhttp.php * @param string $header

* The string containing the "Accept-Language" header according to format in RFC 2616. *

* @return string|false The corresponding locale identifier. */ #[Pure] function locale_accept_from_http(string $header): string|false {} /** * Constructs a new message formatter * @param string $locale * @param string $pattern * @return MessageFormatter|null */ #[Pure] function msgfmt_create(string $locale, string $pattern): ?MessageFormatter {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format the message * @link https://php.net/manual/en/messageformatter.format.php * @param MessageFormatter $formatter * @param array $values

* Arguments to insert into the format string *

* @return string|false The formatted string, or FALSE if an error occurred */ #[Pure] function msgfmt_format(MessageFormatter $formatter, array $values): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Quick format message * @link https://php.net/manual/en/messageformatter.formatmessage.php * @param string $locale

* The locale to use for formatting locale-dependent parts *

* @param string $pattern

* The pattern string to insert things into. * The pattern uses an 'apostrophe-friendly' syntax; it is run through * umsg_autoQuoteApostrophe * before being interpreted. *

* @param array $values

* The array of values to insert into the format string *

* @return string|false The formatted pattern string or FALSE if an error occurred */ #[Pure] function msgfmt_format_message(string $locale, string $pattern, array $values): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse input string according to pattern * @link https://php.net/manual/en/messageformatter.parse.php * @param MessageFormatter $formatter * @param string $string

* The string to parse *

* @return array|false An array containing the items extracted, or FALSE on error */ #[Pure] function msgfmt_parse(MessageFormatter $formatter, string $string): array|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Quick parse input string * @link https://php.net/manual/en/messageformatter.parsemessage.php * @param string $locale

* The locale to use for parsing locale-dependent parts *

* @param string $pattern

* The pattern with which to parse the value. *

* @param string $message

* The string to parse, conforming to the pattern. *

* @return array|false An array containing items extracted, or FALSE on error */ #[Pure] function msgfmt_parse_message(string $locale, string $pattern, string $message): array|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the pattern used by the formatter * @link https://php.net/manual/en/messageformatter.setpattern.php * @param MessageFormatter $formatter * @param string $pattern

* The pattern string to use in this message formatter. * The pattern uses an 'apostrophe-friendly' syntax; it is run through * umsg_autoQuoteApostrophe * before being interpreted. *

* @return bool TRUE on success or FALSE on failure. */ function msgfmt_set_pattern(MessageFormatter $formatter, string $pattern): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the pattern used by the formatter * @link https://php.net/manual/en/messageformatter.getpattern.php * @param MessageFormatter $formatter * @return string|false The pattern string for this message formatter */ #[Pure] function msgfmt_get_pattern(MessageFormatter $formatter): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the locale for which the formatter was created. * @link https://php.net/manual/en/messageformatter.getlocale.php * @param MessageFormatter $formatter * @return string The locale name */ #[Pure] function msgfmt_get_locale(MessageFormatter $formatter): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error code from last operation * @link https://php.net/manual/en/messageformatter.geterrorcode.php * @param MessageFormatter $formatter * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. */ #[Pure(true)] function msgfmt_get_error_code(MessageFormatter $formatter): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error text from the last operation * @link https://php.net/manual/en/messageformatter.geterrormessage.php * @param MessageFormatter $formatter * @return string Description of the last error. */ #[Pure(true)] function msgfmt_get_error_message(MessageFormatter $formatter): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Create a date formatter * @link https://php.net/manual/en/intldateformatter.create.php * @param string|null $locale

* Locale to use when formatting or parsing. *

* @param int $dateType

* Date type to use (none, * short, medium, * long, full). * This is one of the * IntlDateFormatter constants. *

* @param int $timeType

* Time type to use (none, * short, medium, * long, full). * This is one of the * IntlDateFormatter constants. *

* @param string|null $timezone [optional]

* Time zone ID, default is system default. *

* @param IntlCalendar|int|null $calendar [optional]

* Calendar to use for formatting or parsing; default is Gregorian. * This is one of the * IntlDateFormatter calendar constants. *

* @param string|null $pattern [optional]

* Optional pattern to use when formatting or parsing. * Possible patterns are documented at http://userguide.icu-project.org/formatparse/datetime. *

* @return IntlDateFormatter|null */ #[Pure] function datefmt_create( ?string $locale, #[ElementAvailable(from: '5.3', to: '8.0')] int $dateType, #[ElementAvailable(from: '8.1')] int $dateType = 0, #[ElementAvailable(from: '5.3', to: '8.0')] int $timeType, #[ElementAvailable(from: '8.1')] int $timeType = 0, $timezone = null, IntlCalendar|int|null $calendar = null, #[LanguageAware(['8.0' => 'string|null'], default: 'string')] $pattern = null ): ?IntlDateFormatter {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the datetype used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.getdatetype.php * @param IntlDateFormatter $formatter * @return int|false The current date type value of the formatter. */ #[Pure] function datefmt_get_datetype(IntlDateFormatter $formatter): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the timetype used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.gettimetype.php * @param IntlDateFormatter $formatter * @return int|false The current date type value of the formatter. */ #[Pure] function datefmt_get_timetype(IntlDateFormatter $formatter): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the calendar type used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.getcalendar.php * @param IntlDateFormatter $formatter * @return int|false The calendar being used by the formatter. */ #[Pure] function datefmt_get_calendar(IntlDateFormatter $formatter): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* sets the calendar used to the appropriate calendar, which must be * @link https://php.net/manual/en/intldateformatter.setcalendar.php * @param IntlDateFormatter $formatter $mf * @param IntlCalendar|int|null $calendar

* The calendar to use. * Default is IntlDateFormatter::GREGORIAN. *

* @return bool TRUE on success or FALSE on failure. */ function datefmt_set_calendar(IntlDateFormatter $formatter, IntlCalendar|int|null $calendar): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the locale used by formatter * @link https://php.net/manual/en/intldateformatter.getlocale.php * @param IntlDateFormatter $formatter * @param int $type [optional] * @return string|false the locale of this formatter or 'false' if error */ #[Pure] function datefmt_get_locale( IntlDateFormatter $formatter, #[ElementAvailable(from: '8.0')] int $type = ULOC_ACTUAL_LOCALE ): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the timezone-id used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.gettimezoneid.php * @param IntlDateFormatter $formatter * @return string|false ID string for the time zone used by this formatter. */ #[Pure] function datefmt_get_timezone_id(IntlDateFormatter $formatter): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 3.0.0)
* Get copy of formatter's calendar object * @link https://secure.php.net/manual/en/intldateformatter.getcalendarobject.php * @param IntlDateFormatter $formatter * @return IntlCalendar|false|null A copy of the internal calendar object used by this formatter. */ #[Pure] function datefmt_get_calendar_object(IntlDateFormatter $formatter): IntlCalendar|false|null {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Get formatter's timezone * @link https://secure.php.net/manual/en/intldateformatter.gettimezone.php * @param IntlDateFormatter $formatter * @return IntlTimeZone|false The associated IntlTimeZone object or FALSE on failure. */ #[Pure] function datefmt_get_timezone(IntlDateFormatter $formatter): IntlTimeZone|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Sets the time zone to use * @link https://php.net/manual/en/intldateformatter.settimezoneid.php * @param MessageFormatter $mf * @param string $zone

* The time zone ID string of the time zone to use. * If NULL or the empty string, the default time zone for the runtime is used. *

* @return bool TRUE on success or FALSE on failure. * @removed 7.0 * @see datefmt_set_timezone() */ #[Deprecated(replacement: "datefmt_set_timezone(%parametersList%)", since: "5.5")] function datefmt_set_timezone_id(MessageFormatter $mf, $zone) {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Sets formatter's timezone * @link https://php.net/manual/en/intldateformatter.settimezone.php * @param IntlDateFormatter $formatter * @param IntlTimeZone|DateTimeZone|string|null $timezone

* The timezone to use for this formatter. This can be specified in the * following forms: *

    *
  • *

    * NULL, in which case the default timezone will be used, as specified in * the ini setting {@link "https://secure.php.net/manual/en/datetime.configuration.php#ini.date.timezone" date.timezone} or * through the function {@link "https://secure.php.net/manual/en/function.date-default-timezone-set.php" date_default_timezone_set()} and as * returned by {@link "https://secure.php.net/manual/en/function.date-default-timezone-get.php" date_default_timezone_get()}. *

    *
  • *
  • *

    * An {@link "https://secure.php.net/manual/en/class.intltimezone.php" IntlTimeZone}, which will be used directly. *

    *
  • *
  • *

    * A {@link "https://secure.php.net/manual/en/class.datetimezone.php" DateTimeZone}. Its identifier will be extracted * and an ICU timezone object will be created; the timezone will be backed * by ICU's database, not PHP's. *

    *
  • *
  • *

    * A {@link "https://secure.php.net/manual/en/language.types.string.php" string}, which should be a valid ICU timezone identifier. * See IntlTimeZone::createTimeZoneIDEnumeration(). Raw offsets such as "GMT+08:30" are also accepted. *

    *
  • *
*

* @return bool|null TRUE on success or FALSE on failure. */ #[LanguageAware(['8.3' => 'bool'], default: 'bool|null')] function datefmt_set_timezone(IntlDateFormatter $formatter, $timezone) {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the pattern used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.getpattern.php * @param IntlDateFormatter $formatter * @return string|false The pattern string being used to format/parse. */ #[Pure] function datefmt_get_pattern(IntlDateFormatter $formatter): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the pattern used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.setpattern.php * @param IntlDateFormatter $formatter * @param string $pattern

* New pattern string to use. * Possible patterns are documented at http://userguide.icu-project.org/formatparse/datetime. *

* @return bool TRUE on success or FALSE on failure. * Bad formatstrings are usually the cause of the failure. */ function datefmt_set_pattern(IntlDateFormatter $formatter, string $pattern): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the lenient used for the IntlDateFormatter * @link https://php.net/manual/en/intldateformatter.islenient.php * @param IntlDateFormatter $formatter * @return bool TRUE if parser is lenient, FALSE if parser is strict. By default the parser is lenient. */ #[Pure] function datefmt_is_lenient(IntlDateFormatter $formatter): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Set the leniency of the parser * @link https://php.net/manual/en/intldateformatter.setlenient.php * @param IntlDateFormatter $formatter * @param bool $lenient

* Sets whether the parser is lenient or not, default is TRUE (lenient). *

* @return void */ function datefmt_set_lenient( IntlDateFormatter $formatter, #[ElementAvailable(from: '8.0')] bool $lenient ): void {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Format the date/time value as a string * @link https://php.net/manual/en/intldateformatter.format.php * @param IntlDateFormatter $formatter * @param object|array|string|int|float $datetime

* Value to format. This may be a DateTime object, * an integer representing a Unix timestamp value (seconds * since epoch, UTC) or an array in the format output by * localtime. *

* @return string|false The formatted string or, if an error occurred, FALSE. */ #[Pure] function datefmt_format( #[LanguageAware(['8.0' => 'IntlDateFormatter'], default: '')] #[ElementAvailable(from: '5.3', to: '7.4')] $formatter = null, #[LanguageAware(['8.0' => 'IntlDateFormatter'], default: '')] #[ElementAvailable(from: '8.0')] $formatter, #[ElementAvailable(from: '5.3', to: '7.4')] $datetime = null, #[ElementAvailable(from: '8.0')] $datetime ): string|false {} /** * (PHP 5 >= 5.5.0, PECL intl >= 3.0.0)
* Formats an object * @link https://secure.php.net/manual/en/intldateformatter.formatobject.php * @param IntlCalendar|DateTimeInterface $datetime

* An object of type IntlCalendar or DateTime. The timezone information in the object will be used. *

* @param array|int|string|null $format [optional]

* How to format the date/time. This can either be an {https://secure.php.net/manual/en/language.types.array.php array} with * two elements (first the date style, then the time style, these being one * of the constants IntlDateFormatter::NONE, * IntlDateFormatter::SHORT, * IntlDateFormatter::MEDIUM, * IntlDateFormatter::LONG, * IntlDateFormatter::FULL), a long with * the value of one of these constants (in which case it will be used both * for the time and the date) or a {@link https://secure.php.net/manual/en/language.types.string.php} with the format * described in {@link http://www.icu-project.org/apiref/icu4c/classSimpleDateFormat.html#details the ICU documentation} * documentation. If NULL, the default style will be used. *

* @param string|null $locale [optional]

* The locale to use, or NULL to use the default one.

* @return string|false The formatted string or, if an error occurred, FALSE. */ #[Pure] function datefmt_format_object($datetime, $format = null, ?string $locale = null): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse string to a timestamp value * @link https://php.net/manual/en/intldateformatter.parse.php * @param IntlDateFormatter $formatter * @param string $string

* string to convert to a time *

* @param int &$offset [optional]

* Position at which to start the parsing in $value (zero-based). * If no error occurs before $value is consumed, $parse_pos will contain -1 * otherwise it will contain the position at which parsing ended (and the error occurred). * This variable will contain the end position if the parse fails. * If $parse_pos > strlen($value), the parse fails immediately. *

* @return int|float|false timestamp parsed value */ function datefmt_parse(IntlDateFormatter $formatter, string $string, &$offset = null): int|float|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Parse string to a field-based time value * @link https://php.net/manual/en/intldateformatter.localtime.php * @param IntlDateFormatter $formatter * @param string $string

* string to convert to a time *

* @param int &$offset [optional]

* Position at which to start the parsing in $value (zero-based). * If no error occurs before $value is consumed, $parse_pos will contain -1 * otherwise it will contain the position at which parsing ended . * If $parse_pos > strlen($value), the parse fails immediately. *

* @return array|false Localtime compatible array of integers : contains 24 hour clock value in tm_hour field */ function datefmt_localtime(IntlDateFormatter $formatter, string $string, &$offset = null): array|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error code from last operation * @link https://php.net/manual/en/intldateformatter.geterrorcode.php * @param IntlDateFormatter $formatter * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. */ #[Pure(true)] function datefmt_get_error_code(IntlDateFormatter $formatter): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the error text from the last operation. * @link https://php.net/manual/en/intldateformatter.geterrormessage.php * @param IntlDateFormatter $formatter * @return string Description of the last error. */ #[Pure(true)] function datefmt_get_error_message(IntlDateFormatter $formatter): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get string length in grapheme units * @link https://php.net/manual/en/function.grapheme-strlen.php * @param string $string

* The string being measured for length. It must be a valid UTF-8 string. *

* @return int|false|null The length of the string on success, and 0 if the string is empty. */ #[Pure] function grapheme_strlen(string $string): int|false|null {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Find position (in grapheme units) of first occurrence of a string * @link https://php.net/manual/en/function.grapheme-strpos.php * @param string $haystack

* The string to look in. Must be valid UTF-8. *

* @param string $needle

* The string to look for. Must be valid UTF-8. *

* @param int $offset [optional]

* The optional $offset parameter allows you to specify where in $haystack to * start searching as an offset in grapheme units (not bytes or characters). * The position returned is still relative to the beginning of haystack * regardless of the value of $offset. *

* @return int|false the position as an integer. If needle is not found, strpos() will return boolean FALSE. */ #[Pure] function grapheme_strpos(string $haystack, string $needle, int $offset = 0): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Find position (in grapheme units) of first occurrence of a case-insensitive string * @link https://php.net/manual/en/function.grapheme-stripos.php * @param string $haystack

* The string to look in. Must be valid UTF-8. *

* @param string $needle

* The string to look for. Must be valid UTF-8. *

* @param int $offset [optional]

* The optional $offset parameter allows you to specify where in haystack to * start searching as an offset in grapheme units (not bytes or characters). * The position returned is still relative to the beginning of haystack * regardless of the value of $offset. *

* @return int|false the position as an integer. If needle is not found, grapheme_stripos() will return boolean FALSE. */ #[Pure] function grapheme_stripos(string $haystack, string $needle, int $offset = 0): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Find position (in grapheme units) of last occurrence of a string * @link https://php.net/manual/en/function.grapheme-strrpos.php * @param string $haystack

* The string to look in. Must be valid UTF-8. *

* @param string $needle

* The string to look for. Must be valid UTF-8. *

* @param int $offset [optional]

* The optional $offset parameter allows you to specify where in $haystack to * start searching as an offset in grapheme units (not bytes or characters). * The position returned is still relative to the beginning of haystack * regardless of the value of $offset. *

* @return int|false the position as an integer. If needle is not found, grapheme_strrpos() will return boolean FALSE. */ #[Pure] function grapheme_strrpos(string $haystack, string $needle, int $offset = 0): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Find position (in grapheme units) of last occurrence of a case-insensitive string * @link https://php.net/manual/en/function.grapheme-strripos.php * @param string $haystack

* The string to look in. Must be valid UTF-8. *

* @param string $needle

* The string to look for. Must be valid UTF-8. *

* @param int $offset [optional]

* The optional $offset parameter allows you to specify where in $haystack to * start searching as an offset in grapheme units (not bytes or characters). * The position returned is still relative to the beginning of haystack * regardless of the value of $offset. *

* @return int|false the position as an integer. If needle is not found, grapheme_strripos() will return boolean FALSE. */ #[Pure] function grapheme_strripos(string $haystack, string $needle, int $offset = 0): int|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Return part of a string * @link https://php.net/manual/en/function.grapheme-substr.php * @param string $string

* The input string. Must be valid UTF-8. *

* @param int $offset

* Start position in default grapheme units. * If $start is non-negative, the returned string will start at the * $start'th position in $string, counting from zero. If $start is negative, * the returned string will start at the $start'th grapheme unit from the * end of string. *

* @param int|null $length [optional]

* Length in grapheme units. * If $length is given and is positive, the string returned will contain * at most $length grapheme units beginning from $start (depending on the * length of string). If $length is given and is negative, then * that many grapheme units will be omitted from the end of string (after the * start position has been calculated when a start is negative). If $start * denotes a position beyond this truncation, FALSE will be returned. *

* @return string|false

the extracted part of $string,
* or FALSE if $length is negative and $start denotes a position beyond truncation $length,
* or also FALSE if $start denotes a position beyond $string length

*/ #[Pure] function grapheme_substr(string $string, int $offset, ?int $length = null): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns part of haystack string from the first occurrence of needle to the end of haystack. * @link https://php.net/manual/en/function.grapheme-strstr.php * @param string $haystack

* The input string. Must be valid UTF-8. *

* @param string $needle

* The string to look for. Must be valid UTF-8. *

* @param bool $beforeNeedle [optional]

* If TRUE, grapheme_strstr() returns the part of the * haystack before the first occurrence of the needle (excluding the needle). *

* @return string|false the portion of string, or FALSE if needle is not found. */ #[Pure] function grapheme_strstr(string $haystack, string $needle, bool $beforeNeedle = false): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack. * @link https://php.net/manual/en/function.grapheme-stristr.php * @param string $haystack

* The input string. Must be valid UTF-8. *

* @param string $needle

* The string to look for. Must be valid UTF-8. *

* @param bool $beforeNeedle [optional]

* If TRUE, grapheme_strstr() returns the part of the * haystack before the first occurrence of the needle (excluding needle). *

* @return string|false the portion of $haystack, or FALSE if $needle is not found. */ #[Pure] function grapheme_stristr(string $haystack, string $needle, bool $beforeNeedle = false): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Function to extract a sequence of default grapheme clusters from a text buffer, which must be encoded in UTF-8. * @link https://php.net/manual/en/function.grapheme-extract.php * @param string $haystack

* String to search. *

* @param int $size

* Maximum number items - based on the $extract_type - to return. *

* @param int $type

* Defines the type of units referred to by the $size parameter: *

*

* GRAPHEME_EXTR_COUNT (default) - $size is the number of default * grapheme clusters to extract. * GRAPHEME_EXTR_MAXBYTES - $size is the maximum number of bytes * returned. * GRAPHEME_EXTR_MAXCHARS - $size is the maximum number of UTF-8 * characters returned. *

* @param int $offset [optional]

* Starting position in $haystack in bytes - if given, it must be zero or a * positive value that is less than or equal to the length of $haystack in * bytes. If $start does not point to the first byte of a UTF-8 * character, the start position is moved to the next character boundary. *

* @param int &$next [optional]

* Reference to a value that will be set to the next starting position. * When the call returns, this may point to the first byte position past the end of the string. *

* @return string|false A string starting at offset $start and ending on a default grapheme cluster * boundary that conforms to the $size and $extract_type specified. */ function grapheme_extract(string $haystack, int $size, int $type = 0, int $offset = 0, &$next = null): string|false {} /** * (PHP 5 >= 5.3.0, PHP 7, PECL intl >= 1.0.2, PHP 7, PECL idn >= 0.1)
* Convert domain name to IDNA ASCII form. * @link https://php.net/manual/en/function.idn-to-ascii.php * @param string $domain

* Domain to convert. In PHP 5 must be UTF-8 encoded. * If e.g. an ISO-8859-1 (aka Western Europe latin1) encoded string is * passed it will be converted into an ACE encoded "xn--" string. * It will not be the one you expected though! *

* @param int $flags [optional]

* Conversion options - combination of IDNA_* constants (except IDNA_ERROR_* constants). *

* @param int $variant [optional]

* Either INTL_IDNA_VARIANT_2003 for IDNA 2003 or INTL_IDNA_VARIANT_UTS46 for UTS #46. *

* @param array &$idna_info [optional]

* This parameter can be used only if INTL_IDNA_VARIANT_UTS46 was used for variant. * In that case, it will be filled with an array with the keys 'result', * the possibly illegal result of the transformation, 'isTransitionalDifferent', * a boolean indicating whether the usage of the transitional mechanisms of UTS #46 * either has or would have changed the result and 'errors', * which is an int representing a bitset of the error constants IDNA_ERROR_*. *

* @return string|false The ACE encoded version of the domain name or FALSE on failure. */ function idn_to_ascii(string $domain, int $flags = 0, int $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info): string|false {} /** * (PHP 5 >= 5.3.0, PHP 7, PECL intl >= 1.0.2, PHP 7, PECL idn >= 0.1)
* Convert domain name from IDNA ASCII to Unicode. * @link https://php.net/manual/en/function.idn-to-utf8.php * @param string $domain

* Domain to convert in IDNA ASCII-compatible format. * The ASCII encoded domain name. Looks like "xn--..." if the it originally contained non-ASCII characters. *

* @param int $flags [optional]

* Conversion options - combination of IDNA_* constants (except IDNA_ERROR_* constants). *

* @param int $variant [optional]

* Either INTL_IDNA_VARIANT_2003 for IDNA 2003 or INTL_IDNA_VARIANT_UTS46 for UTS #46. *

* @param array &$idna_info [optional]

* This parameter can be used only if INTL_IDNA_VARIANT_UTS46 was used for variant. * In that case, it will be filled with an array with the keys 'result', * the possibly illegal result of the transformation, 'isTransitionalDifferent', * a boolean indicating whether the usage of the transitional mechanisms of UTS #46 * either has or would have changed the result and 'errors', * which is an int representing a bitset of the error constants IDNA_ERROR_*. *

* @return string|false The UTF-8 encoded version of the domain name or FALSE on failure. * RFC 3490 4.2 states though "ToUnicode never fails. If any step fails, then the original input * sequence is returned immediately in that step." */ function idn_to_utf8(string $domain, int $flags = 0, int $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create a new IntlCalendar * @link https://secure.php.net/manual/en/intlcalendar.createinstance.php * @param IntlTimeZone|DateTimeZone|string|null $timezone [optional]

* The timezone to use. *

* *
    *
  • *

    * NULL, in which case the default timezone will be used, as specified in * the ini setting {@link https://secure.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone} or * through the function {@link https://secure.php.net/manual/en/function.date-default-timezone-set.php date_default_timezone_set()} and as * returned by {@link https://secure.php.net/manual/en/function.date-default-timezone-get.php date_default_timezone_get()}. *

    *
  • *
  • *

    * An {@link https://secure.php.net/manual/en/class.intltimezone.php IntlTimeZone}, which will be used directly. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/class.datetimezone.php DateTimeZone}. Its identifier will be extracted * and an ICU timezone object will be created; the timezone will be backed * by ICU's database, not PHP's. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/language.types.string.php string}, which should be a valid ICU timezone identifier. * See IntlTimeZone::createTimeZoneIDEnumeration(). Raw * offsets such as "GMT+08:30" are also accepted. *

    *
  • *
*

* @param string|null $locale [optional]

* A locale to use or NULL to use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.default-locale the default locale}. *

* @return IntlCalendar|null * The created {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} instance or NULL on * failure. * @since 5.5 */ #[Pure] function intlcal_create_instance($timezone = null, ?string $locale = null): ?IntlCalendar {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get set of locale keyword values * @param string $keyword

* The locale keyword for which relevant values are to be queried. Only * 'calendar' is supported. *

* @param string $locale

* The locale onto which the keyword/value pair are to be appended. *

* @param bool $onlyCommon *

* Whether to show only the values commonly used for the specified locale. *

* @return IntlIterator|false An iterator that yields strings with the locale keyword values or FALSE on failure. * @since 5.5 */ #[Pure] function intlcal_get_keyword_values_for_locale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get number representing the current time * @link https://secure.php.net/manual/en/intlcalendar.getnow.php * @return float A float representing a number of milliseconds since the epoch, not counting leap seconds. * @since 5.5 */ #[Pure(true)] function intlcal_get_now(): float {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get array of locales for which there is data * @link https://secure.php.net/manual/en/intlcalendar.getavailablelocales.php * @return string[] An array of strings, one for which locale. * @since 5.5 */ #[Pure] function intlcal_get_available_locales(): array {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the value for a field * @link https://secure.php.net/manual/en/intlcalendar.get.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int An integer with the value of the time field. * @since 5.5 */ #[Pure] function intl_get($calendar, $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get time currently represented by the object * @param IntlCalendar $calendar

The calendar whose time will be checked against this object's time.

* @return float * A {@link https://secure.php.net/manual/en/language.types.float.php float} representing the number of milliseconds elapsed since the * reference time (1 Jan 1970 00:00:00 UTC). * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'float|false'], default: 'float')] function intlcal_get_time(IntlCalendar $calendar) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set the calendar time in milliseconds since the epoch * @link https://secure.php.net/manual/en/intlcalendar.settime.php * @param IntlCalendar $calendar

* The IntlCalendar resource. *

* @param float $timestamp

* An instant represented by the number of number of milliseconds between * such instant and the epoch, ignoring leap seconds. *

* @return bool * Returns TRUE on success and FALSE on failure. * @since 5.5 */ function intlcal_set_time(IntlCalendar $calendar, float $timestamp): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Add a (signed) amount of time to a field * @link https://secure.php.net/manual/en/intlcalendar.add.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. * These are integer values between 0 and * IntlCalendar::FIELD_COUNT. *

* @param int $value

The signed amount to add to the current field. If the amount is positive, the instant will be moved forward; if it is negative, the instant wil be moved into the past. The unit is implicit to the field type. * For instance, hours for IntlCalendar::FIELD_HOUR_OF_DAY.

* @return bool Returns TRUE on success or FALSE on failure. * @since 5.5 */ function intlcal_add(IntlCalendar $calendar, int $field, int $value): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set the timezone used by this calendar * @link https://secure.php.net/manual/en/intlcalendar.settimezone.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param IntlTimeZone|DateTimeZone|string|null $timezone

* The new timezone to be used by this calendar. It can be specified in the * following ways: * *

    *
  • *

    * NULL, in which case the default timezone will be used, as specified in * the ini setting {@link https://secure.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone} or * through the function {@link https://secure.php.net/manual/en/function.date-default-timezone-set.php date_default_timezone_set()} and as * returned by {@link https://secure.php.net/manual/en/function.date-default-timezone-get.php date_default_timezone_get()}. *

    *
  • *
  • *

    * An {@link https://secure.php.net/manual/en/class.intltimezone.php IntlTimeZone}, which will be used directly. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/class.datetimezone.php DateTimeZone}. Its identifier will be extracted * and an ICU timezone object will be created; the timezone will be backed * by ICU's database, not PHP's. *

    *
  • *
  • *

    * A {@link https://secure.php.net/manual/en/language.types.string.php string}, which should be a valid ICU timezone identifier. * See IntlTimeZone::createTimeZoneIDEnumeration(). Raw * offsets such as "GMT+08:30" are also accepted. *

    *
  • *
* @return bool Returns TRUE on success and FALSE on failure. * @since 5.5 */ function intlcal_set_time_zone(IntlCalendar $calendar, $timezone): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether this object's time is after that of the passed object * https://secure.php.net/manual/en/intlcalendar.after.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param IntlCalendar $other

The calendar whose time will be checked against this object's time.

* @return bool * Returns TRUE if this object's current time is after that of the * calendar argument's time. Returns FALSE otherwise. * Also returns FALSE on failure. You can use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to detect error conditions. * @since 5.5 */ #[Pure] function intlcal_after(IntlCalendar $calendar, IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether this object's time is before that of the passed object * @link https://secure.php.net/manual/en/intlcalendar.before.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param IntlCalendar $other

The calendar whose time will be checked against this object's time.

* @return bool *

* Returns TRUE if this object's current time is before that of the * calendar argument's time. Returns FALSE otherwise. * Also returns FALSE on failure. You can use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to detect error conditions. *

* @since 5.5 */ #[Pure] function intlcal_before(IntlCalendar $calendar, IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set a time field or several common fields at once * @link https://secure.php.net/manual/en/intlcalendar.set.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $year

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @param int $month

* The new value for IntlCalendar::FIELD_MONTH. *

* @param int $dayOfMonth [optional]

* The new value for IntlCalendar::FIELD_DAY_OF_MONTH. * The month sequence is zero-based, i.e., January is represented by 0, * February by 1, ..., December is 11 and Undecember (if the calendar has * it) is 12. *

* @param int $hour [optional] *

* The new value for IntlCalendar::FIELD_HOUR_OF_DAY. *

* @param int $minute [optional] *

* The new value for IntlCalendar::FIELD_MINUTE. *

* @param int $second [optional]

* The new value for IntlCalendar::FIELD_SECOND. *

* @return bool Returns TRUE on success and FALSE on failure. * @since 5.5 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] #[Deprecated( reason: 'use IntlCalendar::set(), IntlCalendar::setDate(), or IntlCalendar::setDateTime() instead', since: '8.4' )] function intlcal_set(IntlCalendar $calendar, int $year, int $month, int $dayOfMonth, int $hour, int $minute, int $second) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Add value to field without carrying into more significant fields * @link https://secure.php.net/manual/en/intlcalendar.roll.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

One of the * {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time * {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. * These are integer values between 0 and * IntlCalendar::FIELD_COUNT. *

* @param int|bool $value

* The (signed) amount to add to the field, TRUE for rolling up (adding * 1), or FALSE for rolling down (subtracting * 1). *

* @return bool Returns TRUE on success or FALSE on failure. * @since 5.5 */ function intlcal_roll( IntlCalendar $calendar, int $field, #[ElementAvailable(from: '5.3', to: '7.4')] $value = null, #[ElementAvailable(from: '8.0')] $value ): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Clear a field or all fields * @link https://secure.php.net/manual/en/intlcalendar.clear.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int|null $field [optional]

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return bool Returns TRUE on success or FALSE on failure. Failure can only occur is invalid arguments are provided. * @since 5.5 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] function intlcal_clear(IntlCalendar $calendar, ?int $field = null): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Calculate difference between given time and this object's time * @link https://secure.php.net/manual/en/intlcalendar.fielddifference.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param float $timestamp

* The time against which to compare the quantity represented by the * field. For the result to be positive, the time * given for this parameter must be ahead of the time of the object the * method is being invoked on. *

* @param int $field

* The field that represents the quantity being compared. *

* *

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int Returns a (signed) difference of time in the unit associated with the * specified field or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_field_difference(IntlCalendar $calendar, float $timestamp, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* The maximum value for a field, considering the object's current time * @link https://secure.php.net/manual/en/intlcalendar.getactualmaximum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing the maximum value in the units associated * with the given field or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_actual_maximum(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* The minimum value for a field, considering the object's current time * @link https://secure.php.net/manual/en/intlcalendar.getactualminimum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. * These are integer values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing the minimum value in the field's * unit or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_actual_minimum(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @link https://secure.php.net/manual/en/intlcalendar.getdayofweektype.php * Tell whether a day is a weekday, weekend or a day that has a transition between the two * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $dayOfWeek

* One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY. *

* @return int * Returns one of the constants * IntlCalendar::DOW_TYPE_WEEKDAY, * IntlCalendar::DOW_TYPE_WEEKEND, * IntlCalendar::DOW_TYPE_WEEKEND_OFFSET or * IntlCalendar::DOW_TYPE_WEEKEND_CEASE or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_day_of_week_type(IntlCalendar $calendar, int $dayOfWeek) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the first day of the week for the calendar's locale * @link https://secure.php.net/manual/en/intlcalendar.getfirstdayofweek.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return int * One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_first_day_of_week(IntlCalendar $calendar) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the largest local minimum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getgreatestminimum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT.

* @return int * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing a field value, in the field's * unit, or FALSE on failure. * @since 5.5 */ #[Pure] function intlcal_greates_minimum($calendar, $field) {} /** * (PHP >= 5.5.0, PECL intl >= 3.0.0a1)
* Gets the value for a specific field. * @link https://www.php.net/manual/en/intlcalendar.get.php * @param IntlCalendar $calendar

* The IntlCalendar resource. *

* @param int $field

* One of the IntlCalendar date/time field constants. These are integer values between 0 and IntlCalendar::FIELD_COUNT. *

* @return int An integer with the value of the time field. */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the smallest local maximum for a field * @link https://secure.php.net/manual/en/intlcalendar.getleastmaximum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int *

An {@link https://secure.php.net/manual/en/language.types.integer.ph int} representing a field value in the field's * unit or FALSE on failure. *

* @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_least_maximum(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the largest local minimum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getgreatestminimum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT.

* @return int * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing a field value, in the field's * unit, or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_greatest_minimum(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the locale associated with the object * @link https://secure.php.net/manual/en/intlcalendar.getlocale.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $type

* Whether to fetch the actual locale (the locale from which the calendar * data originates, with Locale::ACTUAL_LOCALE) or the * valid locale, i.e., the most specific locale supported by ICU relatively * to the requested locale – see Locale::VALID_LOCALE. * From the most general to the most specific, the locales are ordered in * this fashion – actual locale, valid locale, requested locale. *

* @return string * A locale string or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'string|false'], default: 'string')] function intlcal_get_locale(IntlCalendar $calendar, int $type) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the global maximum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getmaximum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false * @since 5.5 */ #[Pure] function intcal_get_maximum($calendar, $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @link https://secure.php.net/manual/en/intlcalendar.getminimaldaysinfirstweek.php * Get minimal number of days the first week in a year or month can have * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return int * An {@link https://secure.php.net/manual/en/language.types.integer.php int} representing a number of days or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_minimal_days_in_first_week(IntlCalendar $calendar) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the global minimum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getminimum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int * An int representing a value for the given field in the field's unit or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_minimum(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the object's timezone * @link https://secure.php.net/manual/en/intlcalendar.gettimezone.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return IntlTimeZone|false * An {@link https://secure.php.net/manual/en/class.intltimezone.php IntlTimeZone} object corresponding to the one used * internally in this object. * @since 5.5 */ #[Pure] function intlcal_get_time_zone(IntlCalendar $calendar): IntlTimeZone|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the calendar type * @link https://secure.php.net/manual/en/intlcalendar.gettype.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return string * A {@link https://secure.php.net/manual/en/language.types.string.php string} representing the calendar type, such as * 'gregorian', 'islamic', etc. * @since 5.5 */ #[Pure] function intlcal_get_type(IntlCalendar $calendar): string {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get time of the day at which weekend begins or ends * @link https://secure.php.net/manual/en/intlcalendar.getweekendtransition.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $dayOfWeek

* One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY. *

* @return int * The number of milliseconds into the day at which the the weekend begins or * ends or FALSE on failure. * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_weekend_transition(IntlCalendar $calendar, int $dayOfWeek) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether the object's time is in Daylight Savings Time * @link https://secure.php.net/manual/en/intlcalendar.indaylighttime.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return bool * Returns TRUE if the date is in Daylight Savings Time, FALSE otherwise. * The value FALSE may also be returned on failure, for instance after * specifying invalid field values on non-lenient mode; use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or query * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to disambiguate. * @since 5.5 */ #[Pure] function intlcal_in_daylight_time(IntlCalendar $calendar): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether date/time interpretation is in lenient mode * @link https://secure.php.net/manual/en/intlcalendar.islenient.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return bool * A {@link https://secure.php.net/manual/en/language.types.boolean.php bool} representing whether the calendar is set to lenient mode. * @since 5.5 */ #[Pure] function intlcal_is_lenient(IntlCalendar $calendar): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether a field is set * @link https://secure.php.net/manual/en/intlcalendar.isset.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return bool Assuming there are no argument errors, returns TRUE iif the field is set. * @since 5.5 */ #[Pure] function intlcal_is_set(IntlCalendar $calendar, int $field): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the global maximum value for a field * @link https://secure.php.net/manual/en/intlcalendar.getmaximum.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $field

* One of the {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} date/time {@link https://secure.php.net/manual/en/class.intlcalendar.php#intlcalendar.constants field constants}. These are integer * values between 0 and * IntlCalendar::FIELD_COUNT. *

* @return int|false * @since 5.5 */ #[Pure] #[LanguageAware(['8.0' => 'int|false'], default: 'int')] function intlcal_get_maximum(IntlCalendar $calendar, int $field) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether another calendar is equal but for a different time * @link https://secure.php.net/manual/en/intlcalendar.isequivalentto.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param IntlCalendar $other The other calendar against which the comparison is to be made. * @return bool * Assuming there are no argument errors, returns TRUE iif the calendars are equivalent except possibly for their set time. * @since 5.5 */ #[Pure] function intlcal_is_equivalent_to(IntlCalendar $calendar, IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Whether a certain date/time is in the weekend * @link https://secure.php.net/manual/en/intlcalendar.isweekend.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param float|null $timestamp [optional]

* An optional timestamp representing the number of milliseconds since the * epoch, excluding leap seconds. If NULL, this object's current time is * used instead. *

* @return bool *

A {@link https://secure.php.net/manual/en/language.types.boolean.php bool} indicating whether the given or this object's time occurs * in a weekend. *

*

* The value FALSE may also be returned on failure, for instance after giving * a date out of bounds on non-lenient mode; use {@link https://secure.php.net/manual/en/intl.configuration.php#ini.intl.use-exceptions exceptions} or query * {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()} to disambiguate.

* @since 5.5 */ #[Pure] function intlcal_is_weekend(IntlCalendar $calendar, ?float $timestamp = null): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set the day on which the week is deemed to start * @link https://secure.php.net/manual/en/intlcalendar.setfirstdayofweek.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $dayOfWeek

* One of the constants IntlCalendar::DOW_SUNDAY, * IntlCalendar::DOW_MONDAY, ..., * IntlCalendar::DOW_SATURDAY. *

* @return bool Returns TRUE on success. Failure can only happen due to invalid parameters. * @since 5.5 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] function intlcal_set_first_day_of_week(IntlCalendar $calendar, int $dayOfWeek) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set whether date/time interpretation is to be lenient * @link https://secure.php.net/manual/en/intlcalendar.setlenient.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param bool $lenient

* Use TRUE to activate the lenient mode; FALSE otherwise. *

* @return bool Returns TRUE on success. Failure can only happen due to invalid parameters. * @since 5.5 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] function intlcal_set_lenient(IntlCalendar $calendar, bool $lenient) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get behavior for handling repeating wall time * @link https://secure.php.net/manual/en/intlcalendar.getrepeatedwalltimeoption.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return int * One of the constants IntlCalendar::WALLTIME_FIRST or * IntlCalendar::WALLTIME_LAST. * @since 5.5 */ #[Pure] function intlcal_get_repeated_wall_time_option(IntlCalendar $calendar): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Compare time of two IntlCalendar objects for equality * @link https://secure.php.net/manual/en/intlcalendar.equals.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param IntlCalendar $other * @return bool

* Returns TRUE if the current time of both this and the passed in * {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} object are the same, or FALSE * otherwise. The value FALSE can also be returned on failure. This can only * happen if bad arguments are passed in. In any case, the two cases can be * distinguished by calling {@link https://secure.php.net/manual/en/function.intl-get-error-code.php intl_get_error_code()}. *

* @since 5.5 */ #[Pure] function intlcal_equals(IntlCalendar $calendar, IntlCalendar $other): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get behavior for handling skipped wall time * @link https://secure.php.net/manual/en/intlcalendar.getskippedwalltimeoption.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return int * One of the constants IntlCalendar::WALLTIME_FIRST, * IntlCalendar::WALLTIME_LAST or * IntlCalendar::WALLTIME_NEXT_VALID. * @since 5.5 */ #[Pure] function intlcal_get_skipped_wall_time_option(IntlCalendar $calendar): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set behavior for handling repeating wall times at negative timezone offset transitions * @link https://secure.php.net/manual/en/intlcalendar.setrepeatedwalltimeoption.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $option

* One of the constants IntlCalendar::WALLTIME_FIRST or * IntlCalendar::WALLTIME_LAST. *

* @return bool * Returns TRUE on success. Failure can only happen due to invalid parameters. * @since 5.5 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] function intlcal_set_repeated_wall_time_option(IntlCalendar $calendar, int $option) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Set behavior for handling skipped wall times at positive timezone offset transitions * @link https://secure.php.net/manual/en/intlcalendar.setskippedwalltimeoption.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @param int $option

* One of the constants IntlCalendar::WALLTIME_FIRST, * IntlCalendar::WALLTIME_LAST or * IntlCalendar::WALLTIME_NEXT_VALID. *

* @return bool *

* Returns TRUE on success. Failure can only happen due to invalid parameters. *

* @since 5.5 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] function intlcal_set_skipped_wall_time_option(IntlCalendar $calendar, int $option) {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a2)
* Create an IntlCalendar from a DateTime object or string * @link https://secure.php.net/manual/en/intlcalendar.fromdatetime.php * @param DateTime|string $datetime

* A {@link https://secure.php.net/manual/en/class.datetime.php DateTime} object or a {@link https://secure.php.net/manual/en/language.types.string.php string} that * can be passed to {@link https://secure.php.net/manual/en/datetime.construct.php DateTime::__construct()}. *

* @param null|string $locale * @return IntlCalendar|null * The created {@link https://secure.php.net/manual/en/class.intlcalendar.php IntlCalendar} object or NULL in case of * failure. If a {@link https://secure.php.net/manual/en/language.types.string.php string} is passed, any exception that occurs * inside the {@link https://secure.php.net/manual/en/class.datetime.php DateTime} constructor is propagated. * @since 5.5 */ #[Pure] function intlcal_from_date_time( DateTime|string $datetime, #[ElementAvailable(from: '8.0')] ?string $locale = null ): ?IntlCalendar {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a2)
* Convert an IntlCalendar into a DateTime object * @link https://secure.php.net/manual/en/intlcalendar.todatetime.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return DateTime|false * A {@link https://secure.php.net/manual/en/class.datetime.php DateTime} object with the same timezone as this * object (though using PHP's database instead of ICU's) and the same time, * except for the smaller precision (second precision instead of millisecond). * Returns FALSE on failure. * @since 5.5 */ #[Pure] function intlcal_to_date_time(IntlCalendar $calendar): DateTime|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error code on the object * @link https://secure.php.net/manual/en/intlcalendar.geterrorcode.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return int|false An ICU error code indicating either success, failure or a warning. * @since 5.5 */ #[Pure(true)] function intlcal_get_error_code(IntlCalendar $calendar): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error message on the object * @link https://secure.php.net/manual/en/intlcalendar.geterrormessage.php * @param IntlCalendar $calendar

* The calendar object, on the procedural style interface. *

* @return string|false The error message associated with last error that occurred in a function call on this object, or a string indicating the non-existance of an error. * @since 5.5 */ #[Pure(true)] function intlcal_get_error_message(IntlCalendar $calendar): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the number of IDs in the equivalency group that includes the given ID * @link https://secure.php.net/manual/en/intltimezone.countequivalentids.php * @param string $timezoneId * @return int|false * @since 5.5 */ #[Pure] function intltz_count_equivalent_ids(string $timezoneId): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create a new copy of the default timezone for this host * @link https://secure.php.net/manual/en/intltimezone.createdefault.php * @return IntlTimeZone * @since 5.5 */ #[Pure] function intlz_create_default() {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @link https://secure.php.net/manual/en/intltimezone.createenumeration.php * @param IntlTimeZone|string|int|float|null $countryOrRawOffset [optional] * @return IntlIterator|false * @since 5.5 */ #[Pure] function intltz_create_enumeration($countryOrRawOffset): IntlIterator|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @link https://secure.php.net/manual/en/intltimezone.createtimezone.php * @param string $timezoneId * @return IntlTimeZone|null * @since 5.5 */ #[Pure] function intltz_create_time_zone(string $timezoneId): ?IntlTimeZone {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @link https://secure.php.net/manual/en/intltimezone.fromdatetimezone.php * @param DateTimeZone $timezone * @return IntlTimeZone|null * @since 5.5 */ #[Pure] function intltz_from_date_time_zone(DateTimeZone $timezone): ?IntlTimeZone {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the canonical system timezone ID or the normalized custom time zone ID for the given time zone ID * @link https://secure.php.net/manual/en/intltimezone.getcanonicalid.php * @param string $timezoneId * @param bool &$isSystemId [optional] * @return string|false * @since 5.5 */ #[Pure] function intltz_get_canonical_id(string $timezoneId, &$isSystemId): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get a name of this time zone suitable for presentation to the user * @param IntlTimeZone $timezone -

* The time zone object, on the procedural style interface. *

* @param bool $dst [optional] * @param int $style [optional] * @param string|null $locale [optional] * @return string|false * @since 5.5 */ #[Pure] function intltz_get_display_name(IntlTimeZone $timezone, bool $dst = false, int $style = 2, ?string $locale): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the amount of time to be added to local standard time to get local wall clock time * @param IntlTimeZone $timezone -

* The time zone object, on the procedural style interface. *

* @return int * @link https://secure.php.net/manual/en/intltimezone.getequivalentid.php * @since 5.5 */ #[Pure] function intltz_get_dst_savings(IntlTimeZone $timezone): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get an ID in the equivalency group that includes the given ID * @link https://secure.php.net/manual/en/intltimezone.getequivalentid.php * @param string $timezoneId * @param int $offset * @return string|false * @since 5.5 */ #[Pure] function intltz_get_equivalent_id(string $timezoneId, int $offset): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error code on the object * @link https://secure.php.net/manual/en/intltimezone.geterrorcode.php * @param IntlTimeZone $timezone -

* The time zone object, on the procedural style interface. *

* @return int|false * @since 5.5 */ #[Pure(true)] function intltz_get_error_code(IntlTimeZone $timezone): int|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get last error message on the object * @link https://secure.php.net/manual/en/intltimezone.geterrormessage.php * @param IntlTimeZone $timezone -

* The time zone object, on the procedural style interface. *

* @return string|false * @since 5.5 */ #[Pure(true)] function intltz_get_error_message(IntlTimeZone $timezone): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Create GMT (UTC) timezone * @link https://secure.php.net/manual/en/intltimezone.getgmt.php * @return IntlTimeZone * @since 5.5 */ #[Pure] function intltz_getGMT(): IntlTimeZone {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get timezone ID * @link https://secure.php.net/manual/en/intltimezone.getid.php * @param IntlTimeZone $timezone * @return string|false * @since 5.5 */ #[Pure] function intltz_get_id(IntlTimeZone $timezone): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the time zone raw and GMT offset for the given moment in time * @link https://secure.php.net/manual/en/intltimezone.getoffset.php * @param IntlTimeZone $timezone * @param float $timestamp * @param bool $local * @param int &$rawOffset * @param int &$dstOffset * @return bool * @since 5.5 */ #[Pure] function intltz_get_offset(IntlTimeZone $timezone, float $timestamp, bool $local, &$rawOffset, &$dstOffset): bool {} /** * Get the raw GMT offset (before taking daylight savings time into account * @link https://secure.php.net/manual/en/intltimezone.getrawoffset.php * @param IntlTimeZone $timezone * @return int */ #[Pure] function intltz_get_raw_offset(IntlTimeZone $timezone): int {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Get the timezone data version currently used by ICU * @link https://secure.php.net/manual/en/intltimezone.gettzdataversion.php * @return string|false * @since 5.5 */ #[Pure] function intltz_get_tz_data_version(): string|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Check if this zone has the same rules and offset as another zone * @link https://secure.php.net/manual/en/intltimezone.hassamerules.php * @param IntlTimeZone $timezone * @param IntlTimeZone $other * @return bool * @since 5.5 */ #[Pure] function intltz_has_same_rules( IntlTimeZone $timezone, #[ElementAvailable(from: '5.5', to: '7.4')] IntlTimeZone $other = null, #[ElementAvailable(from: '8.0')] IntlTimeZone $other ): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Convert to DateTimeZone object * @link https://secure.php.net/manual/en/intltimezone.todatetimezone.php * @param IntlTimeZone $timezone * @return DateTimeZone|false * @since 5.5 */ #[Pure] function intltz_to_date_time_zone(IntlTimeZone $timezone): DateTimeZone|false {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* Check if this time zone uses daylight savings time * @link https://secure.php.net/manual/en/intltimezone.usedaylighttime.php * @param IntlTimeZone $timezone * @return bool * @since 5.5 */ #[Pure] function intltz_use_daylight_time(IntlTimeZone $timezone): bool {} /** * (PHP 5 >=5.5.0 PECL intl >= 3.0.0a1)
* @param DateTimeZone|IntlTimeZone|string|int|null $timezoneOrYear [optional] * @param string|null $localeOrMonth [optional] * @param int $day [optional] * @param int $hour [optional] * @param int $minute [optional] * @param int $second [optional] * @return IntlGregorianCalendar|null * @since 5.5 */ #[Pure] #[Deprecated( reason: 'use IntlGregorianCalendar::__construct(), IntlGregorianCalendar::createFromDate(), or IntlGregorianCalendar::createFromDateTime() instead', since: '8.4' )] function intlgregcal_create_instance($timezoneOrYear, $localeOrMonth, $day, $hour, $minute, $second): ?IntlGregorianCalendar {} /** * @param IntlGregorianCalendar $calendar * @param float $timestamp * @return bool */ function intlgregcal_set_gregorian_change(IntlGregorianCalendar $calendar, float $timestamp): bool {} /** * @param IntlGregorianCalendar $calendar * @return float */ #[Pure] function intlgregcal_get_gregorian_change(IntlGregorianCalendar $calendar): float {} /** * @param IntlGregorianCalendar $calendar * @param int $year * @return bool */ #[Pure] function intlgregcal_is_leap_year(IntlGregorianCalendar $calendar, int $year): bool {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Create a resource bundle * @link https://php.net/manual/en/resourcebundle.create.php * @param string|null $locale

* Locale for which the resources should be loaded (locale name, e.g. en_CA). *

* @param string|null $bundle

* The directory where the data is stored or the name of the .dat file. *

* @param bool $fallback [optional]

* Whether locale should match exactly or fallback to parent locale is allowed. *

* @return ResourceBundle|null ResourceBundle object or NULL on error. */ #[Pure] function resourcebundle_create(?string $locale, ?string $bundle, bool $fallback = true): ?ResourceBundle {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get data from the bundle * @link https://php.net/manual/en/resourcebundle.get.php * @param ResourceBundle $bundle * @param string|int $index

* Data index, must be string or integer. *

* @param bool $fallback * @return mixed the data located at the index or NULL on error. Strings, integers and binary data strings * are returned as corresponding PHP types, integer array is returned as PHP array. Complex types are * returned as ResourceBundle object. */ #[Pure] #[LanguageAware(['8.4' => 'ResourceBundle|array|string|int|null'], default: 'mixed')] function resourcebundle_get(ResourceBundle $bundle, string|int $index, bool $fallback = true) {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get number of elements in the bundle * @link https://php.net/manual/en/resourcebundle.count.php * @param ResourceBundle $bundle * @return int number of elements in the bundle. */ #[Pure] function resourcebundle_count(ResourceBundle $bundle): int {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get supported locales * @link https://php.net/manual/en/resourcebundle.locales.php * @param string $bundle

* Path of ResourceBundle for which to get available locales, or * empty string for default locales list. *

* @return array|false the list of locales supported by the bundle. */ #[Pure] function resourcebundle_locales(string $bundle): array|false {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get bundle's last error code. * @link https://php.net/manual/en/resourcebundle.geterrorcode.php * @param ResourceBundle $bundle * @return int error code from last bundle object call. */ #[Pure(true)] function resourcebundle_get_error_code(ResourceBundle $bundle): int {} /** * (PHP >= 5.3.2, PECL intl >= 2.0.0)
* Get bundle's last error message. * @link https://php.net/manual/en/resourcebundle.geterrormessage.php * @param ResourceBundle $bundle * @return string error message from last bundle object's call. */ #[Pure(true)] function resourcebundle_get_error_message(ResourceBundle $bundle): string {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Create a transliterator * @link https://php.net/manual/en/transliterator.create.php * @param string $id

* The id. *

* @param int $direction

* The direction, defaults to * Transliterator::FORWARD. * May also be set to * Transliterator::REVERSE. *

* @return Transliterator|null a Transliterator object on success, * or NULL on failure. * @since 5.4 */ #[Pure] function transliterator_create(string $id, int $direction = 0): ?Transliterator {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Create transliterator from rules * @link https://php.net/manual/en/transliterator.createfromrules.php * @param string $rules

* The rules. *

* @param int $direction

* The direction, defaults to * Transliterator::FORWARD. * May also be set to * Transliterator::REVERSE. *

* @return Transliterator|null a Transliterator object on success, * or NULL on failure. * @since 5.4 */ #[Pure] function transliterator_create_from_rules(string $rules, int $direction = 0): ?Transliterator {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Get transliterator IDs * @link https://php.net/manual/en/transliterator.listids.php * @return string[]|false An array of registered transliterator IDs on success, * or FALSE on failure. * @since 5.4 */ #[Pure] function transliterator_list_ids(): array|false {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Create an inverse transliterator * @link https://php.net/manual/en/transliterator.createinverse.php * @param Transliterator $transliterator * @return Transliterator|null a Transliterator object on success, * or NULL on failure * @since 5.4 */ #[Pure] function transliterator_create_inverse(Transliterator $transliterator): ?Transliterator {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Transliterate a string * @link https://php.net/manual/en/transliterator.transliterate.php * @param Transliterator|string $transliterator * @param string $string

* The string to be transformed. *

* @param int $start

* The start index (in UTF-16 code units) from which the string will start * to be transformed, inclusive. Indexing starts at 0. The text before will * be left as is. *

* @param int $end

* The end index (in UTF-16 code units) until which the string will be * transformed, exclusive. Indexing starts at 0. The text after will be * left as is. *

* @return string|false The transfomed string on success, or FALSE on failure. * @since 5.4 */ #[Pure] function transliterator_transliterate(Transliterator|string $transliterator, string $string, int $start = 0, int $end = -1): string|false {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Get last error code * @link https://php.net/manual/en/transliterator.geterrorcode.php * @param Transliterator $transliterator * @return int|false The error code on success, * or FALSE if none exists, or on failure. * @since 5.4 */ #[Pure(true)] function transliterator_get_error_code(Transliterator $transliterator): int|false {} /** * (PHP >= 5.4.0, PECL intl >= 2.0.0)
* Get last error message * @link https://php.net/manual/en/transliterator.geterrormessage.php * @param Transliterator $transliterator * @return string|false The error code on success, * or FALSE if none exists, or on failure. * @since 5.4 */ #[Pure(true)] function transliterator_get_error_message(Transliterator $transliterator): string|false {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get the last error code * @link https://php.net/manual/en/function.intl-get-error-code.php * @return int Error code returned by the last API function call. */ #[Pure(true)] function intl_get_error_code(): int {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get description of the last error * @link https://php.net/manual/en/function.intl-get-error-message.php * @return string Description of an error occurred in the last API function call. */ #[Pure(true)] function intl_get_error_message(): string {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Check whether the given error code indicates failure * @link https://php.net/manual/en/function.intl-is-failure.php * @param int $errorCode

* is a value that returned by functions: * intl_get_error_code, * collator_get_error_code . *

* @return bool TRUE if it the code indicates some failure, and FALSE * in case of success or a warning. */ #[Pure] function intl_is_failure(int $errorCode): bool {} /** * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
* Get symbolic name for a given error code * @link https://php.net/manual/en/function.intl-error-name.php * @param int $errorCode

* ICU error code. *

* @return string The returned string will be the same as the name of the error code * constant. */ #[Pure] function intl_error_name(int $errorCode): string {} /** * Gets the Decomposition_Mapping property for the given UTF-8 encoded code point * * @link https://www.php.net/manual/en/normalizer.getrawdecomposition.php * * @param string $string * @param int $form * @return string|null * * @since 7.3 */ #[Pure] function normalizer_get_raw_decomposition(string $string, #[ElementAvailable(from: '8.0')] int $form = Normalizer::FORM_C): ?string {} /** * @return IntlTimeZone * @since 5.5 */ #[Pure] function intltz_create_default(): IntlTimeZone {} /** * @return IntlTimeZone * @since 5.5 */ #[Pure] function intltz_get_gmt(): IntlTimeZone {} /** * @return IntlTimeZone * @since 5.5 */ #[Pure] function intltz_get_unknown(): IntlTimeZone {} /** * @param int $type * @param null|string $region * @param null|int $rawOffset * @return IntlIterator|false * @since 5.5 */ #[Pure] function intltz_create_time_zone_id_enumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false {} /** * @param string $timezoneId * @return string|false * @since 5.5 */ #[Pure] function intltz_get_region(string $timezoneId): string|false {} /** * Set minimal number of days the first week in a year or month can have * * @link https://www.php.net/manual/en/intlcalendar.setminimaldaysinfirstweek.php * * @param IntlCalendar $calendar * @param int $days * @return bool * * @since 5.5.1 */ #[LanguageAware(['8.3' => 'true'], default: 'bool')] function intlcal_set_minimal_days_in_first_week(IntlCalendar $calendar, int $days) {} function intltz_get_windows_id(string $timezoneId): string|false {} function intltz_get_id_for_windows_id(string $timezoneId, ?string $region = null): string|false {} /** * @since 8.4 */ function grapheme_str_split(string $string, int $length = 1): array|false {} /** * @since 8.4 */ function intltz_get_iana_id(string $timezoneId): string|false {} /** * Limit on locale length, set to 80 in PHP code. Locale names longer * than this limit will not be accepted. * @link https://php.net/manual/en/intl.constants.php */ define('INTL_MAX_LOCALE_LEN', 156); define('INTL_ICU_VERSION', "74.1"); define('INTL_ICU_DATA_VERSION', "74.1"); define('ULOC_ACTUAL_LOCALE', 0); define('ULOC_VALID_LOCALE', 1); define('GRAPHEME_EXTR_COUNT', 0); define('GRAPHEME_EXTR_MAXBYTES', 1); define('GRAPHEME_EXTR_MAXCHARS', 2); define('U_USING_FALLBACK_WARNING', -128); define('U_ERROR_WARNING_START', -128); define('U_USING_DEFAULT_WARNING', -127); define('U_SAFECLONE_ALLOCATED_WARNING', -126); define('U_STATE_OLD_WARNING', -125); define('U_STRING_NOT_TERMINATED_WARNING', -124); define('U_SORT_KEY_TOO_SHORT_WARNING', -123); define('U_AMBIGUOUS_ALIAS_WARNING', -122); define('U_DIFFERENT_UCA_VERSION', -121); define('U_ERROR_WARNING_LIMIT', -119); define('U_ZERO_ERROR', 0); define('U_ILLEGAL_ARGUMENT_ERROR', 1); define('U_MISSING_RESOURCE_ERROR', 2); define('U_INVALID_FORMAT_ERROR', 3); define('U_FILE_ACCESS_ERROR', 4); define('U_INTERNAL_PROGRAM_ERROR', 5); define('U_MESSAGE_PARSE_ERROR', 6); define('U_MEMORY_ALLOCATION_ERROR', 7); define('U_INDEX_OUTOFBOUNDS_ERROR', 8); define('U_PARSE_ERROR', 9); define('U_INVALID_CHAR_FOUND', 10); define('U_TRUNCATED_CHAR_FOUND', 11); define('U_ILLEGAL_CHAR_FOUND', 12); define('U_INVALID_TABLE_FORMAT', 13); define('U_INVALID_TABLE_FILE', 14); define('U_BUFFER_OVERFLOW_ERROR', 15); define('U_UNSUPPORTED_ERROR', 16); define('U_RESOURCE_TYPE_MISMATCH', 17); define('U_ILLEGAL_ESCAPE_SEQUENCE', 18); define('U_UNSUPPORTED_ESCAPE_SEQUENCE', 19); define('U_NO_SPACE_AVAILABLE', 20); define('U_CE_NOT_FOUND_ERROR', 21); define('U_PRIMARY_TOO_LONG_ERROR', 22); define('U_STATE_TOO_OLD_ERROR', 23); define('U_TOO_MANY_ALIASES_ERROR', 24); define('U_ENUM_OUT_OF_SYNC_ERROR', 25); define('U_INVARIANT_CONVERSION_ERROR', 26); define('U_INVALID_STATE_ERROR', 27); define('U_COLLATOR_VERSION_MISMATCH', 28); define('U_USELESS_COLLATOR_ERROR', 29); define('U_NO_WRITE_PERMISSION', 30); define('U_STANDARD_ERROR_LIMIT', 32); define('U_BAD_VARIABLE_DEFINITION', 65536); define('U_PARSE_ERROR_START', 65536); define('U_MALFORMED_RULE', 65537); define('U_MALFORMED_SET', 65538); define('U_MALFORMED_SYMBOL_REFERENCE', 65539); define('U_MALFORMED_UNICODE_ESCAPE', 65540); define('U_MALFORMED_VARIABLE_DEFINITION', 65541); define('U_MALFORMED_VARIABLE_REFERENCE', 65542); define('U_MISMATCHED_SEGMENT_DELIMITERS', 65543); define('U_MISPLACED_ANCHOR_START', 65544); define('U_MISPLACED_CURSOR_OFFSET', 65545); define('U_MISPLACED_QUANTIFIER', 65546); define('U_MISSING_OPERATOR', 65547); define('U_MISSING_SEGMENT_CLOSE', 65548); define('U_MULTIPLE_ANTE_CONTEXTS', 65549); define('U_MULTIPLE_CURSORS', 65550); define('U_MULTIPLE_POST_CONTEXTS', 65551); define('U_TRAILING_BACKSLASH', 65552); define('U_UNDEFINED_SEGMENT_REFERENCE', 65553); define('U_UNDEFINED_VARIABLE', 65554); define('U_UNQUOTED_SPECIAL', 65555); define('U_UNTERMINATED_QUOTE', 65556); define('U_RULE_MASK_ERROR', 65557); define('U_MISPLACED_COMPOUND_FILTER', 65558); define('U_MULTIPLE_COMPOUND_FILTERS', 65559); define('U_INVALID_RBT_SYNTAX', 65560); define('U_INVALID_PROPERTY_PATTERN', 65561); define('U_MALFORMED_PRAGMA', 65562); define('U_UNCLOSED_SEGMENT', 65563); define('U_ILLEGAL_CHAR_IN_SEGMENT', 65564); define('U_VARIABLE_RANGE_EXHAUSTED', 65565); define('U_VARIABLE_RANGE_OVERLAP', 65566); define('U_ILLEGAL_CHARACTER', 65567); define('U_INTERNAL_TRANSLITERATOR_ERROR', 65568); define('U_INVALID_ID', 65569); define('U_INVALID_FUNCTION', 65570); define('U_PARSE_ERROR_LIMIT', 65571); define('U_UNEXPECTED_TOKEN', 65792); define('U_FMT_PARSE_ERROR_START', 65792); define('U_MULTIPLE_DECIMAL_SEPARATORS', 65793); define('U_MULTIPLE_DECIMAL_SEPERATORS', 65793); define('U_MULTIPLE_EXPONENTIAL_SYMBOLS', 65794); define('U_MALFORMED_EXPONENTIAL_PATTERN', 65795); define('U_MULTIPLE_PERCENT_SYMBOLS', 65796); define('U_MULTIPLE_PERMILL_SYMBOLS', 65797); define('U_MULTIPLE_PAD_SPECIFIERS', 65798); define('U_PATTERN_SYNTAX_ERROR', 65799); define('U_ILLEGAL_PAD_POSITION', 65800); define('U_UNMATCHED_BRACES', 65801); define('U_UNSUPPORTED_PROPERTY', 65802); define('U_UNSUPPORTED_ATTRIBUTE', 65803); define('U_FMT_PARSE_ERROR_LIMIT', 65812); define('U_BRK_INTERNAL_ERROR', 66048); define('U_BRK_ERROR_START', 66048); define('U_BRK_HEX_DIGITS_EXPECTED', 66049); define('U_BRK_SEMICOLON_EXPECTED', 66050); define('U_BRK_RULE_SYNTAX', 66051); define('U_BRK_UNCLOSED_SET', 66052); define('U_BRK_ASSIGN_ERROR', 66053); define('U_BRK_VARIABLE_REDFINITION', 66054); define('U_BRK_MISMATCHED_PAREN', 66055); define('U_BRK_NEW_LINE_IN_QUOTED_STRING', 66056); define('U_BRK_UNDEFINED_VARIABLE', 66057); define('U_BRK_INIT_ERROR', 66058); define('U_BRK_RULE_EMPTY_SET', 66059); define('U_BRK_UNRECOGNIZED_OPTION', 66060); define('U_BRK_MALFORMED_RULE_TAG', 66061); define('U_BRK_ERROR_LIMIT', 66062); define('U_REGEX_INTERNAL_ERROR', 66304); define('U_REGEX_ERROR_START', 66304); define('U_REGEX_RULE_SYNTAX', 66305); define('U_REGEX_INVALID_STATE', 66306); define('U_REGEX_BAD_ESCAPE_SEQUENCE', 66307); define('U_REGEX_PROPERTY_SYNTAX', 66308); define('U_REGEX_UNIMPLEMENTED', 66309); define('U_REGEX_MISMATCHED_PAREN', 66310); define('U_REGEX_NUMBER_TOO_BIG', 66311); define('U_REGEX_BAD_INTERVAL', 66312); define('U_REGEX_MAX_LT_MIN', 66313); define('U_REGEX_INVALID_BACK_REF', 66314); define('U_REGEX_INVALID_FLAG', 66315); define('U_REGEX_LOOK_BEHIND_LIMIT', 66316); define('U_REGEX_SET_CONTAINS_STRING', 66317); define('U_REGEX_ERROR_LIMIT', 66326); define('U_IDNA_PROHIBITED_ERROR', 66560); define('U_IDNA_ERROR_START', 66560); define('U_IDNA_UNASSIGNED_ERROR', 66561); define('U_IDNA_CHECK_BIDI_ERROR', 66562); define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); define('U_IDNA_ACE_PREFIX_ERROR', 66564); define('U_IDNA_VERIFICATION_ERROR', 66565); define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); define('U_IDNA_ERROR_LIMIT', 66569); define('U_STRINGPREP_PROHIBITED_ERROR', 66560); define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); define('U_ERROR_LIMIT', 66818); /** * Prohibit processing of unassigned codepoints in the input for IDN * functions and do not check if the input conforms to domain name ASCII rules. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_DEFAULT', 0); /** * Allow processing of unassigned codepoints in the input for IDN functions. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_ALLOW_UNASSIGNED', 1); /** * Check if the input for IDN functions conforms to domain name ASCII rules. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_USE_STD3_RULES', 2); /** * Check whether the input conforms to the BiDi rules. * Ignored by the IDNA2003 implementation, which always performs this check. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_CHECK_BIDI', 4); /** * Check whether the input conforms to the CONTEXTJ rules. * Ignored by the IDNA2003 implementation, as this check is new in IDNA2008. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_CHECK_CONTEXTJ', 8); /** * Option for nontransitional processing in * idn_to_ascii. Transitional processing is activated * by default. This option is ignored by the IDNA2003 implementation. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); /** * Option for nontransitional processing in * idn_to_utf8. Transitional processing is activated * by default. This option is ignored by the IDNA2003 implementation. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); /** * Use IDNA 2003 algorithm in {@see idn_to_utf8} and * {@see idn_to_ascii}. This is the default. * @link https://php.net/manual/en/intl.constants.php * @deprecated 7.2 Use {@see INTL_IDNA_VARIANT_UTS46} instead. */ define('INTL_IDNA_VARIANT_2003', 0); /** * Use UTS #46 algorithm in idn_to_utf8 and * idn_to_ascii. * @link https://php.net/manual/en/intl.constants.php */ define('INTL_IDNA_VARIANT_UTS46', 1); /** * Errors reported in a bitset returned by the UTS #46 algorithm in * idn_to_utf8 and * idn_to_ascii. * @link https://php.net/manual/en/intl.constants.php */ define('IDNA_ERROR_EMPTY_LABEL', 1); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_LABEL_TOO_LONG', 2); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_LEADING_HYPHEN', 8); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_TRAILING_HYPHEN', 16); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_HYPHEN_3_4', 32); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_DISALLOWED', 128); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_PUNYCODE', 256); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_LABEL_HAS_DOT', 512); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_BIDI', 2048); /** * @link https://secure.php.net/manual/en/migration54.global-constants.php * @since 5.4 */ define('IDNA_ERROR_CONTEXTJ', 4096); /** * @since 5.5 */ class IntlBreakIterator implements IteratorAggregate { /* Constants */ public const DONE = -1; public const WORD_NONE = 0; public const WORD_NONE_LIMIT = 100; public const WORD_NUMBER = 100; public const WORD_NUMBER_LIMIT = 200; public const WORD_LETTER = 200; public const WORD_LETTER_LIMIT = 300; public const WORD_KANA = 300; public const WORD_KANA_LIMIT = 400; public const WORD_IDEO = 400; public const WORD_IDEO_LIMIT = 500; public const LINE_SOFT = 0; public const LINE_SOFT_LIMIT = 100; public const LINE_HARD = 100; public const LINE_HARD_LIMIT = 200; public const SENTENCE_TERM = 0; public const SENTENCE_TERM_LIMIT = 100; public const SENTENCE_SEP = 100; public const SENTENCE_SEP_LIMIT = 200; /* Methods */ /** * (PHP 5 >=5.5.0)
* Private constructor for disallowing instantiation */ private function __construct() {} /** * (PHP 5 >=5.5.0)
* Create break iterator for boundaries of combining character sequences * @link https://secure.php.net/manual/en/intlbreakiterator.createcharacterinstance.php * @param string $locale * @return IntlBreakIterator|null */ #[TentativeType] public static function createCharacterInstance(#[LanguageAware(['8.0' => 'string|null'], default: '')] $locale = null): ?IntlBreakIterator {} /** * (PHP 5 >=5.5.0)
* Create break iterator for boundaries of code points * @link https://secure.php.net/manual/en/intlbreakiterator.createcodepointinstance.php * @return IntlCodePointBreakIterator */ #[TentativeType] public static function createCodePointInstance(): IntlCodePointBreakIterator {} /** * (PHP 5 >=5.5.0)
* Create break iterator for logically possible line breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createlineinstance.php * @param string $locale [optional] * @return IntlBreakIterator|null */ #[TentativeType] public static function createLineInstance(#[LanguageAware(['8.0' => 'string|null'], default: '')] $locale): ?IntlBreakIterator {} /** * (PHP 5 >=5.5.0)
* Create break iterator for sentence breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createsentenceinstance.php * @param string $locale [optional] * @return IntlBreakIterator|null */ #[TentativeType] public static function createSentenceInstance(#[LanguageAware(['8.0' => 'string|null'], default: '')] $locale): ?IntlBreakIterator {} /** * (PHP 5 >=5.5.0)
* Create break iterator for title-casing breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createtitleinstance.php * @param string $locale [optional] * @return IntlBreakIterator|null */ #[TentativeType] public static function createTitleInstance(#[LanguageAware(['8.0' => 'string|null'], default: '')] $locale): ?IntlBreakIterator {} /** * (PHP 5 >=5.5.0)
* Create break iterator for word breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createwordinstance.php * @param string $locale [optional] * @return IntlBreakIterator|null */ #[TentativeType] public static function createWordInstance(#[LanguageAware(['8.0' => 'string|null'], default: '')] $locale): ?IntlBreakIterator {} /** * (PHP 5 >=5.5.0)
* Get index of current position * @link https://secure.php.net/manual/en/intlbreakiterator.current.php * @return int */ #[Pure] #[TentativeType] public function current(): int {} /** * (PHP 5 >=5.5.0)
* Set position to the first character in the text * @link https://secure.php.net/manual/en/intlbreakiterator.first.php */ #[TentativeType] public function first(): int {} /** * (PHP 5 >=5.5.0)
* Advance the iterator to the first boundary following specified offset * @link https://secure.php.net/manual/en/intlbreakiterator.following.php * @param int $offset */ #[TentativeType] public function following(#[LanguageAware(['8.0' => 'int'], default: '')] $offset): int {} /** * (PHP 5 >=5.5.0)
* Get last error code on the object * @link https://secure.php.net/manual/en/intlbreakiterator.geterrorcode.php * @return int */ #[Pure] #[TentativeType] public function getErrorCode(): int {} /** * (PHP 5 >=5.5.0)
* Get last error message on the object * @link https://secure.php.net/manual/en/intlbreakiterator.geterrormessage.php * @return string */ #[Pure] #[TentativeType] public function getErrorMessage(): string {} /** * (PHP 5 >=5.5.0)
* Get the locale associated with the object * @link https://secure.php.net/manual/en/intlbreakiterator.getlocale.php * @param string $type */ #[Pure] #[TentativeType] public function getLocale(#[LanguageAware(['8.0' => 'int'], default: '')] $type): string|false {} /** * (PHP 5 >=5.5.0)
* Create iterator for navigating fragments between boundaries * @link https://secure.php.net/manual/en/intlbreakiterator.getpartsiterator.php * @param int $type [optional] *

* Optional key type. Possible values are: *

    *
  • * {@see IntlPartsIterator::KEY_SEQUENTIAL} * - The default. Sequentially increasing integers used as key. *
  • *
  • * {@see IntlPartsIterator::KEY_LEFT} * - Byte offset left of current part used as key. *
  • *
  • * {@see IntlPartsIterator::KEY_RIGHT} * - Byte offset right of current part used as key. *
  • *
*/ #[Pure] #[TentativeType] public function getPartsIterator( #[LanguageAware(['8.3' => 'string', '8.0' => 'int'], default: '')] #[EV([IntlPartsIterator::KEY_SEQUENTIAL, IntlPartsIterator::KEY_LEFT, IntlPartsIterator::KEY_RIGHT])] $type = IntlPartsIterator::KEY_SEQUENTIAL ): IntlPartsIterator {} /** * (PHP 5 >=5.5.0)
* Get the text being scanned * @link https://secure.php.net/manual/en/intlbreakiterator.gettext.php */ #[Pure] #[TentativeType] public function getText(): ?string {} /** * (PHP 5 >=5.5.0)
* Tell whether an offset is a boundary's offset * @link https://secure.php.net/manual/en/intlbreakiterator.isboundary.php * @param int $offset */ #[Pure] #[TentativeType] public function isBoundary(#[LanguageAware(['8.0' => 'int'], default: '')] $offset): bool {} /** * (PHP 5 >=5.5.0)
* Set the iterator position to index beyond the last character * @link https://secure.php.net/manual/en/intlbreakiterator.last.php * @return int */ #[TentativeType] public function last(): int {} /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlbreakiterator.next.php * @param int $offset [optional] * @return int */ #[TentativeType] public function next(#[LanguageAware(['8.0' => 'int|null'], default: '')] $offset = null): int {} /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlbreakiterator.preceding.php * @param int $offset */ #[TentativeType] public function preceding(#[LanguageAware(['8.0' => 'int'], default: '')] $offset): int {} /** * (PHP 5 >=5.5.0)
* Set the iterator position to the boundary immediately before the current * @link https://secure.php.net/manual/en/intlbreakiterator.previous.php * @return int */ #[TentativeType] public function previous(): int {} /** * (PHP 5 >=5.5.0)
* Set the text being scanned * @link https://secure.php.net/manual/en/intlbreakiterator.settext.php * @param string $text */ #[TentativeType] #[LanguageAware(['8.3' => 'bool'], default: 'bool|null')] public function setText(#[LanguageAware(['8.0' => 'string'], default: '')] $text) {} /** * @since 8.0 * @return Iterator */ #[Pure] public function getIterator(): Iterator {} } class IntlRuleBasedBreakIterator extends IntlBreakIterator implements Traversable { /* Methods */ /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlbreakiterator.construct.php * @param string $rules * @param string $compiled [optional] */ #[Pure] public function __construct( #[LanguageAware(['8.0' => 'string'], default: '')] $rules, #[LanguageAware(['8.0' => 'bool'], default: '')] $compiled = false ) {} /** * (PHP 5 >=5.5.0)
* Create break iterator for boundaries of combining character sequences * @link https://secure.php.net/manual/en/intlbreakiterator.createcharacterinstance.php * @param string $locale * @return IntlRuleBasedBreakIterator */ public static function createCharacterInstance($locale) {} /** * (PHP 5 >=5.5.0)
* Create break iterator for boundaries of code points * @link https://secure.php.net/manual/en/intlbreakiterator.createcodepointinstance.php * @return IntlRuleBasedBreakIterator */ public static function createCodePointInstance() {} /** * (PHP 5 >=5.5.0)
* Create break iterator for logically possible line breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createlineinstance.php * @param string $locale [optional] * @return IntlRuleBasedBreakIterator */ public static function createLineInstance($locale) {} /** * (PHP 5 >=5.5.0)
* Create break iterator for sentence breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createsentenceinstance.php * @param string $locale [optional] * @return IntlRuleBasedBreakIterator */ public static function createSentenceInstance($locale) {} /** * (PHP 5 >=5.5.0)
* Create break iterator for title-casing breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createtitleinstance.php * @param string $locale [optional] * @return IntlRuleBasedBreakIterator */ public static function createTitleInstance($locale) {} /** * (PHP 5 >=5.5.0)
* Create break iterator for word breaks * @link https://secure.php.net/manual/en/intlbreakiterator.createwordinstance.php * @param string $locale [optional] * @return IntlRuleBasedBreakIterator */ public static function createWordInstance($locale) {} /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlrulebasedbreakiterator.getbinaryrules.php * Get the binary form of compiled rules * @return string|false */ #[Pure] #[TentativeType] public function getBinaryRules(): string|false {} /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlrulebasedbreakiterator.getrules.php * Get the rule set used to create this object * @return string|false */ #[Pure] #[TentativeType] public function getRules(): string|false {} /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlrulebasedbreakiterator.getrulesstatus.php * Get the largest status value from the break rules that determined the current break position * @return int */ #[Pure] #[TentativeType] public function getRuleStatus(): int {} /** * (PHP 5 >=5.5.0)
* @link https://secure.php.net/manual/en/intlrulebasedbreakiterator.getrulestatusvec.php * Get the status values from the break rules that determined the current break position * @return array|false */ #[Pure] #[TentativeType] public function getRuleStatusVec(): array|false {} } /** * @link https://www.php.net/manual/en/class.intlpartsiterator.php * @since 5.5 */ class IntlPartsIterator extends IntlIterator implements Iterator { public const KEY_SEQUENTIAL = 0; public const KEY_LEFT = 1; public const KEY_RIGHT = 2; /** * @return IntlBreakIterator */ #[Pure] #[TentativeType] public function getBreakIterator(): IntlBreakIterator {} /** * @since 8.1 */ #[TentativeType] public function getRuleStatus(): int {} } class IntlCodePointBreakIterator extends IntlBreakIterator implements Traversable { /** * (PHP 5 >=5.5.0)
* Get last code point passed over after advancing or receding the iterator * @link https://secure.php.net/manual/en/intlcodepointbreakiterator.getlastcodepoint.php * @return int */ #[Pure] #[TentativeType] public function getLastCodePoint(): int {} } class UConverter { /* Constants */ public const REASON_UNASSIGNED = 0; public const REASON_ILLEGAL = 1; public const REASON_IRREGULAR = 2; public const REASON_RESET = 3; public const REASON_CLOSE = 4; public const REASON_CLONE = 5; public const UNSUPPORTED_CONVERTER = -1; public const SBCS = 0; public const DBCS = 1; public const MBCS = 2; public const LATIN_1 = 3; public const UTF8 = 4; public const UTF16_BigEndian = 5; public const UTF16_LittleEndian = 6; public const UTF32_BigEndian = 7; public const UTF32_LittleEndian = 8; public const EBCDIC_STATEFUL = 9; public const ISO_2022 = 10; public const LMBCS_1 = 11; public const LMBCS_2 = 12; public const LMBCS_3 = 13; public const LMBCS_4 = 14; public const LMBCS_5 = 15; public const LMBCS_6 = 16; public const LMBCS_8 = 17; public const LMBCS_11 = 18; public const LMBCS_16 = 19; public const LMBCS_17 = 20; public const LMBCS_18 = 21; public const LMBCS_19 = 22; public const LMBCS_LAST = 22; public const HZ = 23; public const SCSU = 24; public const ISCII = 25; public const US_ASCII = 26; public const UTF7 = 27; public const BOCU1 = 28; public const UTF16 = 29; public const UTF32 = 30; public const CESU8 = 31; public const IMAP_MAILBOX = 32; /* Methods */ /** * (PHP 5 >=5.5.0)
* Create UConverter object * @link https://php.net/manual/en/uconverter.construct.php * @param string $destination_encoding * @param string $source_encoding */ #[Pure] public function __construct( #[LanguageAware(['8.0' => 'string|null'], default: '')] $destination_encoding = null, #[LanguageAware(['8.0' => 'string|null'], default: '')] $source_encoding = null ) {} /** * (PHP 5 >=5.5.0)
* Convert string from one charset to anothe * @link https://php.net/manual/en/uconverter.convert.php * @param string $str * @param bool $reverse [optional] * @return string|false */ #[Pure] #[TentativeType] public function convert( #[LanguageAware(['8.0' => 'string'], default: '')] $str, #[LanguageAware(['8.0' => 'bool'], default: '')] $reverse = false ): string|false {} /** * (PHP 5 >=5.5.0)
* Default "from" callback function * @link https://php.net/manual/en/uconverter.fromucallback.php * @param int $reason * @param string $source * @param string $codePoint * @param int &$error * @return array|string|int|null */ #[TentativeType] public function fromUCallback( #[LanguageAware(['8.0' => 'int'], default: '')] $reason, #[LanguageAware(['8.0' => 'array'], default: '')] $source, #[LanguageAware(['8.0' => 'int'], default: '')] $codePoint, &$error ): array|string|int|null {} /** * (PHP 5 >=5.5.0)
* Get the aliases of the given name * @link https://php.net/manual/en/uconverter.getaliases.php * @param string $name * @return array|false|null */ #[TentativeType] public static function getAliases( #[ElementAvailable(from: '5.5', to: '5.6')] $name = '', #[ElementAvailable(from: '7.0')] #[LanguageAware(['8.0' => 'string'], default: '')] $name ): array|false|null {} /** * (PHP 5 >=5.5.0)
* Get the available canonical converter names * @link https://php.net/manual/en/uconverter.getavailable.php * @return array */ #[TentativeType] public static function getAvailable(): array {} /** * (PHP 5 >=5.5.0)
* Get the destination encoding * @link https://php.net/manual/en/uconverter.getdestinationencoding.php * @return string|false|null */ #[Pure] #[TentativeType] public function getDestinationEncoding(): string|false|null {} /** * (PHP 5 >=5.5.0)
* Get the destination converter type * @link https://php.net/manual/en/uconverter.getdestinationtype.php * @return int|false|null */ #[Pure] #[TentativeType] public function getDestinationType(): int|false|null {} /** * (PHP 5 >=5.5.0)
* Get last error code on the object * @link https://php.net/manual/en/uconverter.geterrorcode.php * @return int */ #[Pure] #[TentativeType] public function getErrorCode(): int {} /** * (PHP 5 >=5.5.0)
* Get last error message on the object * @link https://php.net/manual/en/uconverter.geterrormessage.php * @return string|null */ #[Pure] #[TentativeType] public function getErrorMessage(): ?string {} /** * (PHP 5 >=5.5.0)
* Get the source encoding * @link https://php.net/manual/en/uconverter.getsourceencoding.php * @return string|false|null */ #[Pure] #[TentativeType] public function getSourceEncoding(): string|false|null {} /** * (PHP 5 >=5.5.0)
* Get the source convertor type * @link https://php.net/manual/en/uconverter.getsourcetype.php * @return int|false|null */ #[Pure] #[TentativeType] public function getSourceType(): int|false|null {} /** * (PHP 5 >=5.5.0)
* Get standards associated to converter names * @link https://php.net/manual/en/uconverter.getstandards.php * @return array|null */ #[Pure] #[TentativeType] public static function getStandards(): ?array {} /** * (PHP 5 >=5.5.0)
* Get substitution chars * @link https://php.net/manual/en/uconverter.getsubstchars.php * @return string|false|null */ #[Pure] #[TentativeType] public function getSubstChars(): string|false|null {} /** * (PHP 5 >=5.5.0)
* Get string representation of the callback reason * @link https://php.net/manual/en/uconverter.reasontext.php * @param int $reason * @return string */ #[Pure] #[TentativeType] public static function reasonText( #[ElementAvailable(from: '5.3', to: '7.4')] $reason = 0, #[ElementAvailable(from: '8.0')] int $reason ): string {} /** * (PHP 5 >=5.5.0)
* Set the destination encoding * @link https://php.net/manual/en/uconverter.setdestinationencoding.php * @param string $encoding * @return bool */ #[TentativeType] public function setDestinationEncoding(#[LanguageAware(['8.0' => 'string'], default: '')] $encoding): bool {} /** * (PHP 5 >=5.5.0)
* Set the source encoding * @link https://php.net/manual/en/uconverter.setsourceencoding.php * @param string $encoding * @return bool */ #[TentativeType] public function setSourceEncoding(#[LanguageAware(['8.0' => 'string'], default: '')] $encoding): bool {} /** * (PHP 5 >=5.5.0)
* Set the substitution chars * @link https://php.net/manual/en/uconverter.setsubstchars.php * @param string $chars * @return bool */ #[TentativeType] public function setSubstChars(#[LanguageAware(['8.0' => 'string'], default: '')] $chars): bool {} /** * (PHP 5 >=5.5.0)
* Default "to" callback function * @link https://php.net/manual/en/uconverter.toucallback.php * @param int $reason * @param string $source * @param string $codeUnits * @param int &$error * @return array|string|int|null */ #[TentativeType] public function toUCallback( #[LanguageAware(['8.0' => 'int'], default: '')] $reason, #[LanguageAware(['8.0' => 'string'], default: '')] $source, #[LanguageAware(['8.0' => 'string'], default: '')] $codeUnits, &$error ): array|string|int|null {} /** * (PHP 5 >=5.5.0)
* Convert string from one charset to another * @link https://php.net/manual/en/uconverter.transcode.php * @param string $str * @param string $toEncoding * @param string $fromEncoding * @param array|null $options * @return string|false */ #[TentativeType] public static function transcode( #[LanguageAware(['8.0' => 'string'], default: '')] $str, #[LanguageAware(['8.0' => 'string'], default: '')] $toEncoding, #[LanguageAware(['8.0' => 'string'], default: '')] $fromEncoding, #[LanguageAware(['8.0' => 'array|null'], default: '')] $options = null ): string|false {} } // End of intl v.1.1.0 Makes an exact copy of the Imagick object * @link https://php.net/manual/en/class.imagick.php */ class Imagick implements Iterator, Countable { public const COLOR_BLACK = 11; public const COLOR_BLUE = 12; public const COLOR_CYAN = 13; public const COLOR_GREEN = 14; public const COLOR_RED = 15; public const COLOR_YELLOW = 16; public const COLOR_MAGENTA = 17; public const COLOR_OPACITY = 18; public const COLOR_ALPHA = 19; public const COLOR_FUZZ = 20; public const IMAGICK_EXTNUM = 30403; public const IMAGICK_EXTVER = "3.4.3"; public const QUANTUM_RANGE = 65535; public const USE_ZEND_MM = 0; public const COMPOSITE_DEFAULT = 40; public const COMPOSITE_UNDEFINED = 0; public const COMPOSITE_NO = 1; public const COMPOSITE_ADD = 2; public const COMPOSITE_ATOP = 3; public const COMPOSITE_BLEND = 4; public const COMPOSITE_BUMPMAP = 5; public const COMPOSITE_CLEAR = 7; public const COMPOSITE_COLORBURN = 8; public const COMPOSITE_COLORDODGE = 9; public const COMPOSITE_COLORIZE = 10; public const COMPOSITE_COPYBLACK = 11; public const COMPOSITE_COPYBLUE = 12; public const COMPOSITE_COPY = 13; public const COMPOSITE_COPYCYAN = 14; public const COMPOSITE_COPYGREEN = 15; public const COMPOSITE_COPYMAGENTA = 16; public const COMPOSITE_COPYOPACITY = 17; public const COMPOSITE_COPYRED = 18; public const COMPOSITE_COPYYELLOW = 19; public const COMPOSITE_DARKEN = 20; public const COMPOSITE_DSTATOP = 21; public const COMPOSITE_DST = 22; public const COMPOSITE_DSTIN = 23; public const COMPOSITE_DSTOUT = 24; public const COMPOSITE_DSTOVER = 25; public const COMPOSITE_DIFFERENCE = 26; public const COMPOSITE_DISPLACE = 27; public const COMPOSITE_DISSOLVE = 28; public const COMPOSITE_EXCLUSION = 29; public const COMPOSITE_HARDLIGHT = 30; public const COMPOSITE_HUE = 31; public const COMPOSITE_IN = 32; public const COMPOSITE_LIGHTEN = 33; public const COMPOSITE_LUMINIZE = 35; public const COMPOSITE_MINUS = 36; public const COMPOSITE_MODULATE = 37; public const COMPOSITE_MULTIPLY = 38; public const COMPOSITE_OUT = 39; public const COMPOSITE_OVER = 40; public const COMPOSITE_OVERLAY = 41; public const COMPOSITE_PLUS = 42; public const COMPOSITE_REPLACE = 43; public const COMPOSITE_SATURATE = 44; public const COMPOSITE_SCREEN = 45; public const COMPOSITE_SOFTLIGHT = 46; public const COMPOSITE_SRCATOP = 47; public const COMPOSITE_SRC = 48; public const COMPOSITE_SRCIN = 49; public const COMPOSITE_SRCOUT = 50; public const COMPOSITE_SRCOVER = 51; public const COMPOSITE_SUBTRACT = 52; public const COMPOSITE_THRESHOLD = 53; public const COMPOSITE_XOR = 54; public const COMPOSITE_CHANGEMASK = 6; public const COMPOSITE_LINEARLIGHT = 34; public const COMPOSITE_DIVIDE = 55; public const COMPOSITE_DISTORT = 56; public const COMPOSITE_BLUR = 57; public const COMPOSITE_PEGTOPLIGHT = 58; public const COMPOSITE_VIVIDLIGHT = 59; public const COMPOSITE_PINLIGHT = 60; public const COMPOSITE_LINEARDODGE = 61; public const COMPOSITE_LINEARBURN = 62; public const COMPOSITE_MATHEMATICS = 63; public const COMPOSITE_MODULUSADD = 2; public const COMPOSITE_MODULUSSUBTRACT = 52; public const COMPOSITE_MINUSDST = 36; public const COMPOSITE_DIVIDEDST = 55; public const COMPOSITE_DIVIDESRC = 64; public const COMPOSITE_MINUSSRC = 65; public const COMPOSITE_DARKENINTENSITY = 66; public const COMPOSITE_LIGHTENINTENSITY = 67; public const MONTAGEMODE_FRAME = 1; public const MONTAGEMODE_UNFRAME = 2; public const MONTAGEMODE_CONCATENATE = 3; public const STYLE_NORMAL = 1; public const STYLE_ITALIC = 2; public const STYLE_OBLIQUE = 3; public const STYLE_ANY = 4; public const FILTER_UNDEFINED = 0; public const FILTER_POINT = 1; public const FILTER_BOX = 2; public const FILTER_TRIANGLE = 3; public const FILTER_HERMITE = 4; public const FILTER_HANNING = 5; public const FILTER_HAMMING = 6; public const FILTER_BLACKMAN = 7; public const FILTER_GAUSSIAN = 8; public const FILTER_QUADRATIC = 9; public const FILTER_CUBIC = 10; public const FILTER_CATROM = 11; public const FILTER_MITCHELL = 12; public const FILTER_LANCZOS = 22; public const FILTER_BESSEL = 13; public const FILTER_SINC = 14; public const FILTER_KAISER = 16; public const FILTER_WELSH = 17; public const FILTER_PARZEN = 18; public const FILTER_LAGRANGE = 21; public const FILTER_SENTINEL = 31; public const FILTER_BOHMAN = 19; public const FILTER_BARTLETT = 20; public const FILTER_JINC = 13; public const FILTER_SINCFAST = 15; public const FILTER_ROBIDOUX = 26; public const FILTER_LANCZOSSHARP = 23; public const FILTER_LANCZOS2 = 24; public const FILTER_LANCZOS2SHARP = 25; public const FILTER_ROBIDOUXSHARP = 27; public const FILTER_COSINE = 28; public const FILTER_SPLINE = 29; public const FILTER_LANCZOSRADIUS = 30; public const IMGTYPE_UNDEFINED = 0; public const IMGTYPE_BILEVEL = 1; public const IMGTYPE_GRAYSCALE = 2; public const IMGTYPE_GRAYSCALEMATTE = 3; public const IMGTYPE_PALETTE = 4; public const IMGTYPE_PALETTEMATTE = 5; public const IMGTYPE_TRUECOLOR = 6; public const IMGTYPE_TRUECOLORMATTE = 7; public const IMGTYPE_COLORSEPARATION = 8; public const IMGTYPE_COLORSEPARATIONMATTE = 9; public const IMGTYPE_OPTIMIZE = 10; public const IMGTYPE_PALETTEBILEVELMATTE = 11; public const RESOLUTION_UNDEFINED = 0; public const RESOLUTION_PIXELSPERINCH = 1; public const RESOLUTION_PIXELSPERCENTIMETER = 2; public const COMPRESSION_UNDEFINED = 0; public const COMPRESSION_NO = 1; public const COMPRESSION_BZIP = 2; public const COMPRESSION_FAX = 6; public const COMPRESSION_GROUP4 = 7; public const COMPRESSION_JPEG = 8; public const COMPRESSION_JPEG2000 = 9; public const COMPRESSION_LOSSLESSJPEG = 10; public const COMPRESSION_LZW = 11; public const COMPRESSION_RLE = 12; public const COMPRESSION_ZIP = 13; public const COMPRESSION_DXT1 = 3; public const COMPRESSION_DXT3 = 4; public const COMPRESSION_DXT5 = 5; public const COMPRESSION_ZIPS = 14; public const COMPRESSION_PIZ = 15; public const COMPRESSION_PXR24 = 16; public const COMPRESSION_B44 = 17; public const COMPRESSION_B44A = 18; public const COMPRESSION_LZMA = 19; public const COMPRESSION_JBIG1 = 20; public const COMPRESSION_JBIG2 = 21; public const PAINT_POINT = 1; public const PAINT_REPLACE = 2; public const PAINT_FLOODFILL = 3; public const PAINT_FILLTOBORDER = 4; public const PAINT_RESET = 5; public const GRAVITY_NORTHWEST = 1; public const GRAVITY_NORTH = 2; public const GRAVITY_NORTHEAST = 3; public const GRAVITY_WEST = 4; public const GRAVITY_CENTER = 5; public const GRAVITY_EAST = 6; public const GRAVITY_SOUTHWEST = 7; public const GRAVITY_SOUTH = 8; public const GRAVITY_SOUTHEAST = 9; public const GRAVITY_FORGET = 0; public const GRAVITY_STATIC = 10; public const STRETCH_NORMAL = 1; public const STRETCH_ULTRACONDENSED = 2; public const STRETCH_EXTRACONDENSED = 3; public const STRETCH_CONDENSED = 4; public const STRETCH_SEMICONDENSED = 5; public const STRETCH_SEMIEXPANDED = 6; public const STRETCH_EXPANDED = 7; public const STRETCH_EXTRAEXPANDED = 8; public const STRETCH_ULTRAEXPANDED = 9; public const STRETCH_ANY = 10; public const ALIGN_UNDEFINED = 0; public const ALIGN_LEFT = 1; public const ALIGN_CENTER = 2; public const ALIGN_RIGHT = 3; public const DECORATION_NO = 1; public const DECORATION_UNDERLINE = 2; public const DECORATION_OVERLINE = 3; public const DECORATION_LINETROUGH = 4; public const DECORATION_LINETHROUGH = 4; public const NOISE_UNIFORM = 1; public const NOISE_GAUSSIAN = 2; public const NOISE_MULTIPLICATIVEGAUSSIAN = 3; public const NOISE_IMPULSE = 4; public const NOISE_LAPLACIAN = 5; public const NOISE_POISSON = 6; public const NOISE_RANDOM = 7; public const CHANNEL_UNDEFINED = 0; public const CHANNEL_RED = 1; public const CHANNEL_GRAY = 1; public const CHANNEL_CYAN = 1; public const CHANNEL_GREEN = 2; public const CHANNEL_MAGENTA = 2; public const CHANNEL_BLUE = 4; public const CHANNEL_YELLOW = 4; public const CHANNEL_ALPHA = 8; public const CHANNEL_OPACITY = 8; public const CHANNEL_MATTE = 8; public const CHANNEL_BLACK = 32; public const CHANNEL_INDEX = 32; public const CHANNEL_ALL = 134217727; public const CHANNEL_DEFAULT = 134217719; public const CHANNEL_RGBA = 15; public const CHANNEL_TRUEALPHA = 64; public const CHANNEL_RGBS = 128; public const CHANNEL_GRAY_CHANNELS = 128; public const CHANNEL_SYNC = 256; public const CHANNEL_COMPOSITES = 47; public const METRIC_UNDEFINED = 0; public const METRIC_ABSOLUTEERRORMETRIC = 1; public const METRIC_MEANABSOLUTEERROR = 2; public const METRIC_MEANERRORPERPIXELMETRIC = 3; public const METRIC_MEANSQUAREERROR = 4; public const METRIC_PEAKABSOLUTEERROR = 5; public const METRIC_PEAKSIGNALTONOISERATIO = 6; public const METRIC_ROOTMEANSQUAREDERROR = 7; public const METRIC_NORMALIZEDCROSSCORRELATIONERRORMETRIC = 8; public const METRIC_FUZZERROR = 9; public const PIXEL_CHAR = 1; public const PIXEL_DOUBLE = 2; public const PIXEL_FLOAT = 3; public const PIXEL_INTEGER = 4; public const PIXEL_LONG = 5; public const PIXEL_QUANTUM = 6; public const PIXEL_SHORT = 7; public const EVALUATE_UNDEFINED = 0; public const EVALUATE_ADD = 1; public const EVALUATE_AND = 2; public const EVALUATE_DIVIDE = 3; public const EVALUATE_LEFTSHIFT = 4; public const EVALUATE_MAX = 5; public const EVALUATE_MIN = 6; public const EVALUATE_MULTIPLY = 7; public const EVALUATE_OR = 8; public const EVALUATE_RIGHTSHIFT = 9; public const EVALUATE_SET = 10; public const EVALUATE_SUBTRACT = 11; public const EVALUATE_XOR = 12; public const EVALUATE_POW = 13; public const EVALUATE_LOG = 14; public const EVALUATE_THRESHOLD = 15; public const EVALUATE_THRESHOLDBLACK = 16; public const EVALUATE_THRESHOLDWHITE = 17; public const EVALUATE_GAUSSIANNOISE = 18; public const EVALUATE_IMPULSENOISE = 19; public const EVALUATE_LAPLACIANNOISE = 20; public const EVALUATE_MULTIPLICATIVENOISE = 21; public const EVALUATE_POISSONNOISE = 22; public const EVALUATE_UNIFORMNOISE = 23; public const EVALUATE_COSINE = 24; public const EVALUATE_SINE = 25; public const EVALUATE_ADDMODULUS = 26; public const EVALUATE_MEAN = 27; public const EVALUATE_ABS = 28; public const EVALUATE_EXPONENTIAL = 29; public const EVALUATE_MEDIAN = 30; public const EVALUATE_SUM = 31; public const COLORSPACE_UNDEFINED = 0; public const COLORSPACE_RGB = 1; public const COLORSPACE_GRAY = 2; public const COLORSPACE_TRANSPARENT = 3; public const COLORSPACE_OHTA = 4; public const COLORSPACE_LAB = 5; public const COLORSPACE_XYZ = 6; public const COLORSPACE_YCBCR = 7; public const COLORSPACE_YCC = 8; public const COLORSPACE_YIQ = 9; public const COLORSPACE_YPBPR = 10; public const COLORSPACE_YUV = 11; public const COLORSPACE_CMYK = 12; public const COLORSPACE_SRGB = 13; public const COLORSPACE_HSB = 14; public const COLORSPACE_HSL = 15; public const COLORSPACE_HWB = 16; public const COLORSPACE_REC601LUMA = 17; public const COLORSPACE_REC709LUMA = 19; public const COLORSPACE_LOG = 21; public const COLORSPACE_CMY = 22; public const COLORSPACE_LUV = 23; public const COLORSPACE_HCL = 24; public const COLORSPACE_LCH = 25; public const COLORSPACE_LMS = 26; public const COLORSPACE_LCHAB = 27; public const COLORSPACE_LCHUV = 28; public const COLORSPACE_SCRGB = 29; public const COLORSPACE_HSI = 30; public const COLORSPACE_HSV = 31; public const COLORSPACE_HCLP = 32; public const COLORSPACE_YDBDR = 33; public const COLORSPACE_REC601YCBCR = 18; public const COLORSPACE_REC709YCBCR = 20; public const VIRTUALPIXELMETHOD_UNDEFINED = 0; public const VIRTUALPIXELMETHOD_BACKGROUND = 1; public const VIRTUALPIXELMETHOD_CONSTANT = 2; public const VIRTUALPIXELMETHOD_EDGE = 4; public const VIRTUALPIXELMETHOD_MIRROR = 5; public const VIRTUALPIXELMETHOD_TILE = 7; public const VIRTUALPIXELMETHOD_TRANSPARENT = 8; public const VIRTUALPIXELMETHOD_MASK = 9; public const VIRTUALPIXELMETHOD_BLACK = 10; public const VIRTUALPIXELMETHOD_GRAY = 11; public const VIRTUALPIXELMETHOD_WHITE = 12; public const VIRTUALPIXELMETHOD_HORIZONTALTILE = 13; public const VIRTUALPIXELMETHOD_VERTICALTILE = 14; public const VIRTUALPIXELMETHOD_HORIZONTALTILEEDGE = 15; public const VIRTUALPIXELMETHOD_VERTICALTILEEDGE = 16; public const VIRTUALPIXELMETHOD_CHECKERTILE = 17; public const PREVIEW_UNDEFINED = 0; public const PREVIEW_ROTATE = 1; public const PREVIEW_SHEAR = 2; public const PREVIEW_ROLL = 3; public const PREVIEW_HUE = 4; public const PREVIEW_SATURATION = 5; public const PREVIEW_BRIGHTNESS = 6; public const PREVIEW_GAMMA = 7; public const PREVIEW_SPIFF = 8; public const PREVIEW_DULL = 9; public const PREVIEW_GRAYSCALE = 10; public const PREVIEW_QUANTIZE = 11; public const PREVIEW_DESPECKLE = 12; public const PREVIEW_REDUCENOISE = 13; public const PREVIEW_ADDNOISE = 14; public const PREVIEW_SHARPEN = 15; public const PREVIEW_BLUR = 16; public const PREVIEW_THRESHOLD = 17; public const PREVIEW_EDGEDETECT = 18; public const PREVIEW_SPREAD = 19; public const PREVIEW_SOLARIZE = 20; public const PREVIEW_SHADE = 21; public const PREVIEW_RAISE = 22; public const PREVIEW_SEGMENT = 23; public const PREVIEW_SWIRL = 24; public const PREVIEW_IMPLODE = 25; public const PREVIEW_WAVE = 26; public const PREVIEW_OILPAINT = 27; public const PREVIEW_CHARCOALDRAWING = 28; public const PREVIEW_JPEG = 29; public const RENDERINGINTENT_UNDEFINED = 0; public const RENDERINGINTENT_SATURATION = 1; public const RENDERINGINTENT_PERCEPTUAL = 2; public const RENDERINGINTENT_ABSOLUTE = 3; public const RENDERINGINTENT_RELATIVE = 4; public const INTERLACE_UNDEFINED = 0; public const INTERLACE_NO = 1; public const INTERLACE_LINE = 2; public const INTERLACE_PLANE = 3; public const INTERLACE_PARTITION = 4; public const INTERLACE_GIF = 5; public const INTERLACE_JPEG = 6; public const INTERLACE_PNG = 7; public const FILLRULE_UNDEFINED = 0; public const FILLRULE_EVENODD = 1; public const FILLRULE_NONZERO = 2; public const PATHUNITS_UNDEFINED = 0; public const PATHUNITS_USERSPACE = 1; public const PATHUNITS_USERSPACEONUSE = 2; public const PATHUNITS_OBJECTBOUNDINGBOX = 3; public const LINECAP_UNDEFINED = 0; public const LINECAP_BUTT = 1; public const LINECAP_ROUND = 2; public const LINECAP_SQUARE = 3; public const LINEJOIN_UNDEFINED = 0; public const LINEJOIN_MITER = 1; public const LINEJOIN_ROUND = 2; public const LINEJOIN_BEVEL = 3; public const RESOURCETYPE_UNDEFINED = 0; public const RESOURCETYPE_AREA = 1; public const RESOURCETYPE_DISK = 2; public const RESOURCETYPE_FILE = 3; public const RESOURCETYPE_MAP = 4; public const RESOURCETYPE_MEMORY = 5; public const RESOURCETYPE_TIME = 7; public const RESOURCETYPE_THROTTLE = 8; public const RESOURCETYPE_THREAD = 6; public const DISPOSE_UNRECOGNIZED = 0; public const DISPOSE_UNDEFINED = 0; public const DISPOSE_NONE = 1; public const DISPOSE_BACKGROUND = 2; public const DISPOSE_PREVIOUS = 3; public const INTERPOLATE_UNDEFINED = 0; public const INTERPOLATE_AVERAGE = 1; public const INTERPOLATE_BICUBIC = 2; public const INTERPOLATE_BILINEAR = 3; public const INTERPOLATE_FILTER = 4; public const INTERPOLATE_INTEGER = 5; public const INTERPOLATE_MESH = 6; public const INTERPOLATE_NEARESTNEIGHBOR = 7; public const INTERPOLATE_SPLINE = 8; public const LAYERMETHOD_UNDEFINED = 0; public const LAYERMETHOD_COALESCE = 1; public const LAYERMETHOD_COMPAREANY = 2; public const LAYERMETHOD_COMPARECLEAR = 3; public const LAYERMETHOD_COMPAREOVERLAY = 4; public const LAYERMETHOD_DISPOSE = 5; public const LAYERMETHOD_OPTIMIZE = 6; public const LAYERMETHOD_OPTIMIZEPLUS = 8; public const LAYERMETHOD_OPTIMIZETRANS = 9; public const LAYERMETHOD_COMPOSITE = 12; public const LAYERMETHOD_OPTIMIZEIMAGE = 7; public const LAYERMETHOD_REMOVEDUPS = 10; public const LAYERMETHOD_REMOVEZERO = 11; public const LAYERMETHOD_TRIMBOUNDS = 16; public const ORIENTATION_UNDEFINED = 0; public const ORIENTATION_TOPLEFT = 1; public const ORIENTATION_TOPRIGHT = 2; public const ORIENTATION_BOTTOMRIGHT = 3; public const ORIENTATION_BOTTOMLEFT = 4; public const ORIENTATION_LEFTTOP = 5; public const ORIENTATION_RIGHTTOP = 6; public const ORIENTATION_RIGHTBOTTOM = 7; public const ORIENTATION_LEFTBOTTOM = 8; public const DISTORTION_UNDEFINED = 0; public const DISTORTION_AFFINE = 1; public const DISTORTION_AFFINEPROJECTION = 2; public const DISTORTION_ARC = 9; public const DISTORTION_BILINEAR = 6; public const DISTORTION_PERSPECTIVE = 4; public const DISTORTION_PERSPECTIVEPROJECTION = 5; public const DISTORTION_SCALEROTATETRANSLATE = 3; public const DISTORTION_POLYNOMIAL = 8; public const DISTORTION_POLAR = 10; public const DISTORTION_DEPOLAR = 11; public const DISTORTION_BARREL = 14; public const DISTORTION_SHEPARDS = 16; public const DISTORTION_SENTINEL = 18; public const DISTORTION_BARRELINVERSE = 15; public const DISTORTION_BILINEARFORWARD = 6; public const DISTORTION_BILINEARREVERSE = 7; public const DISTORTION_RESIZE = 17; public const DISTORTION_CYLINDER2PLANE = 12; public const DISTORTION_PLANE2CYLINDER = 13; public const LAYERMETHOD_MERGE = 13; public const LAYERMETHOD_FLATTEN = 14; public const LAYERMETHOD_MOSAIC = 15; public const ALPHACHANNEL_ACTIVATE = 1; public const ALPHACHANNEL_RESET = 7; public const ALPHACHANNEL_SET = 8; public const ALPHACHANNEL_UNDEFINED = 0; public const ALPHACHANNEL_COPY = 3; public const ALPHACHANNEL_DEACTIVATE = 4; public const ALPHACHANNEL_EXTRACT = 5; public const ALPHACHANNEL_OPAQUE = 6; public const ALPHACHANNEL_SHAPE = 9; public const ALPHACHANNEL_TRANSPARENT = 10; public const SPARSECOLORMETHOD_UNDEFINED = 0; public const SPARSECOLORMETHOD_BARYCENTRIC = 1; public const SPARSECOLORMETHOD_BILINEAR = 7; public const SPARSECOLORMETHOD_POLYNOMIAL = 8; public const SPARSECOLORMETHOD_SPEPARDS = 16; public const SPARSECOLORMETHOD_VORONOI = 18; public const SPARSECOLORMETHOD_INVERSE = 19; public const DITHERMETHOD_UNDEFINED = 0; public const DITHERMETHOD_NO = 1; public const DITHERMETHOD_RIEMERSMA = 2; public const DITHERMETHOD_FLOYDSTEINBERG = 3; public const FUNCTION_UNDEFINED = 0; public const FUNCTION_POLYNOMIAL = 1; public const FUNCTION_SINUSOID = 2; public const ALPHACHANNEL_BACKGROUND = 2; public const FUNCTION_ARCSIN = 3; public const FUNCTION_ARCTAN = 4; public const ALPHACHANNEL_FLATTEN = 11; public const ALPHACHANNEL_REMOVE = 12; public const STATISTIC_GRADIENT = 1; public const STATISTIC_MAXIMUM = 2; public const STATISTIC_MEAN = 3; public const STATISTIC_MEDIAN = 4; public const STATISTIC_MINIMUM = 5; public const STATISTIC_MODE = 6; public const STATISTIC_NONPEAK = 7; public const STATISTIC_STANDARD_DEVIATION = 8; public const MORPHOLOGY_CONVOLVE = 1; public const MORPHOLOGY_CORRELATE = 2; public const MORPHOLOGY_ERODE = 3; public const MORPHOLOGY_DILATE = 4; public const MORPHOLOGY_ERODE_INTENSITY = 5; public const MORPHOLOGY_DILATE_INTENSITY = 6; public const MORPHOLOGY_DISTANCE = 7; public const MORPHOLOGY_OPEN = 8; public const MORPHOLOGY_CLOSE = 9; public const MORPHOLOGY_OPEN_INTENSITY = 10; public const MORPHOLOGY_CLOSE_INTENSITY = 11; public const MORPHOLOGY_SMOOTH = 12; public const MORPHOLOGY_EDGE_IN = 13; public const MORPHOLOGY_EDGE_OUT = 14; public const MORPHOLOGY_EDGE = 15; public const MORPHOLOGY_TOP_HAT = 16; public const MORPHOLOGY_BOTTOM_HAT = 17; public const MORPHOLOGY_HIT_AND_MISS = 18; public const MORPHOLOGY_THINNING = 19; public const MORPHOLOGY_THICKEN = 20; public const MORPHOLOGY_VORONOI = 21; public const MORPHOLOGY_ITERATIVE = 22; public const KERNEL_UNITY = 1; public const KERNEL_GAUSSIAN = 2; public const KERNEL_DIFFERENCE_OF_GAUSSIANS = 3; public const KERNEL_LAPLACIAN_OF_GAUSSIANS = 4; public const KERNEL_BLUR = 5; public const KERNEL_COMET = 6; public const KERNEL_LAPLACIAN = 7; public const KERNEL_SOBEL = 8; public const KERNEL_FREI_CHEN = 9; public const KERNEL_ROBERTS = 10; public const KERNEL_PREWITT = 11; public const KERNEL_COMPASS = 12; public const KERNEL_KIRSCH = 13; public const KERNEL_DIAMOND = 14; public const KERNEL_SQUARE = 15; public const KERNEL_RECTANGLE = 16; public const KERNEL_OCTAGON = 17; public const KERNEL_DISK = 18; public const KERNEL_PLUS = 19; public const KERNEL_CROSS = 20; public const KERNEL_RING = 21; public const KERNEL_PEAKS = 22; public const KERNEL_EDGES = 23; public const KERNEL_CORNERS = 24; public const KERNEL_DIAGONALS = 25; public const KERNEL_LINE_ENDS = 26; public const KERNEL_LINE_JUNCTIONS = 27; public const KERNEL_RIDGES = 28; public const KERNEL_CONVEX_HULL = 29; public const KERNEL_THIN_SE = 30; public const KERNEL_SKELETON = 31; public const KERNEL_CHEBYSHEV = 32; public const KERNEL_MANHATTAN = 33; public const KERNEL_OCTAGONAL = 34; public const KERNEL_EUCLIDEAN = 35; public const KERNEL_USER_DEFINED = 36; public const KERNEL_BINOMIAL = 37; public const DIRECTION_LEFT_TO_RIGHT = 2; public const DIRECTION_RIGHT_TO_LEFT = 1; public const NORMALIZE_KERNEL_NONE = 0; public const NORMALIZE_KERNEL_VALUE = 8192; public const NORMALIZE_KERNEL_CORRELATE = 65536; public const NORMALIZE_KERNEL_PERCENT = 4096; /** * (PECL imagick 2.0.0)
* Removes repeated portions of images to optimize * @link https://php.net/manual/en/imagick.optimizeimagelayers.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function optimizeImageLayers() {} /** * (PECL imagick 2.0.0)
* Returns the maximum bounding region between images * @link https://php.net/manual/en/imagick.compareimagelayers.php * @param int $method

* One of the layer method constants. *

* @return Imagick TRUE on success. * @throws ImagickException on error. */ public function compareImageLayers($method) {} /** * (PECL imagick 2.0.0)
* Quickly fetch attributes * @link https://php.net/manual/en/imagick.pingimageblob.php * @param string $image

* A string containing the image. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function pingImageBlob($image) {} /** * (PECL imagick 2.0.0)
* Get basic image attributes in a lightweight manner * @link https://php.net/manual/en/imagick.pingimagefile.php * @param resource $filehandle

* An open filehandle to the image. *

* @param string $fileName [optional]

* Optional filename for this image. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function pingImageFile($filehandle, $fileName = null) {} /** * (PECL imagick 2.0.0)
* Creates a vertical mirror image * @link https://php.net/manual/en/imagick.transposeimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function transposeImage() {} /** * (PECL imagick 2.0.0)
* Creates a horizontal mirror image * @link https://php.net/manual/en/imagick.transverseimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function transverseImage() {} /** * (PECL imagick 2.0.0)
* Remove edges from the image * @link https://php.net/manual/en/imagick.trimimage.php * @param float $fuzz

* By default target must match a particular pixel color exactly. * However, in many cases two colors may differ by a small amount. * The fuzz member of image defines how much tolerance is acceptable * to consider two colors as the same. This parameter represents the variation * on the quantum range. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function trimImage($fuzz) {} /** * (PECL imagick 2.0.0)
* Applies wave filter to the image * @link https://php.net/manual/en/imagick.waveimage.php * @param float $amplitude

* The amplitude of the wave. *

* @param float $length

* The length of the wave. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function waveImage($amplitude, $length) {} /** * (PECL imagick 2.0.0)
* Adds vignette filter to the image * @link https://php.net/manual/en/imagick.vignetteimage.php * @param float $blackPoint

* The black point. *

* @param float $whitePoint

* The white point *

* @param int $x

* X offset of the ellipse *

* @param int $y

* Y offset of the ellipse *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function vignetteImage($blackPoint, $whitePoint, $x, $y) {} /** * (PECL imagick 2.0.0)
* Discards all but one of any pixel color * @link https://php.net/manual/en/imagick.uniqueimagecolors.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function uniqueImageColors() {} /** * (PECL imagick 2.0.0)
* Return if the image has a matte channel * @link https://php.net/manual/en/imagick.getimagematte.php * @return bool TRUE on success or FALSE on failure. * @throws ImagickException on error. */ #[Deprecated] #[Pure] public function getImageMatte() {} /** * (PECL imagick 2.0.0)
* Sets the image matte channel * @link https://php.net/manual/en/imagick.setimagematte.php * @param bool $matte

* True activates the matte channel and false disables it. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageMatte($matte) {} /** * Adaptively resize image with data dependent triangulation * * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.
* If false, the calculations should produce the same results as ImageMagick CLI does.
*
* Note: The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. * In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given. * @link https://php.net/manual/en/imagick.adaptiveresizeimage.php * @param int $columns The number of columns in the scaled image. * @param int $rows The number of rows in the scaled image. * @param bool $bestfit [optional] Whether to fit the image inside a bounding box.
* The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given. * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE * @return bool TRUE on success * @throws ImagickException Throws ImagickException on error * @since 2.0.0 */ public function adaptiveResizeImage($columns, $rows, $bestfit = false, $legacy = false) {} /** * (PECL imagick 2.0.0)
* Simulates a pencil sketch * @link https://php.net/manual/en/imagick.sketchimage.php * @param float $radius

* The radius of the Gaussian, in pixels, not counting the center pixel *

* @param float $sigma

* The standard deviation of the Gaussian, in pixels. *

* @param float $angle

* Apply the effect along this angle. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function sketchImage($radius, $sigma, $angle) {} /** * (PECL imagick 2.0.0)
* Creates a 3D effect * @link https://php.net/manual/en/imagick.shadeimage.php * @param bool $gray

* A value other than zero shades the intensity of each pixel. *

* @param float $azimuth

* Defines the light source direction. *

* @param float $elevation

* Defines the light source direction. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function shadeImage($gray, $azimuth, $elevation) {} /** * (PECL imagick 2.0.0)
* Returns the size offset * @link https://php.net/manual/en/imagick.getsizeoffset.php * @return int the size offset associated with the Imagick object. * @throws ImagickException on error. */ #[Pure] public function getSizeOffset() {} /** * (PECL imagick 2.0.0)
* Sets the size and offset of the Imagick object * @link https://php.net/manual/en/imagick.setsizeoffset.php * @param int $columns

* The width in pixels. *

* @param int $rows

* The height in pixels. *

* @param int $offset

* The image offset. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setSizeOffset($columns, $rows, $offset) {} /** * (PECL imagick 2.0.0)
* Adds adaptive blur filter to image * @link https://php.net/manual/en/imagick.adaptiveblurimage.php * @param float $radius

* The radius of the Gaussian, in pixels, not counting the center pixel. * Provide a value of 0 and the radius will be chosen automagically. *

* @param float $sigma

* The standard deviation of the Gaussian, in pixels. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function adaptiveBlurImage($radius, $sigma, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (PECL imagick 2.0.0)
* Enhances the contrast of a color image * @link https://php.net/manual/en/imagick.contraststretchimage.php * @param float $black_point

* The black point. *

* @param float $white_point

* The white point. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Imagick::CHANNEL_ALL. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function contrastStretchImage($black_point, $white_point, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Adaptively sharpen the image * @link https://php.net/manual/en/imagick.adaptivesharpenimage.php * @param float $radius

* The radius of the Gaussian, in pixels, not counting the center pixel. Use 0 for auto-select. *

* @param float $sigma

* The standard deviation of the Gaussian, in pixels. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function adaptiveSharpenImage($radius, $sigma, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (PECL imagick 2.0.0)
* Creates a high-contrast, two-color image * @link https://php.net/manual/en/imagick.randomthresholdimage.php * @param float $low

* The low point *

* @param float $high

* The high point *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function randomThresholdImage($low, $high, $channel = Imagick::CHANNEL_ALL) {} /** * @param $xRounding * @param $yRounding * @param $strokeWidth [optional] * @param $displace [optional] * @param $sizeCorrection [optional] * @throws ImagickException on error. */ public function roundCornersImage($xRounding, $yRounding, $strokeWidth, $displace, $sizeCorrection) {} /** * (PECL imagick 2.0.0)
* Rounds image corners * Alias to {@see Imagick::roundCornersImage} * @link https://php.net/manual/en/imagick.roundcorners.php * @param float $x_rounding

* x rounding *

* @param float $y_rounding

* y rounding *

* @param float $stroke_width [optional]

* stroke width *

* @param float $displace [optional]

* image displace *

* @param float $size_correction [optional]

* size correction *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated(replacement: "%class%->roundCornersImage(%parametersList%)")] public function roundCorners($x_rounding, $y_rounding, $stroke_width = 10.0, $displace = 5.0, $size_correction = -6.0) {} /** * (PECL imagick 2.0.0)
* Set the iterator position * @link https://php.net/manual/en/imagick.setiteratorindex.php * @param int $index

* The position to set the iterator to *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setIteratorIndex($index) {} /** * (PECL imagick 2.0.0)
* Gets the index of the current active image * @link https://php.net/manual/en/imagick.getiteratorindex.php * @return int an integer containing the index of the image in the stack. */ #[Pure] public function getIteratorIndex() {} /** * (PECL imagick 2.0.0)
* Convenience method for setting crop size and the image geometry * @link https://php.net/manual/en/imagick.transformimage.php * @param string $crop

* A crop geometry string. This geometry defines a subregion of the image to crop. *

* @param string $geometry

* An image geometry string. This geometry defines the final size of the image. *

* @return Imagick TRUE on success. * @throws ImagickException on error. */ public function transformImage($crop, $geometry) {} /** * (PECL imagick 2.0.0)
* Sets the image opacity level * @link https://php.net/manual/en/imagick.setimageopacity.php * @param float $opacity

* The level of transparency: 1.0 is fully opaque and 0.0 is fully * transparent. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageOpacity($opacity) {} /** * (PECL imagick 2.2.2)
* Performs an ordered dither * @link https://php.net/manual/en/imagick.orderedposterizeimage.php * @param string $threshold_map

* A string containing the name of the threshold dither map to use *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function orderedPosterizeImage($threshold_map, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Simulates a Polaroid picture * @link https://php.net/manual/en/imagick.polaroidimage.php * @param ImagickDraw $properties

* The polaroid properties *

* @param float $angle

* The polaroid angle *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function polaroidImage(ImagickDraw $properties, $angle) {} /** * (PECL imagick 2.0.0)
* Returns the named image property * @link https://php.net/manual/en/imagick.getimageproperty.php * @param string $name

* name of the property (for example Exif:DateTime) *

* @return string|false a string containing the image property, false if a * property with the given name does not exist. * @throws ImagickException on error. */ #[Pure] public function getImageProperty($name) {} /** * (PECL imagick 2.0.0)
* Sets an image property * @link https://php.net/manual/en/imagick.setimageproperty.php * @param string $name * @param string $value * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageProperty($name, $value) {} /** * (PECL imagick 2.0.0)
* Sets the image interpolate pixel method * @link https://php.net/manual/en/imagick.setimageinterpolatemethod.php * @param int $method

* The method is one of the Imagick::INTERPOLATE_* constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageInterpolateMethod($method) {} /** * (PECL imagick 2.0.0)
* Returns the interpolation method * @link https://php.net/manual/en/imagick.getimageinterpolatemethod.php * @return int the interpolate method on success. * @throws ImagickException on error. */ #[Pure] public function getImageInterpolateMethod() {} /** * (PECL imagick 2.0.0)
* Stretches with saturation the image intensity * @link https://php.net/manual/en/imagick.linearstretchimage.php * @param float $blackPoint

* The image black point *

* @param float $whitePoint

* The image white point *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function linearStretchImage($blackPoint, $whitePoint) {} /** * (PECL imagick 2.0.0)
* Returns the image length in bytes * @link https://php.net/manual/en/imagick.getimagelength.php * @return int an int containing the current image size. * @throws ImagickException on error. */ #[Pure] public function getImageLength() {} /** * (No version information available, might only be in SVN)
* Set image size * @link https://php.net/manual/en/imagick.extentimage.php * @param int $width

* The new width *

* @param int $height

* The new height *

* @param int $x

* X position for the new size *

* @param int $y

* Y position for the new size *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function extentImage($width, $height, $x, $y) {} /** * (PECL imagick 2.0.0)
* Gets the image orientation * @link https://php.net/manual/en/imagick.getimageorientation.php * @return int an int on success. * @throws ImagickException on error. */ #[Pure] public function getImageOrientation() {} /** * (PECL imagick 2.0.0)
* Sets the image orientation * @link https://php.net/manual/en/imagick.setimageorientation.php * @param int $orientation

* One of the orientation constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageOrientation($orientation) {} /** * (PECL imagick 2.1.0)
* Changes the color value of any pixel that matches target * @link https://php.net/manual/en/imagick.paintfloodfillimage.php * @param mixed $fill

* ImagickPixel object or a string containing the fill color *

* @param float $fuzz

* The amount of fuzz. For example, set fuzz to 10 and the color red at * intensities of 100 and 102 respectively are now interpreted as the * same color for the purposes of the floodfill. *

* @param mixed $bordercolor

* ImagickPixel object or a string containing the border color *

* @param int $x

* X start position of the floodfill *

* @param int $y

* Y start position of the floodfill *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function paintFloodfillImage($fill, $fuzz, $bordercolor, $x, $y, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Replaces colors in the image from a color lookup table. Optional second parameter to replace colors in a specific channel. This method is available if Imagick has been compiled against ImageMagick version 6.3.6 or newer. * @link https://php.net/manual/en/imagick.clutimage.php * @param Imagick $lookup_table

* Imagick object containing the color lookup table *

* @param int $channel [optional]

* The Channeltype * constant. When not supplied, default channels are replaced. *

* @return bool TRUE on success. * @throws ImagickException on error. * @since 2.0.0 */ public function clutImage(Imagick $lookup_table, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (PECL imagick 2.0.0)
* Returns the image properties * @link https://php.net/manual/en/imagick.getimageproperties.php * @param string $pattern [optional]

* The pattern for property names. *

* @param bool $only_names [optional]

* Whether to return only property names. If FALSE then also the values are returned *

* @return array an array containing the image properties or property names. * @throws ImagickException on error. */ #[Pure] public function getImageProperties($pattern = "*", $only_names = true) {} /** * (PECL imagick 2.2.0)
* Returns the image profiles * @link https://php.net/manual/en/imagick.getimageprofiles.php * @param string $pattern [optional]

* The pattern for profile names. *

* @param bool $include_values [optional]

* Whether to return only profile names. If FALSE then only profile names will be returned. *

* @return array an array containing the image profiles or profile names. * @throws ImagickException on error. */ #[Pure] public function getImageProfiles($pattern = "*", $include_values = true) {} /** * (PECL imagick 2.0.1)
* Distorts an image using various distortion methods * @link https://php.net/manual/en/imagick.distortimage.php * @param int $method

* The method of image distortion. See distortion constants *

* @param array $arguments

* The arguments for this distortion method *

* @param bool $bestfit

* Attempt to resize destination to fit distorted source *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function distortImage($method, array $arguments, $bestfit) {} /** * (No version information available, might only be in SVN)
* Writes an image to a filehandle * @link https://php.net/manual/en/imagick.writeimagefile.php * @param resource $filehandle

* Filehandle where to write the image *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function writeImageFile($filehandle) {} /** * (No version information available, might only be in SVN)
* Writes frames to a filehandle * @link https://php.net/manual/en/imagick.writeimagesfile.php * @param resource $filehandle

* Filehandle where to write the images *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function writeImagesFile($filehandle) {} /** * (No version information available, might only be in SVN)
* Reset image page * @link https://php.net/manual/en/imagick.resetimagepage.php * @param string $page

* The page definition. For example 7168x5147+0+0 *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function resetImagePage($page) {} /** * (No version information available, might only be in SVN)
* Sets image clip mask * @link https://php.net/manual/en/imagick.setimageclipmask.php * @param Imagick $clip_mask

* The Imagick object containing the clip mask *

* @return bool TRUE on success. */ public function setImageClipMask(Imagick $clip_mask) {} /** * (No version information available, might only be in SVN)
* Gets image clip mask * @link https://php.net/manual/en/imagick.getimageclipmask.php * @return Imagick an Imagick object containing the clip mask. * @throws ImagickException on error. */ #[Pure] public function getImageClipMask() {} /** * (No version information available, might only be in SVN)
* Animates an image or images * @link https://php.net/manual/en/imagick.animateimages.php * @param string $x_server

* X server address *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function animateImages($x_server) {} /** * (No version information available, might only be in SVN)
* Recolors image * @link https://php.net/manual/en/imagick.recolorimage.php * @param array $matrix

* The matrix containing the color values *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function recolorImage(array $matrix) {} /** * (PECL imagick 2.1.0)
* Sets font * @link https://php.net/manual/en/imagick.setfont.php * @param string $font

* Font name or a filename *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setFont($font) {} /** * (PECL imagick 2.1.0)
* Gets font * @link https://php.net/manual/en/imagick.getfont.php * @return string|false the string containing the font name or FALSE if not font is set. */ #[Pure] public function getFont() {} /** * (PECL imagick 2.1.0)
* Sets point size * @link https://php.net/manual/en/imagick.setpointsize.php * @param float $point_size

* Point size *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setPointSize($point_size) {} /** * (No version information available, might only be in SVN)
* Gets point size * @link https://php.net/manual/en/imagick.getpointsize.php * @return float a float containing the point size. */ #[Pure] public function getPointSize() {} /** * (PECL imagick 2.1.0)
* Merges image layers * @link https://php.net/manual/en/imagick.mergeimagelayers.php * @param int $layer_method

* One of the Imagick::LAYERMETHOD_* constants *

* @return Imagick Returns an Imagick object containing the merged image. * @throws ImagickException */ public function mergeImageLayers($layer_method) {} /** * (No version information available, might only be in SVN)
* Sets image alpha channel * @link https://php.net/manual/en/imagick.setimagealphachannel.php * @param int $mode

* One of the Imagick::ALPHACHANNEL_* constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageAlphaChannel($mode) {} /** * (No version information available, might only be in SVN)
* Changes the color value of any pixel that matches target * @link https://php.net/manual/en/imagick.floodfillpaintimage.php * @param mixed $fill

* ImagickPixel object or a string containing the fill color *

* @param float $fuzz

* The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color. *

* @param mixed $target

* ImagickPixel object or a string containing the target color to paint *

* @param int $x

* X start position of the floodfill *

* @param int $y

* Y start position of the floodfill *

* @param bool $invert

* If TRUE paints any pixel that does not match the target color. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function floodFillPaintImage($fill, $fuzz, $target, $x, $y, $invert, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (No version information available, might only be in SVN)
* Changes the color value of any pixel that matches target * @link https://php.net/manual/en/imagick.opaquepaintimage.php * @param mixed $target

* ImagickPixel object or a string containing the color to change *

* @param mixed $fill

* The replacement color *

* @param float $fuzz

* The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color. *

* @param bool $invert

* If TRUE paints any pixel that does not match the target color. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function opaquePaintImage($target, $fill, $fuzz, $invert, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (No version information available, might only be in SVN)
* Paints pixels transparent * @link https://php.net/manual/en/imagick.transparentpaintimage.php * @param mixed $target

* The target color to paint *

* @param float $alpha

* The level of transparency: 1.0 is fully opaque and 0.0 is fully transparent. *

* @param float $fuzz

* The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color. *

* @param bool $invert

* If TRUE paints any pixel that does not match the target color. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function transparentPaintImage($target, $alpha, $fuzz, $invert) {} /** * (No version information available, might only be in SVN)
* Animates an image or images * @link https://php.net/manual/en/imagick.liquidrescaleimage.php * @param int $width

* The width of the target size *

* @param int $height

* The height of the target size *

* @param float $delta_x

* How much the seam can traverse on x-axis. * Passing 0 causes the seams to be straight. *

* @param float $rigidity

* Introduces a bias for non-straight seams. This parameter is * typically 0. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function liquidRescaleImage($width, $height, $delta_x, $rigidity) {} /** * (No version information available, might only be in SVN)
* Enciphers an image * @link https://php.net/manual/en/imagick.encipherimage.php * @param string $passphrase

* The passphrase *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function encipherImage($passphrase) {} /** * (No version information available, might only be in SVN)
* Deciphers an image * @link https://php.net/manual/en/imagick.decipherimage.php * @param string $passphrase

* The passphrase *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function decipherImage($passphrase) {} /** * (No version information available, might only be in SVN)
* Sets the gravity * @link https://php.net/manual/en/imagick.setgravity.php * @param int $gravity

* The gravity property. Refer to the list of * gravity constants. *

* @return bool No value is returned. * @throws ImagickException on error. */ public function setGravity($gravity) {} /** * (No version information available, might only be in SVN)
* Gets the gravity * @link https://php.net/manual/en/imagick.getgravity.php * @return int the gravity property. Refer to the list of * gravity constants. */ #[Pure] public function getGravity() {} /** * (PECL imagick 2.2.1)
* Gets channel range * @link https://php.net/manual/en/imagick.getimagechannelrange.php * @param int $channel

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return float[] an array containing minima and maxima values of the channel(s). * @throws ImagickException on error. */ #[ArrayShape(["minima" => "float", "maxima" => "float"])] #[Pure] public function getImageChannelRange($channel) {} /** * (No version information available, might only be in SVN)
* Gets the image alpha channel * @link https://php.net/manual/en/imagick.getimagealphachannel.php * @return int a constant defining the current alpha channel value. Refer to this * list of alpha channel constants. * @throws ImagickException on error. */ #[Pure] public function getImageAlphaChannel() {} /** * (No version information available, might only be in SVN)
* Gets channel distortions * @link https://php.net/manual/en/imagick.getimagechanneldistortions.php * @param Imagick $reference

* Imagick object containing the reference image *

* @param int $metric

* Refer to this list of metric type constants. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return float a float describing the channel distortion. * @throws ImagickException on error. */ #[Pure] public function getImageChannelDistortions(Imagick $reference, $metric, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (No version information available, might only be in SVN)
* Sets the image gravity * @link https://php.net/manual/en/imagick.setimagegravity.php * @param int $gravity

* The gravity property. Refer to the list of * gravity constants. *

* @return bool No value is returned. * @throws ImagickException on error. */ public function setImageGravity($gravity) {} /** * (No version information available, might only be in SVN)
* Gets the image gravity * @link https://php.net/manual/en/imagick.getimagegravity.php * @return int the images gravity property. Refer to the list of * gravity constants. * @throws ImagickException on error. */ #[Pure] public function getImageGravity() {} /** * (No version information available, might only be in SVN)
* Imports image pixels * @link https://php.net/manual/en/imagick.importimagepixels.php * @param int $x

* The image x position *

* @param int $y

* The image y position *

* @param int $width

* The image width *

* @param int $height

* The image height *

* @param string $map

* Map of pixel ordering as a string. This can be for example RGB. * The value can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), * O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad. *

* @param int $storage

* The pixel storage method. * Refer to this list of pixel constants. *

* @param array $pixels

* The array of pixels *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function importImagePixels($x, $y, $width, $height, $map, $storage, array $pixels) {} /** * (No version information available, might only be in SVN)
* Removes skew from the image * @link https://php.net/manual/en/imagick.deskewimage.php * @param float $threshold

* Deskew threshold *

* @return bool * @throws ImagickException on error. */ public function deskewImage($threshold) {} /** * (No version information available, might only be in SVN)
* Segments an image * @link https://php.net/manual/en/imagick.segmentimage.php * @param int $COLORSPACE

* One of the COLORSPACE constants. *

* @param float $cluster_threshold

* A percentage describing minimum number of pixels * contained in hexedra before it is considered valid. *

* @param float $smooth_threshold

* Eliminates noise from the histogram. *

* @param bool $verbose [optional]

* Whether to output detailed information about recognised classes. *

* @return bool * @throws ImagickException on error. */ public function segmentImage($COLORSPACE, $cluster_threshold, $smooth_threshold, $verbose = false) {} /** * (No version information available, might only be in SVN)
* Interpolates colors * @link https://php.net/manual/en/imagick.sparsecolorimage.php * @param int $SPARSE_METHOD

* Refer to this list of sparse method constants *

* @param array $arguments

* An array containing the coordinates. * The array is in format array(1,1, 2,45) *

* @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function sparseColorImage($SPARSE_METHOD, array $arguments, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (No version information available, might only be in SVN)
* Remaps image colors * @link https://php.net/manual/en/imagick.remapimage.php * @param Imagick $replacement

* An Imagick object containing the replacement colors *

* @param int $DITHER

* Refer to this list of dither method constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function remapImage(Imagick $replacement, $DITHER) {} /** * (No version information available, might only be in SVN)
* Exports raw image pixels * @link https://php.net/manual/en/imagick.exportimagepixels.php * @param int $x

* X-coordinate of the exported area *

* @param int $y

* Y-coordinate of the exported area *

* @param int $width

* Width of the exported aread *

* @param int $height

* Height of the exported area *

* @param string $map

* Ordering of the exported pixels. For example "RGB". * Valid characters for the map are R, G, B, A, O, C, Y, M, K, I and P. *

* @param int $STORAGE

* Refer to this list of pixel type constants *

* @return int[] an array containing the pixels values. * @throws ImagickException on error. */ public function exportImagePixels($x, $y, $width, $height, $map, $STORAGE) {} /** * (No version information available, might only be in SVN)
* The getImageChannelKurtosis purpose * @link https://php.net/manual/en/imagick.getimagechannelkurtosis.php * @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return float[] an array with kurtosis and skewness * members. * @throws ImagickException on error. */ #[ArrayShape(["kurtosis" => "float", "skewness" => "float"])] #[Pure] public function getImageChannelKurtosis($channel = Imagick::CHANNEL_DEFAULT) {} /** * (No version information available, might only be in SVN)
* Applies a function on the image * @link https://php.net/manual/en/imagick.functionimage.php * @param int $function

* Refer to this list of function constants *

* @param array $arguments

* Array of arguments to pass to this function. *

* @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function functionImage($function, array $arguments, $channel = Imagick::CHANNEL_DEFAULT) {} /** * Transform image colorspace * @param $COLORSPACE * @return bool TRUE on success. * @throws ImagickException on error. */ public function transformImageColorspace($COLORSPACE) {} /** * (No version information available, might only be in SVN)
* Replaces colors in the image * @link https://php.net/manual/en/imagick.haldclutimage.php * @param Imagick $clut

* Imagick object containing the Hald lookup image. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function haldClutImage(Imagick $clut, $channel = Imagick::CHANNEL_DEFAULT) {} /** * Adjusts the levels of a particular image channel by scaling the minimum and maximum values to the full quantum range. * @param $CHANNEL [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function autoLevelImage($CHANNEL) {} /** * @link https://www.php.net/manual/en/imagick.blueshiftimage.php * @param float $factor [optional] * @return bool * @throws ImagickException on error. */ public function blueShiftImage($factor) {} /** * (No version information available, might only be in SVN)
* Get image artifact * @link https://php.net/manual/en/imagick.getimageartifact.php * @param string $artifact

* The name of the artifact *

* @return string the artifact value on success. * @throws ImagickException on error. */ #[Pure] public function getImageArtifact($artifact) {} /** * (No version information available, might only be in SVN)
* Set image artifact * @link https://php.net/manual/en/imagick.setimageartifact.php * @param string $artifact

* The name of the artifact *

* @param string $value

* The value of the artifact *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageArtifact($artifact, $value) {} /** * (No version information available, might only be in SVN)
* Delete image artifact * @link https://php.net/manual/en/imagick.deleteimageartifact.php * @param string $artifact

* The name of the artifact to delete *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function deleteImageArtifact($artifact) {} /** * (PECL imagick 0.9.10-0.9.9)
* Gets the colorspace * @link https://php.net/manual/en/imagick.getcolorspace.php * @return int an integer which can be compared against COLORSPACE constants. */ #[Pure] public function getColorspace() {} /** * (No version information available, might only be in SVN)
* Set colorspace * @link https://php.net/manual/en/imagick.setcolorspace.php * @param int $COLORSPACE

* One of the COLORSPACE constants *

* @return bool TRUE on success. */ public function setColorspace($COLORSPACE) {} /** * @param $CHANNEL [optional] * @throws ImagickException on error. */ public function clampImage($CHANNEL) {} /** * @param bool $stack * @param int $offset * @return Imagick * @throws ImagickException on error. */ public function smushImages($stack, $offset) {} /** * (PECL imagick 2.0.0)
* The Imagick constructor * @link https://php.net/manual/en/imagick.construct.php * @param mixed $files

* The path to an image to load or an array of paths. Paths can include * wildcards for file names, or can be URLs. *

* @throws ImagickException Throws ImagickException on error. */ public function __construct($files = null) {} /** * @return string */ public function __toString() {} public function count() {} /** * (PECL imagick 2.0.0)
* Returns a MagickPixelIterator * @link https://php.net/manual/en/imagick.getpixeliterator.php * @return ImagickPixelIterator an ImagickPixelIterator on success. * @throws ImagickException on error. * @throws ImagickPixelIteratorException on error. */ #[Pure] public function getPixelIterator() {} /** * (PECL imagick 2.0.0)
* Get an ImagickPixelIterator for an image section * @link https://php.net/manual/en/imagick.getpixelregioniterator.php * @param int $x

* The x-coordinate of the region. *

* @param int $y

* The y-coordinate of the region. *

* @param int $columns

* The width of the region. *

* @param int $rows

* The height of the region. *

* @return ImagickPixelIterator an ImagickPixelIterator for an image section. * @throws ImagickException on error. * @throws ImagickPixelIteratorException on error. */ #[Pure] public function getPixelRegionIterator($x, $y, $columns, $rows) {} /** * (PECL imagick 0.9.0-0.9.9)
* Reads image from filename * @link https://php.net/manual/en/imagick.readimage.php * @param string $filename * @return bool TRUE on success. * @throws ImagickException Throws ImagickException on error. */ public function readImage($filename) {} /** * @param $filenames * @throws ImagickException Throws ImagickException on error. */ public function readImages($filenames) {} /** * (PECL imagick 2.0.0)
* Reads image from a binary string * @link https://php.net/manual/en/imagick.readimageblob.php * @param string $image * @param string $filename [optional] * @return bool TRUE on success. * @throws ImagickException Throws ImagickException on error. */ public function readImageBlob($image, $filename = null) {} /** * (PECL imagick 2.0.0)
* Sets the format of a particular image * @link https://php.net/manual/en/imagick.setimageformat.php * @param string $format

* String presentation of the image format. Format support * depends on the ImageMagick installation. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageFormat($format) {} /** * Scales the size of an image to the given dimensions. Passing zero as either of the arguments will preserve dimension while scaling.
* If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.
* If false, the calculations should produce the same results as ImageMagick CLI does. * @link https://php.net/manual/en/imagick.scaleimage.php * @param int $columns * @param int $rows * @param bool $bestfit [optional] The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given. * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE * @return bool TRUE on success. * @throws ImagickException Throws ImagickException on error * @since 2.0.0 */ public function scaleImage($columns, $rows, $bestfit = false, $legacy = false) {} /** * (PECL imagick 0.9.0-0.9.9)
* Writes an image to the specified filename * @link https://php.net/manual/en/imagick.writeimage.php * @param string $filename [optional]

* Filename where to write the image. The extension of the filename * defines the type of the file. * Format can be forced regardless of file extension using format: prefix, * for example "jpg:test.png". *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function writeImage($filename = null) {} /** * (PECL imagick 0.9.0-0.9.9)
* Writes an image or image sequence * @link https://php.net/manual/en/imagick.writeimages.php * @param string $filename * @param bool $adjoin * @return bool TRUE on success. * @throws ImagickException on error. */ public function writeImages($filename, $adjoin) {} /** * (PECL imagick 2.0.0)
* Adds blur filter to image * @link https://php.net/manual/en/imagick.blurimage.php * @param float $radius

* Blur radius *

* @param float $sigma

* Standard deviation *

* @param int $channel [optional]

* The Channeltype * constant. When not supplied, all channels are blurred. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function blurImage($radius, $sigma, $channel = null) {} /** * Changes the size of an image to the given dimensions and removes any associated profiles.
* If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.
* If false, the calculations should produce the same results as ImageMagick CLI does.
*
* Note: The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given. * @link https://php.net/manual/en/imagick.thumbnailimage.php * @param int $columns

* Image width *

* @param int $rows

* Image height *

* @param bool $bestfit [optional]

* Whether to force maximum values *

* The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given. * @param bool $fill [optional] * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE * @return bool TRUE on success. * @throws ImagickException on error. * @since 2.0.0 */ public function thumbnailImage($columns, $rows, $bestfit = false, $fill = false, $legacy = false) {} /** * Creates a cropped thumbnail at the requested size. * If legacy is true, uses the incorrect behaviour that was present until Imagick 3.4.0. * If false it uses the correct behaviour. * @link https://php.net/manual/en/imagick.cropthumbnailimage.php * @param int $width The width of the thumbnail * @param int $height The Height of the thumbnail * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE * @return bool TRUE on succes * @throws ImagickException Throws ImagickException on error * @since 2.0.0 */ public function cropThumbnailImage($width, $height, $legacy = false) {} /** * (PECL imagick 2.0.0)
* Returns the filename of a particular image in a sequence * @link https://php.net/manual/en/imagick.getimagefilename.php * @return string a string with the filename of the image. * @throws ImagickException on error. */ #[Pure] public function getImageFilename() {} /** * (PECL imagick 2.0.0)
* Sets the filename of a particular image * @link https://php.net/manual/en/imagick.setimagefilename.php * @param string $filename * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageFilename($filename) {} /** * (PECL imagick 2.0.0)
* Returns the format of a particular image in a sequence * @link https://php.net/manual/en/imagick.getimageformat.php * @return string a string containing the image format on success. * @throws ImagickException on error. */ #[Pure] public function getImageFormat() {} /** * @link https://secure.php.net/manual/en/imagick.getimagemimetype.php * @return string Returns the image mime-type. * @throws ImagickException on error. */ #[Pure] public function getImageMimeType() {} /** * (PECL imagick 2.0.0)
* Removes an image from the image list * @link https://php.net/manual/en/imagick.removeimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function removeImage() {} /** * (PECL imagick 2.0.0)
* Destroys the Imagick object * @link https://php.net/manual/en/imagick.destroy.php * @return bool TRUE on success. */ #[Deprecated(replacement: "%class%->clear()")] public function destroy() {} /** * (PECL imagick 2.0.0)
* Clears all resources associated to Imagick object * @link https://php.net/manual/en/imagick.clear.php * @return bool TRUE on success. */ public function clear() {} /** * (PECL imagick 2.0.0)
* Returns the image length in bytes * @link https://php.net/manual/en/imagick.getimagesize.php * @return int an int containing the current image size. * @throws ImagickException on error. */ #[Deprecated(replacement: "%class%->getImageLength()")] #[Pure] public function getImageSize() {} /** * (PECL imagick 2.0.0)
* Returns the image sequence as a blob * @link https://php.net/manual/en/imagick.getimageblob.php * @return string a string containing the image. * @throws ImagickException on error. */ #[Pure] public function getImageBlob() {} /** * (PECL imagick 2.0.0)
* Returns all image sequences as a blob * @link https://php.net/manual/en/imagick.getimagesblob.php * @return string a string containing the images. On failure, throws ImagickException on failure * @throws ImagickException on failure */ #[Pure] public function getImagesBlob() {} /** * (PECL imagick 2.0.0)
* Sets the Imagick iterator to the first image * @link https://php.net/manual/en/imagick.setfirstiterator.php * @return bool TRUE on success. */ public function setFirstIterator() {} /** * (PECL imagick 2.0.1)
* Sets the Imagick iterator to the last image * @link https://php.net/manual/en/imagick.setlastiterator.php * @return bool TRUE on success. */ public function setLastIterator() {} public function resetIterator() {} /** * (PECL imagick 2.0.0)
* Move to the previous image in the object * @link https://php.net/manual/en/imagick.previousimage.php * @return bool TRUE on success. */ public function previousImage() {} /** * (PECL imagick 2.0.0)
* Moves to the next image * @link https://php.net/manual/en/imagick.nextimage.php * @return bool TRUE on success. */ public function nextImage() {} /** * (PECL imagick 2.0.0)
* Checks if the object has a previous image * @link https://php.net/manual/en/imagick.haspreviousimage.php * @return bool TRUE if the object has more images when traversing the list in the * reverse direction, returns FALSE if there are none. */ public function hasPreviousImage() {} /** * (PECL imagick 2.0.0)
* Checks if the object has more images * @link https://php.net/manual/en/imagick.hasnextimage.php * @return bool TRUE if the object has more images when traversing the list in the * forward direction, returns FALSE if there are none. */ public function hasNextImage() {} /** * (PECL imagick 2.0.0)
* Set the iterator position * @link https://php.net/manual/en/imagick.setimageindex.php * @param int $index

* The position to set the iterator to *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function setImageIndex($index) {} /** * (PECL imagick 2.0.0)
* Gets the index of the current active image * @link https://php.net/manual/en/imagick.getimageindex.php * @return int an integer containing the index of the image in the stack. */ #[Deprecated] #[Pure] public function getImageIndex() {} /** * (PECL imagick 2.0.0)
* Adds a comment to your image * @link https://php.net/manual/en/imagick.commentimage.php * @param string $comment

* The comment to add *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function commentImage($comment) {} /** * (PECL imagick 2.0.0)
* Extracts a region of the image * @link https://php.net/manual/en/imagick.cropimage.php * @param int $width

* The width of the crop *

* @param int $height

* The height of the crop *

* @param int $x

* The X coordinate of the cropped region's top left corner *

* @param int $y

* The Y coordinate of the cropped region's top left corner *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function cropImage($width, $height, $x, $y) {} /** * (PECL imagick 2.0.0)
* Adds a label to an image * @link https://php.net/manual/en/imagick.labelimage.php * @param string $label

* The label to add *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function labelImage($label) {} /** * (PECL imagick 2.0.0)
* Gets the width and height as an associative array * @link https://php.net/manual/en/imagick.getimagegeometry.php * @return int[] an array with the width/height of the image. * @throws ImagickException on error. */ #[ArrayShape(["width" => "int", "height" => "int"])] #[Pure] public function getImageGeometry() {} /** * (PECL imagick 2.0.0)
* Renders the ImagickDraw object on the current image * @link https://php.net/manual/en/imagick.drawimage.php * @param ImagickDraw $draw

* The drawing operations to render on the image. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function drawImage(ImagickDraw $draw) {} /** * (No version information available, might only be in SVN)
* Sets the image compression quality * @link https://php.net/manual/en/imagick.setimagecompressionquality.php * @param int $quality

* The image compression quality as an integer *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageCompressionQuality($quality) {} /** * (PECL imagick 2.2.2)
* Gets the current image's compression quality * @link https://php.net/manual/en/imagick.getimagecompressionquality.php * @return int integer describing the images compression quality */ #[Pure] public function getImageCompressionQuality() {} /** * (PECL imagick 2.0.0)
* Annotates an image with text * @link https://php.net/manual/en/imagick.annotateimage.php * @param ImagickDraw $draw_settings

* The ImagickDraw object that contains settings for drawing the text *

* @param float $x

* Horizontal offset in pixels to the left of text *

* @param float $y

* Vertical offset in pixels to the baseline of text *

* @param float $angle

* The angle at which to write the text *

* @param string $text

* The string to draw *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function annotateImage(ImagickDraw $draw_settings, $x, $y, $angle, $text) {} /** * (PECL imagick 2.0.0)
* Composite one image onto another * @link https://php.net/manual/en/imagick.compositeimage.php * @param Imagick $composite_object

* Imagick object which holds the composite image *

* @param int $composite Composite operator * @param int $x

* The column offset of the composited image *

* @param int $y

* The row offset of the composited image *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function compositeImage(Imagick $composite_object, $composite, $x, $y, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Control the brightness, saturation, and hue * @link https://php.net/manual/en/imagick.modulateimage.php * @param float $brightness * @param float $saturation * @param float $hue * @return bool TRUE on success. * @throws ImagickException on error. */ public function modulateImage($brightness, $saturation, $hue) {} /** * (PECL imagick 2.0.0)
* Gets the number of unique colors in the image * @link https://php.net/manual/en/imagick.getimagecolors.php * @return int TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageColors() {} /** * (PECL imagick 2.0.0)
* Creates a composite image * @link https://php.net/manual/en/imagick.montageimage.php * @param ImagickDraw $draw

* The font name, size, and color are obtained from this object. *

* @param string $tile_geometry

* The number of tiles per row and page (e.g. 6x4+0+0). *

* @param string $thumbnail_geometry

* Preferred image size and border size of each thumbnail * (e.g. 120x120+4+3>). *

* @param int $mode

* Thumbnail framing mode, see Montage Mode constants. *

* @param string $frame

* Surround the image with an ornamental border (e.g. 15x15+3+3). The * frame color is that of the thumbnail's matte color. *

* @return Imagick TRUE on success. * @throws ImagickException on error. */ public function montageImage(ImagickDraw $draw, $tile_geometry, $thumbnail_geometry, $mode, $frame) {} /** * (PECL imagick 2.0.0)
* Identifies an image and fetches attributes * @link https://php.net/manual/en/imagick.identifyimage.php * @param bool $appendRawOutput [optional] * @return array Identifies an image and returns the attributes. Attributes include * the image width, height, size, and others. * @throws ImagickException on error. */ public function identifyImage($appendRawOutput = false) {} /** * (PECL imagick 2.0.0)
* Changes the value of individual pixels based on a threshold * @link https://php.net/manual/en/imagick.thresholdimage.php * @param float $threshold * @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function thresholdImage($threshold, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Selects a threshold for each pixel based on a range of intensity * @link https://php.net/manual/en/imagick.adaptivethresholdimage.php * @param int $width

* Width of the local neighborhood. *

* @param int $height

* Height of the local neighborhood. *

* @param int $offset

* The mean offset *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function adaptiveThresholdImage($width, $height, $offset) {} /** * (PECL imagick 2.0.0)
* Forces all pixels below the threshold into black * @link https://php.net/manual/en/imagick.blackthresholdimage.php * @param mixed $threshold

* The threshold below which everything turns black *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function blackThresholdImage($threshold) {} /** * (PECL imagick 2.0.0)
* Force all pixels above the threshold into white * @link https://php.net/manual/en/imagick.whitethresholdimage.php * @param mixed $threshold * @return bool TRUE on success. * @throws ImagickException on error. */ public function whiteThresholdImage($threshold) {} /** * (PECL imagick 2.0.0)
* Append a set of images * @link https://php.net/manual/en/imagick.appendimages.php * @param bool $stack [optional]

* Whether to stack the images vertically. * By default (or if FALSE is specified) images are stacked left-to-right. * If stack is TRUE, images are stacked top-to-bottom. *

* @return Imagick Imagick instance on success. * @throws ImagickException on error. */ public function appendImages($stack = false) {} /** * (PECL imagick 2.0.0)
* Simulates a charcoal drawing * @link https://php.net/manual/en/imagick.charcoalimage.php * @param float $radius

* The radius of the Gaussian, in pixels, not counting the center pixel *

* @param float $sigma

* The standard deviation of the Gaussian, in pixels *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function charcoalImage($radius, $sigma) {} /** * (PECL imagick 2.0.0)
* Enhances the contrast of a color image * @link https://php.net/manual/en/imagick.normalizeimage.php * @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function normalizeImage($channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Simulates an oil painting * @link https://php.net/manual/en/imagick.oilpaintimage.php * @param float $radius

* The radius of the circular neighborhood. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function oilPaintImage($radius) {} /** * (PECL imagick 2.0.0)
* Reduces the image to a limited number of color level * @link https://php.net/manual/en/imagick.posterizeimage.php * @param int $levels * @param bool $dither * @return bool TRUE on success. * @throws ImagickException on error. */ public function posterizeImage($levels, $dither) {} /** * (PECL imagick 2.0.0)
* Radial blurs an image * @link https://php.net/manual/en/imagick.radialblurimage.php * @param float $angle * @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function radialBlurImage($angle, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Creates a simulated 3d button-like effect * @link https://php.net/manual/en/imagick.raiseimage.php * @param int $width * @param int $height * @param int $x * @param int $y * @param bool $raise * @return bool TRUE on success. * @throws ImagickException on error. */ public function raiseImage($width, $height, $x, $y, $raise) {} /** * (PECL imagick 2.0.0)
* Resample image to desired resolution * @link https://php.net/manual/en/imagick.resampleimage.php * @param float $x_resolution * @param float $y_resolution * @param int $filter * @param float $blur * @return bool TRUE on success. * @throws ImagickException on error. */ public function resampleImage($x_resolution, $y_resolution, $filter, $blur) {} /** * Scales an image to the desired dimensions with one of these filters:
* If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.
* If false, the calculations should produce the same results as ImageMagick CLI does.
*
* Note: The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched.
* In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given. * @link https://php.net/manual/en/imagick.resizeimage.php * @param int $columns Width of the image * @param int $rows Height of the image * @param int $filter Refer to the list of filter constants. * @param float $blur The blur factor where > 1 is blurry, < 1 is sharp. * @param bool $bestfit [optional] Added since 2.1.0. Added optional fit parameter. This method now supports proportional scaling. Pass zero as either parameter for proportional scaling * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE * @return bool TRUE on success * @throws ImagickException on error. * @since 2.0.0 */ public function resizeImage($columns, $rows, $filter, $blur, $bestfit = false, $legacy = false) {} /** * (PECL imagick 2.0.0)
* Offsets an image * @link https://php.net/manual/en/imagick.rollimage.php * @param int $x

* The X offset. *

* @param int $y

* The Y offset. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function rollImage($x, $y) {} /** * (PECL imagick 2.0.0)
* Rotates an image * @link https://php.net/manual/en/imagick.rotateimage.php * @param mixed $background

* The background color *

* @param float $degrees

* The number of degrees to rotate the image *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function rotateImage($background, $degrees) {} /** * (PECL imagick 2.0.0)
* Scales an image with pixel sampling * @link https://php.net/manual/en/imagick.sampleimage.php * @param int $columns * @param int $rows * @return bool TRUE on success. * @throws ImagickException on error. */ public function sampleImage($columns, $rows) {} /** * (PECL imagick 2.0.0)
* Applies a solarizing effect to the image * @link https://php.net/manual/en/imagick.solarizeimage.php * @param int $threshold * @return bool TRUE on success. * @throws ImagickException on error. */ public function solarizeImage($threshold) {} /** * (PECL imagick 2.0.0)
* Simulates an image shadow * @link https://php.net/manual/en/imagick.shadowimage.php * @param float $opacity * @param float $sigma * @param int $x * @param int $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function shadowImage($opacity, $sigma, $x, $y) {} /** * @param string $key * @param string $value * @return bool * @throws ImagickException on error. */ #[Deprecated] public function setImageAttribute($key, $value) {} /** * (PECL imagick 2.0.0)
* Sets the image background color * @link https://php.net/manual/en/imagick.setimagebackgroundcolor.php * @param mixed $background * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageBackgroundColor($background) {} /** * (PECL imagick 2.0.0)
* Sets the image composite operator * @link https://php.net/manual/en/imagick.setimagecompose.php * @param int $compose * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageCompose($compose) {} /** * (PECL imagick 2.0.0)
* Sets the image compression * @link https://php.net/manual/en/imagick.setimagecompression.php * @param int $compression

* One of the COMPRESSION constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageCompression($compression) {} /** * (PECL imagick 2.0.0)
* Sets the image delay * @link https://php.net/manual/en/imagick.setimagedelay.php * @param int $delay

* The amount of time expressed in 'ticks' that the image should be * displayed for. For animated GIFs there are 100 ticks per second, so a * value of 20 would be 20/100 of a second aka 1/5th of a second. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageDelay($delay) {} /** * (PECL imagick 2.0.0)
* Sets the image depth * @link https://php.net/manual/en/imagick.setimagedepth.php * @param int $depth * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageDepth($depth) {} /** * (PECL imagick 2.0.0)
* Sets the image gamma * @link https://php.net/manual/en/imagick.setimagegamma.php * @param float $gamma * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageGamma($gamma) {} /** * (PECL imagick 2.0.0)
* Sets the image iterations * @link https://php.net/manual/en/imagick.setimageiterations.php * @param int $iterations

* The number of iterations the image should loop over. Set to '0' to loop * continuously. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageIterations($iterations) {} /** * (PECL imagick 2.0.0)
* Sets the image matte color * @link https://php.net/manual/en/imagick.setimagemattecolor.php * @param mixed $matte * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageMatteColor($matte) {} /** * (PECL imagick 2.0.0)
* Sets the page geometry of the image * @link https://php.net/manual/en/imagick.setimagepage.php * @param int $width * @param int $height * @param int $x * @param int $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImagePage($width, $height, $x, $y) {} /** * @param $filename * @throws ImagickException on error. */ public function setImageProgressMonitor($filename) {} /** * (PECL imagick 2.0.0)
* Sets the image resolution * @link https://php.net/manual/en/imagick.setimageresolution.php * @param float $x_resolution * @param float $y_resolution * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageResolution($x_resolution, $y_resolution) {} /** * (PECL imagick 2.0.0)
* Sets the image scene * @link https://php.net/manual/en/imagick.setimagescene.php * @param int $scene * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageScene($scene) {} /** * (PECL imagick 2.0.0)
* Sets the image ticks-per-second * @link https://php.net/manual/en/imagick.setimagetickspersecond.php * @param int $ticks_per_second

* The duration for which an image should be displayed expressed in ticks * per second. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageTicksPerSecond($ticks_per_second) {} /** * (PECL imagick 2.0.0)
* Sets the image type * @link https://php.net/manual/en/imagick.setimagetype.php * @param int $image_type * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageType($image_type) {} /** * (PECL imagick 2.0.0)
* Sets the image units of resolution * @link https://php.net/manual/en/imagick.setimageunits.php * @param int $units * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageUnits($units) {} /** * (PECL imagick 2.0.0)
* Sharpens an image * @link https://php.net/manual/en/imagick.sharpenimage.php * @param float $radius * @param float $sigma * @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function sharpenImage($radius, $sigma, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Shaves pixels from the image edges * @link https://php.net/manual/en/imagick.shaveimage.php * @param int $columns * @param int $rows * @return bool TRUE on success. * @throws ImagickException on error. */ public function shaveImage($columns, $rows) {} /** * (PECL imagick 2.0.0)
* Creating a parallelogram * @link https://php.net/manual/en/imagick.shearimage.php * @param mixed $background

* The background color *

* @param float $x_shear

* The number of degrees to shear on the x axis *

* @param float $y_shear

* The number of degrees to shear on the y axis *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function shearImage($background, $x_shear, $y_shear) {} /** * (PECL imagick 2.0.0)
* Splices a solid color into the image * @link https://php.net/manual/en/imagick.spliceimage.php * @param int $width * @param int $height * @param int $x * @param int $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function spliceImage($width, $height, $x, $y) {} /** * (PECL imagick 2.0.0)
* Fetch basic attributes about the image * @link https://php.net/manual/en/imagick.pingimage.php * @param string $filename

* The filename to read the information from. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function pingImage($filename) {} /** * (PECL imagick 2.0.0)
* Reads image from open filehandle * @link https://php.net/manual/en/imagick.readimagefile.php * @param resource $filehandle * @param string $fileName [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function readImageFile($filehandle, $fileName = null) {} /** * (PECL imagick 2.0.0)
* Displays an image * @link https://php.net/manual/en/imagick.displayimage.php * @param string $servername

* The X server name *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function displayImage($servername) {} /** * (PECL imagick 2.0.0)
* Displays an image or image sequence * @link https://php.net/manual/en/imagick.displayimages.php * @param string $servername

* The X server name *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function displayImages($servername) {} /** * (PECL imagick 2.0.0)
* Randomly displaces each pixel in a block * @link https://php.net/manual/en/imagick.spreadimage.php * @param float $radius * @return bool TRUE on success. * @throws ImagickException on error. */ public function spreadImage($radius) {} /** * (PECL imagick 2.0.0)
* Swirls the pixels about the center of the image * @link https://php.net/manual/en/imagick.swirlimage.php * @param float $degrees * @return bool TRUE on success. * @throws ImagickException on error. */ public function swirlImage($degrees) {} /** * (PECL imagick 2.0.0)
* Strips an image of all profiles and comments * @link https://php.net/manual/en/imagick.stripimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function stripImage() {} /** * (PECL imagick 2.0.0)
* Returns formats supported by Imagick * @link https://php.net/manual/en/imagick.queryformats.php * @param string $pattern [optional] * @return array an array containing the formats supported by Imagick. */ public static function queryFormats($pattern = "*") {} /** * (PECL imagick 2.0.0)
* Returns the configured fonts * @link https://php.net/manual/en/imagick.queryfonts.php * @param string $pattern [optional]

* The query pattern *

* @return array an array containing the configured fonts. */ public static function queryFonts($pattern = "*") {} /** * (PECL imagick 2.0.0)
* Returns an array representing the font metrics * @link https://php.net/manual/en/imagick.queryfontmetrics.php * @param ImagickDraw $properties

* ImagickDraw object containing font properties *

* @param string $text

* The text *

* @param bool $multiline [optional]

* Multiline parameter. If left empty it is autodetected *

* @return array a multi-dimensional array representing the font metrics. * @throws ImagickException on error. */ public function queryFontMetrics(ImagickDraw $properties, $text, $multiline = null) {} /** * (PECL imagick 2.0.0)
* Hides a digital watermark within the image * @link https://php.net/manual/en/imagick.steganoimage.php * @param Imagick $watermark_wand * @param int $offset * @return Imagick TRUE on success. * @throws ImagickException on error. */ public function steganoImage(Imagick $watermark_wand, $offset) {} /** * (PECL imagick 2.0.0)
* Adds random noise to the image * @link https://php.net/manual/en/imagick.addnoiseimage.php * @param int $noise_type

* The type of the noise. Refer to this list of * noise constants. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function addNoiseImage($noise_type, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (PECL imagick 2.0.0)
* Simulates motion blur * @link https://php.net/manual/en/imagick.motionblurimage.php * @param float $radius

* The radius of the Gaussian, in pixels, not counting the center pixel. *

* @param float $sigma

* The standard deviation of the Gaussian, in pixels. *

* @param float $angle

* Apply the effect along this angle. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. * The channel argument affects only if Imagick is compiled against ImageMagick version * 6.4.4 or greater. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function motionBlurImage($radius, $sigma, $angle, $channel = Imagick::CHANNEL_DEFAULT) {} /** * (PECL imagick 2.0.0)
* Forms a mosaic from images * @link https://php.net/manual/en/imagick.mosaicimages.php * @return Imagick TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function mosaicImages() {} /** * (PECL imagick 2.0.0)
* Method morphs a set of images * @link https://php.net/manual/en/imagick.morphimages.php * @param int $number_frames

* The number of in-between images to generate. *

* @return Imagick This method returns a new Imagick object on success. * Throw an ImagickException on error. * @throws ImagickException on error * @throws ImagickException on error. */ public function morphImages($number_frames) {} /** * (PECL imagick 2.0.0)
* Scales an image proportionally to half its size * @link https://php.net/manual/en/imagick.minifyimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function minifyImage() {} /** * (PECL imagick 2.0.0)
* Transforms an image * @link https://php.net/manual/en/imagick.affinetransformimage.php * @param ImagickDraw $matrix

* The affine matrix *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function affineTransformImage(ImagickDraw $matrix) {} /** * (PECL imagick 2.0.0)
* Average a set of images * @link https://php.net/manual/en/imagick.averageimages.php * @return Imagick a new Imagick object on success. * @throws ImagickException on error. */ #[Deprecated] public function averageImages() {} /** * (PECL imagick 2.0.0)
* Surrounds the image with a border * @link https://php.net/manual/en/imagick.borderimage.php * @param mixed $bordercolor

* ImagickPixel object or a string containing the border color *

* @param int $width

* Border width *

* @param int $height

* Border height *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function borderImage($bordercolor, $width, $height) {} /** * (PECL imagick 2.0.0)
* Removes a region of an image and trims * @link https://php.net/manual/en/imagick.chopimage.php * @param int $width

* Width of the chopped area *

* @param int $height

* Height of the chopped area *

* @param int $x

* X origo of the chopped area *

* @param int $y

* Y origo of the chopped area *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function chopImage($width, $height, $x, $y) {} /** * (PECL imagick 2.0.0)
* Clips along the first path from the 8BIM profile * @link https://php.net/manual/en/imagick.clipimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function clipImage() {} /** * (PECL imagick 2.0.0)
* Clips along the named paths from the 8BIM profile * @link https://php.net/manual/en/imagick.clippathimage.php * @param string $pathname

* The name of the path *

* @param bool $inside

* If TRUE later operations take effect inside clipping path. * Otherwise later operations take effect outside clipping path. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function clipPathImage($pathname, $inside) {} /** * Alias to {@see Imagick::clipPathImage} * @param string $pathname * @param string $inside * @throws ImagickException on error. */ public function clipImagePath($pathname, $inside) {} /** * (PECL imagick 2.0.0)
* Composites a set of images * @link https://php.net/manual/en/imagick.coalesceimages.php * @return Imagick a new Imagick object on success. * @throws ImagickException on error. */ public function coalesceImages() {} /** * (PECL imagick 2.0.0)
* Changes the color value of any pixel that matches target * @link https://php.net/manual/en/imagick.colorfloodfillimage.php * @param mixed $fill

* ImagickPixel object containing the fill color *

* @param float $fuzz

* The amount of fuzz. For example, set fuzz to 10 and the color red at * intensities of 100 and 102 respectively are now interpreted as the * same color for the purposes of the floodfill. *

* @param mixed $bordercolor

* ImagickPixel object containing the border color *

* @param int $x

* X start position of the floodfill *

* @param int $y

* Y start position of the floodfill *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function colorFloodfillImage($fill, $fuzz, $bordercolor, $x, $y) {} /** * Blends the fill color with each pixel in the image. The 'opacity' color is a per channel strength factor for how strongly the color should be applied.
* If legacy is true, the behaviour of this function is incorrect, but consistent with how it behaved before Imagick version 3.4.0 * @link https://php.net/manual/en/imagick.colorizeimage.php * @param mixed $colorize

* ImagickPixel object or a string containing the colorize color *

* @param mixed $opacity

* ImagickPixel object or an float containing the opacity value. * 1.0 is fully opaque and 0.0 is fully transparent. *

* @param bool $legacy [optional] Added since 3.4.0. Default value FALSE * @return bool TRUE on success. * @throws ImagickException Throws ImagickException on error * @since 2.0.0 */ public function colorizeImage($colorize, $opacity, $legacy = false) {} /** * (PECL imagick 2.0.0)
* Returns the difference in one or more images * @link https://php.net/manual/en/imagick.compareimagechannels.php * @param Imagick $image

* Imagick object containing the image to compare. *

* @param int $channelType

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @param int $metricType

* One of the metric type constants. *

* @return array Array consisting of new_wand and * distortion. * @throws ImagickException on error. */ public function compareImageChannels(Imagick $image, $channelType, $metricType) {} /** * (PECL imagick 2.0.0)
* Compares an image to a reconstructed image * @link https://php.net/manual/en/imagick.compareimages.php * @param Imagick $compare

* An image to compare to. *

* @param int $metric

* Provide a valid metric type constant. Refer to this * list of metric constants. *

* @return array Array consisting of an Imagick object of the * reconstructed image and a float representing the difference. * @throws ImagickException Throws ImagickException on error. */ public function compareImages(Imagick $compare, $metric) {} /** * (PECL imagick 2.0.0)
* Change the contrast of the image * @link https://php.net/manual/en/imagick.contrastimage.php * @param bool $sharpen

* The sharpen value *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function contrastImage($sharpen) {} /** * (PECL imagick 2.0.0)
* Combines one or more images into a single image * @link https://php.net/manual/en/imagick.combineimages.php * @param int $channelType

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return Imagick TRUE on success. * @throws ImagickException on error. */ public function combineImages($channelType) {} /** * (PECL imagick 2.0.0)
* Applies a custom convolution kernel to the image * @link https://php.net/manual/en/imagick.convolveimage.php * @param array $kernel

* The convolution kernel *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function convolveImage(array $kernel, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Displaces an image's colormap * @link https://php.net/manual/en/imagick.cyclecolormapimage.php * @param int $displace

* The amount to displace the colormap. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function cycleColormapImage($displace) {} /** * (PECL imagick 2.0.0)
* Returns certain pixel differences between images * @link https://php.net/manual/en/imagick.deconstructimages.php * @return Imagick a new Imagick object on success. * @throws ImagickException on error. */ public function deconstructImages() {} /** * (PECL imagick 2.0.0)
* Reduces the speckle noise in an image * @link https://php.net/manual/en/imagick.despeckleimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function despeckleImage() {} /** * (PECL imagick 2.0.0)
* Enhance edges within the image * @link https://php.net/manual/en/imagick.edgeimage.php * @param float $radius

* The radius of the operation. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function edgeImage($radius) {} /** * (PECL imagick 2.0.0)
* Returns a grayscale image with a three-dimensional effect * @link https://php.net/manual/en/imagick.embossimage.php * @param float $radius

* The radius of the effect *

* @param float $sigma

* The sigma of the effect *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function embossImage($radius, $sigma) {} /** * (PECL imagick 2.0.0)
* Improves the quality of a noisy image * @link https://php.net/manual/en/imagick.enhanceimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function enhanceImage() {} /** * (PECL imagick 2.0.0)
* Equalizes the image histogram * @link https://php.net/manual/en/imagick.equalizeimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function equalizeImage() {} /** * (PECL imagick 2.0.0)
* Applies an expression to an image * @link https://php.net/manual/en/imagick.evaluateimage.php * @param int $op

* The evaluation operator *

* @param float $constant

* The value of the operator *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function evaluateImage($op, $constant, $channel = Imagick::CHANNEL_ALL) {} /** * Merges a sequence of images. This is useful for combining Photoshop layers into a single image. * This is replaced by: *
     * $im = $im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN)
     * 
* @link https://php.net/manual/en/imagick.flattenimages.php * @return Imagick Returns an Imagick object containing the merged image. * @throws ImagickException Throws ImagickException on error. * @since 2.0.0 */ #[Deprecated] public function flattenImages() {} /** * (PECL imagick 2.0.0)
* Creates a vertical mirror image * @link https://php.net/manual/en/imagick.flipimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function flipImage() {} /** * (PECL imagick 2.0.0)
* Creates a horizontal mirror image * @link https://php.net/manual/en/imagick.flopimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function flopImage() {} /** * (PECL imagick 2.0.0)
* Adds a simulated three-dimensional border * @link https://php.net/manual/en/imagick.frameimage.php * @param mixed $matte_color

* ImagickPixel object or a string representing the matte color *

* @param int $width

* The width of the border *

* @param int $height

* The height of the border *

* @param int $inner_bevel

* The inner bevel width *

* @param int $outer_bevel

* The outer bevel width *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function frameImage($matte_color, $width, $height, $inner_bevel, $outer_bevel) {} /** * (PECL imagick 2.0.0)
* Evaluate expression for each pixel in the image * @link https://php.net/manual/en/imagick.fximage.php * @param string $expression

* The expression. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return Imagick TRUE on success. * @throws ImagickException on error. */ public function fxImage($expression, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Gamma-corrects an image * @link https://php.net/manual/en/imagick.gammaimage.php * @param float $gamma

* The amount of gamma-correction. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function gammaImage($gamma, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Blurs an image * @link https://php.net/manual/en/imagick.gaussianblurimage.php * @param float $radius

* The radius of the Gaussian, in pixels, not counting the center pixel. *

* @param float $sigma

* The standard deviation of the Gaussian, in pixels. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function gaussianBlurImage($radius, $sigma, $channel = Imagick::CHANNEL_ALL) {} /** * @link https://www.php.net/manual/en/imagick.getimageattribute.php * @param string $key

The key of the attribute to get.

* @return string */ #[Deprecated] #[Pure] public function getImageAttribute($key) {} /** * (PECL imagick 2.0.0)
* Returns the image background color * @link https://php.net/manual/en/imagick.getimagebackgroundcolor.php * @return ImagickPixel an ImagickPixel set to the background color of the image. * @throws ImagickException on error. */ #[Pure] public function getImageBackgroundColor() {} /** * (PECL imagick 2.0.0)
* Returns the chromaticy blue primary point * @link https://php.net/manual/en/imagick.getimageblueprimary.php * @return float[] Array consisting of "x" and "y" coordinates of point. * @throws ImagickException on error. */ #[ArrayShape(["x" => "float", "y" => "float"])] #[Pure] public function getImageBluePrimary() {} /** * (PECL imagick 2.0.0)
* Returns the image border color * @link https://php.net/manual/en/imagick.getimagebordercolor.php * @return ImagickPixel TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageBorderColor() {} /** * (PECL imagick 2.0.0)
* Gets the depth for a particular image channel * @link https://php.net/manual/en/imagick.getimagechanneldepth.php * @param int $channel

* Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants *

* @return int TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageChannelDepth($channel) {} /** * (PECL imagick 2.0.0)
* Compares image channels of an image to a reconstructed image * @link https://php.net/manual/en/imagick.getimagechanneldistortion.php * @param Imagick $reference

* Imagick object to compare to. *

* @param int $channel

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @param int $metric

* One of the metric type constants. *

* @return float TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageChannelDistortion(Imagick $reference, $channel, $metric) {} /** * (PECL imagick 2.0.0)
* Gets the extrema for one or more image channels * @link https://php.net/manual/en/imagick.getimagechannelextrema.php * @param int $channel

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return int[] * @throws ImagickException on error. */ #[ArrayShape(["minima" => "int", "maxima" => "int"])] #[Deprecated] #[Pure] public function getImageChannelExtrema($channel) {} /** * (PECL imagick 2.0.0)
* Gets the mean and standard deviation * @link https://php.net/manual/en/imagick.getimagechannelmean.php * @param int $channel

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return float[] * @throws ImagickException on error. */ #[ArrayShape(["mean" => "float", "standardDeviation" => "float"])] #[Pure] public function getImageChannelMean($channel) {} /** * (PECL imagick 2.0.0)
* Returns statistics for each channel in the image * @link https://php.net/manual/en/imagick.getimagechannelstatistics.php * @return array * @throws ImagickException on error. */ #[Pure] public function getImageChannelStatistics() {} /** * (PECL imagick 2.0.0)
* Returns the color of the specified colormap index * @link https://php.net/manual/en/imagick.getimagecolormapcolor.php * @param int $index

* The offset into the image colormap. *

* @return ImagickPixel TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageColormapColor($index) {} /** * (PECL imagick 2.0.0)
* Gets the image colorspace * @link https://php.net/manual/en/imagick.getimagecolorspace.php * @return int TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageColorspace() {} /** * (PECL imagick 2.0.0)
* Returns the composite operator associated with the image * @link https://php.net/manual/en/imagick.getimagecompose.php * @return int TRUE on success. * @throws ImagickException on error. */ #[Pure] public function getImageCompose() {} /** * (PECL imagick 2.0.0)
* Gets the image delay * @link https://php.net/manual/en/imagick.getimagedelay.php * @return int the image delay. * @throws ImagickException on error. */ #[Pure] public function getImageDelay() {} /** * (PECL imagick 0.9.1-0.9.9)
* Gets the image depth * @link https://php.net/manual/en/imagick.getimagedepth.php * @return int The image depth. * @throws ImagickException on error. */ #[Pure] public function getImageDepth() {} /** * (PECL imagick 2.0.0)
* Compares an image to a reconstructed image * @link https://php.net/manual/en/imagick.getimagedistortion.php * @param Imagick $reference

* Imagick object to compare to. *

* @param int $metric

* One of the metric type constants. *

* @return float the distortion metric used on the image (or the best guess * thereof). * @throws ImagickException on error. */ #[Pure] public function getImageDistortion(Imagick $reference, $metric) {} /** * (PECL imagick 2.0.0)
* Gets the extrema for the image * @link https://php.net/manual/en/imagick.getimageextrema.php * @return int[] an associative array with the keys "min" and "max". * @throws ImagickException on error. */ #[ArrayShape(["min" => "int", "max" => "int"])] #[Deprecated] #[Pure] public function getImageExtrema() {} /** * (PECL imagick 2.0.0)
* Gets the image disposal method * @link https://php.net/manual/en/imagick.getimagedispose.php * @return int the dispose method on success. * @throws ImagickException on error. */ #[Pure] public function getImageDispose() {} /** * (PECL imagick 2.0.0)
* Gets the image gamma * @link https://php.net/manual/en/imagick.getimagegamma.php * @return float the image gamma on success. * @throws ImagickException on error. */ #[Pure] public function getImageGamma() {} /** * (PECL imagick 2.0.0)
* Returns the chromaticy green primary point * @link https://php.net/manual/en/imagick.getimagegreenprimary.php * @return float[] an array with the keys "x" and "y" on success, throws an ImagickException on failure. * @throws ImagickException on failure * @throws ImagickException on error. */ #[ArrayShape(["x" => "float", "y" => "float"])] #[Pure] public function getImageGreenPrimary() {} /** * (PECL imagick 2.0.0)
* Returns the image height * @link https://php.net/manual/en/imagick.getimageheight.php * @return int the image height in pixels. * @throws ImagickException on error. */ #[Pure] public function getImageHeight() {} /** * (PECL imagick 2.0.0)
* Gets the image histogram * @link https://php.net/manual/en/imagick.getimagehistogram.php * @return array the image histogram as an array of ImagickPixel objects. * @throws ImagickException on error. */ #[Pure] public function getImageHistogram() {} /** * (PECL imagick 2.0.0)
* Gets the image interlace scheme * @link https://php.net/manual/en/imagick.getimageinterlacescheme.php * @return int the interlace scheme as an integer on success. * Trhow an ImagickException on error. * @throws ImagickException on error */ #[Deprecated] #[Pure] public function getImageInterlaceScheme() {} /** * (PECL imagick 2.0.0)
* Gets the image iterations * @link https://php.net/manual/en/imagick.getimageiterations.php * @return int the image iterations as an integer. * @throws ImagickException on error. */ #[Pure] public function getImageIterations() {} /** * (PECL imagick 2.0.0)
* Returns the image matte color * @link https://php.net/manual/en/imagick.getimagemattecolor.php * @return ImagickPixel ImagickPixel object on success. * @throws ImagickException on error. */ #[Pure] public function getImageMatteColor() {} /** * (PECL imagick 2.0.0)
* Returns the page geometry * @link https://php.net/manual/en/imagick.getimagepage.php * @return int[] the page geometry associated with the image in an array with the * keys "width", "height", "x", and "y". * @throws ImagickException on error. */ #[ArrayShape(["width" => "int", "height" => "int", "x" => "int", "y" => "int"])] #[Pure] public function getImagePage() {} /** * (PECL imagick 2.0.0)
* Returns the color of the specified pixel * @link https://php.net/manual/en/imagick.getimagepixelcolor.php * @param int $x

* The x-coordinate of the pixel *

* @param int $y

* The y-coordinate of the pixel *

* @return ImagickPixel an ImagickPixel instance for the color at the coordinates given. * @throws ImagickException on error. */ #[Pure] public function getImagePixelColor($x, $y) {} /** * (PECL imagick 2.0.0)
* Returns the named image profile * @link https://php.net/manual/en/imagick.getimageprofile.php * @param string $name

* The name of the profile to return. *

* @return string a string containing the image profile. * @throws ImagickException on error. */ #[Pure] public function getImageProfile($name) {} /** * (PECL imagick 2.0.0)
* Returns the chromaticity red primary point * @link https://php.net/manual/en/imagick.getimageredprimary.php * @return float[] the chromaticity red primary point as an array with the keys "x" * and "y". * Throw an ImagickException on error. * @throws ImagickException on error */ #[ArrayShape(["x" => "float", "y" => "float"])] #[Pure] public function getImageRedPrimary() {} /** * (PECL imagick 2.0.0)
* Gets the image rendering intent * @link https://php.net/manual/en/imagick.getimagerenderingintent.php * @return int the image rendering intent. * @throws ImagickException on error. */ #[Pure] public function getImageRenderingIntent() {} /** * (PECL imagick 2.0.0)
* Gets the image X and Y resolution * @link https://php.net/manual/en/imagick.getimageresolution.php * @return float[] the resolution as an array. * @throws ImagickException on error. */ #[ArrayShape(["x" => "float", "y" => "float"])] #[Pure] public function getImageResolution() {} /** * (PECL imagick 2.0.0)
* Gets the image scene * @link https://php.net/manual/en/imagick.getimagescene.php * @return int the image scene. * @throws ImagickException on error. */ #[Pure] public function getImageScene() {} /** * (PECL imagick 2.0.0)
* Generates an SHA-256 message digest * @link https://php.net/manual/en/imagick.getimagesignature.php * @return string a string containing the SHA-256 hash of the file. * @throws ImagickException on error. */ #[Pure] public function getImageSignature() {} /** * (PECL imagick 2.0.0)
* Gets the image ticks-per-second * @link https://php.net/manual/en/imagick.getimagetickspersecond.php * @return int the image ticks-per-second. * @throws ImagickException on error. */ #[Pure] public function getImageTicksPerSecond() {} /** * (PECL imagick 0.9.10-0.9.9)
* Gets the potential image type * @link https://php.net/manual/en/imagick.getimagetype.php * @return int the potential image type. * imagick::IMGTYPE_UNDEFINED * imagick::IMGTYPE_BILEVEL * imagick::IMGTYPE_GRAYSCALE * imagick::IMGTYPE_GRAYSCALEMATTE * imagick::IMGTYPE_PALETTE * imagick::IMGTYPE_PALETTEMATTE * imagick::IMGTYPE_TRUECOLOR * imagick::IMGTYPE_TRUECOLORMATTE * imagick::IMGTYPE_COLORSEPARATION * imagick::IMGTYPE_COLORSEPARATIONMATTE * imagick::IMGTYPE_OPTIMIZE * @throws ImagickException on error. */ #[Pure] public function getImageType() {} /** * (PECL imagick 2.0.0)
* Gets the image units of resolution * @link https://php.net/manual/en/imagick.getimageunits.php * @return int the image units of resolution. * @throws ImagickException on error. */ #[Pure] public function getImageUnits() {} /** * (PECL imagick 2.0.0)
* Returns the virtual pixel method * @link https://php.net/manual/en/imagick.getimagevirtualpixelmethod.php * @return int the virtual pixel method on success. * @throws ImagickException on error. */ #[Pure] public function getImageVirtualPixelMethod() {} /** * (PECL imagick 2.0.0)
* Returns the chromaticity white point * @link https://php.net/manual/en/imagick.getimagewhitepoint.php * @return float[] the chromaticity white point as an associative array with the keys * "x" and "y". * @throws ImagickException on error. */ #[ArrayShape(["x" => "float", "y" => "float"])] #[Pure] public function getImageWhitePoint() {} /** * (PECL imagick 2.0.0)
* Returns the image width * @link https://php.net/manual/en/imagick.getimagewidth.php * @return int the image width. * @throws ImagickException on error. */ #[Pure] public function getImageWidth() {} /** * (PECL imagick 2.0.0)
* Returns the number of images in the object * @link https://php.net/manual/en/imagick.getnumberimages.php * @return int the number of images associated with Imagick object. */ #[Pure] public function getNumberImages() {} /** * (PECL imagick 2.0.0)
* Gets the image total ink density * @link https://php.net/manual/en/imagick.getimagetotalinkdensity.php * @return float the image total ink density of the image. * Throw an ImagickException on error. * @throws ImagickException on error * @throws ImagickException on error. */ #[Pure] public function getImageTotalInkDensity() {} /** * (PECL imagick 2.0.0)
* Extracts a region of the image * @link https://php.net/manual/en/imagick.getimageregion.php * @param int $width

* The width of the extracted region. *

* @param int $height

* The height of the extracted region. *

* @param int $x

* X-coordinate of the top-left corner of the extracted region. *

* @param int $y

* Y-coordinate of the top-left corner of the extracted region. *

* @return Imagick Extracts a region of the image and returns it as a new wand. * @throws ImagickException on error. */ #[Pure] public function getImageRegion($width, $height, $x, $y) {} /** * (PECL imagick 2.0.0)
* Creates a new image as a copy * @link https://php.net/manual/en/imagick.implodeimage.php * @param float $radius

* The radius of the implode *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function implodeImage($radius) {} /** * (PECL imagick 2.0.0)
* Adjusts the levels of an image * @link https://php.net/manual/en/imagick.levelimage.php * @param float $blackPoint

* The image black point *

* @param float $gamma

* The gamma value *

* @param float $whitePoint

* The image white point *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function levelImage($blackPoint, $gamma, $whitePoint, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Scales an image proportionally 2x * @link https://php.net/manual/en/imagick.magnifyimage.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function magnifyImage() {} /** * (PECL imagick 2.0.0)
* Replaces the colors of an image with the closest color from a reference image. * @link https://php.net/manual/en/imagick.mapimage.php * @param Imagick $map * @param bool $dither * @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function mapImage(Imagick $map, $dither) {} /** * (PECL imagick 2.0.0)
* Changes the transparency value of a color * @link https://php.net/manual/en/imagick.mattefloodfillimage.php * @param float $alpha

* The level of transparency: 1.0 is fully opaque and 0.0 is fully * transparent. *

* @param float $fuzz

* The fuzz member of image defines how much tolerance is acceptable to * consider two colors as the same. *

* @param mixed $bordercolor

* An ImagickPixel object or string representing the border color. *

* @param int $x

* The starting x coordinate of the operation. *

* @param int $y

* The starting y coordinate of the operation. *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function matteFloodfillImage($alpha, $fuzz, $bordercolor, $x, $y) {} /** * (PECL imagick 2.0.0)
* Applies a digital filter * @link https://php.net/manual/en/imagick.medianfilterimage.php * @param float $radius

* The radius of the pixel neighborhood. *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function medianFilterImage($radius) {} /** * (PECL imagick 2.0.0)
* Negates the colors in the reference image * @link https://php.net/manual/en/imagick.negateimage.php * @param bool $gray

* Whether to only negate grayscale pixels within the image. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function negateImage($gray, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Change any pixel that matches color * @link https://php.net/manual/en/imagick.paintopaqueimage.php * @param mixed $target

* Change this target color to the fill color within the image. An * ImagickPixel object or a string representing the target color. *

* @param mixed $fill

* An ImagickPixel object or a string representing the fill color. *

* @param float $fuzz

* The fuzz member of image defines how much tolerance is acceptable to * consider two colors as the same. *

* @param int $channel [optional]

* Provide any channel constant that is valid for your channel mode. To * apply to more than one channel, combine channeltype constants using * bitwise operators. Refer to this * list of channel constants. *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function paintOpaqueImage($target, $fill, $fuzz, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Changes any pixel that matches color with the color defined by fill * @link https://php.net/manual/en/imagick.painttransparentimage.php * @param mixed $target

* Change this target color to specified opacity value within the image. *

* @param float $alpha

* The level of transparency: 1.0 is fully opaque and 0.0 is fully * transparent. *

* @param float $fuzz

* The fuzz member of image defines how much tolerance is acceptable to * consider two colors as the same. *

* @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function paintTransparentImage($target, $alpha, $fuzz) {} /** * (PECL imagick 2.0.0)
* Quickly pin-point appropriate parameters for image processing * @link https://php.net/manual/en/imagick.previewimages.php * @param int $preview

* Preview type. See Preview type constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function previewImages($preview) {} /** * (PECL imagick 2.0.0)
* Adds or removes a profile from an image * @link https://php.net/manual/en/imagick.profileimage.php * @param string $name * @param string $profile * @return bool TRUE on success. * @throws ImagickException on error. */ public function profileImage($name, $profile) {} /** * (PECL imagick 2.0.0)
* Analyzes the colors within a reference image * @link https://php.net/manual/en/imagick.quantizeimage.php * @param int $numberColors * @param int $colorspace * @param int $treedepth * @param bool $dither * @param bool $measureError * @return bool TRUE on success. * @throws ImagickException on error. */ public function quantizeImage($numberColors, $colorspace, $treedepth, $dither, $measureError) {} /** * (PECL imagick 2.0.0)
* Analyzes the colors within a sequence of images * @link https://php.net/manual/en/imagick.quantizeimages.php * @param int $numberColors * @param int $colorspace * @param int $treedepth * @param bool $dither * @param bool $measureError * @return bool TRUE on success. * @throws ImagickException on error. */ public function quantizeImages($numberColors, $colorspace, $treedepth, $dither, $measureError) {} /** * (PECL imagick 2.0.0)
* Smooths the contours of an image * @link https://php.net/manual/en/imagick.reducenoiseimage.php * @param float $radius * @return bool TRUE on success. * @throws ImagickException on error. */ #[Deprecated] public function reduceNoiseImage($radius) {} /** * (PECL imagick 2.0.0)
* Removes the named image profile and returns it * @link https://php.net/manual/en/imagick.removeimageprofile.php * @param string $name * @return string a string containing the profile of the image. * @throws ImagickException on error. */ public function removeImageProfile($name) {} /** * (PECL imagick 2.0.0)
* Separates a channel from the image * @link https://php.net/manual/en/imagick.separateimagechannel.php * @param int $channel * @return bool TRUE on success. * @throws ImagickException on error. */ public function separateImageChannel($channel) {} /** * (PECL imagick 2.0.0)
* Sepia tones an image * @link https://php.net/manual/en/imagick.sepiatoneimage.php * @param float $threshold * @return bool TRUE on success. * @throws ImagickException on error. */ public function sepiaToneImage($threshold) {} /** * (PECL imagick 2.0.0)
* Sets the image bias for any method that convolves an image * @link https://php.net/manual/en/imagick.setimagebias.php * @param float $bias * @return bool TRUE on success. */ public function setImageBias($bias) {} /** * (PECL imagick 2.0.0)
* Sets the image chromaticity blue primary point * @link https://php.net/manual/en/imagick.setimageblueprimary.php * @param float $x * @param float $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageBluePrimary($x, $y) {} /** * (PECL imagick 2.0.0)
* Sets the image border color * @link https://php.net/manual/en/imagick.setimagebordercolor.php * @param mixed $border

* The border color *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageBorderColor($border) {} /** * (PECL imagick 2.0.0)
* Sets the depth of a particular image channel * @link https://php.net/manual/en/imagick.setimagechanneldepth.php * @param int $channel * @param int $depth * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageChannelDepth($channel, $depth) {} /** * (PECL imagick 2.0.0)
* Sets the color of the specified colormap index * @link https://php.net/manual/en/imagick.setimagecolormapcolor.php * @param int $index * @param ImagickPixel $color * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageColormapColor($index, ImagickPixel $color) {} /** * (PECL imagick 2.0.0)
* Sets the image colorspace * @link https://php.net/manual/en/imagick.setimagecolorspace.php * @param int $colorspace

* One of the COLORSPACE constants *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageColorspace($colorspace) {} /** * (PECL imagick 2.0.0)
* Sets the image disposal method * @link https://php.net/manual/en/imagick.setimagedispose.php * @param int $dispose * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageDispose($dispose) {} /** * (PECL imagick 2.0.0)
* Sets the image size * @link https://php.net/manual/en/imagick.setimageextent.php * @param int $columns * @param int $rows * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageExtent($columns, $rows) {} /** * (PECL imagick 2.0.0)
* Sets the image chromaticity green primary point * @link https://php.net/manual/en/imagick.setimagegreenprimary.php * @param float $x * @param float $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageGreenPrimary($x, $y) {} /** * (PECL imagick 2.0.0)
* Sets the image compression * @link https://php.net/manual/en/imagick.setimageinterlacescheme.php * @param int $interlace_scheme * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageInterlaceScheme($interlace_scheme) {} /** * (PECL imagick 2.0.0)
* Adds a named profile to the Imagick object * @link https://php.net/manual/en/imagick.setimageprofile.php * @param string $name * @param string $profile * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageProfile($name, $profile) {} /** * (PECL imagick 2.0.0)
* Sets the image chromaticity red primary point * @link https://php.net/manual/en/imagick.setimageredprimary.php * @param float $x * @param float $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageRedPrimary($x, $y) {} /** * (PECL imagick 2.0.0)
* Sets the image rendering intent * @link https://php.net/manual/en/imagick.setimagerenderingintent.php * @param int $rendering_intent * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageRenderingIntent($rendering_intent) {} /** * (PECL imagick 2.0.0)
* Sets the image virtual pixel method * @link https://php.net/manual/en/imagick.setimagevirtualpixelmethod.php * @param int $method * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageVirtualPixelMethod($method) {} /** * (PECL imagick 2.0.0)
* Sets the image chromaticity white point * @link https://php.net/manual/en/imagick.setimagewhitepoint.php * @param float $x * @param float $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function setImageWhitePoint($x, $y) {} /** * (PECL imagick 2.0.0)
* Adjusts the contrast of an image * @link https://php.net/manual/en/imagick.sigmoidalcontrastimage.php * @param bool $sharpen * @param float $alpha * @param float $beta * @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function sigmoidalContrastImage($sharpen, $alpha, $beta, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Composites two images * @link https://php.net/manual/en/imagick.stereoimage.php * @param Imagick $offset_wand * @return bool TRUE on success. * @throws ImagickException on error. */ public function stereoImage(Imagick $offset_wand) {} /** * (PECL imagick 2.0.0)
* Repeatedly tiles the texture image * @link https://php.net/manual/en/imagick.textureimage.php * @param Imagick $texture_wand * @return Imagick a new Imagick object that has the repeated texture applied. * @throws ImagickException on error. */ public function textureImage(Imagick $texture_wand) {} /** * pplies a color vector to each pixel in the image. The 'opacity' color is a per channel strength factor for how strongly the color should be applied. * If legacy is true, the behaviour of this function is incorrect, but consistent with how it behaved before Imagick version 3.4.0 * @link https://php.net/manual/en/imagick.tintimage.php * @param mixed $tint * @param mixed $opacity * @param bool $legacy [optional] * @return bool TRUE on success. * @throws ImagickException Throws ImagickException on error * @since 2.0.0 */ public function tintImage($tint, $opacity, $legacy = false) {} /** * (PECL imagick 2.0.0)
* Sharpens an image * @link https://php.net/manual/en/imagick.unsharpmaskimage.php * @param float $radius * @param float $sigma * @param float $amount * @param float $threshold * @param int $channel [optional] * @return bool TRUE on success. * @throws ImagickException on error. */ public function unsharpMaskImage($radius, $sigma, $amount, $threshold, $channel = Imagick::CHANNEL_ALL) {} /** * (PECL imagick 2.0.0)
* Returns a new Imagick object * @link https://php.net/manual/en/imagick.getimage.php * @return Imagick a new Imagick object with the current image sequence. * @throws ImagickException on error. */ #[Pure] public function getImage() {} /** * (PECL imagick 2.0.0)
* Adds new image to Imagick object image list * @link https://php.net/manual/en/imagick.addimage.php * @param Imagick $source

* The source Imagick object *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function addImage(Imagick $source) {} /** * (PECL imagick 2.0.0)
* Replaces image in the object * @link https://php.net/manual/en/imagick.setimage.php * @param Imagick $replace

* The replace Imagick object *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setImage(Imagick $replace) {} /** * (PECL imagick 2.0.0)
* Creates a new image * @link https://php.net/manual/en/imagick.newimage.php * @param int $cols

* Columns in the new image *

* @param int $rows

* Rows in the new image *

* @param mixed $background

* The background color used for this image *

* @param string $format [optional]

* Image format. This parameter was added in Imagick version 2.0.1. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function newImage($cols, $rows, $background, $format = null) {} /** * (PECL imagick 2.0.0)
* Creates a new image * @link https://php.net/manual/en/imagick.newpseudoimage.php * @param int $columns

* columns in the new image *

* @param int $rows

* rows in the new image *

* @param string $pseudoString

* string containing pseudo image definition. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function newPseudoImage($columns, $rows, $pseudoString) {} /** * (PECL imagick 2.0.0)
* Gets the object compression type * @link https://php.net/manual/en/imagick.getcompression.php * @return int the compression constant */ #[Pure] public function getCompression() {} /** * (PECL imagick 2.0.0)
* Gets the object compression quality * @link https://php.net/manual/en/imagick.getcompressionquality.php * @return int integer describing the compression quality */ #[Pure] public function getCompressionQuality() {} /** * (PECL imagick 2.0.0)
* Returns the ImageMagick API copyright as a string * @link https://php.net/manual/en/imagick.getcopyright.php * @return string a string containing the copyright notice of Imagemagick and * Magickwand C API. */ public static function getCopyright() {} /** * (PECL imagick 2.0.0)
* The filename associated with an image sequence * @link https://php.net/manual/en/imagick.getfilename.php * @return string a string on success. */ #[Pure] public function getFilename() {} /** * (PECL imagick 2.0.0)
* Returns the format of the Imagick object * @link https://php.net/manual/en/imagick.getformat.php * @return string the format of the image. */ #[Pure] public function getFormat() {} /** * (PECL imagick 2.0.0)
* Returns the ImageMagick home URL * @link https://php.net/manual/en/imagick.gethomeurl.php * @return string a link to the imagemagick homepage. */ public static function getHomeURL() {} /** * (PECL imagick 2.0.0)
* Gets the object interlace scheme * @link https://php.net/manual/en/imagick.getinterlacescheme.php * @return int Gets the wand interlace * scheme. */ #[Pure] public function getInterlaceScheme() {} /** * (PECL imagick 2.0.0)
* Returns a value associated with the specified key * @link https://php.net/manual/en/imagick.getoption.php * @param string $key

* The name of the option *

* @return string a value associated with a wand and the specified key. */ #[Pure] public function getOption($key) {} /** * (PECL imagick 2.0.0)
* Returns the ImageMagick package name * @link https://php.net/manual/en/imagick.getpackagename.php * @return string the ImageMagick package name as a string. */ public static function getPackageName() {} /** * (PECL imagick 2.0.0)
* Returns the page geometry * @link https://php.net/manual/en/imagick.getpage.php * @return int[] the page geometry associated with the Imagick object in * an associative array with the keys "width", "height", "x", and "y", * throwing ImagickException on error. * @throws ImagickException on error */ //width:int, height:int, x:int, y:int #[ArrayShape(["width" => "int", "height" => "int", "x" => "int", "y" => "int"])] #[Pure] public function getPage() {} /** * (PECL imagick 2.0.0)
* Gets the quantum depth * @link https://php.net/manual/en/imagick.getquantumdepth.php * @return array the Imagick quantum depth as a string. */ // quantumDepthLong:int, quantumDepthString:string #[ArrayShape(["quantumDepthLong" => "int", "quantumDepthString" => "string"])] public static function getQuantumDepth() {} /** * (PECL imagick 2.0.0)
* Returns the Imagick quantum range * @link https://php.net/manual/en/imagick.getquantumrange.php * @return array the Imagick quantum range as a string. */ #[ArrayShape(["quantumRangeLong" => "int", "quantumRangeString" => "string"])] public static function getQuantumRange() {} /** * (PECL imagick 2.0.0)
* Returns the ImageMagick release date * @link https://php.net/manual/en/imagick.getreleasedate.php * @return string the ImageMagick release date as a string. */ public static function getReleaseDate() {} /** * (PECL imagick 2.0.0)
* Returns the specified resource's memory usage * @link https://php.net/manual/en/imagick.getresource.php * @param int $type

* Refer to the list of resourcetype constants. *

* @return int the specified resource's memory usage in megabytes. */ public static function getResource($type) {} /** * (PECL imagick 2.0.0)
* Returns the specified resource limit * @link https://php.net/manual/en/imagick.getresourcelimit.php * @param int $type

* Refer to the list of resourcetype constants. *

* @return int the specified resource limit in megabytes. */ public static function getResourceLimit($type) {} /** * (PECL imagick 2.0.0)
* Gets the horizontal and vertical sampling factor * @link https://php.net/manual/en/imagick.getsamplingfactors.php * @return array an associative array with the horizontal and vertical sampling * factors of the image. */ #[Pure] public function getSamplingFactors() {} /** * (PECL imagick 2.0.0)
* Returns the size associated with the Imagick object * @link https://php.net/manual/en/imagick.getsize.php * @return int[] the size associated with the Imagick object as an array with the * keys "columns" and "rows". * @throws ImagickException on error. */ #[ArrayShape(["columns" => "int", "rows" => "int"])] #[Pure] public function getSize() {} /** * (PECL imagick 2.0.0)
* Returns the ImageMagick API version * @link https://php.net/manual/en/imagick.getversion.php * @return array the ImageMagick API version as a string and as a number. */ #[ArrayShape(["versionNumber" => "int", "versionString" => "string"])] public static function getVersion() {} /** * (PECL imagick 2.0.0)
* Sets the object's default background color * @link https://php.net/manual/en/imagick.setbackgroundcolor.php * @param mixed $background * @return bool TRUE on success. * @throws ImagickException on error. */ public function setBackgroundColor($background) {} /** * (PECL imagick 2.0.0)
* Sets the object's default compression type * @link https://php.net/manual/en/imagick.setcompression.php * @param int $compression * @return bool TRUE on success. * @throws ImagickException on error. */ public function setCompression($compression) {} /** * (PECL imagick 0.9.10-0.9.9)
* Sets the object's default compression quality * @link https://php.net/manual/en/imagick.setcompressionquality.php * @param int $quality * @return bool TRUE on success. * @throws ImagickException on error. */ public function setCompressionQuality($quality) {} /** * (PECL imagick 2.0.0)
* Sets the filename before you read or write the image * @link https://php.net/manual/en/imagick.setfilename.php * @param string $filename * @return bool TRUE on success. * @throws ImagickException on error. */ public function setFilename($filename) {} /** * (PECL imagick 2.0.0)
* Sets the format of the Imagick object * @link https://php.net/manual/en/imagick.setformat.php * @param string $format * @return bool TRUE on success. * @throws ImagickException on error. */ public function setFormat($format) {} /** * (PECL imagick 2.0.0)
* Sets the image compression * @link https://php.net/manual/en/imagick.setinterlacescheme.php * @param int $interlace_scheme * @return bool TRUE on success. * @throws ImagickException on error. */ public function setInterlaceScheme($interlace_scheme) {} /** * (PECL imagick 2.0.0)
* Set an option * @link https://php.net/manual/en/imagick.setoption.php * @param string $key * @param string $value * @return bool TRUE on success. * @throws ImagickException on error. */ public function setOption($key, $value) {} /** * (PECL imagick 2.0.0)
* Sets the page geometry of the Imagick object * @link https://php.net/manual/en/imagick.setpage.php * @param int $width * @param int $height * @param int $x * @param int $y * @return bool TRUE on success. * @throws ImagickException on error. */ public function setPage($width, $height, $x, $y) {} /** * (PECL imagick 2.0.0)
* Sets the limit for a particular resource in megabytes * @link https://php.net/manual/en/imagick.setresourcelimit.php * @param int $type

* Refer to the list of resourcetype constants. *

* @param int $limit

* The resource limit. The unit depends on the type of the resource being limited. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public static function setResourceLimit($type, $limit) {} /** * (PECL imagick 2.0.0)
* Sets the image resolution * @link https://php.net/manual/en/imagick.setresolution.php * @param float $x_resolution

* The horizontal resolution. *

* @param float $y_resolution

* The vertical resolution. *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function setResolution($x_resolution, $y_resolution) {} /** * (PECL imagick 2.0.0)
* Sets the image sampling factors * @link https://php.net/manual/en/imagick.setsamplingfactors.php * @param array $factors * @return bool TRUE on success. * @throws ImagickException on error. */ public function setSamplingFactors(array $factors) {} /** * (PECL imagick 2.0.0)
* Sets the size of the Imagick object * @link https://php.net/manual/en/imagick.setsize.php * @param int $columns * @param int $rows * @return bool TRUE on success. * @throws ImagickException on error. */ public function setSize($columns, $rows) {} /** * (PECL imagick 2.0.0)
* Sets the image type attribute * @link https://php.net/manual/en/imagick.settype.php * @param int $image_type * @return bool TRUE on success. * @throws ImagickException on error. */ public function setType($image_type) {} public function key() {} public function next() {} public function rewind() {} /** * (PECL imagick 2.0.0)
* Checks if the current item is valid * @link https://php.net/manual/en/imagick.valid.php * @return bool TRUE on success. * @throws ImagickException on error. */ public function valid() {} /** * (PECL imagick 2.0.0)
* Returns a reference to the current Imagick object * @link https://php.net/manual/en/imagick.current.php * @return Imagick self on success. */ public function current() {} /** * Change the brightness and/or contrast of an image. It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image. * @link https://php.net/manual/en/imagick.brightnesscontrastimage.php * @param float $brightness * @param float $contrast * @param int $CHANNEL [optional] * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function brightnessContrastImage($brightness, $contrast, $CHANNEL = Imagick::CHANNEL_DEFAULT) {} /** * Applies a user supplied kernel to the image according to the given morphology method. * @link https://php.net/manual/en/imagick.morphology.php * @param int $morphologyMethod Which morphology method to use one of the \Imagick::MORPHOLOGY_* constants. * @param int $iterations The number of iteration to apply the morphology function. A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1. * @param ImagickKernel $ImagickKernel * @param int $CHANNEL [optional] * @return void * @throws ImagickException on error. * @throws ImagickKernelException on error. * @since 3.3.0 */ public function morphology($morphologyMethod, $iterations, ImagickKernel $ImagickKernel, $CHANNEL = Imagick::CHANNEL_DEFAULT) {} /** * Applies a custom convolution kernel to the image. * @link https://php.net/manual/en/imagick.filter.php * @param ImagickKernel $ImagickKernel An instance of ImagickKernel that represents either a single kernel or a linked series of kernels. * @param int $CHANNEL [optional] Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function filter(ImagickKernel $ImagickKernel, $CHANNEL = Imagick::CHANNEL_DEFAULT) {} /** * Apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). * The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255) * @link https://php.net/manual/en/imagick.colormatriximage.php * @param array $color_matrix * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function colorMatrixImage($color_matrix = Imagick::CHANNEL_DEFAULT) {} /** * Deletes an image property. * @link https://php.net/manual/en/imagick.deleteimageproperty.php * @param string $name The name of the property to delete. * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function deleteImageProperty($name) {} /** * Implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair. * @link https://php.net/manual/en/imagick.forwardfouriertransformimage.php * @param bool $magnitude If true, return as magnitude / phase pair otherwise a real / imaginary image pair. * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function forwardFourierTransformimage($magnitude) {} /** * Gets the current image's compression type. * @link https://php.net/manual/en/imagick.getimagecompression.php * @return int * @since 3.3.0 */ #[Pure] public function getImageCompression() {} /** * Get the StringRegistry entry for the named key or false if not set. * @link https://php.net/manual/en/imagick.getregistry.php * @param string $key * @return string|false * @throws ImagickException Since version >= 3.4.3. Throws an exception if the key does not exist, rather than terminating the program. * @since 3.3.0 */ public static function getRegistry($key) {} /** * Returns the ImageMagick quantum range as an integer. * @link https://php.net/manual/en/imagick.getquantum.php * @return int * @since 3.3.0 */ public static function getQuantum() {} /** * Replaces any embedded formatting characters with the appropriate image property and returns the interpreted text. See https://www.imagemagick.org/script/escape.php for escape sequences. * @link https://php.net/manual/en/imagick.identifyformat.php * @see https://www.imagemagick.org/script/escape.php * @param string $embedText A string containing formatting sequences e.g. "Trim box: %@ number of unique colors: %k". * @return bool * @throws ImagickException on error. * @since 3.3.0 */ public function identifyFormat($embedText) {} /** * Implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair. * @link https://php.net/manual/en/imagick.inversefouriertransformimage.php * @param Imagick $complement The second image to combine with this one to form either the magnitude / phase or real / imaginary image pair. * @param bool $magnitude If true, combine as magnitude / phase pair otherwise a real / imaginary image pair. * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function inverseFourierTransformImage($complement, $magnitude) {} /** * List all the registry settings. Returns an array of all the key/value pairs in the registry * @link https://php.net/manual/en/imagick.listregistry.php * @return array An array containing the key/values from the registry. * @since 3.3.0 */ public static function listRegistry() {} /** * Rotational blurs an image. * @link https://php.net/manual/en/imagick.rotationalblurimage.php * @param float $angle * @param int $CHANNEL * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function rotationalBlurImage($angle, $CHANNEL = Imagick::CHANNEL_DEFAULT) {} /** * Selectively blur an image within a contrast threshold. It is similar to the unsharpen mask that sharpens everything with contrast above a certain threshold. * @link https://php.net/manual/en/imagick.selectiveblurimage.php * @param float $radius * @param float $sigma * @param float $threshold * @param int $CHANNEL Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function selectiveBlurImage($radius, $sigma, $threshold, $CHANNEL = Imagick::CHANNEL_DEFAULT) {} /** * Set whether antialiasing should be used for operations. On by default. * @param bool $antialias * @return int * @throws ImagickException on error. * @since 3.3.0 */ public function setAntiAlias($antialias) {} /** * @link https://php.net/manual/en/imagick.setimagebiasquantum.php * @param string $bias * @return void * @since 3.3.0 */ public function setImageBiasQuantum($bias) {} /** * Set a callback that will be called during the processing of the Imagick image. * @link https://php.net/manual/en/imagick.setprogressmonitor.php * @param callable $callback The progress function to call. It should return true if image processing should continue, or false if it should be cancelled. * The offset parameter indicates the progress and the span parameter indicates the total amount of work needed to be done. *
 bool callback ( mixed $offset , mixed $span ) 
* Caution * The values passed to the callback function are not consistent. In particular the span parameter can increase during image processing. Because of this calculating the percentage complete of an image operation is not trivial. * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function setProgressMonitor($callback) {} /** * Sets the ImageMagick registry entry named key to value. This is most useful for setting "temporary-path" which controls where ImageMagick creates temporary images e.g. while processing PDFs. * @link https://php.net/manual/en/imagick.setregistry.php * @param string $key * @param string $value * @return void * @since 3.3.0 */ public static function setRegistry($key, $value) {} /** * Replace each pixel with corresponding statistic from the neighborhood of the specified width and height. * @link https://php.net/manual/en/imagick.statisticimage.php * @param int $type * @param int $width * @param int $height * @param int $channel [optional] * @return void * @throws ImagickException on error. * @since 3.3.0 */ public function statisticImage($type, $width, $height, $channel = Imagick::CHANNEL_DEFAULT) {} /** * Searches for a subimage in the current image and returns a similarity image such that an exact match location is * completely white and if none of the pixels match, black, otherwise some gray level in-between. * You can also pass in the optional parameters bestMatch and similarity. After calling the function similarity will * be set to the 'score' of the similarity between the subimage and the matching position in the larger image, * bestMatch will contain an associative array with elements x, y, width, height that describe the matching region. * * @link https://php.net/manual/en/imagick.subimagematch.php * @param Imagick $imagick * @param array &$bestMatch [optional] * @param float &$similarity [optional] A new image that displays the amount of similarity at each pixel. * @param float $similarity_threshold [optional] Only used if compiled with ImageMagick (library) > 7 * @param int $metric [optional] Only used if compiled with ImageMagick (library) > 7 * @return Imagick * @throws ImagickException on error. * @since 3.3.0 */ public function subImageMatch(Imagick $imagick, array &$bestMatch, &$similarity, $similarity_threshold, $metric) {} /** * Is an alias of Imagick::subImageMatch * * @param Imagick $imagick * @param array &$bestMatch [optional] * @param float &$similarity [optional] A new image that displays the amount of similarity at each pixel. * @param float $similarity_threshold [optional] * @param int $metric [optional] * @return Imagick * @throws ImagickException on error. * @see Imagick::subImageMatch() This function is an alias of subImageMatch() * @since 3.4.0 */ public function similarityImage(Imagick $imagick, array &$bestMatch, &$similarity, $similarity_threshold, $metric) {} /** * Returns any ImageMagick configure options that match the specified pattern (e.g. "*" for all). Options include NAME, VERSION, LIB_VERSION, etc. * @return string * @since 3.4.0 */ #[Pure] public function getConfigureOptions() {} /** * GetFeatures() returns the ImageMagick features that have been compiled into the runtime. * @return string * @since 3.4.0 */ #[Pure] public function getFeatures() {} /** * @return int * @since 3.4.0 */ #[Pure] public function getHDRIEnabled() {} /** * Sets the image channel mask. Returns the previous set channel mask. * Only works with Imagick >= 7 * @param int $channel * @throws ImagickException on error. * @since 3.4.0 */ public function setImageChannelMask($channel) {} /** * Merge multiple images of the same size together with the selected operator. https://www.imagemagick.org/Usage/layers/#evaluate-sequence * @param int $EVALUATE_CONSTANT * @return bool * @see https://www.imagemagick.org/Usage/layers/#evaluate-sequence * @throws ImagickException on error. * @since 3.4.0 */ public function evaluateImages($EVALUATE_CONSTANT) {} /** * Extracts the 'mean' from the image and adjust the image to try make set its gamma appropriately. * @param int $channel [optional] Default value Imagick::CHANNEL_ALL * @return bool * @throws ImagickException on error. * @since 3.4.1 */ public function autoGammaImage($channel = Imagick::CHANNEL_ALL) {} /** * Adjusts an image so that its orientation is suitable $ for viewing (i.e. top-left orientation). * @return bool * @throws ImagickException on error. * @since 3.4.1 */ public function autoOrient() {} /** * Composite one image onto another using the specified gravity. * * @param Imagick $imagick * @param int $COMPOSITE_CONSTANT * @param int $GRAVITY_CONSTANT * @return bool * @throws ImagickException on error. * @since 3.4.1 */ public function compositeImageGravity(Imagick $imagick, $COMPOSITE_CONSTANT, $GRAVITY_CONSTANT) {} /** * Attempts to increase the appearance of large-scale light-dark transitions. * * @param float $radius * @param float $strength * @return bool * @throws ImagickException on error. * @since 3.4.1 */ public function localContrastImage($radius, $strength) {} /** * Identifies the potential image type, returns one of the Imagick::IMGTYPE_* constants * @return int * @throws ImagickException on error. * @since 3.4.3 */ public function identifyImageType() {} /** * Sets the image to the specified alpha level. Will replace ImagickDraw::setOpacity() * * @param float $alpha * @return bool * @throws ImagickException on error. * @since 3.4.3 */ public function setImageAlpha($alpha) {} } /** * @method ImagickDraw clone() (PECL imagick 2.0.0)
Makes an exact copy of the specified ImagickDraw object * @link https://php.net/manual/en/class.imagickdraw.php */ class ImagickDraw { public function resetVectorGraphics() {} #[Pure] public function getTextKerning() {} /** * @param float $kerning */ public function setTextKerning($kerning) {} #[Pure] public function getTextInterWordSpacing() {} /** * @param $spacing */ public function setTextInterWordSpacing($spacing) {} #[Pure] public function getTextInterLineSpacing() {} /** * @param $spacing */ public function setTextInterLineSpacing($spacing) {} /** * (PECL imagick 2.0.0)
* The ImagickDraw constructor * @link https://php.net/manual/en/imagickdraw.construct.php */ public function __construct() {} /** * (PECL imagick 2.0.0)
* Sets the fill color to be used for drawing filled objects * @link https://php.net/manual/en/imagickdraw.setfillcolor.php * @param ImagickPixel $fill_pixel

* ImagickPixel to use to set the color *

* @return bool No value is returned. * @throws ImagickDrawException on error. */ public function setFillColor(ImagickPixel $fill_pixel) {} /** * (PECL imagick 2.0.0)
* Sets the opacity to use when drawing using the fill color or fill texture * @link https://php.net/manual/en/imagickdraw.setfillalpha.php * @param float $opacity

* fill alpha *

* @return bool No value is returned. */ #[Deprecated] public function setFillAlpha($opacity) {} /** * Sets the image resolution * @param float $x_resolution

The horizontal resolution.

* @param float $y_resolution

The vertical resolution.

* @return bool * @throws ImagickDrawException on error. */ public function setResolution($x_resolution, $y_resolution) {} /** * (PECL imagick 2.0.0)
* Sets the color used for stroking object outlines * @link https://php.net/manual/en/imagickdraw.setstrokecolor.php * @param ImagickPixel $stroke_pixel

* the stroke color *

* @return bool No value is returned. * @throws ImagickDrawException on error. */ public function setStrokeColor(ImagickPixel $stroke_pixel) {} /** * (PECL imagick 2.0.0)
* Specifies the opacity of stroked object outlines * @link https://php.net/manual/en/imagickdraw.setstrokealpha.php * @param float $opacity

* opacity *

* @return bool No value is returned. */ #[Deprecated] public function setStrokeAlpha($opacity) {} /** * (PECL imagick 2.0.0)
* Sets the width of the stroke used to draw object outlines * @link https://php.net/manual/en/imagickdraw.setstrokewidth.php * @param float $stroke_width

* stroke width *

* @return bool No value is returned. */ public function setStrokeWidth($stroke_width) {} /** * (PECL imagick 2.0.0)
* Clears the ImagickDraw * @link https://php.net/manual/en/imagickdraw.clear.php * @return bool an ImagickDraw object. */ public function clear() {} /** * (PECL imagick 2.0.0)
* Draws a circle * @link https://php.net/manual/en/imagickdraw.circle.php * @param float $ox

* origin x coordinate *

* @param float $oy

* origin y coordinate *

* @param float $px

* perimeter x coordinate *

* @param float $py

* perimeter y coordinate *

* @return bool No value is returned. */ public function circle($ox, $oy, $px, $py) {} /** * (PECL imagick 2.0.0)
* Draws text on the image * @link https://php.net/manual/en/imagickdraw.annotation.php * @param float $x

* The x coordinate where text is drawn *

* @param float $y

* The y coordinate where text is drawn *

* @param string $text

* The text to draw on the image *

* @return bool No value is returned. * @throws ImagickDrawException on error. */ public function annotation($x, $y, $text) {} /** * (PECL imagick 2.0.0)
* Controls whether text is antialiased * @link https://php.net/manual/en/imagickdraw.settextantialias.php * @param bool $antiAlias * @return bool No value is returned. */ public function setTextAntialias($antiAlias) {} /** * (PECL imagick 2.0.0)
* Specifies specifies the text code set * @link https://php.net/manual/en/imagickdraw.settextencoding.php * @param string $encoding

* the encoding name *

* @return bool No value is returned. */ public function setTextEncoding($encoding) {} /** * (PECL imagick 2.0.0)
* Sets the fully-specified font to use when annotating with text * @link https://php.net/manual/en/imagickdraw.setfont.php * @param string $font_name * @return bool TRUE on success. * @throws ImagickDrawException on error. * @throws ImagickException on error. */ public function setFont($font_name) {} /** * (PECL imagick 2.0.0)
* Sets the font family to use when annotating with text * @link https://php.net/manual/en/imagickdraw.setfontfamily.php * @param string $font_family

* the font family *

* @return bool TRUE on success. * @throws ImagickDrawException on error. * @throws ImagickException on error. */ public function setFontFamily($font_family) {} /** * (PECL imagick 2.0.0)
* Sets the font pointsize to use when annotating with text * @link https://php.net/manual/en/imagickdraw.setfontsize.php * @param float $pointsize

* the point size *

* @return bool No value is returned. */ public function setFontSize($pointsize) {} /** * (PECL imagick 2.0.0)
* Sets the font style to use when annotating with text * @link https://php.net/manual/en/imagickdraw.setfontstyle.php * @param int $style

* STYLETYPE_ constant *

* @return bool No value is returned. */ public function setFontStyle($style) {} /** * (PECL imagick 2.0.0)
* Sets the font weight * @link https://php.net/manual/en/imagickdraw.setfontweight.php * @param int $font_weight * @return bool * @throws ImagickDrawException on error. */ public function setFontWeight($font_weight) {} /** * (PECL imagick 2.0.0)
* Returns the font * @link https://php.net/manual/en/imagickdraw.getfont.php * @return string|false a string on success and false if no font is set. */ #[Pure] public function getFont() {} /** * (PECL imagick 2.0.0)
* Returns the font family * @link https://php.net/manual/en/imagickdraw.getfontfamily.php * @return string|false the font family currently selected or false if font family is not set. */ #[Pure] public function getFontFamily() {} /** * (PECL imagick 2.0.0)
* Returns the font pointsize * @link https://php.net/manual/en/imagickdraw.getfontsize.php * @return float the font size associated with the current ImagickDraw object. */ #[Pure] public function getFontSize() {} /** * (PECL imagick 2.0.0)
* Returns the font style * @link https://php.net/manual/en/imagickdraw.getfontstyle.php * @return int the font style constant (STYLE_) associated with the ImagickDraw object * or 0 if no style is set. */ #[Pure] public function getFontStyle() {} /** * (PECL imagick 2.0.0)
* Returns the font weight * @link https://php.net/manual/en/imagickdraw.getfontweight.php * @return int an int on success and 0 if no weight is set. */ #[Pure] public function getFontWeight() {} /** * (PECL imagick 2.0.0)
* Frees all associated resources * @link https://php.net/manual/en/imagickdraw.destroy.php * @return bool No value is returned. */ public function destroy() {} /** * (PECL imagick 2.0.0)
* Draws a rectangle * @link https://php.net/manual/en/imagickdraw.rectangle.php * @param float $x1

* x coordinate of the top left corner *

* @param float $y1

* y coordinate of the top left corner *

* @param float $x2

* x coordinate of the bottom right corner *

* @param float $y2

* y coordinate of the bottom right corner *

* @return bool No value is returned. */ public function rectangle($x1, $y1, $x2, $y2) {} /** * (PECL imagick 2.0.0)
* Draws a rounded rectangle * @link https://php.net/manual/en/imagickdraw.roundrectangle.php * @param float $x1

* x coordinate of the top left corner *

* @param float $y1

* y coordinate of the top left corner *

* @param float $x2

* x coordinate of the bottom right *

* @param float $y2

* y coordinate of the bottom right *

* @param float $rx

* x rounding *

* @param float $ry

* y rounding *

* @return bool No value is returned. */ public function roundRectangle($x1, $y1, $x2, $y2, $rx, $ry) {} /** * (PECL imagick 2.0.0)
* Draws an ellipse on the image * @link https://php.net/manual/en/imagickdraw.ellipse.php * @param float $ox * @param float $oy * @param float $rx * @param float $ry * @param float $start * @param float $end * @return bool No value is returned. */ public function ellipse($ox, $oy, $rx, $ry, $start, $end) {} /** * (PECL imagick 2.0.0)
* Skews the current coordinate system in the horizontal direction * @link https://php.net/manual/en/imagickdraw.skewx.php * @param float $degrees

* degrees to skew *

* @return bool No value is returned. */ public function skewX($degrees) {} /** * (PECL imagick 2.0.0)
* Skews the current coordinate system in the vertical direction * @link https://php.net/manual/en/imagickdraw.skewy.php * @param float $degrees

* degrees to skew *

* @return bool No value is returned. */ public function skewY($degrees) {} /** * (PECL imagick 2.0.0)
* Applies a translation to the current coordinate system * @link https://php.net/manual/en/imagickdraw.translate.php * @param float $x

* horizontal translation *

* @param float $y

* vertical translation *

* @return bool No value is returned. */ public function translate($x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a line * @link https://php.net/manual/en/imagickdraw.line.php * @param float $sx

* starting x coordinate *

* @param float $sy

* starting y coordinate *

* @param float $ex

* ending x coordinate *

* @param float $ey

* ending y coordinate *

* @return bool No value is returned. */ public function line($sx, $sy, $ex, $ey) {} /** * (PECL imagick 2.0.0)
* Draws an arc * @link https://php.net/manual/en/imagickdraw.arc.php * @param float $sx

* Starting x ordinate of bounding rectangle *

* @param float $sy

* starting y ordinate of bounding rectangle *

* @param float $ex

* ending x ordinate of bounding rectangle *

* @param float $ey

* ending y ordinate of bounding rectangle *

* @param float $sd

* starting degrees of rotation *

* @param float $ed

* ending degrees of rotation *

* @return bool No value is returned. */ public function arc($sx, $sy, $ex, $ey, $sd, $ed) {} /** * (PECL imagick 2.0.0)
* Paints on the image's opacity channel * @link https://php.net/manual/en/imagickdraw.matte.php * @param float $x

* x coordinate of the matte *

* @param float $y

* y coordinate of the matte *

* @param int $paintMethod

* PAINT_ constant *

* @return bool TRUE on success or FALSE on failure. */ public function matte($x, $y, $paintMethod) {} /** * (PECL imagick 2.0.0)
* Draws a polygon * @link https://php.net/manual/en/imagickdraw.polygon.php * @param array $coordinates

* multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) ); *

* @return bool TRUE on success. * @throws ImagickDrawException on error. */ public function polygon(array $coordinates) {} /** * (PECL imagick 2.0.0)
* Draws a point * @link https://php.net/manual/en/imagickdraw.point.php * @param float $x

* point's x coordinate *

* @param float $y

* point's y coordinate *

* @return bool No value is returned. */ public function point($x, $y) {} /** * (PECL imagick 2.0.0)
* Returns the text decoration * @link https://php.net/manual/en/imagickdraw.gettextdecoration.php * @return int one of the DECORATION_ constants * and 0 if no decoration is set. */ #[Pure] public function getTextDecoration() {} /** * (PECL imagick 2.0.0)
* Returns the code set used for text annotations * @link https://php.net/manual/en/imagickdraw.gettextencoding.php * @return string a string specifying the code set * or false if text encoding is not set. */ #[Pure] public function getTextEncoding() {} #[Pure] public function getFontStretch() {} /** * (PECL imagick 2.0.0)
* Sets the font stretch to use when annotating with text * @link https://php.net/manual/en/imagickdraw.setfontstretch.php * @param int $fontStretch

* STRETCH_ constant *

* @return bool No value is returned. */ public function setFontStretch($fontStretch) {} /** * (PECL imagick 2.0.0)
* Controls whether stroked outlines are antialiased * @link https://php.net/manual/en/imagickdraw.setstrokeantialias.php * @param bool $stroke_antialias

* the antialias setting *

* @return bool No value is returned. */ public function setStrokeAntialias($stroke_antialias) {} /** * (PECL imagick 2.0.0)
* Specifies a text alignment * @link https://php.net/manual/en/imagickdraw.settextalignment.php * @param int $alignment

* ALIGN_ constant *

* @return bool No value is returned. */ public function setTextAlignment($alignment) {} /** * (PECL imagick 2.0.0)
* Specifies a decoration * @link https://php.net/manual/en/imagickdraw.settextdecoration.php * @param int $decoration

* DECORATION_ constant *

* @return bool No value is returned. */ public function setTextDecoration($decoration) {} /** * (PECL imagick 2.0.0)
* Specifies the color of a background rectangle * @link https://php.net/manual/en/imagickdraw.settextundercolor.php * @param ImagickPixel $under_color

* the under color *

* @return bool No value is returned. * @throws ImagickDrawException on error. */ public function setTextUnderColor(ImagickPixel $under_color) {} /** * (PECL imagick 2.0.0)
* Sets the overall canvas size * @link https://php.net/manual/en/imagickdraw.setviewbox.php * @param int $x1

* left x coordinate *

* @param int $y1

* left y coordinate *

* @param int $x2

* right x coordinate *

* @param int $y2

* right y coordinate *

* @return bool No value is returned. */ public function setViewbox($x1, $y1, $x2, $y2) {} /** * (PECL imagick 2.0.0)
* Adjusts the current affine transformation matrix * @link https://php.net/manual/en/imagickdraw.affine.php * @param array $affine

* Affine matrix parameters *

* @return bool No value is returned. * @throws ImagickDrawException on error. */ public function affine(array $affine) {} /** * (PECL imagick 2.0.0)
* Draws a bezier curve * @link https://php.net/manual/en/imagickdraw.bezier.php * @param array $coordinates

* Multidimensional array like array( array( 'x' => 1, 'y' => 2 ), * array( 'x' => 3, 'y' => 4 ) ) *

* @return bool No value is returned. * @throws ImagickDrawException on error. */ public function bezier(array $coordinates) {} /** * (PECL imagick 2.0.0)
* Composites an image onto the current image * @link https://php.net/manual/en/imagickdraw.composite.php * @param int $compose

* composition operator. One of COMPOSITE_ constants *

* @param float $x

* x coordinate of the top left corner *

* @param float $y

* y coordinate of the top left corner *

* @param float $width

* width of the composition image *

* @param float $height

* height of the composition image *

* @param Imagick $compositeWand

* the Imagick object where composition image is taken from *

* @return bool TRUE on success. * @throws ImagickException on error. */ public function composite($compose, $x, $y, $width, $height, Imagick $compositeWand) {} /** * (PECL imagick 2.0.0)
* Draws color on image * @link https://php.net/manual/en/imagickdraw.color.php * @param float $x

* x coordinate of the paint *

* @param float $y

* y coordinate of the paint *

* @param int $paintMethod

* one of the PAINT_ constants *

* @return bool No value is returned. */ public function color($x, $y, $paintMethod) {} /** * (PECL imagick 2.0.0)
* Adds a comment * @link https://php.net/manual/en/imagickdraw.comment.php * @param string $comment

* The comment string to add to vector output stream *

* @return bool No value is returned. */ public function comment($comment) {} /** * (PECL imagick 2.0.0)
* Obtains the current clipping path ID * @link https://php.net/manual/en/imagickdraw.getclippath.php * @return string|false a string containing the clip path ID or false if no clip path exists. */ #[Pure] public function getClipPath() {} /** * (PECL imagick 2.0.0)
* Returns the current polygon fill rule * @link https://php.net/manual/en/imagickdraw.getcliprule.php * @return int one of the FILLRULE_ constants. */ #[Pure] public function getClipRule() {} /** * (PECL imagick 2.0.0)
* Returns the interpretation of clip path units * @link https://php.net/manual/en/imagickdraw.getclipunits.php * @return int an int on success. */ #[Pure] public function getClipUnits() {} /** * (PECL imagick 2.0.0)
* Returns the fill color * @link https://php.net/manual/en/imagickdraw.getfillcolor.php * @return ImagickPixel an ImagickPixel object. */ #[Pure] public function getFillColor() {} /** * (PECL imagick 2.0.0)
* Returns the opacity used when drawing * @link https://php.net/manual/en/imagickdraw.getfillopacity.php * @return float The opacity. */ #[Pure] public function getFillOpacity() {} /** * (PECL imagick 2.0.0)
* Returns the fill rule * @link https://php.net/manual/en/imagickdraw.getfillrule.php * @return int a FILLRULE_ constant */ #[Pure] public function getFillRule() {} /** * (PECL imagick 2.0.0)
* Returns the text placement gravity * @link https://php.net/manual/en/imagickdraw.getgravity.php * @return int a GRAVITY_ constant on success and 0 if no gravity is set. */ #[Pure] public function getGravity() {} /** * (PECL imagick 2.0.0)
* Returns the current stroke antialias setting * @link https://php.net/manual/en/imagickdraw.getstrokeantialias.php * @return bool TRUE if antialiasing is on and false if it is off. */ #[Pure] public function getStrokeAntialias() {} /** * (PECL imagick 2.0.0)
* Returns the color used for stroking object outlines * @link https://php.net/manual/en/imagickdraw.getstrokecolor.php * @return ImagickPixel an ImagickPixel object which describes the color. */ #[Pure] public function getStrokeColor() {} /** * (PECL imagick 2.0.0)
* Returns an array representing the pattern of dashes and gaps used to stroke paths * @link https://php.net/manual/en/imagickdraw.getstrokedasharray.php * @return array an array on success and empty array if not set. */ #[Pure] public function getStrokeDashArray() {} /** * (PECL imagick 2.0.0)
* Returns the offset into the dash pattern to start the dash * @link https://php.net/manual/en/imagickdraw.getstrokedashoffset.php * @return float a float representing the offset and 0 if it's not set. */ #[Pure] public function getStrokeDashOffset() {} /** * (PECL imagick 2.0.0)
* Returns the shape to be used at the end of open subpaths when they are stroked * @link https://php.net/manual/en/imagickdraw.getstrokelinecap.php * @return int one of the LINECAP_ constants or 0 if stroke linecap is not set. */ #[Pure] public function getStrokeLineCap() {} /** * (PECL imagick 2.0.0)
* Returns the shape to be used at the corners of paths when they are stroked * @link https://php.net/manual/en/imagickdraw.getstrokelinejoin.php * @return int one of the LINEJOIN_ constants or 0 if stroke line join is not set. */ #[Pure] public function getStrokeLineJoin() {} /** * (PECL imagick 2.0.0)
* Returns the stroke miter limit * @link https://php.net/manual/en/imagickdraw.getstrokemiterlimit.php * @return int an int describing the miter limit * and 0 if no miter limit is set. */ #[Pure] public function getStrokeMiterLimit() {} /** * (PECL imagick 2.0.0)
* Returns the opacity of stroked object outlines * @link https://php.net/manual/en/imagickdraw.getstrokeopacity.php * @return float a float describing the opacity. */ #[Pure] public function getStrokeOpacity() {} /** * (PECL imagick 2.0.0)
* Returns the width of the stroke used to draw object outlines * @link https://php.net/manual/en/imagickdraw.getstrokewidth.php * @return float a float describing the stroke width. */ #[Pure] public function getStrokeWidth() {} /** * (PECL imagick 2.0.0)
* Returns the text alignment * @link https://php.net/manual/en/imagickdraw.gettextalignment.php * @return int one of the ALIGN_ constants and 0 if no align is set. */ #[Pure] public function getTextAlignment() {} /** * (PECL imagick 2.0.0)
* Returns the current text antialias setting * @link https://php.net/manual/en/imagickdraw.gettextantialias.php * @return bool TRUE if text is antialiased and false if not. */ #[Pure] public function getTextAntialias() {} /** * (PECL imagick 2.0.0)
* Returns a string containing vector graphics * @link https://php.net/manual/en/imagickdraw.getvectorgraphics.php * @return string a string containing the vector graphics. */ #[Pure] public function getVectorGraphics() {} /** * (PECL imagick 2.0.0)
* Returns the text under color * @link https://php.net/manual/en/imagickdraw.gettextundercolor.php * @return ImagickPixel an ImagickPixel object describing the color. * @throws ImagickDrawException on error. */ #[Pure] public function getTextUnderColor() {} /** * (PECL imagick 2.0.0)
* Adds a path element to the current path * @link https://php.net/manual/en/imagickdraw.pathclose.php * @return bool No value is returned. */ public function pathClose() {} /** * (PECL imagick 2.0.0)
* Draws a cubic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetoabsolute.php * @param float $x1

* x coordinate of the first control point *

* @param float $y1

* y coordinate of the first control point *

* @param float $x2

* x coordinate of the second control point *

* @param float $y2

* y coordinate of the first control point *

* @param float $x

* x coordinate of the curve end *

* @param float $y

* y coordinate of the curve end *

* @return bool No value is returned. */ public function pathCurveToAbsolute($x1, $y1, $x2, $y2, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a cubic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetorelative.php * @param float $x1

* x coordinate of starting control point *

* @param float $y1

* y coordinate of starting control point *

* @param float $x2

* x coordinate of ending control point *

* @param float $y2

* y coordinate of ending control point *

* @param float $x

* ending x coordinate *

* @param float $y

* ending y coordinate *

* @return bool No value is returned. */ public function pathCurveToRelative($x1, $y1, $x2, $y2, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a quadratic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierabsolute.php * @param float $x1

* x coordinate of the control point *

* @param float $y1

* y coordinate of the control point *

* @param float $x

* x coordinate of the end point *

* @param float $y

* y coordinate of the end point *

* @return bool No value is returned. */ public function pathCurveToQuadraticBezierAbsolute($x1, $y1, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a quadratic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierrelative.php * @param float $x1

* starting x coordinate *

* @param float $y1

* starting y coordinate *

* @param float $x

* ending x coordinate *

* @param float $y

* ending y coordinate *

* @return bool No value is returned. */ public function pathCurveToQuadraticBezierRelative($x1, $y1, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a quadratic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothabsolute.php * @param float $x

* ending x coordinate *

* @param float $y

* ending y coordinate *

* @return bool No value is returned. */ public function pathCurveToQuadraticBezierSmoothAbsolute($x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a quadratic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothrelative.php * @param float $x

* ending x coordinate *

* @param float $y

* ending y coordinate *

* @return bool No value is returned. */ public function pathCurveToQuadraticBezierSmoothRelative($x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a cubic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetosmoothabsolute.php * @param float $x2

* x coordinate of the second control point *

* @param float $y2

* y coordinate of the second control point *

* @param float $x

* x coordinate of the ending point *

* @param float $y

* y coordinate of the ending point *

* @return bool No value is returned. */ public function pathCurveToSmoothAbsolute($x2, $y2, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a cubic Bezier curve * @link https://php.net/manual/en/imagickdraw.pathcurvetosmoothrelative.php * @param float $x2

* x coordinate of the second control point *

* @param float $y2

* y coordinate of the second control point *

* @param float $x

* x coordinate of the ending point *

* @param float $y

* y coordinate of the ending point *

* @return bool No value is returned. */ public function pathCurveToSmoothRelative($x2, $y2, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws an elliptical arc * @link https://php.net/manual/en/imagickdraw.pathellipticarcabsolute.php * @param float $rx

* x radius *

* @param float $ry

* y radius *

* @param float $x_axis_rotation

* x axis rotation *

* @param bool $large_arc_flag

* large arc flag *

* @param bool $sweep_flag

* sweep flag *

* @param float $x

* x coordinate *

* @param float $y

* y coordinate *

* @return bool No value is returned. */ public function pathEllipticArcAbsolute($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} /** * (PECL imagick 2.0.0)
* Draws an elliptical arc * @link https://php.net/manual/en/imagickdraw.pathellipticarcrelative.php * @param float $rx

* x radius *

* @param float $ry

* y radius *

* @param float $x_axis_rotation

* x axis rotation *

* @param bool $large_arc_flag

* large arc flag *

* @param bool $sweep_flag

* sweep flag *

* @param float $x

* x coordinate *

* @param float $y

* y coordinate *

* @return bool No value is returned. */ public function pathEllipticArcRelative($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} /** * (PECL imagick 2.0.0)
* Terminates the current path * @link https://php.net/manual/en/imagickdraw.pathfinish.php * @return bool No value is returned. */ public function pathFinish() {} /** * (PECL imagick 2.0.0)
* Draws a line path * @link https://php.net/manual/en/imagickdraw.pathlinetoabsolute.php * @param float $x

* starting x coordinate *

* @param float $y

* ending x coordinate *

* @return bool No value is returned. */ public function pathLineToAbsolute($x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a line path * @link https://php.net/manual/en/imagickdraw.pathlinetorelative.php * @param float $x

* starting x coordinate *

* @param float $y

* starting y coordinate *

* @return bool No value is returned. */ public function pathLineToRelative($x, $y) {} /** * (PECL imagick 2.0.0)
* Draws a horizontal line path * @link https://php.net/manual/en/imagickdraw.pathlinetohorizontalabsolute.php * @param float $x

* x coordinate *

* @return bool No value is returned. */ public function pathLineToHorizontalAbsolute($x) {} /** * (PECL imagick 2.0.0)
* Draws a horizontal line * @link https://php.net/manual/en/imagickdraw.pathlinetohorizontalrelative.php * @param float $x

* x coordinate *

* @return bool No value is returned. */ public function pathLineToHorizontalRelative($x) {} /** * (PECL imagick 2.0.0)
* Draws a vertical line * @link https://php.net/manual/en/imagickdraw.pathlinetoverticalabsolute.php * @param float $y

* y coordinate *

* @return bool No value is returned. */ public function pathLineToVerticalAbsolute($y) {} /** * (PECL imagick 2.0.0)
* Draws a vertical line path * @link https://php.net/manual/en/imagickdraw.pathlinetoverticalrelative.php * @param float $y

* y coordinate *

* @return bool No value is returned. */ public function pathLineToVerticalRelative($y) {} /** * (PECL imagick 2.0.0)
* Starts a new sub-path * @link https://php.net/manual/en/imagickdraw.pathmovetoabsolute.php * @param float $x

* x coordinate of the starting point *

* @param float $y

* y coordinate of the starting point *

* @return bool No value is returned. */ public function pathMoveToAbsolute($x, $y) {} /** * (PECL imagick 2.0.0)
* Starts a new sub-path * @link https://php.net/manual/en/imagickdraw.pathmovetorelative.php * @param float $x

* target x coordinate *

* @param float $y

* target y coordinate *

* @return bool No value is returned. */ public function pathMoveToRelative($x, $y) {} /** * (PECL imagick 2.0.0)
* Declares the start of a path drawing list * @link https://php.net/manual/en/imagickdraw.pathstart.php * @return bool No value is returned. */ public function pathStart() {} /** * (PECL imagick 2.0.0)
* Draws a polyline * @link https://php.net/manual/en/imagickdraw.polyline.php * @param array $coordinates

* array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) ) *

* @return bool TRUE on success. * @throws ImagickDrawException on error. */ public function polyline(array $coordinates) {} /** * (PECL imagick 2.0.0)
* Terminates a clip path definition * @link https://php.net/manual/en/imagickdraw.popclippath.php * @return bool No value is returned. */ public function popClipPath() {} /** * (PECL imagick 2.0.0)
* Terminates a definition list * @link https://php.net/manual/en/imagickdraw.popdefs.php * @return bool No value is returned. */ public function popDefs() {} /** * (PECL imagick 2.0.0)
* Terminates a pattern definition * @link https://php.net/manual/en/imagickdraw.poppattern.php * @return bool TRUE on success or FALSE on failure. * @throws ImagickException on error. */ public function popPattern() {} /** * (PECL imagick 2.0.0)
* Starts a clip path definition * @link https://php.net/manual/en/imagickdraw.pushclippath.php * @param string $clip_mask_id

* Clip mask Id *

* @return bool No value is returned. */ public function pushClipPath($clip_mask_id) {} /** * (PECL imagick 2.0.0)
* Indicates that following commands create named elements for early processing * @link https://php.net/manual/en/imagickdraw.pushdefs.php * @return bool No value is returned. */ public function pushDefs() {} /** * (PECL imagick 2.0.0)
* Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern * @link https://php.net/manual/en/imagickdraw.pushpattern.php * @param string $pattern_id

* the pattern Id *

* @param float $x

* x coordinate of the top-left corner *

* @param float $y

* y coordinate of the top-left corner *

* @param float $width

* width of the pattern *

* @param float $height

* height of the pattern *

* @return bool TRUE on success or FALSE on failure. */ public function pushPattern($pattern_id, $x, $y, $width, $height) {} /** * (PECL imagick 2.0.0)
* Renders all preceding drawing commands onto the image * @link https://php.net/manual/en/imagickdraw.render.php * @return bool TRUE on success or FALSE on failure. * @throws ImagickException on error. */ public function render() {} /** * (PECL imagick 2.0.0)
* Applies the specified rotation to the current coordinate space * @link https://php.net/manual/en/imagickdraw.rotate.php * @param float $degrees

* degrees to rotate *

* @return bool No value is returned. */ public function rotate($degrees) {} /** * (PECL imagick 2.0.0)
* Adjusts the scaling factor * @link https://php.net/manual/en/imagickdraw.scale.php * @param float $x

* horizontal factor *

* @param float $y

* vertical factor *

* @return bool No value is returned. */ public function scale($x, $y) {} /** * (PECL imagick 2.0.0)
* Associates a named clipping path with the image * @link https://php.net/manual/en/imagickdraw.setclippath.php * @param string $clip_mask

* the clipping path name *

* @return bool No value is returned. * @throws ImagickException on error. */ public function setClipPath($clip_mask) {} /** * (PECL imagick 2.0.0)
* Set the polygon fill rule to be used by the clipping path * @link https://php.net/manual/en/imagickdraw.setcliprule.php * @param int $fill_rule

* FILLRULE_ constant *

* @return bool No value is returned. */ public function setClipRule($fill_rule) {} /** * (PECL imagick 2.0.0)
* Sets the interpretation of clip path units * @link https://php.net/manual/en/imagickdraw.setclipunits.php * @param int $clip_units

* the number of clip units *

* @return bool No value is returned. */ public function setClipUnits($clip_units) {} /** * (PECL imagick 2.0.0)
* Sets the opacity to use when drawing using the fill color or fill texture * @link https://php.net/manual/en/imagickdraw.setfillopacity.php * @param float $fillOpacity

* the fill opacity *

* @return bool No value is returned. */ public function setFillOpacity($fillOpacity) {} /** * (PECL imagick 2.0.0)
* Sets the URL to use as a fill pattern for filling objects * @link https://php.net/manual/en/imagickdraw.setfillpatternurl.php * @param string $fill_url

* URL to use to obtain fill pattern. *

* @return bool TRUE on success or FALSE on failure. * @throws ImagickException on error. */ public function setFillPatternURL($fill_url) {} /** * (PECL imagick 2.0.0)
* Sets the fill rule to use while drawing polygons * @link https://php.net/manual/en/imagickdraw.setfillrule.php * @param int $fill_rule

* FILLRULE_ constant *

* @return bool No value is returned. */ public function setFillRule($fill_rule) {} /** * (PECL imagick 2.0.0)
* Sets the text placement gravity * @link https://php.net/manual/en/imagickdraw.setgravity.php * @param int $gravity

* GRAVITY_ constant *

* @return bool No value is returned. */ public function setGravity($gravity) {} /** * (PECL imagick 2.0.0)
* Sets the pattern used for stroking object outlines * @link https://php.net/manual/en/imagickdraw.setstrokepatternurl.php * @param string $stroke_url

* stroke URL *

* @return bool imagick.imagickdraw.return.success; * @throws ImagickException on error. */ public function setStrokePatternURL($stroke_url) {} /** * (PECL imagick 2.0.0)
* Specifies the offset into the dash pattern to start the dash * @link https://php.net/manual/en/imagickdraw.setstrokedashoffset.php * @param float $dash_offset

* dash offset *

* @return bool No value is returned. */ public function setStrokeDashOffset($dash_offset) {} /** * (PECL imagick 2.0.0)
* Specifies the shape to be used at the end of open subpaths when they are stroked * @link https://php.net/manual/en/imagickdraw.setstrokelinecap.php * @param int $linecap

* LINECAP_ constant *

* @return bool No value is returned. */ public function setStrokeLineCap($linecap) {} /** * (PECL imagick 2.0.0)
* Specifies the shape to be used at the corners of paths when they are stroked * @link https://php.net/manual/en/imagickdraw.setstrokelinejoin.php * @param int $linejoin

* LINEJOIN_ constant *

* @return bool No value is returned. */ public function setStrokeLineJoin($linejoin) {} /** * (PECL imagick 2.0.0)
* Specifies the miter limit * @link https://php.net/manual/en/imagickdraw.setstrokemiterlimit.php * @param int $miterlimit

* the miter limit *

* @return bool No value is returned. */ public function setStrokeMiterLimit($miterlimit) {} /** * (PECL imagick 2.0.0)
* Specifies the opacity of stroked object outlines * @link https://php.net/manual/en/imagickdraw.setstrokeopacity.php * @param float $stroke_opacity

* stroke opacity. 1.0 is fully opaque *

* @return bool No value is returned. */ public function setStrokeOpacity($stroke_opacity) {} /** * (PECL imagick 2.0.0)
* Sets the vector graphics * @link https://php.net/manual/en/imagickdraw.setvectorgraphics.php * @param string $xml

* xml containing the vector graphics *

* @return bool TRUE on success or FALSE on failure. */ public function setVectorGraphics($xml) {} /** * (PECL imagick 2.0.0)
* Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw * @link https://php.net/manual/en/imagickdraw.pop.php * @return bool TRUE on success and false on failure. * @throws ImagickException on error. */ public function pop() {} /** * (PECL imagick 2.0.0)
* Clones the current ImagickDraw and pushes it to the stack * @link https://php.net/manual/en/imagickdraw.push.php * @return bool TRUE on success or FALSE on failure. * @throws ImagickException on error. */ public function push() {} /** * (PECL imagick 2.0.0)
* Specifies the pattern of dashes and gaps used to stroke paths * @link https://php.net/manual/en/imagickdraw.setstrokedasharray.php * @param array $dashArray

* array of floats *

* @return bool TRUE on success. */ public function setStrokeDashArray(array $dashArray) {} /** * Sets the opacity to use when drawing using the fill or stroke color or texture. Fully opaque is 1.0. * * @param float $opacity * @return void * @since 3.4.1 */ public function setOpacity($opacity) {} /** * Returns the opacity used when drawing with the fill or stroke color or texture. Fully opaque is 1.0. * * @return float * @since 3.4.1 */ #[Pure] public function getOpacity() {} /** * Sets the image font resolution. * * @param float $x * @param float $y * @return bool * @throws ImagickException on error. * @since 3.4.1 */ public function setFontResolution($x, $y) {} /** * Gets the image X and Y resolution. * * @return array * @throws ImagickException on error. * @since 3.4.1 */ #[Pure] public function getFontResolution() {} /** * Returns the direction that will be used when annotating with text. * @return bool * @since 3.4.1 */ #[Pure] public function getTextDirection() {} /** * Sets the font style to use when annotating with text. The AnyStyle enumeration acts as a wild-card "don't care" option. * * @param int $direction * @return bool * @since 3.4.1 */ public function setTextDirection($direction) {} /** * Returns the border color used for drawing bordered objects. * * @return ImagickPixel * @since 3.4.1 */ #[Pure] public function getBorderColor() {} /** * Sets the border color to be used for drawing bordered objects. * @param ImagickPixel $color * @return bool * @throws ImagickDrawException on error. * @since 3.4.1 */ public function setBorderColor(ImagickPixel $color) {} /** * Obtains the vertical and horizontal resolution. * * @return string|null * @since 3.4.1 */ #[Pure] public function getDensity() {} /** * Sets the vertical and horizontal resolution. * @param string $density_string * @return bool * @throws ImagickException on error. * @since 3.4.1 */ public function setDensity($density_string) {} } /** * @link https://php.net/manual/en/class.imagickpixeliterator.php */ class ImagickPixelIterator implements Iterator { /** * (PECL imagick 2.0.0)
* The ImagickPixelIterator constructor * @link https://php.net/manual/en/imagickpixeliterator.construct.php * @param Imagick $wand * @throws ImagickPixelIteratorException on error. * @throws ImagickException on error. */ public function __construct(Imagick $wand) {} /** * (PECL imagick 2.0.0)
* Returns a new pixel iterator * @link https://php.net/manual/en/imagickpixeliterator.newpixeliterator.php * @param Imagick $wand * @return bool TRUE on success. Throwing ImagickPixelIteratorException. * @throws ImagickPixelIteratorException * @throws ImagickException */ #[Deprecated(replacement: "%class%->getPixelIterator(%parametersList%)")] public function newPixelIterator(Imagick $wand) {} /** * (PECL imagick 2.0.0)
* Returns a new pixel iterator * @link https://php.net/manual/en/imagickpixeliterator.newpixelregioniterator.php * @param Imagick $wand * @param int $x * @param int $y * @param int $columns * @param int $rows * @return bool a new ImagickPixelIterator on success; on failure, throws ImagickPixelIteratorException * @throws ImagickPixelIteratorException * @throws ImagickException */ #[Deprecated(replacement: "%class%->getPixelRegionIterator(%parametersList%)")] public function newPixelRegionIterator(Imagick $wand, $x, $y, $columns, $rows) {} /** * (PECL imagick 2.0.0)
* Returns the current pixel iterator row * @link https://php.net/manual/en/imagickpixeliterator.getiteratorrow.php * @return int the integer offset of the row, throwing ImagickPixelIteratorException on error. * @throws ImagickPixelIteratorException on error */ #[Pure] public function getIteratorRow() {} /** * (PECL imagick 2.0.0)
* Set the pixel iterator row * @link https://php.net/manual/en/imagickpixeliterator.setiteratorrow.php * @param int $row * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function setIteratorRow($row) {} /** * (PECL imagick 2.0.0)
* Sets the pixel iterator to the first pixel row * @link https://php.net/manual/en/imagickpixeliterator.setiteratorfirstrow.php * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function setIteratorFirstRow() {} /** * (PECL imagick 2.0.0)
* Sets the pixel iterator to the last pixel row * @link https://php.net/manual/en/imagickpixeliterator.setiteratorlastrow.php * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function setIteratorLastRow() {} /** * (PECL imagick 2.0.0)
* Returns the previous row * @link https://php.net/manual/en/imagickpixeliterator.getpreviousiteratorrow.php * @return array the previous row as an array of ImagickPixelWand objects from the * ImagickPixelIterator, throwing ImagickPixelIteratorException on error. * @throws ImagickPixelIteratorException on error */ #[Pure] public function getPreviousIteratorRow() {} /** * (PECL imagick 2.0.0)
* Returns the current row of ImagickPixel objects * @link https://php.net/manual/en/imagickpixeliterator.getcurrentiteratorrow.php * @return array a row as an array of ImagickPixel objects that can themselves be iterated. * @throws ImagickPixelIteratorException on error. */ #[Pure] public function getCurrentIteratorRow() {} /** * (PECL imagick 2.0.0)
* Returns the next row of the pixel iterator * @link https://php.net/manual/en/imagickpixeliterator.getnextiteratorrow.php * @return array the next row as an array of ImagickPixel objects, throwing * ImagickPixelIteratorException on error. * @throws ImagickPixelIteratorException on error */ #[Pure] public function getNextIteratorRow() {} /** * (PECL imagick 2.0.0)
* Resets the pixel iterator * @link https://php.net/manual/en/imagickpixeliterator.resetiterator.php * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function resetIterator() {} /** * (PECL imagick 2.0.0)
* Syncs the pixel iterator * @link https://php.net/manual/en/imagickpixeliterator.synciterator.php * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function syncIterator() {} /** * (PECL imagick 2.0.0)
* Deallocates resources associated with a PixelIterator * @link https://php.net/manual/en/imagickpixeliterator.destroy.php * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function destroy() {} /** * (PECL imagick 2.0.0)
* Clear resources associated with a PixelIterator * @link https://php.net/manual/en/imagickpixeliterator.clear.php * @return bool TRUE on success. * @throws ImagickPixelIteratorException on error. */ public function clear() {} /** * @param Imagick $Imagick * @throws ImagickPixelIteratorException on error. * @throws ImagickException on error. */ public static function getpixeliterator(Imagick $Imagick) {} /** * @param Imagick $Imagick * @param $x * @param $y * @param $columns * @param $rows * @throws ImagickPixelIteratorException on error. * @throws ImagickException on error. */ public static function getpixelregioniterator(Imagick $Imagick, $x, $y, $columns, $rows) {} /** * @throws ImagickPixelIteratorException on error. */ public function key() {} /** * @throws ImagickPixelIteratorException on error. */ public function next() {} /** * @throws ImagickPixelIteratorException on error. */ public function rewind() {} /** * @throws ImagickPixelIteratorException on error. */ public function current() {} /** * @throws ImagickPixelIteratorException on error. */ public function valid() {} } /** * @method clone() * @link https://php.net/manual/en/class.imagickpixel.php */ class ImagickPixel { /** * (PECL imagick 2.0.0)
* Returns the normalized HSL color of the ImagickPixel object * @link https://php.net/manual/en/imagickpixel.gethsl.php * @return float[] the HSL value in an array with the keys "hue", * "saturation", and "luminosity". Throws ImagickPixelException on failure. * @throws ImagickPixelException on failure */ #[ArrayShape(["hue" => "float", "saturation" => "float", "luminosity" => "float"])] #[Pure] public function getHSL() {} /** * (PECL imagick 2.0.0)
* Sets the normalized HSL color * @link https://php.net/manual/en/imagickpixel.sethsl.php * @param float $hue

* The normalized value for hue, described as a fractional arc * (between 0 and 1) of the hue circle, where the zero value is * red. *

* @param float $saturation

* The normalized value for saturation, with 1 as full saturation. *

* @param float $luminosity

* The normalized value for luminosity, on a scale from black at * 0 to white at 1, with the full HS value at 0.5 luminosity. *

* @return bool TRUE on success. * @throws ImagickPixelException on failure */ public function setHSL($hue, $saturation, $luminosity) {} /** * @throws ImagickPixelException on failure */ #[Pure] public function getColorValueQuantum() {} /** * @param $color_value * @throws ImagickPixelException on failure */ public function setColorValueQuantum($color_value) {} /** * Gets the colormap index of the pixel wand. * @throws ImagickPixelException on failure */ #[Pure] public function getIndex() {} /** * @param int $index * @throws ImagickPixelException on failure */ public function setIndex($index) {} /** * (PECL imagick 2.0.0)
* The ImagickPixel constructor * @link https://php.net/manual/en/imagickpixel.construct.php * @param string $color [optional]

* The optional color string to use as the initial value of this object. *

* @throws ImagickPixelException on failure */ public function __construct($color = null) {} /** * (PECL imagick 2.0.0)
* Sets the color * @link https://php.net/manual/en/imagickpixel.setcolor.php * @param string $color

* The color definition to use in order to initialise the * ImagickPixel object. *

* @return bool TRUE if the specified color was set, FALSE otherwise. * @throws ImagickPixelException on failure */ public function setColor($color) {} /** * (PECL imagick 2.0.0)
* Sets the normalized value of one of the channels * @link https://php.net/manual/en/imagickpixel.setcolorvalue.php * @param int $color

* One of the Imagick color constants e.g. \Imagick::COLOR_GREEN or \Imagick::COLOR_ALPHA. *

* @param float $value

* The value to set this channel to, ranging from 0 to 1. *

* @return bool TRUE on success. * @throws ImagickPixelException on failure */ public function setColorValue($color, $value) {} /** * (PECL imagick 2.0.0)
* Gets the normalized value of the provided color channel * @link https://php.net/manual/en/imagickpixel.getcolorvalue.php * @param int $color

* The color to get the value of, specified as one of the Imagick color * constants. This can be one of the RGB colors, CMYK colors, alpha and * opacity e.g (Imagick::COLOR_BLUE, Imagick::COLOR_MAGENTA). *

* @return float The value of the channel, as a normalized floating-point number, throwing * ImagickPixelException on error. * @throws ImagickPixelException on error */ #[Pure] public function getColorValue($color) {} /** * (PECL imagick 2.0.0)
* Clears resources associated with this object * @link https://php.net/manual/en/imagickpixel.clear.php * @return bool TRUE on success. * @throws ImagickPixelException on failure */ public function clear() {} /** * (PECL imagick 2.0.0)
* Deallocates resources associated with this object * @link https://php.net/manual/en/imagickpixel.destroy.php * @return bool TRUE on success. * @throws ImagickPixelException on failure */ public function destroy() {} /** * (PECL imagick 2.0.0)
* Check the distance between this color and another * @link https://php.net/manual/en/imagickpixel.issimilar.php * @param ImagickPixel $color

* The ImagickPixel object to compare this object against. *

* @param float $fuzz

* The maximum distance within which to consider these colors as similar. * The theoretical maximum for this value is the square root of three * (1.732). *

* @return bool TRUE on success. * @throws ImagickPixelException on failure */ public function isSimilar(ImagickPixel $color, $fuzz) {} /** * (No version information available, might only be in SVN)
* Check the distance between this color and another * @link https://php.net/manual/en/imagickpixel.ispixelsimilar.php * @param ImagickPixel $color

* The ImagickPixel object to compare this object against. *

* @param float $fuzz

* The maximum distance within which to consider these colors as similar. * The theoretical maximum for this value is the square root of three * (1.732). *

* @return bool TRUE on success. * @throws ImagickPixelException on failure */ public function isPixelSimilar(ImagickPixel $color, $fuzz) {} /** * (PECL imagick 2.0.0)
* Returns the color * @link https://php.net/manual/en/imagickpixel.getcolor.php * @param int $normalized [optional]

* Normalize the color values *

* @return array An array of channel values, each normalized if TRUE is given as param. Throws * ImagickPixelException on error. * @throws ImagickPixelException on error. */ #[ArrayShape(["r" => "int|float", "g" => "int|float", "b" => "int|float", "a" => "int|float"])] #[Pure] public function getColor($normalized = 0) {} /** * (PECL imagick 2.1.0)
* Returns the color as a string * @link https://php.net/manual/en/imagickpixel.getcolorasstring.php * @return string the color of the ImagickPixel object as a string. * @throws ImagickPixelException on failure */ #[Pure] public function getColorAsString() {} /** * (PECL imagick 2.0.0)
* Returns the color count associated with this color * @link https://php.net/manual/en/imagickpixel.getcolorcount.php * @return int the color count as an integer on success, throws * ImagickPixelException on failure. * @throws ImagickPixelException on failure. */ #[Pure] public function getColorCount() {} /** * @param int $colorCount * @throws ImagickPixelException on failure */ public function setColorCount($colorCount) {} /** * Returns true if the distance between two colors is less than the specified distance. The fuzz value should be in the range 0-QuantumRange.
* The maximum value represents the longest possible distance in the colorspace. e.g. from RGB(0, 0, 0) to RGB(255, 255, 255) for the RGB colorspace * @link https://php.net/manual/en/imagickpixel.ispixelsimilarquantum.php * @param string $color * @param string $fuzz * @return bool * @throws ImagickPixelException on failure * @since 3.3.0 */ public function isPixelSimilarQuantum($color, $fuzz) {} /** * Returns the color of the pixel in an array as Quantum values. If ImageMagick was compiled as HDRI these will be floats, otherwise they will be integers. * @link https://php.net/manual/en/imagickpixel.getcolorquantum.php * @return mixed The quantum value of the color element. Float if ImageMagick was compiled with HDRI, otherwise an int. * @throws ImagickPixelException on failure * @since 3.3.0 */ #[Pure] public function getColorQuantum() {} /** * Sets the color count associated with this color from another ImagickPixel object. * * @param ImagickPixel $srcPixel * @return bool * @throws ImagickPixelException on failure * @since 3.4.1 */ public function setColorFromPixel(ImagickPixel $srcPixel) {} } // End of imagick v.3.2.0RC1 // Start of Imagick v3.3.0RC1 /** * @link https://php.net/manual/en/class.imagickkernel.php */ class ImagickKernel { /** * Attach another kernel to this kernel to allow them to both be applied in a single morphology or filter function. Returns the new combined kernel. * @link https://php.net/manual/en/imagickkernel.addkernel.php * @param ImagickKernel $imagickKernel * @return void * @throws ImagickKernelException on error * @since 3.3.0 */ public function addKernel(ImagickKernel $imagickKernel) {} /** * Adds a given amount of the 'Unity' Convolution Kernel to the given pre-scaled and normalized Kernel. This in effect adds that amount of the original image into the resulting convolution kernel. The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels. * @link https://php.net/manual/en/imagickkernel.addunitykernel.php * @return void * @throws ImagickKernelException on error * @since 3.3.0 */ public function addUnityKernel() {} /** * Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.
* Currently the 'rotation' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2"); * @link https://php.net/manual/en/imagickkernel.frombuiltin.php * @param int $kernelType The type of kernel to build e.g. \Imagick::KERNEL_DIAMOND * @param string $kernelString A string that describes the parameters e.g. "4,2.5" * @return ImagickKernel * @since 3.3.0 */ public static function fromBuiltin($kernelType, $kernelString) {} /** * Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.
* Currently the 'rotation' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2"); * @link https://php.net/manual/en/imagickkernel.frombuiltin.php * @see https://www.imagemagick.org/Usage/morphology/#kernel * @param array $matrix A matrix (i.e. 2d array) of values that define the kernel. Each element should be either a float value, or FALSE if that element shouldn't be used by the kernel. * @param array $origin [optional] Which element of the kernel should be used as the origin pixel. e.g. For a 3x3 matrix specifying the origin as [2, 2] would specify that the bottom right element should be the origin pixel. * @return ImagickKernel * @throws ImagickKernelException on error * @since 3.3.0 */ public static function fromMatrix($matrix, $origin) {} /** * Get the 2d matrix of values used in this kernel. The elements are either float for elements that are used or 'false' if the element should be skipped. * @link https://php.net/manual/en/imagickkernel.getmatrix.php * @return array A matrix (2d array) of the values that represent the kernel. * @throws ImagickKernelException on error * @since 3.3.0 */ #[Pure] public function getMatrix() {} /** * ScaleKernelInfo() scales the given kernel list by the given amount, with or without normalization of the sum of the kernel values (as per given flags).
* The exact behaviour of this function depends on the normalization type being used please see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo for details.
* Flag should be one of Imagick::NORMALIZE_KERNEL_VALUE, Imagick::NORMALIZE_KERNEL_CORRELATE, Imagick::NORMALIZE_KERNEL_PERCENT or not set. * @link https://php.net/manual/en/imagickkernel.scale.php * @see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo * @return void * @throws ImagickKernelException on error * @since 3.3.0 */ public function scale() {} /** * Separates a linked set of kernels and returns an array of ImagickKernels. * @link https://php.net/manual/en/imagickkernel.separate.php * @return void * @throws ImagickKernelException on error * @since 3.3.0 */ public function seperate() {} } services: php_under_test: build: tests/DockerImages/${PHP_VERSION} volumes: - .:/opt/project/phpstorm-stubs test_runner: build: tests/DockerImages/testRunner volumes: - .:/opt/project/phpstorm-stubs pecl_extensions: build: tests/DockerImages/peclExtensions volumes: - .:/opt/project/phpstorm-stubs * The new message domain, or NULL to get the current setting without * changing it *

* @return string If successful, this function returns the current message * domain, after possibly changing it. */ function textdomain(?string $domain = null): string {} /** * Lookup a message in the current domain * @link https://php.net/manual/en/function.gettext.php * @param string $message

* The message being translated. *

* @return string a translated string if one is found in the * translation table, or the submitted message if not found. */ #[Pure] function _(string $message): string {} /** * Lookup a message in the current domain * @link https://php.net/manual/en/function.gettext.php * @param string $message

* The message being translated. *

* @return string a translated string if one is found in the * translation table, or the submitted message if not found. */ #[Pure] function gettext(string $message): string {} /** * Override the current domain * @link https://php.net/manual/en/function.dgettext.php * @param string $domain

* The domain *

* @param string $message

* The message *

* @return string A string on success. */ function dgettext(string $domain, string $message): string {} /** * Overrides the domain for a single lookup * @link https://php.net/manual/en/function.dcgettext.php * @param string $domain

* The domain *

* @param string $message

* The message *

* @param int $category

* The category *

* @return string A string on success. */ function dcgettext(string $domain, string $message, int $category): string {} /** * Sets the path for a domain * @link https://php.net/manual/en/function.bindtextdomain.php * @param string $domain

* The domain *

* @param string|null $directory

* The directory path. Since PHP 8.0.3 directory is nullable. If null is passed, the currently set directory is returned. *

* @return string|false The full pathname for the domain currently being set. */ function bindtextdomain(string $domain, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: 'string')] $directory = null): string|false {} /** * Plural version of gettext * @link https://php.net/manual/en/function.ngettext.php * @param string $singular * @param string $plural * @param int $count * @return string correct plural form of message identified by * msgid1 and msgid2 * for count n. */ #[Pure] function ngettext(string $singular, string $plural, int $count): string {} /** * Plural version of dgettext * @link https://php.net/manual/en/function.dngettext.php * @param string $domain

* The domain *

* @param string $singular * @param string $plural * @param int $count * @return string A string on success. */ #[Pure] function dngettext(string $domain, string $singular, string $plural, int $count): string {} /** * Plural version of dcgettext * @link https://php.net/manual/en/function.dcngettext.php * @param string $domain

* The domain *

* @param string $singular * @param string $plural * @param int $count * @param int $category * @return string A string on success. */ #[Pure] function dcngettext(string $domain, string $singular, string $plural, int $count, int $category): string {} /** * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned * @link https://php.net/manual/en/function.bind-textdomain-codeset.php * @param string $domain

* The domain *

* @param string|null $codeset

* The code set. Since 8.0.3 is nullable. If null is passed, the currently set encoding is returned. *

* @return string|false A string on success. */ function bind_textdomain_codeset(string $domain, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: 'string')] $codeset = null): string|false {} // End of gettext v. * COM class constructor. * @param string $module_name * @param string $server_name [optional] * @param int $codepage [optional] * @param string $typelib [optional] */ public function __construct($module_name, $server_name = null, $codepage = CP_ACP, $typelib = null) {} public function __get($name) {} public function __set($name, $value) {} public function __call($name, $args) {} } /** * The DOTNET class allows you to instantiate a class from a .Net assembly and call its methods and access its properties. * @link https://php.net/manual/en/class.dotnet.php */ class DOTNET { /** * (PHP 4 >= 4.1.0, PHP 5, PHP 7)
* COM class constructor. * @param string $assembly_name * @param string $class_name * @param int $codepage [optional] */ public function __construct($assembly_name, string $class_name, $codepage = CP_ACP) {} public function __get($name) {} public function __set($name, $value) {} public function __call($name, $args) {} } /** * The VARIANT is COM's equivalent of the PHP zval; it is a structure that can contain a value with a range of different possible types. The VARIANT class provided by the COM extension allows you to have more control over the way that PHP passes values to and from COM. * @link https://php.net/manual/en/class.variant.php */ class VARIANT { /** * (PHP 4 >= 4.1.0, PHP 5, PHP 7)
* COM class constructor. * @param mixed $value [optional] * @param int $type [optional] * @param int $codepage [optional] */ public function __construct($value = null, int $type = VT_EMPTY, $codepage = CP_ACP) {} public function __get($name) {} public function __set($name, $value) {} public function __call($name, $args) {} } /** * This extension will throw instances of the class com_exception whenever there is a potentially fatal error reported by COM. All COM exceptions have a well-defined code property that corresponds to the HRESULT return value from the various COM operations. You may use this code to make programmatic decisions on how to handle the exception. * @link https://php.net/manual/en/com.error-handling.php */ class com_exception extends \Exception {} /** * (PHP 5, PHP 7)
* Generate a globally unique identifier (GUID) * @link https://php.net/manual/en/function.com-create-guid.php * @return string */ function com_create_guid() {} /** * (PHP 4 >= 4.2.0, PHP 5, PHP 7)
* Connect events from a COM object to a PHP object * @link https://php.net/manual/en/function.com-event-sink.php * @param \VARIANT $comobject * @param object $sinkobject * @param string $sinkinterface [optional] * @return bool */ function com_event_sink($comobject, $sinkobject, $sinkinterface = null) {} /** * (PHP 5, PHP 7)
* Returns a handle to an already running instance of a COM object * @link https://php.net/manual/en/function.com-get-active-object.php * @param string $progid * @param int $code_page [optional] * @return \VARIANT */ function com_get_active_object($progid, $code_page = CP_ACP) {} /** * (PHP 4 >= 4.1.0, PHP 5, PHP 7)
* Loads a Typelib * @link https://php.net/manual/en/function.com-get-active-object.php * @param string $typelib_name * @param bool $case_insensitive [optional] * @return bool */ function com_load_typelib($typelib_name, $case_insensitive = true) {} /** * (PHP 4 >= 4.2.0, PHP 5, PHP 7)
* Process COM messages, sleeping for up to timeoutms milliseconds * @link https://php.net/manual/en/function.com-message-pump.php * @param int $timeoutms [optional] * @return bool */ function com_message_pump($timeoutms = 0) {} /** * (PHP 4 >= 4.2.0, PHP 5, PHP 7)
* Print out a PHP class definition for a dispatchable interface * @link https://php.net/manual/en/function.com-print-typeinfo.php * @param object $comobject * @param string $dispinterface [optional] * @param bool $wantsink [optional] * @return bool */ function com_print_typeinfo($comobject, $dispinterface = null, $wantsink = false) {} /** * (PHP 5, PHP 7)
* Returns the absolute value of a variant * @link https://php.net/manual/en/function.variant-abs.php * @param mixed $val * @return mixed */ function variant_abs($val) {} /** * (PHP 5, PHP 7)
* "Adds" two variant values together and returns the result * @link https://php.net/manual/en/function.variant-abs.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_add($left, $right) {} /** * (PHP 5, PHP 7)
* Performs a bitwise AND operation between two variants * @link https://php.net/manual/en/function.variant-and.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_and($left, $right) {} /** * (PHP 5, PHP 7)
* Convert a variant into a new variant object of another type * @link https://php.net/manual/en/function.variant-cast.php * @param \VARIANT $variant * @param int $type * @return \VARIANT */ function variant_cast($variant, $type) {} /** * (PHP 5, PHP 7)
* Concatenates two variant values together and returns the result * @link https://php.net/manual/en/function.variant-cat.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_cat($left, $right) {} /** * (PHP 5, PHP 7)
* Compares two variants * @link https://php.net/manual/en/function.variant-cmp.php * @param mixed $left * @param mixed $right * @param int $lcid [optional] * @param int $flags [optional] * @return int */ function variant_cmp($left, $right, $lcid = null, $flags = null) {} /** * (PHP 5, PHP 7)
* Returns a variant date representation of a Unix timestamp * @link https://php.net/manual/en/function.variant-date-from-timestamp.php * @param int $timestamp * @return \VARIANT */ function variant_date_from_timestamp($timestamp) {} /** * (PHP 5, PHP 7)
* Converts a variant date/time value to Unix timestamp * @link https://php.net/manual/en/function.variant-date-to-timestamp.php * @param \VARIANT $variant * @return int */ function variant_date_to_timestamp($variant) {} /** * (PHP 5, PHP 7)
* Returns the result from dividing two variants * @link https://php.net/manual/en/function.variant-div.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_div($left, $right) {} /** * (PHP 5, PHP 7)
* Performs a bitwise equivalence on two variants * @link https://php.net/manual/en/function.variant-eqv.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_eqv($left, $right) {} /** * (PHP 5, PHP 7)
* Returns the integer portion of a variant * @link https://php.net/manual/en/function.variant-fix.php * @param mixed $variant * @return mixed */ function variant_fix($variant) {} /** * (PHP 5, PHP 7)
* Returns the type of a variant object * @link https://php.net/manual/en/function.variant-get-type.php * @param VARIANT $variant * @return int */ function variant_get_type($variant) {} /** * (PHP 5, PHP 7)
* Converts variants to integers and then returns the result from dividing them * @link https://php.net/manual/en/function.variant-idiv.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_idiv($left, $right) {} /** * (PHP 5, PHP 7)
* Performs a bitwise implication on two variants * @link https://php.net/manual/en/function.variant-imp.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_imp($left, $right) {} /** * (PHP 5, PHP 7)
* Returns the integer portion of a variant * @link https://php.net/manual/en/function.variant-int.php * @param mixed $variant * @return mixed */ function variant_int($variant) {} /** * (PHP 5, PHP 7)
* Divides two variants and returns only the remainder * @link https://php.net/manual/en/function.variant-mod.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_mod($left, $right) {} /** * (PHP 5, PHP 7)
* Multiplies the values of the two variants * @link https://php.net/manual/en/function.variant-mul.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_mul($left, $right) {} /** * (PHP 5, PHP 7)
* Performs logical negation on a variant * @link https://php.net/manual/en/function.variant-neg.php * @param mixed $variant * @return mixed */ function variant_neg($variant) {} /** * (PHP 5, PHP 7)
* Performs bitwise not negation on a variant * @link https://php.net/manual/en/function.variant-not.php * @param mixed $variant * @return mixed */ function variant_not($variant) {} /** * (PHP 5, PHP 7)
* Performs a logical disjunction on two variants * @link https://php.net/manual/en/function.variant-or.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_or($left, $right) {} /** * (PHP 5, PHP 7)
* Returns the result of performing the power function with two variants * @link https://php.net/manual/en/function.variant-pow.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_pow($left, $right) {} /** * (PHP 5, PHP 7)
* Rounds a variant to the specified number of decimal places * @link https://php.net/manual/en/function.variant-round.php * @param mixed $variant * @param int $decimals * @return mixed */ function variant_round($variant, $decimals) {} /** * (PHP 5, PHP 7)
* Convert a variant into another type "in-place" * @link https://php.net/manual/en/function.variant-set-type.php * @param VARIANT $variant * @param int $type * @return void */ function variant_set_type($variant, $type) {} /** * (PHP 5, PHP 7)
* Assigns a new value for a variant object * @link https://php.net/manual/en/function.variant-set.php * @param VARIANT $variant * @param mixed $value * @return void */ function variant_set($variant, $value) {} /** * (PHP 5, PHP 7)
* Subtracts the value of the right variant from the left variant value * @link https://php.net/manual/en/function.variant-sub.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_sub($left, $right) {} /** * (PHP 5, PHP 7)
* Performs a logical exclusion on two variants * @link https://php.net/manual/en/function.variant-xor.php * @param mixed $left * @param mixed $right * @return mixed */ function variant_xor($left, $right) {} define('CLSCTX_INPROC_SERVER', 1); define('CLSCTX_INPROC_HANDLER', 2); define('CLSCTX_LOCAL_SERVER', 4); define('CLSCTX_REMOTE_SERVER', 16); define('CLSCTX_SERVER', 21); define('CLSCTX_ALL', 23); define('VT_NULL', 1); define('VT_EMPTY', 0); define('VT_UI1', 17); define('VT_I2', 2); define('VT_I4', 3); define('VT_R4', 4); define('VT_R8', 5); define('VT_BOOL', 11); define('VT_ERROR', 10); define('VT_CY', 6); define('VT_DATE', 7); define('VT_BSTR', 8); define('VT_DECIMAL', 14); define('VT_UNKNOWN', 13); define('VT_DISPATCH', 9); define('VT_VARIANT', 12); define('VT_I1', 16); define('VT_UI2', 18); define('VT_UI4', 19); define('VT_INT', 22); define('VT_UINT', 23); define('VT_ARRAY', 8192); define('VT_BYREF', 16384); define('CP_ACP', 0); define('CP_MACCP', 2); define('CP_OEMCP', 1); define('CP_UTF7', 65000); define('CP_UTF8', 65001); define('CP_SYMBOL', 42); define('CP_THREAD_ACP', 3); define('VARCMP_LT', 0); define('VARCMP_EQ', 1); define('VARCMP_GT', 2); define('VARCMP_NULL', 3); define('NORM_IGNORECASE', 1); define('NORM_IGNORENONSPACE', 2); define('NORM_IGNORESYMBOLS', 4); define('NORM_IGNOREWIDTH', 131072); define('NORM_IGNOREKANATYPE', 65536); define('NORM_IGNOREKASHIDA', 262144); define('DISP_E_DIVBYZERO', -2147352558); define('DISP_E_OVERFLOW', -2147352566); define('MK_E_UNAVAILABLE', -2147221021); // End of com v. * A Pool is a container for, and controller of, an adjustable number of * Workers.
* Pooling provides a higher level abstraction of the Worker functionality, * including the management of references in the way required by pthreads. * @link https://secure.php.net/manual/en/class.pool.php */ class Pool { /** * Maximum number of Workers this Pool can use * @var int */ protected $size; /** * The class of the Worker * @var string */ protected $class; /** * The arguments for constructor of new Workers * @var array */ protected $ctor; /** * References to Workers * @var array */ protected $workers; /** * Offset in workers of the last Worker used * @var int */ protected $last; /** * (PECL pthreads >= 2.0.0)
* Construct a new pool of workers. Pools lazily create their threads, which means * new threads will only be spawned when they are required to execute tasks. * @link https://secure.php.net/manual/en/pool.construct.php * @param int $size

The maximum number of workers for this pool to create

* @param string $class [optional]

The class for new Workers. If no class is * given, then it defaults to the {@link Worker} class.

* @param array $ctor [optional]

An array of arguments to be passed to new * Workers

*/ public function __construct(int $size, string $class = 'Worker', array $ctor = []) {} /** * (PECL pthreads >= 2.0.0)
* Allows the pool to collect references determined to be garbage by the * optionally given collector * @link https://secure.php.net/manual/en/pool.collect.php * @param null|callable $collector [optional]

A Callable collector that returns a * boolean on whether the task can be collected or not. Only in rare cases should * a custom collector need to be used.

* @return int

The number of remaining tasks in the pool to be collected

*/ public function collect(?callable $collector = null) {} /** * (PECL pthreads >= 2.0.0)
* Resize the Pool * @link https://secure.php.net/manual/en/pool.resize.php * @param int $size

The maximum number of Workers this Pool can create

* @return void */ public function resize(int $size) {} /** * (PECL pthreads >= 2.0.0)
* Shuts down all of the workers in the pool. This will block until all submitted * tasks have been executed. * @link https://secure.php.net/manual/en/pool.shutdown.php * @return void */ public function shutdown() {} /** * (PECL pthreads >= 2.0.0)
* Submit the task to the next Worker in the Pool * @link https://secure.php.net/manual/en/pool.submit.php * @param Threaded $task

The task for execution

* @return int

the identifier of the Worker executing the object

*/ public function submit(Threaded $task) {} /** * (PECL pthreads >= 2.0.0)
* Submit a task to the specified worker in the pool. The workers are indexed * from 0, and will only exist if the pool has needed to create them (since * threads are lazily spawned). * @link https://secure.php.net/manual/en/pool.submitTo.php * @param int $worker

The worker to stack the task onto, indexed from 0

* @param Threaded $task

The task for execution

* @return int

The identifier of the worker that accepted the task

*/ public function submitTo(int $worker, Threaded $task) {} } /** * Threaded objects form the basis of pthreads ability to execute user code * in parallel; they expose synchronization methods and various useful * interfaces.
* Threaded objects, most importantly, provide implicit safety for the programmer; * all operations on the object scope are safe. * * @link https://secure.php.net/manual/en/class.threaded.php */ class Threaded implements Collectable, Traversable, Countable, ArrayAccess { /** * Worker object in which this Threaded is being executed * @var Worker */ protected $worker; /** * (PECL pthreads >= 3.0.0)
* Increments the internal number of references to a Threaded object * @return void */ public function addRef() {} /** * (PECL pthreads >= 2.0.0)
* Fetches a chunk of the objects property table of the given size, * optionally preserving keys * @link https://secure.php.net/manual/en/threaded.chunk.php * @param int $size

The number of items to fetch

* @param bool $preserve [optional]

Preserve the keys of members, by default false

* @return array

An array of items from the objects property table

*/ public function chunk($size, $preserve = false) {} /** * (PECL pthreads >= 2.0.0)
* Returns the number of properties for this object * @link https://secure.php.net/manual/en/threaded.count.php * @return int

The number of properties for this object

*/ public function count() {} /** * (PECL pthreads >= 3.0.0)
* Decrements the internal number of references to a Threaded object * @return void */ public function delRef() {} /** * (PECL pthreads >= 2.0.8)
* Makes thread safe standard class at runtime * @link https://secure.php.net/manual/en/threaded.extend.php * @param string $class

The class to extend

* @return bool

A boolean indication of success

*/ public static function extend($class) {} /** * (PECL pthreads >= 3.0.0)
* Retrieves the internal number of references to a Threaded object * @return int

The number of references to the Threaded object

*/ public function getRefCount() {} /** * (PECL pthreads >= 2.0.0)
* Tell if the referenced object is executing * @link https://secure.php.net/manual/en/thread.isrunning.php * @return bool

A boolean indication of state

*/ public function isRunning() {} /** * (PECL pthreads >= 3.1.0)
* @inheritdoc * @see Collectable::isGarbage() */ public function isGarbage(): bool {} /** * (PECL pthreads >= 2.0.0)
* Tell if the referenced object was terminated during execution; suffered * fatal errors, or threw uncaught exceptions * @link https://secure.php.net/manual/en/threaded.isterminated.php * @return bool

A boolean indication of state

*/ public function isTerminated() {} /** * (PECL pthreads >= 2.0.0)
* Merges data into the current object * @link https://secure.php.net/manual/en/threaded.merge.php * @var mixed

The data to merge

* @var bool [optional]

Overwrite existing keys, by default true

* @return bool

A boolean indication of success

*/ public function merge($from, $overwrite = true) {} /** * (PECL pthreads >= 2.0.0)
* Send notification to the referenced object * @link https://secure.php.net/manual/en/threaded.notify.php * @return bool

A boolean indication of success

*/ public function notify() {} /** * (PECL pthreads >= 3.0.0)
* Send notification to the referenced object. This unblocks at least one * of the blocked threads (as opposed to unblocking all of them, as seen with * Threaded::notify()). * @link https://secure.php.net/manual/en/threaded.notifyone.php * @return bool

A boolean indication of success

*/ public function notifyOne() {} /** * (PECL pthreads >= 2.0.0)
* Pops an item from the objects property table * @link https://secure.php.net/manual/en/threaded.pop.php * @return mixed

The last item from the objects property table

*/ public function pop() {} /** * (PECL pthreads >= 2.0.0)
* The programmer should always implement the run method for objects * that are intended for execution. * @link https://secure.php.net/manual/en/threaded.run.php * @return void */ public function run() {} /** * (PECL pthreads >= 2.0.0)
* Shifts an item from the objects property table * @link https://secure.php.net/manual/en/threaded.shift.php * @return mixed

The first item from the objects property table

*/ public function shift() {} /** * (PECL pthreads >= 2.0.0)
* Executes the block while retaining the referenced objects * synchronization lock for the calling context * @link https://secure.php.net/manual/en/threaded.synchronized.php * @param Closure $block

The block of code to execute

* @param mixed ...$_ [optional]

Variable length list of arguments * to use as function arguments to the block

* @return mixed

The return value from the block

*/ public function synchronized(Closure $block, ...$_) {} /** * (PECL pthreads >= 2.0.0)
* Will cause the calling context to wait for notification from the * referenced object * @link https://secure.php.net/manual/en/threaded.wait.php * @param int $timeout [optional]

An optional timeout in microseconds

* @return bool

A boolean indication of success

*/ public function wait(int $timeout = 0) {} /** * @inheritdoc * @see ArrayAccess::offsetExists() */ public function offsetExists($offset) {} /** * @inheritdoc * @see ArrayAccess::offsetGet() */ public function offsetGet($offset) {} /** * @inheritdoc * @see ArrayAccess::offsetSet() */ public function offsetSet($offset, $value) {} /** * @inheritdoc * @see ArrayAccess::offsetUnset() */ public function offsetUnset($offset) {} } /** * (PECL pthreads >= 2.0.0)
* When the start method of a Thread is invoked, the run method code will be * executed in separate Thread, in parallel.
* After the run method is executed the Thread will exit immediately, it will * be joined with the creating Thread at the appropriate time. * * @link https://secure.php.net/manual/en/class.thread.php */ class Thread extends Threaded implements Countable, Traversable, ArrayAccess { /** * (PECL pthreads >= 2.0.0)
* Will return the identity of the Thread that created the referenced Thread * @link https://secure.php.net/manual/en/thread.getcreatorid.php * @return int

A numeric identity

*/ public function getCreatorId() {} /** * (PECL pthreads >= 2.0.0)
* Return a reference to the currently executing Thread * @link https://secure.php.net/manual/en/thread.getcurrentthread.php * @return Thread

An object representing the currently executing Thread

*/ public static function getCurrentThread() {} /** * (PECL pthreads >= 2.0.0)
* Will return the identity of the currently executing Thread * @link https://secure.php.net/manual/en/thread.getcurrentthreadid.php * @return int

A numeric identity

*/ public static function getCurrentThreadId() {} /** * (PECL pthreads >= 2.0.0)
* Will return the identity of the referenced Thread * @link https://secure.php.net/manual/en/thread.getthreadid.php * @return int

A numeric identity

*/ public function getThreadId() {} /** * (PECL pthreads >= 2.0.0)
* Tell if the referenced Thread has been joined * @link https://secure.php.net/manual/en/thread.isjoined.php * @return bool

A boolean indication of state

*/ public function isJoined() {} /** * (PECL pthreads >= 2.0.0)
* Tell if the referenced Thread was started * @link https://secure.php.net/manual/en/thread.isstarted.php * @return bool

A boolean indication of state

*/ public function isStarted() {} /** * (PECL pthreads >= 2.0.0)
* Causes the calling context to wait for the referenced Thread to finish executing * @link https://secure.php.net/manual/en/thread.join.php * @return bool

A boolean indication of success

*/ public function join() {} /** * (PECL pthreads >= 2.0.0)
* Will start a new Thread to execute the implemented run method * @link https://secure.php.net/manual/en/thread.start.php * @param int $options [optional]

An optional mask of inheritance * constants, by default {@link PTHREADS_INHERIT_ALL}

* @return bool

A boolean indication of success

*/ public function start(int $options = PTHREADS_INHERIT_ALL) {} } /** * (PECL pthreads >= 2.0.0)
* Worker Threads have a persistent context, as such should be used over * Threads in most cases.
* When a Worker is started, the run method will be executed, but the Thread will * not leave until one of the following conditions are met:
    *
  • the Worker goes out of scope (no more references remain)
  • *
  • the programmer calls shutdown
  • *
  • the script dies
* This means the programmer can reuse the context throughout execution; placing * objects on the stack of the Worker will cause the Worker to execute the stacked * objects run method. * @link https://secure.php.net/manual/en/class.worker.php */ class Worker extends Thread implements Traversable, Countable, ArrayAccess { /** * (PECL pthreads >= 3.0.0)
* Allows the worker to collect references determined to be garbage by the * optionally given collector * @link https://secure.php.net/manual/en/worker.collect.php * @param null|callable $collector [optional]

A Callable collector that returns * a boolean on whether the task can be collected or not. Only in rare cases * should a custom collector need to be used

* @return int

The number of remaining tasks on the worker's stack to be * collected

*/ public function collect(?callable $collector = null) {} /** * (PECL pthreads >= 2.0.0)
* Returns the number of tasks left on the stack * @link https://secure.php.net/manual/en/worker.getstacked.php * @return int

Returns the number of tasks currently waiting to be * executed by the worker

*/ public function getStacked() {} /** * (PECL pthreads >= 2.0.0)
* Whether the worker has been shutdown or not * @link https://secure.php.net/manual/en/worker.isshutdown.php * @return bool

Returns whether the worker has been shutdown or not

*/ public function isShutdown() {} /** * (PECL pthreads >= 2.0.0)
* Shuts down the Worker after executing all of the stacked tasks * @link https://secure.php.net/manual/en/worker.shutdown.php * @return bool

Whether the worker was successfully shutdown or not

*/ public function shutdown() {} /** * (PECL pthreads >= 2.0.0)
* Appends the new work to the stack of the referenced worker * @link https://secure.php.net/manual/en/worker.stack.php * @param Threaded $work

A Threaded object to be executed by the Worker

* @return int

The new size of the stack

*/ public function stack(Threaded $work) {} /** * (PECL pthreads >= 2.0.0)
* Removes the first task (the oldest one) in the stack * @link https://secure.php.net/manual/en/worker.unstack.php * @return Threaded|null

The item removed from the stack

*/ public function unstack() {} } /** * (PECL pthreads >= 2.0.8)
* Represents a garbage-collectable object. * @link https://secure.php.net/manual/en/class.collectable.php */ interface Collectable { /** * (PECL pthreads >= 2.0.8)
* Can be called in {@link Pool::collect()} to determine if this object is garbage * @link https://secure.php.net/manual/en/collectable.isgarbage.php * @return bool

Whether this object is garbage or not

*/ public function isGarbage(): bool; } /** * (PECL pthreads >= 3.0.0)
* The Volatile class is new to pthreads v3. Its introduction is a consequence of * the new immutability semantics of Threaded members of Threaded classes. The * Volatile class enables for mutability of its Threaded members, and is also * used to store PHP arrays in Threaded contexts. * @see Threaded * @link https://secure.php.net/manual/en/class.volatile.php */ class Volatile extends Threaded implements Collectable, Traversable {} * Resource holding the key. *

* @return void */ #[Deprecated(since: '8.0')] function openssl_pkey_free(#[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey"], default: "resource")] $key): void {} /** * Generates a new private key * @link https://php.net/manual/en/function.openssl-pkey-new.php * @param array|null $options [optional]

* You can finetune the key generation (such as specifying the number of * bits) using configargs. See * openssl_csr_new for more information about * configargs. *

* @return OpenSSLAsymmetricKey|resource|false a resource identifier for the pkey on success, or false on * error. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|false"], default: "resource|false")] function openssl_pkey_new(?array $options) {} /** * Gets an exportable representation of a key into a string * @link https://php.net/manual/en/function.openssl-pkey-export.php * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $key * @param string &$output * @param string|null $passphrase [optional]

* The key is optionally protected by passphrase. *

* @param array|null $options [optional]

* configargs can be used to fine-tune the export * process by specifying and/or overriding options for the openssl * configuration file. See openssl_csr_new for more * information about configargs. *

* @return bool true on success or false on failure. */ function openssl_pkey_export( #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $key, &$output, ?string $passphrase, ?array $options ): bool {} /** * Gets an exportable representation of a key into a file * @link https://php.net/manual/en/function.openssl-pkey-export-to-file.php * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $key * @param string $output_filename

* Path to the output file. *

* @param string|null $passphrase [optional]

* The key can be optionally protected by a * passphrase. *

* @param array|null $options [optional]

* configargs can be used to fine-tune the export * process by specifying and/or overriding options for the openssl * configuration file. See openssl_csr_new for more * information about configargs. *

* @return bool true on success or false on failure. */ function openssl_pkey_export_to_file( #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $key, string $output_filename, ?string $passphrase, ?array $options ): bool {} /** * Get a private key * @link https://php.net/manual/en/function.openssl-pkey-get-private.php * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key *

* key can be one of the following: *

    *
  1. a string having the format * file://path/to/file.pem. The named file must * contain a PEM encoded certificate/private key (it may contain both). *
  2. *
  3. A PEM formatted private key.
  4. *

* @param string|null $passphrase

* The optional parameter passphrase must be used * if the specified key is encrypted (protected by a passphrase). *

* @return OpenSSLAsymmetricKey|resource|false Returns a positive key resource identifier on success, or FALSE on error. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|false"], default: "resource|false")] function openssl_pkey_get_private( #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, ?string $passphrase = null ) {} /** * Extract public key from certificate and prepare it for use * @link https://php.net/manual/en/function.openssl-pkey-get-public.php * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key

certificate can be one of the following: *

    *
  1. an X.509 certificate resource
  2. *
  3. a string having the format * file://path/to/file.pem. The named file must * contain a PEM encoded certificate/public key (it may contain both). *
  4. *
  5. A PEM formatted public key.
  6. *

* @return OpenSSLAsymmetricKey|resource|false a positive key resource identifier on success, or false on error. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|false"], default: "resource|false")] function openssl_pkey_get_public(#[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $public_key) {} /** * Returns an array with the key details * @link https://php.net/manual/en/function.openssl-pkey-get-details.php * @param OpenSSLAsymmetricKey|resource $key

* Resource holding the key. *

* @return array|false an array with the key details in success or false in failure. * Returned array has indexes bits (number of bits), * key (string representation of the public key) and * type (type of the key which is one of * OPENSSL_KEYTYPE_RSA, * OPENSSL_KEYTYPE_DSA, * OPENSSL_KEYTYPE_DH, * OPENSSL_KEYTYPE_EC or -1 meaning unknown). *

*

* Depending on the key type used, additional details may be returned. Note that * some elements may not always be available. */ #[ArrayShape(["bits" => "int", "key" => "string", "rsa" => "array", "dsa" => "array", "dh" => "array", "ec" => "array", "type" => "int"])] function openssl_pkey_get_details(#[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey"], default: "resource")] $key): array|false {} /** * Free key resource * @link https://php.net/manual/en/function.openssl-free-key.php * @param OpenSSLAsymmetricKey|resource $key * @return void */ #[Deprecated(since: '8.0')] function openssl_free_key(#[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey"], default: "resource")] $key): void {} /** * Alias of openssl_pkey_get_private * @link https://php.net/manual/en/function.openssl-get-privatekey.php * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key *

* key can be one of the following: *

    *
  1. a string having the format * file://path/to/file.pem. The named file must * contain a PEM encoded certificate/private key (it may contain both). *
  2. *
  3. A PEM formatted private key.
  4. *

* @param string|null $passphrase [optional]

* The optional parameter passphrase must be used * if the specified key is encrypted (protected by a passphrase). *

* @return OpenSSLAsymmetricKey|resource|false Returns a positive key resource identifier on success, or FALSE on error. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|false"], default: "resource|false")] function openssl_get_privatekey( #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, ?string $passphrase ) {} /** * Alias of openssl_pkey_get_public * @link https://php.net/manual/en/function.openssl-get-publickey.php * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key

* certificate can be one of the following: *

    *
  1. an X.509 certificate resource
  2. *
  3. a string having the format * file://path/to/file.pem. The named file must * contain a PEM encoded certificate/public key (it may contain both). *
  4. *
  5. A PEM formatted public key.
  6. *

* @return OpenSSLAsymmetricKey|false a positive key resource identifier on success, or FALSE on error. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|false"], default: "resource|false")] function openssl_get_publickey(#[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $public_key) {} /** * Generate a new signed public key and challenge * @link https://php.net/manual/en/function.openssl-spki-new.php * @param OpenSSLAsymmetricKey|resource $private_key

* privkey should be set to a private key that was * previously generated by {@link https://php.net/en/manual/function.openssl-pkey-new.php openssl_pkey_new()} (or * otherwise obtained from the other openssl_pkey family of functions). * The corresponding public portion of the key will be used to sign the * CSR. *

* @param string $challenge

The challenge associated to associate with the SPKAC

* @param int $digest_algo

The digest algorithm. See openssl_get_md_method().

* @return string|false Returns a signed public key and challenge string or NULL on failure. * @since 5.6 */ function openssl_spki_new(#[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey"], default: "resource")] $private_key, string $challenge, int $digest_algo = 2): string|false {} /** * Verifies a signed public key and challenge * @link https://php.net/manual/en/function.openssl-spki-verify.php * @param string $spki

Expects a valid signed public key and challenge

* @return bool Returns a boolean on success or failure. * @since 5.6 */ function openssl_spki_verify(string $spki): bool {} /** * Exports the challenge associated with a signed public key and challenge * @link https://php.net/manual/en/function.openssl-spki-export-challenge.php * @param string $spki

Expects a valid signed public key and challenge

* @return string|false Returns the associated challenge string or NULL on failure. * @since 5.6 */ function openssl_spki_export_challenge(string $spki): string|false {} /** * Exports a valid PEM formatted public key signed public key and challenge * @link https://php.net/manual/en/function.openssl-spki-export.php * @param string $spki

Expects a valid signed public key and challenge

* @return string|false Returns the associated PEM formatted public key or NULL on failure. * @since 5.6 */ function openssl_spki_export(string $spki): string|false {} /** * Parse an X.509 certificate and return a resource identifier for * it * @link https://php.net/manual/en/function.openssl-x509-read.php * @param OpenSSLCertificate|string|resource $certificate * @return OpenSSLCertificate|resource|false a resource identifier on success or false on failure. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|false"], default: "resource|false")] function openssl_x509_read(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate) {} /** * @param string $certificate * @param string $digest_algo [optional] hash method * @param bool $binary [optional] * @return string|false FALSE on failure * @since 5.6 */ function openssl_x509_fingerprint(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, string $digest_algo = 'sha1', bool $binary = false): string|false {} /** * Free certificate resource * @link https://php.net/manual/en/function.openssl-x509-free.php * @param OpenSSLCertificate|resource|string $certificate * @return void */ #[Deprecated(since: '8.0')] function openssl_x509_free(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate"], default: "resource|string")] $certificate): void {} /** * Parse an X509 certificate and return the information as an array * @link https://php.net/manual/en/function.openssl-x509-parse.php * @param OpenSSLCertificate|string|resource $certificate * @param bool $short_names [optional]

* shortnames controls how the data is indexed in the * array - if shortnames is true (the default) then * fields will be indexed with the short name form, otherwise, the long name * form will be used - e.g.: CN is the shortname form of commonName. *

* @return array|false The structure of the returned data is (deliberately) not * yet documented, as it is still subject to change. */ #[ArrayShape([ 'name' => 'string', 'subject' => 'string', 'hash' => 'string', 'issuer' => 'string', 'version' => 'int', 'serialNumber' => 'string', 'serialNumberHex' => 'string', 'validFrom' => 'string', 'validTo' => 'string', 'validFrom_time_t' => 'int', 'validTo_time_t' => 'int', 'alias' => 'string', 'signatureTypeSN' => 'string', 'signatureTypeLN' => 'string', 'signatureTypeNID' => 'int', 'purposes' => 'array', 'extensions' => 'array' ])] function openssl_x509_parse( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.0')] bool $shortname, #[PhpStormStubsElementAvailable(from: '7.1')] bool $short_names = true ): array|false {} /** * Verifies if a certificate can be used for a particular purpose * @link https://php.net/manual/en/function.openssl-x509-checkpurpose.php * @param OpenSSLCertificate|string|resource $certificate

* The examined certificate. *

* @param int $purpose

* * openssl_x509_checkpurpose purposes * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ConstantDescription
X509_PURPOSE_SSL_CLIENTCan the certificate be used for the client side of an SSL * connection?
X509_PURPOSE_SSL_SERVERCan the certificate be used for the server side of an SSL * connection?
X509_PURPOSE_NS_SSL_SERVERCan the cert be used for Netscape SSL server?
X509_PURPOSE_SMIME_SIGNCan the cert be used to sign S/MIME email?
X509_PURPOSE_SMIME_ENCRYPTCan the cert be used to encrypt S/MIME email?
X509_PURPOSE_CRL_SIGNCan the cert be used to sign a certificate revocation list * (CRL)?
X509_PURPOSE_ANYCan the cert be used for Any/All purposes?
* These options are not bitfields - you may specify one only! *

* @param array $ca_info

* cainfo should be an array of trusted CA files/dirs * as described in Certificate * Verification. *

* @param string|null $untrusted_certificates_file [optional]

* If specified, this should be the name of a PEM encoded file holding * certificates that can be used to help verify the certificate, although * no trust is placed in the certificates that come from that file. *

* @return int|bool true if the certificate can be used for the intended purpose, * false if it cannot, or -1 on error. */ function openssl_x509_checkpurpose( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, int $purpose, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.0')] array $ca_info, #[PhpStormStubsElementAvailable(from: '7.1')] array $ca_info = [], ?string $untrusted_certificates_file ): int|bool {} /** * Checks if a private key corresponds to a certificate * @link https://php.net/manual/en/function.openssl-x509-check-private-key.php * @param OpenSSLCertificate|string|resource $certificate

* The certificate. *

* @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key

* The private key. *

* @return bool true if key is the private key that * corresponds to cert, or false otherwise. */ function openssl_x509_check_private_key( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key ): bool {} /** * Exports a certificate as a string * @link https://php.net/manual/en/function.openssl-x509-export.php * @param OpenSSLCertificate|string|resource $certificate * @param string &$output

* On success, this will hold the PEM. *

* @param bool $no_text [optional] * @return bool true on success or false on failure. */ function openssl_x509_export(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, &$output, bool $no_text = true): bool {} /** * Exports a certificate to file * @link https://php.net/manual/en/function.openssl-x509-export-to-file.php * @param OpenSSLCertificate|string|resource $certificate * @param string $output_filename

* Path to the output file. *

* @param bool $no_text [optional] * @return bool true on success or false on failure. */ function openssl_x509_export_to_file(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, string $output_filename, bool $no_text = true): bool {} /** * Verifies digital signature of x509 certificate against a public key * @link https://www.php.net/manual/en/function.openssl-x509-verify.php * @param OpenSSLCertificate|string|resource $certificate * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key * @return int Returns 1 if the signature is correct, 0 if it is incorrect, and -1 on error. * @since 7.4 */ function openssl_x509_verify( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $public_key ): int {} /** * Exports a PKCS#12 Compatible Certificate Store File to variable. * @link https://php.net/manual/en/function.openssl-pkcs12-export.php * @param OpenSSLCertificate|string|resource $certificate * @param string &$output

* On success, this will hold the PKCS#12. *

* @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key

* Private key component of PKCS#12 file. *

* @param string $passphrase

* Encryption password for unlocking the PKCS#12 file. *

* @param array $options * @return bool true on success or false on failure. * @since 5.2.2 */ function openssl_pkcs12_export( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, &$output, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, string $passphrase, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.0')] $args, #[PhpStormStubsElementAvailable(from: '7.1')] array $options = [] ): bool {} /** * Exports a PKCS#12 Compatible Certificate Store File * @link https://php.net/manual/en/function.openssl-pkcs12-export-to-file.php * @param OpenSSLCertificate|string|resource $certificate * @param string $output_filename

* Path to the output file. *

* @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key

* Private key component of PKCS#12 file. *

* @param string $passphrase

* Encryption password for unlocking the PKCS#12 file. *

* @param array $options * @return bool true on success or false on failure. * @since 5.2.2 */ function openssl_pkcs12_export_to_file(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, string $output_filename, $private_key, string $passphrase, array $options = []): bool {} /** * Parse a PKCS#12 Certificate Store into an array * @link https://php.net/manual/en/function.openssl-pkcs12-read.php * @param string $pkcs12 * @param array &$certificates

* On success, this will hold the Certificate Store Data. *

* @param string $passphrase

* Encryption password for unlocking the PKCS#12 file. *

* @return bool true on success or false on failure. * @since 5.2.2 */ function openssl_pkcs12_read(string $pkcs12, &$certificates, string $passphrase): bool {} /** * Generates a CSR * @link https://php.net/manual/en/function.openssl-csr-new.php * @param array $distinguished_names

* The Distinguished Name to be used in the certificate. *

* @param OpenSSLAsymmetricKey &$private_key

* privkey should be set to a private key that was * previously generated by openssl_pkey_new (or * otherwise obtained from the other openssl_pkey family of functions). * The corresponding public portion of the key will be used to sign the * CSR. *

* @param array|null $options [optional]

* By default, the information in your system openssl.conf * is used to initialize the request; you can specify a configuration file * section by setting the config_section_section key of * configargs. You can also specify an alternative * openssl configuration file by setting the value of the * config key to the path of the file you want to use. * The following keys, if present in configargs * behave as their equivalents in the openssl.conf, as * listed in the table below. * * Configuration overrides * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
configargs keytypeopenssl.conf equivalentdescription
digest_algstringdefault_mdSelects which digest method to use
x509_extensionsstringx509_extensionsSelects which extensions should be used when creating an x509 * certificate
req_extensionsstringreq_extensionsSelects which extensions should be used when creating a CSR
private_key_bitsintegerdefault_bitsSpecifies how many bits should be used to generate a private * key
private_key_typeintegernoneSpecifies the type of private key to create. This can be one * of OPENSSL_KEYTYPE_DSA, * OPENSSL_KEYTYPE_DH or * OPENSSL_KEYTYPE_RSA. * The default value is OPENSSL_KEYTYPE_RSA which * is currently the only supported key type. *
encrypt_keybooleanencrypt_keyShould an exported key (with passphrase) be encrypted?
encrypt_key_cipherintegernone * One of cipher constants. *
*

* @param array|null $extra_attributes [optional]

* extraattribs is used to specify additional * configuration options for the CSR. Both dn and * extraattribs are associative arrays whose keys are * converted to OIDs and applied to the relevant part of the request. *

* @return OpenSSLCertificateSigningRequest|resource|false the CSR. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificateSigningRequest|false"], default: "resource|false")] function openssl_csr_new( array $distinguished_names, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey'], default: 'resource')] &$private_key, ?array $options, ?array $extra_attributes ) {} /** * Exports a CSR as a string * @link https://php.net/manual/en/function.openssl-csr-export.php * @param OpenSSLCertificateSigningRequest|string|resource $csr * @param string &$output * @param bool $no_text [optional] * @return bool true on success or false on failure. */ function openssl_csr_export(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificateSigningRequest|string"], default: "resource|string")] $csr, &$output, bool $no_text = true): bool {} /** * Exports a CSR to a file * @link https://php.net/manual/en/function.openssl-csr-export-to-file.php * @param OpenSSLCertificateSigningRequest|string|resource $csr * @param string $output_filename

* Path to the output file. *

* @param bool $no_text [optional] * @return bool true on success or false on failure. */ function openssl_csr_export_to_file(#[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificateSigningRequest|string"], default: "resource|string")] $csr, string $output_filename, bool $no_text = true): bool {} /** * Sign a CSR with another certificate (or itself) and generate a certificate * @link https://php.net/manual/en/function.openssl-csr-sign.php * @param OpenSSLCertificateSigningRequest|string|resource $csr

* A CSR previously generated by openssl_csr_new. * It can also be the path to a PEM encoded CSR when specified as * file://path/to/csr or an exported string generated * by openssl_csr_export. *

* @param OpenSSLCertificate|resource|string|null $ca_certificate

* The generated certificate will be signed by cacert. * If cacert is null, the generated certificate * will be a self-signed certificate. *

* @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key

* priv_key is the private key that corresponds to * cacert. *

* @param int $days

* days specifies the length of time for which the * generated certificate will be valid, in days. *

* @param array|null $options [optional]

* You can finetune the CSR signing by configargs. * See openssl_csr_new for more information about * configargs. *

* @param int $serial [optional]

* An optional the serial number of issued certificate. If not specified * it will default to 0. *

* @return OpenSSLCertificate|resource|false an x509 certificate resource on success, false on failure. */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|false"], default: "resource|false")] function openssl_csr_sign( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificateSigningRequest|string"], default: "resource|string")] $csr, #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string|null"], default: "resource|string|null")] $ca_certificate, #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|OpenSSLCertificate|array|string"], default: "resource|array|string")] $private_key, int $days, ?array $options, int $serial = 0, #[PhpStormStubsElementAvailable(from: '8.4')] ?string $serial_hex = null ) {} /** * Returns the subject of a CERT * @link https://php.net/manual/en/function.openssl-csr-get-subject.php * @param OpenSSLCertificateSigningRequest|string|resource $csr * @param bool $short_names [optional] * @return array|false */ function openssl_csr_get_subject( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificateSigningRequest|string"], default: "resource|string")] $csr, #[PhpStormStubsElementAvailable(from: '7.1')] bool $short_names = true ): array|false {} /** * Returns the public key of a CERT * @link https://php.net/manual/en/function.openssl-csr-get-public-key.php * @param OpenSSLCertificateSigningRequest|string|resource $csr * @param bool $short_names [optional] * @return OpenSSLAsymmetricKey|resource|false */ #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey|false"], default: "resource|false")] function openssl_csr_get_public_key( #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificateSigningRequest|string"], default: "resource|string")] $csr, #[PhpStormStubsElementAvailable(from: '7.1')] bool $short_names = true ) {} /** * Computes a digest * @link https://php.net/manual/en/function.openssl-digest.php * @param string $data

* The data. *

* @param string $digest_algo

* The digest method. *

* @param bool $binary [optional]

* Setting to true will return as raw output data, otherwise the return * value is binhex encoded. *

* @return string|false the digested hash value on success or false on failure. */ function openssl_digest(string $data, string $digest_algo, bool $binary = false): string|false {} /** * Encrypts data * @link https://php.net/manual/en/function.openssl-encrypt.php * @param string $data

* The data. *

* @param string $cipher_algo

* The cipher method. For a list of available cipher methods, use {@see openssl_get_cipher_methods()}. *

* @param string $passphrase

* The key. *

* @param int $options [optional]

* options is a bitwise disjunction of the flags OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING. *

* @param string $iv [optional]

* A non-NULL Initialization Vector. *

* @param string &$tag [optional]

The authentication tag passed by reference when using AEAD cipher mode (GCM or CCM).

* @param string $aad [optional]

Additional authentication data.

* @param int $tag_length [optional]

* The length of the authentication tag. Its value can be between 4 and 16 for GCM mode. *

* @return string|false the encrypted string on success or false on failure. */ function openssl_encrypt( string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", #[PhpStormStubsElementAvailable(from: '7.1')] &$tag, #[PhpStormStubsElementAvailable(from: '7.1')] string $aad = "", #[PhpStormStubsElementAvailable(from: '7.1')] int $tag_length = 16 ): string|false {} /** * Decrypts data * @link https://php.net/manual/en/function.openssl-decrypt.php * @param string $data

* The data. *

* @param string $cipher_algo

* The cipher method. *

* @param string $passphrase

* The password. *

* @param int $options [optional]

* Setting to true will take a raw encoded string, * otherwise a base64 string is assumed for the * data parameter. *

* @param string $iv [optional]

* A non-NULL Initialization Vector. *

* @param string|null $tag

* The authentication tag in AEAD cipher mode. If it is incorrect, the authentication fails and the function returns FALSE. *

* @param string $aad [optional]

Additional authentication data.

* @return string|false The decrypted string on success or false on failure. */ function openssl_decrypt( string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", #[PhpStormStubsElementAvailable(from: '7.1')] #[LanguageLevelTypeAware(['8.1' => 'string|null'], default: 'string')] $tag = null, #[PhpStormStubsElementAvailable(from: '7.1')] string $aad = "" ): string|false {} /** * (PHP 5 >= PHP 5.3.3)
* Gets the cipher iv length * @link https://php.net/manual/en/function.openssl-cipher-iv-length.php * @param string $cipher_algo

* The method. *

* @return int|false the cipher length on success, or false on failure. */ function openssl_cipher_iv_length(string $cipher_algo): int|false {} /** * This function works in exactly the same way as openssl_cipher_iv_length but for a key length. This is especially * useful to make sure that the right key length is provided to openssl_encrypt and openssl_decrypt. * @param string $cipher_algo * @return int|false * @since 8.2 */ function openssl_cipher_key_length(string $cipher_algo): int|false {} /** * Generate signature * @link https://php.net/manual/en/function.openssl-sign.php * @param string $data * @param string &$signature

* If the call was successful the signature is returned in * signature. *

* @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key * @param string|int $algorithm [optional]

* For more information see the list of Signature Algorithms. *

* @return bool true on success or false on failure. */ function openssl_sign( string $data, &$signature, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, string|int $algorithm = OPENSSL_ALGO_SHA1 ): bool {} /** * Verify signature * @link https://php.net/manual/en/function.openssl-verify.php * @param string $data * @param string $signature * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key * @param string|int $algorithm [optional]

* For more information see the list of Signature Algorithms. *

* @return int|false 1 if the signature is correct, 0 if it is incorrect, and * -1 on error. */ function openssl_verify( string $data, string $signature, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $public_key, string|int $algorithm = OPENSSL_ALGO_SHA1 ): int|false {} /** * Seal (encrypt) data * @link https://php.net/manual/en/function.openssl-seal.php * @param string $data * @param string &$sealed_data * @param array &$encrypted_keys * @param array $public_key * @param string $cipher_algo * @param string &$iv * @return int|false the length of the sealed data on success, or false on error. * If successful the sealed data is returned in * sealed_data, and the envelope keys in * env_keys. */ function openssl_seal( string $data, &$sealed_data, &$encrypted_keys, array $public_key, #[PhpStormStubsElementAvailable(from: '5.3', to: '7.4')] string $cipher_algo = '', #[PhpStormStubsElementAvailable(from: '8.0')] string $cipher_algo, #[PhpStormStubsElementAvailable(from: '7.0')] &$iv = null ): int|false {} /** * Open sealed data * @link https://php.net/manual/en/function.openssl-open.php * @param string $data * @param string &$output

* If the call is successful the opened data is returned in this * parameter. *

* @param string $encrypted_key * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key * @param string $cipher_algo The cipher method. * @param string|null $iv [optional] The initialization vector. * @return bool true on success or false on failure. */ function openssl_open( string $data, &$output, string $encrypted_key, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, #[PhpStormStubsElementAvailable(from: '7.0', to: '7.4')] string $cipher_algo = '', #[PhpStormStubsElementAvailable(from: '8.0')] string $cipher_algo, #[PhpStormStubsElementAvailable(from: '7.0')] ?string $iv ): bool {} /** * Generates a PKCS5 v2 PBKDF2 string, defaults to SHA-1 * @link https://secure.php.net/manual/en/function.openssl-pbkdf2.php * @param string $password * @param string $salt * @param int $key_length * @param int $iterations * @param string $digest_algo [optional] * @return string|false Returns string or FALSE on failure. * @since 5.5 */ function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = 'sha1'): string|false {} /** * Verifies the signature of an S/MIME signed message * @link https://php.net/manual/en/function.openssl-pkcs7-verify.php * @param string $input_filename

* Path to the message. *

* @param int $flags

* flags can be used to affect how the signature is * verified - see PKCS7 constants * for more information. *

* @param string|null $signers_certificates_filename [optional]

* If the outfilename is specified, it should be a * string holding the name of a file into which the certificates of the * persons that signed the messages will be stored in PEM format. *

* @param array $ca_info

* If the cainfo is specified, it should hold * information about the trusted CA certificates to use in the verification * process - see certificate * verification for more information about this parameter. *

* @param string|null $untrusted_certificates_filename [optional]

* If the extracerts is specified, it is the filename * of a file containing a bunch of certificates to use as untrusted CAs. *

* @param string|null $content [optional]

* You can specify a filename with content that will * be filled with the verified data, but with the signature information * stripped. * @param string|null $output_filename [optional] *

* @return bool|int true if the signature is verified, false if it is not correct * (the message has been tampered with, or the signing certificate is invalid), * or -1 on error. */ function openssl_pkcs7_verify( string $input_filename, int $flags, ?string $signers_certificates_filename, array $ca_info = [], ?string $untrusted_certificates_filename, ?string $content, #[PhpStormStubsElementAvailable("7.2")] ?string $output_filename ): int|bool {} /** * Decrypts an S/MIME encrypted message * @link https://php.net/manual/en/function.openssl-pkcs7-decrypt.php * @param string $input_filename * @param string $output_filename

* The decrypted message is written to the file specified by * outfilename. *

* @param OpenSSLCertificate|string|resource $certificate * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string|null $private_key [optional] * @return bool true on success or false on failure. */ function openssl_pkcs7_decrypt( string $input_filename, string $output_filename, $certificate, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string|null'], default: 'resource|array|string|null')] $private_key ): bool {} /** * Sign an S/MIME message * @link https://php.net/manual/en/function.openssl-pkcs7-sign.php * @param string $input_filename * @param string $output_filename * @param OpenSSLCertificate|string|resource $certificate * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key * @param array|null $headers

* headers is an array of headers that * will be prepended to the data after it has been signed (see * openssl_pkcs7_encrypt for more information about * the format of this parameter). *

* @param int $flags [optional]

* flags can be used to alter the output - see PKCS7 constants. *

* @param string|null $untrusted_certificates_filename [optional]

* extracerts specifies the name of a file containing * a bunch of extra certificates to include in the signature which can for * example be used to help the recipient to verify the certificate that you used. *

* @return bool true on success or false on failure. */ function openssl_pkcs7_sign( string $input_filename, string $output_filename, #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|string"], default: "resource|string")] $certificate, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, ?array $headers, int $flags = PKCS7_DETACHED, ?string $untrusted_certificates_filename ): bool {} /** * Encrypt an S/MIME message * @link https://php.net/manual/en/function.openssl-pkcs7-encrypt.php * @param string $input_filename * @param string $output_filename * @param OpenSSLCertificate|array|string|resource $certificate

* Either a lone X.509 certificate, or an array of X.509 certificates. *

* @param array|null $headers

* headers is an array of headers that * will be prepended to the data after it has been encrypted. *

*

* headers can be either an associative array * keyed by header name, or an indexed array, where each element contains * a single header line. *

* @param int $flags [optional]

* flags can be used to specify options that affect * the encoding process - see PKCS7 * constants. *

* @param int $cipher_algo [optional]

* One of cipher constants. *

* @return bool true on success or false on failure. */ function openssl_pkcs7_encrypt( string $input_filename, string $output_filename, #[LanguageLevelTypeAware(["8.0" => "OpenSSLCertificate|array|string"], default: "resource|array|string")] $certificate, ?array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC ): bool {} /** * Encrypts data with private key * @link https://php.net/manual/en/function.openssl-private-encrypt.php * @param string $data * @param string &$encrypted_data * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key * @param int $padding [optional]

* padding can be one of * OPENSSL_PKCS1_PADDING, * OPENSSL_NO_PADDING. *

* @return bool true on success or false on failure. */ function openssl_private_encrypt( string $data, &$encrypted_data, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, int $padding = OPENSSL_PKCS1_PADDING ): bool {} /** * Decrypts data with private key * @link https://php.net/manual/en/function.openssl-private-decrypt.php * @param string $data * @param string &$decrypted_data * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key

* key must be the private key corresponding that * was used to encrypt the data. *

* @param int $padding [optional]

* padding can be one of * OPENSSL_PKCS1_PADDING, * OPENSSL_SSLV23_PADDING, * OPENSSL_PKCS1_OAEP_PADDING, * OPENSSL_NO_PADDING. *

* @return bool true on success or false on failure. */ function openssl_private_decrypt( string $data, &$decrypted_data, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, int $padding = OPENSSL_PKCS1_PADDING ): bool {} /** * Encrypts data with public key * @link https://php.net/manual/en/function.openssl-public-encrypt.php * @param string $data * @param string &$encrypted_data

* This will hold the result of the encryption. *

* @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key

* The public key. *

* @param int $padding [optional]

* padding can be one of * OPENSSL_PKCS1_PADDING, * OPENSSL_SSLV23_PADDING, * OPENSSL_PKCS1_OAEP_PADDING, * OPENSSL_NO_PADDING. *

* @return bool true on success or false on failure. */ function openssl_public_encrypt( string $data, &$encrypted_data, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $public_key, int $padding = OPENSSL_PKCS1_PADDING ): bool {} /** * Decrypts data with public key * @link https://php.net/manual/en/function.openssl-public-decrypt.php * @param string $data * @param string &$decrypted_data * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key

* key must be the public key corresponding that * was used to encrypt the data. *

* @param int $padding [optional]

* padding can be one of * OPENSSL_PKCS1_PADDING, * OPENSSL_NO_PADDING. *

* @return bool true on success or false on failure. */ function openssl_public_decrypt( string $data, &$decrypted_data, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $public_key, int $padding = OPENSSL_PKCS1_PADDING ): bool {} /** * Gets available digest methods * @link https://php.net/manual/en/function.openssl-get-md-methods.php * @param bool $aliases [optional]

* Set to true if digest aliases should be included within the * returned array. *

* @return array An array of available digest methods. */ function openssl_get_md_methods(bool $aliases = false): array {} /** * Gets available cipher methods * @link https://php.net/manual/en/function.openssl-get-cipher-methods.php * @param bool $aliases [optional]

* Set to true if cipher aliases should be included within the * returned array. *

* @return array An array of available cipher methods. */ function openssl_get_cipher_methods(bool $aliases = false): array {} /** * Computes shared secret for public value of remote DH key and local DH key * @link https://php.net/manual/en/function.openssl-dh-compute-key.php * @param string $public_key

* Public key *

* @param OpenSSLAsymmetricKey|resource $private_key

* DH key *

* @return string|false computed key on success or false on failure. * @since 5.3 */ function openssl_dh_compute_key(string $public_key, #[LanguageLevelTypeAware(["8.0" => "OpenSSLAsymmetricKey"], default: "resource")] $private_key): string|false {} /** * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key * @param int $key_length * @return string|false * @since 7.3 */ function openssl_pkey_derive( $public_key, #[LanguageLevelTypeAware(['8.0' => 'OpenSSLAsymmetricKey|OpenSSLCertificate|array|string'], default: 'resource|array|string')] $private_key, int $key_length = 0 ): string|false {} /** * Generates a string of pseudo-random bytes, with the number of bytes determined by the length parameter. *

It also indicates if a cryptographically strong algorithm was used to produce the pseudo-random bytes, * and does this via the optional crypto_strong parameter. It's rare for this to be FALSE, but some systems may be broken or old.

* @link https://php.net/manual/en/function.openssl-random-pseudo-bytes.php * @param positive-int $length

* The length of the desired string of bytes. Must be a positive integer. PHP will * try to cast this parameter to a non-null integer to use it. *

* @param bool &$strong_result [optional]

* If passed into the function, this will hold a boolean value that determines * if the algorithm used was "cryptographically strong", e.g., safe for usage with GPG, * passwords, etc. true if it did, otherwise false *

* @return string|false the generated string of bytes on success, or false on failure. */ #[LanguageLevelTypeAware(["7.4" => "string"], default: "string|false")] function openssl_random_pseudo_bytes(int $length, &$strong_result) {} /** * Return openSSL error message * @link https://php.net/manual/en/function.openssl-error-string.php * @return string|false an error message string, or false if there are no more error * messages to return. */ function openssl_error_string(): string|false {} /** * Retrieve the available certificate locations * @link https://php.net/manual/en/function.openssl-get-cert-locations.php * @return array an array with the available certificate locations * @since 5.6 */ #[ArrayShape([ 'default_cert_file' => 'string', 'default_cert_file_env' => 'string', 'default_cert_dir' => 'string', 'default_cert_dir_env' => 'string', 'default_private_dir' => 'string', 'default_default_cert_area' => 'string', 'ini_cafile' => 'string', 'ini_capath' => 'string' ])] function openssl_get_cert_locations(): array {} function openssl_get_curve_names(): array|false {} /** * @param string $data * @param array &$certificates * @return bool * @since 7.2 */ function openssl_pkcs7_read(string $data, &$certificates): bool {} /** * Verifies that the data block is intact, the signer is who they say they are, and returns the certs of the signers. * @param string $input_filename * @param int $flags [optional] * @param string|null $certificates [optional] * @param array $ca_info * @param string|null $untrusted_certificates_filename [optional] * @param string|null $content [optional] * @param string|null $pk7 [optional] * @param string|null $sigfile [optional] * @param int $encoding [optional] * @return bool * @since 8.0 */ function openssl_cms_verify(string $input_filename, int $flags = 0, ?string $certificates, array $ca_info = [], ?string $untrusted_certificates_filename, ?string $content, ?string $pk7, ?string $sigfile, int $encoding = OPENSSL_ENCODING_SMIME): bool {} /** * Encrypts the message in the file with the certificates and outputs the result to the supplied file. * @param string $input_filename * @param string $output_filename * @param resource|string|array $certificate * @param null|array $headers * @param int $flags * @param int $encoding * @param int $cipher_algo * @return bool * @since 8.0 */ function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): bool {} /** * Signs the MIME message in the file with a cert and key and output the result to the supplied file. * @param string $input_filename * @param string $output_filename * @param OpenSSLCertificate|string $certificate * @param OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key * @param array|null $headers * @param int $flags [optional] * @param int $encoding [optional] * @param string|null $untrusted_certificates_filename [optional] * @return bool * @since 8.0 */ function openssl_cms_sign(string $input_filename, string $output_filename, OpenSSLCertificate|string $certificate, $private_key, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, ?string $untrusted_certificates_filename): bool {} /** * Decrypts the S/MIME message in the file and outputs the results to the supplied file. * @param string $input_filename * @param string $output_filename * @param resource|string $certificate * @param resource|string|array $private_key * @param int $encoding * @return bool * @since 8.0 */ function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): bool {} /** * Exports the CMS file to an array of PEM certificates. * @param string $input_filename * @param array &$certificates * @return bool * @since 8.0 */ function openssl_cms_read(string $input_filename, &$certificates): bool {} define('OPENSSL_VERSION_TEXT', "OpenSSL 1.0.0e 6 Sep 2011"); define('OPENSSL_VERSION_NUMBER', 268435551); define('X509_PURPOSE_SSL_CLIENT', 1); define('X509_PURPOSE_SSL_SERVER', 2); define('X509_PURPOSE_NS_SSL_SERVER', 3); define('X509_PURPOSE_SMIME_SIGN', 4); define('X509_PURPOSE_SMIME_ENCRYPT', 5); define('X509_PURPOSE_CRL_SIGN', 6); define('X509_PURPOSE_ANY', 7); /** * @since 8.4 */ define('X509_PURPOSE_OCSP_HELPER', 8); /** * @since 8.4 */ define('X509_PURPOSE_TIMESTAMP_SIGN', 9); /** * Used as default algorithm by openssl_sign and * openssl_verify. * @link https://php.net/manual/en/openssl.constants.php */ define('OPENSSL_ALGO_SHA1', 1); define('OPENSSL_ALGO_MD5', 2); define('OPENSSL_ALGO_MD4', 3); define('OPENSSL_ALGO_MD2', 4); define('OPENSSL_ALGO_DSS1', 5); define('OPENSSL_ALGO_SHA224', 6); define('OPENSSL_ALGO_SHA256', 7); define('OPENSSL_ALGO_SHA384', 8); define('OPENSSL_ALGO_SHA512', 9); define('OPENSSL_ALGO_RMD160', 10); /** * When signing a message, use cleartext signing with the MIME * type "multipart/signed". This is the default * if you do not specify any flags to * openssl_pkcs7_sign. * If you turn this option off, the message will be signed using * opaque signing, which is more resistant to translation by mail relays * but cannot be read by mail agents that do not support S/MIME. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_DETACHED', 64); /** * Adds text/plain content type headers to encrypted/signed * message. If decrypting or verifying, it strips those headers from * the output - if the decrypted or verified message is not of MIME type * text/plain then an error will occur. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_TEXT', 1); /** * When verifying a message, certificates (if * any) included in the message are normally searched for the * signing certificate. With this option only the * certificates specified in the extracerts * parameter of openssl_pkcs7_verify are * used. The supplied certificates can still be used as * untrusted CAs however. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_NOINTERN', 16); /** * Do not verify the signers certificate of a signed * message. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_NOVERIFY', 32); /** * Do not chain verification of signers certificates: that is * don't use the certificates in the signed message as untrusted CAs. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_NOCHAIN', 8); /** * When signing a message the signer's certificate is normally * included - with this option it is excluded. This will reduce the * size of the signed message but the verifier must have a copy of the * signers certificate available locally (passed using the * extracerts to * openssl_pkcs7_verify for example). * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_NOCERTS', 2); /** * Normally when a message is signed, a set of attributes are * included which include the signing time and the supported symmetric * algorithms. With this option they are not included. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_NOATTR', 256); /** * Normally the input message is converted to "canonical" format * which is effectively using CR and LF * as end of line: as required by the S/MIME specification. When this * option is present, no translation occurs. This is useful when * handling binary data which may not be in MIME format. * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_BINARY', 128); /** * @since 8.3 */ define('PKCS7_NOOLDMIMETYPE', 1024); /** * Don't try and verify the signatures on a message * @link https://php.net/manual/en/openssl.constants.php */ define('PKCS7_NOSIGS', 4); define('OPENSSL_PKCS1_PADDING', 1); define('OPENSSL_SSLV23_PADDING', 2); define('OPENSSL_NO_PADDING', 3); define('OPENSSL_PKCS1_OAEP_PADDING', 4); define('OPENSSL_CIPHER_RC2_40', 0); define('OPENSSL_CIPHER_RC2_128', 1); define('OPENSSL_CIPHER_RC2_64', 2); define('OPENSSL_CIPHER_DES', 3); define('OPENSSL_CIPHER_3DES', 4); define('OPENSSL_KEYTYPE_RSA', 0); define('OPENSSL_KEYTYPE_DSA', 1); define('OPENSSL_KEYTYPE_DH', 2); define('OPENSSL_KEYTYPE_EC', 3); /** * @since 8.4 */ define('OPENSSL_KEYTYPE_X25519', 4); /** * @since 8.4 */ define('OPENSSL_KEYTYPE_ED25519', 5); /** * @since 8.4 */ define('OPENSSL_KEYTYPE_X448', 6); /** * @since 8.4 */ define('OPENSSL_KEYTYPE_ED448', 7); /** * Whether SNI support is available or not. * @link https://php.net/manual/en/openssl.constants.php */ define('OPENSSL_TLSEXT_SERVER_NAME', 1); // End of openssl v. /** @link https://php.net/manual/en/openssl.ciphers.php */ define('OPENSSL_CIPHER_AES_128_CBC', 5); /** @link https://php.net/manual/en/openssl.ciphers.php */ define('OPENSSL_CIPHER_AES_192_CBC', 6); /** @link https://php.net/manual/en/openssl.ciphers.php */ define('OPENSSL_CIPHER_AES_256_CBC', 7); define('OPENSSL_RAW_DATA', 1); define('OPENSSL_ZERO_PADDING', 2); define('OPENSSL_DONT_ZERO_PAD_KEY', 4); /** * @since 8.0 */ define('OPENSSL_CMS_DETACHED', 64); /** * @since 8.0 */ define('OPENSSL_CMS_TEXT', 1); /** * @since 8.0 */ define('OPENSSL_CMS_NOINTERN', 16); /** * @since 8.0 */ define('OPENSSL_CMS_NOVERIFY', 32); /** * @since 8.0 */ define('OPENSSL_CMS_NOCERTS', 2); /** * @since 8.0 */ define('OPENSSL_CMS_NOATTR', 256); /** * @since 8.0 */ define('OPENSSL_CMS_BINARY', 128); /** * @since 8.0 */ define('OPENSSL_CMS_NOSIGS', 12); /** * @since 8.0 */ define('OPENSSL_ENCODING_DER', 0); /** * @since 8.0 */ define('OPENSSL_ENCODING_SMIME', 1); /** * @since 8.0 */ define('OPENSSL_ENCODING_PEM', 2); define('OPENSSL_DEFAULT_STREAM_CIPHERS', "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:" . "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:" . "DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:" . "ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:" . "ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:" . "DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:" . "AES256-GCM-SHA384:AES128:AES256:HIGH:!SSLv2:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!RC4:!ADH"); /** * @since 8.3 */ define('OPENSSL_CMS_OLDMIMETYPE', 1024); /** * @since 8.0 */ final class OpenSSLCertificate { /** * Cannot directly construct OpenSSLCertificate, use openssl_x509_read() instead * @see openssl_x509_read() */ private function __construct() {} } /** * @since 8.0 */ final class OpenSSLCertificateSigningRequest { /** * Cannot directly construct OpenSSLCertificateSigningRequest, use openssl_csr_new() instead * @see openssl_csr_new() */ private function __construct() {} } /** * @since 8.0 */ final class OpenSSLAsymmetricKey { /** * Cannot directly construct OpenSSLAsymmetricKey, use openssl_pkey_new() instead * @see openssl_pkey_new() */ private function __construct() {} } LuaSandbox is an extension for PHP 5, PHP 7, and HHVM to allow safely running * untrusted Lua 5.1 code from within PHP.

* * @link https://www.php.net/manual/en/book.luasandbox.php * @package luasandbox * @version 3.0.3 */ /** * The LuaSandbox class creates a Lua environment and allows for execution of Lua code. * * @link https://www.php.net/manual/en/class.luasandbox.php * @since luasandbox >= 1.0.0 */ class LuaSandbox { /** * Used with LuaSandbox::getProfilerFunctionReport() * to return timings in samples. */ public const SAMPLES = 0; /** * Used with LuaSandbox::getProfilerFunctionReport() * to return timings in seconds. */ public const SECONDS = 1; /** * Used with LuaSandbox::getProfilerFunctionReport() * to return timings in percentages of the total. */ public const PERCENT = 2; /** * Call a function in a Lua global variable. * *

If the name contains "." characters, the function is located via recursive table accesses, * as if the name were a Lua expression.

* *

If the variable does not exist, or is not a function, * false will be returned and a warning issued.

* *

For more information about calling Lua functions and the return values, * see LuaSandboxFunction::call().

* * @link https://www.php.net/manual/en/luasandbox.callFunction.php * @param string $name

Lua variable name.

* @param mixed[] $arguments

Arguments to the function.

* @return array|bool

Returns an array of values returned by the Lua function, * which may be empty, or false in case of failure.

* @see LuaSandboxFunction::call() * @since luasandbox >= 1.0.0 */ public function callFunction($name, array $arguments) {} /** * Disable the profiler. * * @link https://www.php.net/manual/en/luasandbox.disableProfiler.php * @since luasandbox >= 1.1.0 * @see LuaSandbox::enableProfiler() * @see LuaSandbox::getProfilerFunctionReport() */ public function disableProfiler() {} /** * Enable the profiler. * *

The profiler periodically samples the Lua environment * to record the running function. Testing indicates that * at least on Linux, setting a period less than 1ms will * lead to a high overrun count but no performance problems.

* * @link https://www.php.net/manual/en/luasandbox.enableprofiler.php * @param float $period [optional]

Sampling period in seconds.

* @return bool

Returns a boolean indicating whether the profiler is enabled.

* @since luasandbox >= 1.1.0 * @see LuaSandbox::disableProfiler() * @see LuaSandbox::getProfilerFunctionReport() */ public function enableProfiler($period = 0.02) {} /** * Fetch the current CPU time usage of the Lua environment. * *

This includes time spent in PHP callbacks.

* *

Note: On Windows, this function always returns zero. * On operating systems that do not support CLOCK_THREAD_CPUTIME_ID, * such as FreeBSD and Mac OS X, this function will return the * elapsed wall-clock time, not CPU time.

* * @link https://www.php.net/manual/en/luasandbox.getcpuusage.php * @return float

Returns the current CPU time usage in seconds.

* @since luasandbox >= 1.0.0 * @see LuaSandbox::getMemoryUsage() * @see LuaSandbox::getPeakMemoryUsage() * @see LuaSandbox::setCPULimit() */ public function getCPUUsage() {} /** * Fetch the current memory usage of the Lua environment. * * @link https://www.php.net/manual/en/luasandbox.getmemoryusage.php * @return int * @since luasandbox >= 1.0.0 * @see LuaSandbox::getMemoryUsage() * @see LuaSandbox::getCPUUsage() * @see LuaSandbox::setMemoryLimit() */ public function getMemoryUsage() {} /** * Fetch the peak memory usage of the Lua environment. * * @link https://www.php.net/manual/en/luasandbox.getpeakmemoryusage.php * @return int

Returns the current memory usage in bytes.

* @since luasandbox >= 1.0.0 * @see LuaSandbox::getMemoryUsage() * @see LuaSandbox::getCPUUsage() * @see LuaSandbox::setMemoryLimit() */ public function getPeakMemoryUsage() {} /** * Fetch profiler data. * *

For a profiling instance previously started by LuaSandbox::enableProfiler(), * get a report of the cost of each function.

* *

The measurement unit used for the cost is determined by the $units parameter:

*
  • LuaSandbox::SAMPLES Measure in number of samples.
  • *
  • LuaSandbox::SECONDS Measure in seconds of CPU time.
  • *
  • LuaSandbox::PERCENT Measure percentage of CPU time.
  • * *

    Note: On Windows, this function always returns an empty array. * On operating systems that do not support CLOCK_THREAD_CPUTIME_ID, * such as FreeBSD and Mac OS X, this function will report the * elapsed wall-clock time, not CPU time.

    * * @link https://www.php.net/manual/en/luasandbox.getprofilerfunctionreport.php * @param int $units Measurement unit constant. * @return array

    Returns profiler measurements, sorted in descending order, as an associative array. * Keys are the Lua function names (with source file and line defined in angle brackets), values are the * measurements as integer or float.

    * @since luasandbox >= 1.1.0 * @see LuaSandbox::SAMPLES * @see LuaSandbox::SECONDS * @see LuaSandbox::PERCENT */ public function getProfilerFunctionReport($units = LuaSandbox::SECONDS) {} /** * Return the versions of LuaSandbox and Lua. * * @link https://www.php.net/manual/en/luasandbox.getversioninfo.php * @return array

    Returns an array with two keys:

    *
  • LuaSandbox (string), the version of the LuaSandbox extension.
  • *
  • Lua (string), the library name and version as defined by the LUA_RELEASE macro, for example, "Lua 5.1.5".
  • * @since luasandbox >= 1.6.0 */ public static function getVersionInfo() {} /** * Load a precompiled binary chunk into the Lua environment. * *

    Loads data generated by LuaSandboxFunction::dump().

    * * @link https://www.php.net/manual/en/luasandbox.loadbinary.php * @param string $code

    Data from LuaSandboxFunction::dump().

    * @param string $chunkName [optional]

    Name for the loaded function.

    * @return LuaSandboxFunction * @since luasandbox >= 1.0.0 * @see LuaSandbox::loadString() */ public function loadBinary($code, $chunkName = '') {} /** * Load Lua code into the Lua environment. * *

    This is the equivalent of standard Lua's loadstring() function.

    * * @link https://www.php.net/manual/en/luasandbox.loadString.php * @param string $code

    Lua code.

    * @param string $chunkName [optional]

    Name for the loaded chunk, for use in error traces.

    * @return LuaSandboxFunction

    Returns a LuaSandboxFunction which, when executed, * will execute the passed $code.

    * @since luasandbox >= 1.0.0 * @see LuaSandbox::registerLibrary() * @see LuaSandbox::wrapPhpFunction() */ public function loadString($code, $chunkName = '') {} /** * Pause the CPU usage timer. * *

    This only has effect when called from within a callback from Lua. * When execution returns to Lua, the timer will be automatically unpaused. * If a new call into Lua is made, the timer will be unpaused * for the duration of that call.

    * *

    If a PHP callback calls into Lua again with timer not paused, * and then that Lua function calls into PHP again, * the second PHP call will not be able to pause the timer. * The logic is that even though the second PHP call would * avoid counting the CPU usage against the limit, * the first call still counts it.

    * * @link https://www.php.net/manual/en/luasandbox.pauseusagetimer.php * @return bool

    Returns a boolean indicating whether the timer is now paused.

    * @since luasandbox >= 1.4.0 * @see LuaSandbox::setCPULimit() * @see LuaSandbox::unpauseUsageTimer() */ public function pauseUsageTimer() {} /** * Register a set of PHP functions as a Lua library. * *

    Registers a set of PHP functions as a Lua library, * so that Lua can call the relevant PHP code.

    * *

    For more information about calling Lua functions and the return values, * see LuaSandboxFunction::call().

    * * @link https://www.php.net/manual/en/luasandbox.registerlibrary.php * @param string $libname

    The name of the library. * In the Lua state, the global variable of this name will be set to the table of functions. * If the table already exists, the new functions will be added to it.

    * @param array $functions

    Returns an array, where each key is a function name, * and each value is a corresponding PHP callable.

    * @since luasandbox >= 1.0.0 * @see LuaSandbox::loadString() * @see LuaSandbox::wrapPhpFunction() */ public function registerLibrary($libname, $functions) {} /** * Set the CPU time limit for the Lua environment. * *

    If the total user and system time used by the environment after the call * to this method exceeds this limit, a LuaSandboxTimeoutError exception is thrown.

    * *

    Time used in PHP callbacks is included in the limit.

    * *

    Setting the time limit from a callback while Lua is running causes the timer to be reset, * or started if it was not already running.

    * *

    Note: On Windows, the CPU limit will be ignored. On operating systems * that do not support CLOCK_THREAD_CPUTIME_ID, such as FreeBSD and * Mac OS X, wall-clock time rather than CPU time will be limited.

    * * @link https://www.php.net/manual/en/luasandbox.setcpulimit.php * @param bool|float $limit

    Limit as a float in seconds, or false for no limit.

    * @since luasandbox >= 1.0.0 * @see LuaSandbox::getCPUUsage() * @see LuaSandbox::setMemoryLimit() */ public function setCPULimit($limit) {} /** * Set the memory limit for the Lua environment. * * @link https://www.php.net/manual/en/luasandbox.setmemorylimit.php * @param int $limit

    Memory limit in bytes.

    * @throws LuaSandboxMemoryError

    Exception is thrown if this limit is exceeded.

    * @since luasandbox >= 1.0.0 * @see LuaSandbox::getMemoryUsage() * @see LuaSandbox::getPeakMemoryUsage() * @see LuaSandbox::setCPULimit() */ public function setMemoryLimit($limit) {} /** * Unpause the timer paused by LuaSandbox::pauseUsageTimer(). * * @link https://www.php.net/manual/en/luasandbox.unpauseusagetimer.php * @since luasandbox >= 1.0.0 * @see LuaSandbox::setCPULimit() * @see LuaSandbox::unpauseUsageTimer() */ public function unpauseUsageTimer() {} /** * Wrap a PHP callable in a LuaSandboxFunction. * *

    Wraps a PHP callable in a LuaSandboxFunction, * so it can be passed into Lua as an anonymous function.

    * *

    The function must return either an array of values (which may be empty), * or NULL which is equivalent to returning the empty array.

    * *

    Exceptions will be raised as errors in Lua, however only LuaSandboxRuntimeError * exceptions may be caught inside Lua with pcall() or xpcall().

    * *

    For more information about calling Lua functions and the return values, * see LuaSandboxFunction::call().

    * * @link https://www.php.net/manual/en/luasandbox.wrapPhpFunction.php * @param callable $function

    Callable to wrap.

    * @return LuaSandboxFunction * @since luasandbox >= 1.2.0 * @see LuaSandbox::loadString() * @see LuaSandbox::registerLibrary() */ public function wrapPhpFunction($function) {} } /** * Represents a Lua function, allowing it to be called from PHP. * *

    A LuaSandboxFunction may be obtained as a return value from Lua, * as a parameter passed to a callback from Lua, * or by using LuaSandbox::wrapPhpFunction(), LuaSandbox::loadString(), * or LuaSandbox::loadBinary().

    * * @since luasandbox >= 1.0.0 */ class LuaSandboxFunction { /** * Call a Lua function. * *

    Errors considered to be the fault of the PHP code will result in the * function returning false and E_WARNING being raised, for example, * a resource type being used as an argument. Lua errors will result * in a LuaSandboxRuntimeError exception being thrown.

    * *

    PHP and Lua types are converted as follows:

    *
      *
    • PHP NULL is Lua nil, and vice versa.
    • *
    • PHP integers and floats are converted to Lua numbers. Infinity and NAN are supported.
    • *
    • Lua numbers without a fractional part between approximately -2**53 and 2**53 are * converted to PHP integers, with others being converted to PHP floats.
    • *
    • PHP booleans are Lua booleans, and vice versa.
    • *
    • PHP strings are Lua strings, and vice versa.
    • *
    • Lua functions are PHP LuaSandboxFunction objects, and vice versa. * General PHP callables are not supported.
    • *
    • PHP arrays are converted to Lua tables, and vice versa.
    • *
        *
      • Note that Lua typically indexes arrays from 1, while PHP indexes arrays from 0. * No adjustment is made for these differing conventions.
      • *
      • Self-referential arrays are not supported in either direction.
      • *
      • PHP references are dereferenced.
      • *
      • Lua __pairs and __ipairs are processed. __index is ignored.
      • *
      • When converting from PHP to Lua, integer keys between -2**53 and 2**53 are represented as Lua numbers. * All other keys are represented as Lua strings.
      • *
      • When converting from Lua to PHP, keys other than strings and numbers will result in an error, * as will collisions when converting numbers to strings or vice versa * (since PHP considers things like $a[0] and $a["0"] as being equivalent).
      • *
      *
    • All other types are unsupported and will raise an error/exception, * including general PHP objects and Lua userdata and thread types.
    • *
    * *

    Lua functions inherently return a list of results. So on success, * this method returns an array containing all of the values returned by Lua, * with integer keys starting from zero. * Lua may return no results, in which case an empty array is returned.

    * * @link https://www.php.net/manual/en/luasandboxfunction.call.php * @param string[] $arguments

    Arguments passed to the function.

    * @return array|bool

    Returns an array of values returned by the function, * which may be empty, or false on error.

    * @since luasandbox >= 1.0.0 */ public function call($arguments) {} /** * Dump the function as a binary blob. * * @link https://www.php.net/manual/en/luasandboxfunction.dump.php * @return string

    Returns a string that may be passed to LuaSandbox::loadBinary().

    * @since luasandbox >= 1.0.0 */ public function dump() {} } /** * Base class for LuaSandbox exceptions. * * @since luasandbox >= 1.0.0 */ class LuaSandboxError extends Exception { public const RUN = 2; public const SYNTAX = 3; public const MEM = 4; public const ERR = 5; } /** * Catchable LuaSandbox runtime exceptions. * *

    These may be caught inside Lua using pcall() or xpcall().

    * * @since luasandbox >= 1.0.0 */ class LuaSandboxRuntimeError extends LuaSandboxError {} /** * Uncatchable LuaSandbox exceptions. * *

    These may not be caught inside Lua using pcall() or xpcall().

    * * @since luasandbox >= 1.0.0 */ class LuaSandboxFatalError extends LuaSandboxError {} /** * Exception thrown when Lua encounters an error inside an error handler. * * @since luasandbox >= 1.0.0 */ class LuaSandboxErrorError extends LuaSandboxFatalError {} /** * Exception thrown when Lua cannot allocate memory. * * @since luasandbox >= 1.0.0 * @see LuaSandbox::setMemoryLimit() */ class LuaSandboxMemoryError extends LuaSandboxFatalError {} /** * Exception thrown when Lua code cannot be parsed. * * @since luasandbox >= 1.0.0 */ class LuaSandboxSyntaxError extends LuaSandboxFatalError {} /** * Exception thrown when the configured CPU time limit is exceeded. * * @since luasandbox >= 1.0.0 * @see LuaSandbox::setCPULimit() */ class LuaSandboxTimeoutError extends LuaSandboxFatalError {} * Returns the value of the specified configuration option for the tidy document * @link https://php.net/manual/en/tidy.getopt.php * @param string $option

    * You will find a list with each configuration option and their types * at: http://tidy.sourceforge.net/docs/quickref.html. *

    * @return string|int|bool the value of the specified option. * The return type depends on the type of the specified one. */ #[TentativeType] public function getOpt(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $option): string|int|bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Execute configured cleanup and repair operations on parsed markup * @link https://php.net/manual/en/tidy.cleanrepair.php * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function cleanRepair(): bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Parse markup in file or URI * @link https://php.net/manual/en/tidy.parsefile.php * @param string $filename

    * If the filename parameter is given, this function * will also read that file and initialize the object with the file, * acting like tidy_parse_file. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * For an explanation about each option, see * http://tidy.sourceforge.net/docs/quickref.html. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @param bool $useIncludePath [optional]

    * Search for the file in the include_path. *

    * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function parseFile( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $filename, #[LanguageLevelTypeAware(['8.0' => 'array|string|null'], default: '')] $config = null, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null, #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $useIncludePath = false ): bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Parse a document stored in a string * @link https://php.net/manual/en/tidy.parsestring.php * @param string $string

    * The data to be parsed. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @return bool a new tidy instance. */ #[TentativeType] public function parseString( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $string, #[LanguageLevelTypeAware(['8.0' => 'array|string|null'], default: '')] $config = null, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null ): bool {} /** * (PHP 5, PECL tidy >= 0.7.0)
    * Repair a string using an optionally provided configuration file * @link https://php.net/manual/en/tidy.repairstring.php * @param string $string

    * The data to be repaired. *

    * @param array|string|null $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * Check http://tidy.sourceforge.net/docs/quickref.html for * an explanation about each option. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @return string|false the repaired string. */ #[TentativeType] public static function repairString( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $string, #[LanguageLevelTypeAware(['8.0' => 'array|string|null'], default: '')] $config = null, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null ): string|false {} /** * (PHP 5, PECL tidy >= 0.7.0)
    * Repair a file and return it as a string * @link https://php.net/manual/en/tidy.repairfile.php * @param string $filename

    * The file to be repaired. *

    * @param array|string|null $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * Check http://tidy.sourceforge.net/docs/quickref.html for an * explanation about each option. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @param bool $useIncludePath [optional]

    * Search for the file in the include_path. *

    * @return string|false the repaired contents as a string. */ #[TentativeType] public static function repairFile( #[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $filename, #[LanguageLevelTypeAware(['8.0' => 'array|string|null'], default: '')] $config = null, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null, #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $useIncludePath = false ): string|false {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Run configured diagnostics on parsed and repaired markup * @link https://php.net/manual/en/tidy.diagnose.php * @return bool TRUE on success or FALSE on failure. */ #[TentativeType] public function diagnose(): bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Get release date (version) for Tidy library * @link https://php.net/manual/en/tidy.getrelease.php * @return string a string with the release date of the Tidy library. */ #[TentativeType] public function getRelease(): string {} /** * (PHP 5, PECL tidy >= 0.7.0)
    * Get current Tidy configuration * @link https://php.net/manual/en/tidy.getconfig.php * @return array an array of configuration options. *

    *

    * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. */ #[TentativeType] public function getConfig(): array {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Get status of specified document * @link https://php.net/manual/en/tidy.getstatus.php * @return int 0 if no error/warning was raised, 1 for warnings or accessibility * errors, or 2 for errors. */ #[TentativeType] public function getStatus(): int {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Get the Detected HTML version for the specified document * @link https://php.net/manual/en/tidy.gethtmlver.php * @return int the detected HTML version. *

    *

    * This function is not yet implemented in the Tidylib itself, so it always * return 0. */ #[TentativeType] public function getHtmlVer(): int {} /** * Returns the documentation for the given option name * @link https://php.net/manual/en/tidy.getoptdoc.php * @param string $option

    * The option name *

    * @return string|false a string if the option exists and has documentation available, or * FALSE otherwise. */ #[TentativeType] public function getOptDoc(#[LanguageLevelTypeAware(['8.0' => 'string'], default: '')] $option): string|false {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Indicates if the document is a XHTML document * @link https://php.net/manual/en/tidy.isxhtml.php * @return bool This function returns TRUE if the specified tidy * object is a XHTML document, or FALSE otherwise. *

    *

    * This function is not yet implemented in the Tidylib itself, so it always * return FALSE. */ #[TentativeType] public function isXhtml(): bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Indicates if the document is a generic (non HTML/XHTML) XML document * @link https://php.net/manual/en/tidy.isxml.php * @return bool This function returns TRUE if the specified tidy * object is a generic XML document (non HTML/XHTML), * or FALSE otherwise. *

    *

    * This function is not yet implemented in the Tidylib itself, so it always * return FALSE. */ #[TentativeType] public function isXml(): bool {} /** * (PHP 5, PECL tidy 0.5.2-1.0.0)
    * Returns a tidyNode object representing the root of the tidy parse tree * @link https://php.net/manual/en/tidy.root.php * @return tidyNode|null the tidyNode object. */ #[TentativeType] public function root(): ?tidyNode {} /** * (PHP 5, PECL tidy 0.5.2-1.0.0)
    * Returns a tidyNode object starting from the <head> tag of the tidy parse tree * @link https://php.net/manual/en/tidy.head.php * @return tidyNode|null the tidyNode object. */ #[TentativeType] public function head(): ?tidyNode {} /** * (PHP 5, PECL tidy 0.5.2-1.0.0)
    * Returns a tidyNode object starting from the <html> tag of the tidy parse tree * @link https://php.net/manual/en/tidy.html.php * @return tidyNode|null the tidyNode object. */ #[TentativeType] public function html(): ?tidyNode {} /** * (PHP 5, PECL tidy 0.5.2-1.0)
    * Returns a tidyNode object starting from the <body> tag of the tidy parse tree * @link https://php.net/manual/en/tidy.body.php * @return tidyNode|null a tidyNode object starting from the * <body> tag of the tidy parse tree. */ #[TentativeType] public function body(): ?tidyNode {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Constructs a new tidy object * @link https://php.net/manual/en/tidy.construct.php * @param string $filename [optional]

    * If the filename parameter is given, this function * will also read that file and initialize the object with the file, * acting like tidy_parse_file. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @param bool $useIncludePath [optional]

    * Search for the file in the include_path. *

    */ public function __construct( #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $filename = null, #[LanguageLevelTypeAware(['8.0' => 'array|string|null'], default: '')] $config = null, #[LanguageLevelTypeAware(['8.0' => 'string|null'], default: '')] $encoding = null, #[LanguageLevelTypeAware(['8.0' => 'bool'], default: '')] $useIncludePath = null ) {} } /** * An HTML node in an HTML file, as detected by tidy. * @link https://php.net/manual/en/class.tidynode.php */ final class tidyNode { /** *

    The HTML representation of the node, including the surrounding tags.

    * @var string */ public readonly string $value; /** *

    The name of the HTML node

    * @var string */ public readonly string $name; /** *

    The type of the tag (one of the constants above, e.g. TIDY_NODETYPE_PHP)

    * @var int */ public readonly int $type; /** *

    The line number at which the tags is located in the file

    * @var int */ public readonly int $line; /** *

    The column number at which the tags is located in the file

    * @var int */ public readonly int $column; /** *

    Indicates if the node is a proprietary tag

    * @var bool */ public readonly bool $proprietary; /** *

    The ID of the tag (one of the constants above, e.g. TIDY_TAG_FRAME)

    * @var int|null */ public readonly ?int $id; /** *

    * An array of string, representing * the attributes names (as keys) of the current node. *

    * @var array|null */ public readonly ?array $attribute; /** *

    * An array of tidyNode, representing * the children of the current node. *

    * @var array|null */ public readonly ?array $child; /** * Checks if a node has children * @link https://php.net/manual/en/tidynode.haschildren.php * @return bool TRUE if the node has children, FALSE otherwise. * @since 5.0.1 */ public function hasChildren():bool {} /** * Checks if a node has siblings * @link https://php.net/manual/en/tidynode.hassiblings.php * @return bool TRUE if the node has siblings, FALSE otherwise. * @since 5.0.1 */ public function hasSiblings(): bool {} /** * Checks if a node represents a comment * @link https://php.net/manual/en/tidynode.iscomment.php * @return bool TRUE if the node is a comment, FALSE otherwise. * @since 5.0.1 */ public function isComment():bool {} /** * Checks if a node is part of a HTML document * @link https://php.net/manual/en/tidynode.ishtml.php * @return bool TRUE if the node is part of a HTML document, FALSE otherwise. * @since 5.0.1 */ public function isHtml(): bool {} /** * Checks if a node represents text (no markup) * @link https://php.net/manual/en/tidynode.istext.php * @return bool TRUE if the node represent a text, FALSE otherwise. * @since 5.0.1 */ public function isText(): bool {} /** * Checks if this node is JSTE * @link https://php.net/manual/en/tidynode.isjste.php * @return bool TRUE if the node is JSTE, FALSE otherwise. * @since 5.0.1 */ public function isJste(): bool {} /** * Checks if this node is ASP * @link https://php.net/manual/en/tidynode.isasp.php * @return bool TRUE if the node is ASP, FALSE otherwise. * @since 5.0.1 */ public function isAsp(): bool {} /** * Checks if a node is PHP * @link https://php.net/manual/en/tidynode.isphp.php * @return bool TRUE if the current node is PHP code, FALSE otherwise. * @since 5.0.1 */ public function isPhp(): bool {} /** * Returns the parent node of the current node * @link https://php.net/manual/en/tidynode.getparent.php * @return tidyNode|null a tidyNode if the node has a parent, or NULL * otherwise. * @since 5.2.2 */ public function getParent(): ?tidyNode {} private function __construct() {} } /** * (PHP 5, PECL tidy >= 0.5.2)
    * Returns the value of the specified configuration option for the tidy document * @link https://php.net/manual/en/tidy.getopt.php * @param tidy $tidy

    * The Tidy object. *

    * @param string $option

    * You will find a list with each configuration option and their types * at: http://tidy.sourceforge.net/docs/quickref.html. *

    * @return string|int|bool the value of the specified option. * The return type depends on the type of the specified one. */ function tidy_getopt(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy, string $option):string|int|bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Parse a document stored in a string * @link https://php.net/manual/en/tidy.parsestring.php * @param string $string

    * The data to be parsed. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @return tidy|false a new tidy instance. */ function tidy_parse_string(string $string, array|string|null $config = null, null|string $encoding = null):tidy|false {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Parse markup in file or URI * @link https://php.net/manual/en/tidy.parsefile.php * @param string $filename

    * If the filename parameter is given, this function * will also read that file and initialize the object with the file, * acting like tidy_parse_file. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * For an explanation about each option, see * http://tidy.sourceforge.net/docs/quickref.html. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @param bool $useIncludePath [optional]

    * Search for the file in the include_path. *

    * @return tidy|false a new tidy instance. */ function tidy_parse_file(string $filename, array|string|null $config = null, null|string $encoding = null, bool $useIncludePath = false):tidy|false {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Return a string representing the parsed tidy markup * @link https://php.net/manual/en/function.tidy-get-output.php * @param tidy $tidy

    * The Tidy object. *

    * @return string the parsed tidy markup. */ function tidy_get_output(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):string {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Return warnings and errors which occurred parsing the specified document * @link https://php.net/manual/en/tidy.props.errorbuffer.php * @param tidy $tidy

    * The Tidy object. *

    * @return string|false the error buffer as a string. */ function tidy_get_error_buffer(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):string|false {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Execute configured cleanup and repair operations on parsed markup * @link https://php.net/manual/en/tidy.cleanrepair.php * @param tidy $tidy The Tidy object. * @return bool TRUE on success or FALSE on failure. */ function tidy_clean_repair(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):bool {} /** * (PHP 5, PECL tidy >= 0.7.0)
    * Repair a string using an optionally provided configuration file * @link https://php.net/manual/en/tidy.repairstring.php * @param string $string

    * The data to be repaired. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * Check http://tidy.sourceforge.net/docs/quickref.html for * an explanation about each option. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @return string|false the repaired string. */ function tidy_repair_string(string $string, array|string|null $config = null, null|string $encoding = null):string|false {} /** * (PHP 5, PECL tidy >= 0.7.0)
    * Repair a file and return it as a string * @link https://php.net/manual/en/tidy.repairfile.php * @param string $filename

    * The file to be repaired. *

    * @param mixed $config [optional]

    * The config config can be passed either as an * array or as a string. If a string is passed, it is interpreted as the * name of the configuration file, otherwise, it is interpreted as the * options themselves. *

    *

    * Check http://tidy.sourceforge.net/docs/quickref.html for an * explanation about each option. *

    * @param string|null $encoding [optional]

    * The encoding parameter sets the encoding for * input/output documents. The possible values for encoding are: * ascii, latin0, latin1, * raw, utf8, iso2022, * mac, win1252, ibm858, * utf16, utf16le, utf16be, * big5, and shiftjis. *

    * @param bool $useIncludePath [optional]

    * Search for the file in the include_path. *

    * @return string|false the repaired contents as a string. */ function tidy_repair_file(string $filename, array|string|null $config = null, null|string $encoding = null, bool $useIncludePath = false):string|false {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Run configured diagnostics on parsed and repaired markup * @link https://php.net/manual/en/tidy.diagnose.php * @param tidy $tidy

    * The Tidy object. *

    * @return bool TRUE on success or FALSE on failure. */ function tidy_diagnose(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Get release date (version) for Tidy library * @link https://php.net/manual/en/tidy.getrelease.php * @return string a string with the release date of the Tidy library. */ function tidy_get_release():string {} /** * (PHP 5, PECL tidy >= 0.7.0)
    * Get current Tidy configuration * @link https://php.net/manual/en/tidy.getconfig.php * @param tidy $tidy

    * The Tidy object. *

    * @return array an array of configuration options. *

    * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. *

    */ function tidy_get_config(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):array {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Get status of specified document * @link https://php.net/manual/en/tidy.getstatus.php * @param tidy $tidy

    * The Tidy object. *

    * @return int 0 if no error/warning was raised, 1 for warnings or accessibility * errors, or 2 for errors. */ function tidy_get_status(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):int {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Get the Detected HTML version for the specified document * @link https://php.net/manual/en/tidy.gethtmlver.php * @param tidy $tidy

    * The Tidy object. *

    * @return int the detected HTML version. *

    * This function is not yet implemented in the Tidylib itself, so it always * return 0. *

    */ function tidy_get_html_ver(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):int {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Indicates if the document is a XHTML document * @link https://php.net/manual/en/tidy.isxhtml.php * @param tidy $tidy

    * The Tidy object. *

    * @return bool This function returns TRUE if the specified tidy * object is a XHTML document, or FALSE otherwise. *

    *

    * This function is not yet implemented in the Tidylib itself, so it always * return FALSE. */ function tidy_is_xhtml(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Indicates if the document is a generic (non HTML/XHTML) XML document * @link https://php.net/manual/en/tidy.isxml.php * @param tidy $tidy

    * The Tidy object. *

    * @return bool This function returns TRUE if the specified tidy * object is a generic XML document (non HTML/XHTML), * or FALSE otherwise. *

    *

    * This function is not yet implemented in the Tidylib itself, so it always * return FALSE. */ function tidy_is_xml(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):bool {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Returns the Number of Tidy errors encountered for specified document * @link https://php.net/manual/en/function.tidy-error-count.php * @param tidy $tidy

    * The Tidy object. *

    * @return int the number of errors. */ function tidy_error_count(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy): int {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Returns the Number of Tidy warnings encountered for specified document * @link https://php.net/manual/en/function.tidy-warning-count.php * @param tidy $tidy

    * The Tidy object. *

    * @return int the number of warnings. */ function tidy_warning_count(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):int {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Returns the Number of Tidy accessibility warnings encountered for specified document * @link https://php.net/manual/en/function.tidy-access-count.php * @param tidy $tidy

    * The Tidy object. *

    * @return int the number of warnings. */ function tidy_access_count(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy): int {} /** * (PHP 5, PECL tidy >= 0.5.2)
    * Returns the Number of Tidy configuration errors encountered for specified document * @link https://php.net/manual/en/function.tidy-config-count.php * @param tidy $tidy

    * The Tidy object. *

    * @return int the number of errors. */ function tidy_config_count(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):int {} /** * Returns the documentation for the given option name * @link https://php.net/manual/en/tidy.getoptdoc.php * @param tidy $tidy

    * The Tidy object. *

    * @param string $option

    * The option name *

    * @return string|false a string if the option exists and has documentation available, or * FALSE otherwise. */ function tidy_get_opt_doc(tidy $tidy, string $option):string|false {} /** * (PHP 5, PECL tidy 0.5.2-1.0.0)
    * Returns a tidyNode object representing the root of the tidy parse tree * @link https://php.net/manual/en/tidy.root.php * @param tidy $tidy

    * The Tidy object. *

    * @return tidyNode|null the tidyNode object. */ function tidy_get_root(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):?tidyNode {} /** * (PHP 5, PECL tidy 0.5.2-1.0.0)
    * Returns a tidyNode object starting from the <head> tag of the tidy parse tree * @link https://php.net/manual/en/tidy.head.php * @param tidy $tidy

    * The Tidy object. *

    * @return tidyNode|null the tidyNode object. */ function tidy_get_head(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):?tidyNode {} /** * (PHP 5, PECL tidy 0.5.2-1.0.0)
    * Returns a tidyNode object starting from the <html> tag of the tidy parse tree * @link https://php.net/manual/en/tidy.html.php * @param tidy $tidy

    * The Tidy object. *

    * @return tidyNode|null the tidyNode object. */ function tidy_get_html(#[PhpStormStubsElementAvailable(from: '8.0')] tidy $tidy):?tidyNode {} /** * (PHP 5, PECL tidy 0.5.2-1.0)
    * Returns a tidyNode object starting from the <body> tag of the tidy parse tree * @link https://php.net/manual/en/tidy.body.php * @param tidy $tidy

    * The Tidy object. *

    * @return tidyNode|null a tidyNode object starting from the * <body> tag of the tidy parse tree. */ function tidy_get_body(tidy $tidy): ?tidyNode {} /** * ob_start callback function to repair the buffer * @link https://php.net/manual/en/function.ob-tidyhandler.php * @param string $input

    * The buffer. *

    * @param int $mode [optional]

    * The buffer mode. *

    * @return string the modified buffer. */ function ob_tidyhandler($input, $mode = null) {} /** * description * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_TAG_UNKNOWN', 0); define('TIDY_TAG_A', 1); define('TIDY_TAG_ABBR', 2); define('TIDY_TAG_ACRONYM', 3); define('TIDY_TAG_ADDRESS', 4); define('TIDY_TAG_ALIGN', 5); define('TIDY_TAG_APPLET', 6); define('TIDY_TAG_AREA', 7); define('TIDY_TAG_B', 8); define('TIDY_TAG_BASE', 9); define('TIDY_TAG_BASEFONT', 10); define('TIDY_TAG_BDO', 11); define('TIDY_TAG_BGSOUND', 12); define('TIDY_TAG_BIG', 13); define('TIDY_TAG_BLINK', 14); define('TIDY_TAG_BLOCKQUOTE', 15); define('TIDY_TAG_BODY', 16); define('TIDY_TAG_BR', 17); define('TIDY_TAG_BUTTON', 18); define('TIDY_TAG_CAPTION', 19); define('TIDY_TAG_CENTER', 20); define('TIDY_TAG_CITE', 21); define('TIDY_TAG_CODE', 22); define('TIDY_TAG_COL', 23); define('TIDY_TAG_COLGROUP', 24); define('TIDY_TAG_COMMENT', 25); define('TIDY_TAG_DD', 26); define('TIDY_TAG_DEL', 27); define('TIDY_TAG_DFN', 28); define('TIDY_TAG_DIR', 29); define('TIDY_TAG_DIV', 30); define('TIDY_TAG_DL', 31); define('TIDY_TAG_DT', 32); define('TIDY_TAG_EM', 33); define('TIDY_TAG_EMBED', 34); define('TIDY_TAG_FIELDSET', 35); define('TIDY_TAG_FONT', 36); define('TIDY_TAG_FORM', 37); define('TIDY_TAG_FRAME', 38); define('TIDY_TAG_FRAMESET', 39); define('TIDY_TAG_H1', 40); define('TIDY_TAG_H2', 41); define('TIDY_TAG_H3', 42); define('TIDY_TAG_H4', 43); define('TIDY_TAG_H5', 44); define('TIDY_TAG_H6', 45); define('TIDY_TAG_HEAD', 46); define('TIDY_TAG_HR', 47); define('TIDY_TAG_HTML', 48); define('TIDY_TAG_I', 49); define('TIDY_TAG_IFRAME', 50); define('TIDY_TAG_ILAYER', 51); define('TIDY_TAG_IMG', 52); define('TIDY_TAG_INPUT', 53); define('TIDY_TAG_INS', 54); define('TIDY_TAG_ISINDEX', 55); define('TIDY_TAG_KBD', 56); define('TIDY_TAG_KEYGEN', 57); define('TIDY_TAG_LABEL', 58); define('TIDY_TAG_LAYER', 59); define('TIDY_TAG_LEGEND', 60); define('TIDY_TAG_LI', 61); define('TIDY_TAG_LINK', 62); define('TIDY_TAG_LISTING', 63); define('TIDY_TAG_MAP', 64); define('TIDY_TAG_MARQUEE', 65); define('TIDY_TAG_MENU', 66); define('TIDY_TAG_META', 67); define('TIDY_TAG_MULTICOL', 68); define('TIDY_TAG_NOBR', 69); define('TIDY_TAG_NOEMBED', 70); define('TIDY_TAG_NOFRAMES', 71); define('TIDY_TAG_NOLAYER', 72); define('TIDY_TAG_NOSAVE', 73); define('TIDY_TAG_NOSCRIPT', 74); define('TIDY_TAG_OBJECT', 75); define('TIDY_TAG_OL', 76); define('TIDY_TAG_OPTGROUP', 77); define('TIDY_TAG_OPTION', 78); define('TIDY_TAG_P', 79); define('TIDY_TAG_PARAM', 80); define('TIDY_TAG_PLAINTEXT', 81); define('TIDY_TAG_PRE', 82); define('TIDY_TAG_Q', 83); define('TIDY_TAG_RB', 84); define('TIDY_TAG_RBC', 85); define('TIDY_TAG_RP', 86); define('TIDY_TAG_RT', 87); define('TIDY_TAG_RTC', 88); define('TIDY_TAG_RUBY', 89); define('TIDY_TAG_S', 90); define('TIDY_TAG_SAMP', 91); define('TIDY_TAG_SCRIPT', 92); define('TIDY_TAG_SELECT', 93); define('TIDY_TAG_SERVER', 94); define('TIDY_TAG_SERVLET', 95); define('TIDY_TAG_SMALL', 96); define('TIDY_TAG_SPACER', 97); define('TIDY_TAG_SPAN', 98); define('TIDY_TAG_STRIKE', 99); define('TIDY_TAG_STRONG', 100); define('TIDY_TAG_STYLE', 101); define('TIDY_TAG_SUB', 102); define('TIDY_TAG_SUP', 103); define('TIDY_TAG_TABLE', 104); define('TIDY_TAG_TBODY', 105); define('TIDY_TAG_TD', 106); define('TIDY_TAG_TEXTAREA', 107); define('TIDY_TAG_TFOOT', 108); define('TIDY_TAG_TH', 109); define('TIDY_TAG_THEAD', 110); define('TIDY_TAG_TITLE', 111); define('TIDY_TAG_TR', 112); define('TIDY_TAG_TT', 113); define('TIDY_TAG_U', 114); define('TIDY_TAG_UL', 115); define('TIDY_TAG_VAR', 116); define('TIDY_TAG_WBR', 117); define('TIDY_TAG_XMP', 118); /** * @since 7.4 */ define('TIDY_TAG_ARTICLE', 123); /** * @since 7.4 */ define('TIDY_TAG_ASIDE', 124); /** * @since 7.4 */ define('TIDY_TAG_AUDIO', 125); /** * @since 7.4 */ define('TIDY_TAG_BDI', 126); /** * @since 7.4 */ define('TIDY_TAG_CANVAS', 127); /** * @since 7.4 */ define('TIDY_TAG_COMMAND', 128); /** * @since 7.4 */ define('TIDY_TAG_DATALIST', 129); /** * @since 7.4 */ define('TIDY_TAG_DETAILS', 130); /** * @since 7.4 */ define('TIDY_TAG_DIALOG', 131); /** * @since 7.4 */ define('TIDY_TAG_FIGCAPTION', 132); /** * @since 7.4 */ define('TIDY_TAG_FIGURE', 133); /** * @since 7.4 */ define('TIDY_TAG_FOOTER', 134); /** * @since 7.4 */ define('TIDY_TAG_HEADER', 135); /** * @since 7.4 */ define('TIDY_TAG_HGROUP', 136); /** * @since 7.4 */ define('TIDY_TAG_MAIN', 137); /** * @since 7.4 */ define('TIDY_TAG_MARK', 138); /** * @since 7.4 */ define('TIDY_TAG_MENUITEM', 139); /** * @since 7.4 */ define('TIDY_TAG_METER', 140); /** * @since 7.4 */ define('TIDY_TAG_NAV', 141); /** * @since 7.4 */ define('TIDY_TAG_OUTPUT', 142); /** * @since 7.4 */ define('TIDY_TAG_PROGRESS', 143); /** * @since 7.4 */ define('TIDY_TAG_SECTION', 144); /** * @since 7.4 */ define('TIDY_TAG_SOURCE', 145); /** * @since 7.4 */ define('TIDY_TAG_SUMMARY', 146); /** * @since 7.4 */ define('TIDY_TAG_TEMPLATE', 147); /** * @since 7.4 */ define('TIDY_TAG_TIME', 148); /** * @since 7.4 */ define('TIDY_TAG_TRACK', 149); /** * @since 7.4 */ define('TIDY_TAG_VIDEO', 150); /** * root node * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_ROOT', 0); /** * doctype * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_DOCTYPE', 1); /** * HTML comment * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_COMMENT', 2); /** * Processing Instruction * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_PROCINS', 3); /** * Text * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_TEXT', 4); /** * start tag * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_START', 5); /** * end tag * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_END', 6); /** * empty tag * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_STARTEND', 7); /** * CDATA * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_CDATA', 8); /** * XML section * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_SECTION', 9); /** * ASP code * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_ASP', 10); /** * JSTE code * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_JSTE', 11); /** * PHP code * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_PHP', 12); /** * XML declaration * @link https://php.net/manual/en/tidy.constants.php */ define('TIDY_NODETYPE_XMLDECL', 13); // End of tidy v.2.0 'amqp/amqp.stub', 'AMQPChannel' => 'amqp/amqp.stub', 'AMQPChannelException' => 'amqp/amqp.stub', 'AMQPConnection' => 'amqp/amqp.stub', 'AMQPConnectionException' => 'amqp/amqp.stub', 'AMQPDecimal' => 'amqp/amqp.stub', 'AMQPEnvelope' => 'amqp/amqp.stub', 'AMQPEnvelopeException' => 'amqp/amqp.stub', 'AMQPException' => 'amqp/amqp.stub', 'AMQPExchange' => 'amqp/amqp.stub', 'AMQPExchangeException' => 'amqp/amqp.stub', 'AMQPExchangeValue' => 'amqp/amqp.stub', 'AMQPQueue' => 'amqp/amqp.stub', 'AMQPQueueException' => 'amqp/amqp.stub', 'AMQPTimestamp' => 'amqp/amqp.stub', 'AMQPValue' => 'amqp/amqp.stub', 'AMQPValueException' => 'amqp/amqp.stub', 'APCIterator' => 'apcu/apcu.stub', 'APCUIterator' => 'apcu/apcu.stub', 'AddressInfo' => 'sockets/sockets.stub', 'Aerospike' => 'aerospike/aerospike.stub', 'Aerospike\\Bytes' => 'aerospike/Bytes.stub', 'AllowDynamicProperties' => 'Core/Core_c.stub', 'AppendIterator' => 'SPL/SPL.stub', 'ArgumentCountError' => 'Core/Core_c.stub', 'ArithmeticError' => 'Core/Core_c.stub', 'ArrayAccess' => 'Core/Core_c.stub', 'ArrayIterator' => 'SPL/SPL.stub', 'ArrayObject' => 'SPL/SPL.stub', 'AssertionError' => 'standard/standard_9.stub', 'Attribute' => 'Core/Core_c.stub', 'BackedEnum' => 'Core/Core_c.stub', 'BadFunctionCallException' => 'SPL/SPL.stub', 'BadMethodCallException' => 'SPL/SPL.stub', 'BlackfireProbe' => 'blackfire/blackfire.stub', 'COM' => 'com_dotnet/com_dotnet.stub', 'CURLFile' => 'curl/curl.stub', 'CURLStringFile' => 'curl/CURLStringFile.stub', 'CachingIterator' => 'SPL/SPL.stub', 'CallbackFilterIterator' => 'SPL/SPL.stub', 'Cassandra' => 'cassandra/cassandra.stub', 'Cassandra\\Aggregate' => 'cassandra/cassandra.stub', 'Cassandra\\BatchStatement' => 'cassandra/cassandra.stub', 'Cassandra\\Bigint' => 'cassandra/cassandra.stub', 'Cassandra\\Blob' => 'cassandra/cassandra.stub', 'Cassandra\\Cluster' => 'cassandra/cassandra.stub', 'Cassandra\\Cluster\\Builder' => 'cassandra/cassandra.stub', 'Cassandra\\Collection' => 'cassandra/cassandra.stub', 'Cassandra\\Column' => 'cassandra/cassandra.stub', 'Cassandra\\Custom' => 'cassandra/cassandra.stub', 'Cassandra\\Date' => 'cassandra/cassandra.stub', 'Cassandra\\Decimal' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultAggregate' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultCluster' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultColumn' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultFunction' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultIndex' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultKeyspace' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultMaterializedView' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultSchema' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultSession' => 'cassandra/cassandra.stub', 'Cassandra\\DefaultTable' => 'cassandra/cassandra.stub', 'Cassandra\\Duration' => 'cassandra/cassandra.stub', 'Cassandra\\Exception' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\AlreadyExistsException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\AuthenticationException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\ConfigurationException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\DivideByZeroException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\DomainException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\ExecutionException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\InvalidArgumentException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\InvalidQueryException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\InvalidSyntaxException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\IsBootstrappingException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\LogicException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\OverloadedException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\ProtocolException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\RangeException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\ReadTimeoutException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\RuntimeException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\ServerException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\TimeoutException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\TruncateException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\UnauthorizedException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\UnavailableException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\UnpreparedException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\ValidationException' => 'cassandra/cassandra.stub', 'Cassandra\\Exception\\WriteTimeoutException' => 'cassandra/cassandra.stub', 'Cassandra\\ExecutionOptions' => 'cassandra/cassandra.stub', 'Cassandra\\Float_' => 'cassandra/cassandra.stub', 'Cassandra\\Function_' => 'cassandra/cassandra.stub', 'Cassandra\\Future' => 'cassandra/cassandra.stub', 'Cassandra\\FutureClose' => 'cassandra/cassandra.stub', 'Cassandra\\FuturePreparedStatement' => 'cassandra/cassandra.stub', 'Cassandra\\FutureRows' => 'cassandra/cassandra.stub', 'Cassandra\\FutureSession' => 'cassandra/cassandra.stub', 'Cassandra\\FutureValue' => 'cassandra/cassandra.stub', 'Cassandra\\Index' => 'cassandra/cassandra.stub', 'Cassandra\\Inet' => 'cassandra/cassandra.stub', 'Cassandra\\Keyspace' => 'cassandra/cassandra.stub', 'Cassandra\\Map' => 'cassandra/cassandra.stub', 'Cassandra\\MaterializedView' => 'cassandra/cassandra.stub', 'Cassandra\\Numeric' => 'cassandra/cassandra.stub', 'Cassandra\\PreparedStatement' => 'cassandra/cassandra.stub', 'Cassandra\\RetryPolicy' => 'cassandra/cassandra.stub', 'Cassandra\\RetryPolicy\\DefaultPolicy' => 'cassandra/cassandra.stub', 'Cassandra\\RetryPolicy\\DowngradingConsistency' => 'cassandra/cassandra.stub', 'Cassandra\\RetryPolicy\\Fallthrough' => 'cassandra/cassandra.stub', 'Cassandra\\RetryPolicy\\Logging' => 'cassandra/cassandra.stub', 'Cassandra\\Rows' => 'cassandra/cassandra.stub', 'Cassandra\\SSLOptions' => 'cassandra/cassandra.stub', 'Cassandra\\SSLOptions\\Builder' => 'cassandra/cassandra.stub', 'Cassandra\\Schema' => 'cassandra/cassandra.stub', 'Cassandra\\Session' => 'cassandra/cassandra.stub', 'Cassandra\\Set' => 'cassandra/cassandra.stub', 'Cassandra\\SimpleStatement' => 'cassandra/cassandra.stub', 'Cassandra\\Smallint' => 'cassandra/cassandra.stub', 'Cassandra\\Statement' => 'cassandra/cassandra.stub', 'Cassandra\\Table' => 'cassandra/cassandra.stub', 'Cassandra\\Time' => 'cassandra/cassandra.stub', 'Cassandra\\Timestamp' => 'cassandra/cassandra.stub', 'Cassandra\\TimestampGenerator' => 'cassandra/cassandra.stub', 'Cassandra\\TimestampGenerator\\Monotonic' => 'cassandra/cassandra.stub', 'Cassandra\\TimestampGenerator\\ServerSide' => 'cassandra/cassandra.stub', 'Cassandra\\Timeuuid' => 'cassandra/cassandra.stub', 'Cassandra\\Tinyint' => 'cassandra/cassandra.stub', 'Cassandra\\Tuple' => 'cassandra/cassandra.stub', 'Cassandra\\Type' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\Collection' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\Custom' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\Map' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\Scalar' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\Set' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\Tuple' => 'cassandra/cassandra.stub', 'Cassandra\\Type\\UserType' => 'cassandra/cassandra.stub', 'Cassandra\\UserTypeValue' => 'cassandra/cassandra.stub', 'Cassandra\\Uuid' => 'cassandra/cassandra.stub', 'Cassandra\\UuidInterface' => 'cassandra/cassandra.stub', 'Cassandra\\Value' => 'cassandra/cassandra.stub', 'Cassandra\\Varint' => 'cassandra/cassandra.stub', 'ClosedGeneratorException' => 'standard/_types.stub', 'Closure' => 'Core/Core_c.stub', 'Collator' => 'intl/intl.stub', 'Collectable' => 'pthreads/pthreads.stub', 'CompileError' => 'Core/Core_c.stub', 'Couchbase\\AnalyticsEncryptionLevel' => 'couchbase/couchbase.stub', 'Couchbase\\AnalyticsException' => 'couchbase/couchbase.stub', 'Couchbase\\AnalyticsIndexManager' => 'couchbase/couchbase.stub', 'Couchbase\\AnalyticsLink' => 'couchbase/couchbase.stub', 'Couchbase\\AnalyticsLinkType' => 'couchbase/couchbase.stub', 'Couchbase\\AnalyticsOptions' => 'couchbase/couchbase.stub', 'Couchbase\\AnalyticsResult' => 'couchbase/couchbase.stub', 'Couchbase\\AppendOptions' => 'couchbase/couchbase.stub', 'Couchbase\\AuthenticationException' => 'couchbase/couchbase.stub', 'Couchbase\\AzureBlobExternalAnalyticsLink' => 'couchbase/couchbase.stub', 'Couchbase\\BadInputException' => 'couchbase/couchbase.stub', 'Couchbase\\BaseException' => 'couchbase/couchbase.stub', 'Couchbase\\BinaryCollection' => 'couchbase/couchbase.stub', 'Couchbase\\BindingsException' => 'couchbase/couchbase.stub', 'Couchbase\\BooleanFieldSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\BooleanSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\Bucket' => 'couchbase/couchbase.stub', 'Couchbase\\BucketManager' => 'couchbase/couchbase.stub', 'Couchbase\\BucketMissingException' => 'couchbase/couchbase.stub', 'Couchbase\\BucketSettings' => 'couchbase/couchbase.stub', 'Couchbase\\CasMismatchException' => 'couchbase/couchbase.stub', 'Couchbase\\Cluster' => 'couchbase/couchbase.stub', 'Couchbase\\ClusterOptions' => 'couchbase/couchbase.stub', 'Couchbase\\Collection' => 'couchbase/couchbase.stub', 'Couchbase\\CollectionManager' => 'couchbase/couchbase.stub', 'Couchbase\\CollectionMissingException' => 'couchbase/couchbase.stub', 'Couchbase\\CollectionSpec' => 'couchbase/couchbase.stub', 'Couchbase\\ConjunctionSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\ConnectAnalyticsLinkOptions' => 'couchbase/couchbase.stub', 'Couchbase\\Coordinate' => 'couchbase/couchbase.stub', 'Couchbase\\CouchbaseRemoteAnalyticsLink' => 'couchbase/couchbase.stub', 'Couchbase\\CounterResult' => 'couchbase/couchbase.stub', 'Couchbase\\CreateAnalyticsDatasetOptions' => 'couchbase/couchbase.stub', 'Couchbase\\CreateAnalyticsDataverseOptions' => 'couchbase/couchbase.stub', 'Couchbase\\CreateAnalyticsIndexOptions' => 'couchbase/couchbase.stub', 'Couchbase\\CreateAnalyticsLinkOptions' => 'couchbase/couchbase.stub', 'Couchbase\\CreateQueryIndexOptions' => 'couchbase/couchbase.stub', 'Couchbase\\CreateQueryPrimaryIndexOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DateRangeFacetResult' => 'couchbase/couchbase.stub', 'Couchbase\\DateRangeSearchFacet' => 'couchbase/couchbase.stub', 'Couchbase\\DateRangeSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\DecrementOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DesignDocument' => 'couchbase/couchbase.stub', 'Couchbase\\DisconnectAnalyticsLinkOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DisjunctionSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\DmlFailureException' => 'couchbase/couchbase.stub', 'Couchbase\\DocIdSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\DocumentNotFoundException' => 'couchbase/couchbase.stub', 'Couchbase\\DropAnalyticsDatasetOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DropAnalyticsDataverseOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DropAnalyticsIndexOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DropAnalyticsLinkOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DropQueryIndexOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DropQueryPrimaryIndexOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DropUserOptions' => 'couchbase/couchbase.stub', 'Couchbase\\DurabilityException' => 'couchbase/couchbase.stub', 'Couchbase\\DurabilityLevel' => 'couchbase/couchbase.stub', 'Couchbase\\EncryptionSettings' => 'couchbase/couchbase.stub', 'Couchbase\\EvictionPolicy' => 'couchbase/couchbase.stub', 'Couchbase\\ExistsOptions' => 'couchbase/couchbase.stub', 'Couchbase\\ExistsResult' => 'couchbase/couchbase.stub', 'Couchbase\\GeoBoundingBoxSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\GeoDistanceSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\GeoPolygonQuery' => 'couchbase/couchbase.stub', 'Couchbase\\GetAllReplicasOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetAllUsersOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetAnalyticsLinksOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetAndLockOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetAndTouchOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetAnyReplicaOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetOptions' => 'couchbase/couchbase.stub', 'Couchbase\\GetReplicaResult' => 'couchbase/couchbase.stub', 'Couchbase\\GetResult' => 'couchbase/couchbase.stub', 'Couchbase\\GetUserOptions' => 'couchbase/couchbase.stub', 'Couchbase\\Group' => 'couchbase/couchbase.stub', 'Couchbase\\HttpException' => 'couchbase/couchbase.stub', 'Couchbase\\IncrementOptions' => 'couchbase/couchbase.stub', 'Couchbase\\IndexFailureException' => 'couchbase/couchbase.stub', 'Couchbase\\IndexNotFoundException' => 'couchbase/couchbase.stub', 'Couchbase\\InsertOptions' => 'couchbase/couchbase.stub', 'Couchbase\\InvalidConfigurationException' => 'couchbase/couchbase.stub', 'Couchbase\\InvalidRangeException' => 'couchbase/couchbase.stub', 'Couchbase\\InvalidStateException' => 'couchbase/couchbase.stub', 'Couchbase\\KeyDeletedException' => 'couchbase/couchbase.stub', 'Couchbase\\KeyExistsException' => 'couchbase/couchbase.stub', 'Couchbase\\KeyLockedException' => 'couchbase/couchbase.stub', 'Couchbase\\KeyValueException' => 'couchbase/couchbase.stub', 'Couchbase\\KeyspaceNotFoundException' => 'couchbase/couchbase.stub', 'Couchbase\\LoggingMeter' => 'couchbase/couchbase.stub', 'Couchbase\\LookupCountSpec' => 'couchbase/couchbase.stub', 'Couchbase\\LookupExistsSpec' => 'couchbase/couchbase.stub', 'Couchbase\\LookupGetFullSpec' => 'couchbase/couchbase.stub', 'Couchbase\\LookupGetSpec' => 'couchbase/couchbase.stub', 'Couchbase\\LookupInOptions' => 'couchbase/couchbase.stub', 'Couchbase\\LookupInResult' => 'couchbase/couchbase.stub', 'Couchbase\\LookupInSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MatchAllSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\MatchNoneSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\MatchPhraseSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\MatchSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\Meter' => 'couchbase/couchbase.stub', 'Couchbase\\MutateArrayAddUniqueSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateArrayAppendSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateArrayInsertSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateArrayPrependSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateCounterSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateInOptions' => 'couchbase/couchbase.stub', 'Couchbase\\MutateInResult' => 'couchbase/couchbase.stub', 'Couchbase\\MutateInSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateInsertSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateRemoveSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateReplaceSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutateUpsertSpec' => 'couchbase/couchbase.stub', 'Couchbase\\MutationResult' => 'couchbase/couchbase.stub', 'Couchbase\\MutationState' => 'couchbase/couchbase.stub', 'Couchbase\\MutationToken' => 'couchbase/couchbase.stub', 'Couchbase\\NetworkException' => 'couchbase/couchbase.stub', 'Couchbase\\NoopMeter' => 'couchbase/couchbase.stub', 'Couchbase\\NoopTracer' => 'couchbase/couchbase.stub', 'Couchbase\\NumericRangeFacetResult' => 'couchbase/couchbase.stub', 'Couchbase\\NumericRangeSearchFacet' => 'couchbase/couchbase.stub', 'Couchbase\\NumericRangeSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\Origin' => 'couchbase/couchbase.stub', 'Couchbase\\ParsingFailureException' => 'couchbase/couchbase.stub', 'Couchbase\\PartialViewException' => 'couchbase/couchbase.stub', 'Couchbase\\PathExistsException' => 'couchbase/couchbase.stub', 'Couchbase\\PathNotFoundException' => 'couchbase/couchbase.stub', 'Couchbase\\PhraseSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\PlanningFailureException' => 'couchbase/couchbase.stub', 'Couchbase\\PrefixSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\PreparedStatementException' => 'couchbase/couchbase.stub', 'Couchbase\\PrependOptions' => 'couchbase/couchbase.stub', 'Couchbase\\QueryErrorException' => 'couchbase/couchbase.stub', 'Couchbase\\QueryException' => 'couchbase/couchbase.stub', 'Couchbase\\QueryIndex' => 'couchbase/couchbase.stub', 'Couchbase\\QueryIndexManager' => 'couchbase/couchbase.stub', 'Couchbase\\QueryMetaData' => 'couchbase/couchbase.stub', 'Couchbase\\QueryOptions' => 'couchbase/couchbase.stub', 'Couchbase\\QueryProfile' => 'couchbase/couchbase.stub', 'Couchbase\\QueryResult' => 'couchbase/couchbase.stub', 'Couchbase\\QueryScanConsistency' => 'couchbase/couchbase.stub', 'Couchbase\\QueryServiceException' => 'couchbase/couchbase.stub', 'Couchbase\\QueryStringSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\QuotaLimitedException' => 'couchbase/couchbase.stub', 'Couchbase\\RateLimitedException' => 'couchbase/couchbase.stub', 'Couchbase\\RegexpSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\RemoveOptions' => 'couchbase/couchbase.stub', 'Couchbase\\ReplaceAnalyticsLinkOptions' => 'couchbase/couchbase.stub', 'Couchbase\\ReplaceOptions' => 'couchbase/couchbase.stub', 'Couchbase\\RequestCanceledException' => 'couchbase/couchbase.stub', 'Couchbase\\RequestSpan' => 'couchbase/couchbase.stub', 'Couchbase\\RequestTracer' => 'couchbase/couchbase.stub', 'Couchbase\\Result' => 'couchbase/couchbase.stub', 'Couchbase\\Role' => 'couchbase/couchbase.stub', 'Couchbase\\RoleAndDescription' => 'couchbase/couchbase.stub', 'Couchbase\\RoleAndOrigin' => 'couchbase/couchbase.stub', 'Couchbase\\S3ExternalAnalyticsLink' => 'couchbase/couchbase.stub', 'Couchbase\\Scope' => 'couchbase/couchbase.stub', 'Couchbase\\ScopeMissingException' => 'couchbase/couchbase.stub', 'Couchbase\\ScopeSpec' => 'couchbase/couchbase.stub', 'Couchbase\\SearchException' => 'couchbase/couchbase.stub', 'Couchbase\\SearchFacet' => 'couchbase/couchbase.stub', 'Couchbase\\SearchFacetResult' => 'couchbase/couchbase.stub', 'Couchbase\\SearchHighlightMode' => 'couchbase/couchbase.stub', 'Couchbase\\SearchIndex' => 'couchbase/couchbase.stub', 'Couchbase\\SearchIndexManager' => 'couchbase/couchbase.stub', 'Couchbase\\SearchMetaData' => 'couchbase/couchbase.stub', 'Couchbase\\SearchOptions' => 'couchbase/couchbase.stub', 'Couchbase\\SearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\SearchResult' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSort' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortField' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortGeoDistance' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortId' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortMissing' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortMode' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortScore' => 'couchbase/couchbase.stub', 'Couchbase\\SearchSortType' => 'couchbase/couchbase.stub', 'Couchbase\\ServiceMissingException' => 'couchbase/couchbase.stub', 'Couchbase\\StorageBackend' => 'couchbase/couchbase.stub', 'Couchbase\\StoreSemantics' => 'couchbase/couchbase.stub', 'Couchbase\\SubdocumentException' => 'couchbase/couchbase.stub', 'Couchbase\\TempFailException' => 'couchbase/couchbase.stub', 'Couchbase\\TermFacetResult' => 'couchbase/couchbase.stub', 'Couchbase\\TermRangeSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\TermSearchFacet' => 'couchbase/couchbase.stub', 'Couchbase\\TermSearchQuery' => 'couchbase/couchbase.stub', 'Couchbase\\ThresholdLoggingTracer' => 'couchbase/couchbase.stub', 'Couchbase\\TimeoutException' => 'couchbase/couchbase.stub', 'Couchbase\\TouchOptions' => 'couchbase/couchbase.stub', 'Couchbase\\UnlockOptions' => 'couchbase/couchbase.stub', 'Couchbase\\UpsertOptions' => 'couchbase/couchbase.stub', 'Couchbase\\UpsertUserOptions' => 'couchbase/couchbase.stub', 'Couchbase\\User' => 'couchbase/couchbase.stub', 'Couchbase\\UserAndMetadata' => 'couchbase/couchbase.stub', 'Couchbase\\UserManager' => 'couchbase/couchbase.stub', 'Couchbase\\ValueRecorder' => 'couchbase/couchbase.stub', 'Couchbase\\ValueTooBigException' => 'couchbase/couchbase.stub', 'Couchbase\\View' => 'couchbase/couchbase.stub', 'Couchbase\\ViewConsistency' => 'couchbase/couchbase.stub', 'Couchbase\\ViewException' => 'couchbase/couchbase.stub', 'Couchbase\\ViewIndexManager' => 'couchbase/couchbase.stub', 'Couchbase\\ViewMetaData' => 'couchbase/couchbase.stub', 'Couchbase\\ViewOptions' => 'couchbase/couchbase.stub', 'Couchbase\\ViewOrdering' => 'couchbase/couchbase.stub', 'Couchbase\\ViewResult' => 'couchbase/couchbase.stub', 'Couchbase\\ViewRow' => 'couchbase/couchbase.stub', 'Couchbase\\WatchQueryIndexesOptions' => 'couchbase/couchbase.stub', 'Couchbase\\WildcardSearchQuery' => 'couchbase/couchbase.stub', 'Countable' => 'Core/Core_c.stub', 'Crypto\\Base64' => 'crypto/crypto.stub', 'Crypto\\Base64Exception' => 'crypto/crypto.stub', 'Crypto\\CMAC' => 'crypto/crypto.stub', 'Crypto\\Cipher' => 'crypto/crypto.stub', 'Crypto\\CipherException' => 'crypto/crypto.stub', 'Crypto\\HMAC' => 'crypto/crypto.stub', 'Crypto\\Hash' => 'crypto/crypto.stub', 'Crypto\\HashException' => 'crypto/crypto.stub', 'Crypto\\KDF' => 'crypto/crypto.stub', 'Crypto\\KDFException' => 'crypto/crypto.stub', 'Crypto\\MAC' => 'crypto/crypto.stub', 'Crypto\\MACException' => 'crypto/crypto.stub', 'Crypto\\PBKDF2' => 'crypto/crypto.stub', 'Crypto\\PBKDF2Exception' => 'crypto/crypto.stub', 'Crypto\\Rand' => 'crypto/crypto.stub', 'Crypto\\RandException' => 'crypto/crypto.stub', 'CurlHandle' => 'curl/curl.stub', 'CurlMultiHandle' => 'curl/curl.stub', 'CurlShareHandle' => 'curl/curl.stub', 'DOMAttr' => 'dom/dom_c.stub', 'DOMCdataSection' => 'dom/dom_c.stub', 'DOMCharacterData' => 'dom/dom_c.stub', 'DOMChildNode' => 'dom/dom_c.stub', 'DOMComment' => 'dom/dom_c.stub', 'DOMConfiguration' => 'dom/dom_c.stub', 'DOMDocument' => 'dom/dom_c.stub', 'DOMDocumentFragment' => 'dom/dom_c.stub', 'DOMDocumentType' => 'dom/dom_c.stub', 'DOMDomError' => 'dom/dom_c.stub', 'DOMElement' => 'dom/dom_c.stub', 'DOMEntity' => 'dom/dom_c.stub', 'DOMEntityReference' => 'dom/dom_c.stub', 'DOMErrorHandler' => 'dom/dom_c.stub', 'DOMException' => 'dom/dom_c.stub', 'DOMImplementation' => 'dom/dom_c.stub', 'DOMImplementationList' => 'dom/dom_c.stub', 'DOMImplementationSource' => 'dom/dom_c.stub', 'DOMLocator' => 'dom/dom_c.stub', 'DOMNameList' => 'dom/dom_c.stub', 'DOMNameSpaceNode' => 'dom/dom_c.stub', 'DOMNamedNodeMap' => 'dom/dom_c.stub', 'DOMNode' => 'dom/dom_c.stub', 'DOMNodeList' => 'dom/dom_c.stub', 'DOMNotation' => 'dom/dom_c.stub', 'DOMParentNode' => 'dom/dom_c.stub', 'DOMProcessingInstruction' => 'dom/dom_c.stub', 'DOMStringExtend' => 'dom/dom_c.stub', 'DOMStringList' => 'dom/dom_c.stub', 'DOMText' => 'dom/dom_c.stub', 'DOMTypeinfo' => 'dom/dom_c.stub', 'DOMUserDataHandler' => 'dom/dom_c.stub', 'DOMXPath' => 'dom/dom_c.stub', 'DOTNET' => 'com_dotnet/com_dotnet.stub', 'DateError' => 'date/date_c.stub', 'DateException' => 'date/date_c.stub', 'DateInterval' => 'date/date_c.stub', 'DateInvalidOperationException' => 'date/date_c.stub', 'DateInvalidTimeZoneException' => 'date/date_c.stub', 'DateMalformedIntervalStringException' => 'date/date_c.stub', 'DateMalformedPeriodStringException' => 'date/date_c.stub', 'DateMalformedStringException' => 'date/date_c.stub', 'DateObjectError' => 'date/date_c.stub', 'DatePeriod' => 'date/date_c.stub', 'DateRangeError' => 'date/date_c.stub', 'DateTime' => 'date/date_c.stub', 'DateTimeImmutable' => 'date/date_c.stub', 'DateTimeInterface' => 'date/date_c.stub', 'DateTimeZone' => 'date/date_c.stub', 'Dba\\Connection' => 'dba/Connection.stub', 'Decimal\\Decimal' => 'decimal/decimal.stub', 'DeflateContext' => 'zlib/zlib.stub', 'Deprecated' => 'Core/Core_c.stub', 'Directory' => 'standard/standard_0.stub', 'DirectoryIterator' => 'SPL/SPL_c1.stub', 'DivisionByZeroError' => 'Core/Core_c.stub', 'Dom\\AdjacentPosition' => 'dom/dom_n.stub', 'Dom\\Attr' => 'dom/dom_n.stub', 'Dom\\BrokenRandomEngineError' => 'dom/dom_n.stub', 'Dom\\CDATASection' => 'dom/dom_n.stub', 'Dom\\CharacterData' => 'dom/dom_n.stub', 'Dom\\ChildNode' => 'dom/dom_n.stub', 'Dom\\Comment' => 'dom/dom_n.stub', 'Dom\\Document' => 'dom/dom_n.stub', 'Dom\\DocumentFragment' => 'dom/dom_n.stub', 'Dom\\DocumentType' => 'dom/dom_n.stub', 'Dom\\DtdNamedNodeMap' => 'dom/dom_n.stub', 'Dom\\Element' => 'dom/dom_n.stub', 'Dom\\Entity' => 'dom/dom_n.stub', 'Dom\\EntityReference' => 'dom/dom_n.stub', 'Dom\\HTMLCollection' => 'dom/dom_n.stub', 'Dom\\HTMLDocument' => 'dom/dom_n.stub', 'Dom\\HTMLElement' => 'dom/dom_n.stub', 'Dom\\Implementation' => 'dom/dom_n.stub', 'Dom\\Mysql' => 'dom/dom_n.stub', 'Dom\\NamedNodeMap' => 'dom/dom_n.stub', 'Dom\\NamespaceInfo' => 'dom/dom_n.stub', 'Dom\\Node' => 'dom/dom_n.stub', 'Dom\\NodeList' => 'dom/dom_n.stub', 'Dom\\Notation' => 'dom/dom_n.stub', 'Dom\\ParentNode' => 'dom/dom_n.stub', 'Dom\\ProcessingInstruction' => 'dom/dom_n.stub', 'Dom\\RandomError' => 'dom/dom_n.stub', 'Dom\\RandomException' => 'dom/dom_n.stub', 'Dom\\Sqlite' => 'dom/dom_n.stub', 'Dom\\Text' => 'dom/dom_n.stub', 'Dom\\TokenList' => 'dom/dom_n.stub', 'Dom\\XMLDocument' => 'dom/dom_n.stub', 'Dom\\XPath' => 'dom/dom_n.stub', 'DomainException' => 'SPL/SPL.stub', 'Ds\\Collection' => 'ds/ds.stub', 'Ds\\Deque' => 'ds/ds.stub', 'Ds\\Hashable' => 'ds/ds.stub', 'Ds\\Map' => 'ds/ds.stub', 'Ds\\Pair' => 'ds/ds.stub', 'Ds\\PriorityQueue' => 'ds/ds.stub', 'Ds\\Queue' => 'ds/ds.stub', 'Ds\\Sequence' => 'ds/ds.stub', 'Ds\\Set' => 'ds/ds.stub', 'Ds\\Stack' => 'ds/ds.stub', 'Ds\\Vector' => 'ds/ds.stub', 'Elastic\\Apm\\CustomErrorData' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\DistributedTracingData' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\ElasticApm' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\ExecutionSegmentContextInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\ExecutionSegmentInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\SpanContextDbInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\SpanContextDestinationInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\SpanContextHttpInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\SpanContextInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\SpanInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\TransactionBuilderInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\TransactionContextInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\TransactionContextRequestInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\TransactionContextRequestUrlInterface' => 'elastic_apm/elastic_apm.stub', 'Elastic\\Apm\\TransactionInterface' => 'elastic_apm/elastic_apm.stub', 'EmptyIterator' => 'SPL/SPL.stub', 'EnchantBroker' => 'enchant/enchant.stub', 'EnchantDictionary' => 'enchant/enchant.stub', 'Error' => 'Core/Core_c.stub', 'ErrorException' => 'Core/Core_c.stub', 'Ev' => 'Ev/Ev.stub', 'EvCheck' => 'Ev/Ev.stub', 'EvChild' => 'Ev/Ev.stub', 'EvEmbed' => 'Ev/Ev.stub', 'EvFork' => 'Ev/Ev.stub', 'EvIdle' => 'Ev/Ev.stub', 'EvIo' => 'Ev/Ev.stub', 'EvLoop' => 'Ev/Ev.stub', 'EvPeriodic' => 'Ev/Ev.stub', 'EvPrepare' => 'Ev/Ev.stub', 'EvSignal' => 'Ev/Ev.stub', 'EvStat' => 'Ev/Ev.stub', 'EvTimer' => 'Ev/Ev.stub', 'EvWatcher' => 'Ev/Ev.stub', 'Event' => 'event/event.stub', 'EventBase' => 'event/event.stub', 'EventBuffer' => 'event/event.stub', 'EventBufferEvent' => 'event/event.stub', 'EventConfig' => 'event/event.stub', 'EventDnsBase' => 'event/event.stub', 'EventHttp' => 'event/event.stub', 'EventHttpConnection' => 'event/event.stub', 'EventHttpRequest' => 'event/event.stub', 'EventListener' => 'event/event.stub', 'EventSslContext' => 'event/event.stub', 'EventUtil' => 'event/event.stub', 'Exception' => 'Core/Core_c.stub', 'FANNConnection' => 'fann/fann.stub', 'FFI' => 'FFI/FFI.stub', 'FFI\\CData' => 'FFI/FFI.stub', 'FFI\\CType' => 'FFI/FFI.stub', 'FFI\\Exception' => 'FFI/FFI.stub', 'FFI\\ParserException' => 'FFI/FFI.stub', 'FTP\\Connection' => 'ftp/Connection.stub', 'Fiber' => 'Core/Core_c.stub', 'FiberError' => 'Core/Core_c.stub', 'FilesystemIterator' => 'SPL/SPL_c1.stub', 'FilterIterator' => 'SPL/SPL.stub', 'GEOSGeometry' => 'geos/geos.stub', 'GEOSWKBReader' => 'geos/geos.stub', 'GEOSWKBWriter' => 'geos/geos.stub', 'GEOSWKTReader' => 'geos/geos.stub', 'GEOSWKTWriter' => 'geos/geos.stub', 'GMP' => 'gmp/gmp.stub', 'GdFont' => 'gd/GdFont.stub', 'GdImage' => 'gd/gd.stub', 'GearmanClient' => 'gearman/gearman.stub', 'GearmanException' => 'gearman/gearman.stub', 'GearmanJob' => 'gearman/gearman.stub', 'GearmanTask' => 'gearman/gearman.stub', 'GearmanWorker' => 'gearman/gearman.stub', 'Generator' => 'standard/_types.stub', 'GlobIterator' => 'SPL/SPL_c1.stub', 'Gmagick' => 'gmagick/gmagick.stub', 'GmagickDraw' => 'gmagick/gmagick.stub', 'GmagickException' => 'gmagick/gmagick.stub', 'GmagickPixel' => 'gmagick/gmagick.stub', 'GmagickPixelException' => 'gmagick/gmagick.stub', 'Grpc\\Call' => 'grpc/grpc.stub', 'Grpc\\CallCredentials' => 'grpc/grpc.stub', 'Grpc\\Channel' => 'grpc/grpc.stub', 'Grpc\\ChannelCredentials' => 'grpc/grpc.stub', 'Grpc\\Server' => 'grpc/grpc.stub', 'Grpc\\ServerCredentials' => 'grpc/grpc.stub', 'Grpc\\Timeval' => 'grpc/grpc.stub', 'HashContext' => 'hash/hash.stub', 'HttpDeflateStream' => 'http/http.stub', 'HttpEncodingException' => 'http/http.stub', 'HttpException' => 'http/http.stub', 'HttpHeaderException' => 'http/http.stub', 'HttpInflateStream' => 'http/http.stub', 'HttpInvalidParamException' => 'http/http.stub', 'HttpMalformedHeadersException' => 'http/http.stub', 'HttpMessage' => 'http/http.stub', 'HttpMessageTypeException' => 'http/http.stub', 'HttpQueryString' => 'http/http.stub', 'HttpQueryStringException' => 'http/http.stub', 'HttpRequest' => 'http/http.stub', 'HttpRequestDataShare' => 'http/http.stub', 'HttpRequestException' => 'http/http.stub', 'HttpRequestMethodException' => 'http/http.stub', 'HttpRequestPool' => 'http/http.stub', 'HttpRequestPoolException' => 'http/http.stub', 'HttpResponse' => 'http/http.stub', 'HttpResponseException' => 'http/http.stub', 'HttpRuntimeException' => 'http/http.stub', 'HttpSocketException' => 'http/http.stub', 'HttpUrlException' => 'http/http.stub', 'HttpUtil' => 'http/http.stub', 'IMAP\\Connection' => 'imap/Connection.stub', 'Imagick' => 'imagick/imagick.stub', 'ImagickDraw' => 'imagick/imagick.stub', 'ImagickDrawException' => 'imagick/imagick.stub', 'ImagickException' => 'imagick/imagick.stub', 'ImagickKernel' => 'imagick/imagick.stub', 'ImagickKernelException' => 'imagick/imagick.stub', 'ImagickPixel' => 'imagick/imagick.stub', 'ImagickPixelException' => 'imagick/imagick.stub', 'ImagickPixelIterator' => 'imagick/imagick.stub', 'ImagickPixelIteratorException' => 'imagick/imagick.stub', 'InfiniteIterator' => 'SPL/SPL.stub', 'InflateContext' => 'zlib/zlib.stub', 'InternalIterator' => 'Core/Core_c.stub', 'IntlBreakIterator' => 'intl/intl.stub', 'IntlCalendar' => 'intl/intl.stub', 'IntlChar' => 'intl/IntlChar.stub', 'IntlCodePointBreakIterator' => 'intl/intl.stub', 'IntlDateFormatter' => 'intl/intl.stub', 'IntlDatePatternGenerator' => 'intl/IntlDatePatternGenerator.stub', 'IntlException' => 'intl/intl.stub', 'IntlGregorianCalendar' => 'intl/intl.stub', 'IntlIterator' => 'intl/intl.stub', 'IntlPartsIterator' => 'intl/intl.stub', 'IntlRuleBasedBreakIterator' => 'intl/intl.stub', 'IntlTimeZone' => 'intl/intl.stub', 'InvalidArgumentException' => 'SPL/SPL.stub', 'Iterator' => 'Core/Core_c.stub', 'IteratorAggregate' => 'Core/Core_c.stub', 'IteratorIterator' => 'SPL/SPL.stub', 'JavaException' => 'zend/zend.stub', 'JsonException' => 'json/json.stub', 'JsonIncrementalParser' => 'json/json.stub', 'JsonSerializable' => 'json/json.stub', 'Judy' => 'judy/judy.stub', 'LDAP\\Connection' => 'ldap/Connection.stub', 'LDAP\\Result' => 'ldap/Result.stub', 'LDAP\\ResultEntry' => 'ldap/ResultEntry.stub', 'LengthException' => 'SPL/SPL.stub', 'LevelDB' => 'leveldb/LevelDB.stub', 'LevelDBException' => 'leveldb/LevelDB.stub', 'LevelDBIterator' => 'leveldb/LevelDB.stub', 'LevelDBSnapshot' => 'leveldb/LevelDB.stub', 'LevelDBWriteBatch' => 'leveldb/LevelDB.stub', 'LibXMLError' => 'libxml/libxml.stub', 'LimitIterator' => 'SPL/SPL.stub', 'Locale' => 'intl/intl.stub', 'LogicException' => 'SPL/SPL.stub', 'Lua' => 'lua/lua.stub', 'LuaSandbox' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxError' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxErrorError' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxFatalError' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxFunction' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxMemoryError' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxRuntimeError' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxSyntaxError' => 'LuaSandbox/LuaSandbox.stub', 'LuaSandboxTimeoutError' => 'LuaSandbox/LuaSandbox.stub', 'Memcache' => 'memcache/memcache.stub', 'MemcachePool' => 'memcache/memcache.stub', 'Memcached' => 'memcached/memcached.stub', 'MemcachedException' => 'memcached/memcached.stub', 'MessageFormatter' => 'intl/intl.stub', 'MessagePack' => 'msgpack/msgpack.stub', 'MessagePackUnpacker' => 'msgpack/msgpack.stub', 'Mongo' => 'mongo/mongo.stub', 'MongoBinData' => 'mongo/mongo.stub', 'MongoClient' => 'mongo/mongo.stub', 'MongoCode' => 'mongo/mongo.stub', 'MongoCollection' => 'mongo/mongo.stub', 'MongoCommandCursor' => 'mongo/mongo.stub', 'MongoConnectionException' => 'mongo/mongo.stub', 'MongoCursor' => 'mongo/mongo.stub', 'MongoCursorException' => 'mongo/mongo.stub', 'MongoCursorInterface' => 'mongo/mongo.stub', 'MongoCursorTimeoutException' => 'mongo/mongo.stub', 'MongoDB' => 'mongo/mongo.stub', 'MongoDBRef' => 'mongo/mongo.stub', 'MongoDB\\BSON\\Binary' => 'mongodb/BSON/Binary.stub', 'MongoDB\\BSON\\BinaryInterface' => 'mongodb/BSON/BinaryInterface.stub', 'MongoDB\\BSON\\DBPointer' => 'mongodb/BSON/DBPointer.stub', 'MongoDB\\BSON\\Decimal128' => 'mongodb/BSON/Decimal128.stub', 'MongoDB\\BSON\\Decimal128Interface' => 'mongodb/BSON/Decimal128Interface.stub', 'MongoDB\\BSON\\Document' => 'mongodb/BSON/Document.stub', 'MongoDB\\BSON\\Int64' => 'mongodb/BSON/Int64.stub', 'MongoDB\\BSON\\Iterator' => 'mongodb/BSON/Iterator.stub', 'MongoDB\\BSON\\Javascript' => 'mongodb/BSON/Javascript.stub', 'MongoDB\\BSON\\JavascriptInterface' => 'mongodb/BSON/JavascriptInterface.stub', 'MongoDB\\BSON\\MaxKey' => 'mongodb/BSON/MaxKey.stub', 'MongoDB\\BSON\\MaxKeyInterface' => 'mongodb/BSON/MaxKeyInterface.stub', 'MongoDB\\BSON\\MinKey' => 'mongodb/BSON/MinKey.stub', 'MongoDB\\BSON\\MinKeyInterface' => 'mongodb/BSON/MinKeyInterface.stub', 'MongoDB\\BSON\\ObjectId' => 'mongodb/BSON/ObjectId.stub', 'MongoDB\\BSON\\ObjectIdInterface' => 'mongodb/BSON/ObjectIdInterface.stub', 'MongoDB\\BSON\\PackedArray' => 'mongodb/BSON/PackedArray.stub', 'MongoDB\\BSON\\Persistable' => 'mongodb/BSON/Persistable.stub', 'MongoDB\\BSON\\Regex' => 'mongodb/BSON/Regex.stub', 'MongoDB\\BSON\\RegexInterface' => 'mongodb/BSON/RegexInterface.stub', 'MongoDB\\BSON\\Serializable' => 'mongodb/BSON/Serializable.stub', 'MongoDB\\BSON\\Symbol' => 'mongodb/BSON/Symbol.stub', 'MongoDB\\BSON\\Timestamp' => 'mongodb/BSON/Timestamp.stub', 'MongoDB\\BSON\\TimestampInterface' => 'mongodb/BSON/TimestampInterface.stub', 'MongoDB\\BSON\\Type' => 'mongodb/BSON/Type.stub', 'MongoDB\\BSON\\UTCDateTime' => 'mongodb/BSON/UTCDateTime.stub', 'MongoDB\\BSON\\UTCDateTimeInterface' => 'mongodb/BSON/UTCDateTimeInterface.stub', 'MongoDB\\BSON\\Undefined' => 'mongodb/BSON/Undefined.stub', 'MongoDB\\BSON\\Unserializable' => 'mongodb/BSON/Unserializable.stub', 'MongoDB\\Driver\\BulkWrite' => 'mongodb/BulkWrite.stub', 'MongoDB\\Driver\\ClientEncryption' => 'mongodb/ClientEncryption.stub', 'MongoDB\\Driver\\Command' => 'mongodb/Command.stub', 'MongoDB\\Driver\\Cursor' => 'mongodb/Cursor.stub', 'MongoDB\\Driver\\CursorId' => 'mongodb/CursorId.stub', 'MongoDB\\Driver\\CursorInterface' => 'mongodb/CursorInterface.stub', 'MongoDB\\Driver\\Exception\\AuthenticationException' => 'mongodb/Exception/AuthenticationException.stub', 'MongoDB\\Driver\\Exception\\BulkWriteException' => 'mongodb/Exception/BulkWriteException.stub', 'MongoDB\\Driver\\Exception\\CommandException' => 'mongodb/Exception/CommandException.stub', 'MongoDB\\Driver\\Exception\\ConnectionException' => 'mongodb/Exception/ConnectionException.stub', 'MongoDB\\Driver\\Exception\\ConnectionTimeoutException' => 'mongodb/Exception/ConnectionTimeoutException.stub', 'MongoDB\\Driver\\Exception\\EncryptionException' => 'mongodb/Exception/EncryptionException.stub', 'MongoDB\\Driver\\Exception\\Exception' => 'mongodb/Exception/Exception.stub', 'MongoDB\\Driver\\Exception\\ExecutionTimeoutException' => 'mongodb/Exception/ExecutionTimeoutException.stub', 'MongoDB\\Driver\\Exception\\InvalidArgumentException' => 'mongodb/Exception/InvalidArgumentException.stub', 'MongoDB\\Driver\\Exception\\LogicException' => 'mongodb/Exception/LogicException.stub', 'MongoDB\\Driver\\Exception\\RuntimeException' => 'mongodb/Exception/RuntimeException.stub', 'MongoDB\\Driver\\Exception\\SSLConnectionException' => 'mongodb/Exception/SSLConnectionException.stub', 'MongoDB\\Driver\\Exception\\ServerException' => 'mongodb/Exception/ServerException.stub', 'MongoDB\\Driver\\Exception\\UnexpectedValueException' => 'mongodb/Exception/UnexpectedValueException.stub', 'MongoDB\\Driver\\Exception\\WriteConcernException' => 'mongodb/Exception/WriteConcernException.stub', 'MongoDB\\Driver\\Exception\\WriteException' => 'mongodb/Exception/WriteException.stub', 'MongoDB\\Driver\\Manager' => 'mongodb/Manager.stub', 'MongoDB\\Driver\\Monitoring\\CommandFailedEvent' => 'mongodb/Monitoring/CommandFailedEvent.stub', 'MongoDB\\Driver\\Monitoring\\CommandStartedEvent' => 'mongodb/Monitoring/CommandStartedEvent.stub', 'MongoDB\\Driver\\Monitoring\\CommandSubscriber' => 'mongodb/Monitoring/CommandSubscriber.stub', 'MongoDB\\Driver\\Monitoring\\CommandSucceededEvent' => 'mongodb/Monitoring/CommandSucceededEvent.stub', 'MongoDB\\Driver\\Monitoring\\LogSubscriber' => 'mongodb/Monitoring/LogSubscriber.stub', 'MongoDB\\Driver\\Monitoring\\SDAMSubscriber' => 'mongodb/Monitoring/SDAMSubscriber.stub', 'MongoDB\\Driver\\Monitoring\\ServerChangedEvent' => 'mongodb/Monitoring/ServerChangedEvent.stub', 'MongoDB\\Driver\\Monitoring\\ServerClosedEvent' => 'mongodb/Monitoring/ServerClosedEvent.stub', 'MongoDB\\Driver\\Monitoring\\ServerHeartbeatFailedEvent' => 'mongodb/Monitoring/ServerHeartbeatFailedEvent.stub', 'MongoDB\\Driver\\Monitoring\\ServerHeartbeatStartedEvent' => 'mongodb/Monitoring/ServerHeartbeatStartedEvent.stub', 'MongoDB\\Driver\\Monitoring\\ServerHeartbeatSucceededEvent' => 'mongodb/Monitoring/ServerHeartbeatSucceededEvent.stub', 'MongoDB\\Driver\\Monitoring\\ServerOpeningEvent' => 'mongodb/Monitoring/ServerOpeningEvent.stub', 'MongoDB\\Driver\\Monitoring\\Subscriber' => 'mongodb/Monitoring/Subscriber.stub', 'MongoDB\\Driver\\Monitoring\\TopologyChangedEvent' => 'mongodb/Monitoring/TopologyChangedEvent.stub', 'MongoDB\\Driver\\Monitoring\\TopologyClosedEvent' => 'mongodb/Monitoring/TopologyClosedEvent.stub', 'MongoDB\\Driver\\Monitoring\\TopologyOpeningEvent' => 'mongodb/Monitoring/TopologyOpeningEvent.stub', 'MongoDB\\Driver\\Query' => 'mongodb/Query.stub', 'MongoDB\\Driver\\ReadConcern' => 'mongodb/ReadConcern.stub', 'MongoDB\\Driver\\ReadPreference' => 'mongodb/ReadPreference.stub', 'MongoDB\\Driver\\Server' => 'mongodb/Server.stub', 'MongoDB\\Driver\\ServerApi' => 'mongodb/ServerApi.stub', 'MongoDB\\Driver\\ServerDescription' => 'mongodb/ServerDescription.stub', 'MongoDB\\Driver\\Session' => 'mongodb/Session.stub', 'MongoDB\\Driver\\TopologyDescription' => 'mongodb/TopologyDescription.stub', 'MongoDB\\Driver\\WriteConcern' => 'mongodb/WriteConcern.stub', 'MongoDB\\Driver\\WriteConcernError' => 'mongodb/WriteConcernError.stub', 'MongoDB\\Driver\\WriteError' => 'mongodb/WriteError.stub', 'MongoDB\\Driver\\WriteResult' => 'mongodb/WriteResult.stub', 'MongoDate' => 'mongo/mongo.stub', 'MongoDuplicateKeyException' => 'mongo/mongo.stub', 'MongoException' => 'mongo/mongo.stub', 'MongoExecutionTimeoutException' => 'mongo/mongo.stub', 'MongoGridFS' => 'mongo/mongo.stub', 'MongoGridFSCursor' => 'mongo/mongo.stub', 'MongoGridFSException' => 'mongo/mongo.stub', 'MongoGridFSFile' => 'mongo/mongo.stub', 'MongoId' => 'mongo/mongo.stub', 'MongoInt32' => 'mongo/mongo.stub', 'MongoInt64' => 'mongo/mongo.stub', 'MongoLog' => 'mongo/mongo.stub', 'MongoMaxKey' => 'mongo/mongo.stub', 'MongoMinKey' => 'mongo/mongo.stub', 'MongoPool' => 'mongo/mongo.stub', 'MongoProtocolException' => 'mongo/mongo.stub', 'MongoRegex' => 'mongo/mongo.stub', 'MongoResultException' => 'mongo/mongo.stub', 'MongoTimestamp' => 'mongo/mongo.stub', 'MongoUpdateBatch' => 'mongo/mongo.stub', 'MongoWriteBatch' => 'mongo/mongo.stub', 'MongoWriteConcernException' => 'mongo/mongo.stub', 'Mosquitto\\Client' => 'mosquitto-php/mosquitto-php.stub', 'Mosquitto\\Exception' => 'mosquitto-php/mosquitto-php.stub', 'Mosquitto\\Message' => 'mosquitto-php/mosquitto-php.stub', 'MultipleIterator' => 'SPL/SPL_c1.stub', 'NoRewindIterator' => 'SPL/SPL.stub', 'Normalizer' => 'intl/intl.stub', 'NumberFormatter' => 'intl/intl.stub', 'OAuth' => 'oauth/oauth.stub', 'OAuthException' => 'oauth/oauth.stub', 'OAuthProvider' => 'oauth/oauth.stub', 'OCICollection' => 'oci8/oci8v3.stub', 'OCILob' => 'oci8/oci8v3.stub', 'OCI_Collection' => 'oci8/oci8.stub', 'OCI_Lob' => 'oci8/oci8.stub', 'OpenSSLAsymmetricKey' => 'openssl/openssl.stub', 'OpenSSLCertificate' => 'openssl/openssl.stub', 'OpenSSLCertificateSigningRequest' => 'openssl/openssl.stub', 'OutOfBoundsException' => 'SPL/SPL.stub', 'OutOfRangeException' => 'SPL/SPL.stub', 'OuterIterator' => 'SPL/SPL.stub', 'OverflowException' => 'SPL/SPL.stub', 'Override' => 'Core/Core_c.stub', 'OwsrequestObj' => 'mapscript/mapscript.stub', 'PDFlib' => 'pdflib/PDFlib.stub', 'PDFlibException' => 'pdflib/PDFlib.stub', 'PDO' => 'PDO/PDO.stub', 'PDOException' => 'PDO/PDO.stub', 'PDORow' => 'PDO/PDO.stub', 'PDOStatement' => 'PDO/PDO.stub', 'PSpell\\Config' => 'pspell/pspell_c.stub', 'PSpell\\Dictionary' => 'pspell/pspell_c.stub', 'ParentIterator' => 'SPL/SPL.stub', 'Parle\\ErrorInfo' => 'Parle/ErrorInfo.stub', 'Parle\\Lexer' => 'Parle/Lexer.stub', 'Parle\\LexerException' => 'Parle/LexerException.stub', 'Parle\\Parser' => 'Parle/Parser.stub', 'Parle\\ParserException' => 'Parle/ParserException.stub', 'Parle\\RLexer' => 'Parle/RLexer.stub', 'Parle\\RParser' => 'Parle/RParser.stub', 'Parle\\Stack' => 'Parle/Stack.stub', 'Parle\\Token' => 'Parle/Token.stub', 'ParseError' => 'Core/Core_c.stub', 'Pcntl\\QosClass' => 'pcntl/pcntl_c.stub', 'Pdo\\Mysql' => 'PDO/PDO.stub', 'Pdo\\Sqlite' => 'PDO/PDO.stub', 'PgSql\\Connection' => 'pgsql/pgsql_c.stub', 'PgSql\\Lob' => 'pgsql/pgsql_c.stub', 'PgSql\\Result' => 'pgsql/pgsql_c.stub', 'Phar' => 'Phar/Phar.stub', 'PharData' => 'Phar/Phar.stub', 'PharException' => 'Phar/Phar.stub', 'PharFileInfo' => 'Phar/Phar.stub', 'PhpToken' => 'tokenizer/PhpToken.stub', 'Pool' => 'pthreads/pthreads.stub', 'PropertyHookType' => 'Reflection/PropertyHookType.stub', 'RRDCreator' => 'rrd/rrd.stub', 'RRDGraph' => 'rrd/rrd.stub', 'RRDUpdater' => 'rrd/rrd.stub', 'Random\\BrokenRandomEngineError' => 'random/random.stub', 'Random\\CryptoSafeEngine' => 'random/random.stub', 'Random\\Engine' => 'random/random.stub', 'Random\\Engine\\Mt19937' => 'random/random.stub', 'Random\\Engine\\PcgOneseq128XslRr64' => 'random/random.stub', 'Random\\Engine\\Secure' => 'random/random.stub', 'Random\\Engine\\Xoshiro256StarStar' => 'random/random.stub', 'Random\\IntervalBoundary' => 'random/random.stub', 'Random\\RandomError' => 'random/random.stub', 'Random\\RandomException' => 'random/random.stub', 'Random\\Randomizer' => 'random/random.stub', 'RangeException' => 'SPL/SPL.stub', 'RarArchive' => 'rar/rar.stub', 'RarEntry' => 'rar/rar.stub', 'RarException' => 'rar/rar.stub', 'RdKafka' => 'rdkafka/RdKafka.stub', 'RdKafka\\Conf' => 'rdkafka/RdKafka/Conf.stub', 'RdKafka\\Consumer' => 'rdkafka/RdKafka/Consumer.stub', 'RdKafka\\ConsumerTopic' => 'rdkafka/RdKafka/ConsumerTopic.stub', 'RdKafka\\Exception' => 'rdkafka/RdKafka/Exception.stub', 'RdKafka\\KafkaConsumer' => 'rdkafka/RdKafka/KafkaConsumer.stub', 'RdKafka\\KafkaConsumerTopic' => 'rdkafka/RdKafka/KafkaConsumerTopic.stub', 'RdKafka\\KafkaErrorException' => 'rdkafka/RdKafka/KafkaErrorException.stub', 'RdKafka\\Message' => 'rdkafka/RdKafka/Message.stub', 'RdKafka\\Metadata' => 'rdkafka/RdKafka/Metadata.stub', 'RdKafka\\Metadata\\Broker' => 'rdkafka/RdKafka/Metadata/Broker.stub', 'RdKafka\\Metadata\\Collection' => 'rdkafka/RdKafka/Metadata/Collection.stub', 'RdKafka\\Metadata\\Partition' => 'rdkafka/RdKafka/Metadata/Partition.stub', 'RdKafka\\Metadata\\Topic' => 'rdkafka/RdKafka/Metadata/Topic.stub', 'RdKafka\\Producer' => 'rdkafka/RdKafka/Producer.stub', 'RdKafka\\ProducerTopic' => 'rdkafka/RdKafka/ProducerTopic.stub', 'RdKafka\\Queue' => 'rdkafka/RdKafka/Queue.stub', 'RdKafka\\Topic' => 'rdkafka/RdKafka/Topic.stub', 'RdKafka\\TopicConf' => 'rdkafka/RdKafka/TopicConf.stub', 'RdKafka\\TopicPartition' => 'rdkafka/RdKafka/TopicPartition.stub', 'RecursiveArrayIterator' => 'SPL/SPL.stub', 'RecursiveCachingIterator' => 'SPL/SPL.stub', 'RecursiveCallbackFilterIterator' => 'SPL/SPL.stub', 'RecursiveDirectoryIterator' => 'SPL/SPL_c1.stub', 'RecursiveFilterIterator' => 'SPL/SPL.stub', 'RecursiveIterator' => 'SPL/SPL.stub', 'RecursiveIteratorIterator' => 'SPL/SPL.stub', 'RecursiveRegexIterator' => 'SPL/SPL.stub', 'RecursiveTreeIterator' => 'SPL/SPL.stub', 'Redis' => 'redis/Redis.stub', 'RedisArray' => 'redis/RedisArray.stub', 'RedisCluster' => 'redis/RedisCluster.stub', 'RedisClusterException' => 'redis/RedisCluster.stub', 'RedisException' => 'redis/Redis.stub', 'RedisSentinel' => 'redis/RedisSentinel.stub', 'Reflection' => 'Reflection/Reflection.stub', 'ReflectionAttribute' => 'Reflection/ReflectionAttribute.stub', 'ReflectionClass' => 'Reflection/ReflectionClass.stub', 'ReflectionClassConstant' => 'Reflection/ReflectionClassConstant.stub', 'ReflectionConstant' => 'Reflection/ReflectionConstant.stub', 'ReflectionEnum' => 'Reflection/ReflectionEnum.stub', 'ReflectionEnumBackedCase' => 'Reflection/ReflectionEnumBackedCase.stub', 'ReflectionEnumUnitCase' => 'Reflection/ReflectionEnumUnitCase.stub', 'ReflectionException' => 'Reflection/ReflectionException.stub', 'ReflectionExtension' => 'Reflection/ReflectionExtension.stub', 'ReflectionFiber' => 'Reflection/ReflectionFiber.stub', 'ReflectionFunction' => 'Reflection/ReflectionFunction.stub', 'ReflectionFunctionAbstract' => 'Reflection/ReflectionFunctionAbstract.stub', 'ReflectionGenerator' => 'Reflection/ReflectionGenerator.stub', 'ReflectionIntersectionType' => 'Reflection/ReflectionIntersectionType.stub', 'ReflectionMethod' => 'Reflection/ReflectionMethod.stub', 'ReflectionNamedType' => 'Reflection/ReflectionNamedType.stub', 'ReflectionObject' => 'Reflection/ReflectionObject.stub', 'ReflectionParameter' => 'Reflection/ReflectionParameter.stub', 'ReflectionProperty' => 'Reflection/ReflectionProperty.stub', 'ReflectionReference' => 'Reflection/ReflectionReference.stub', 'ReflectionType' => 'Reflection/ReflectionType.stub', 'ReflectionUnionType' => 'Reflection/ReflectionUnionType.stub', 'ReflectionZendExtension' => 'Reflection/ReflectionZendExtension.stub', 'Reflector' => 'Reflection/Reflector.stub', 'RegexIterator' => 'SPL/SPL.stub', 'Relay\\Cluster' => 'relay/Cluster.stub', 'Relay\\Event' => 'relay/Event.stub', 'Relay\\Event\\Flushed' => 'relay/Events.stub', 'Relay\\Event\\Invalidated' => 'relay/Events.stub', 'Relay\\Exception' => 'relay/Exception.stub', 'Relay\\KeyType' => 'relay/KeyType.stub', 'Relay\\Relay' => 'relay/Relay.stub', 'Relay\\Sentinel' => 'relay/Sentinel.stub', 'Relay\\Table' => 'relay/Table.stub', 'RequestParseBodyException' => 'Core/Core_c.stub', 'ResourceBundle' => 'intl/intl.stub', 'ReturnTypeWillChange' => 'Core/Core_c.stub', 'RoundingMode' => 'standard/standard_10.stub', 'RuntimeException' => 'SPL/SPL.stub', 'SNMP' => 'snmp/snmp.stub', 'SNMPException' => 'snmp/snmp.stub', 'SQLite3' => 'sqlite3/sqlite3.stub', 'SQLite3Exception' => 'sqlite3/sqlite3.stub', 'SQLite3Result' => 'sqlite3/sqlite3.stub', 'SQLite3Stmt' => 'sqlite3/sqlite3.stub', 'SQLiteDatabase' => 'SQLite/SQLite.stub', 'SQLiteException' => 'SQLite/SQLite.stub', 'SQLiteResult' => 'SQLite/SQLite.stub', 'SQLiteUnbuffered' => 'SQLite/SQLite.stub', 'SVM' => 'svm/SVM.stub', 'SVMModel' => 'svm/SVMModel.stub', 'SWFAction' => 'ming/ming.stub', 'SWFBitmap' => 'ming/ming.stub', 'SWFButton' => 'ming/ming.stub', 'SWFDisplayItem' => 'ming/ming.stub', 'SWFFill' => 'ming/ming.stub', 'SWFFont' => 'ming/ming.stub', 'SWFFontChar' => 'ming/ming.stub', 'SWFGradient' => 'ming/ming.stub', 'SWFMorph' => 'ming/ming.stub', 'SWFMovie' => 'ming/ming.stub', 'SWFShape' => 'ming/ming.stub', 'SWFSound' => 'ming/ming.stub', 'SWFSoundInstance' => 'ming/ming.stub', 'SWFSprite' => 'ming/ming.stub', 'SWFText' => 'ming/ming.stub', 'SWFTextField' => 'ming/ming.stub', 'SWFVideoStream' => 'ming/ming.stub', 'Saxon\\SaxonProcessor' => 'SaxonC/SaxonC.stub', 'Saxon\\SchemaValidator' => 'SaxonC/SaxonC.stub', 'Saxon\\XPathProcessor' => 'SaxonC/SaxonC.stub', 'Saxon\\XQueryProcessor' => 'SaxonC/SaxonC.stub', 'Saxon\\XdmAtomicValue' => 'SaxonC/SaxonC.stub', 'Saxon\\XdmItem' => 'SaxonC/SaxonC.stub', 'Saxon\\XdmNode' => 'SaxonC/SaxonC.stub', 'Saxon\\XdmValue' => 'SaxonC/SaxonC.stub', 'Saxon\\Xslt30Processor' => 'SaxonC/SaxonC.stub', 'Saxon\\XsltProcessor' => 'SaxonC/SaxonC.stub', 'SeekableIterator' => 'SPL/SPL.stub', 'SensitiveParameter' => 'Core/Core_c.stub', 'SensitiveParameterValue' => 'Core/Core_c.stub', 'Serializable' => 'Core/Core_c.stub', 'SessionHandler' => 'session/SessionHandler.stub', 'SessionHandlerInterface' => 'session/SessionHandler.stub', 'SessionIdInterface' => 'session/SessionHandler.stub', 'SessionUpdateTimestampHandlerInterface' => 'session/SessionHandler.stub', 'Shmop' => 'shmop/shmop.stub', 'SimdJsonException' => 'simdjson/simdjson.stub', 'SimdJsonValueError' => 'simdjson/simdjson.stub', 'SimpleKafkaClient' => 'simple_kafka_client/SimpleKafkaClient.stub', 'SimpleKafkaClient\\Configuration' => 'simple_kafka_client/SimpleKafkaClient/Configuration.stub', 'SimpleKafkaClient\\Consumer' => 'simple_kafka_client/SimpleKafkaClient/Consumer.stub', 'SimpleKafkaClient\\ConsumerTopic' => 'simple_kafka_client/SimpleKafkaClient/Topic.stub', 'SimpleKafkaClient\\Exception' => 'simple_kafka_client/SimpleKafkaClient/Exception.stub', 'SimpleKafkaClient\\KafkaErrorException' => 'simple_kafka_client/SimpleKafkaClient/KafkaErrorException.stub', 'SimpleKafkaClient\\Message' => 'simple_kafka_client/SimpleKafkaClient/Message.stub', 'SimpleKafkaClient\\Metadata' => 'simple_kafka_client/SimpleKafkaClient/Metadata.stub', 'SimpleKafkaClient\\Metadata\\Broker' => 'simple_kafka_client/SimpleKafkaClient/Metadata/Broker.stub', 'SimpleKafkaClient\\Metadata\\Collection' => 'simple_kafka_client/SimpleKafkaClient/Metadata/Collection.stub', 'SimpleKafkaClient\\Metadata\\Partition' => 'simple_kafka_client/SimpleKafkaClient/Metadata/Partition.stub', 'SimpleKafkaClient\\Metadata\\Topic' => 'simple_kafka_client/SimpleKafkaClient/Metadata/Topic.stub', 'SimpleKafkaClient\\Producer' => 'simple_kafka_client/SimpleKafkaClient/Producer.stub', 'SimpleKafkaClient\\ProducerTopic' => 'simple_kafka_client/SimpleKafkaClient/Topic.stub', 'SimpleKafkaClient\\Topic' => 'simple_kafka_client/SimpleKafkaClient/Topic.stub', 'SimpleKafkaClient\\TopicPartition' => 'simple_kafka_client/SimpleKafkaClient/TopicPartition.stub', 'SimpleXMLElement' => 'SimpleXML/SimpleXML.stub', 'SimpleXMLIterator' => 'SimpleXML/SimpleXML.stub', 'SoapClient' => 'soap/soap.stub', 'SoapFault' => 'soap/soap.stub', 'SoapHeader' => 'soap/soap.stub', 'SoapParam' => 'soap/soap.stub', 'SoapServer' => 'soap/soap.stub', 'SoapVar' => 'soap/soap.stub', 'Soap\\Sdl' => 'soap/soap_n.stub', 'Soap\\Url' => 'soap/soap_n.stub', 'Socket' => 'sockets/sockets.stub', 'SodiumException' => 'sodium/sodium.stub', 'SolrClient' => 'solr/SolrClient.stub', 'SolrClientException' => 'solr/Exceptions/SolrClientException.stub', 'SolrCollapseFunction' => 'solr/Queries/SolrCollapseFunction.stub', 'SolrDisMaxQuery' => 'solr/Queries/SolrDisMaxQuery.stub', 'SolrDocument' => 'solr/Documents/SolrDocument.stub', 'SolrDocumentField' => 'solr/Documents/SolrDocumentField.stub', 'SolrException' => 'solr/Exceptions/SolrException.stub', 'SolrGenericResponse' => 'solr/Responses/SolrGenericResponse.stub', 'SolrIllegalArgumentException' => 'solr/Exceptions/SolrIllegalArgumentException.stub', 'SolrIllegalOperationException' => 'solr/Exceptions/SolrIllegalOperationException.stub', 'SolrInputDocument' => 'solr/Documents/SolrInputDocument.stub', 'SolrMissingMandatoryParameterException' => 'solr/Exceptions/SolrMissingMandatoryParameterException.stub', 'SolrModifiableParams' => 'solr/Queries/SolrModifiableParams.stub', 'SolrObject' => 'solr/Utils/SolrObject.stub', 'SolrParams' => 'solr/Queries/SolrParams.stub', 'SolrPingResponse' => 'solr/Responses/SolrPingResponse.stub', 'SolrQuery' => 'solr/Queries/SolrQuery.stub', 'SolrQueryResponse' => 'solr/Responses/SolrQueryResponse.stub', 'SolrResponse' => 'solr/Responses/SolrResponse.stub', 'SolrServerException' => 'solr/Exceptions/SolrServerException.stub', 'SolrUpdateResponse' => 'solr/Responses/SolrUpdateResponse.stub', 'SolrUtils' => 'solr/Utils/SolrUtils.stub', 'SplBool' => 'SplType/SplType.stub', 'SplDoublyLinkedList' => 'SPL/SPL_c1.stub', 'SplEnum' => 'SplType/SplType.stub', 'SplFileInfo' => 'SPL/SPL_c1.stub', 'SplFileObject' => 'SPL/SPL_c1.stub', 'SplFixedArray' => 'SPL/SPL_c1.stub', 'SplFloat' => 'SplType/SplType.stub', 'SplHeap' => 'SPL/SPL_c1.stub', 'SplInt' => 'SplType/SplType.stub', 'SplMaxHeap' => 'SPL/SPL_c1.stub', 'SplMinHeap' => 'SPL/SPL_c1.stub', 'SplObjectStorage' => 'SPL/SPL_c1.stub', 'SplObserver' => 'SPL/SPL_c1.stub', 'SplPriorityQueue' => 'SPL/SPL_c1.stub', 'SplQueue' => 'SPL/SPL_c1.stub', 'SplStack' => 'SPL/SPL_c1.stub', 'SplString' => 'SplType/SplType.stub', 'SplSubject' => 'SPL/SPL_c1.stub', 'SplTempFileObject' => 'SPL/SPL_c1.stub', 'SplType' => 'SplType/SplType.stub', 'Spoofchecker' => 'intl/intl.stub', 'Stomp' => 'stomp/stomp.stub', 'StompException' => 'stomp/stomp.stub', 'StompFrame' => 'stomp/stomp.stub', 'StreamBucket' => 'standard/standard_0.stub', 'Stringable' => 'Core/Core_c.stub', 'Svn' => 'svn/svn.stub', 'SvnNode' => 'svn/svn.stub', 'SvnWc' => 'svn/svn.stub', 'SvnWcSchedule' => 'svn/svn.stub', 'Swoole\\Atomic' => 'swoole/Swoole/Atomic.stub', 'Swoole\\Atomic\\Long' => 'swoole/Swoole/Atomic/Long.stub', 'Swoole\\Client' => 'swoole/Swoole/Client.stub', 'Swoole\\Client\\Exception' => 'swoole/Swoole/Client/Exception.stub', 'Swoole\\Connection\\Iterator' => 'swoole/Swoole/Connection/Iterator.stub', 'Swoole\\Coroutine' => 'swoole/Swoole/Coroutine.stub', 'Swoole\\Coroutine\\Channel' => 'swoole/Swoole/Coroutine/Channel.stub', 'Swoole\\Coroutine\\Client' => 'swoole/Swoole/Coroutine/Client.stub', 'Swoole\\Coroutine\\Context' => 'swoole/Swoole/Coroutine/Context.stub', 'Swoole\\Coroutine\\Curl\\Exception' => 'swoole/Swoole/Coroutine/Curl/Exception.stub', 'Swoole\\Coroutine\\Http2\\Client' => 'swoole/Swoole/Coroutine/Http2/Client.stub', 'Swoole\\Coroutine\\Http2\\Client\\Exception' => 'swoole/Swoole/Coroutine/Http2/Client/Exception.stub', 'Swoole\\Coroutine\\Http\\Client' => 'swoole/Swoole/Coroutine/Http/Client.stub', 'Swoole\\Coroutine\\Http\\Client\\Exception' => 'swoole/Swoole/Coroutine/Http/Client/Exception.stub', 'Swoole\\Coroutine\\Http\\Server' => 'swoole/Swoole/Coroutine/Http/Server.stub', 'Swoole\\Coroutine\\Iterator' => 'swoole/Swoole/Coroutine/Iterator.stub', 'Swoole\\Coroutine\\MySQL' => 'swoole/Swoole/Coroutine/MySQL.stub', 'Swoole\\Coroutine\\MySQL\\Exception' => 'swoole/Swoole/Coroutine/MySQL/Exception.stub', 'Swoole\\Coroutine\\MySQL\\Statement' => 'swoole/Swoole/Coroutine/MySQL/Statement.stub', 'Swoole\\Coroutine\\Redis' => 'swoole/Swoole/Coroutine/Redis.stub', 'Swoole\\Coroutine\\Scheduler' => 'swoole/Swoole/Coroutine/Scheduler.stub', 'Swoole\\Coroutine\\Socket' => 'swoole/Swoole/Coroutine/Socket.stub', 'Swoole\\Coroutine\\Socket\\Exception' => 'swoole/Swoole/Coroutine/Socket/Exception.stub', 'Swoole\\Coroutine\\System' => 'swoole/Swoole/Coroutine/System.stub', 'Swoole\\Error' => 'swoole/Swoole/Error.stub', 'Swoole\\Event' => 'swoole/Swoole/Event.stub', 'Swoole\\Exception' => 'swoole/Swoole/Exception.stub', 'Swoole\\ExitException' => 'swoole/Swoole/ExitException.stub', 'Swoole\\Http2\\Request' => 'swoole/Swoole/Http2/Request.stub', 'Swoole\\Http2\\Response' => 'swoole/Swoole/Http2/Response.stub', 'Swoole\\Http\\Request' => 'swoole/Swoole/Http/Request.stub', 'Swoole\\Http\\Response' => 'swoole/Swoole/Http/Response.stub', 'Swoole\\Http\\Server' => 'swoole/Swoole/Http/Server.stub', 'Swoole\\Lock' => 'swoole/Swoole/Lock.stub', 'Swoole\\Process' => 'swoole/Swoole/Process.stub', 'Swoole\\Process\\Pool' => 'swoole/Swoole/Process/Pool.stub', 'Swoole\\Redis\\Server' => 'swoole/Swoole/Redis/Server.stub', 'Swoole\\Runtime' => 'swoole/Swoole/Runtime.stub', 'Swoole\\Server' => 'swoole/Swoole/Server.stub', 'Swoole\\Server\\Event' => 'swoole/Swoole/Server/Event.stub', 'Swoole\\Server\\Packet' => 'swoole/Swoole/Server/Packet.stub', 'Swoole\\Server\\PipeMessage' => 'swoole/Swoole/Server/PipeMessage.stub', 'Swoole\\Server\\Port' => 'swoole/Swoole/Server/Port.stub', 'Swoole\\Server\\StatusInfo' => 'swoole/Swoole/Server/StatusInfo.stub', 'Swoole\\Server\\Task' => 'swoole/Swoole/Server/Task.stub', 'Swoole\\Server\\TaskResult' => 'swoole/Swoole/Server/TaskResult.stub', 'Swoole\\Table' => 'swoole/Swoole/Table.stub', 'Swoole\\Timer' => 'swoole/Swoole/Timer.stub', 'Swoole\\Timer\\Iterator' => 'swoole/Swoole/Timer/Iterator.stub', 'Swoole\\WebSocket\\CloseFrame' => 'swoole/Swoole/WebSocket/CloseFrame.stub', 'Swoole\\WebSocket\\Frame' => 'swoole/Swoole/WebSocket/Frame.stub', 'Swoole\\WebSocket\\Server' => 'swoole/Swoole/WebSocket/Server.stub', 'SyncEvent' => 'sync/sync.stub', 'SyncMutex' => 'sync/sync.stub', 'SyncReaderWriter' => 'sync/sync.stub', 'SyncSemaphore' => 'sync/sync.stub', 'SyncSharedMemory' => 'sync/sync.stub', 'SysvMessageQueue' => 'sysvmsg/sysvmsg.stub', 'SysvSemaphore' => 'sysvsem/sysvsem.stub', 'SysvSharedMemory' => 'sysvshm/sysvshm.stub', 'Thread' => 'pthreads/pthreads.stub', 'Threaded' => 'pthreads/pthreads.stub', 'Throwable' => 'Core/Core_c.stub', 'Transliterator' => 'intl/intl.stub', 'Traversable' => 'Core/Core_c.stub', 'TypeError' => 'Core/Core_c.stub', 'UConverter' => 'intl/intl.stub', 'UV' => 'uv/UV.stub', 'UVAddrinfo' => 'uv/UV.stub', 'UVAsync' => 'uv/UV.stub', 'UVCheck' => 'uv/UV.stub', 'UVFs' => 'uv/UV.stub', 'UVFsEvent' => 'uv/UV.stub', 'UVFsPoll' => 'uv/UV.stub', 'UVIdle' => 'uv/UV.stub', 'UVLock' => 'uv/UV.stub', 'UVLoop' => 'uv/UV.stub', 'UVPipe' => 'uv/UV.stub', 'UVPoll' => 'uv/UV.stub', 'UVPrepare' => 'uv/UV.stub', 'UVProcess' => 'uv/UV.stub', 'UVSignal' => 'uv/UV.stub', 'UVSockAddr' => 'uv/UV.stub', 'UVSockAddrIPv4' => 'uv/UV.stub', 'UVSockAddrIPv6' => 'uv/UV.stub', 'UVStdio' => 'uv/UV.stub', 'UVStream' => 'uv/UV.stub', 'UVTcp' => 'uv/UV.stub', 'UVTimer' => 'uv/UV.stub', 'UVTty' => 'uv/UV.stub', 'UVUdp' => 'uv/UV.stub', 'UVWork' => 'uv/UV.stub', 'UnderflowException' => 'SPL/SPL.stub', 'UnexpectedValueException' => 'SPL/SPL.stub', 'UnhandledMatchError' => 'Core/Core_c.stub', 'UnitEnum' => 'Core/Core_c.stub', 'V8Js' => 'v8js/v8js.stub', 'V8JsMemoryLimitException' => 'v8js/v8js.stub', 'V8JsScriptException' => 'v8js/v8js.stub', 'V8JsTimeLimitException' => 'v8js/v8js.stub', 'VARIANT' => 'com_dotnet/com_dotnet.stub', 'ValueError' => 'Core/Core_c.stub', 'Volatile' => 'pthreads/pthreads.stub', 'Vtiful\\Kernel\\Excel' => 'xlswriter/xlswriter.stub', 'Vtiful\\Kernel\\Format' => 'xlswriter/xlswriter.stub', 'WeakMap' => 'Core/Core_c.stub', 'WeakReference' => 'Core/Core_c.stub', 'Worker' => 'pthreads/pthreads.stub', 'XMLParser' => 'xml/xml.stub', 'XMLReader' => 'xmlreader/xmlreader.stub', 'XMLWriter' => 'xmlwriter/xmlwriter.stub', 'XSLTProcessor' => 'xsl/xsl.stub', 'XXTEA' => 'xxtea/xxtea.stub', 'Yaf\\Action_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Application' => 'yaf/yaf_namespace.stub', 'Yaf\\Bootstrap_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Config\\Ini' => 'yaf/yaf_namespace.stub', 'Yaf\\Config\\Simple' => 'yaf/yaf_namespace.stub', 'Yaf\\Config_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Controller_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Dispatcher' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\DispatchFailed' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\LoadFailed' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\LoadFailed\\Action' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\LoadFailed\\Controller' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\LoadFailed\\Module' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\LoadFailed\\View' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\RouterFailed' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\StartupError' => 'yaf/yaf_namespace.stub', 'Yaf\\Exception\\TypeError' => 'yaf/yaf_namespace.stub', 'Yaf\\Loader' => 'yaf/yaf_namespace.stub', 'Yaf\\Plugin_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Registry' => 'yaf/yaf_namespace.stub', 'Yaf\\Request\\Http' => 'yaf/yaf_namespace.stub', 'Yaf\\Request\\Simple' => 'yaf/yaf_namespace.stub', 'Yaf\\Request_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Response\\Cli' => 'yaf/yaf_namespace.stub', 'Yaf\\Response\\Http' => 'yaf/yaf_namespace.stub', 'Yaf\\Response_Abstract' => 'yaf/yaf_namespace.stub', 'Yaf\\Route\\Map' => 'yaf/yaf_namespace.stub', 'Yaf\\Route\\Regex' => 'yaf/yaf_namespace.stub', 'Yaf\\Route\\Rewrite' => 'yaf/yaf_namespace.stub', 'Yaf\\Route\\Simple' => 'yaf/yaf_namespace.stub', 'Yaf\\Route\\Supervar' => 'yaf/yaf_namespace.stub', 'Yaf\\Route_Interface' => 'yaf/yaf_namespace.stub', 'Yaf\\Route_Static' => 'yaf/yaf_namespace.stub', 'Yaf\\Router' => 'yaf/yaf_namespace.stub', 'Yaf\\Session' => 'yaf/yaf_namespace.stub', 'Yaf\\View\\Simple' => 'yaf/yaf_namespace.stub', 'Yaf\\View_Interface' => 'yaf/yaf_namespace.stub', 'Yaf_Action_Abstract' => 'yaf/yaf.stub', 'Yaf_Application' => 'yaf/yaf.stub', 'Yaf_Bootstrap_Abstract' => 'yaf/yaf.stub', 'Yaf_Config_Abstract' => 'yaf/yaf.stub', 'Yaf_Config_Ini' => 'yaf/yaf.stub', 'Yaf_Config_Simple' => 'yaf/yaf.stub', 'Yaf_Controller_Abstract' => 'yaf/yaf.stub', 'Yaf_Dispatcher' => 'yaf/yaf.stub', 'Yaf_Exception' => 'yaf/yaf.stub', 'Yaf_Exception_DispatchFailed' => 'yaf/yaf.stub', 'Yaf_Exception_LoadFailed' => 'yaf/yaf.stub', 'Yaf_Exception_LoadFailed_Action' => 'yaf/yaf.stub', 'Yaf_Exception_LoadFailed_Controller' => 'yaf/yaf.stub', 'Yaf_Exception_LoadFailed_Module' => 'yaf/yaf.stub', 'Yaf_Exception_LoadFailed_View' => 'yaf/yaf.stub', 'Yaf_Exception_RouterFailed' => 'yaf/yaf.stub', 'Yaf_Exception_StartupError' => 'yaf/yaf.stub', 'Yaf_Exception_TypeError' => 'yaf/yaf.stub', 'Yaf_Loader' => 'yaf/yaf.stub', 'Yaf_Plugin_Abstract' => 'yaf/yaf.stub', 'Yaf_Registry' => 'yaf/yaf.stub', 'Yaf_Request_Abstract' => 'yaf/yaf.stub', 'Yaf_Request_Http' => 'yaf/yaf.stub', 'Yaf_Request_Simple' => 'yaf/yaf.stub', 'Yaf_Response_Abstract' => 'yaf/yaf.stub', 'Yaf_Response_Cli' => 'yaf/yaf.stub', 'Yaf_Response_Http' => 'yaf/yaf.stub', 'Yaf_Route_Interface' => 'yaf/yaf.stub', 'Yaf_Route_Map' => 'yaf/yaf.stub', 'Yaf_Route_Regex' => 'yaf/yaf.stub', 'Yaf_Route_Rewrite' => 'yaf/yaf.stub', 'Yaf_Route_Simple' => 'yaf/yaf.stub', 'Yaf_Route_Static' => 'yaf/yaf.stub', 'Yaf_Route_Supervar' => 'yaf/yaf.stub', 'Yaf_Router' => 'yaf/yaf.stub', 'Yaf_Session' => 'yaf/yaf.stub', 'Yaf_View_Interface' => 'yaf/yaf.stub', 'Yaf_View_Simple' => 'yaf/yaf.stub', 'Yar_Client' => 'yar/yar.stub', 'Yar_Client_Exception' => 'yar/yar.stub', 'Yar_Client_Packager_Exception' => 'yar/yar.stub', 'Yar_Client_Protocol_Exception' => 'yar/yar.stub', 'Yar_Client_Transport_Exception' => 'yar/yar.stub', 'Yar_Concurrent_Client' => 'yar/yar.stub', 'Yar_Server' => 'yar/yar.stub', 'Yar_Server_Exception' => 'yar/yar.stub', 'Yar_Server_Output_Exception' => 'yar/yar.stub', 'Yar_Server_Packager_Exception' => 'yar/yar.stub', 'Yar_Server_Protocol_Exception' => 'yar/yar.stub', 'Yar_Server_Request_Exception' => 'yar/yar.stub', 'ZMQ' => 'zmq/zmq.stub', 'ZMQContext' => 'zmq/zmq.stub', 'ZMQContextException' => 'zmq/zmq.stub', 'ZMQDevice' => 'zmq/zmq.stub', 'ZMQDeviceException' => 'zmq/zmq.stub', 'ZMQException' => 'zmq/zmq.stub', 'ZMQPoll' => 'zmq/zmq.stub', 'ZMQPollException' => 'zmq/zmq.stub', 'ZMQSocket' => 'zmq/zmq.stub', 'ZMQSocketException' => 'zmq/zmq.stub', 'ZendAPI_Job' => 'zend/zend.stub', 'ZendAPI_Queue' => 'zend/zend.stub', 'ZipArchive' => 'zip/zip.stub', 'Zookeeper' => 'zookeeper/zookeeper.stub', 'ZookeeperAuthenticationException' => 'zookeeper/zookeeper.stub', 'ZookeeperConnectionException' => 'zookeeper/zookeeper.stub', 'ZookeeperException' => 'zookeeper/zookeeper.stub', 'ZookeeperMarshallingException' => 'zookeeper/zookeeper.stub', 'ZookeeperNoNodeException' => 'zookeeper/zookeeper.stub', 'ZookeeperOperationTimeoutException' => 'zookeeper/zookeeper.stub', 'ZookeeperSessionException' => 'zookeeper/zookeeper.stub', '__PHP_Incomplete_Class' => 'standard/standard_0.stub', '___PHPSTORM_HELPERS\\PS_UNRESERVE_PREFIX_static' => 'standard/_types.stub', '___PHPSTORM_HELPERS\\PS_UNRESERVE_PREFIX_this' => 'standard/_types.stub', '___PHPSTORM_HELPERS\\object' => 'standard/_types.stub', 'ast\\Metadata' => 'ast/ast.stub', 'ast\\Node' => 'ast/ast.stub', 'classObj' => 'mapscript/mapscript.stub', 'clusterObj' => 'mapscript/mapscript.stub', 'colorObj' => 'mapscript/mapscript.stub', 'com_exception' => 'com_dotnet/com_dotnet.stub', 'errorObj' => 'mapscript/mapscript.stub', 'ffmpeg_animated_gif' => 'ffmpeg/ffmpeg.stub', 'ffmpeg_frame' => 'ffmpeg/ffmpeg.stub', 'ffmpeg_movie' => 'ffmpeg/ffmpeg.stub', 'finfo' => 'fileinfo/fileinfo.stub', 'gnupg' => 'gnupg/gnupg.stub', 'gnupg_keylistiterator' => 'gnupg/gnupg.stub', 'gridObj' => 'mapscript/mapscript.stub', 'hashTableObj' => 'mapscript/mapscript.stub', 'http\\Client' => 'http/http3.stub', 'http\\Client\\Curl\\User' => 'http/http3.stub', 'http\\Client\\Request' => 'http/http3.stub', 'http\\Client\\Response' => 'http/http3.stub', 'http\\Cookie' => 'http/http3.stub', 'http\\Encoding\\Stream' => 'http/http3.stub', 'http\\Encoding\\Stream\\Debrotli' => 'http/http3.stub', 'http\\Encoding\\Stream\\Dechunk' => 'http/http3.stub', 'http\\Encoding\\Stream\\Deflate' => 'http/http3.stub', 'http\\Encoding\\Stream\\Enbrotli' => 'http/http3.stub', 'http\\Encoding\\Stream\\Inflate' => 'http/http3.stub', 'http\\Env' => 'http/http3.stub', 'http\\Env\\Request' => 'http/http3.stub', 'http\\Env\\Response' => 'http/http3.stub', 'http\\Env\\Url' => 'http/http3.stub', 'http\\Exception' => 'http/http3.stub', 'http\\Exception\\BadConversionException' => 'http/http3.stub', 'http\\Exception\\BadHeaderException' => 'http/http3.stub', 'http\\Exception\\BadMessageException' => 'http/http3.stub', 'http\\Exception\\BadMethodCallException' => 'http/http3.stub', 'http\\Exception\\BadQueryStringException' => 'http/http3.stub', 'http\\Exception\\BadUrlException' => 'http/http3.stub', 'http\\Exception\\InvalidArgumentException' => 'http/http3.stub', 'http\\Exception\\RuntimeException' => 'http/http3.stub', 'http\\Exception\\UnexpectedValueException' => 'http/http3.stub', 'http\\Header' => 'http/http3.stub', 'http\\Header\\Parser' => 'http/http3.stub', 'http\\Message' => 'http/http3.stub', 'http\\Message\\Body' => 'http/http3.stub', 'http\\Message\\Parser' => 'http/http3.stub', 'http\\Params' => 'http/http3.stub', 'http\\QueryString' => 'http/http3.stub', 'http\\Url' => 'http/http3.stub', 'imageObj' => 'mapscript/mapscript.stub', 'iterable' => 'Core/Core_c.stub', 'java' => 'zend/zend.stub', 'labelObj' => 'mapscript/mapscript.stub', 'labelcacheMemberObj' => 'mapscript/mapscript.stub', 'labelcacheObj' => 'mapscript/mapscript.stub', 'layerObj' => 'mapscript/mapscript.stub', 'legendObj' => 'mapscript/mapscript.stub', 'lineObj' => 'mapscript/mapscript.stub', 'mapObj' => 'mapscript/mapscript.stub', 'mysql_xdevapi\\BaseResult' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Collection' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CollectionAdd' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CollectionFind' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CollectionModify' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CollectionRemove' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\ColumnResult' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CrudOperationBindable' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CrudOperationLimitable' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CrudOperationSkippable' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\CrudOperationSortable' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\DatabaseObject' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\DocResult' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Exception' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Executable' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\ExecutionStatus' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Expression' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Result' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\RowResult' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Schema' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\SchemaObject' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Session' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\SqlStatement' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\SqlStatementResult' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Statement' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Table' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\TableDelete' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\TableInsert' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\TableSelect' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\TableUpdate' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\Warning' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\XSession' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysqli' => 'mysqli/mysqli.stub', 'mysqli_driver' => 'mysqli/mysqli.stub', 'mysqli_result' => 'mysqli/mysqli.stub', 'mysqli_sql_exception' => 'mysqli/mysqli.stub', 'mysqli_stmt' => 'mysqli/mysqli.stub', 'mysqli_warning' => 'mysqli/mysqli.stub', 'newrelic\\DistributedTracePayload' => 'newrelic/newrelic.stub', 'outputformatObj' => 'mapscript/mapscript.stub', 'parallel\\Channel' => 'parallel/parallel/Channel.stub', 'parallel\\Channel\\Error' => 'parallel/parallel/Channel/Error.stub', 'parallel\\Channel\\Error\\Closed' => 'parallel/parallel/Channel/Error/Closed.stub', 'parallel\\Channel\\Error\\Existence' => 'parallel/parallel/Channel/Error/Existence.stub', 'parallel\\Channel\\Error\\IllegalValue' => 'parallel/parallel/Channel/Error/IllegalValue.stub', 'parallel\\Error' => 'parallel/parallel/Error.stub', 'parallel\\Events' => 'parallel/parallel/Events.stub', 'parallel\\Events\\Error' => 'parallel/parallel/Events/Error.stub', 'parallel\\Events\\Error\\Existence' => 'parallel/parallel/Events/Error/Existence.stub', 'parallel\\Events\\Error\\Timeout' => 'parallel/parallel/Events/Error/Timeout.stub', 'parallel\\Events\\Event' => 'parallel/parallel/Events/Event.stub', 'parallel\\Events\\Event\\Error' => 'parallel/parallel/Events/Event/Error.stub', 'parallel\\Events\\Event\\Type' => 'parallel/parallel/Events/Event/Type.stub', 'parallel\\Events\\Input' => 'parallel/parallel/Events/Input.stub', 'parallel\\Events\\Input\\Error' => 'parallel/parallel/Events/Input/Error.stub', 'parallel\\Events\\Input\\Error\\Existence' => 'parallel/parallel/Events/Input/Error/Existence.stub', 'parallel\\Events\\Input\\Error\\IllegalValue' => 'parallel/parallel/Events/Input/Error/IllegalValue.stub', 'parallel\\Future' => 'parallel/parallel/Future.stub', 'parallel\\Future\\Error' => 'parallel/parallel/Future/Error.stub', 'parallel\\Future\\Error\\Cancelled' => 'parallel/parallel/Future/Error/Cancelled.stub', 'parallel\\Future\\Error\\Foreign' => 'parallel/parallel/Future/Error/Foreign.stub', 'parallel\\Future\\Error\\Killed' => 'parallel/parallel/Future/Error/Killed.stub', 'parallel\\Runtime' => 'parallel/parallel/Runtime.stub', 'parallel\\Runtime\\Error' => 'parallel/parallel/Runtime/Error.stub', 'parallel\\Runtime\\Error\\Bootstrap' => 'parallel/parallel/Runtime/Error/Bootstrap.stub', 'parallel\\Runtime\\Error\\Closed' => 'parallel/parallel/Runtime/Error/Closed.stub', 'parallel\\Runtime\\Error\\IllegalFunction' => 'parallel/parallel/Runtime/Error/IllegalFunction.stub', 'parallel\\Runtime\\Error\\IllegalInstruction' => 'parallel/parallel/Runtime/Error/IllegalInstruction.stub', 'parallel\\Runtime\\Error\\IllegalParameter' => 'parallel/parallel/Runtime/Error/IllegalParameter.stub', 'parallel\\Runtime\\Error\\IllegalReturn' => 'parallel/parallel/Runtime/Error/IllegalReturn.stub', 'parallel\\Runtime\\Error\\IllegalVariable' => 'parallel/parallel/Runtime/Error/IllegalVariable.stub', 'parallel\\Runtime\\Error\\Killed' => 'parallel/parallel/Runtime/Error/Killed.stub', 'parallel\\Runtime\\Object\\Unavailable' => 'parallel/parallel/Runtime/Object/Unavailable.stub', 'parallel\\Runtime\\Type\\Unavailable' => 'parallel/parallel/Runtime/Type/Unavailable.stub', 'parallel\\Sync' => 'parallel/parallel/Sync.stub', 'parallel\\Sync\\Error' => 'parallel/parallel/Sync/Error.stub', 'parallel\\Sync\\Error\\IllegalValue' => 'parallel/parallel/Sync/Error/IllegalValue.stub', 'php_user_filter' => 'standard/standard_0.stub', 'pointObj' => 'mapscript/mapscript.stub', 'pq\\COPY' => 'pq/pq.stub', 'pq\\Cancel' => 'pq/pq.stub', 'pq\\Connection' => 'pq/pq.stub', 'pq\\Converter' => 'pq/pq.stub', 'pq\\Cursor' => 'pq/pq.stub', 'pq\\DateTime' => 'pq/pq.stub', 'pq\\Exception' => 'pq/pq.stub', 'pq\\Exception\\BadMethodCallException' => 'pq/pq.stub', 'pq\\Exception\\DomainException' => 'pq/pq.stub', 'pq\\Exception\\InvalidArgumentException' => 'pq/pq.stub', 'pq\\Exception\\RuntimeException' => 'pq/pq.stub', 'pq\\LOB' => 'pq/pq.stub', 'pq\\Result' => 'pq/pq.stub', 'pq\\Statement' => 'pq/pq.stub', 'pq\\Transaction' => 'pq/pq.stub', 'pq\\Types' => 'pq/pq.stub', 'projectionObj' => 'mapscript/mapscript.stub', 'querymapObj' => 'mapscript/mapscript.stub', 'rectObj' => 'mapscript/mapscript.stub', 'referenceMapObj' => 'mapscript/mapscript.stub', 'resultObj' => 'mapscript/mapscript.stub', 'scalebarObj' => 'mapscript/mapscript.stub', 'shapeObj' => 'mapscript/mapscript.stub', 'shapefileObj' => 'mapscript/mapscript.stub', 'stdClass' => 'Core/Core_c.stub', 'styleObj' => 'mapscript/mapscript.stub', 'symbolObj' => 'mapscript/mapscript.stub', 'tidy' => 'tidy/tidy.stub', 'tidyNode' => 'tidy/tidy.stub', 'webObj' => 'mapscript/mapscript.stub'); const FUNCTIONS = array('Brotli\\compress' => 'brotli/brotli.stub', 'Brotli\\compress_add' => 'brotli/brotli.stub', 'Brotli\\compress_init' => 'brotli/brotli.stub', 'Brotli\\uncompress' => 'brotli/brotli.stub', 'Brotli\\uncompress_add' => 'brotli/brotli.stub', 'Brotli\\uncompress_init' => 'brotli/brotli.stub', 'Dom\\import_simplexml' => 'dom/dom_n.stub', 'GEOSLineMerge' => 'geos/geos.stub', 'GEOSPolygonize' => 'geos/geos.stub', 'GEOSRelateMatch' => 'geos/geos.stub', 'GEOSSharedPaths' => 'geos/geos.stub', 'GEOSVersion' => 'geos/geos.stub', 'MongoDB\\BSON\\fromJSON' => 'mongodb/BSON/functions.stub', 'MongoDB\\BSON\\fromPHP' => 'mongodb/BSON/functions.stub', 'MongoDB\\BSON\\toCanonicalExtendedJSON' => 'mongodb/BSON/functions.stub', 'MongoDB\\BSON\\toJSON' => 'mongodb/BSON/functions.stub', 'MongoDB\\BSON\\toPHP' => 'mongodb/BSON/functions.stub', 'MongoDB\\BSON\\toRelaxedExtendedJSON' => 'mongodb/BSON/functions.stub', 'MongoDB\\Driver\\Monitoring\\addSubscriber' => 'mongodb/Monitoring/functions.stub', 'MongoDB\\Driver\\Monitoring\\removeSubscriber' => 'mongodb/Monitoring/functions.stub', 'OpenTelemetry\\Instrumentation\\hook' => 'opentelemetry/opentelemetry.stub', 'PDF_activate_item' => 'pdflib/PDFlib.stub', 'PDF_add_launchlink' => 'pdflib/PDFlib.stub', 'PDF_add_locallink' => 'pdflib/PDFlib.stub', 'PDF_add_nameddest' => 'pdflib/PDFlib.stub', 'PDF_add_note' => 'pdflib/PDFlib.stub', 'PDF_add_pdflink' => 'pdflib/PDFlib.stub', 'PDF_add_table_cell' => 'pdflib/PDFlib.stub', 'PDF_add_textflow' => 'pdflib/PDFlib.stub', 'PDF_add_thumbnail' => 'pdflib/PDFlib.stub', 'PDF_add_weblink' => 'pdflib/PDFlib.stub', 'PDF_arc' => 'pdflib/PDFlib.stub', 'PDF_arcn' => 'pdflib/PDFlib.stub', 'PDF_attach_file' => 'pdflib/PDFlib.stub', 'PDF_begin_document' => 'pdflib/PDFlib.stub', 'PDF_begin_font' => 'pdflib/PDFlib.stub', 'PDF_begin_glyph' => 'pdflib/PDFlib.stub', 'PDF_begin_item' => 'pdflib/PDFlib.stub', 'PDF_begin_layer' => 'pdflib/PDFlib.stub', 'PDF_begin_page' => 'pdflib/PDFlib.stub', 'PDF_begin_page_ext' => 'pdflib/PDFlib.stub', 'PDF_begin_pattern' => 'pdflib/PDFlib.stub', 'PDF_begin_template' => 'pdflib/PDFlib.stub', 'PDF_begin_template_ext' => 'pdflib/PDFlib.stub', 'PDF_circle' => 'pdflib/PDFlib.stub', 'PDF_clip' => 'pdflib/PDFlib.stub', 'PDF_close' => 'pdflib/PDFlib.stub', 'PDF_close_image' => 'pdflib/PDFlib.stub', 'PDF_close_pdi' => 'pdflib/PDFlib.stub', 'PDF_close_pdi_document' => 'pdflib/PDFlib.stub', 'PDF_close_pdi_page' => 'pdflib/PDFlib.stub', 'PDF_closepath' => 'pdflib/PDFlib.stub', 'PDF_closepath_fill_stroke' => 'pdflib/PDFlib.stub', 'PDF_closepath_stroke' => 'pdflib/PDFlib.stub', 'PDF_concat' => 'pdflib/PDFlib.stub', 'PDF_continue_text' => 'pdflib/PDFlib.stub', 'PDF_create_3dview' => 'pdflib/PDFlib.stub', 'PDF_create_action' => 'pdflib/PDFlib.stub', 'PDF_create_annotation' => 'pdflib/PDFlib.stub', 'PDF_create_bookmark' => 'pdflib/PDFlib.stub', 'PDF_create_field' => 'pdflib/PDFlib.stub', 'PDF_create_fieldgroup' => 'pdflib/PDFlib.stub', 'PDF_create_gstate' => 'pdflib/PDFlib.stub', 'PDF_create_pvf' => 'pdflib/PDFlib.stub', 'PDF_create_textflow' => 'pdflib/PDFlib.stub', 'PDF_curveto' => 'pdflib/PDFlib.stub', 'PDF_define_layer' => 'pdflib/PDFlib.stub', 'PDF_delete' => 'pdflib/PDFlib.stub', 'PDF_delete_pvf' => 'pdflib/PDFlib.stub', 'PDF_delete_table' => 'pdflib/PDFlib.stub', 'PDF_delete_textflow' => 'pdflib/PDFlib.stub', 'PDF_encoding_set_char' => 'pdflib/PDFlib.stub', 'PDF_end_document' => 'pdflib/PDFlib.stub', 'PDF_end_font' => 'pdflib/PDFlib.stub', 'PDF_end_glyph' => 'pdflib/PDFlib.stub', 'PDF_end_item' => 'pdflib/PDFlib.stub', 'PDF_end_layer' => 'pdflib/PDFlib.stub', 'PDF_end_page' => 'pdflib/PDFlib.stub', 'PDF_end_page_ext' => 'pdflib/PDFlib.stub', 'PDF_end_pattern' => 'pdflib/PDFlib.stub', 'PDF_end_template' => 'pdflib/PDFlib.stub', 'PDF_endpath' => 'pdflib/PDFlib.stub', 'PDF_fill' => 'pdflib/PDFlib.stub', 'PDF_fill_imageblock' => 'pdflib/PDFlib.stub', 'PDF_fill_pdfblock' => 'pdflib/PDFlib.stub', 'PDF_fill_stroke' => 'pdflib/PDFlib.stub', 'PDF_fill_textblock' => 'pdflib/PDFlib.stub', 'PDF_findfont' => 'pdflib/PDFlib.stub', 'PDF_fit_image' => 'pdflib/PDFlib.stub', 'PDF_fit_pdi_page' => 'pdflib/PDFlib.stub', 'PDF_fit_table' => 'pdflib/PDFlib.stub', 'PDF_fit_textflow' => 'pdflib/PDFlib.stub', 'PDF_fit_textline' => 'pdflib/PDFlib.stub', 'PDF_get_apiname' => 'pdflib/PDFlib.stub', 'PDF_get_buffer' => 'pdflib/PDFlib.stub', 'PDF_get_errmsg' => 'pdflib/PDFlib.stub', 'PDF_get_errnum' => 'pdflib/PDFlib.stub', 'PDF_get_majorversion' => 'pdflib/PDFlib.stub', 'PDF_get_minorversion' => 'pdflib/PDFlib.stub', 'PDF_get_option' => 'pdflib/PDFlib.stub', 'PDF_get_parameter' => 'pdflib/PDFlib.stub', 'PDF_get_pdi_parameter' => 'pdflib/PDFlib.stub', 'PDF_get_pdi_value' => 'pdflib/PDFlib.stub', 'PDF_get_string' => 'pdflib/PDFlib.stub', 'PDF_get_value' => 'pdflib/PDFlib.stub', 'PDF_info_font' => 'pdflib/PDFlib.stub', 'PDF_info_graphics' => 'pdflib/PDFlib.stub', 'PDF_info_image' => 'pdflib/PDFlib.stub', 'PDF_info_matchbox' => 'pdflib/PDFlib.stub', 'PDF_info_path' => 'pdflib/PDFlib.stub', 'PDF_info_pdi_page' => 'pdflib/PDFlib.stub', 'PDF_info_pvf' => 'pdflib/PDFlib.stub', 'PDF_info_table' => 'pdflib/PDFlib.stub', 'PDF_info_textflow' => 'pdflib/PDFlib.stub', 'PDF_info_textline' => 'pdflib/PDFlib.stub', 'PDF_initgraphics' => 'pdflib/PDFlib.stub', 'PDF_lineto' => 'pdflib/PDFlib.stub', 'PDF_load_3ddata' => 'pdflib/PDFlib.stub', 'PDF_load_font' => 'pdflib/PDFlib.stub', 'PDF_load_iccprofile' => 'pdflib/PDFlib.stub', 'PDF_load_image' => 'pdflib/PDFlib.stub', 'PDF_makespotcolor' => 'pdflib/PDFlib.stub', 'PDF_moveto' => 'pdflib/PDFlib.stub', 'PDF_new' => 'pdflib/PDFlib.stub', 'PDF_open_ccitt' => 'pdflib/PDFlib.stub', 'PDF_open_file' => 'pdflib/PDFlib.stub', 'PDF_open_image' => 'pdflib/PDFlib.stub', 'PDF_open_image_file' => 'pdflib/PDFlib.stub', 'PDF_open_memory_image' => 'pdflib/PDFlib.stub', 'PDF_open_pdi' => 'pdflib/PDFlib.stub', 'PDF_open_pdi_document' => 'pdflib/PDFlib.stub', 'PDF_open_pdi_page' => 'pdflib/PDFlib.stub', 'PDF_pcos_get_number' => 'pdflib/PDFlib.stub', 'PDF_pcos_get_stream' => 'pdflib/PDFlib.stub', 'PDF_pcos_get_string' => 'pdflib/PDFlib.stub', 'PDF_place_image' => 'pdflib/PDFlib.stub', 'PDF_place_pdi_page' => 'pdflib/PDFlib.stub', 'PDF_process_pdi' => 'pdflib/PDFlib.stub', 'PDF_rect' => 'pdflib/PDFlib.stub', 'PDF_restore' => 'pdflib/PDFlib.stub', 'PDF_resume_page' => 'pdflib/PDFlib.stub', 'PDF_rotate' => 'pdflib/PDFlib.stub', 'PDF_save' => 'pdflib/PDFlib.stub', 'PDF_scale' => 'pdflib/PDFlib.stub', 'PDF_set_border_color' => 'pdflib/PDFlib.stub', 'PDF_set_border_dash' => 'pdflib/PDFlib.stub', 'PDF_set_border_style' => 'pdflib/PDFlib.stub', 'PDF_set_gstate' => 'pdflib/PDFlib.stub', 'PDF_set_info' => 'pdflib/PDFlib.stub', 'PDF_set_layer_dependency' => 'pdflib/PDFlib.stub', 'PDF_set_option' => 'pdflib/PDFlib.stub', 'PDF_set_parameter' => 'pdflib/PDFlib.stub', 'PDF_set_text_option' => 'pdflib/PDFlib.stub', 'PDF_set_text_pos' => 'pdflib/PDFlib.stub', 'PDF_set_value' => 'pdflib/PDFlib.stub', 'PDF_setcolor' => 'pdflib/PDFlib.stub', 'PDF_setdash' => 'pdflib/PDFlib.stub', 'PDF_setdashpattern' => 'pdflib/PDFlib.stub', 'PDF_setflat' => 'pdflib/PDFlib.stub', 'PDF_setfont' => 'pdflib/PDFlib.stub', 'PDF_setgray' => 'pdflib/PDFlib.stub', 'PDF_setgray_fill' => 'pdflib/PDFlib.stub', 'PDF_setgray_stroke' => 'pdflib/PDFlib.stub', 'PDF_setlinecap' => 'pdflib/PDFlib.stub', 'PDF_setlinejoin' => 'pdflib/PDFlib.stub', 'PDF_setlinewidth' => 'pdflib/PDFlib.stub', 'PDF_setmatrix' => 'pdflib/PDFlib.stub', 'PDF_setmiterlimit' => 'pdflib/PDFlib.stub', 'PDF_setrgbcolor' => 'pdflib/PDFlib.stub', 'PDF_setrgbcolor_fill' => 'pdflib/PDFlib.stub', 'PDF_setrgbcolor_stroke' => 'pdflib/PDFlib.stub', 'PDF_shading' => 'pdflib/PDFlib.stub', 'PDF_shading_pattern' => 'pdflib/PDFlib.stub', 'PDF_shfill' => 'pdflib/PDFlib.stub', 'PDF_show' => 'pdflib/PDFlib.stub', 'PDF_show_boxed' => 'pdflib/PDFlib.stub', 'PDF_show_xy' => 'pdflib/PDFlib.stub', 'PDF_skew' => 'pdflib/PDFlib.stub', 'PDF_stringwidth' => 'pdflib/PDFlib.stub', 'PDF_stroke' => 'pdflib/PDFlib.stub', 'PDF_suspend_page' => 'pdflib/PDFlib.stub', 'PDF_translate' => 'pdflib/PDFlib.stub', 'PDF_utf16_to_utf8' => 'pdflib/PDFlib.stub', 'PDF_utf32_to_utf16' => 'pdflib/PDFlib.stub', 'PDF_utf8_to_utf16' => 'pdflib/PDFlib.stub', 'PS_UNRESERVE_PREFIX___halt_compiler' => 'standard/_standard_manual.stub', 'PS_UNRESERVE_PREFIX_array' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_die' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_empty' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_eval' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_exit' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_isset' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_list' => 'standard/_types.stub', 'PS_UNRESERVE_PREFIX_unset' => 'standard/_types.stub', 'SQLSRV_PHPTYPE_STREAM' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PHPTYPE_STRING' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_BINARY' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_CHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_DECIMAL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NCHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NUMERIC' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NVARCHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_VARBINARY' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_VARCHAR' => 'sqlsrv/sqlsrv.stub', 'Sodium\\add' => 'libsodium/libsodium.stub', 'Sodium\\bin2hex' => 'libsodium/libsodium.stub', 'Sodium\\compare' => 'libsodium/libsodium.stub', 'Sodium\\crypto_aead_aes256gcm_decrypt' => 'libsodium/libsodium.stub', 'Sodium\\crypto_aead_aes256gcm_encrypt' => 'libsodium/libsodium.stub', 'Sodium\\crypto_aead_aes256gcm_is_available' => 'libsodium/libsodium.stub', 'Sodium\\crypto_aead_chacha20poly1305_decrypt' => 'libsodium/libsodium.stub', 'Sodium\\crypto_aead_chacha20poly1305_encrypt' => 'libsodium/libsodium.stub', 'Sodium\\crypto_auth' => 'libsodium/libsodium.stub', 'Sodium\\crypto_auth_verify' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_keypair' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_keypair_from_secretkey_and_publickey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_open' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_publickey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_publickey_from_secretkey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_seal' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_seal_open' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_secretkey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_box_seed_keypair' => 'libsodium/libsodium.stub', 'Sodium\\crypto_generichash' => 'libsodium/libsodium.stub', 'Sodium\\crypto_generichash_final' => 'libsodium/libsodium.stub', 'Sodium\\crypto_generichash_init' => 'libsodium/libsodium.stub', 'Sodium\\crypto_generichash_update' => 'libsodium/libsodium.stub', 'Sodium\\crypto_kx' => 'libsodium/libsodium.stub', 'Sodium\\crypto_pwhash' => 'libsodium/libsodium.stub', 'Sodium\\crypto_pwhash_scryptsalsa208sha256' => 'libsodium/libsodium.stub', 'Sodium\\crypto_pwhash_scryptsalsa208sha256_str' => 'libsodium/libsodium.stub', 'Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify' => 'libsodium/libsodium.stub', 'Sodium\\crypto_pwhash_str' => 'libsodium/libsodium.stub', 'Sodium\\crypto_pwhash_str_verify' => 'libsodium/libsodium.stub', 'Sodium\\crypto_scalarmult' => 'libsodium/libsodium.stub', 'Sodium\\crypto_scalarmult_base' => 'libsodium/libsodium.stub', 'Sodium\\crypto_secretbox' => 'libsodium/libsodium.stub', 'Sodium\\crypto_secretbox_open' => 'libsodium/libsodium.stub', 'Sodium\\crypto_shorthash' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_detached' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_ed25519_pk_to_curve25519' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_ed25519_sk_to_curve25519' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_keypair' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_keypair_from_secretkey_and_publickey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_open' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_publickey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_publickey_from_secretkey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_secretkey' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_seed_keypair' => 'libsodium/libsodium.stub', 'Sodium\\crypto_sign_verify_detached' => 'libsodium/libsodium.stub', 'Sodium\\crypto_stream' => 'libsodium/libsodium.stub', 'Sodium\\crypto_stream_xor' => 'libsodium/libsodium.stub', 'Sodium\\hex2bin' => 'libsodium/libsodium.stub', 'Sodium\\increment' => 'libsodium/libsodium.stub', 'Sodium\\library_version_major' => 'libsodium/libsodium.stub', 'Sodium\\library_version_minor' => 'libsodium/libsodium.stub', 'Sodium\\memcmp' => 'libsodium/libsodium.stub', 'Sodium\\memzero' => 'libsodium/libsodium.stub', 'Sodium\\randombytes_buf' => 'libsodium/libsodium.stub', 'Sodium\\randombytes_random16' => 'libsodium/libsodium.stub', 'Sodium\\randombytes_uniform' => 'libsodium/libsodium.stub', 'Sodium\\version_string' => 'libsodium/libsodium.stub', 'Zstd\\compress' => 'zstd/zstd.stub', 'Zstd\\compress_dict' => 'zstd/zstd.stub', 'Zstd\\uncompress' => 'zstd/zstd.stub', 'Zstd\\uncompress_dict' => 'zstd/zstd.stub', '_' => 'gettext/gettext.stub', 'abs' => 'standard/standard_3.stub', 'accelerator_set_status' => 'zend/zend.stub', 'acos' => 'standard/standard_3.stub', 'acosh' => 'standard/standard_3.stub', 'addcslashes' => 'standard/standard_1.stub', 'addslashes' => 'standard/standard_1.stub', 'apache_child_terminate' => 'apache/apache.stub', 'apache_get_modules' => 'apache/apache.stub', 'apache_get_version' => 'apache/apache.stub', 'apache_getenv' => 'apache/apache.stub', 'apache_lookup_uri' => 'apache/apache.stub', 'apache_note' => 'apache/apache.stub', 'apache_request_headers' => 'standard/standard_4.stub', 'apache_reset_timeout' => 'apache/apache.stub', 'apache_response_headers' => 'apache/apache.stub', 'apache_setenv' => 'apache/apache.stub', 'apc_add' => 'apcu/apcu.stub', 'apc_bin_dump' => 'apcu/apcu.stub', 'apc_bin_dumpfile' => 'apcu/apcu.stub', 'apc_bin_load' => 'apcu/apcu.stub', 'apc_bin_loadfile' => 'apcu/apcu.stub', 'apc_cache_info' => 'apcu/apcu.stub', 'apc_cas' => 'apcu/apcu.stub', 'apc_clear_cache' => 'apcu/apcu.stub', 'apc_compile_file' => 'apcu/apcu.stub', 'apc_dec' => 'apcu/apcu.stub', 'apc_define_constants' => 'apcu/apcu.stub', 'apc_delete' => 'apcu/apcu.stub', 'apc_delete_file' => 'apcu/apcu.stub', 'apc_exists' => 'apcu/apcu.stub', 'apc_fetch' => 'apcu/apcu.stub', 'apc_inc' => 'apcu/apcu.stub', 'apc_load_constants' => 'apcu/apcu.stub', 'apc_sma_info' => 'apcu/apcu.stub', 'apc_store' => 'apcu/apcu.stub', 'apcu_add' => 'apcu/apcu.stub', 'apcu_cache_info' => 'apcu/apcu.stub', 'apcu_cas' => 'apcu/apcu.stub', 'apcu_clear_cache' => 'apcu/apcu.stub', 'apcu_dec' => 'apcu/apcu.stub', 'apcu_delete' => 'apcu/apcu.stub', 'apcu_enabled' => 'apcu/apcu.stub', 'apcu_entry' => 'apcu/apcu.stub', 'apcu_exists' => 'apcu/apcu.stub', 'apcu_fetch' => 'apcu/apcu.stub', 'apcu_inc' => 'apcu/apcu.stub', 'apcu_key_info' => 'apcu/apcu.stub', 'apcu_sma_info' => 'apcu/apcu.stub', 'apcu_store' => 'apcu/apcu.stub', 'array_all' => 'standard/standard_10.stub', 'array_any' => 'standard/standard_10.stub', 'array_change_key_case' => 'standard/standard_9.stub', 'array_chunk' => 'standard/standard_9.stub', 'array_column' => 'standard/standard_9.stub', 'array_combine' => 'standard/standard_9.stub', 'array_count_values' => 'standard/standard_9.stub', 'array_diff' => 'standard/standard_9.stub', 'array_diff_assoc' => 'standard/standard_9.stub', 'array_diff_key' => 'standard/standard_9.stub', 'array_diff_uassoc' => 'standard/standard_9.stub', 'array_diff_ukey' => 'standard/standard_9.stub', 'array_fill' => 'standard/standard_8.stub', 'array_fill_keys' => 'standard/standard_8.stub', 'array_filter' => 'standard/standard_9.stub', 'array_find' => 'standard/standard_10.stub', 'array_find_key' => 'standard/standard_10.stub', 'array_flip' => 'standard/standard_9.stub', 'array_intersect' => 'standard/standard_9.stub', 'array_intersect_assoc' => 'standard/standard_9.stub', 'array_intersect_key' => 'standard/standard_9.stub', 'array_intersect_uassoc' => 'standard/standard_9.stub', 'array_intersect_ukey' => 'standard/standard_9.stub', 'array_is_list' => 'standard/standard_9.stub', 'array_key_exists' => 'standard/standard_9.stub', 'array_key_first' => 'standard/standard_9.stub', 'array_key_last' => 'standard/standard_9.stub', 'array_keys' => 'standard/standard_9.stub', 'array_map' => 'standard/standard_9.stub', 'array_merge' => 'standard/standard_8.stub', 'array_merge_recursive' => 'standard/standard_9.stub', 'array_multisort' => 'standard/standard_8.stub', 'array_pad' => 'standard/standard_9.stub', 'array_pop' => 'standard/standard_8.stub', 'array_product' => 'standard/standard_9.stub', 'array_push' => 'standard/standard_8.stub', 'array_rand' => 'standard/standard_9.stub', 'array_reduce' => 'standard/standard_9.stub', 'array_replace' => 'standard/standard_9.stub', 'array_replace_recursive' => 'standard/standard_9.stub', 'array_reverse' => 'standard/standard_9.stub', 'array_search' => 'standard/standard_8.stub', 'array_shift' => 'standard/standard_8.stub', 'array_slice' => 'standard/standard_8.stub', 'array_splice' => 'standard/standard_8.stub', 'array_sum' => 'standard/standard_9.stub', 'array_udiff' => 'standard/standard_9.stub', 'array_udiff_assoc' => 'standard/standard_9.stub', 'array_udiff_uassoc' => 'standard/standard_9.stub', 'array_uintersect' => 'standard/standard_9.stub', 'array_uintersect_assoc' => 'standard/standard_9.stub', 'array_uintersect_uassoc' => 'standard/standard_9.stub', 'array_unique' => 'standard/standard_9.stub', 'array_unshift' => 'standard/standard_8.stub', 'array_values' => 'standard/standard_9.stub', 'array_walk' => 'standard/standard_8.stub', 'array_walk_recursive' => 'standard/standard_8.stub', 'arsort' => 'standard/standard_8.stub', 'asin' => 'standard/standard_3.stub', 'asinh' => 'standard/standard_3.stub', 'asort' => 'standard/standard_8.stub', 'assert' => 'standard/standard_9.stub', 'assert_options' => 'standard/standard_9.stub', 'ast\\get_kind_name' => 'ast/ast.stub', 'ast\\get_metadata' => 'ast/ast.stub', 'ast\\get_supported_versions' => 'ast/ast.stub', 'ast\\kind_uses_flags' => 'ast/ast.stub', 'ast\\parse_code' => 'ast/ast.stub', 'ast\\parse_file' => 'ast/ast.stub', 'atan' => 'standard/standard_3.stub', 'atan2' => 'standard/standard_3.stub', 'atanh' => 'standard/standard_3.stub', 'base64_decode' => 'standard/standard_3.stub', 'base64_encode' => 'standard/standard_3.stub', 'base_convert' => 'standard/standard_3.stub', 'basename' => 'standard/standard_1.stub', 'bcadd' => 'bcmath/bcmath.stub', 'bcceil' => 'bcmath/bcmath.stub', 'bccomp' => 'bcmath/bcmath.stub', 'bcdiv' => 'bcmath/bcmath.stub', 'bcfloor' => 'bcmath/bcmath.stub', 'bcmod' => 'bcmath/bcmath.stub', 'bcmul' => 'bcmath/bcmath.stub', 'bcpow' => 'bcmath/bcmath.stub', 'bcpowmod' => 'bcmath/bcmath.stub', 'bcround' => 'bcmath/bcmath.stub', 'bcscale' => 'bcmath/bcmath.stub', 'bcsqrt' => 'bcmath/bcmath.stub', 'bcsub' => 'bcmath/bcmath.stub', 'bin2hex' => 'standard/standard_0.stub', 'bind_textdomain_codeset' => 'gettext/gettext.stub', 'bindec' => 'standard/standard_3.stub', 'bindtextdomain' => 'gettext/gettext.stub', 'boolval' => 'standard/standard_5.stub', 'brotli_compress' => 'brotli/brotli.stub', 'brotli_compress_add' => 'brotli/brotli.stub', 'brotli_compress_init' => 'brotli/brotli.stub', 'brotli_uncompress' => 'brotli/brotli.stub', 'brotli_uncompress_add' => 'brotli/brotli.stub', 'brotli_uncompress_init' => 'brotli/brotli.stub', 'bzclose' => 'bz2/bz2.stub', 'bzcompress' => 'bz2/bz2.stub', 'bzdecompress' => 'bz2/bz2.stub', 'bzerrno' => 'bz2/bz2.stub', 'bzerror' => 'bz2/bz2.stub', 'bzerrstr' => 'bz2/bz2.stub', 'bzflush' => 'bz2/bz2.stub', 'bzopen' => 'bz2/bz2.stub', 'bzread' => 'bz2/bz2.stub', 'bzwrite' => 'bz2/bz2.stub', 'cal_days_in_month' => 'calendar/calendar.stub', 'cal_from_jd' => 'calendar/calendar.stub', 'cal_info' => 'calendar/calendar.stub', 'cal_to_jd' => 'calendar/calendar.stub', 'call_user_func' => 'standard/standard_4.stub', 'call_user_func_array' => 'standard/standard_4.stub', 'call_user_method' => 'standard/standard_4.stub', 'call_user_method_array' => 'standard/standard_4.stub', 'ceil' => 'standard/standard_3.stub', 'chdir' => 'standard/standard_7.stub', 'checkdate' => 'date/date.stub', 'checkdnsrr' => 'standard/standard_4.stub', 'chgrp' => 'standard/standard_7.stub', 'chmod' => 'standard/standard_7.stub', 'chop' => 'standard/standard_2.stub', 'chown' => 'standard/standard_7.stub', 'chr' => 'standard/standard_2.stub', 'chroot' => 'standard/standard_7.stub', 'chunk_split' => 'standard/standard_1.stub', 'class_alias' => 'Core/Core.stub', 'class_exists' => 'Core/Core.stub', 'class_implements' => 'SPL/SPL_f.stub', 'class_parents' => 'SPL/SPL_f.stub', 'class_uses' => 'SPL/SPL_f.stub', 'clearstatcache' => 'standard/standard_7.stub', 'cli_get_process_title' => 'standard/basic.stub', 'cli_set_process_title' => 'standard/basic.stub', 'closedir' => 'standard/standard_7.stub', 'closelog' => 'standard/standard_8.stub', 'collator_asort' => 'intl/intl.stub', 'collator_compare' => 'intl/intl.stub', 'collator_create' => 'intl/intl.stub', 'collator_get_attribute' => 'intl/intl.stub', 'collator_get_error_code' => 'intl/intl.stub', 'collator_get_error_message' => 'intl/intl.stub', 'collator_get_locale' => 'intl/intl.stub', 'collator_get_sort_key' => 'intl/intl.stub', 'collator_get_strength' => 'intl/intl.stub', 'collator_set_attribute' => 'intl/intl.stub', 'collator_set_strength' => 'intl/intl.stub', 'collator_sort' => 'intl/intl.stub', 'collator_sort_with_sort_keys' => 'intl/intl.stub', 'com_create_guid' => 'com_dotnet/com_dotnet.stub', 'com_event_sink' => 'com_dotnet/com_dotnet.stub', 'com_get_active_object' => 'com_dotnet/com_dotnet.stub', 'com_load_typelib' => 'com_dotnet/com_dotnet.stub', 'com_message_pump' => 'com_dotnet/com_dotnet.stub', 'com_print_typeinfo' => 'com_dotnet/com_dotnet.stub', 'compact' => 'standard/standard_8.stub', 'config_get_hash' => 'xdebug/xdebug.stub', 'confirm_pdo_ibm_compiled' => 'PDO/PDO.stub', 'connection_aborted' => 'standard/standard_4.stub', 'connection_status' => 'standard/standard_4.stub', 'constant' => 'standard/standard_0.stub', 'convert_cyr_string' => 'standard/standard_3.stub', 'convert_uudecode' => 'standard/standard_3.stub', 'convert_uuencode' => 'standard/standard_3.stub', 'copy' => 'standard/standard_5.stub', 'cos' => 'standard/standard_3.stub', 'cosh' => 'standard/standard_3.stub', 'count' => 'standard/standard_8.stub', 'count_chars' => 'standard/standard_1.stub', 'crc32' => 'standard/standard_0.stub', 'create_function' => 'Core/Core.stub', 'crypt' => 'standard/standard_7.stub', 'ctype_alnum' => 'ctype/ctype.stub', 'ctype_alpha' => 'ctype/ctype.stub', 'ctype_cntrl' => 'ctype/ctype.stub', 'ctype_digit' => 'ctype/ctype.stub', 'ctype_graph' => 'ctype/ctype.stub', 'ctype_lower' => 'ctype/ctype.stub', 'ctype_print' => 'ctype/ctype.stub', 'ctype_punct' => 'ctype/ctype.stub', 'ctype_space' => 'ctype/ctype.stub', 'ctype_upper' => 'ctype/ctype.stub', 'ctype_xdigit' => 'ctype/ctype.stub', 'cubrid_affected_rows' => 'cubrid/cubrid.stub', 'cubrid_bind' => 'cubrid/cubrid.stub', 'cubrid_client_encoding' => 'cubrid/cubrid.stub', 'cubrid_close' => 'cubrid/cubrid.stub', 'cubrid_close_prepare' => 'cubrid/cubrid.stub', 'cubrid_close_request' => 'cubrid/cubrid.stub', 'cubrid_col_get' => 'cubrid/cubrid.stub', 'cubrid_col_size' => 'cubrid/cubrid.stub', 'cubrid_column_names' => 'cubrid/cubrid.stub', 'cubrid_column_types' => 'cubrid/cubrid.stub', 'cubrid_commit' => 'cubrid/cubrid.stub', 'cubrid_connect' => 'cubrid/cubrid.stub', 'cubrid_connect_with_url' => 'cubrid/cubrid.stub', 'cubrid_current_oid' => 'cubrid/cubrid.stub', 'cubrid_data_seek' => 'cubrid/cubrid.stub', 'cubrid_db_name' => 'cubrid/cubrid.stub', 'cubrid_db_parameter' => 'cubrid/cubrid.stub', 'cubrid_disconnect' => 'cubrid/cubrid.stub', 'cubrid_drop' => 'cubrid/cubrid.stub', 'cubrid_errno' => 'cubrid/cubrid.stub', 'cubrid_error' => 'cubrid/cubrid.stub', 'cubrid_error_code' => 'cubrid/cubrid.stub', 'cubrid_error_code_facility' => 'cubrid/cubrid.stub', 'cubrid_error_msg' => 'cubrid/cubrid.stub', 'cubrid_execute' => 'cubrid/cubrid.stub', 'cubrid_fetch' => 'cubrid/cubrid.stub', 'cubrid_fetch_array' => 'cubrid/cubrid.stub', 'cubrid_fetch_assoc' => 'cubrid/cubrid.stub', 'cubrid_fetch_field' => 'cubrid/cubrid.stub', 'cubrid_fetch_lengths' => 'cubrid/cubrid.stub', 'cubrid_fetch_object' => 'cubrid/cubrid.stub', 'cubrid_fetch_row' => 'cubrid/cubrid.stub', 'cubrid_field_flags' => 'cubrid/cubrid.stub', 'cubrid_field_len' => 'cubrid/cubrid.stub', 'cubrid_field_name' => 'cubrid/cubrid.stub', 'cubrid_field_seek' => 'cubrid/cubrid.stub', 'cubrid_field_table' => 'cubrid/cubrid.stub', 'cubrid_field_type' => 'cubrid/cubrid.stub', 'cubrid_free_result' => 'cubrid/cubrid.stub', 'cubrid_get' => 'cubrid/cubrid.stub', 'cubrid_get_autocommit' => 'cubrid/cubrid.stub', 'cubrid_get_charset' => 'cubrid/cubrid.stub', 'cubrid_get_class_name' => 'cubrid/cubrid.stub', 'cubrid_get_client_info' => 'cubrid/cubrid.stub', 'cubrid_get_db_parameter' => 'cubrid/cubrid.stub', 'cubrid_get_query_timeout' => 'cubrid/cubrid.stub', 'cubrid_get_server_info' => 'cubrid/cubrid.stub', 'cubrid_insert_id' => 'cubrid/cubrid.stub', 'cubrid_is_instance' => 'cubrid/cubrid.stub', 'cubrid_list_dbs' => 'cubrid/cubrid.stub', 'cubrid_lob2_bind' => 'cubrid/cubrid.stub', 'cubrid_lob2_close' => 'cubrid/cubrid.stub', 'cubrid_lob2_export' => 'cubrid/cubrid.stub', 'cubrid_lob2_import' => 'cubrid/cubrid.stub', 'cubrid_lob2_new' => 'cubrid/cubrid.stub', 'cubrid_lob2_read' => 'cubrid/cubrid.stub', 'cubrid_lob2_seek' => 'cubrid/cubrid.stub', 'cubrid_lob2_seek64' => 'cubrid/cubrid.stub', 'cubrid_lob2_size' => 'cubrid/cubrid.stub', 'cubrid_lob2_size64' => 'cubrid/cubrid.stub', 'cubrid_lob2_tell' => 'cubrid/cubrid.stub', 'cubrid_lob2_tell64' => 'cubrid/cubrid.stub', 'cubrid_lob2_write' => 'cubrid/cubrid.stub', 'cubrid_lob_close' => 'cubrid/cubrid.stub', 'cubrid_lob_export' => 'cubrid/cubrid.stub', 'cubrid_lob_get' => 'cubrid/cubrid.stub', 'cubrid_lob_send' => 'cubrid/cubrid.stub', 'cubrid_lob_size' => 'cubrid/cubrid.stub', 'cubrid_lock_read' => 'cubrid/cubrid.stub', 'cubrid_lock_write' => 'cubrid/cubrid.stub', 'cubrid_move_cursor' => 'cubrid/cubrid.stub', 'cubrid_next_result' => 'cubrid/cubrid.stub', 'cubrid_num_cols' => 'cubrid/cubrid.stub', 'cubrid_num_fields' => 'cubrid/cubrid.stub', 'cubrid_num_rows' => 'cubrid/cubrid.stub', 'cubrid_pconnect' => 'cubrid/cubrid.stub', 'cubrid_pconnect_with_url' => 'cubrid/cubrid.stub', 'cubrid_ping' => 'cubrid/cubrid.stub', 'cubrid_prepare' => 'cubrid/cubrid.stub', 'cubrid_put' => 'cubrid/cubrid.stub', 'cubrid_query' => 'cubrid/cubrid.stub', 'cubrid_real_escape_string' => 'cubrid/cubrid.stub', 'cubrid_result' => 'cubrid/cubrid.stub', 'cubrid_rollback' => 'cubrid/cubrid.stub', 'cubrid_schema' => 'cubrid/cubrid.stub', 'cubrid_seq_add' => 'cubrid/cubrid.stub', 'cubrid_seq_drop' => 'cubrid/cubrid.stub', 'cubrid_seq_insert' => 'cubrid/cubrid.stub', 'cubrid_seq_put' => 'cubrid/cubrid.stub', 'cubrid_set_add' => 'cubrid/cubrid.stub', 'cubrid_set_autocommit' => 'cubrid/cubrid.stub', 'cubrid_set_db_parameter' => 'cubrid/cubrid.stub', 'cubrid_set_drop' => 'cubrid/cubrid.stub', 'cubrid_set_query_timeout' => 'cubrid/cubrid.stub', 'cubrid_unbuffered_query' => 'cubrid/cubrid.stub', 'cubrid_version' => 'cubrid/cubrid.stub', 'curl_close' => 'curl/curl.stub', 'curl_copy_handle' => 'curl/curl.stub', 'curl_errno' => 'curl/curl.stub', 'curl_error' => 'curl/curl.stub', 'curl_escape' => 'curl/curl.stub', 'curl_exec' => 'curl/curl.stub', 'curl_file_create' => 'curl/curl.stub', 'curl_getinfo' => 'curl/curl.stub', 'curl_init' => 'curl/curl.stub', 'curl_multi_add_handle' => 'curl/curl.stub', 'curl_multi_close' => 'curl/curl.stub', 'curl_multi_errno' => 'curl/curl.stub', 'curl_multi_exec' => 'curl/curl.stub', 'curl_multi_getcontent' => 'curl/curl.stub', 'curl_multi_info_read' => 'curl/curl.stub', 'curl_multi_init' => 'curl/curl.stub', 'curl_multi_remove_handle' => 'curl/curl.stub', 'curl_multi_select' => 'curl/curl.stub', 'curl_multi_setopt' => 'curl/curl.stub', 'curl_multi_strerror' => 'curl/curl.stub', 'curl_pause' => 'curl/curl.stub', 'curl_reset' => 'curl/curl.stub', 'curl_setopt' => 'curl/curl.stub', 'curl_setopt_array' => 'curl/curl.stub', 'curl_share_close' => 'curl/curl.stub', 'curl_share_errno' => 'curl/curl.stub', 'curl_share_init' => 'curl/curl.stub', 'curl_share_setopt' => 'curl/curl.stub', 'curl_share_strerror' => 'curl/curl.stub', 'curl_strerror' => 'curl/curl.stub', 'curl_unescape' => 'curl/curl.stub', 'curl_upkeep' => 'curl/curl.stub', 'curl_version' => 'curl/curl.stub', 'current' => 'standard/standard_8.stub', 'date' => 'date/date.stub', 'date_add' => 'date/date.stub', 'date_create' => 'date/date.stub', 'date_create_from_format' => 'date/date.stub', 'date_create_immutable' => 'date/date.stub', 'date_create_immutable_from_format' => 'date/date.stub', 'date_date_set' => 'date/date.stub', 'date_default_timezone_get' => 'date/date.stub', 'date_default_timezone_set' => 'date/date.stub', 'date_diff' => 'date/date.stub', 'date_format' => 'date/date.stub', 'date_get_last_errors' => 'date/date.stub', 'date_interval_create_from_date_string' => 'date/date.stub', 'date_interval_format' => 'date/date.stub', 'date_isodate_set' => 'date/date.stub', 'date_modify' => 'date/date.stub', 'date_offset_get' => 'date/date.stub', 'date_parse' => 'date/date.stub', 'date_parse_from_format' => 'date/date.stub', 'date_sub' => 'date/date.stub', 'date_sun_info' => 'date/date.stub', 'date_sunrise' => 'date/date.stub', 'date_sunset' => 'date/date.stub', 'date_time_set' => 'date/date.stub', 'date_timestamp_get' => 'date/date.stub', 'date_timestamp_set' => 'date/date.stub', 'date_timezone_get' => 'date/date.stub', 'date_timezone_set' => 'date/date.stub', 'datefmt_create' => 'intl/intl.stub', 'datefmt_format' => 'intl/intl.stub', 'datefmt_format_object' => 'intl/intl.stub', 'datefmt_get_calendar' => 'intl/intl.stub', 'datefmt_get_calendar_object' => 'intl/intl.stub', 'datefmt_get_datetype' => 'intl/intl.stub', 'datefmt_get_error_code' => 'intl/intl.stub', 'datefmt_get_error_message' => 'intl/intl.stub', 'datefmt_get_locale' => 'intl/intl.stub', 'datefmt_get_pattern' => 'intl/intl.stub', 'datefmt_get_timetype' => 'intl/intl.stub', 'datefmt_get_timezone' => 'intl/intl.stub', 'datefmt_get_timezone_id' => 'intl/intl.stub', 'datefmt_is_lenient' => 'intl/intl.stub', 'datefmt_localtime' => 'intl/intl.stub', 'datefmt_parse' => 'intl/intl.stub', 'datefmt_set_calendar' => 'intl/intl.stub', 'datefmt_set_lenient' => 'intl/intl.stub', 'datefmt_set_pattern' => 'intl/intl.stub', 'datefmt_set_timezone' => 'intl/intl.stub', 'datefmt_set_timezone_id' => 'intl/intl.stub', 'db2_autocommit' => 'ibm_db2/ibm_db2.stub', 'db2_bind_param' => 'ibm_db2/ibm_db2.stub', 'db2_client_info' => 'ibm_db2/ibm_db2.stub', 'db2_close' => 'ibm_db2/ibm_db2.stub', 'db2_column_privileges' => 'ibm_db2/ibm_db2.stub', 'db2_columnprivileges' => 'ibm_db2/ibm_db2.stub', 'db2_columns' => 'ibm_db2/ibm_db2.stub', 'db2_commit' => 'ibm_db2/ibm_db2.stub', 'db2_conn_error' => 'ibm_db2/ibm_db2.stub', 'db2_conn_errormsg' => 'ibm_db2/ibm_db2.stub', 'db2_connect' => 'ibm_db2/ibm_db2.stub', 'db2_cursor_type' => 'ibm_db2/ibm_db2.stub', 'db2_escape_string' => 'ibm_db2/ibm_db2.stub', 'db2_exec' => 'ibm_db2/ibm_db2.stub', 'db2_execute' => 'ibm_db2/ibm_db2.stub', 'db2_fetch_array' => 'ibm_db2/ibm_db2.stub', 'db2_fetch_assoc' => 'ibm_db2/ibm_db2.stub', 'db2_fetch_both' => 'ibm_db2/ibm_db2.stub', 'db2_fetch_object' => 'ibm_db2/ibm_db2.stub', 'db2_fetch_row' => 'ibm_db2/ibm_db2.stub', 'db2_field_display_size' => 'ibm_db2/ibm_db2.stub', 'db2_field_name' => 'ibm_db2/ibm_db2.stub', 'db2_field_num' => 'ibm_db2/ibm_db2.stub', 'db2_field_precision' => 'ibm_db2/ibm_db2.stub', 'db2_field_scale' => 'ibm_db2/ibm_db2.stub', 'db2_field_type' => 'ibm_db2/ibm_db2.stub', 'db2_field_width' => 'ibm_db2/ibm_db2.stub', 'db2_foreign_keys' => 'ibm_db2/ibm_db2.stub', 'db2_foreignkeys' => 'ibm_db2/ibm_db2.stub', 'db2_free_result' => 'ibm_db2/ibm_db2.stub', 'db2_free_stmt' => 'ibm_db2/ibm_db2.stub', 'db2_get_option' => 'ibm_db2/ibm_db2.stub', 'db2_last_insert_id' => 'ibm_db2/ibm_db2.stub', 'db2_lob_read' => 'ibm_db2/ibm_db2.stub', 'db2_next_result' => 'ibm_db2/ibm_db2.stub', 'db2_num_fields' => 'ibm_db2/ibm_db2.stub', 'db2_num_rows' => 'ibm_db2/ibm_db2.stub', 'db2_pclose' => 'ibm_db2/ibm_db2.stub', 'db2_pconnect' => 'ibm_db2/ibm_db2.stub', 'db2_prepare' => 'ibm_db2/ibm_db2.stub', 'db2_primary_keys' => 'ibm_db2/ibm_db2.stub', 'db2_primarykeys' => 'ibm_db2/ibm_db2.stub', 'db2_procedure_columns' => 'ibm_db2/ibm_db2.stub', 'db2_procedurecolumns' => 'ibm_db2/ibm_db2.stub', 'db2_procedures' => 'ibm_db2/ibm_db2.stub', 'db2_result' => 'ibm_db2/ibm_db2.stub', 'db2_rollback' => 'ibm_db2/ibm_db2.stub', 'db2_server_info' => 'ibm_db2/ibm_db2.stub', 'db2_set_option' => 'ibm_db2/ibm_db2.stub', 'db2_setoption' => 'ibm_db2/ibm_db2.stub', 'db2_special_columns' => 'ibm_db2/ibm_db2.stub', 'db2_specialcolumns' => 'ibm_db2/ibm_db2.stub', 'db2_statistics' => 'ibm_db2/ibm_db2.stub', 'db2_stmt_error' => 'ibm_db2/ibm_db2.stub', 'db2_stmt_errormsg' => 'ibm_db2/ibm_db2.stub', 'db2_table_privileges' => 'ibm_db2/ibm_db2.stub', 'db2_tableprivileges' => 'ibm_db2/ibm_db2.stub', 'db2_tables' => 'ibm_db2/ibm_db2.stub', 'dba_close' => 'dba/dba.stub', 'dba_delete' => 'dba/dba.stub', 'dba_exists' => 'dba/dba.stub', 'dba_fetch' => 'dba/dba.stub', 'dba_firstkey' => 'dba/dba.stub', 'dba_handlers' => 'dba/dba.stub', 'dba_insert' => 'dba/dba.stub', 'dba_key_split' => 'dba/dba.stub', 'dba_list' => 'dba/dba.stub', 'dba_nextkey' => 'dba/dba.stub', 'dba_open' => 'dba/dba.stub', 'dba_optimize' => 'dba/dba.stub', 'dba_popen' => 'dba/dba.stub', 'dba_replace' => 'dba/dba.stub', 'dba_sync' => 'dba/dba.stub', 'dcgettext' => 'gettext/gettext.stub', 'dcngettext' => 'gettext/gettext.stub', 'debug_backtrace' => 'Core/Core.stub', 'debug_print_backtrace' => 'Core/Core.stub', 'debug_zval_dump' => 'standard/standard_4.stub', 'debugger_connect' => 'ZendDebugger/ZendDebugger.stub', 'debugger_connector_pid' => 'ZendDebugger/ZendDebugger.stub', 'debugger_get_server_start_time' => 'ZendDebugger/ZendDebugger.stub', 'debugger_print' => 'ZendDebugger/ZendDebugger.stub', 'debugger_start_debug' => 'ZendDebugger/ZendDebugger.stub', 'decbin' => 'standard/standard_3.stub', 'dechex' => 'standard/standard_3.stub', 'decoct' => 'standard/standard_3.stub', 'defer' => 'swoole/functions.stub', 'define' => 'Core/Core.stub', 'define_syslog_variables' => 'standard/standard_8.stub', 'defined' => 'Core/Core.stub', 'deflate_add' => 'zlib/zlib.stub', 'deflate_init' => 'zlib/zlib.stub', 'deg2rad' => 'standard/standard_3.stub', 'dgettext' => 'gettext/gettext.stub', 'dio_close' => 'dio/dio.stub', 'dio_fcntl' => 'dio/dio.stub', 'dio_open' => 'dio/dio.stub', 'dio_raw' => 'dio/dio.stub', 'dio_read' => 'dio/dio.stub', 'dio_seek' => 'dio/dio.stub', 'dio_serial' => 'dio/dio.stub', 'dio_stat' => 'dio/dio.stub', 'dio_tcsetattr' => 'dio/dio.stub', 'dio_truncate' => 'dio/dio.stub', 'dio_write' => 'dio/dio.stub', 'dir' => 'standard/standard_7.stub', 'dirname' => 'standard/standard_1.stub', 'disk_free_space' => 'standard/standard_7.stub', 'disk_total_space' => 'standard/standard_7.stub', 'diskfreespace' => 'standard/standard_7.stub', 'dl' => 'standard/basic.stub', 'dngettext' => 'gettext/gettext.stub', 'dns_check_record' => 'standard/standard_4.stub', 'dns_get_mx' => 'standard/standard_4.stub', 'dns_get_record' => 'standard/standard_4.stub', 'dom_import_simplexml' => 'dom/dom.stub', 'doubleval' => 'standard/standard_5.stub', 'each' => 'Core/Core.stub', 'easter_date' => 'calendar/calendar.stub', 'easter_days' => 'calendar/calendar.stub', 'eio_busy' => 'eio/eio.stub', 'eio_cancel' => 'eio/eio.stub', 'eio_chmod' => 'eio/eio.stub', 'eio_chown' => 'eio/eio.stub', 'eio_close' => 'eio/eio.stub', 'eio_custom' => 'eio/eio.stub', 'eio_dup2' => 'eio/eio.stub', 'eio_event_loop' => 'eio/eio.stub', 'eio_fallocate' => 'eio/eio.stub', 'eio_fchmod' => 'eio/eio.stub', 'eio_fchown' => 'eio/eio.stub', 'eio_fdatasync' => 'eio/eio.stub', 'eio_fstat' => 'eio/eio.stub', 'eio_fstatvfs' => 'eio/eio.stub', 'eio_fsync' => 'eio/eio.stub', 'eio_ftruncate' => 'eio/eio.stub', 'eio_futime' => 'eio/eio.stub', 'eio_get_event_stream' => 'eio/eio.stub', 'eio_get_last_error' => 'eio/eio.stub', 'eio_grp' => 'eio/eio.stub', 'eio_grp_add' => 'eio/eio.stub', 'eio_grp_cancel' => 'eio/eio.stub', 'eio_grp_limit' => 'eio/eio.stub', 'eio_link' => 'eio/eio.stub', 'eio_lstat' => 'eio/eio.stub', 'eio_mkdir' => 'eio/eio.stub', 'eio_mknod' => 'eio/eio.stub', 'eio_nop' => 'eio/eio.stub', 'eio_npending' => 'eio/eio.stub', 'eio_nready' => 'eio/eio.stub', 'eio_nreqs' => 'eio/eio.stub', 'eio_nthreads' => 'eio/eio.stub', 'eio_open' => 'eio/eio.stub', 'eio_poll' => 'eio/eio.stub', 'eio_read' => 'eio/eio.stub', 'eio_readahead' => 'eio/eio.stub', 'eio_readdir' => 'eio/eio.stub', 'eio_readlink' => 'eio/eio.stub', 'eio_realpath' => 'eio/eio.stub', 'eio_rename' => 'eio/eio.stub', 'eio_rmdir' => 'eio/eio.stub', 'eio_seek' => 'eio/eio.stub', 'eio_sendfile' => 'eio/eio.stub', 'eio_set_max_idle' => 'eio/eio.stub', 'eio_set_max_parallel' => 'eio/eio.stub', 'eio_set_max_poll_reqs' => 'eio/eio.stub', 'eio_set_max_poll_time' => 'eio/eio.stub', 'eio_set_min_parallel' => 'eio/eio.stub', 'eio_stat' => 'eio/eio.stub', 'eio_statvfs' => 'eio/eio.stub', 'eio_symlink' => 'eio/eio.stub', 'eio_sync' => 'eio/eio.stub', 'eio_sync_file_range' => 'eio/eio.stub', 'eio_syncfs' => 'eio/eio.stub', 'eio_truncate' => 'eio/eio.stub', 'eio_unlink' => 'eio/eio.stub', 'eio_utime' => 'eio/eio.stub', 'eio_write' => 'eio/eio.stub', 'enchant_broker_describe' => 'enchant/enchant.stub', 'enchant_broker_dict_exists' => 'enchant/enchant.stub', 'enchant_broker_free' => 'enchant/enchant.stub', 'enchant_broker_free_dict' => 'enchant/enchant.stub', 'enchant_broker_get_dict_path' => 'enchant/enchant.stub', 'enchant_broker_get_error' => 'enchant/enchant.stub', 'enchant_broker_init' => 'enchant/enchant.stub', 'enchant_broker_list_dicts' => 'enchant/enchant.stub', 'enchant_broker_request_dict' => 'enchant/enchant.stub', 'enchant_broker_request_pwl_dict' => 'enchant/enchant.stub', 'enchant_broker_set_dict_path' => 'enchant/enchant.stub', 'enchant_broker_set_ordering' => 'enchant/enchant.stub', 'enchant_dict_add' => 'enchant/enchant.stub', 'enchant_dict_add_to_personal' => 'enchant/enchant.stub', 'enchant_dict_add_to_session' => 'enchant/enchant.stub', 'enchant_dict_check' => 'enchant/enchant.stub', 'enchant_dict_describe' => 'enchant/enchant.stub', 'enchant_dict_get_error' => 'enchant/enchant.stub', 'enchant_dict_is_added' => 'enchant/enchant.stub', 'enchant_dict_is_in_session' => 'enchant/enchant.stub', 'enchant_dict_quick_check' => 'enchant/enchant.stub', 'enchant_dict_store_replacement' => 'enchant/enchant.stub', 'enchant_dict_suggest' => 'enchant/enchant.stub', 'end' => 'standard/standard_8.stub', 'enum_exists' => 'Core/Core.stub', 'ereg' => 'regex/ereg.stub', 'ereg_replace' => 'regex/ereg.stub', 'eregi' => 'regex/ereg.stub', 'eregi_replace' => 'regex/ereg.stub', 'error_clear_last' => 'standard/basic.stub', 'error_get_last' => 'standard/standard_4.stub', 'error_log' => 'standard/standard_3.stub', 'error_reporting' => 'Core/Core.stub', 'escapeshellarg' => 'standard/standard_2.stub', 'escapeshellcmd' => 'standard/standard_2.stub', 'event_add' => 'libevent/libevent.stub', 'event_base_free' => 'libevent/libevent.stub', 'event_base_loop' => 'libevent/libevent.stub', 'event_base_loopbreak' => 'libevent/libevent.stub', 'event_base_loopexit' => 'libevent/libevent.stub', 'event_base_new' => 'libevent/libevent.stub', 'event_base_priority_init' => 'libevent/libevent.stub', 'event_base_set' => 'libevent/libevent.stub', 'event_buffer_base_set' => 'libevent/libevent.stub', 'event_buffer_disable' => 'libevent/libevent.stub', 'event_buffer_enable' => 'libevent/libevent.stub', 'event_buffer_fd_set' => 'libevent/libevent.stub', 'event_buffer_free' => 'libevent/libevent.stub', 'event_buffer_new' => 'libevent/libevent.stub', 'event_buffer_priority_set' => 'libevent/libevent.stub', 'event_buffer_read' => 'libevent/libevent.stub', 'event_buffer_set_callback' => 'libevent/libevent.stub', 'event_buffer_timeout_set' => 'libevent/libevent.stub', 'event_buffer_watermark_set' => 'libevent/libevent.stub', 'event_buffer_write' => 'libevent/libevent.stub', 'event_del' => 'libevent/libevent.stub', 'event_free' => 'libevent/libevent.stub', 'event_new' => 'libevent/libevent.stub', 'event_set' => 'libevent/libevent.stub', 'event_timer_add' => 'libevent/libevent.stub', 'event_timer_del' => 'libevent/libevent.stub', 'event_timer_new' => 'libevent/libevent.stub', 'event_timer_pending' => 'libevent/libevent.stub', 'event_timer_set' => 'libevent/libevent.stub', 'exec' => 'standard/standard_2.stub', 'exif_imagetype' => 'exif/exif.stub', 'exif_read_data' => 'exif/exif.stub', 'exif_tagname' => 'exif/exif.stub', 'exif_thumbnail' => 'exif/exif.stub', 'exp' => 'standard/standard_3.stub', 'expect_expectl' => 'expect/expect.stub', 'expect_popen' => 'expect/expect.stub', 'explode' => 'standard/standard_1.stub', 'expm1' => 'standard/standard_3.stub', 'extension_loaded' => 'Core/Core.stub', 'extract' => 'standard/standard_8.stub', 'ezmlm_hash' => 'standard/standard_7.stub', 'fann_cascadetrain_on_data' => 'fann/fann.stub', 'fann_cascadetrain_on_file' => 'fann/fann.stub', 'fann_clear_scaling_params' => 'fann/fann.stub', 'fann_copy' => 'fann/fann.stub', 'fann_create_from_file' => 'fann/fann.stub', 'fann_create_shortcut' => 'fann/fann.stub', 'fann_create_shortcut_array' => 'fann/fann.stub', 'fann_create_sparse' => 'fann/fann.stub', 'fann_create_sparse_array' => 'fann/fann.stub', 'fann_create_standard' => 'fann/fann.stub', 'fann_create_standard_array' => 'fann/fann.stub', 'fann_create_train' => 'fann/fann.stub', 'fann_create_train_from_callback' => 'fann/fann.stub', 'fann_descale_input' => 'fann/fann.stub', 'fann_descale_output' => 'fann/fann.stub', 'fann_descale_train' => 'fann/fann.stub', 'fann_destroy' => 'fann/fann.stub', 'fann_destroy_train' => 'fann/fann.stub', 'fann_duplicate_train_data' => 'fann/fann.stub', 'fann_get_MSE' => 'fann/fann.stub', 'fann_get_activation_function' => 'fann/fann.stub', 'fann_get_activation_steepness' => 'fann/fann.stub', 'fann_get_bias_array' => 'fann/fann.stub', 'fann_get_bit_fail' => 'fann/fann.stub', 'fann_get_bit_fail_limit' => 'fann/fann.stub', 'fann_get_cascade_activation_functions' => 'fann/fann.stub', 'fann_get_cascade_activation_functions_count' => 'fann/fann.stub', 'fann_get_cascade_activation_steepnesses' => 'fann/fann.stub', 'fann_get_cascade_activation_steepnesses_count' => 'fann/fann.stub', 'fann_get_cascade_candidate_change_fraction' => 'fann/fann.stub', 'fann_get_cascade_candidate_limit' => 'fann/fann.stub', 'fann_get_cascade_candidate_stagnation_epochs' => 'fann/fann.stub', 'fann_get_cascade_max_cand_epochs' => 'fann/fann.stub', 'fann_get_cascade_max_out_epochs' => 'fann/fann.stub', 'fann_get_cascade_min_cand_epochs' => 'fann/fann.stub', 'fann_get_cascade_min_out_epochs' => 'fann/fann.stub', 'fann_get_cascade_num_candidate_groups' => 'fann/fann.stub', 'fann_get_cascade_num_candidates' => 'fann/fann.stub', 'fann_get_cascade_output_change_fraction' => 'fann/fann.stub', 'fann_get_cascade_output_stagnation_epochs' => 'fann/fann.stub', 'fann_get_cascade_weight_multiplier' => 'fann/fann.stub', 'fann_get_connection_array' => 'fann/fann.stub', 'fann_get_connection_rate' => 'fann/fann.stub', 'fann_get_errno' => 'fann/fann.stub', 'fann_get_errstr' => 'fann/fann.stub', 'fann_get_layer_array' => 'fann/fann.stub', 'fann_get_learning_momentum' => 'fann/fann.stub', 'fann_get_learning_rate' => 'fann/fann.stub', 'fann_get_network_type' => 'fann/fann.stub', 'fann_get_num_input' => 'fann/fann.stub', 'fann_get_num_layers' => 'fann/fann.stub', 'fann_get_num_output' => 'fann/fann.stub', 'fann_get_quickprop_decay' => 'fann/fann.stub', 'fann_get_quickprop_mu' => 'fann/fann.stub', 'fann_get_rprop_decrease_factor' => 'fann/fann.stub', 'fann_get_rprop_delta_max' => 'fann/fann.stub', 'fann_get_rprop_delta_min' => 'fann/fann.stub', 'fann_get_rprop_delta_zero' => 'fann/fann.stub', 'fann_get_rprop_increase_factor' => 'fann/fann.stub', 'fann_get_sarprop_step_error_shift' => 'fann/fann.stub', 'fann_get_sarprop_step_error_threshold_factor' => 'fann/fann.stub', 'fann_get_sarprop_temperature' => 'fann/fann.stub', 'fann_get_sarprop_weight_decay_shift' => 'fann/fann.stub', 'fann_get_total_connections' => 'fann/fann.stub', 'fann_get_total_neurons' => 'fann/fann.stub', 'fann_get_train_error_function' => 'fann/fann.stub', 'fann_get_train_stop_function' => 'fann/fann.stub', 'fann_get_training_algorithm' => 'fann/fann.stub', 'fann_init_weights' => 'fann/fann.stub', 'fann_length_train_data' => 'fann/fann.stub', 'fann_merge_train_data' => 'fann/fann.stub', 'fann_num_input_train_data' => 'fann/fann.stub', 'fann_num_output_train_data' => 'fann/fann.stub', 'fann_print_error' => 'fann/fann.stub', 'fann_randomize_weights' => 'fann/fann.stub', 'fann_read_train_from_file' => 'fann/fann.stub', 'fann_reset_MSE' => 'fann/fann.stub', 'fann_reset_errno' => 'fann/fann.stub', 'fann_reset_errstr' => 'fann/fann.stub', 'fann_run' => 'fann/fann.stub', 'fann_save' => 'fann/fann.stub', 'fann_save_train' => 'fann/fann.stub', 'fann_scale_input' => 'fann/fann.stub', 'fann_scale_input_train_data' => 'fann/fann.stub', 'fann_scale_output' => 'fann/fann.stub', 'fann_scale_output_train_data' => 'fann/fann.stub', 'fann_scale_train' => 'fann/fann.stub', 'fann_scale_train_data' => 'fann/fann.stub', 'fann_set_activation_function' => 'fann/fann.stub', 'fann_set_activation_function_hidden' => 'fann/fann.stub', 'fann_set_activation_function_layer' => 'fann/fann.stub', 'fann_set_activation_function_output' => 'fann/fann.stub', 'fann_set_activation_steepness' => 'fann/fann.stub', 'fann_set_activation_steepness_hidden' => 'fann/fann.stub', 'fann_set_activation_steepness_layer' => 'fann/fann.stub', 'fann_set_activation_steepness_output' => 'fann/fann.stub', 'fann_set_bit_fail_limit' => 'fann/fann.stub', 'fann_set_callback' => 'fann/fann.stub', 'fann_set_cascade_activation_functions' => 'fann/fann.stub', 'fann_set_cascade_activation_steepnesses' => 'fann/fann.stub', 'fann_set_cascade_candidate_change_fraction' => 'fann/fann.stub', 'fann_set_cascade_candidate_limit' => 'fann/fann.stub', 'fann_set_cascade_candidate_stagnation_epochs' => 'fann/fann.stub', 'fann_set_cascade_max_cand_epochs' => 'fann/fann.stub', 'fann_set_cascade_max_out_epochs' => 'fann/fann.stub', 'fann_set_cascade_min_cand_epochs' => 'fann/fann.stub', 'fann_set_cascade_min_out_epochs' => 'fann/fann.stub', 'fann_set_cascade_num_candidate_groups' => 'fann/fann.stub', 'fann_set_cascade_output_change_fraction' => 'fann/fann.stub', 'fann_set_cascade_output_stagnation_epochs' => 'fann/fann.stub', 'fann_set_cascade_weight_multiplier' => 'fann/fann.stub', 'fann_set_error_log' => 'fann/fann.stub', 'fann_set_input_scaling_params' => 'fann/fann.stub', 'fann_set_learning_momentum' => 'fann/fann.stub', 'fann_set_learning_rate' => 'fann/fann.stub', 'fann_set_output_scaling_params' => 'fann/fann.stub', 'fann_set_quickprop_decay' => 'fann/fann.stub', 'fann_set_quickprop_mu' => 'fann/fann.stub', 'fann_set_rprop_decrease_factor' => 'fann/fann.stub', 'fann_set_rprop_delta_max' => 'fann/fann.stub', 'fann_set_rprop_delta_min' => 'fann/fann.stub', 'fann_set_rprop_delta_zero' => 'fann/fann.stub', 'fann_set_rprop_increase_factor' => 'fann/fann.stub', 'fann_set_sarprop_step_error_shift' => 'fann/fann.stub', 'fann_set_sarprop_step_error_threshold_factor' => 'fann/fann.stub', 'fann_set_sarprop_temperature' => 'fann/fann.stub', 'fann_set_sarprop_weight_decay_shift' => 'fann/fann.stub', 'fann_set_scaling_params' => 'fann/fann.stub', 'fann_set_train_error_function' => 'fann/fann.stub', 'fann_set_train_stop_function' => 'fann/fann.stub', 'fann_set_training_algorithm' => 'fann/fann.stub', 'fann_set_weight' => 'fann/fann.stub', 'fann_set_weight_array' => 'fann/fann.stub', 'fann_shuffle_train_data' => 'fann/fann.stub', 'fann_subset_train_data' => 'fann/fann.stub', 'fann_test' => 'fann/fann.stub', 'fann_test_data' => 'fann/fann.stub', 'fann_train' => 'fann/fann.stub', 'fann_train_epoch' => 'fann/fann.stub', 'fann_train_on_data' => 'fann/fann.stub', 'fann_train_on_file' => 'fann/fann.stub', 'fastcgi_finish_request' => 'fpm/fpm.stub', 'fbird_add_user' => 'interbase/interbase.stub', 'fbird_affected_rows' => 'interbase/interbase.stub', 'fbird_backup' => 'interbase/interbase.stub', 'fbird_blob_add' => 'interbase/interbase.stub', 'fbird_blob_cancel' => 'interbase/interbase.stub', 'fbird_blob_close' => 'interbase/interbase.stub', 'fbird_blob_create' => 'interbase/interbase.stub', 'fbird_blob_echo' => 'interbase/interbase.stub', 'fbird_blob_get' => 'interbase/interbase.stub', 'fbird_blob_import' => 'interbase/interbase.stub', 'fbird_blob_info' => 'interbase/interbase.stub', 'fbird_blob_open' => 'interbase/interbase.stub', 'fbird_close' => 'interbase/interbase.stub', 'fbird_commit' => 'interbase/interbase.stub', 'fbird_commit_ret' => 'interbase/interbase.stub', 'fbird_connect' => 'interbase/interbase.stub', 'fbird_db_info' => 'interbase/interbase.stub', 'fbird_delete_user' => 'interbase/interbase.stub', 'fbird_drop_db' => 'interbase/interbase.stub', 'fbird_errcode' => 'interbase/interbase.stub', 'fbird_errmsg' => 'interbase/interbase.stub', 'fbird_execute' => 'interbase/interbase.stub', 'fbird_fetch_assoc' => 'interbase/interbase.stub', 'fbird_fetch_object' => 'interbase/interbase.stub', 'fbird_fetch_row' => 'interbase/interbase.stub', 'fbird_field_info' => 'interbase/interbase.stub', 'fbird_free_event_handler' => 'interbase/interbase.stub', 'fbird_free_query' => 'interbase/interbase.stub', 'fbird_free_result' => 'interbase/interbase.stub', 'fbird_gen_id' => 'interbase/interbase.stub', 'fbird_maintain_db' => 'interbase/interbase.stub', 'fbird_modify_user' => 'interbase/interbase.stub', 'fbird_name_result' => 'interbase/interbase.stub', 'fbird_num_fields' => 'interbase/interbase.stub', 'fbird_num_params' => 'interbase/interbase.stub', 'fbird_param_info' => 'interbase/interbase.stub', 'fbird_pconnect' => 'interbase/interbase.stub', 'fbird_prepare' => 'interbase/interbase.stub', 'fbird_query' => 'interbase/interbase.stub', 'fbird_restore' => 'interbase/interbase.stub', 'fbird_rollback' => 'interbase/interbase.stub', 'fbird_rollback_ret' => 'interbase/interbase.stub', 'fbird_server_info' => 'interbase/interbase.stub', 'fbird_service_attach' => 'interbase/interbase.stub', 'fbird_service_detach' => 'interbase/interbase.stub', 'fbird_set_event_handler' => 'interbase/interbase.stub', 'fbird_trans' => 'interbase/interbase.stub', 'fbird_wait_event' => 'interbase/interbase.stub', 'fclose' => 'standard/standard_5.stub', 'fdatasync' => 'standard/standard_5.stub', 'fdiv' => 'standard/standard_3.stub', 'feof' => 'standard/standard_5.stub', 'fflush' => 'standard/standard_5.stub', 'fgetc' => 'standard/standard_5.stub', 'fgetcsv' => 'standard/standard_6.stub', 'fgets' => 'standard/standard_5.stub', 'fgetss' => 'standard/standard_5.stub', 'file' => 'standard/standard_5.stub', 'file_exists' => 'standard/standard_7.stub', 'file_get_contents' => 'standard/standard_5.stub', 'file_put_contents' => 'standard/standard_5.stub', 'fileatime' => 'standard/standard_7.stub', 'filectime' => 'standard/standard_7.stub', 'filegroup' => 'standard/standard_7.stub', 'fileinode' => 'standard/standard_7.stub', 'filemtime' => 'standard/standard_7.stub', 'fileowner' => 'standard/standard_7.stub', 'fileperms' => 'standard/standard_7.stub', 'filesize' => 'standard/standard_7.stub', 'filetype' => 'standard/standard_7.stub', 'filter_has_var' => 'filter/filter.stub', 'filter_id' => 'filter/filter.stub', 'filter_input' => 'filter/filter.stub', 'filter_input_array' => 'filter/filter.stub', 'filter_list' => 'filter/filter.stub', 'filter_var' => 'filter/filter.stub', 'filter_var_array' => 'filter/filter.stub', 'finfo_buffer' => 'fileinfo/fileinfo.stub', 'finfo_close' => 'fileinfo/fileinfo.stub', 'finfo_file' => 'fileinfo/fileinfo.stub', 'finfo_open' => 'fileinfo/fileinfo.stub', 'finfo_set_flags' => 'fileinfo/fileinfo.stub', 'floatval' => 'standard/standard_5.stub', 'flock' => 'standard/standard_6.stub', 'floor' => 'standard/standard_3.stub', 'flush' => 'standard/standard_0.stub', 'fmod' => 'standard/standard_3.stub', 'fnmatch' => 'standard/standard_6.stub', 'fopen' => 'standard/standard_5.stub', 'forward_static_call' => 'standard/standard_4.stub', 'forward_static_call_array' => 'standard/standard_4.stub', 'fpassthru' => 'standard/standard_5.stub', 'fpm_get_status' => 'fpm/fpm.stub', 'fpow' => 'standard/standard_10.stub', 'fprintf' => 'standard/standard_2.stub', 'fputcsv' => 'standard/standard_6.stub', 'fputs' => 'standard/standard_5.stub', 'frankenphp_finish_request' => 'frankenphp/frankenphp.stub', 'frankenphp_handle_request' => 'frankenphp/frankenphp.stub', 'frankenphp_request_headers' => 'frankenphp/frankenphp.stub', 'frankenphp_response_headers' => 'frankenphp/frankenphp.stub', 'fread' => 'standard/standard_5.stub', 'frenchtojd' => 'calendar/calendar.stub', 'fscanf' => 'standard/standard_2.stub', 'fseek' => 'standard/standard_5.stub', 'fsockopen' => 'standard/standard_7.stub', 'fstat' => 'standard/standard_5.stub', 'fsync' => 'standard/standard_5.stub', 'ftell' => 'standard/standard_5.stub', 'ftok' => 'standard/standard_9.stub', 'ftp_alloc' => 'ftp/ftp.stub', 'ftp_append' => 'ftp/ftp.stub', 'ftp_cdup' => 'ftp/ftp.stub', 'ftp_chdir' => 'ftp/ftp.stub', 'ftp_chmod' => 'ftp/ftp.stub', 'ftp_close' => 'ftp/ftp.stub', 'ftp_connect' => 'ftp/ftp.stub', 'ftp_delete' => 'ftp/ftp.stub', 'ftp_exec' => 'ftp/ftp.stub', 'ftp_fget' => 'ftp/ftp.stub', 'ftp_fput' => 'ftp/ftp.stub', 'ftp_get' => 'ftp/ftp.stub', 'ftp_get_option' => 'ftp/ftp.stub', 'ftp_login' => 'ftp/ftp.stub', 'ftp_mdtm' => 'ftp/ftp.stub', 'ftp_mkdir' => 'ftp/ftp.stub', 'ftp_mlsd' => 'ftp/ftp.stub', 'ftp_nb_continue' => 'ftp/ftp.stub', 'ftp_nb_fget' => 'ftp/ftp.stub', 'ftp_nb_fput' => 'ftp/ftp.stub', 'ftp_nb_get' => 'ftp/ftp.stub', 'ftp_nb_put' => 'ftp/ftp.stub', 'ftp_nlist' => 'ftp/ftp.stub', 'ftp_pasv' => 'ftp/ftp.stub', 'ftp_put' => 'ftp/ftp.stub', 'ftp_pwd' => 'ftp/ftp.stub', 'ftp_quit' => 'ftp/ftp.stub', 'ftp_raw' => 'ftp/ftp.stub', 'ftp_rawlist' => 'ftp/ftp.stub', 'ftp_rename' => 'ftp/ftp.stub', 'ftp_rmdir' => 'ftp/ftp.stub', 'ftp_set_option' => 'ftp/ftp.stub', 'ftp_site' => 'ftp/ftp.stub', 'ftp_size' => 'ftp/ftp.stub', 'ftp_ssl_connect' => 'ftp/ftp.stub', 'ftp_systype' => 'ftp/ftp.stub', 'ftruncate' => 'standard/standard_5.stub', 'func_get_arg' => 'Core/Core.stub', 'func_get_args' => 'Core/Core.stub', 'func_num_args' => 'Core/Core.stub', 'function_exists' => 'Core/Core.stub', 'fwrite' => 'standard/standard_5.stub', 'gc_collect_cycles' => 'Core/Core.stub', 'gc_disable' => 'Core/Core.stub', 'gc_enable' => 'Core/Core.stub', 'gc_enabled' => 'Core/Core.stub', 'gc_mem_caches' => 'Core/Core.stub', 'gc_status' => 'Core/Core.stub', 'gd_info' => 'gd/gd.stub', 'gearman_bugreport' => 'gearman/gearman.stub', 'gearman_client_add_options' => 'gearman/gearman.stub', 'gearman_client_add_server' => 'gearman/gearman.stub', 'gearman_client_add_servers' => 'gearman/gearman.stub', 'gearman_client_add_task' => 'gearman/gearman.stub', 'gearman_client_add_task_background' => 'gearman/gearman.stub', 'gearman_client_add_task_high' => 'gearman/gearman.stub', 'gearman_client_add_task_high_background' => 'gearman/gearman.stub', 'gearman_client_add_task_low' => 'gearman/gearman.stub', 'gearman_client_add_task_low_background' => 'gearman/gearman.stub', 'gearman_client_add_task_status' => 'gearman/gearman.stub', 'gearman_client_clear_fn' => 'gearman/gearman.stub', 'gearman_client_clone' => 'gearman/gearman.stub', 'gearman_client_context' => 'gearman/gearman.stub', 'gearman_client_create' => 'gearman/gearman.stub', 'gearman_client_do' => 'gearman/gearman.stub', 'gearman_client_do_background' => 'gearman/gearman.stub', 'gearman_client_do_high' => 'gearman/gearman.stub', 'gearman_client_do_high_background' => 'gearman/gearman.stub', 'gearman_client_do_job_handle' => 'gearman/gearman.stub', 'gearman_client_do_low' => 'gearman/gearman.stub', 'gearman_client_do_low_background' => 'gearman/gearman.stub', 'gearman_client_do_normal' => 'gearman/gearman.stub', 'gearman_client_do_status' => 'gearman/gearman.stub', 'gearman_client_echo' => 'gearman/gearman.stub', 'gearman_client_errno' => 'gearman/gearman.stub', 'gearman_client_error' => 'gearman/gearman.stub', 'gearman_client_job_status' => 'gearman/gearman.stub', 'gearman_client_options' => 'gearman/gearman.stub', 'gearman_client_remove_options' => 'gearman/gearman.stub', 'gearman_client_return_code' => 'gearman/gearman.stub', 'gearman_client_run_tasks' => 'gearman/gearman.stub', 'gearman_client_set_complete_fn' => 'gearman/gearman.stub', 'gearman_client_set_context' => 'gearman/gearman.stub', 'gearman_client_set_created_fn' => 'gearman/gearman.stub', 'gearman_client_set_data_fn' => 'gearman/gearman.stub', 'gearman_client_set_exception_fn' => 'gearman/gearman.stub', 'gearman_client_set_fail_fn' => 'gearman/gearman.stub', 'gearman_client_set_options' => 'gearman/gearman.stub', 'gearman_client_set_status_fn' => 'gearman/gearman.stub', 'gearman_client_set_timeout' => 'gearman/gearman.stub', 'gearman_client_set_warning_fn' => 'gearman/gearman.stub', 'gearman_client_set_workload_fn' => 'gearman/gearman.stub', 'gearman_client_timeout' => 'gearman/gearman.stub', 'gearman_client_wait' => 'gearman/gearman.stub', 'gearman_job_function_name' => 'gearman/gearman.stub', 'gearman_job_handle' => 'gearman/gearman.stub', 'gearman_job_return_code' => 'gearman/gearman.stub', 'gearman_job_send_complete' => 'gearman/gearman.stub', 'gearman_job_send_data' => 'gearman/gearman.stub', 'gearman_job_send_exception' => 'gearman/gearman.stub', 'gearman_job_send_fail' => 'gearman/gearman.stub', 'gearman_job_send_status' => 'gearman/gearman.stub', 'gearman_job_send_warning' => 'gearman/gearman.stub', 'gearman_job_unique' => 'gearman/gearman.stub', 'gearman_job_workload' => 'gearman/gearman.stub', 'gearman_job_workload_size' => 'gearman/gearman.stub', 'gearman_task_data' => 'gearman/gearman.stub', 'gearman_task_data_size' => 'gearman/gearman.stub', 'gearman_task_denominator' => 'gearman/gearman.stub', 'gearman_task_function_name' => 'gearman/gearman.stub', 'gearman_task_is_known' => 'gearman/gearman.stub', 'gearman_task_is_running' => 'gearman/gearman.stub', 'gearman_task_job_handle' => 'gearman/gearman.stub', 'gearman_task_numerator' => 'gearman/gearman.stub', 'gearman_task_recv_data' => 'gearman/gearman.stub', 'gearman_task_return_code' => 'gearman/gearman.stub', 'gearman_task_send_workload' => 'gearman/gearman.stub', 'gearman_task_unique' => 'gearman/gearman.stub', 'gearman_verbose_name' => 'gearman/gearman.stub', 'gearman_version' => 'gearman/gearman.stub', 'gearman_worker_add_function' => 'gearman/gearman.stub', 'gearman_worker_add_options' => 'gearman/gearman.stub', 'gearman_worker_add_server' => 'gearman/gearman.stub', 'gearman_worker_add_servers' => 'gearman/gearman.stub', 'gearman_worker_clone' => 'gearman/gearman.stub', 'gearman_worker_create' => 'gearman/gearman.stub', 'gearman_worker_echo' => 'gearman/gearman.stub', 'gearman_worker_errno' => 'gearman/gearman.stub', 'gearman_worker_error' => 'gearman/gearman.stub', 'gearman_worker_grab_job' => 'gearman/gearman.stub', 'gearman_worker_options' => 'gearman/gearman.stub', 'gearman_worker_register' => 'gearman/gearman.stub', 'gearman_worker_remove_options' => 'gearman/gearman.stub', 'gearman_worker_return_code' => 'gearman/gearman.stub', 'gearman_worker_set_options' => 'gearman/gearman.stub', 'gearman_worker_set_timeout' => 'gearman/gearman.stub', 'gearman_worker_timeout' => 'gearman/gearman.stub', 'gearman_worker_unregister' => 'gearman/gearman.stub', 'gearman_worker_unregister_all' => 'gearman/gearman.stub', 'gearman_worker_wait' => 'gearman/gearman.stub', 'gearman_worker_work' => 'gearman/gearman.stub', 'geoip_asnum_by_name' => 'geoip/geoip.stub', 'geoip_continent_code_by_name' => 'geoip/geoip.stub', 'geoip_country_code3_by_name' => 'geoip/geoip.stub', 'geoip_country_code_by_name' => 'geoip/geoip.stub', 'geoip_country_name_by_name' => 'geoip/geoip.stub', 'geoip_database_info' => 'geoip/geoip.stub', 'geoip_db_avail' => 'geoip/geoip.stub', 'geoip_db_filename' => 'geoip/geoip.stub', 'geoip_db_get_all_info' => 'geoip/geoip.stub', 'geoip_id_by_name' => 'geoip/geoip.stub', 'geoip_isp_by_name' => 'geoip/geoip.stub', 'geoip_netspeedcell_by_name' => 'geoip/geoip.stub', 'geoip_org_by_name' => 'geoip/geoip.stub', 'geoip_record_by_name' => 'geoip/geoip.stub', 'geoip_region_by_name' => 'geoip/geoip.stub', 'geoip_region_name_by_code' => 'geoip/geoip.stub', 'geoip_setup_custom_directory' => 'geoip/geoip.stub', 'geoip_time_zone_by_country_and_region' => 'geoip/geoip.stub', 'get_browser' => 'standard/standard_7.stub', 'get_call_stack' => 'ZendDebugger/ZendDebugger.stub', 'get_called_class' => 'Core/Core.stub', 'get_cfg_var' => 'standard/standard_3.stub', 'get_class' => 'Core/Core.stub', 'get_class_methods' => 'Core/Core.stub', 'get_class_vars' => 'Core/Core.stub', 'get_current_user' => 'standard/standard_3.stub', 'get_debug_type' => 'standard/standard_9.stub', 'get_declared_classes' => 'Core/Core.stub', 'get_declared_interfaces' => 'Core/Core.stub', 'get_declared_traits' => 'Core/Core.stub', 'get_defined_constants' => 'Core/Core.stub', 'get_defined_functions' => 'Core/Core.stub', 'get_defined_vars' => 'Core/Core.stub', 'get_extension_funcs' => 'Core/Core.stub', 'get_headers' => 'standard/standard_6.stub', 'get_html_translation_table' => 'standard/standard_0.stub', 'get_include_path' => 'standard/standard_4.stub', 'get_included_files' => 'Core/Core.stub', 'get_loaded_extensions' => 'Core/Core.stub', 'get_magic_quotes_gpc' => 'standard/standard_3.stub', 'get_magic_quotes_runtime' => 'standard/standard_3.stub', 'get_mangled_object_vars' => 'standard/standard_9.stub', 'get_meta_tags' => 'standard/standard_6.stub', 'get_object_vars' => 'Core/Core.stub', 'get_parent_class' => 'Core/Core.stub', 'get_required_files' => 'Core/Core.stub', 'get_resource_id' => 'standard/standard_9.stub', 'get_resource_type' => 'Core/Core.stub', 'get_resources' => 'Core/Core.stub', 'getallheaders' => 'standard/standard_4.stub', 'getcwd' => 'standard/standard_7.stub', 'getdate' => 'date/date.stub', 'getdir' => 'standard/standard_7.stub', 'getenv' => 'standard/standard_3.stub', 'gethostbyaddr' => 'standard/standard_4.stub', 'gethostbyname' => 'standard/standard_4.stub', 'gethostbynamel' => 'standard/standard_4.stub', 'gethostname' => 'standard/standard_4.stub', 'getimagesize' => 'standard/standard_0.stub', 'getimagesizefromstring' => 'standard/standard_8.stub', 'getlastmod' => 'standard/standard_3.stub', 'getmxrr' => 'standard/standard_4.stub', 'getmygid' => 'standard/standard_2.stub', 'getmyinode' => 'standard/standard_2.stub', 'getmypid' => 'standard/standard_2.stub', 'getmyuid' => 'standard/standard_2.stub', 'getopt' => 'standard/standard_3.stub', 'getprotobyname' => 'standard/standard_2.stub', 'getprotobynumber' => 'standard/standard_2.stub', 'getrandmax' => 'random/random.stub', 'getrusage' => 'standard/standard_3.stub', 'getservbyname' => 'standard/standard_2.stub', 'getservbyport' => 'standard/standard_2.stub', 'gettext' => 'gettext/gettext.stub', 'gettimeofday' => 'standard/standard_3.stub', 'gettype' => 'standard/standard_5.stub', 'glob' => 'standard/standard_7.stub', 'gmdate' => 'date/date.stub', 'gmmktime' => 'date/date.stub', 'gmp_abs' => 'gmp/gmp.stub', 'gmp_add' => 'gmp/gmp.stub', 'gmp_and' => 'gmp/gmp.stub', 'gmp_binomial' => 'gmp/gmp.stub', 'gmp_clrbit' => 'gmp/gmp.stub', 'gmp_cmp' => 'gmp/gmp.stub', 'gmp_com' => 'gmp/gmp.stub', 'gmp_div' => 'gmp/gmp.stub', 'gmp_div_q' => 'gmp/gmp.stub', 'gmp_div_qr' => 'gmp/gmp.stub', 'gmp_div_r' => 'gmp/gmp.stub', 'gmp_divexact' => 'gmp/gmp.stub', 'gmp_export' => 'gmp/gmp.stub', 'gmp_fact' => 'gmp/gmp.stub', 'gmp_gcd' => 'gmp/gmp.stub', 'gmp_gcdext' => 'gmp/gmp.stub', 'gmp_hamdist' => 'gmp/gmp.stub', 'gmp_import' => 'gmp/gmp.stub', 'gmp_init' => 'gmp/gmp.stub', 'gmp_intval' => 'gmp/gmp.stub', 'gmp_invert' => 'gmp/gmp.stub', 'gmp_jacobi' => 'gmp/gmp.stub', 'gmp_kronecker' => 'gmp/gmp.stub', 'gmp_lcm' => 'gmp/gmp.stub', 'gmp_legendre' => 'gmp/gmp.stub', 'gmp_mod' => 'gmp/gmp.stub', 'gmp_mul' => 'gmp/gmp.stub', 'gmp_neg' => 'gmp/gmp.stub', 'gmp_nextprime' => 'gmp/gmp.stub', 'gmp_or' => 'gmp/gmp.stub', 'gmp_perfect_power' => 'gmp/gmp.stub', 'gmp_perfect_square' => 'gmp/gmp.stub', 'gmp_popcount' => 'gmp/gmp.stub', 'gmp_pow' => 'gmp/gmp.stub', 'gmp_powm' => 'gmp/gmp.stub', 'gmp_prob_prime' => 'gmp/gmp.stub', 'gmp_random' => 'gmp/gmp.stub', 'gmp_random_bits' => 'gmp/gmp.stub', 'gmp_random_range' => 'gmp/gmp.stub', 'gmp_random_seed' => 'gmp/gmp.stub', 'gmp_root' => 'gmp/gmp.stub', 'gmp_rootrem' => 'gmp/gmp.stub', 'gmp_scan0' => 'gmp/gmp.stub', 'gmp_scan1' => 'gmp/gmp.stub', 'gmp_setbit' => 'gmp/gmp.stub', 'gmp_sign' => 'gmp/gmp.stub', 'gmp_sqrt' => 'gmp/gmp.stub', 'gmp_sqrtrem' => 'gmp/gmp.stub', 'gmp_strval' => 'gmp/gmp.stub', 'gmp_sub' => 'gmp/gmp.stub', 'gmp_testbit' => 'gmp/gmp.stub', 'gmp_xor' => 'gmp/gmp.stub', 'gmstrftime' => 'date/date.stub', 'gnupg_adddecryptkey' => 'gnupg/gnupg.stub', 'gnupg_addencryptkey' => 'gnupg/gnupg.stub', 'gnupg_addsignkey' => 'gnupg/gnupg.stub', 'gnupg_cleardecryptkeys' => 'gnupg/gnupg.stub', 'gnupg_clearencryptkeys' => 'gnupg/gnupg.stub', 'gnupg_clearsignkeys' => 'gnupg/gnupg.stub', 'gnupg_decrypt' => 'gnupg/gnupg.stub', 'gnupg_decryptverify' => 'gnupg/gnupg.stub', 'gnupg_deletekey' => 'gnupg/gnupg.stub', 'gnupg_encrypt' => 'gnupg/gnupg.stub', 'gnupg_encryptsign' => 'gnupg/gnupg.stub', 'gnupg_export' => 'gnupg/gnupg.stub', 'gnupg_getengineinfo' => 'gnupg/gnupg.stub', 'gnupg_geterror' => 'gnupg/gnupg.stub', 'gnupg_geterrorinfo' => 'gnupg/gnupg.stub', 'gnupg_getprotocol' => 'gnupg/gnupg.stub', 'gnupg_gettrustlist' => 'gnupg/gnupg.stub', 'gnupg_import' => 'gnupg/gnupg.stub', 'gnupg_init' => 'gnupg/gnupg.stub', 'gnupg_keyinfo' => 'gnupg/gnupg.stub', 'gnupg_listsignatures' => 'gnupg/gnupg.stub', 'gnupg_setarmor' => 'gnupg/gnupg.stub', 'gnupg_seterrormode' => 'gnupg/gnupg.stub', 'gnupg_setsignmode' => 'gnupg/gnupg.stub', 'gnupg_sign' => 'gnupg/gnupg.stub', 'gnupg_verify' => 'gnupg/gnupg.stub', 'go' => 'swoole/functions.stub', 'grapheme_extract' => 'intl/intl.stub', 'grapheme_str_split' => 'intl/intl.stub', 'grapheme_stripos' => 'intl/intl.stub', 'grapheme_stristr' => 'intl/intl.stub', 'grapheme_strlen' => 'intl/intl.stub', 'grapheme_strpos' => 'intl/intl.stub', 'grapheme_strripos' => 'intl/intl.stub', 'grapheme_strrpos' => 'intl/intl.stub', 'grapheme_strstr' => 'intl/intl.stub', 'grapheme_substr' => 'intl/intl.stub', 'gregoriantojd' => 'calendar/calendar.stub', 'gzclose' => 'zlib/zlib.stub', 'gzcompress' => 'zlib/zlib.stub', 'gzdecode' => 'zlib/zlib.stub', 'gzdeflate' => 'zlib/zlib.stub', 'gzencode' => 'zlib/zlib.stub', 'gzeof' => 'zlib/zlib.stub', 'gzfile' => 'zlib/zlib.stub', 'gzgetc' => 'zlib/zlib.stub', 'gzgets' => 'zlib/zlib.stub', 'gzgetss' => 'zlib/zlib.stub', 'gzinflate' => 'zlib/zlib.stub', 'gzopen' => 'zlib/zlib.stub', 'gzpassthru' => 'zlib/zlib.stub', 'gzputs' => 'zlib/zlib.stub', 'gzread' => 'zlib/zlib.stub', 'gzrewind' => 'zlib/zlib.stub', 'gzseek' => 'zlib/zlib.stub', 'gztell' => 'zlib/zlib.stub', 'gzuncompress' => 'zlib/zlib.stub', 'gzwrite' => 'zlib/zlib.stub', 'hash' => 'hash/hash.stub', 'hash_algos' => 'hash/hash.stub', 'hash_copy' => 'hash/hash.stub', 'hash_equals' => 'hash/hash.stub', 'hash_file' => 'hash/hash.stub', 'hash_final' => 'hash/hash.stub', 'hash_hkdf' => 'hash/hash.stub', 'hash_hmac' => 'hash/hash.stub', 'hash_hmac_algos' => 'hash/hash.stub', 'hash_hmac_file' => 'hash/hash.stub', 'hash_init' => 'hash/hash.stub', 'hash_pbkdf2' => 'hash/hash.stub', 'hash_update' => 'hash/hash.stub', 'hash_update_file' => 'hash/hash.stub', 'hash_update_stream' => 'hash/hash.stub', 'header' => 'standard/standard_4.stub', 'header_register_callback' => 'standard/standard_8.stub', 'header_remove' => 'standard/standard_4.stub', 'headers_list' => 'standard/standard_4.stub', 'headers_send' => 'frankenphp/frankenphp.stub', 'headers_sent' => 'standard/standard_4.stub', 'hebrev' => 'standard/standard_1.stub', 'hebrevc' => 'standard/standard_1.stub', 'hex2bin' => 'standard/_standard_manual.stub', 'hexdec' => 'standard/standard_3.stub', 'highlight_file' => 'standard/standard_4.stub', 'highlight_string' => 'standard/standard_4.stub', 'hrtime' => 'standard/standard_4.stub', 'html_entity_decode' => 'standard/standard_0.stub', 'htmlentities' => 'standard/standard_0.stub', 'htmlspecialchars' => 'standard/standard_0.stub', 'htmlspecialchars_decode' => 'standard/standard_0.stub', 'http_build_cookie' => 'http/http.stub', 'http_build_query' => 'standard/standard_2.stub', 'http_build_str' => 'http/http.stub', 'http_build_url' => 'http/http.stub', 'http_cache_etag' => 'http/http.stub', 'http_cache_last_modified' => 'http/http.stub', 'http_chunked_decode' => 'http/http.stub', 'http_clear_last_response_headers' => 'standard/standard_10.stub', 'http_date' => 'http/http.stub', 'http_deflate' => 'http/http.stub', 'http_get' => 'http/http.stub', 'http_get_last_response_headers' => 'standard/standard_10.stub', 'http_get_request_body' => 'http/http.stub', 'http_get_request_body_stream' => 'http/http.stub', 'http_get_request_headers' => 'http/http.stub', 'http_head' => 'http/http.stub', 'http_inflate' => 'http/http.stub', 'http_match_etag' => 'http/http.stub', 'http_match_modified' => 'http/http.stub', 'http_match_request_header' => 'http/http.stub', 'http_negotiate_charset' => 'http/http.stub', 'http_negotiate_content_type' => 'http/http.stub', 'http_negotiate_language' => 'http/http.stub', 'http_parse_cookie' => 'http/http.stub', 'http_parse_headers' => 'http/http.stub', 'http_parse_message' => 'http/http.stub', 'http_parse_params' => 'http/http.stub', 'http_persistent_handles_clean' => 'http/http.stub', 'http_persistent_handles_count' => 'http/http.stub', 'http_persistent_handles_ident' => 'http/http.stub', 'http_post_data' => 'http/http.stub', 'http_post_fields' => 'http/http.stub', 'http_put_data' => 'http/http.stub', 'http_put_file' => 'http/http.stub', 'http_put_stream' => 'http/http.stub', 'http_redirect' => 'http/http.stub', 'http_request' => 'http/http.stub', 'http_request_body_encode' => 'http/http.stub', 'http_request_method_exists' => 'http/http.stub', 'http_request_method_name' => 'http/http.stub', 'http_request_method_register' => 'http/http.stub', 'http_request_method_unregister' => 'http/http.stub', 'http_response_code' => 'standard/_standard_manual.stub', 'http_send_content_disposition' => 'http/http.stub', 'http_send_content_type' => 'http/http.stub', 'http_send_data' => 'http/http.stub', 'http_send_file' => 'http/http.stub', 'http_send_last_modified' => 'http/http.stub', 'http_send_status' => 'http/http.stub', 'http_send_stream' => 'http/http.stub', 'http_support' => 'http/http.stub', 'http_throttle' => 'http/http.stub', 'hypot' => 'standard/standard_3.stub', 'ibase_add_user' => 'interbase/interbase.stub', 'ibase_affected_rows' => 'interbase/interbase.stub', 'ibase_backup' => 'interbase/interbase.stub', 'ibase_blob_add' => 'interbase/interbase.stub', 'ibase_blob_cancel' => 'interbase/interbase.stub', 'ibase_blob_close' => 'interbase/interbase.stub', 'ibase_blob_create' => 'interbase/interbase.stub', 'ibase_blob_echo' => 'interbase/interbase.stub', 'ibase_blob_get' => 'interbase/interbase.stub', 'ibase_blob_import' => 'interbase/interbase.stub', 'ibase_blob_info' => 'interbase/interbase.stub', 'ibase_blob_open' => 'interbase/interbase.stub', 'ibase_close' => 'interbase/interbase.stub', 'ibase_commit' => 'interbase/interbase.stub', 'ibase_commit_ret' => 'interbase/interbase.stub', 'ibase_connect' => 'interbase/interbase.stub', 'ibase_db_info' => 'interbase/interbase.stub', 'ibase_delete_user' => 'interbase/interbase.stub', 'ibase_drop_db' => 'interbase/interbase.stub', 'ibase_errcode' => 'interbase/interbase.stub', 'ibase_errmsg' => 'interbase/interbase.stub', 'ibase_execute' => 'interbase/interbase.stub', 'ibase_fetch_assoc' => 'interbase/interbase.stub', 'ibase_fetch_object' => 'interbase/interbase.stub', 'ibase_fetch_row' => 'interbase/interbase.stub', 'ibase_field_info' => 'interbase/interbase.stub', 'ibase_free_event_handler' => 'interbase/interbase.stub', 'ibase_free_query' => 'interbase/interbase.stub', 'ibase_free_result' => 'interbase/interbase.stub', 'ibase_gen_id' => 'interbase/interbase.stub', 'ibase_maintain_db' => 'interbase/interbase.stub', 'ibase_modify_user' => 'interbase/interbase.stub', 'ibase_name_result' => 'interbase/interbase.stub', 'ibase_num_fields' => 'interbase/interbase.stub', 'ibase_num_params' => 'interbase/interbase.stub', 'ibase_param_info' => 'interbase/interbase.stub', 'ibase_pconnect' => 'interbase/interbase.stub', 'ibase_prepare' => 'interbase/interbase.stub', 'ibase_query' => 'interbase/interbase.stub', 'ibase_restore' => 'interbase/interbase.stub', 'ibase_rollback' => 'interbase/interbase.stub', 'ibase_rollback_ret' => 'interbase/interbase.stub', 'ibase_server_info' => 'interbase/interbase.stub', 'ibase_service_attach' => 'interbase/interbase.stub', 'ibase_service_detach' => 'interbase/interbase.stub', 'ibase_set_event_handler' => 'interbase/interbase.stub', 'ibase_trans' => 'interbase/interbase.stub', 'ibase_wait_event' => 'interbase/interbase.stub', 'iconv' => 'iconv/iconv.stub', 'iconv_get_encoding' => 'iconv/iconv.stub', 'iconv_mime_decode' => 'iconv/iconv.stub', 'iconv_mime_decode_headers' => 'iconv/iconv.stub', 'iconv_mime_encode' => 'iconv/iconv.stub', 'iconv_set_encoding' => 'iconv/iconv.stub', 'iconv_strlen' => 'iconv/iconv.stub', 'iconv_strpos' => 'iconv/iconv.stub', 'iconv_strrpos' => 'iconv/iconv.stub', 'iconv_substr' => 'iconv/iconv.stub', 'idate' => 'date/date.stub', 'idn_to_ascii' => 'intl/intl.stub', 'idn_to_utf8' => 'intl/intl.stub', 'igbinary_serialize' => 'igbinary/igbinary.stub', 'igbinary_unserialize' => 'igbinary/igbinary.stub', 'ignore_user_abort' => 'standard/standard_4.stub', 'image2wbmp' => 'gd/gd.stub', 'image_type_to_extension' => 'standard/standard_0.stub', 'image_type_to_mime_type' => 'standard/standard_0.stub', 'imageaffine' => 'gd/gd.stub', 'imageaffinematrixconcat' => 'gd/gd.stub', 'imageaffinematrixget' => 'gd/gd.stub', 'imagealphablending' => 'gd/gd.stub', 'imageantialias' => 'gd/gd.stub', 'imagearc' => 'gd/gd.stub', 'imageavif' => 'gd/gd.stub', 'imagebmp' => 'gd/gd.stub', 'imagechar' => 'gd/gd.stub', 'imagecharup' => 'gd/gd.stub', 'imagecolorallocate' => 'gd/gd.stub', 'imagecolorallocatealpha' => 'gd/gd.stub', 'imagecolorat' => 'gd/gd.stub', 'imagecolorclosest' => 'gd/gd.stub', 'imagecolorclosestalpha' => 'gd/gd.stub', 'imagecolorclosesthwb' => 'gd/gd.stub', 'imagecolordeallocate' => 'gd/gd.stub', 'imagecolorexact' => 'gd/gd.stub', 'imagecolorexactalpha' => 'gd/gd.stub', 'imagecolormatch' => 'gd/gd.stub', 'imagecolorresolve' => 'gd/gd.stub', 'imagecolorresolvealpha' => 'gd/gd.stub', 'imagecolorset' => 'gd/gd.stub', 'imagecolorsforindex' => 'gd/gd.stub', 'imagecolorstotal' => 'gd/gd.stub', 'imagecolortransparent' => 'gd/gd.stub', 'imageconvolution' => 'gd/gd.stub', 'imagecopy' => 'gd/gd.stub', 'imagecopymerge' => 'gd/gd.stub', 'imagecopymergegray' => 'gd/gd.stub', 'imagecopyresampled' => 'gd/gd.stub', 'imagecopyresized' => 'gd/gd.stub', 'imagecreate' => 'gd/gd.stub', 'imagecreatefromavif' => 'gd/gd.stub', 'imagecreatefrombmp' => 'gd/gd.stub', 'imagecreatefromgd' => 'gd/gd.stub', 'imagecreatefromgd2' => 'gd/gd.stub', 'imagecreatefromgd2part' => 'gd/gd.stub', 'imagecreatefromgif' => 'gd/gd.stub', 'imagecreatefromjpeg' => 'gd/gd.stub', 'imagecreatefrompng' => 'gd/gd.stub', 'imagecreatefromstring' => 'gd/gd.stub', 'imagecreatefromtga' => 'gd/gd.stub', 'imagecreatefromwbmp' => 'gd/gd.stub', 'imagecreatefromwebp' => 'gd/gd.stub', 'imagecreatefromxbm' => 'gd/gd.stub', 'imagecreatefromxpm' => 'gd/gd.stub', 'imagecreatetruecolor' => 'gd/gd.stub', 'imagecrop' => 'gd/gd.stub', 'imagecropauto' => 'gd/gd.stub', 'imagedashedline' => 'gd/gd.stub', 'imagedestroy' => 'gd/gd.stub', 'imageellipse' => 'gd/gd.stub', 'imagefill' => 'gd/gd.stub', 'imagefilledarc' => 'gd/gd.stub', 'imagefilledellipse' => 'gd/gd.stub', 'imagefilledpolygon' => 'gd/gd.stub', 'imagefilledrectangle' => 'gd/gd.stub', 'imagefilltoborder' => 'gd/gd.stub', 'imagefilter' => 'gd/gd.stub', 'imageflip' => 'gd/gd.stub', 'imagefontheight' => 'gd/gd.stub', 'imagefontwidth' => 'gd/gd.stub', 'imageftbbox' => 'gd/gd.stub', 'imagefttext' => 'gd/gd.stub', 'imagegammacorrect' => 'gd/gd.stub', 'imagegd' => 'gd/gd.stub', 'imagegd2' => 'gd/gd.stub', 'imagegetclip' => 'gd/gd.stub', 'imagegetinterpolation' => 'gd/gd.stub', 'imagegif' => 'gd/gd.stub', 'imagegrabscreen' => 'gd/gd.stub', 'imagegrabwindow' => 'gd/gd.stub', 'imageinterlace' => 'gd/gd.stub', 'imageistruecolor' => 'gd/gd.stub', 'imagejpeg' => 'gd/gd.stub', 'imagelayereffect' => 'gd/gd.stub', 'imageline' => 'gd/gd.stub', 'imageloadfont' => 'gd/gd.stub', 'imageopenpolygon' => 'gd/gd.stub', 'imagepalettecopy' => 'gd/gd.stub', 'imagepalettetotruecolor' => 'gd/gd.stub', 'imagepng' => 'gd/gd.stub', 'imagepolygon' => 'gd/gd.stub', 'imagepsbbox' => 'gd/gd.stub', 'imagepsencodefont' => 'gd/gd.stub', 'imagepsextendfont' => 'gd/gd.stub', 'imagepsfreefont' => 'gd/gd.stub', 'imagepsloadfont' => 'gd/gd.stub', 'imagepsslantfont' => 'gd/gd.stub', 'imagepstext' => 'gd/gd.stub', 'imagerectangle' => 'gd/gd.stub', 'imageresolution' => 'gd/gd.stub', 'imagerotate' => 'gd/gd.stub', 'imagesavealpha' => 'gd/gd.stub', 'imagescale' => 'gd/gd.stub', 'imagesetbrush' => 'gd/gd.stub', 'imagesetclip' => 'gd/gd.stub', 'imagesetinterpolation' => 'gd/gd.stub', 'imagesetpixel' => 'gd/gd.stub', 'imagesetstyle' => 'gd/gd.stub', 'imagesetthickness' => 'gd/gd.stub', 'imagesettile' => 'gd/gd.stub', 'imagestring' => 'gd/gd.stub', 'imagestringup' => 'gd/gd.stub', 'imagesx' => 'gd/gd.stub', 'imagesy' => 'gd/gd.stub', 'imagetruecolortopalette' => 'gd/gd.stub', 'imagettfbbox' => 'gd/gd.stub', 'imagettftext' => 'gd/gd.stub', 'imagetypes' => 'gd/gd.stub', 'imagewbmp' => 'gd/gd.stub', 'imagewebp' => 'gd/gd.stub', 'imagexbm' => 'gd/gd.stub', 'imap_8bit' => 'imap/imap.stub', 'imap_alerts' => 'imap/imap.stub', 'imap_append' => 'imap/imap.stub', 'imap_base64' => 'imap/imap.stub', 'imap_binary' => 'imap/imap.stub', 'imap_body' => 'imap/imap.stub', 'imap_bodystruct' => 'imap/imap.stub', 'imap_check' => 'imap/imap.stub', 'imap_clearflag_full' => 'imap/imap.stub', 'imap_close' => 'imap/imap.stub', 'imap_create' => 'imap/imap.stub', 'imap_createmailbox' => 'imap/imap.stub', 'imap_delete' => 'imap/imap.stub', 'imap_deletemailbox' => 'imap/imap.stub', 'imap_errors' => 'imap/imap.stub', 'imap_expunge' => 'imap/imap.stub', 'imap_fetch_overview' => 'imap/imap.stub', 'imap_fetchbody' => 'imap/imap.stub', 'imap_fetchheader' => 'imap/imap.stub', 'imap_fetchmime' => 'imap/imap.stub', 'imap_fetchstructure' => 'imap/imap.stub', 'imap_fetchtext' => 'imap/imap.stub', 'imap_gc' => 'imap/imap.stub', 'imap_get_quota' => 'imap/imap.stub', 'imap_get_quotaroot' => 'imap/imap.stub', 'imap_getacl' => 'imap/imap.stub', 'imap_getannotation' => 'imap/imap.stub', 'imap_getmailboxes' => 'imap/imap.stub', 'imap_getsubscribed' => 'imap/imap.stub', 'imap_header' => 'imap/imap.stub', 'imap_headerinfo' => 'imap/imap.stub', 'imap_headers' => 'imap/imap.stub', 'imap_is_open' => 'imap/imap.stub', 'imap_last_error' => 'imap/imap.stub', 'imap_list' => 'imap/imap.stub', 'imap_listmailbox' => 'imap/imap.stub', 'imap_listscan' => 'imap/imap.stub', 'imap_listsubscribed' => 'imap/imap.stub', 'imap_lsub' => 'imap/imap.stub', 'imap_mail' => 'imap/imap.stub', 'imap_mail_compose' => 'imap/imap.stub', 'imap_mail_copy' => 'imap/imap.stub', 'imap_mail_move' => 'imap/imap.stub', 'imap_mailboxmsginfo' => 'imap/imap.stub', 'imap_mime_header_decode' => 'imap/imap.stub', 'imap_msgno' => 'imap/imap.stub', 'imap_mutf7_to_utf8' => 'imap/imap.stub', 'imap_myrights' => 'imap/imap.stub', 'imap_num_msg' => 'imap/imap.stub', 'imap_num_recent' => 'imap/imap.stub', 'imap_open' => 'imap/imap.stub', 'imap_ping' => 'imap/imap.stub', 'imap_qprint' => 'imap/imap.stub', 'imap_rename' => 'imap/imap.stub', 'imap_renamemailbox' => 'imap/imap.stub', 'imap_reopen' => 'imap/imap.stub', 'imap_rfc822_parse_adrlist' => 'imap/imap.stub', 'imap_rfc822_parse_headers' => 'imap/imap.stub', 'imap_rfc822_write_address' => 'imap/imap.stub', 'imap_savebody' => 'imap/imap.stub', 'imap_scan' => 'imap/imap.stub', 'imap_scanmailbox' => 'imap/imap.stub', 'imap_search' => 'imap/imap.stub', 'imap_set_quota' => 'imap/imap.stub', 'imap_setacl' => 'imap/imap.stub', 'imap_setannotation' => 'imap/imap.stub', 'imap_setflag_full' => 'imap/imap.stub', 'imap_sort' => 'imap/imap.stub', 'imap_status' => 'imap/imap.stub', 'imap_status_current' => 'imap/imap.stub', 'imap_subscribe' => 'imap/imap.stub', 'imap_thread' => 'imap/imap.stub', 'imap_timeout' => 'imap/imap.stub', 'imap_uid' => 'imap/imap.stub', 'imap_undelete' => 'imap/imap.stub', 'imap_unsubscribe' => 'imap/imap.stub', 'imap_utf7_decode' => 'imap/imap.stub', 'imap_utf7_encode' => 'imap/imap.stub', 'imap_utf8' => 'imap/imap.stub', 'imap_utf8_to_mutf7' => 'imap/imap.stub', 'implode' => 'standard/standard_1.stub', 'import_request_variables' => 'standard/standard_3.stub', 'in_array' => 'standard/standard_8.stub', 'inet_ntop' => 'standard/standard_3.stub', 'inet_pton' => 'standard/standard_3.stub', 'inflate_add' => 'zlib/zlib.stub', 'inflate_get_read_len' => 'zlib/zlib.stub', 'inflate_get_status' => 'zlib/zlib.stub', 'inflate_init' => 'zlib/zlib.stub', 'ini_alter' => 'standard/standard_4.stub', 'ini_get' => 'standard/standard_4.stub', 'ini_get_all' => 'standard/standard_4.stub', 'ini_parse_quantity' => 'standard/standard_4.stub', 'ini_restore' => 'standard/standard_4.stub', 'ini_set' => 'standard/standard_4.stub', 'inotify_add_watch' => 'inotify/inotify.stub', 'inotify_init' => 'inotify/inotify.stub', 'inotify_queue_len' => 'inotify/inotify.stub', 'inotify_read' => 'inotify/inotify.stub', 'inotify_rm_watch' => 'inotify/inotify.stub', 'intcal_get_maximum' => 'intl/intl.stub', 'intdiv' => 'standard/standard_3.stub', 'interface_exists' => 'Core/Core.stub', 'intl_error_name' => 'intl/intl.stub', 'intl_get' => 'intl/intl.stub', 'intl_get_error_code' => 'intl/intl.stub', 'intl_get_error_message' => 'intl/intl.stub', 'intl_is_failure' => 'intl/intl.stub', 'intlcal_add' => 'intl/intl.stub', 'intlcal_after' => 'intl/intl.stub', 'intlcal_before' => 'intl/intl.stub', 'intlcal_clear' => 'intl/intl.stub', 'intlcal_create_instance' => 'intl/intl.stub', 'intlcal_equals' => 'intl/intl.stub', 'intlcal_field_difference' => 'intl/intl.stub', 'intlcal_from_date_time' => 'intl/intl.stub', 'intlcal_get' => 'intl/intl.stub', 'intlcal_get_actual_maximum' => 'intl/intl.stub', 'intlcal_get_actual_minimum' => 'intl/intl.stub', 'intlcal_get_available_locales' => 'intl/intl.stub', 'intlcal_get_day_of_week_type' => 'intl/intl.stub', 'intlcal_get_error_code' => 'intl/intl.stub', 'intlcal_get_error_message' => 'intl/intl.stub', 'intlcal_get_first_day_of_week' => 'intl/intl.stub', 'intlcal_get_greatest_minimum' => 'intl/intl.stub', 'intlcal_get_keyword_values_for_locale' => 'intl/intl.stub', 'intlcal_get_least_maximum' => 'intl/intl.stub', 'intlcal_get_locale' => 'intl/intl.stub', 'intlcal_get_maximum' => 'intl/intl.stub', 'intlcal_get_minimal_days_in_first_week' => 'intl/intl.stub', 'intlcal_get_minimum' => 'intl/intl.stub', 'intlcal_get_now' => 'intl/intl.stub', 'intlcal_get_repeated_wall_time_option' => 'intl/intl.stub', 'intlcal_get_skipped_wall_time_option' => 'intl/intl.stub', 'intlcal_get_time' => 'intl/intl.stub', 'intlcal_get_time_zone' => 'intl/intl.stub', 'intlcal_get_type' => 'intl/intl.stub', 'intlcal_get_weekend_transition' => 'intl/intl.stub', 'intlcal_greates_minimum' => 'intl/intl.stub', 'intlcal_in_daylight_time' => 'intl/intl.stub', 'intlcal_is_equivalent_to' => 'intl/intl.stub', 'intlcal_is_lenient' => 'intl/intl.stub', 'intlcal_is_set' => 'intl/intl.stub', 'intlcal_is_weekend' => 'intl/intl.stub', 'intlcal_roll' => 'intl/intl.stub', 'intlcal_set' => 'intl/intl.stub', 'intlcal_set_first_day_of_week' => 'intl/intl.stub', 'intlcal_set_lenient' => 'intl/intl.stub', 'intlcal_set_minimal_days_in_first_week' => 'intl/intl.stub', 'intlcal_set_repeated_wall_time_option' => 'intl/intl.stub', 'intlcal_set_skipped_wall_time_option' => 'intl/intl.stub', 'intlcal_set_time' => 'intl/intl.stub', 'intlcal_set_time_zone' => 'intl/intl.stub', 'intlcal_to_date_time' => 'intl/intl.stub', 'intlgregcal_create_instance' => 'intl/intl.stub', 'intlgregcal_get_gregorian_change' => 'intl/intl.stub', 'intlgregcal_is_leap_year' => 'intl/intl.stub', 'intlgregcal_set_gregorian_change' => 'intl/intl.stub', 'intltz_count_equivalent_ids' => 'intl/intl.stub', 'intltz_create_default' => 'intl/intl.stub', 'intltz_create_enumeration' => 'intl/intl.stub', 'intltz_create_time_zone' => 'intl/intl.stub', 'intltz_create_time_zone_id_enumeration' => 'intl/intl.stub', 'intltz_from_date_time_zone' => 'intl/intl.stub', 'intltz_getGMT' => 'intl/intl.stub', 'intltz_get_canonical_id' => 'intl/intl.stub', 'intltz_get_display_name' => 'intl/intl.stub', 'intltz_get_dst_savings' => 'intl/intl.stub', 'intltz_get_equivalent_id' => 'intl/intl.stub', 'intltz_get_error_code' => 'intl/intl.stub', 'intltz_get_error_message' => 'intl/intl.stub', 'intltz_get_gmt' => 'intl/intl.stub', 'intltz_get_iana_id' => 'intl/intl.stub', 'intltz_get_id' => 'intl/intl.stub', 'intltz_get_id_for_windows_id' => 'intl/intl.stub', 'intltz_get_offset' => 'intl/intl.stub', 'intltz_get_raw_offset' => 'intl/intl.stub', 'intltz_get_region' => 'intl/intl.stub', 'intltz_get_tz_data_version' => 'intl/intl.stub', 'intltz_get_unknown' => 'intl/intl.stub', 'intltz_get_windows_id' => 'intl/intl.stub', 'intltz_has_same_rules' => 'intl/intl.stub', 'intltz_to_date_time_zone' => 'intl/intl.stub', 'intltz_use_daylight_time' => 'intl/intl.stub', 'intlz_create_default' => 'intl/intl.stub', 'intval' => 'standard/standard_5.stub', 'ip2long' => 'standard/standard_3.stub', 'iptcembed' => 'standard/standard_0.stub', 'iptcparse' => 'standard/standard_0.stub', 'is_a' => 'Core/Core.stub', 'is_array' => 'standard/standard_5.stub', 'is_bool' => 'standard/standard_5.stub', 'is_callable' => 'standard/standard_5.stub', 'is_countable' => 'standard/standard_5.stub', 'is_dir' => 'standard/standard_7.stub', 'is_double' => 'standard/standard_5.stub', 'is_executable' => 'standard/standard_7.stub', 'is_file' => 'standard/standard_7.stub', 'is_finite' => 'standard/standard_3.stub', 'is_float' => 'standard/standard_5.stub', 'is_infinite' => 'standard/standard_3.stub', 'is_int' => 'standard/standard_5.stub', 'is_integer' => 'standard/standard_5.stub', 'is_iterable' => 'standard/basic.stub', 'is_link' => 'standard/standard_7.stub', 'is_long' => 'standard/standard_5.stub', 'is_nan' => 'standard/standard_3.stub', 'is_null' => 'standard/standard_5.stub', 'is_numeric' => 'standard/standard_5.stub', 'is_object' => 'standard/standard_5.stub', 'is_readable' => 'standard/standard_7.stub', 'is_real' => 'standard/standard_5.stub', 'is_resource' => 'standard/standard_5.stub', 'is_scalar' => 'standard/standard_5.stub', 'is_soap_fault' => 'soap/soap.stub', 'is_string' => 'standard/standard_5.stub', 'is_subclass_of' => 'Core/Core.stub', 'is_uploaded_file' => 'standard/standard_4.stub', 'is_writable' => 'standard/standard_7.stub', 'is_writeable' => 'standard/standard_7.stub', 'iterator_apply' => 'SPL/SPL_f.stub', 'iterator_count' => 'SPL/SPL_f.stub', 'iterator_to_array' => 'SPL/SPL_f.stub', 'java' => 'zend/zend_f.stub', 'java_last_exception_clear' => 'zend/zend_f.stub', 'java_last_exception_get' => 'zend/zend_f.stub', 'java_reload' => 'zend/zend_f.stub', 'java_require' => 'zend/zend_f.stub', 'java_set_encoding' => 'zend/zend_f.stub', 'java_set_ignore_case' => 'zend/zend_f.stub', 'java_throw_exceptions' => 'zend/zend_f.stub', 'jddayofweek' => 'calendar/calendar.stub', 'jdmonthname' => 'calendar/calendar.stub', 'jdtofrench' => 'calendar/calendar.stub', 'jdtogregorian' => 'calendar/calendar.stub', 'jdtojewish' => 'calendar/calendar.stub', 'jdtojulian' => 'calendar/calendar.stub', 'jdtounix' => 'calendar/calendar.stub', 'jewishtojd' => 'calendar/calendar.stub', 'jobqueue_license_info' => 'zend/zend_f.stub', 'join' => 'standard/standard_1.stub', 'jpeg2wbmp' => 'gd/gd.stub', 'json_decode' => 'json/json.stub', 'json_encode' => 'json/json.stub', 'json_last_error' => 'json/json.stub', 'json_last_error_msg' => 'json/json.stub', 'json_validate' => 'json/json.stub', 'juliantojd' => 'calendar/calendar.stub', 'kafka_err2name' => 'simple_kafka_client/functions.stub', 'kafka_err2str' => 'simple_kafka_client/functions.stub', 'kafka_get_err_descs' => 'simple_kafka_client/functions.stub', 'kafka_offset_tail' => 'simple_kafka_client/functions.stub', 'kafka_thread_cnt' => 'simple_kafka_client/functions.stub', 'key' => 'standard/standard_8.stub', 'key_exists' => 'standard/standard_9.stub', 'krsort' => 'standard/standard_8.stub', 'ksort' => 'standard/standard_8.stub', 'lcfirst' => 'standard/standard_1.stub', 'lcg_value' => 'random/random.stub', 'lchgrp' => 'standard/standard_7.stub', 'lchown' => 'standard/standard_7.stub', 'ldap_8859_to_t61' => 'ldap/ldap.stub', 'ldap_add' => 'ldap/ldap.stub', 'ldap_add_ext' => 'ldap/ldap.stub', 'ldap_bind' => 'ldap/ldap.stub', 'ldap_bind_ext' => 'ldap/ldap.stub', 'ldap_close' => 'ldap/ldap.stub', 'ldap_compare' => 'ldap/ldap.stub', 'ldap_connect' => 'ldap/ldap.stub', 'ldap_control_paged_result' => 'ldap/ldap.stub', 'ldap_control_paged_result_response' => 'ldap/ldap.stub', 'ldap_count_entries' => 'ldap/ldap.stub', 'ldap_count_references' => 'ldap/ldap.stub', 'ldap_delete' => 'ldap/ldap.stub', 'ldap_delete_ext' => 'ldap/ldap.stub', 'ldap_dn2ufn' => 'ldap/ldap.stub', 'ldap_err2str' => 'ldap/ldap.stub', 'ldap_errno' => 'ldap/ldap.stub', 'ldap_error' => 'ldap/ldap.stub', 'ldap_escape' => 'ldap/ldap.stub', 'ldap_exop' => 'ldap/ldap.stub', 'ldap_exop_passwd' => 'ldap/ldap.stub', 'ldap_exop_refresh' => 'ldap/ldap.stub', 'ldap_exop_sync' => 'ldap/ldap.stub', 'ldap_exop_whoami' => 'ldap/ldap.stub', 'ldap_explode_dn' => 'ldap/ldap.stub', 'ldap_first_attribute' => 'ldap/ldap.stub', 'ldap_first_entry' => 'ldap/ldap.stub', 'ldap_first_reference' => 'ldap/ldap.stub', 'ldap_free_result' => 'ldap/ldap.stub', 'ldap_get_attributes' => 'ldap/ldap.stub', 'ldap_get_dn' => 'ldap/ldap.stub', 'ldap_get_entries' => 'ldap/ldap.stub', 'ldap_get_option' => 'ldap/ldap.stub', 'ldap_get_values' => 'ldap/ldap.stub', 'ldap_get_values_len' => 'ldap/ldap.stub', 'ldap_list' => 'ldap/ldap.stub', 'ldap_mod_add' => 'ldap/ldap.stub', 'ldap_mod_add_ext' => 'ldap/ldap.stub', 'ldap_mod_del' => 'ldap/ldap.stub', 'ldap_mod_del_ext' => 'ldap/ldap.stub', 'ldap_mod_replace' => 'ldap/ldap.stub', 'ldap_mod_replace_ext' => 'ldap/ldap.stub', 'ldap_modify' => 'ldap/ldap.stub', 'ldap_modify_batch' => 'ldap/ldap.stub', 'ldap_next_attribute' => 'ldap/ldap.stub', 'ldap_next_entry' => 'ldap/ldap.stub', 'ldap_next_reference' => 'ldap/ldap.stub', 'ldap_parse_exop' => 'ldap/ldap.stub', 'ldap_parse_reference' => 'ldap/ldap.stub', 'ldap_parse_result' => 'ldap/ldap.stub', 'ldap_read' => 'ldap/ldap.stub', 'ldap_rename' => 'ldap/ldap.stub', 'ldap_rename_ext' => 'ldap/ldap.stub', 'ldap_sasl_bind' => 'ldap/ldap.stub', 'ldap_search' => 'ldap/ldap.stub', 'ldap_set_option' => 'ldap/ldap.stub', 'ldap_set_rebind_proc' => 'ldap/ldap.stub', 'ldap_sort' => 'ldap/ldap.stub', 'ldap_start_tls' => 'ldap/ldap.stub', 'ldap_t61_to_8859' => 'ldap/ldap.stub', 'ldap_unbind' => 'ldap/ldap.stub', 'levenshtein' => 'standard/standard_2.stub', 'libvirt_check_version' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_all_domain_stats' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_capabilities' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_emulator' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_encrypted' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_hostname' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_hypervisor' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_information' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_machine_types' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_maxvcpus' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_nic_models' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_secure' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_soundhw_models' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_sysinfo' => 'libvirt-php/libvirt-php.stub', 'libvirt_connect_get_uri' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_attach_device' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_block_commit' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_block_job_abort' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_block_job_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_block_job_set_speed' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_block_resize' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_block_stats' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_change_boot_devices' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_change_memory' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_change_vcpus' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_core_dump' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_create' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_create_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_define_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_destroy' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_detach_device' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_disk_add' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_disk_remove' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_autostart' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_block_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_connect' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_counts' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_disk_devices' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_id' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_interface_devices' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_job_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_metadata' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_network_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_next_dev_ids' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_screen_dimensions' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_screenshot' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_screenshot_api' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_uuid' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_get_xml_desc' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_has_current_snapshot' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_interface_addresses' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_interface_stats' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_is_active' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_is_persistent' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_lookup_by_id' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_lookup_by_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_lookup_by_uuid' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_lookup_by_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_managedsave' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_memory_peek' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_memory_stats' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_migrate' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_migrate_to_uri' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_migrate_to_uri2' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_new' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_new_get_vnc' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_nic_add' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_nic_remove' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_qemu_agent_command' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_reboot' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_reset' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_resume' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_send_key_api' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_send_keys' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_send_pointer_event' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_set_autostart' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_set_max_memory' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_set_memory' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_set_memory_flags' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_set_metadata' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_shutdown' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_snapshot_create' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_snapshot_current' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_snapshot_delete' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_snapshot_get_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_snapshot_lookup_by_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_snapshot_revert' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_suspend' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_undefine' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_undefine_flags' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_update_device' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_xml_from_native' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_xml_to_native' => 'libvirt-php/libvirt-php.stub', 'libvirt_domain_xml_xpath' => 'libvirt-php/libvirt-php.stub', 'libvirt_get_iso_images' => 'libvirt-php/libvirt-php.stub', 'libvirt_get_last_error' => 'libvirt-php/libvirt-php.stub', 'libvirt_get_last_error_code' => 'libvirt-php/libvirt-php.stub', 'libvirt_get_last_error_domain' => 'libvirt-php/libvirt-php.stub', 'libvirt_has_feature' => 'libvirt-php/libvirt-php.stub', 'libvirt_image_create' => 'libvirt-php/libvirt-php.stub', 'libvirt_image_remove' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_active_domain_ids' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_active_domains' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_active_storagepools' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_all_networks' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_all_nwfilters' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_domain_resources' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_domain_snapshots' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_domains' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_inactive_domains' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_inactive_storagepools' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_networks' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_nodedevs' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_nwfilters' => 'libvirt-php/libvirt-php.stub', 'libvirt_list_storagepools' => 'libvirt-php/libvirt-php.stub', 'libvirt_logfile_set' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_define_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_active' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_autostart' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_bridge' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_information' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_uuid' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_get_xml_desc' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_set_active' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_set_autostart' => 'libvirt-php/libvirt-php.stub', 'libvirt_network_undefine' => 'libvirt-php/libvirt-php.stub', 'libvirt_node_get_cpu_stats' => 'libvirt-php/libvirt-php.stub', 'libvirt_node_get_cpu_stats_for_each_cpu' => 'libvirt-php/libvirt-php.stub', 'libvirt_node_get_free_memory' => 'libvirt-php/libvirt-php.stub', 'libvirt_node_get_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_node_get_mem_stats' => 'libvirt-php/libvirt-php.stub', 'libvirt_nodedev_capabilities' => 'libvirt-php/libvirt-php.stub', 'libvirt_nodedev_get' => 'libvirt-php/libvirt-php.stub', 'libvirt_nodedev_get_information' => 'libvirt-php/libvirt-php.stub', 'libvirt_nodedev_get_xml_desc' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_define_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_get_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_get_uuid' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_get_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_get_xml_desc' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_lookup_by_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_lookup_by_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_nwfilter_undefine' => 'libvirt-php/libvirt-php.stub', 'libvirt_print_binding_resources' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_build' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_create' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_define_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_delete' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_destroy' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_get_autostart' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_get_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_get_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_get_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_get_volume_count' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_get_xml_desc' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_is_active' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_list_volumes' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_lookup_by_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_lookup_by_uuid_string' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_lookup_by_volume' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_refresh' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_set_autostart' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagepool_undefine' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_create_xml' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_create_xml_from' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_delete' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_download' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_get_info' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_get_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_get_path' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_get_xml_desc' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_lookup_by_name' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_lookup_by_path' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_resize' => 'libvirt-php/libvirt-php.stub', 'libvirt_storagevolume_upload' => 'libvirt-php/libvirt-php.stub', 'libvirt_stream_abort' => 'libvirt-php/libvirt-php.stub', 'libvirt_stream_close' => 'libvirt-php/libvirt-php.stub', 'libvirt_stream_create' => 'libvirt-php/libvirt-php.stub', 'libvirt_stream_finish' => 'libvirt-php/libvirt-php.stub', 'libvirt_stream_recv' => 'libvirt-php/libvirt-php.stub', 'libvirt_stream_send' => 'libvirt-php/libvirt-php.stub', 'libvirt_version' => 'libvirt-php/libvirt-php.stub', 'libxml_clear_errors' => 'libxml/libxml.stub', 'libxml_disable_entity_loader' => 'libxml/libxml.stub', 'libxml_get_errors' => 'libxml/libxml.stub', 'libxml_get_external_entity_loader' => 'libxml/libxml.stub', 'libxml_get_last_error' => 'libxml/libxml.stub', 'libxml_set_external_entity_loader' => 'libxml/libxml.stub', 'libxml_set_streams_context' => 'libxml/libxml.stub', 'libxml_use_internal_errors' => 'libxml/libxml.stub', 'link' => 'standard/standard_2.stub', 'linkinfo' => 'standard/standard_2.stub', 'locale_accept_from_http' => 'intl/intl.stub', 'locale_canonicalize' => 'intl/intl.stub', 'locale_compose' => 'intl/intl.stub', 'locale_filter_matches' => 'intl/intl.stub', 'locale_get_all_variants' => 'intl/intl.stub', 'locale_get_default' => 'intl/intl.stub', 'locale_get_display_language' => 'intl/intl.stub', 'locale_get_display_name' => 'intl/intl.stub', 'locale_get_display_region' => 'intl/intl.stub', 'locale_get_display_script' => 'intl/intl.stub', 'locale_get_display_variant' => 'intl/intl.stub', 'locale_get_keywords' => 'intl/intl.stub', 'locale_get_primary_language' => 'intl/intl.stub', 'locale_get_region' => 'intl/intl.stub', 'locale_get_script' => 'intl/intl.stub', 'locale_lookup' => 'intl/intl.stub', 'locale_parse' => 'intl/intl.stub', 'locale_set_default' => 'intl/intl.stub', 'localeconv' => 'standard/standard_1.stub', 'localtime' => 'date/date.stub', 'log' => 'standard/standard_3.stub', 'log10' => 'standard/standard_3.stub', 'log1p' => 'standard/standard_3.stub', 'long2ip' => 'standard/standard_3.stub', 'lstat' => 'standard/standard_7.stub', 'ltrim' => 'standard/standard_1.stub', 'lzf_compress' => 'lzf/lzf.stub', 'lzf_decompress' => 'lzf/lzf.stub', 'lzf_optimized_for' => 'lzf/lzf.stub', 'magic_quotes_runtime' => 'standard/standard_3.stub', 'mail' => 'standard/standard_7.stub', 'mailparse_determine_best_xfer_encoding' => 'mailparse/mailparse.stub', 'mailparse_msg_create' => 'mailparse/mailparse.stub', 'mailparse_msg_extract_part' => 'mailparse/mailparse.stub', 'mailparse_msg_extract_part_file' => 'mailparse/mailparse.stub', 'mailparse_msg_extract_whole_part_file' => 'mailparse/mailparse.stub', 'mailparse_msg_free' => 'mailparse/mailparse.stub', 'mailparse_msg_get_part' => 'mailparse/mailparse.stub', 'mailparse_msg_get_part_data' => 'mailparse/mailparse.stub', 'mailparse_msg_get_structure' => 'mailparse/mailparse.stub', 'mailparse_msg_parse' => 'mailparse/mailparse.stub', 'mailparse_msg_parse_file' => 'mailparse/mailparse.stub', 'mailparse_rfc822_parse_addresses' => 'mailparse/mailparse.stub', 'mailparse_stream_encode' => 'mailparse/mailparse.stub', 'mailparse_uudecode_all' => 'mailparse/mailparse.stub', 'max' => 'standard/standard_8.stub', 'mb_check_encoding' => 'mbstring/mbstring.stub', 'mb_chr' => 'mbstring/mbstring.stub', 'mb_convert_case' => 'mbstring/mbstring.stub', 'mb_convert_encoding' => 'mbstring/mbstring.stub', 'mb_convert_kana' => 'mbstring/mbstring.stub', 'mb_convert_variables' => 'mbstring/mbstring.stub', 'mb_decode_mimeheader' => 'mbstring/mbstring.stub', 'mb_decode_numericentity' => 'mbstring/mbstring.stub', 'mb_detect_encoding' => 'mbstring/mbstring.stub', 'mb_detect_order' => 'mbstring/mbstring.stub', 'mb_encode_mimeheader' => 'mbstring/mbstring.stub', 'mb_encode_numericentity' => 'mbstring/mbstring.stub', 'mb_encoding_aliases' => 'mbstring/mbstring.stub', 'mb_ereg' => 'mbstring/mbstring.stub', 'mb_ereg_match' => 'mbstring/mbstring.stub', 'mb_ereg_replace' => 'mbstring/mbstring.stub', 'mb_ereg_replace_callback' => 'mbstring/mbstring.stub', 'mb_ereg_search' => 'mbstring/mbstring.stub', 'mb_ereg_search_getpos' => 'mbstring/mbstring.stub', 'mb_ereg_search_getregs' => 'mbstring/mbstring.stub', 'mb_ereg_search_init' => 'mbstring/mbstring.stub', 'mb_ereg_search_pos' => 'mbstring/mbstring.stub', 'mb_ereg_search_regs' => 'mbstring/mbstring.stub', 'mb_ereg_search_setpos' => 'mbstring/mbstring.stub', 'mb_eregi' => 'mbstring/mbstring.stub', 'mb_eregi_replace' => 'mbstring/mbstring.stub', 'mb_get_info' => 'mbstring/mbstring.stub', 'mb_http_input' => 'mbstring/mbstring.stub', 'mb_http_output' => 'mbstring/mbstring.stub', 'mb_internal_encoding' => 'mbstring/mbstring.stub', 'mb_language' => 'mbstring/mbstring.stub', 'mb_lcfirst' => 'mbstring/mbstring.stub', 'mb_list_encodings' => 'mbstring/mbstring.stub', 'mb_ltrim' => 'mbstring/mbstring.stub', 'mb_ord' => 'mbstring/mbstring.stub', 'mb_output_handler' => 'mbstring/mbstring.stub', 'mb_parse_str' => 'mbstring/mbstring.stub', 'mb_preferred_mime_name' => 'mbstring/mbstring.stub', 'mb_regex_encoding' => 'mbstring/mbstring.stub', 'mb_regex_set_options' => 'mbstring/mbstring.stub', 'mb_rtrim' => 'mbstring/mbstring.stub', 'mb_scrub' => 'mbstring/mbstring.stub', 'mb_send_mail' => 'mbstring/mbstring.stub', 'mb_split' => 'mbstring/mbstring.stub', 'mb_str_pad' => 'mbstring/mbstring.stub', 'mb_str_split' => 'mbstring/mbstring.stub', 'mb_strcut' => 'mbstring/mbstring.stub', 'mb_strimwidth' => 'mbstring/mbstring.stub', 'mb_stripos' => 'mbstring/mbstring.stub', 'mb_stristr' => 'mbstring/mbstring.stub', 'mb_strlen' => 'mbstring/mbstring.stub', 'mb_strpos' => 'mbstring/mbstring.stub', 'mb_strrchr' => 'mbstring/mbstring.stub', 'mb_strrichr' => 'mbstring/mbstring.stub', 'mb_strripos' => 'mbstring/mbstring.stub', 'mb_strrpos' => 'mbstring/mbstring.stub', 'mb_strstr' => 'mbstring/mbstring.stub', 'mb_strtolower' => 'mbstring/mbstring.stub', 'mb_strtoupper' => 'mbstring/mbstring.stub', 'mb_strwidth' => 'mbstring/mbstring.stub', 'mb_substitute_character' => 'mbstring/mbstring.stub', 'mb_substr' => 'mbstring/mbstring.stub', 'mb_substr_count' => 'mbstring/mbstring.stub', 'mb_trim' => 'mbstring/mbstring.stub', 'mb_ucfirst' => 'mbstring/mbstring.stub', 'mbereg' => 'mbstring/mbstring.stub', 'mbereg_match' => 'mbstring/mbstring.stub', 'mbereg_replace' => 'mbstring/mbstring.stub', 'mbereg_search' => 'mbstring/mbstring.stub', 'mbereg_search_getpos' => 'mbstring/mbstring.stub', 'mbereg_search_getregs' => 'mbstring/mbstring.stub', 'mbereg_search_init' => 'mbstring/mbstring.stub', 'mbereg_search_pos' => 'mbstring/mbstring.stub', 'mbereg_search_regs' => 'mbstring/mbstring.stub', 'mbereg_search_setpos' => 'mbstring/mbstring.stub', 'mberegi' => 'mbstring/mbstring.stub', 'mberegi_replace' => 'mbstring/mbstring.stub', 'mbregex_encoding' => 'mbstring/mbstring.stub', 'mbsplit' => 'mbstring/mbstring.stub', 'mcrypt_cbc' => 'mcrypt/mcrypt.stub', 'mcrypt_cfb' => 'mcrypt/mcrypt.stub', 'mcrypt_create_iv' => 'mcrypt/mcrypt.stub', 'mcrypt_decrypt' => 'mcrypt/mcrypt.stub', 'mcrypt_ecb' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_get_algorithms_name' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_get_block_size' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_get_iv_size' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_get_key_size' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_get_modes_name' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_get_supported_key_sizes' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_is_block_algorithm' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_is_block_algorithm_mode' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_is_block_mode' => 'mcrypt/mcrypt.stub', 'mcrypt_enc_self_test' => 'mcrypt/mcrypt.stub', 'mcrypt_encrypt' => 'mcrypt/mcrypt.stub', 'mcrypt_generic' => 'mcrypt/mcrypt.stub', 'mcrypt_generic_deinit' => 'mcrypt/mcrypt.stub', 'mcrypt_generic_end' => 'mcrypt/mcrypt.stub', 'mcrypt_generic_init' => 'mcrypt/mcrypt.stub', 'mcrypt_get_block_size' => 'mcrypt/mcrypt.stub', 'mcrypt_get_cipher_name' => 'mcrypt/mcrypt.stub', 'mcrypt_get_iv_size' => 'mcrypt/mcrypt.stub', 'mcrypt_get_key_size' => 'mcrypt/mcrypt.stub', 'mcrypt_list_algorithms' => 'mcrypt/mcrypt.stub', 'mcrypt_list_modes' => 'mcrypt/mcrypt.stub', 'mcrypt_module_close' => 'mcrypt/mcrypt.stub', 'mcrypt_module_get_algo_block_size' => 'mcrypt/mcrypt.stub', 'mcrypt_module_get_algo_key_size' => 'mcrypt/mcrypt.stub', 'mcrypt_module_get_supported_key_sizes' => 'mcrypt/mcrypt.stub', 'mcrypt_module_is_block_algorithm' => 'mcrypt/mcrypt.stub', 'mcrypt_module_is_block_algorithm_mode' => 'mcrypt/mcrypt.stub', 'mcrypt_module_is_block_mode' => 'mcrypt/mcrypt.stub', 'mcrypt_module_open' => 'mcrypt/mcrypt.stub', 'mcrypt_module_self_test' => 'mcrypt/mcrypt.stub', 'mcrypt_ofb' => 'mcrypt/mcrypt.stub', 'md5' => 'standard/standard_0.stub', 'md5_file' => 'standard/standard_0.stub', 'mdecrypt_generic' => 'mcrypt/mcrypt.stub', 'memcache_add' => 'memcache/memcache.stub', 'memcache_add_server' => 'memcache/memcache.stub', 'memcache_append' => 'memcache/memcache.stub', 'memcache_cas' => 'memcache/memcache.stub', 'memcache_close' => 'memcache/memcache.stub', 'memcache_connect' => 'memcache/memcache.stub', 'memcache_debug' => 'memcache/memcache.stub', 'memcache_decrement' => 'memcache/memcache.stub', 'memcache_delete' => 'memcache/memcache.stub', 'memcache_flush' => 'memcache/memcache.stub', 'memcache_get' => 'memcache/memcache.stub', 'memcache_get_extended_stats' => 'memcache/memcache.stub', 'memcache_get_server_status' => 'memcache/memcache.stub', 'memcache_get_stats' => 'memcache/memcache.stub', 'memcache_get_version' => 'memcache/memcache.stub', 'memcache_increment' => 'memcache/memcache.stub', 'memcache_pconnect' => 'memcache/memcache.stub', 'memcache_prepend' => 'memcache/memcache.stub', 'memcache_replace' => 'memcache/memcache.stub', 'memcache_set' => 'memcache/memcache.stub', 'memcache_set_compress_threshold' => 'memcache/memcache.stub', 'memcache_set_failure_callback' => 'memcache/memcache.stub', 'memcache_set_server_params' => 'memcache/memcache.stub', 'meminfo_dump' => 'meminfo/meminfo.stub', 'memory_get_peak_usage' => 'standard/standard_4.stub', 'memory_get_usage' => 'standard/standard_4.stub', 'memory_reset_peak_usage' => 'standard/standard_4.stub', 'metaphone' => 'standard/standard_8.stub', 'method_exists' => 'Core/Core.stub', 'mhash' => 'hash/hash.stub', 'mhash_count' => 'hash/hash.stub', 'mhash_get_block_size' => 'hash/hash.stub', 'mhash_get_hash_name' => 'hash/hash.stub', 'mhash_keygen_s2k' => 'hash/hash.stub', 'microtime' => 'standard/standard_3.stub', 'mime_content_type' => 'fileinfo/fileinfo.stub', 'min' => 'standard/standard_8.stub', 'ming_keypress' => 'ming/ming.stub', 'ming_setcubicthreshold' => 'ming/ming.stub', 'ming_setscale' => 'ming/ming.stub', 'ming_setswfcompression' => 'ming/ming.stub', 'ming_useconstants' => 'ming/ming.stub', 'ming_useswfversion' => 'ming/ming.stub', 'mkdir' => 'standard/standard_5.stub', 'mktime' => 'date/date.stub', 'money_format' => 'standard/standard_1.stub', 'monitor_custom_event' => 'zend/zend.stub', 'monitor_httperror_event' => 'zend/zend.stub', 'monitor_license_info' => 'zend/zend.stub', 'monitor_pass_error' => 'zend/zend.stub', 'monitor_set_aggregation_hint' => 'zend/zend.stub', 'move_uploaded_file' => 'standard/standard_4.stub', 'mqseries_back' => 'mqseries/mqseries.stub', 'mqseries_begin' => 'mqseries/mqseries.stub', 'mqseries_close' => 'mqseries/mqseries.stub', 'mqseries_cmit' => 'mqseries/mqseries.stub', 'mqseries_conn' => 'mqseries/mqseries.stub', 'mqseries_connx' => 'mqseries/mqseries.stub', 'mqseries_disc' => 'mqseries/mqseries.stub', 'mqseries_get' => 'mqseries/mqseries.stub', 'mqseries_inq' => 'mqseries/mqseries.stub', 'mqseries_open' => 'mqseries/mqseries.stub', 'mqseries_put' => 'mqseries/mqseries.stub', 'mqseries_put1' => 'mqseries/mqseries.stub', 'mqseries_set' => 'mqseries/mqseries.stub', 'mqseries_strerror' => 'mqseries/mqseries.stub', 'ms_GetErrorObj' => 'mapscript/mapscript.stub', 'ms_GetVersion' => 'mapscript/mapscript.stub', 'ms_GetVersionInt' => 'mapscript/mapscript.stub', 'ms_ResetErrorList' => 'mapscript/mapscript.stub', 'ms_TokenizeMap' => 'mapscript/mapscript.stub', 'ms_iogetStdoutBufferBytes' => 'mapscript/mapscript.stub', 'ms_iogetstdoutbufferstring' => 'mapscript/mapscript.stub', 'ms_ioinstallstdinfrombuffer' => 'mapscript/mapscript.stub', 'ms_ioinstallstdouttobuffer' => 'mapscript/mapscript.stub', 'ms_ioresethandlers' => 'mapscript/mapscript.stub', 'ms_iostripstdoutbuffercontentheaders' => 'mapscript/mapscript.stub', 'ms_iostripstdoutbuffercontenttype' => 'mapscript/mapscript.stub', 'msg_get_queue' => 'sysvmsg/sysvmsg.stub', 'msg_queue_exists' => 'sysvmsg/sysvmsg.stub', 'msg_receive' => 'sysvmsg/sysvmsg.stub', 'msg_remove_queue' => 'sysvmsg/sysvmsg.stub', 'msg_send' => 'sysvmsg/sysvmsg.stub', 'msg_set_queue' => 'sysvmsg/sysvmsg.stub', 'msg_stat_queue' => 'sysvmsg/sysvmsg.stub', 'msgfmt_create' => 'intl/intl.stub', 'msgfmt_format' => 'intl/intl.stub', 'msgfmt_format_message' => 'intl/intl.stub', 'msgfmt_get_error_code' => 'intl/intl.stub', 'msgfmt_get_error_message' => 'intl/intl.stub', 'msgfmt_get_locale' => 'intl/intl.stub', 'msgfmt_get_pattern' => 'intl/intl.stub', 'msgfmt_parse' => 'intl/intl.stub', 'msgfmt_parse_message' => 'intl/intl.stub', 'msgfmt_set_pattern' => 'intl/intl.stub', 'msgpack_pack' => 'msgpack/msgpack.stub', 'msgpack_serialize' => 'msgpack/msgpack.stub', 'msgpack_unpack' => 'msgpack/msgpack.stub', 'msgpack_unserialize' => 'msgpack/msgpack.stub', 'mssql_bind' => 'mssql/mssql.stub', 'mssql_close' => 'mssql/mssql.stub', 'mssql_connect' => 'mssql/mssql.stub', 'mssql_data_seek' => 'mssql/mssql.stub', 'mssql_execute' => 'mssql/mssql.stub', 'mssql_fetch_array' => 'mssql/mssql.stub', 'mssql_fetch_assoc' => 'mssql/mssql.stub', 'mssql_fetch_batch' => 'mssql/mssql.stub', 'mssql_fetch_field' => 'mssql/mssql.stub', 'mssql_fetch_object' => 'mssql/mssql.stub', 'mssql_fetch_row' => 'mssql/mssql.stub', 'mssql_field_length' => 'mssql/mssql.stub', 'mssql_field_name' => 'mssql/mssql.stub', 'mssql_field_seek' => 'mssql/mssql.stub', 'mssql_field_type' => 'mssql/mssql.stub', 'mssql_free_result' => 'mssql/mssql.stub', 'mssql_free_statement' => 'mssql/mssql.stub', 'mssql_get_last_message' => 'mssql/mssql.stub', 'mssql_guid_string' => 'mssql/mssql.stub', 'mssql_init' => 'mssql/mssql.stub', 'mssql_min_error_severity' => 'mssql/mssql.stub', 'mssql_min_message_severity' => 'mssql/mssql.stub', 'mssql_next_result' => 'mssql/mssql.stub', 'mssql_num_fields' => 'mssql/mssql.stub', 'mssql_num_rows' => 'mssql/mssql.stub', 'mssql_pconnect' => 'mssql/mssql.stub', 'mssql_query' => 'mssql/mssql.stub', 'mssql_result' => 'mssql/mssql.stub', 'mssql_rows_affected' => 'mssql/mssql.stub', 'mssql_select_db' => 'mssql/mssql.stub', 'mt_getrandmax' => 'random/random.stub', 'mt_rand' => 'random/random.stub', 'mt_srand' => 'random/random.stub', 'mysql' => 'mysql/mysql.stub', 'mysql_affected_rows' => 'mysql/mysql.stub', 'mysql_client_encoding' => 'mysql/mysql.stub', 'mysql_close' => 'mysql/mysql.stub', 'mysql_connect' => 'mysql/mysql.stub', 'mysql_data_seek' => 'mysql/mysql.stub', 'mysql_db_name' => 'mysql/mysql.stub', 'mysql_db_query' => 'mysql/mysql.stub', 'mysql_dbname' => 'mysql/mysql.stub', 'mysql_errno' => 'mysql/mysql.stub', 'mysql_error' => 'mysql/mysql.stub', 'mysql_escape_string' => 'mysql/mysql.stub', 'mysql_fetch_array' => 'mysql/mysql.stub', 'mysql_fetch_assoc' => 'mysql/mysql.stub', 'mysql_fetch_field' => 'mysql/mysql.stub', 'mysql_fetch_lengths' => 'mysql/mysql.stub', 'mysql_fetch_object' => 'mysql/mysql.stub', 'mysql_fetch_row' => 'mysql/mysql.stub', 'mysql_field_flags' => 'mysql/mysql.stub', 'mysql_field_len' => 'mysql/mysql.stub', 'mysql_field_name' => 'mysql/mysql.stub', 'mysql_field_seek' => 'mysql/mysql.stub', 'mysql_field_table' => 'mysql/mysql.stub', 'mysql_field_type' => 'mysql/mysql.stub', 'mysql_fieldflags' => 'mysql/mysql.stub', 'mysql_fieldlen' => 'mysql/mysql.stub', 'mysql_fieldname' => 'mysql/mysql.stub', 'mysql_fieldtable' => 'mysql/mysql.stub', 'mysql_fieldtype' => 'mysql/mysql.stub', 'mysql_free_result' => 'mysql/mysql.stub', 'mysql_freeresult' => 'mysql/mysql.stub', 'mysql_get_client_info' => 'mysql/mysql.stub', 'mysql_get_host_info' => 'mysql/mysql.stub', 'mysql_get_proto_info' => 'mysql/mysql.stub', 'mysql_get_server_info' => 'mysql/mysql.stub', 'mysql_info' => 'mysql/mysql.stub', 'mysql_insert_id' => 'mysql/mysql.stub', 'mysql_list_dbs' => 'mysql/mysql.stub', 'mysql_list_fields' => 'mysql/mysql.stub', 'mysql_list_processes' => 'mysql/mysql.stub', 'mysql_list_tables' => 'mysql/mysql.stub', 'mysql_listdbs' => 'mysql/mysql.stub', 'mysql_listfields' => 'mysql/mysql.stub', 'mysql_listtables' => 'mysql/mysql.stub', 'mysql_num_fields' => 'mysql/mysql.stub', 'mysql_num_rows' => 'mysql/mysql.stub', 'mysql_numfields' => 'mysql/mysql.stub', 'mysql_numrows' => 'mysql/mysql.stub', 'mysql_pconnect' => 'mysql/mysql.stub', 'mysql_ping' => 'mysql/mysql.stub', 'mysql_query' => 'mysql/mysql.stub', 'mysql_real_escape_string' => 'mysql/mysql.stub', 'mysql_result' => 'mysql/mysql.stub', 'mysql_select_db' => 'mysql/mysql.stub', 'mysql_selectdb' => 'mysql/mysql.stub', 'mysql_set_charset' => 'mysql/mysql.stub', 'mysql_stat' => 'mysql/mysql.stub', 'mysql_table_name' => 'mysql/mysql.stub', 'mysql_tablename' => 'mysql/mysql.stub', 'mysql_thread_id' => 'mysql/mysql.stub', 'mysql_unbuffered_query' => 'mysql/mysql.stub', 'mysql_xdevapi\\expression' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysql_xdevapi\\getSession' => 'mysql_xdevapi/mysql_xdevapi.stub', 'mysqli_affected_rows' => 'mysqli/mysqli.stub', 'mysqli_autocommit' => 'mysqli/mysqli.stub', 'mysqli_begin_transaction' => 'mysqli/mysqli.stub', 'mysqli_bind_param' => 'mysqli/mysqli.stub', 'mysqli_bind_result' => 'mysqli/mysqli.stub', 'mysqli_change_user' => 'mysqli/mysqli.stub', 'mysqli_character_set_name' => 'mysqli/mysqli.stub', 'mysqli_client_encoding' => 'mysqli/mysqli.stub', 'mysqli_close' => 'mysqli/mysqli.stub', 'mysqli_commit' => 'mysqli/mysqli.stub', 'mysqli_connect' => 'mysqli/mysqli.stub', 'mysqli_connect_errno' => 'mysqli/mysqli.stub', 'mysqli_connect_error' => 'mysqli/mysqli.stub', 'mysqli_data_seek' => 'mysqli/mysqli.stub', 'mysqli_debug' => 'mysqli/mysqli.stub', 'mysqli_dump_debug_info' => 'mysqli/mysqli.stub', 'mysqli_errno' => 'mysqli/mysqli.stub', 'mysqli_error' => 'mysqli/mysqli.stub', 'mysqli_error_list' => 'mysqli/mysqli.stub', 'mysqli_escape_string' => 'mysqli/mysqli.stub', 'mysqli_execute' => 'mysqli/mysqli.stub', 'mysqli_execute_query' => 'mysqli/mysqli.stub', 'mysqli_fetch' => 'mysqli/mysqli.stub', 'mysqli_fetch_all' => 'mysqli/mysqli.stub', 'mysqli_fetch_array' => 'mysqli/mysqli.stub', 'mysqli_fetch_assoc' => 'mysqli/mysqli.stub', 'mysqli_fetch_column' => 'mysqli/mysqli.stub', 'mysqli_fetch_field' => 'mysqli/mysqli.stub', 'mysqli_fetch_field_direct' => 'mysqli/mysqli.stub', 'mysqli_fetch_fields' => 'mysqli/mysqli.stub', 'mysqli_fetch_lengths' => 'mysqli/mysqli.stub', 'mysqli_fetch_object' => 'mysqli/mysqli.stub', 'mysqli_fetch_row' => 'mysqli/mysqli.stub', 'mysqli_field_count' => 'mysqli/mysqli.stub', 'mysqli_field_seek' => 'mysqli/mysqli.stub', 'mysqli_field_tell' => 'mysqli/mysqli.stub', 'mysqli_free_result' => 'mysqli/mysqli.stub', 'mysqli_get_cache_stats' => 'mysqli/mysqli.stub', 'mysqli_get_charset' => 'mysqli/mysqli.stub', 'mysqli_get_client_info' => 'mysqli/mysqli.stub', 'mysqli_get_client_stats' => 'mysqli/mysqli.stub', 'mysqli_get_client_version' => 'mysqli/mysqli.stub', 'mysqli_get_connection_stats' => 'mysqli/mysqli.stub', 'mysqli_get_host_info' => 'mysqli/mysqli.stub', 'mysqli_get_links_stats' => 'mysqli/mysqli.stub', 'mysqli_get_metadata' => 'mysqli/mysqli.stub', 'mysqli_get_proto_info' => 'mysqli/mysqli.stub', 'mysqli_get_server_info' => 'mysqli/mysqli.stub', 'mysqli_get_server_version' => 'mysqli/mysqli.stub', 'mysqli_get_warnings' => 'mysqli/mysqli.stub', 'mysqli_info' => 'mysqli/mysqli.stub', 'mysqli_init' => 'mysqli/mysqli.stub', 'mysqli_insert_id' => 'mysqli/mysqli.stub', 'mysqli_kill' => 'mysqli/mysqli.stub', 'mysqli_more_results' => 'mysqli/mysqli.stub', 'mysqli_multi_query' => 'mysqli/mysqli.stub', 'mysqli_next_result' => 'mysqli/mysqli.stub', 'mysqli_num_fields' => 'mysqli/mysqli.stub', 'mysqli_num_rows' => 'mysqli/mysqli.stub', 'mysqli_options' => 'mysqli/mysqli.stub', 'mysqli_param_count' => 'mysqli/mysqli.stub', 'mysqli_ping' => 'mysqli/mysqli.stub', 'mysqli_poll' => 'mysqli/mysqli.stub', 'mysqli_prepare' => 'mysqli/mysqli.stub', 'mysqli_query' => 'mysqli/mysqli.stub', 'mysqli_real_connect' => 'mysqli/mysqli.stub', 'mysqli_real_escape_string' => 'mysqli/mysqli.stub', 'mysqli_real_query' => 'mysqli/mysqli.stub', 'mysqli_reap_async_query' => 'mysqli/mysqli.stub', 'mysqli_refresh' => 'mysqli/mysqli.stub', 'mysqli_release_savepoint' => 'mysqli/mysqli.stub', 'mysqli_report' => 'mysqli/mysqli.stub', 'mysqli_rollback' => 'mysqli/mysqli.stub', 'mysqli_savepoint' => 'mysqli/mysqli.stub', 'mysqli_select_db' => 'mysqli/mysqli.stub', 'mysqli_send_long_data' => 'mysqli/mysqli.stub', 'mysqli_set_charset' => 'mysqli/mysqli.stub', 'mysqli_set_local_infile_default' => 'mysqli/mysqli.stub', 'mysqli_set_local_infile_handler' => 'mysqli/mysqli.stub', 'mysqli_set_opt' => 'mysqli/mysqli.stub', 'mysqli_sqlstate' => 'mysqli/mysqli.stub', 'mysqli_ssl_set' => 'mysqli/mysqli.stub', 'mysqli_stat' => 'mysqli/mysqli.stub', 'mysqli_stmt_affected_rows' => 'mysqli/mysqli.stub', 'mysqli_stmt_attr_get' => 'mysqli/mysqli.stub', 'mysqli_stmt_attr_set' => 'mysqli/mysqli.stub', 'mysqli_stmt_bind_param' => 'mysqli/mysqli.stub', 'mysqli_stmt_bind_result' => 'mysqli/mysqli.stub', 'mysqli_stmt_close' => 'mysqli/mysqli.stub', 'mysqli_stmt_data_seek' => 'mysqli/mysqli.stub', 'mysqli_stmt_errno' => 'mysqli/mysqli.stub', 'mysqli_stmt_error' => 'mysqli/mysqli.stub', 'mysqli_stmt_error_list' => 'mysqli/mysqli.stub', 'mysqli_stmt_execute' => 'mysqli/mysqli.stub', 'mysqli_stmt_fetch' => 'mysqli/mysqli.stub', 'mysqli_stmt_field_count' => 'mysqli/mysqli.stub', 'mysqli_stmt_free_result' => 'mysqli/mysqli.stub', 'mysqli_stmt_get_result' => 'mysqli/mysqli.stub', 'mysqli_stmt_get_warnings' => 'mysqli/mysqli.stub', 'mysqli_stmt_init' => 'mysqli/mysqli.stub', 'mysqli_stmt_insert_id' => 'mysqli/mysqli.stub', 'mysqli_stmt_more_results' => 'mysqli/mysqli.stub', 'mysqli_stmt_next_result' => 'mysqli/mysqli.stub', 'mysqli_stmt_num_rows' => 'mysqli/mysqli.stub', 'mysqli_stmt_param_count' => 'mysqli/mysqli.stub', 'mysqli_stmt_prepare' => 'mysqli/mysqli.stub', 'mysqli_stmt_reset' => 'mysqli/mysqli.stub', 'mysqli_stmt_result_metadata' => 'mysqli/mysqli.stub', 'mysqli_stmt_send_long_data' => 'mysqli/mysqli.stub', 'mysqli_stmt_sqlstate' => 'mysqli/mysqli.stub', 'mysqli_stmt_store_result' => 'mysqli/mysqli.stub', 'mysqli_store_result' => 'mysqli/mysqli.stub', 'mysqli_thread_id' => 'mysqli/mysqli.stub', 'mysqli_thread_safe' => 'mysqli/mysqli.stub', 'mysqli_use_result' => 'mysqli/mysqli.stub', 'mysqli_warning_count' => 'mysqli/mysqli.stub', 'natcasesort' => 'standard/standard_8.stub', 'natsort' => 'standard/standard_8.stub', 'ncurses_addch' => 'ncurses/ncurses.stub', 'ncurses_addchnstr' => 'ncurses/ncurses.stub', 'ncurses_addchstr' => 'ncurses/ncurses.stub', 'ncurses_addnstr' => 'ncurses/ncurses.stub', 'ncurses_addstr' => 'ncurses/ncurses.stub', 'ncurses_assume_default_colors' => 'ncurses/ncurses.stub', 'ncurses_attroff' => 'ncurses/ncurses.stub', 'ncurses_attron' => 'ncurses/ncurses.stub', 'ncurses_attrset' => 'ncurses/ncurses.stub', 'ncurses_baudrate' => 'ncurses/ncurses.stub', 'ncurses_beep' => 'ncurses/ncurses.stub', 'ncurses_bkgd' => 'ncurses/ncurses.stub', 'ncurses_bkgdset' => 'ncurses/ncurses.stub', 'ncurses_border' => 'ncurses/ncurses.stub', 'ncurses_bottom_panel' => 'ncurses/ncurses.stub', 'ncurses_can_change_color' => 'ncurses/ncurses.stub', 'ncurses_cbreak' => 'ncurses/ncurses.stub', 'ncurses_clear' => 'ncurses/ncurses.stub', 'ncurses_clrtobot' => 'ncurses/ncurses.stub', 'ncurses_clrtoeol' => 'ncurses/ncurses.stub', 'ncurses_color_content' => 'ncurses/ncurses.stub', 'ncurses_color_set' => 'ncurses/ncurses.stub', 'ncurses_curs_set' => 'ncurses/ncurses.stub', 'ncurses_def_prog_mode' => 'ncurses/ncurses.stub', 'ncurses_def_shell_mode' => 'ncurses/ncurses.stub', 'ncurses_define_key' => 'ncurses/ncurses.stub', 'ncurses_del_panel' => 'ncurses/ncurses.stub', 'ncurses_delay_output' => 'ncurses/ncurses.stub', 'ncurses_delch' => 'ncurses/ncurses.stub', 'ncurses_deleteln' => 'ncurses/ncurses.stub', 'ncurses_delwin' => 'ncurses/ncurses.stub', 'ncurses_doupdate' => 'ncurses/ncurses.stub', 'ncurses_echo' => 'ncurses/ncurses.stub', 'ncurses_echochar' => 'ncurses/ncurses.stub', 'ncurses_end' => 'ncurses/ncurses.stub', 'ncurses_erase' => 'ncurses/ncurses.stub', 'ncurses_erasechar' => 'ncurses/ncurses.stub', 'ncurses_filter' => 'ncurses/ncurses.stub', 'ncurses_flash' => 'ncurses/ncurses.stub', 'ncurses_flushinp' => 'ncurses/ncurses.stub', 'ncurses_getch' => 'ncurses/ncurses.stub', 'ncurses_getmaxyx' => 'ncurses/ncurses.stub', 'ncurses_getmouse' => 'ncurses/ncurses.stub', 'ncurses_getyx' => 'ncurses/ncurses.stub', 'ncurses_halfdelay' => 'ncurses/ncurses.stub', 'ncurses_has_colors' => 'ncurses/ncurses.stub', 'ncurses_has_ic' => 'ncurses/ncurses.stub', 'ncurses_has_il' => 'ncurses/ncurses.stub', 'ncurses_has_key' => 'ncurses/ncurses.stub', 'ncurses_hide_panel' => 'ncurses/ncurses.stub', 'ncurses_hline' => 'ncurses/ncurses.stub', 'ncurses_inch' => 'ncurses/ncurses.stub', 'ncurses_init' => 'ncurses/ncurses.stub', 'ncurses_init_color' => 'ncurses/ncurses.stub', 'ncurses_init_pair' => 'ncurses/ncurses.stub', 'ncurses_insch' => 'ncurses/ncurses.stub', 'ncurses_insdelln' => 'ncurses/ncurses.stub', 'ncurses_insertln' => 'ncurses/ncurses.stub', 'ncurses_insstr' => 'ncurses/ncurses.stub', 'ncurses_instr' => 'ncurses/ncurses.stub', 'ncurses_isendwin' => 'ncurses/ncurses.stub', 'ncurses_keyok' => 'ncurses/ncurses.stub', 'ncurses_keypad' => 'ncurses/ncurses.stub', 'ncurses_killchar' => 'ncurses/ncurses.stub', 'ncurses_longname' => 'ncurses/ncurses.stub', 'ncurses_meta' => 'ncurses/ncurses.stub', 'ncurses_mouse_trafo' => 'ncurses/ncurses.stub', 'ncurses_mouseinterval' => 'ncurses/ncurses.stub', 'ncurses_mousemask' => 'ncurses/ncurses.stub', 'ncurses_move' => 'ncurses/ncurses.stub', 'ncurses_move_panel' => 'ncurses/ncurses.stub', 'ncurses_mvaddch' => 'ncurses/ncurses.stub', 'ncurses_mvaddchnstr' => 'ncurses/ncurses.stub', 'ncurses_mvaddchstr' => 'ncurses/ncurses.stub', 'ncurses_mvaddnstr' => 'ncurses/ncurses.stub', 'ncurses_mvaddstr' => 'ncurses/ncurses.stub', 'ncurses_mvcur' => 'ncurses/ncurses.stub', 'ncurses_mvdelch' => 'ncurses/ncurses.stub', 'ncurses_mvgetch' => 'ncurses/ncurses.stub', 'ncurses_mvhline' => 'ncurses/ncurses.stub', 'ncurses_mvinch' => 'ncurses/ncurses.stub', 'ncurses_mvwaddstr' => 'ncurses/ncurses.stub', 'ncurses_napms' => 'ncurses/ncurses.stub', 'ncurses_new_panel' => 'ncurses/ncurses.stub', 'ncurses_newpad' => 'ncurses/ncurses.stub', 'ncurses_newwin' => 'ncurses/ncurses.stub', 'ncurses_nl' => 'ncurses/ncurses.stub', 'ncurses_nocbreak' => 'ncurses/ncurses.stub', 'ncurses_noecho' => 'ncurses/ncurses.stub', 'ncurses_nonl' => 'ncurses/ncurses.stub', 'ncurses_noqiflush' => 'ncurses/ncurses.stub', 'ncurses_noraw' => 'ncurses/ncurses.stub', 'ncurses_pair_content' => 'ncurses/ncurses.stub', 'ncurses_panel_above' => 'ncurses/ncurses.stub', 'ncurses_panel_below' => 'ncurses/ncurses.stub', 'ncurses_panel_window' => 'ncurses/ncurses.stub', 'ncurses_pnoutrefresh' => 'ncurses/ncurses.stub', 'ncurses_prefresh' => 'ncurses/ncurses.stub', 'ncurses_putp' => 'ncurses/ncurses.stub', 'ncurses_qiflush' => 'ncurses/ncurses.stub', 'ncurses_raw' => 'ncurses/ncurses.stub', 'ncurses_refresh' => 'ncurses/ncurses.stub', 'ncurses_replace_panel' => 'ncurses/ncurses.stub', 'ncurses_reset_prog_mode' => 'ncurses/ncurses.stub', 'ncurses_reset_shell_mode' => 'ncurses/ncurses.stub', 'ncurses_resetty' => 'ncurses/ncurses.stub', 'ncurses_savetty' => 'ncurses/ncurses.stub', 'ncurses_scr_dump' => 'ncurses/ncurses.stub', 'ncurses_scr_init' => 'ncurses/ncurses.stub', 'ncurses_scr_restore' => 'ncurses/ncurses.stub', 'ncurses_scr_set' => 'ncurses/ncurses.stub', 'ncurses_scrl' => 'ncurses/ncurses.stub', 'ncurses_show_panel' => 'ncurses/ncurses.stub', 'ncurses_slk_attr' => 'ncurses/ncurses.stub', 'ncurses_slk_attroff' => 'ncurses/ncurses.stub', 'ncurses_slk_attron' => 'ncurses/ncurses.stub', 'ncurses_slk_attrset' => 'ncurses/ncurses.stub', 'ncurses_slk_clear' => 'ncurses/ncurses.stub', 'ncurses_slk_color' => 'ncurses/ncurses.stub', 'ncurses_slk_init' => 'ncurses/ncurses.stub', 'ncurses_slk_noutrefresh' => 'ncurses/ncurses.stub', 'ncurses_slk_refresh' => 'ncurses/ncurses.stub', 'ncurses_slk_restore' => 'ncurses/ncurses.stub', 'ncurses_slk_set' => 'ncurses/ncurses.stub', 'ncurses_slk_touch' => 'ncurses/ncurses.stub', 'ncurses_standend' => 'ncurses/ncurses.stub', 'ncurses_standout' => 'ncurses/ncurses.stub', 'ncurses_start_color' => 'ncurses/ncurses.stub', 'ncurses_termattrs' => 'ncurses/ncurses.stub', 'ncurses_termname' => 'ncurses/ncurses.stub', 'ncurses_timeout' => 'ncurses/ncurses.stub', 'ncurses_top_panel' => 'ncurses/ncurses.stub', 'ncurses_typeahead' => 'ncurses/ncurses.stub', 'ncurses_ungetch' => 'ncurses/ncurses.stub', 'ncurses_ungetmouse' => 'ncurses/ncurses.stub', 'ncurses_update_panels' => 'ncurses/ncurses.stub', 'ncurses_use_default_colors' => 'ncurses/ncurses.stub', 'ncurses_use_env' => 'ncurses/ncurses.stub', 'ncurses_use_extended_names' => 'ncurses/ncurses.stub', 'ncurses_vidattr' => 'ncurses/ncurses.stub', 'ncurses_vline' => 'ncurses/ncurses.stub', 'ncurses_waddch' => 'ncurses/ncurses.stub', 'ncurses_waddstr' => 'ncurses/ncurses.stub', 'ncurses_wattroff' => 'ncurses/ncurses.stub', 'ncurses_wattron' => 'ncurses/ncurses.stub', 'ncurses_wattrset' => 'ncurses/ncurses.stub', 'ncurses_wborder' => 'ncurses/ncurses.stub', 'ncurses_wclear' => 'ncurses/ncurses.stub', 'ncurses_wcolor_set' => 'ncurses/ncurses.stub', 'ncurses_werase' => 'ncurses/ncurses.stub', 'ncurses_wgetch' => 'ncurses/ncurses.stub', 'ncurses_whline' => 'ncurses/ncurses.stub', 'ncurses_wmouse_trafo' => 'ncurses/ncurses.stub', 'ncurses_wmove' => 'ncurses/ncurses.stub', 'ncurses_wnoutrefresh' => 'ncurses/ncurses.stub', 'ncurses_wrefresh' => 'ncurses/ncurses.stub', 'ncurses_wstandend' => 'ncurses/ncurses.stub', 'ncurses_wstandout' => 'ncurses/ncurses.stub', 'ncurses_wvline' => 'ncurses/ncurses.stub', 'net_get_interfaces' => 'standard/standard_4.stub', 'newrelic_accept_distributed_trace_headers' => 'newrelic/newrelic.stub', 'newrelic_accept_distributed_trace_payload' => 'newrelic/newrelic.stub', 'newrelic_accept_distributed_trace_payload_httpsafe' => 'newrelic/newrelic.stub', 'newrelic_add_custom_parameter' => 'newrelic/newrelic.stub', 'newrelic_add_custom_span_parameter' => 'newrelic/newrelic.stub', 'newrelic_add_custom_tracer' => 'newrelic/newrelic.stub', 'newrelic_background_job' => 'newrelic/newrelic.stub', 'newrelic_capture_params' => 'newrelic/newrelic.stub', 'newrelic_create_distributed_trace_payload' => 'newrelic/newrelic.stub', 'newrelic_custom_metric' => 'newrelic/newrelic.stub', 'newrelic_disable_autorum' => 'newrelic/newrelic.stub', 'newrelic_enable_params' => 'newrelic/newrelic.stub', 'newrelic_end_of_transaction' => 'newrelic/newrelic.stub', 'newrelic_end_transaction' => 'newrelic/newrelic.stub', 'newrelic_get_browser_timing_footer' => 'newrelic/newrelic.stub', 'newrelic_get_browser_timing_header' => 'newrelic/newrelic.stub', 'newrelic_get_linking_metadata' => 'newrelic/newrelic.stub', 'newrelic_get_trace_metadata' => 'newrelic/newrelic.stub', 'newrelic_ignore_apdex' => 'newrelic/newrelic.stub', 'newrelic_ignore_transaction' => 'newrelic/newrelic.stub', 'newrelic_insert_distributed_trace_headers' => 'newrelic/newrelic.stub', 'newrelic_is_sampled' => 'newrelic/newrelic.stub', 'newrelic_name_transaction' => 'newrelic/newrelic.stub', 'newrelic_notice_error' => 'newrelic/newrelic.stub', 'newrelic_record_custom_event' => 'newrelic/newrelic.stub', 'newrelic_record_datastore_segment' => 'newrelic/newrelic.stub', 'newrelic_set_appname' => 'newrelic/newrelic.stub', 'newrelic_set_user_attributes' => 'newrelic/newrelic.stub', 'newrelic_set_user_id' => 'newrelic/newrelic.stub', 'newrelic_start_transaction' => 'newrelic/newrelic.stub', 'next' => 'standard/standard_8.stub', 'ngettext' => 'gettext/gettext.stub', 'nl2br' => 'standard/standard_1.stub', 'nl_langinfo' => 'standard/standard_2.stub', 'normalizer_get_raw_decomposition' => 'intl/intl.stub', 'normalizer_is_normalized' => 'intl/intl.stub', 'normalizer_normalize' => 'intl/intl.stub', 'number_format' => 'standard/standard_3.stub', 'numfmt_create' => 'intl/intl.stub', 'numfmt_format' => 'intl/intl.stub', 'numfmt_format_currency' => 'intl/intl.stub', 'numfmt_get_attribute' => 'intl/intl.stub', 'numfmt_get_error_code' => 'intl/intl.stub', 'numfmt_get_error_message' => 'intl/intl.stub', 'numfmt_get_locale' => 'intl/intl.stub', 'numfmt_get_pattern' => 'intl/intl.stub', 'numfmt_get_symbol' => 'intl/intl.stub', 'numfmt_get_text_attribute' => 'intl/intl.stub', 'numfmt_parse' => 'intl/intl.stub', 'numfmt_parse_currency' => 'intl/intl.stub', 'numfmt_set_attribute' => 'intl/intl.stub', 'numfmt_set_pattern' => 'intl/intl.stub', 'numfmt_set_symbol' => 'intl/intl.stub', 'numfmt_set_text_attribute' => 'intl/intl.stub', 'oauth_get_sbs' => 'oauth/oauth.stub', 'oauth_urlencode' => 'oauth/oauth.stub', 'ob_clean' => 'standard/standard_8.stub', 'ob_deflatehandler' => 'http/http.stub', 'ob_end_clean' => 'standard/standard_8.stub', 'ob_end_flush' => 'standard/standard_8.stub', 'ob_etaghandler' => 'http/http.stub', 'ob_flush' => 'standard/standard_8.stub', 'ob_get_clean' => 'standard/standard_8.stub', 'ob_get_contents' => 'standard/standard_8.stub', 'ob_get_flush' => 'standard/standard_8.stub', 'ob_get_length' => 'standard/standard_8.stub', 'ob_get_level' => 'standard/standard_8.stub', 'ob_get_status' => 'standard/standard_8.stub', 'ob_gzhandler' => 'zlib/zlib.stub', 'ob_iconv_handler' => 'iconv/iconv.stub', 'ob_implicit_flush' => 'standard/standard_8.stub', 'ob_inflatehandler' => 'http/http.stub', 'ob_list_handlers' => 'standard/standard_8.stub', 'ob_start' => 'standard/standard_8.stub', 'ob_tidyhandler' => 'tidy/tidy.stub', 'oci_bind_array_by_name' => 'oci8/oci8.stub', 'oci_bind_by_name' => 'oci8/oci8.stub', 'oci_cancel' => 'oci8/oci8.stub', 'oci_client_version' => 'oci8/oci8.stub', 'oci_close' => 'oci8/oci8.stub', 'oci_commit' => 'oci8/oci8.stub', 'oci_connect' => 'oci8/oci8.stub', 'oci_define_by_name' => 'oci8/oci8.stub', 'oci_error' => 'oci8/oci8.stub', 'oci_execute' => 'oci8/oci8.stub', 'oci_fetch' => 'oci8/oci8.stub', 'oci_fetch_all' => 'oci8/oci8.stub', 'oci_fetch_array' => 'oci8/oci8.stub', 'oci_fetch_assoc' => 'oci8/oci8.stub', 'oci_fetch_object' => 'oci8/oci8.stub', 'oci_fetch_row' => 'oci8/oci8.stub', 'oci_field_is_null' => 'oci8/oci8.stub', 'oci_field_name' => 'oci8/oci8.stub', 'oci_field_precision' => 'oci8/oci8.stub', 'oci_field_scale' => 'oci8/oci8.stub', 'oci_field_size' => 'oci8/oci8.stub', 'oci_field_type' => 'oci8/oci8.stub', 'oci_field_type_raw' => 'oci8/oci8.stub', 'oci_free_cursor' => 'oci8/oci8.stub', 'oci_free_descriptor' => 'oci8/oci8.stub', 'oci_free_statement' => 'oci8/oci8.stub', 'oci_get_implicit_resultset' => 'oci8/oci8.stub', 'oci_internal_debug' => 'oci8/oci8.stub', 'oci_lob_copy' => 'oci8/oci8.stub', 'oci_lob_is_equal' => 'oci8/oci8.stub', 'oci_new_collection' => 'oci8/oci8.stub', 'oci_new_connect' => 'oci8/oci8.stub', 'oci_new_cursor' => 'oci8/oci8.stub', 'oci_new_descriptor' => 'oci8/oci8.stub', 'oci_num_fields' => 'oci8/oci8.stub', 'oci_num_rows' => 'oci8/oci8.stub', 'oci_parse' => 'oci8/oci8.stub', 'oci_password_change' => 'oci8/oci8.stub', 'oci_pconnect' => 'oci8/oci8.stub', 'oci_register_taf_callback' => 'oci8/oci8.stub', 'oci_result' => 'oci8/oci8.stub', 'oci_rollback' => 'oci8/oci8.stub', 'oci_server_version' => 'oci8/oci8.stub', 'oci_set_action' => 'oci8/oci8.stub', 'oci_set_call_timeout' => 'oci8/oci8v3.stub', 'oci_set_client_identifier' => 'oci8/oci8.stub', 'oci_set_client_info' => 'oci8/oci8.stub', 'oci_set_db_operation' => 'oci8/oci8v3.stub', 'oci_set_edition' => 'oci8/oci8.stub', 'oci_set_module_name' => 'oci8/oci8.stub', 'oci_set_prefetch' => 'oci8/oci8.stub', 'oci_set_prefetch_lob' => 'oci8/oci8v3.stub', 'oci_statement_type' => 'oci8/oci8.stub', 'oci_unregister_taf_callback' => 'oci8/oci8.stub', 'ocibindbyname' => 'oci8/oci8.stub', 'ocicancel' => 'oci8/oci8.stub', 'ocicloselob' => 'oci8/oci8.stub', 'ocicollappend' => 'oci8/oci8.stub', 'ocicollassign' => 'oci8/oci8.stub', 'ocicollassignelem' => 'oci8/oci8.stub', 'ocicollgetelem' => 'oci8/oci8.stub', 'ocicollmax' => 'oci8/oci8.stub', 'ocicollsize' => 'oci8/oci8.stub', 'ocicolltrim' => 'oci8/oci8.stub', 'ocicolumnisnull' => 'oci8/oci8.stub', 'ocicolumnname' => 'oci8/oci8.stub', 'ocicolumnprecision' => 'oci8/oci8.stub', 'ocicolumnscale' => 'oci8/oci8.stub', 'ocicolumnsize' => 'oci8/oci8.stub', 'ocicolumntype' => 'oci8/oci8.stub', 'ocicolumntyperaw' => 'oci8/oci8.stub', 'ocicommit' => 'oci8/oci8.stub', 'ocidefinebyname' => 'oci8/oci8.stub', 'ocierror' => 'oci8/oci8.stub', 'ociexecute' => 'oci8/oci8.stub', 'ocifetch' => 'oci8/oci8.stub', 'ocifetchinto' => 'oci8/oci8.stub', 'ocifetchstatement' => 'oci8/oci8.stub', 'ocifreecollection' => 'oci8/oci8.stub', 'ocifreecursor' => 'oci8/oci8.stub', 'ocifreedesc' => 'oci8/oci8.stub', 'ocifreestatement' => 'oci8/oci8.stub', 'ociinternaldebug' => 'oci8/oci8.stub', 'ociloadlob' => 'oci8/oci8.stub', 'ocilogoff' => 'oci8/oci8.stub', 'ocilogon' => 'oci8/oci8.stub', 'ocinewcollection' => 'oci8/oci8.stub', 'ocinewcursor' => 'oci8/oci8.stub', 'ocinewdescriptor' => 'oci8/oci8.stub', 'ocinlogon' => 'oci8/oci8.stub', 'ocinumcols' => 'oci8/oci8.stub', 'ociparse' => 'oci8/oci8.stub', 'ocipasswordchange' => 'oci8/oci8.stub', 'ociplogon' => 'oci8/oci8.stub', 'ociresult' => 'oci8/oci8.stub', 'ocirollback' => 'oci8/oci8.stub', 'ocirowcount' => 'oci8/oci8.stub', 'ocisavelob' => 'oci8/oci8.stub', 'ocisavelobfile' => 'oci8/oci8.stub', 'ociserverversion' => 'oci8/oci8.stub', 'ocisetprefetch' => 'oci8/oci8.stub', 'ocistatementtype' => 'oci8/oci8.stub', 'ociwritelobtofile' => 'oci8/oci8.stub', 'ociwritetemporarylob' => 'oci8/oci8.stub', 'octdec' => 'standard/standard_3.stub', 'odbc_autocommit' => 'odbc/odbc.stub', 'odbc_binmode' => 'odbc/odbc.stub', 'odbc_close' => 'odbc/odbc.stub', 'odbc_close_all' => 'odbc/odbc.stub', 'odbc_columnprivileges' => 'odbc/odbc.stub', 'odbc_columns' => 'odbc/odbc.stub', 'odbc_commit' => 'odbc/odbc.stub', 'odbc_connect' => 'odbc/odbc.stub', 'odbc_connection_string_is_quoted' => 'odbc/odbc.stub', 'odbc_connection_string_quote' => 'odbc/odbc.stub', 'odbc_connection_string_should_quote' => 'odbc/odbc.stub', 'odbc_cursor' => 'odbc/odbc.stub', 'odbc_data_source' => 'odbc/odbc.stub', 'odbc_do' => 'odbc/odbc.stub', 'odbc_error' => 'odbc/odbc.stub', 'odbc_errormsg' => 'odbc/odbc.stub', 'odbc_exec' => 'odbc/odbc.stub', 'odbc_execute' => 'odbc/odbc.stub', 'odbc_fetch_array' => 'odbc/odbc.stub', 'odbc_fetch_into' => 'odbc/odbc.stub', 'odbc_fetch_object' => 'odbc/odbc.stub', 'odbc_fetch_row' => 'odbc/odbc.stub', 'odbc_field_len' => 'odbc/odbc.stub', 'odbc_field_name' => 'odbc/odbc.stub', 'odbc_field_num' => 'odbc/odbc.stub', 'odbc_field_precision' => 'odbc/odbc.stub', 'odbc_field_scale' => 'odbc/odbc.stub', 'odbc_field_type' => 'odbc/odbc.stub', 'odbc_foreignkeys' => 'odbc/odbc.stub', 'odbc_free_result' => 'odbc/odbc.stub', 'odbc_gettypeinfo' => 'odbc/odbc.stub', 'odbc_longreadlen' => 'odbc/odbc.stub', 'odbc_next_result' => 'odbc/odbc.stub', 'odbc_num_fields' => 'odbc/odbc.stub', 'odbc_num_rows' => 'odbc/odbc.stub', 'odbc_pconnect' => 'odbc/odbc.stub', 'odbc_prepare' => 'odbc/odbc.stub', 'odbc_primarykeys' => 'odbc/odbc.stub', 'odbc_procedurecolumns' => 'odbc/odbc.stub', 'odbc_procedures' => 'odbc/odbc.stub', 'odbc_result' => 'odbc/odbc.stub', 'odbc_result_all' => 'odbc/odbc.stub', 'odbc_rollback' => 'odbc/odbc.stub', 'odbc_setoption' => 'odbc/odbc.stub', 'odbc_specialcolumns' => 'odbc/odbc.stub', 'odbc_statistics' => 'odbc/odbc.stub', 'odbc_tableprivileges' => 'odbc/odbc.stub', 'odbc_tables' => 'odbc/odbc.stub', 'opcache_compile_file' => 'Zend OPcache/OPcache.stub', 'opcache_get_configuration' => 'Zend OPcache/OPcache.stub', 'opcache_get_status' => 'Zend OPcache/OPcache.stub', 'opcache_invalidate' => 'Zend OPcache/OPcache.stub', 'opcache_is_script_cached' => 'Zend OPcache/OPcache.stub', 'opcache_reset' => 'Zend OPcache/OPcache.stub', 'opendir' => 'standard/standard_7.stub', 'openlog' => 'standard/standard_7.stub', 'openssl_cipher_iv_length' => 'openssl/openssl.stub', 'openssl_cipher_key_length' => 'openssl/openssl.stub', 'openssl_cms_decrypt' => 'openssl/openssl.stub', 'openssl_cms_encrypt' => 'openssl/openssl.stub', 'openssl_cms_read' => 'openssl/openssl.stub', 'openssl_cms_sign' => 'openssl/openssl.stub', 'openssl_cms_verify' => 'openssl/openssl.stub', 'openssl_csr_export' => 'openssl/openssl.stub', 'openssl_csr_export_to_file' => 'openssl/openssl.stub', 'openssl_csr_get_public_key' => 'openssl/openssl.stub', 'openssl_csr_get_subject' => 'openssl/openssl.stub', 'openssl_csr_new' => 'openssl/openssl.stub', 'openssl_csr_sign' => 'openssl/openssl.stub', 'openssl_decrypt' => 'openssl/openssl.stub', 'openssl_dh_compute_key' => 'openssl/openssl.stub', 'openssl_digest' => 'openssl/openssl.stub', 'openssl_encrypt' => 'openssl/openssl.stub', 'openssl_error_string' => 'openssl/openssl.stub', 'openssl_free_key' => 'openssl/openssl.stub', 'openssl_get_cert_locations' => 'openssl/openssl.stub', 'openssl_get_cipher_methods' => 'openssl/openssl.stub', 'openssl_get_curve_names' => 'openssl/openssl.stub', 'openssl_get_md_methods' => 'openssl/openssl.stub', 'openssl_get_privatekey' => 'openssl/openssl.stub', 'openssl_get_publickey' => 'openssl/openssl.stub', 'openssl_open' => 'openssl/openssl.stub', 'openssl_pbkdf2' => 'openssl/openssl.stub', 'openssl_pkcs12_export' => 'openssl/openssl.stub', 'openssl_pkcs12_export_to_file' => 'openssl/openssl.stub', 'openssl_pkcs12_read' => 'openssl/openssl.stub', 'openssl_pkcs7_decrypt' => 'openssl/openssl.stub', 'openssl_pkcs7_encrypt' => 'openssl/openssl.stub', 'openssl_pkcs7_read' => 'openssl/openssl.stub', 'openssl_pkcs7_sign' => 'openssl/openssl.stub', 'openssl_pkcs7_verify' => 'openssl/openssl.stub', 'openssl_pkey_derive' => 'openssl/openssl.stub', 'openssl_pkey_export' => 'openssl/openssl.stub', 'openssl_pkey_export_to_file' => 'openssl/openssl.stub', 'openssl_pkey_free' => 'openssl/openssl.stub', 'openssl_pkey_get_details' => 'openssl/openssl.stub', 'openssl_pkey_get_private' => 'openssl/openssl.stub', 'openssl_pkey_get_public' => 'openssl/openssl.stub', 'openssl_pkey_new' => 'openssl/openssl.stub', 'openssl_private_decrypt' => 'openssl/openssl.stub', 'openssl_private_encrypt' => 'openssl/openssl.stub', 'openssl_public_decrypt' => 'openssl/openssl.stub', 'openssl_public_encrypt' => 'openssl/openssl.stub', 'openssl_random_pseudo_bytes' => 'openssl/openssl.stub', 'openssl_seal' => 'openssl/openssl.stub', 'openssl_sign' => 'openssl/openssl.stub', 'openssl_spki_export' => 'openssl/openssl.stub', 'openssl_spki_export_challenge' => 'openssl/openssl.stub', 'openssl_spki_new' => 'openssl/openssl.stub', 'openssl_spki_verify' => 'openssl/openssl.stub', 'openssl_verify' => 'openssl/openssl.stub', 'openssl_x509_check_private_key' => 'openssl/openssl.stub', 'openssl_x509_checkpurpose' => 'openssl/openssl.stub', 'openssl_x509_export' => 'openssl/openssl.stub', 'openssl_x509_export_to_file' => 'openssl/openssl.stub', 'openssl_x509_fingerprint' => 'openssl/openssl.stub', 'openssl_x509_free' => 'openssl/openssl.stub', 'openssl_x509_parse' => 'openssl/openssl.stub', 'openssl_x509_read' => 'openssl/openssl.stub', 'openssl_x509_verify' => 'openssl/openssl.stub', 'ord' => 'standard/standard_2.stub', 'output_add_rewrite_var' => 'standard/standard_9.stub', 'output_cache_disable' => 'zend/zend.stub', 'output_cache_disable_compression' => 'zend/zend.stub', 'output_cache_exists' => 'zend/zend.stub', 'output_cache_fetch' => 'zend/zend.stub', 'output_cache_get' => 'zend/zend.stub', 'output_cache_output' => 'zend/zend.stub', 'output_cache_put' => 'zend/zend.stub', 'output_cache_remove' => 'zend/zend.stub', 'output_cache_remove_key' => 'zend/zend.stub', 'output_cache_remove_url' => 'zend/zend.stub', 'output_cache_stop' => 'zend/zend.stub', 'output_reset_rewrite_vars' => 'standard/standard_9.stub', 'pack' => 'standard/standard_7.stub', 'pam_auth' => 'pam/pam.stub', 'pam_chpass' => 'pam/pam.stub', 'parallel\\bootstrap' => 'parallel/parallel.stub', 'parallel\\count' => 'parallel/parallel.stub', 'parallel\\run' => 'parallel/parallel.stub', 'parse_ini_file' => 'standard/standard_4.stub', 'parse_ini_string' => 'standard/standard_4.stub', 'parse_str' => 'standard/standard_2.stub', 'parse_url' => 'standard/standard_2.stub', 'passthru' => 'standard/standard_2.stub', 'password_algos' => 'standard/password.stub', 'password_get_info' => 'standard/password.stub', 'password_hash' => 'standard/password.stub', 'password_needs_rehash' => 'standard/password.stub', 'password_verify' => 'standard/password.stub', 'pathinfo' => 'standard/standard_1.stub', 'pclose' => 'standard/standard_5.stub', 'pcntl_alarm' => 'pcntl/pcntl.stub', 'pcntl_async_signals' => 'pcntl/pcntl.stub', 'pcntl_errno' => 'pcntl/pcntl.stub', 'pcntl_exec' => 'pcntl/pcntl.stub', 'pcntl_fork' => 'pcntl/pcntl.stub', 'pcntl_get_last_error' => 'pcntl/pcntl.stub', 'pcntl_getcpu' => 'pcntl/pcntl.stub', 'pcntl_getcpuaffinity' => 'pcntl/pcntl.stub', 'pcntl_getpriority' => 'pcntl/pcntl.stub', 'pcntl_setcpuaffinity' => 'pcntl/pcntl.stub', 'pcntl_setpriority' => 'pcntl/pcntl.stub', 'pcntl_signal' => 'pcntl/pcntl.stub', 'pcntl_signal_dispatch' => 'pcntl/pcntl.stub', 'pcntl_signal_get_handler' => 'pcntl/pcntl.stub', 'pcntl_sigprocmask' => 'pcntl/pcntl.stub', 'pcntl_sigtimedwait' => 'pcntl/pcntl.stub', 'pcntl_sigwaitinfo' => 'pcntl/pcntl.stub', 'pcntl_strerror' => 'pcntl/pcntl.stub', 'pcntl_unshare' => 'pcntl/pcntl.stub', 'pcntl_wait' => 'pcntl/pcntl.stub', 'pcntl_waitid' => 'pcntl/pcntl.stub', 'pcntl_waitpid' => 'pcntl/pcntl.stub', 'pcntl_wexitstatus' => 'pcntl/pcntl.stub', 'pcntl_wifcontinued' => 'pcntl/pcntl.stub', 'pcntl_wifexited' => 'pcntl/pcntl.stub', 'pcntl_wifsignaled' => 'pcntl/pcntl.stub', 'pcntl_wifstopped' => 'pcntl/pcntl.stub', 'pcntl_wstopsig' => 'pcntl/pcntl.stub', 'pcntl_wtermsig' => 'pcntl/pcntl.stub', 'pcov\\clear' => 'pcov/pcov.stub', 'pcov\\collect' => 'pcov/pcov.stub', 'pcov\\memory' => 'pcov/pcov.stub', 'pcov\\start' => 'pcov/pcov.stub', 'pcov\\stop' => 'pcov/pcov.stub', 'pcov\\waiting' => 'pcov/pcov.stub', 'pdo_drivers' => 'PDO/PDO.stub', 'pfsockopen' => 'standard/standard_7.stub', 'pg_affected_rows' => 'pgsql/pgsql.stub', 'pg_cancel_query' => 'pgsql/pgsql.stub', 'pg_change_password' => 'pgsql/pgsql.stub', 'pg_client_encoding' => 'pgsql/pgsql.stub', 'pg_clientencoding' => 'pgsql/pgsql.stub', 'pg_close' => 'pgsql/pgsql.stub', 'pg_cmdtuples' => 'pgsql/pgsql.stub', 'pg_connect' => 'pgsql/pgsql.stub', 'pg_connect_poll' => 'pgsql/pgsql.stub', 'pg_connection_busy' => 'pgsql/pgsql.stub', 'pg_connection_reset' => 'pgsql/pgsql.stub', 'pg_connection_status' => 'pgsql/pgsql.stub', 'pg_consume_input' => 'pgsql/pgsql.stub', 'pg_convert' => 'pgsql/pgsql.stub', 'pg_copy_from' => 'pgsql/pgsql.stub', 'pg_copy_to' => 'pgsql/pgsql.stub', 'pg_dbname' => 'pgsql/pgsql.stub', 'pg_delete' => 'pgsql/pgsql.stub', 'pg_end_copy' => 'pgsql/pgsql.stub', 'pg_enter_pipeline_mode' => 'pgsql/pgsql.stub', 'pg_errormessage' => 'pgsql/pgsql.stub', 'pg_escape_bytea' => 'pgsql/pgsql.stub', 'pg_escape_identifier' => 'pgsql/pgsql.stub', 'pg_escape_literal' => 'pgsql/pgsql.stub', 'pg_escape_string' => 'pgsql/pgsql.stub', 'pg_exec' => 'pgsql/pgsql.stub', 'pg_execute' => 'pgsql/pgsql.stub', 'pg_exit_pipeline_mode' => 'pgsql/pgsql.stub', 'pg_fetch_all' => 'pgsql/pgsql.stub', 'pg_fetch_all_columns' => 'pgsql/pgsql.stub', 'pg_fetch_array' => 'pgsql/pgsql.stub', 'pg_fetch_assoc' => 'pgsql/pgsql.stub', 'pg_fetch_object' => 'pgsql/pgsql.stub', 'pg_fetch_result' => 'pgsql/pgsql.stub', 'pg_fetch_row' => 'pgsql/pgsql.stub', 'pg_field_is_null' => 'pgsql/pgsql.stub', 'pg_field_name' => 'pgsql/pgsql.stub', 'pg_field_num' => 'pgsql/pgsql.stub', 'pg_field_prtlen' => 'pgsql/pgsql.stub', 'pg_field_size' => 'pgsql/pgsql.stub', 'pg_field_table' => 'pgsql/pgsql.stub', 'pg_field_type' => 'pgsql/pgsql.stub', 'pg_field_type_oid' => 'pgsql/pgsql.stub', 'pg_fieldisnull' => 'pgsql/pgsql.stub', 'pg_fieldname' => 'pgsql/pgsql.stub', 'pg_fieldnum' => 'pgsql/pgsql.stub', 'pg_fieldprtlen' => 'pgsql/pgsql.stub', 'pg_fieldsize' => 'pgsql/pgsql.stub', 'pg_fieldtype' => 'pgsql/pgsql.stub', 'pg_flush' => 'pgsql/pgsql.stub', 'pg_free_result' => 'pgsql/pgsql.stub', 'pg_freeresult' => 'pgsql/pgsql.stub', 'pg_get_notify' => 'pgsql/pgsql.stub', 'pg_get_pid' => 'pgsql/pgsql.stub', 'pg_get_result' => 'pgsql/pgsql.stub', 'pg_getlastoid' => 'pgsql/pgsql.stub', 'pg_host' => 'pgsql/pgsql.stub', 'pg_insert' => 'pgsql/pgsql.stub', 'pg_jit' => 'pgsql/pgsql.stub', 'pg_last_error' => 'pgsql/pgsql.stub', 'pg_last_notice' => 'pgsql/pgsql.stub', 'pg_last_oid' => 'pgsql/pgsql.stub', 'pg_lo_close' => 'pgsql/pgsql.stub', 'pg_lo_create' => 'pgsql/pgsql.stub', 'pg_lo_export' => 'pgsql/pgsql.stub', 'pg_lo_import' => 'pgsql/pgsql.stub', 'pg_lo_open' => 'pgsql/pgsql.stub', 'pg_lo_read' => 'pgsql/pgsql.stub', 'pg_lo_read_all' => 'pgsql/pgsql.stub', 'pg_lo_seek' => 'pgsql/pgsql.stub', 'pg_lo_tell' => 'pgsql/pgsql.stub', 'pg_lo_truncate' => 'pgsql/pgsql.stub', 'pg_lo_unlink' => 'pgsql/pgsql.stub', 'pg_lo_write' => 'pgsql/pgsql.stub', 'pg_loclose' => 'pgsql/pgsql.stub', 'pg_locreate' => 'pgsql/pgsql.stub', 'pg_loexport' => 'pgsql/pgsql.stub', 'pg_loimport' => 'pgsql/pgsql.stub', 'pg_loopen' => 'pgsql/pgsql.stub', 'pg_loread' => 'pgsql/pgsql.stub', 'pg_loreadall' => 'pgsql/pgsql.stub', 'pg_lounlink' => 'pgsql/pgsql.stub', 'pg_lowrite' => 'pgsql/pgsql.stub', 'pg_meta_data' => 'pgsql/pgsql.stub', 'pg_num_fields' => 'pgsql/pgsql.stub', 'pg_num_rows' => 'pgsql/pgsql.stub', 'pg_numfields' => 'pgsql/pgsql.stub', 'pg_numrows' => 'pgsql/pgsql.stub', 'pg_options' => 'pgsql/pgsql.stub', 'pg_parameter_status' => 'pgsql/pgsql.stub', 'pg_pconnect' => 'pgsql/pgsql.stub', 'pg_ping' => 'pgsql/pgsql.stub', 'pg_pipeline_status' => 'pgsql/pgsql.stub', 'pg_pipeline_sync' => 'pgsql/pgsql.stub', 'pg_port' => 'pgsql/pgsql.stub', 'pg_prepare' => 'pgsql/pgsql.stub', 'pg_put_copy_data' => 'pgsql/pgsql.stub', 'pg_put_copy_end' => 'pgsql/pgsql.stub', 'pg_put_line' => 'pgsql/pgsql.stub', 'pg_query' => 'pgsql/pgsql.stub', 'pg_query_params' => 'pgsql/pgsql.stub', 'pg_result' => 'pgsql/pgsql.stub', 'pg_result_error' => 'pgsql/pgsql.stub', 'pg_result_error_field' => 'pgsql/pgsql.stub', 'pg_result_memory_size' => 'pgsql/pgsql.stub', 'pg_result_seek' => 'pgsql/pgsql.stub', 'pg_result_status' => 'pgsql/pgsql.stub', 'pg_select' => 'pgsql/pgsql.stub', 'pg_send_execute' => 'pgsql/pgsql.stub', 'pg_send_prepare' => 'pgsql/pgsql.stub', 'pg_send_query' => 'pgsql/pgsql.stub', 'pg_send_query_params' => 'pgsql/pgsql.stub', 'pg_set_client_encoding' => 'pgsql/pgsql.stub', 'pg_set_error_context_visibility' => 'pgsql/pgsql.stub', 'pg_set_error_verbosity' => 'pgsql/pgsql.stub', 'pg_setclientencoding' => 'pgsql/pgsql.stub', 'pg_socket' => 'pgsql/pgsql.stub', 'pg_socket_poll' => 'pgsql/pgsql.stub', 'pg_trace' => 'pgsql/pgsql.stub', 'pg_transaction_status' => 'pgsql/pgsql.stub', 'pg_tty' => 'pgsql/pgsql.stub', 'pg_unescape_bytea' => 'pgsql/pgsql.stub', 'pg_untrace' => 'pgsql/pgsql.stub', 'pg_update' => 'pgsql/pgsql.stub', 'pg_version' => 'pgsql/pgsql.stub', 'php_egg_logo_guid' => 'standard/standard_0.stub', 'php_ini_loaded_file' => 'standard/standard_0.stub', 'php_ini_scanned_files' => 'standard/standard_0.stub', 'php_logo_guid' => 'standard/standard_0.stub', 'php_real_logo_guid' => 'standard/standard_0.stub', 'php_sapi_name' => 'standard/standard_0.stub', 'php_strip_whitespace' => 'standard/standard_4.stub', 'php_uname' => 'standard/standard_0.stub', 'phpcredits' => 'standard/standard_0.stub', 'phpdbg_break_file' => 'phpdbg/phpdbg.stub', 'phpdbg_break_function' => 'phpdbg/phpdbg.stub', 'phpdbg_break_method' => 'phpdbg/phpdbg.stub', 'phpdbg_break_next' => 'phpdbg/phpdbg.stub', 'phpdbg_clear' => 'phpdbg/phpdbg.stub', 'phpdbg_color' => 'phpdbg/phpdbg.stub', 'phpdbg_end_oplog' => 'phpdbg/phpdbg.stub', 'phpdbg_exec' => 'phpdbg/phpdbg.stub', 'phpdbg_get_executable' => 'phpdbg/phpdbg.stub', 'phpdbg_prompt' => 'phpdbg/phpdbg.stub', 'phpdbg_start_oplog' => 'phpdbg/phpdbg.stub', 'phpinfo' => 'standard/standard_0.stub', 'phpversion' => 'standard/standard_0.stub', 'pi' => 'standard/standard_3.stub', 'png2wbmp' => 'gd/gd.stub', 'popen' => 'standard/standard_5.stub', 'pos' => 'standard/standard_9.stub', 'posix_access' => 'posix/posix.stub', 'posix_ctermid' => 'posix/posix.stub', 'posix_eaccess' => 'posix/posix.stub', 'posix_errno' => 'posix/posix.stub', 'posix_get_last_error' => 'posix/posix.stub', 'posix_getcwd' => 'posix/posix.stub', 'posix_getegid' => 'posix/posix.stub', 'posix_geteuid' => 'posix/posix.stub', 'posix_getgid' => 'posix/posix.stub', 'posix_getgrgid' => 'posix/posix.stub', 'posix_getgrnam' => 'posix/posix.stub', 'posix_getgroups' => 'posix/posix.stub', 'posix_getlogin' => 'posix/posix.stub', 'posix_getpgid' => 'posix/posix.stub', 'posix_getpgrp' => 'posix/posix.stub', 'posix_getpid' => 'posix/posix.stub', 'posix_getppid' => 'posix/posix.stub', 'posix_getpwnam' => 'posix/posix.stub', 'posix_getpwuid' => 'posix/posix.stub', 'posix_getrlimit' => 'posix/posix.stub', 'posix_getsid' => 'posix/posix.stub', 'posix_getuid' => 'posix/posix.stub', 'posix_initgroups' => 'posix/posix.stub', 'posix_isatty' => 'posix/posix.stub', 'posix_kill' => 'posix/posix.stub', 'posix_mkfifo' => 'posix/posix.stub', 'posix_mknod' => 'posix/posix.stub', 'posix_setegid' => 'posix/posix.stub', 'posix_seteuid' => 'posix/posix.stub', 'posix_setgid' => 'posix/posix.stub', 'posix_setpgid' => 'posix/posix.stub', 'posix_setrlimit' => 'posix/posix.stub', 'posix_setsid' => 'posix/posix.stub', 'posix_setuid' => 'posix/posix.stub', 'posix_strerror' => 'posix/posix.stub', 'posix_sysconf' => 'posix/posix.stub', 'posix_times' => 'posix/posix.stub', 'posix_ttyname' => 'posix/posix.stub', 'posix_uname' => 'posix/posix.stub', 'pow' => 'standard/standard_3.stub', 'preg_filter' => 'pcre/pcre.stub', 'preg_grep' => 'pcre/pcre.stub', 'preg_last_error' => 'pcre/pcre.stub', 'preg_last_error_msg' => 'pcre/pcre.stub', 'preg_match' => 'pcre/pcre.stub', 'preg_match_all' => 'pcre/pcre.stub', 'preg_quote' => 'pcre/pcre.stub', 'preg_replace' => 'pcre/pcre.stub', 'preg_replace_callback' => 'pcre/pcre.stub', 'preg_replace_callback_array' => 'pcre/pcre.stub', 'preg_split' => 'pcre/pcre.stub', 'prev' => 'standard/standard_8.stub', 'print_r' => 'standard/standard_4.stub', 'printf' => 'standard/standard_2.stub', 'proc_close' => 'standard/standard_2.stub', 'proc_get_status' => 'standard/standard_2.stub', 'proc_nice' => 'standard/standard_2.stub', 'proc_open' => 'standard/standard_2.stub', 'proc_terminate' => 'standard/standard_2.stub', 'property_exists' => 'Core/Core.stub', 'pspell_add_to_personal' => 'pspell/pspell.stub', 'pspell_add_to_session' => 'pspell/pspell.stub', 'pspell_check' => 'pspell/pspell.stub', 'pspell_clear_session' => 'pspell/pspell.stub', 'pspell_config_create' => 'pspell/pspell.stub', 'pspell_config_data_dir' => 'pspell/pspell.stub', 'pspell_config_dict_dir' => 'pspell/pspell.stub', 'pspell_config_ignore' => 'pspell/pspell.stub', 'pspell_config_mode' => 'pspell/pspell.stub', 'pspell_config_personal' => 'pspell/pspell.stub', 'pspell_config_repl' => 'pspell/pspell.stub', 'pspell_config_runtogether' => 'pspell/pspell.stub', 'pspell_config_save_repl' => 'pspell/pspell.stub', 'pspell_new' => 'pspell/pspell.stub', 'pspell_new_config' => 'pspell/pspell.stub', 'pspell_new_personal' => 'pspell/pspell.stub', 'pspell_save_wordlist' => 'pspell/pspell.stub', 'pspell_store_replacement' => 'pspell/pspell.stub', 'pspell_suggest' => 'pspell/pspell.stub', 'putenv' => 'standard/standard_3.stub', 'quoted_printable_decode' => 'standard/standard_3.stub', 'quoted_printable_encode' => 'standard/standard_3.stub', 'quotemeta' => 'standard/standard_1.stub', 'rad2deg' => 'standard/standard_3.stub', 'radius_acct_open' => 'radius/radius.stub', 'radius_add_server' => 'radius/radius.stub', 'radius_auth_open' => 'radius/radius.stub', 'radius_close' => 'radius/radius.stub', 'radius_config' => 'radius/radius.stub', 'radius_create_request' => 'radius/radius.stub', 'rand' => 'random/random.stub', 'random_bytes' => 'random/random.stub', 'random_int' => 'random/random.stub', 'range' => 'standard/standard_8.stub', 'rawurldecode' => 'standard/standard_2.stub', 'rawurlencode' => 'standard/standard_2.stub', 'rd_kafka_err2str' => 'rdkafka/functions.stub', 'rd_kafka_errno' => 'rdkafka/functions.stub', 'rd_kafka_errno2err' => 'rdkafka/functions.stub', 'rd_kafka_get_err_descs' => 'rdkafka/functions.stub', 'rd_kafka_offset_tail' => 'rdkafka/functions.stub', 'rd_kafka_thread_cnt' => 'rdkafka/functions.stub', 'read_exif_data' => 'exif/exif.stub', 'readdir' => 'standard/standard_7.stub', 'readfile' => 'standard/standard_5.stub', 'readgzfile' => 'zlib/zlib.stub', 'readline' => 'readline/readline.stub', 'readline_add_history' => 'readline/readline.stub', 'readline_callback_handler_install' => 'readline/readline.stub', 'readline_callback_handler_remove' => 'readline/readline.stub', 'readline_callback_read_char' => 'readline/readline.stub', 'readline_clear_history' => 'readline/readline.stub', 'readline_completion_function' => 'readline/readline.stub', 'readline_info' => 'readline/readline.stub', 'readline_list_history' => 'readline/readline.stub', 'readline_on_new_line' => 'readline/readline.stub', 'readline_read_history' => 'readline/readline.stub', 'readline_redisplay' => 'readline/readline.stub', 'readline_write_history' => 'readline/readline.stub', 'readlink' => 'standard/standard_2.stub', 'realpath' => 'standard/standard_6.stub', 'realpath_cache_get' => 'standard/standard_9.stub', 'realpath_cache_size' => 'standard/standard_9.stub', 'recode' => 'recode/recode.stub', 'recode_file' => 'recode/recode.stub', 'recode_string' => 'recode/recode.stub', 'register_event_handler' => 'zend/zend.stub', 'register_shutdown_function' => 'standard/standard_4.stub', 'register_tick_function' => 'standard/standard_4.stub', 'rename' => 'standard/standard_5.stub', 'request_parse_body' => 'standard/standard_10.stub', 'reset' => 'standard/standard_8.stub', 'resourcebundle_count' => 'intl/intl.stub', 'resourcebundle_create' => 'intl/intl.stub', 'resourcebundle_get' => 'intl/intl.stub', 'resourcebundle_get_error_code' => 'intl/intl.stub', 'resourcebundle_get_error_message' => 'intl/intl.stub', 'resourcebundle_locales' => 'intl/intl.stub', 'restore_error_handler' => 'Core/Core.stub', 'restore_exception_handler' => 'Core/Core.stub', 'restore_include_path' => 'standard/standard_4.stub', 'rewind' => 'standard/standard_5.stub', 'rewinddir' => 'standard/standard_7.stub', 'rmdir' => 'standard/standard_5.stub', 'round' => 'standard/standard_3.stub', 'rpmaddtag' => 'rpminfo/rpminfo.stub', 'rpmdbinfo' => 'rpminfo/rpminfo.stub', 'rpmdbsearch' => 'rpminfo/rpminfo.stub', 'rpminfo' => 'rpminfo/rpminfo.stub', 'rpmvercmp' => 'rpminfo/rpminfo.stub', 'rrd_create' => 'rrd/rrd.stub', 'rrd_disconnect' => 'rrd/rrd.stub', 'rrd_error' => 'rrd/rrd.stub', 'rrd_fetch' => 'rrd/rrd.stub', 'rrd_first' => 'rrd/rrd.stub', 'rrd_graph' => 'rrd/rrd.stub', 'rrd_info' => 'rrd/rrd.stub', 'rrd_last' => 'rrd/rrd.stub', 'rrd_lastupdate' => 'rrd/rrd.stub', 'rrd_restore' => 'rrd/rrd.stub', 'rrd_tune' => 'rrd/rrd.stub', 'rrd_update' => 'rrd/rrd.stub', 'rrd_version' => 'rrd/rrd.stub', 'rrd_xport' => 'rrd/rrd.stub', 'rrdc_disconnect' => 'rrd/rrd.stub', 'rsort' => 'standard/standard_8.stub', 'rtrim' => 'standard/standard_1.stub', 'sapi_windows_cp_conv' => 'standard/basic.stub', 'sapi_windows_cp_get' => 'standard/basic.stub', 'sapi_windows_cp_is_utf8' => 'standard/basic.stub', 'sapi_windows_cp_set' => 'standard/basic.stub', 'sapi_windows_generate_ctrl_event' => 'standard/basic.stub', 'sapi_windows_set_ctrl_handler' => 'standard/basic.stub', 'sapi_windows_vt100_support' => 'standard/basic.stub', 'scandir' => 'standard/standard_7.stub', 'sem_acquire' => 'sysvsem/sysvsem.stub', 'sem_get' => 'sysvsem/sysvsem.stub', 'sem_release' => 'sysvsem/sysvsem.stub', 'sem_remove' => 'sysvsem/sysvsem.stub', 'serialize' => 'standard/standard_4.stub', 'session_abort' => 'session/session.stub', 'session_cache_expire' => 'session/session.stub', 'session_cache_limiter' => 'session/session.stub', 'session_commit' => 'session/session.stub', 'session_create_id' => 'session/session.stub', 'session_decode' => 'session/session.stub', 'session_destroy' => 'session/session.stub', 'session_encode' => 'session/session.stub', 'session_gc' => 'session/session.stub', 'session_get_cookie_params' => 'session/session.stub', 'session_id' => 'session/session.stub', 'session_is_registered' => 'session/session.stub', 'session_module_name' => 'session/session.stub', 'session_name' => 'session/session.stub', 'session_regenerate_id' => 'session/session.stub', 'session_register' => 'session/session.stub', 'session_register_shutdown' => 'session/session.stub', 'session_reset' => 'session/session.stub', 'session_save_path' => 'session/session.stub', 'session_set_cookie_params' => 'session/session.stub', 'session_set_save_handler' => 'session/session.stub', 'session_start' => 'session/session.stub', 'session_status' => 'session/session.stub', 'session_unregister' => 'session/session.stub', 'session_unset' => 'session/session.stub', 'session_write_close' => 'session/session.stub', 'set_error_handler' => 'Core/Core.stub', 'set_exception_handler' => 'Core/Core.stub', 'set_file_buffer' => 'standard/standard_6.stub', 'set_include_path' => 'standard/standard_4.stub', 'set_job_failed' => 'zend/zend_f.stub', 'set_magic_quotes_runtime' => 'standard/standard_3.stub', 'set_socket_blocking' => 'standard/standard_6.stub', 'set_time_limit' => 'standard/standard_3.stub', 'setcookie' => 'standard/standard_4.stub', 'setlocale' => 'standard/standard_1.stub', 'setrawcookie' => 'standard/standard_4.stub', 'settype' => 'standard/standard_5.stub', 'sha1' => 'standard/standard_0.stub', 'sha1_file' => 'standard/standard_0.stub', 'shell_exec' => 'standard/standard_2.stub', 'shm_attach' => 'sysvshm/sysvshm.stub', 'shm_detach' => 'sysvshm/sysvshm.stub', 'shm_get_var' => 'sysvshm/sysvshm.stub', 'shm_has_var' => 'sysvshm/sysvshm.stub', 'shm_put_var' => 'sysvshm/sysvshm.stub', 'shm_remove' => 'sysvshm/sysvshm.stub', 'shm_remove_var' => 'sysvshm/sysvshm.stub', 'shmop_close' => 'shmop/shmop.stub', 'shmop_delete' => 'shmop/shmop.stub', 'shmop_open' => 'shmop/shmop.stub', 'shmop_read' => 'shmop/shmop.stub', 'shmop_size' => 'shmop/shmop.stub', 'shmop_write' => 'shmop/shmop.stub', 'show_source' => 'standard/standard_4.stub', 'shuffle' => 'standard/standard_8.stub', 'simdjson_decode' => 'simdjson/simdjson.stub', 'simdjson_is_valid' => 'simdjson/simdjson.stub', 'simdjson_key_count' => 'simdjson/simdjson.stub', 'simdjson_key_exists' => 'simdjson/simdjson.stub', 'simdjson_key_value' => 'simdjson/simdjson.stub', 'similar_text' => 'standard/standard_1.stub', 'simplexml_import_dom' => 'SimpleXML/SimpleXML.stub', 'simplexml_load_file' => 'SimpleXML/SimpleXML.stub', 'simplexml_load_string' => 'SimpleXML/SimpleXML.stub', 'sin' => 'standard/standard_3.stub', 'sinh' => 'standard/standard_3.stub', 'sizeof' => 'standard/standard_9.stub', 'sleep' => 'standard/standard_0.stub', 'snappy_compress' => 'snappy/snappy/snappy.stub', 'snappy_uncompress' => 'snappy/snappy/snappy.stub', 'snmp2_get' => 'snmp/snmp.stub', 'snmp2_getnext' => 'snmp/snmp.stub', 'snmp2_real_walk' => 'snmp/snmp.stub', 'snmp2_set' => 'snmp/snmp.stub', 'snmp2_walk' => 'snmp/snmp.stub', 'snmp3_get' => 'snmp/snmp.stub', 'snmp3_getnext' => 'snmp/snmp.stub', 'snmp3_real_walk' => 'snmp/snmp.stub', 'snmp3_set' => 'snmp/snmp.stub', 'snmp3_walk' => 'snmp/snmp.stub', 'snmp_get_quick_print' => 'snmp/snmp.stub', 'snmp_get_valueretrieval' => 'snmp/snmp.stub', 'snmp_read_mib' => 'snmp/snmp.stub', 'snmp_set_enum_print' => 'snmp/snmp.stub', 'snmp_set_oid_numeric_print' => 'snmp/snmp.stub', 'snmp_set_oid_output_format' => 'snmp/snmp.stub', 'snmp_set_quick_print' => 'snmp/snmp.stub', 'snmp_set_valueretrieval' => 'snmp/snmp.stub', 'snmpget' => 'snmp/snmp.stub', 'snmpgetnext' => 'snmp/snmp.stub', 'snmprealwalk' => 'snmp/snmp.stub', 'snmpset' => 'snmp/snmp.stub', 'snmpwalk' => 'snmp/snmp.stub', 'snmpwalkoid' => 'snmp/snmp.stub', 'socket_accept' => 'sockets/sockets.stub', 'socket_addrinfo_bind' => 'sockets/sockets.stub', 'socket_addrinfo_connect' => 'sockets/sockets.stub', 'socket_addrinfo_explain' => 'sockets/sockets.stub', 'socket_addrinfo_lookup' => 'sockets/sockets.stub', 'socket_atmark' => 'sockets/sockets.stub', 'socket_bind' => 'sockets/sockets.stub', 'socket_clear_error' => 'sockets/sockets.stub', 'socket_close' => 'sockets/sockets.stub', 'socket_cmsg_space' => 'sockets/sockets.stub', 'socket_connect' => 'sockets/sockets.stub', 'socket_create' => 'sockets/sockets.stub', 'socket_create_listen' => 'sockets/sockets.stub', 'socket_create_pair' => 'sockets/sockets.stub', 'socket_export_stream' => 'sockets/sockets.stub', 'socket_get_option' => 'sockets/sockets.stub', 'socket_get_status' => 'standard/standard_6.stub', 'socket_getopt' => 'sockets/sockets.stub', 'socket_getpeername' => 'sockets/sockets.stub', 'socket_getsockname' => 'sockets/sockets.stub', 'socket_import_stream' => 'sockets/sockets.stub', 'socket_last_error' => 'sockets/sockets.stub', 'socket_listen' => 'sockets/sockets.stub', 'socket_read' => 'sockets/sockets.stub', 'socket_recv' => 'sockets/sockets.stub', 'socket_recvfrom' => 'sockets/sockets.stub', 'socket_recvmsg' => 'sockets/sockets.stub', 'socket_select' => 'sockets/sockets.stub', 'socket_send' => 'sockets/sockets.stub', 'socket_sendmsg' => 'sockets/sockets.stub', 'socket_sendto' => 'sockets/sockets.stub', 'socket_set_block' => 'sockets/sockets.stub', 'socket_set_blocking' => 'standard/standard_6.stub', 'socket_set_nonblock' => 'sockets/sockets.stub', 'socket_set_option' => 'sockets/sockets.stub', 'socket_set_timeout' => 'standard/standard_6.stub', 'socket_setopt' => 'sockets/sockets.stub', 'socket_shutdown' => 'sockets/sockets.stub', 'socket_strerror' => 'sockets/sockets.stub', 'socket_write' => 'sockets/sockets.stub', 'socket_wsaprotocol_info_export' => 'sockets/sockets.stub', 'socket_wsaprotocol_info_import' => 'sockets/sockets.stub', 'socket_wsaprotocol_info_release' => 'sockets/sockets.stub', 'sodium_add' => 'sodium/sodium.stub', 'sodium_base642bin' => 'sodium/sodium.stub', 'sodium_bin2base64' => 'sodium/sodium.stub', 'sodium_bin2hex' => 'sodium/sodium.stub', 'sodium_compare' => 'sodium/sodium.stub', 'sodium_crypto_aead_aegis128l_decrypt' => 'libsodium/libsodium_f.stub', 'sodium_crypto_aead_aegis128l_encrypt' => 'libsodium/libsodium_f.stub', 'sodium_crypto_aead_aegis128l_keygen' => 'libsodium/libsodium_f.stub', 'sodium_crypto_aead_aegis256_decrypt' => 'libsodium/libsodium_f.stub', 'sodium_crypto_aead_aegis256_encrypt' => 'libsodium/libsodium_f.stub', 'sodium_crypto_aead_aegis256_keygen' => 'libsodium/libsodium_f.stub', 'sodium_crypto_aead_aes256gcm_decrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_aes256gcm_encrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_aes256gcm_is_available' => 'sodium/sodium.stub', 'sodium_crypto_aead_aes256gcm_keygen' => 'sodium/sodium.stub', 'sodium_crypto_aead_chacha20poly1305_decrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_chacha20poly1305_encrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => 'sodium/sodium.stub', 'sodium_crypto_aead_chacha20poly1305_keygen' => 'sodium/sodium.stub', 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'sodium/sodium.stub', 'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => 'sodium/sodium.stub', 'sodium_crypto_auth' => 'sodium/sodium.stub', 'sodium_crypto_auth_keygen' => 'sodium/sodium.stub', 'sodium_crypto_auth_verify' => 'sodium/sodium.stub', 'sodium_crypto_box' => 'sodium/sodium.stub', 'sodium_crypto_box_keypair' => 'sodium/sodium.stub', 'sodium_crypto_box_keypair_from_secretkey_and_publickey' => 'sodium/sodium.stub', 'sodium_crypto_box_open' => 'sodium/sodium.stub', 'sodium_crypto_box_publickey' => 'sodium/sodium.stub', 'sodium_crypto_box_publickey_from_secretkey' => 'sodium/sodium.stub', 'sodium_crypto_box_seal' => 'sodium/sodium.stub', 'sodium_crypto_box_seal_open' => 'sodium/sodium.stub', 'sodium_crypto_box_secretkey' => 'sodium/sodium.stub', 'sodium_crypto_box_seed_keypair' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_add' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_from_hash' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_is_valid_point' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_random' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_add' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_complement' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_invert' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_mul' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_negate' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_random' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_reduce' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_scalar_sub' => 'sodium/sodium.stub', 'sodium_crypto_core_ristretto255_sub' => 'sodium/sodium.stub', 'sodium_crypto_generichash' => 'sodium/sodium.stub', 'sodium_crypto_generichash_final' => 'sodium/sodium.stub', 'sodium_crypto_generichash_init' => 'sodium/sodium.stub', 'sodium_crypto_generichash_keygen' => 'sodium/sodium.stub', 'sodium_crypto_generichash_update' => 'sodium/sodium.stub', 'sodium_crypto_kdf_derive_from_key' => 'sodium/sodium.stub', 'sodium_crypto_kdf_keygen' => 'sodium/sodium.stub', 'sodium_crypto_kx' => 'sodium/sodium.stub', 'sodium_crypto_kx_client_session_keys' => 'sodium/sodium.stub', 'sodium_crypto_kx_keypair' => 'sodium/sodium.stub', 'sodium_crypto_kx_publickey' => 'sodium/sodium.stub', 'sodium_crypto_kx_secretkey' => 'sodium/sodium.stub', 'sodium_crypto_kx_seed_keypair' => 'sodium/sodium.stub', 'sodium_crypto_kx_server_session_keys' => 'sodium/sodium.stub', 'sodium_crypto_pwhash' => 'sodium/sodium.stub', 'sodium_crypto_pwhash_scryptsalsa208sha256' => 'sodium/sodium.stub', 'sodium_crypto_pwhash_scryptsalsa208sha256_str' => 'sodium/sodium.stub', 'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => 'sodium/sodium.stub', 'sodium_crypto_pwhash_str' => 'sodium/sodium.stub', 'sodium_crypto_pwhash_str_needs_rehash' => 'sodium/sodium.stub', 'sodium_crypto_pwhash_str_verify' => 'sodium/sodium.stub', 'sodium_crypto_scalarmult' => 'sodium/sodium.stub', 'sodium_crypto_scalarmult_base' => 'sodium/sodium.stub', 'sodium_crypto_scalarmult_ristretto255' => 'sodium/sodium.stub', 'sodium_crypto_scalarmult_ristretto255_base' => 'sodium/sodium.stub', 'sodium_crypto_secretbox' => 'sodium/sodium.stub', 'sodium_crypto_secretbox_keygen' => 'sodium/sodium.stub', 'sodium_crypto_secretbox_open' => 'sodium/sodium.stub', 'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => 'sodium/sodium.stub', 'sodium_crypto_secretstream_xchacha20poly1305_init_push' => 'sodium/sodium.stub', 'sodium_crypto_secretstream_xchacha20poly1305_keygen' => 'sodium/sodium.stub', 'sodium_crypto_secretstream_xchacha20poly1305_pull' => 'sodium/sodium.stub', 'sodium_crypto_secretstream_xchacha20poly1305_push' => 'sodium/sodium.stub', 'sodium_crypto_secretstream_xchacha20poly1305_rekey' => 'sodium/sodium.stub', 'sodium_crypto_shorthash' => 'sodium/sodium.stub', 'sodium_crypto_shorthash_keygen' => 'sodium/sodium.stub', 'sodium_crypto_sign' => 'sodium/sodium.stub', 'sodium_crypto_sign_detached' => 'sodium/sodium.stub', 'sodium_crypto_sign_ed25519_pk_to_curve25519' => 'sodium/sodium.stub', 'sodium_crypto_sign_ed25519_sk_to_curve25519' => 'sodium/sodium.stub', 'sodium_crypto_sign_keypair' => 'sodium/sodium.stub', 'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => 'sodium/sodium.stub', 'sodium_crypto_sign_open' => 'sodium/sodium.stub', 'sodium_crypto_sign_publickey' => 'sodium/sodium.stub', 'sodium_crypto_sign_publickey_from_secretkey' => 'sodium/sodium.stub', 'sodium_crypto_sign_secretkey' => 'sodium/sodium.stub', 'sodium_crypto_sign_seed_keypair' => 'sodium/sodium.stub', 'sodium_crypto_sign_verify_detached' => 'sodium/sodium.stub', 'sodium_crypto_stream' => 'sodium/sodium.stub', 'sodium_crypto_stream_keygen' => 'sodium/sodium.stub', 'sodium_crypto_stream_xchacha20' => 'sodium/sodium.stub', 'sodium_crypto_stream_xchacha20_keygen' => 'sodium/sodium.stub', 'sodium_crypto_stream_xchacha20_xor' => 'sodium/sodium.stub', 'sodium_crypto_stream_xchacha20_xor_ic' => 'sodium/sodium.stub', 'sodium_crypto_stream_xor' => 'sodium/sodium.stub', 'sodium_hex2bin' => 'sodium/sodium.stub', 'sodium_increment' => 'sodium/sodium.stub', 'sodium_library_version_major' => 'sodium/sodium.stub', 'sodium_library_version_minor' => 'sodium/sodium.stub', 'sodium_memcmp' => 'sodium/sodium.stub', 'sodium_memzero' => 'sodium/sodium.stub', 'sodium_pad' => 'sodium/sodium.stub', 'sodium_randombytes_buf' => 'sodium/sodium.stub', 'sodium_randombytes_random16' => 'sodium/sodium.stub', 'sodium_randombytes_uniform' => 'sodium/sodium.stub', 'sodium_unpad' => 'sodium/sodium.stub', 'sodium_version_string' => 'sodium/sodium.stub', 'solr_get_version' => 'solr/functions.stub', 'sort' => 'standard/standard_8.stub', 'soundex' => 'standard/standard_2.stub', 'spl_autoload' => 'SPL/SPL_f.stub', 'spl_autoload_call' => 'SPL/SPL_f.stub', 'spl_autoload_extensions' => 'SPL/SPL_f.stub', 'spl_autoload_functions' => 'SPL/SPL_f.stub', 'spl_autoload_register' => 'SPL/SPL_f.stub', 'spl_autoload_unregister' => 'SPL/SPL_f.stub', 'spl_classes' => 'SPL/SPL_f.stub', 'spl_object_hash' => 'SPL/SPL_f.stub', 'spl_object_id' => 'SPL/SPL_f.stub', 'split' => 'regex/ereg.stub', 'spliti' => 'regex/ereg.stub', 'sprintf' => 'standard/standard_2.stub', 'sql_regcase' => 'regex/ereg.stub', 'sqlite_array_query' => 'SQLite/SQLite.stub', 'sqlite_busy_timeout' => 'SQLite/SQLite.stub', 'sqlite_changes' => 'SQLite/SQLite.stub', 'sqlite_close' => 'SQLite/SQLite.stub', 'sqlite_column' => 'SQLite/SQLite.stub', 'sqlite_create_aggregate' => 'SQLite/SQLite.stub', 'sqlite_create_function' => 'SQLite/SQLite.stub', 'sqlite_current' => 'SQLite/SQLite.stub', 'sqlite_error_string' => 'SQLite/SQLite.stub', 'sqlite_escape_string' => 'SQLite/SQLite.stub', 'sqlite_exec' => 'SQLite/SQLite.stub', 'sqlite_factory' => 'SQLite/SQLite.stub', 'sqlite_fetch_all' => 'SQLite/SQLite.stub', 'sqlite_fetch_array' => 'SQLite/SQLite.stub', 'sqlite_fetch_column_types' => 'SQLite/SQLite.stub', 'sqlite_fetch_object' => 'SQLite/SQLite.stub', 'sqlite_fetch_single' => 'SQLite/SQLite.stub', 'sqlite_fetch_string' => 'SQLite/SQLite.stub', 'sqlite_field_name' => 'SQLite/SQLite.stub', 'sqlite_has_more' => 'SQLite/SQLite.stub', 'sqlite_has_prev' => 'SQLite/SQLite.stub', 'sqlite_last_error' => 'SQLite/SQLite.stub', 'sqlite_last_insert_rowid' => 'SQLite/SQLite.stub', 'sqlite_libencoding' => 'SQLite/SQLite.stub', 'sqlite_libversion' => 'SQLite/SQLite.stub', 'sqlite_next' => 'SQLite/SQLite.stub', 'sqlite_num_fields' => 'SQLite/SQLite.stub', 'sqlite_num_rows' => 'SQLite/SQLite.stub', 'sqlite_open' => 'SQLite/SQLite.stub', 'sqlite_popen' => 'SQLite/SQLite.stub', 'sqlite_prev' => 'SQLite/SQLite.stub', 'sqlite_query' => 'SQLite/SQLite.stub', 'sqlite_rewind' => 'SQLite/SQLite.stub', 'sqlite_seek' => 'SQLite/SQLite.stub', 'sqlite_single_query' => 'SQLite/SQLite.stub', 'sqlite_udf_decode_binary' => 'SQLite/SQLite.stub', 'sqlite_udf_encode_binary' => 'SQLite/SQLite.stub', 'sqlite_unbuffered_query' => 'SQLite/SQLite.stub', 'sqlite_valid' => 'SQLite/SQLite.stub', 'sqlsrv_begin_transaction' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_cancel' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_client_info' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_close' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_commit' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_configure' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_connect' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_errors' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_execute' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_fetch' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_fetch_array' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_fetch_object' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_field_metadata' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_free_stmt' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_get_config' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_get_field' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_has_rows' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_next_result' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_num_fields' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_num_rows' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_prepare' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_query' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_rollback' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_rows_affected' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_send_stream_data' => 'sqlsrv/sqlsrv.stub', 'sqlsrv_server_info' => 'sqlsrv/sqlsrv.stub', 'sqrt' => 'standard/standard_3.stub', 'srand' => 'random/random.stub', 'sscanf' => 'standard/standard_2.stub', 'ssh2_auth_agent' => 'ssh2/ssh2.stub', 'ssh2_auth_hostbased_file' => 'ssh2/ssh2.stub', 'ssh2_auth_none' => 'ssh2/ssh2.stub', 'ssh2_auth_password' => 'ssh2/ssh2.stub', 'ssh2_auth_pubkey_file' => 'ssh2/ssh2.stub', 'ssh2_connect' => 'ssh2/ssh2.stub', 'ssh2_disconnect' => 'ssh2/ssh2.stub', 'ssh2_exec' => 'ssh2/ssh2.stub', 'ssh2_fetch_stream' => 'ssh2/ssh2.stub', 'ssh2_fingerprint' => 'ssh2/ssh2.stub', 'ssh2_forward_accept' => 'ssh2/ssh2.stub', 'ssh2_forward_listen' => 'ssh2/ssh2.stub', 'ssh2_methods_negotiated' => 'ssh2/ssh2.stub', 'ssh2_poll' => 'ssh2/ssh2.stub', 'ssh2_publickey_add' => 'ssh2/ssh2.stub', 'ssh2_publickey_init' => 'ssh2/ssh2.stub', 'ssh2_publickey_list' => 'ssh2/ssh2.stub', 'ssh2_publickey_remove' => 'ssh2/ssh2.stub', 'ssh2_scp_recv' => 'ssh2/ssh2.stub', 'ssh2_scp_send' => 'ssh2/ssh2.stub', 'ssh2_send_eof' => 'ssh2/ssh2.stub', 'ssh2_sftp' => 'ssh2/ssh2.stub', 'ssh2_sftp_chmod' => 'ssh2/ssh2.stub', 'ssh2_sftp_lstat' => 'ssh2/ssh2.stub', 'ssh2_sftp_mkdir' => 'ssh2/ssh2.stub', 'ssh2_sftp_readlink' => 'ssh2/ssh2.stub', 'ssh2_sftp_realpath' => 'ssh2/ssh2.stub', 'ssh2_sftp_rename' => 'ssh2/ssh2.stub', 'ssh2_sftp_rmdir' => 'ssh2/ssh2.stub', 'ssh2_sftp_stat' => 'ssh2/ssh2.stub', 'ssh2_sftp_symlink' => 'ssh2/ssh2.stub', 'ssh2_sftp_unlink' => 'ssh2/ssh2.stub', 'ssh2_shell' => 'ssh2/ssh2.stub', 'ssh2_tunnel' => 'ssh2/ssh2.stub', 'stat' => 'standard/standard_7.stub', 'stats_absolute_deviation' => 'stats/stats.stub', 'stats_cdf_beta' => 'stats/stats.stub', 'stats_cdf_binomial' => 'stats/stats.stub', 'stats_cdf_cauchy' => 'stats/stats.stub', 'stats_cdf_chisquare' => 'stats/stats.stub', 'stats_cdf_exponential' => 'stats/stats.stub', 'stats_cdf_f' => 'stats/stats.stub', 'stats_cdf_gamma' => 'stats/stats.stub', 'stats_cdf_laplace' => 'stats/stats.stub', 'stats_cdf_logistic' => 'stats/stats.stub', 'stats_cdf_negative_binomial' => 'stats/stats.stub', 'stats_cdf_noncentral_chisquare' => 'stats/stats.stub', 'stats_cdf_noncentral_f' => 'stats/stats.stub', 'stats_cdf_noncentral_t' => 'stats/stats.stub', 'stats_cdf_normal' => 'stats/stats.stub', 'stats_cdf_poisson' => 'stats/stats.stub', 'stats_cdf_t' => 'stats/stats.stub', 'stats_cdf_uniform' => 'stats/stats.stub', 'stats_cdf_weibull' => 'stats/stats.stub', 'stats_covariance' => 'stats/stats.stub', 'stats_dens_beta' => 'stats/stats.stub', 'stats_dens_cauchy' => 'stats/stats.stub', 'stats_dens_chisquare' => 'stats/stats.stub', 'stats_dens_exponential' => 'stats/stats.stub', 'stats_dens_f' => 'stats/stats.stub', 'stats_dens_gamma' => 'stats/stats.stub', 'stats_dens_laplace' => 'stats/stats.stub', 'stats_dens_logistic' => 'stats/stats.stub', 'stats_dens_normal' => 'stats/stats.stub', 'stats_dens_pmf_binomial' => 'stats/stats.stub', 'stats_dens_pmf_hypergeometric' => 'stats/stats.stub', 'stats_dens_pmf_negative_binomial' => 'stats/stats.stub', 'stats_dens_pmf_poisson' => 'stats/stats.stub', 'stats_dens_t' => 'stats/stats.stub', 'stats_dens_uniform' => 'stats/stats.stub', 'stats_dens_weibull' => 'stats/stats.stub', 'stats_harmonic_mean' => 'stats/stats.stub', 'stats_kurtosis' => 'stats/stats.stub', 'stats_rand_gen_beta' => 'stats/stats.stub', 'stats_rand_gen_chisquare' => 'stats/stats.stub', 'stats_rand_gen_exponential' => 'stats/stats.stub', 'stats_rand_gen_f' => 'stats/stats.stub', 'stats_rand_gen_funiform' => 'stats/stats.stub', 'stats_rand_gen_gamma' => 'stats/stats.stub', 'stats_rand_gen_ibinomial' => 'stats/stats.stub', 'stats_rand_gen_ibinomial_negative' => 'stats/stats.stub', 'stats_rand_gen_int' => 'stats/stats.stub', 'stats_rand_gen_ipoisson' => 'stats/stats.stub', 'stats_rand_gen_iuniform' => 'stats/stats.stub', 'stats_rand_gen_noncentral_f' => 'stats/stats.stub', 'stats_rand_gen_noncentral_t' => 'stats/stats.stub', 'stats_rand_gen_normal' => 'stats/stats.stub', 'stats_rand_gen_t' => 'stats/stats.stub', 'stats_rand_get_seeds' => 'stats/stats.stub', 'stats_rand_phrase_to_seeds' => 'stats/stats.stub', 'stats_rand_ranf' => 'stats/stats.stub', 'stats_rand_setall' => 'stats/stats.stub', 'stats_skew' => 'stats/stats.stub', 'stats_standard_deviation' => 'stats/stats.stub', 'stats_stat_binomial_coef' => 'stats/stats.stub', 'stats_stat_correlation' => 'stats/stats.stub', 'stats_stat_factorial' => 'stats/stats.stub', 'stats_stat_independent_t' => 'stats/stats.stub', 'stats_stat_innerproduct' => 'stats/stats.stub', 'stats_stat_paired_t' => 'stats/stats.stub', 'stats_stat_percentile' => 'stats/stats.stub', 'stats_stat_powersum' => 'stats/stats.stub', 'stats_variance' => 'stats/stats.stub', 'stomp_abort' => 'stomp/stomp.stub', 'stomp_ack' => 'stomp/stomp.stub', 'stomp_begin' => 'stomp/stomp.stub', 'stomp_close' => 'stomp/stomp.stub', 'stomp_commit' => 'stomp/stomp.stub', 'stomp_connect' => 'stomp/stomp.stub', 'stomp_error' => 'stomp/stomp.stub', 'stomp_get_session_id' => 'stomp/stomp.stub', 'stomp_get_timeout' => 'stomp/stomp.stub', 'stomp_has_frame' => 'stomp/stomp.stub', 'stomp_read_frame' => 'stomp/stomp.stub', 'stomp_send' => 'stomp/stomp.stub', 'stomp_set_timeout' => 'stomp/stomp.stub', 'stomp_subscribe' => 'stomp/stomp.stub', 'stomp_unsubscribe' => 'stomp/stomp.stub', 'stomp_version' => 'stomp/stomp.stub', 'str_contains' => 'Core/Core.stub', 'str_decrement' => 'Core/Core.stub', 'str_ends_with' => 'Core/Core.stub', 'str_getcsv' => 'standard/standard_2.stub', 'str_increment' => 'Core/Core.stub', 'str_ireplace' => 'standard/standard_1.stub', 'str_pad' => 'standard/standard_2.stub', 'str_repeat' => 'standard/standard_1.stub', 'str_replace' => 'standard/standard_1.stub', 'str_rot13' => 'standard/standard_9.stub', 'str_shuffle' => 'standard/standard_1.stub', 'str_split' => 'standard/standard_1.stub', 'str_starts_with' => 'Core/Core.stub', 'str_word_count' => 'standard/standard_1.stub', 'strcasecmp' => 'Core/Core.stub', 'strchr' => 'standard/standard_2.stub', 'strcmp' => 'Core/Core.stub', 'strcoll' => 'standard/standard_1.stub', 'strcspn' => 'standard/standard_0.stub', 'stream_bucket_append' => 'standard/standard_9.stub', 'stream_bucket_make_writeable' => 'standard/standard_9.stub', 'stream_bucket_new' => 'standard/standard_9.stub', 'stream_bucket_prepend' => 'standard/standard_9.stub', 'stream_context_create' => 'standard/standard_6.stub', 'stream_context_get_default' => 'standard/standard_6.stub', 'stream_context_get_options' => 'standard/standard_6.stub', 'stream_context_get_params' => 'standard/standard_6.stub', 'stream_context_set_default' => 'standard/standard_6.stub', 'stream_context_set_option' => 'standard/standard_6.stub', 'stream_context_set_options' => 'standard/standard_6.stub', 'stream_context_set_params' => 'standard/standard_6.stub', 'stream_copy_to_stream' => 'standard/standard_6.stub', 'stream_filter_append' => 'standard/standard_6.stub', 'stream_filter_prepend' => 'standard/standard_6.stub', 'stream_filter_register' => 'standard/standard_9.stub', 'stream_filter_remove' => 'standard/standard_6.stub', 'stream_get_contents' => 'standard/standard_6.stub', 'stream_get_filters' => 'standard/standard_9.stub', 'stream_get_line' => 'standard/standard_6.stub', 'stream_get_meta_data' => 'standard/standard_6.stub', 'stream_get_transports' => 'standard/standard_6.stub', 'stream_get_wrappers' => 'standard/standard_6.stub', 'stream_is_local' => 'standard/standard_6.stub', 'stream_isatty' => 'standard/standard_9.stub', 'stream_register_wrapper' => 'standard/standard_6.stub', 'stream_resolve_include_path' => 'standard/standard_6.stub', 'stream_select' => 'standard/standard_6.stub', 'stream_set_blocking' => 'standard/standard_6.stub', 'stream_set_chunk_size' => 'standard/standard_8.stub', 'stream_set_read_buffer' => 'standard/standard_6.stub', 'stream_set_timeout' => 'standard/standard_6.stub', 'stream_set_write_buffer' => 'standard/standard_6.stub', 'stream_socket_accept' => 'standard/standard_6.stub', 'stream_socket_client' => 'standard/standard_6.stub', 'stream_socket_enable_crypto' => 'standard/standard_6.stub', 'stream_socket_get_name' => 'standard/standard_6.stub', 'stream_socket_pair' => 'standard/standard_6.stub', 'stream_socket_recvfrom' => 'standard/standard_6.stub', 'stream_socket_sendto' => 'standard/standard_6.stub', 'stream_socket_server' => 'standard/standard_6.stub', 'stream_socket_shutdown' => 'standard/standard_6.stub', 'stream_supports_lock' => 'standard/standard_6.stub', 'stream_wrapper_register' => 'standard/standard_6.stub', 'stream_wrapper_restore' => 'standard/standard_6.stub', 'stream_wrapper_unregister' => 'standard/standard_6.stub', 'strftime' => 'date/date.stub', 'strip_tags' => 'standard/standard_1.stub', 'stripcslashes' => 'standard/standard_1.stub', 'stripos' => 'standard/standard_1.stub', 'stripslashes' => 'standard/standard_1.stub', 'stristr' => 'standard/standard_1.stub', 'strlen' => 'Core/Core.stub', 'strnatcasecmp' => 'standard/standard_0.stub', 'strnatcmp' => 'standard/standard_0.stub', 'strncasecmp' => 'Core/Core.stub', 'strncmp' => 'Core/Core.stub', 'strpbrk' => 'standard/standard_1.stub', 'strpos' => 'standard/standard_1.stub', 'strptime' => 'standard/standard_0.stub', 'strrchr' => 'standard/standard_1.stub', 'strrev' => 'standard/standard_1.stub', 'strripos' => 'standard/standard_1.stub', 'strrpos' => 'standard/standard_1.stub', 'strspn' => 'standard/standard_0.stub', 'strstr' => 'standard/standard_1.stub', 'strtok' => 'standard/standard_0.stub', 'strtolower' => 'standard/standard_1.stub', 'strtotime' => 'date/date.stub', 'strtoupper' => 'standard/standard_1.stub', 'strtr' => 'standard/standard_1.stub', 'strval' => 'standard/standard_5.stub', 'substr' => 'standard/standard_1.stub', 'substr_compare' => 'standard/standard_1.stub', 'substr_count' => 'standard/standard_0.stub', 'substr_replace' => 'standard/standard_1.stub', 'suhosin_encrypt_cookie' => 'suhosin/suhosin.stub', 'suhosin_get_raw_cookies' => 'suhosin/suhosin.stub', 'svn_add' => 'svn/svn.stub', 'svn_auth_get_parameter' => 'svn/svn.stub', 'svn_auth_set_parameter' => 'svn/svn.stub', 'svn_blame' => 'svn/svn.stub', 'svn_cat' => 'svn/svn.stub', 'svn_checkout' => 'svn/svn.stub', 'svn_cleanup' => 'svn/svn.stub', 'svn_client_version' => 'svn/svn.stub', 'svn_commit' => 'svn/svn.stub', 'svn_config_ensure' => 'svn/svn.stub', 'svn_copy' => 'svn/svn.stub', 'svn_delete' => 'svn/svn.stub', 'svn_diff' => 'svn/svn.stub', 'svn_export' => 'svn/svn.stub', 'svn_fs_abort_txn' => 'svn/svn.stub', 'svn_fs_apply_text' => 'svn/svn.stub', 'svn_fs_begin_txn2' => 'svn/svn.stub', 'svn_fs_change_node_prop' => 'svn/svn.stub', 'svn_fs_check_path' => 'svn/svn.stub', 'svn_fs_contents_changed' => 'svn/svn.stub', 'svn_fs_copy' => 'svn/svn.stub', 'svn_fs_delete' => 'svn/svn.stub', 'svn_fs_dir_entries' => 'svn/svn.stub', 'svn_fs_file_contents' => 'svn/svn.stub', 'svn_fs_file_length' => 'svn/svn.stub', 'svn_fs_is_dir' => 'svn/svn.stub', 'svn_fs_is_file' => 'svn/svn.stub', 'svn_fs_make_dir' => 'svn/svn.stub', 'svn_fs_make_file' => 'svn/svn.stub', 'svn_fs_node_created_rev' => 'svn/svn.stub', 'svn_fs_node_prop' => 'svn/svn.stub', 'svn_fs_props_changed' => 'svn/svn.stub', 'svn_fs_revision_prop' => 'svn/svn.stub', 'svn_fs_revision_root' => 'svn/svn.stub', 'svn_fs_txn_root' => 'svn/svn.stub', 'svn_fs_youngest_rev' => 'svn/svn.stub', 'svn_import' => 'svn/svn.stub', 'svn_info' => 'svn/svn.stub', 'svn_lock' => 'svn/svn.stub', 'svn_log' => 'svn/svn.stub', 'svn_ls' => 'svn/svn.stub', 'svn_mkdir' => 'svn/svn.stub', 'svn_move' => 'svn/svn.stub', 'svn_propget' => 'svn/svn.stub', 'svn_proplist' => 'svn/svn.stub', 'svn_repos_create' => 'svn/svn.stub', 'svn_repos_fs' => 'svn/svn.stub', 'svn_repos_fs_begin_txn_for_commit' => 'svn/svn.stub', 'svn_repos_fs_commit_txn' => 'svn/svn.stub', 'svn_repos_hotcopy' => 'svn/svn.stub', 'svn_repos_open' => 'svn/svn.stub', 'svn_repos_recover' => 'svn/svn.stub', 'svn_resolved' => 'svn/svn.stub', 'svn_revert' => 'svn/svn.stub', 'svn_status' => 'svn/svn.stub', 'svn_switch' => 'svn/svn.stub', 'svn_unlock' => 'svn/svn.stub', 'svn_update' => 'svn/svn.stub', 'swoole_async_dns_lookup_coro' => 'swoole/functions.stub', 'swoole_async_set' => 'swoole/functions.stub', 'swoole_clear_dns_cache' => 'swoole/functions.stub', 'swoole_clear_error' => 'swoole/functions.stub', 'swoole_client_select' => 'swoole/functions.stub', 'swoole_coroutine_create' => 'swoole/functions.stub', 'swoole_coroutine_defer' => 'swoole/functions.stub', 'swoole_coroutine_socketpair' => 'swoole/functions.stub', 'swoole_cpu_num' => 'swoole/functions.stub', 'swoole_errno' => 'swoole/functions.stub', 'swoole_error_log' => 'swoole/functions.stub', 'swoole_error_log_ex' => 'swoole/functions.stub', 'swoole_event_add' => 'swoole/functions.stub', 'swoole_event_cycle' => 'swoole/functions.stub', 'swoole_event_defer' => 'swoole/functions.stub', 'swoole_event_del' => 'swoole/functions.stub', 'swoole_event_dispatch' => 'swoole/functions.stub', 'swoole_event_exit' => 'swoole/functions.stub', 'swoole_event_isset' => 'swoole/functions.stub', 'swoole_event_set' => 'swoole/functions.stub', 'swoole_event_wait' => 'swoole/functions.stub', 'swoole_event_write' => 'swoole/functions.stub', 'swoole_get_local_ip' => 'swoole/functions.stub', 'swoole_get_local_mac' => 'swoole/functions.stub', 'swoole_get_mime_type' => 'swoole/functions.stub', 'swoole_get_object_by_handle' => 'swoole/functions.stub', 'swoole_get_objects' => 'swoole/functions.stub', 'swoole_get_vm_status' => 'swoole/functions.stub', 'swoole_hashcode' => 'swoole/functions.stub', 'swoole_ignore_error' => 'swoole/functions.stub', 'swoole_internal_call_user_shutdown_begin' => 'swoole/functions.stub', 'swoole_last_error' => 'swoole/functions.stub', 'swoole_mime_type_add' => 'swoole/functions.stub', 'swoole_mime_type_delete' => 'swoole/functions.stub', 'swoole_mime_type_exists' => 'swoole/functions.stub', 'swoole_mime_type_get' => 'swoole/functions.stub', 'swoole_mime_type_list' => 'swoole/functions.stub', 'swoole_mime_type_set' => 'swoole/functions.stub', 'swoole_select' => 'swoole/functions.stub', 'swoole_set_process_name' => 'swoole/functions.stub', 'swoole_strerror' => 'swoole/functions.stub', 'swoole_substr_json_decode' => 'swoole/functions.stub', 'swoole_substr_unserialize' => 'swoole/functions.stub', 'swoole_test_kernel_coroutine' => 'swoole/functions.stub', 'swoole_timer_after' => 'swoole/functions.stub', 'swoole_timer_clear' => 'swoole/functions.stub', 'swoole_timer_clear_all' => 'swoole/functions.stub', 'swoole_timer_exists' => 'swoole/functions.stub', 'swoole_timer_info' => 'swoole/functions.stub', 'swoole_timer_list' => 'swoole/functions.stub', 'swoole_timer_set' => 'swoole/functions.stub', 'swoole_timer_stats' => 'swoole/functions.stub', 'swoole_timer_tick' => 'swoole/functions.stub', 'swoole_version' => 'swoole/functions.stub', 'sybase_affected_rows' => 'sybase/sybase_ct.stub', 'sybase_close' => 'sybase/sybase_ct.stub', 'sybase_connect' => 'sybase/sybase_ct.stub', 'sybase_data_seek' => 'sybase/sybase_ct.stub', 'sybase_deadlock_retry_count' => 'sybase/sybase_ct.stub', 'sybase_fetch_array' => 'sybase/sybase_ct.stub', 'sybase_fetch_assoc' => 'sybase/sybase_ct.stub', 'sybase_fetch_field' => 'sybase/sybase_ct.stub', 'sybase_fetch_object' => 'sybase/sybase_ct.stub', 'sybase_fetch_row' => 'sybase/sybase_ct.stub', 'sybase_field_seek' => 'sybase/sybase_ct.stub', 'sybase_free_result' => 'sybase/sybase_ct.stub', 'sybase_get_last_message' => 'sybase/sybase_ct.stub', 'sybase_min_client_severity' => 'sybase/sybase_ct.stub', 'sybase_min_server_severity' => 'sybase/sybase_ct.stub', 'sybase_num_fields' => 'sybase/sybase_ct.stub', 'sybase_num_rows' => 'sybase/sybase_ct.stub', 'sybase_pconnect' => 'sybase/sybase_ct.stub', 'sybase_query' => 'sybase/sybase_ct.stub', 'sybase_result' => 'sybase/sybase_ct.stub', 'sybase_select_db' => 'sybase/sybase_ct.stub', 'sybase_set_message_handler' => 'sybase/sybase_ct.stub', 'sybase_unbuffered_query' => 'sybase/sybase_ct.stub', 'symlink' => 'standard/standard_2.stub', 'sys_get_temp_dir' => 'standard/standard_9.stub', 'sys_getloadavg' => 'standard/standard_3.stub', 'syslog' => 'standard/standard_8.stub', 'system' => 'standard/standard_2.stub', 'tan' => 'standard/standard_3.stub', 'tanh' => 'standard/standard_3.stub', 'tempnam' => 'standard/standard_5.stub', 'textdomain' => 'gettext/gettext.stub', 'tidy_access_count' => 'tidy/tidy.stub', 'tidy_clean_repair' => 'tidy/tidy.stub', 'tidy_config_count' => 'tidy/tidy.stub', 'tidy_diagnose' => 'tidy/tidy.stub', 'tidy_error_count' => 'tidy/tidy.stub', 'tidy_get_body' => 'tidy/tidy.stub', 'tidy_get_config' => 'tidy/tidy.stub', 'tidy_get_error_buffer' => 'tidy/tidy.stub', 'tidy_get_head' => 'tidy/tidy.stub', 'tidy_get_html' => 'tidy/tidy.stub', 'tidy_get_html_ver' => 'tidy/tidy.stub', 'tidy_get_opt_doc' => 'tidy/tidy.stub', 'tidy_get_output' => 'tidy/tidy.stub', 'tidy_get_release' => 'tidy/tidy.stub', 'tidy_get_root' => 'tidy/tidy.stub', 'tidy_get_status' => 'tidy/tidy.stub', 'tidy_getopt' => 'tidy/tidy.stub', 'tidy_is_xhtml' => 'tidy/tidy.stub', 'tidy_is_xml' => 'tidy/tidy.stub', 'tidy_parse_file' => 'tidy/tidy.stub', 'tidy_parse_string' => 'tidy/tidy.stub', 'tidy_repair_file' => 'tidy/tidy.stub', 'tidy_repair_string' => 'tidy/tidy.stub', 'tidy_warning_count' => 'tidy/tidy.stub', 'time' => 'date/date.stub', 'time_nanosleep' => 'standard/standard_0.stub', 'time_sleep_until' => 'standard/standard_0.stub', 'timezone_abbreviations_list' => 'date/date.stub', 'timezone_identifiers_list' => 'date/date.stub', 'timezone_location_get' => 'date/date.stub', 'timezone_name_from_abbr' => 'date/date.stub', 'timezone_name_get' => 'date/date.stub', 'timezone_offset_get' => 'date/date.stub', 'timezone_open' => 'date/date.stub', 'timezone_transitions_get' => 'date/date.stub', 'timezone_version_get' => 'date/date.stub', 'tmpfile' => 'standard/standard_5.stub', 'token_get_all' => 'tokenizer/tokenizer.stub', 'token_name' => 'tokenizer/tokenizer.stub', 'touch' => 'standard/standard_7.stub', 'trait_exists' => 'Core/Core.stub', 'transliterator_create' => 'intl/intl.stub', 'transliterator_create_from_rules' => 'intl/intl.stub', 'transliterator_create_inverse' => 'intl/intl.stub', 'transliterator_get_error_code' => 'intl/intl.stub', 'transliterator_get_error_message' => 'intl/intl.stub', 'transliterator_list_ids' => 'intl/intl.stub', 'transliterator_transliterate' => 'intl/intl.stub', 'trigger_error' => 'Core/Core.stub', 'trim' => 'standard/standard_1.stub', 'uasort' => 'standard/standard_8.stub', 'ucfirst' => 'standard/standard_1.stub', 'ucwords' => 'standard/standard_1.stub', 'uksort' => 'standard/standard_8.stub', 'umask' => 'standard/standard_5.stub', 'uniqid' => 'standard/standard_3.stub', 'unixtojd' => 'calendar/calendar.stub', 'unlink' => 'standard/standard_2.stub', 'unpack' => 'standard/standard_7.stub', 'unregister_event_handler' => 'zend/zend.stub', 'unregister_tick_function' => 'standard/standard_4.stub', 'unserialize' => 'standard/standard_4.stub', 'uopz_add_function' => 'uopz/uopz.stub', 'uopz_allow_exit' => 'uopz/uopz.stub', 'uopz_call_user_func' => 'uopz/uopz.stub', 'uopz_call_user_func_array' => 'uopz/uopz.stub', 'uopz_del_function' => 'uopz/uopz.stub', 'uopz_extend' => 'uopz/uopz.stub', 'uopz_flags' => 'uopz/uopz.stub', 'uopz_get_exit_status' => 'uopz/uopz.stub', 'uopz_get_hook' => 'uopz/uopz.stub', 'uopz_get_mock' => 'uopz/uopz.stub', 'uopz_get_property' => 'uopz/uopz.stub', 'uopz_get_return' => 'uopz/uopz.stub', 'uopz_get_static' => 'uopz/uopz.stub', 'uopz_implement' => 'uopz/uopz.stub', 'uopz_redefine' => 'uopz/uopz.stub', 'uopz_set_hook' => 'uopz/uopz.stub', 'uopz_set_mock' => 'uopz/uopz.stub', 'uopz_set_property' => 'uopz/uopz.stub', 'uopz_set_return' => 'uopz/uopz.stub', 'uopz_set_static' => 'uopz/uopz.stub', 'uopz_undefine' => 'uopz/uopz.stub', 'uopz_unset_hook' => 'uopz/uopz.stub', 'uopz_unset_mock' => 'uopz/uopz.stub', 'uopz_unset_return' => 'uopz/uopz.stub', 'uploadprogress_get_contents' => 'uploadprogress/uploadprogress.stub', 'uploadprogress_get_info' => 'uploadprogress/uploadprogress.stub', 'urldecode' => 'standard/standard_2.stub', 'urlencode' => 'standard/standard_2.stub', 'use_soap_error_handler' => 'soap/soap.stub', 'user_error' => 'Core/Core.stub', 'usleep' => 'standard/standard_0.stub', 'usort' => 'standard/standard_8.stub', 'utf8_decode' => 'standard/basic.stub', 'utf8_encode' => 'standard/basic.stub', 'uuid_compare' => 'uuid/uuid_c.stub', 'uuid_create' => 'uuid/uuid_c.stub', 'uuid_generate_md5' => 'uuid/uuid_c.stub', 'uuid_generate_sha1' => 'uuid/uuid_c.stub', 'uuid_is_null' => 'uuid/uuid_c.stub', 'uuid_is_valid' => 'uuid/uuid_c.stub', 'uuid_mac' => 'uuid/uuid_c.stub', 'uuid_parse' => 'uuid/uuid_c.stub', 'uuid_time' => 'uuid/uuid_c.stub', 'uuid_type' => 'uuid/uuid_c.stub', 'uuid_unparse' => 'uuid/uuid_c.stub', 'uuid_variant' => 'uuid/uuid_c.stub', 'uv_accept' => 'uv/uv_functions.stub', 'uv_async_init' => 'uv/uv_functions.stub', 'uv_async_send' => 'uv/uv_functions.stub', 'uv_chdir' => 'uv/uv_functions.stub', 'uv_check_init' => 'uv/uv_functions.stub', 'uv_check_start' => 'uv/uv_functions.stub', 'uv_check_stop' => 'uv/uv_functions.stub', 'uv_close' => 'uv/uv_functions.stub', 'uv_cpu_info' => 'uv/uv_functions.stub', 'uv_default_loop' => 'uv/uv_functions.stub', 'uv_err_name' => 'uv/uv_functions.stub', 'uv_exepath' => 'uv/uv_functions.stub', 'uv_fs_chmod' => 'uv/uv_functions.stub', 'uv_fs_chown' => 'uv/uv_functions.stub', 'uv_fs_close' => 'uv/uv_functions.stub', 'uv_fs_event_init' => 'uv/uv_functions.stub', 'uv_fs_fchmod' => 'uv/uv_functions.stub', 'uv_fs_fchown' => 'uv/uv_functions.stub', 'uv_fs_fdatasync' => 'uv/uv_functions.stub', 'uv_fs_fstat' => 'uv/uv_functions.stub', 'uv_fs_fsync' => 'uv/uv_functions.stub', 'uv_fs_ftruncate' => 'uv/uv_functions.stub', 'uv_fs_futime' => 'uv/uv_functions.stub', 'uv_fs_link' => 'uv/uv_functions.stub', 'uv_fs_lstat' => 'uv/uv_functions.stub', 'uv_fs_mkdir' => 'uv/uv_functions.stub', 'uv_fs_open' => 'uv/uv_functions.stub', 'uv_fs_poll_init' => 'uv/uv_functions.stub', 'uv_fs_poll_start' => 'uv/uv_functions.stub', 'uv_fs_poll_stop' => 'uv/uv_functions.stub', 'uv_fs_read' => 'uv/uv_functions.stub', 'uv_fs_readdir' => 'uv/uv_functions.stub', 'uv_fs_readlink' => 'uv/uv_functions.stub', 'uv_fs_rename' => 'uv/uv_functions.stub', 'uv_fs_rmdir' => 'uv/uv_functions.stub', 'uv_fs_sendfile' => 'uv/uv_functions.stub', 'uv_fs_stat' => 'uv/uv_functions.stub', 'uv_fs_symlink' => 'uv/uv_functions.stub', 'uv_fs_unlink' => 'uv/uv_functions.stub', 'uv_fs_utime' => 'uv/uv_functions.stub', 'uv_fs_write' => 'uv/uv_functions.stub', 'uv_get_free_memory' => 'uv/uv_functions.stub', 'uv_get_total_memory' => 'uv/uv_functions.stub', 'uv_getaddrinfo' => 'uv/uv_functions.stub', 'uv_guess_handle' => 'uv/uv_functions.stub', 'uv_hrtime' => 'uv/uv_functions.stub', 'uv_idle_init' => 'uv/uv_functions.stub', 'uv_idle_start' => 'uv/uv_functions.stub', 'uv_idle_stop' => 'uv/uv_functions.stub', 'uv_interface_addresses' => 'uv/uv_functions.stub', 'uv_ip4_addr' => 'uv/uv_functions.stub', 'uv_ip4_name' => 'uv/uv_functions.stub', 'uv_ip6_addr' => 'uv/uv_functions.stub', 'uv_ip6_name' => 'uv/uv_functions.stub', 'uv_is_active' => 'uv/uv_functions.stub', 'uv_is_closing' => 'uv/uv_functions.stub', 'uv_is_readable' => 'uv/uv_functions.stub', 'uv_is_writable' => 'uv/uv_functions.stub', 'uv_kill' => 'uv/uv_functions.stub', 'uv_last_error' => 'uv/uv_functions.stub', 'uv_listen' => 'uv/uv_functions.stub', 'uv_loadavg' => 'uv/uv_functions.stub', 'uv_loop_delete' => 'uv/uv_functions.stub', 'uv_loop_new' => 'uv/uv_functions.stub', 'uv_mutex_init' => 'uv/uv_functions.stub', 'uv_mutex_lock' => 'uv/uv_functions.stub', 'uv_mutex_trylock' => 'uv/uv_functions.stub', 'uv_now' => 'uv/uv_functions.stub', 'uv_pipe_bind' => 'uv/uv_functions.stub', 'uv_pipe_connect' => 'uv/uv_functions.stub', 'uv_pipe_init' => 'uv/uv_functions.stub', 'uv_pipe_open' => 'uv/uv_functions.stub', 'uv_pipe_pending_instances' => 'uv/uv_functions.stub', 'uv_poll_init' => 'uv/uv_functions.stub', 'uv_poll_start' => 'uv/uv_functions.stub', 'uv_poll_stop' => 'uv/uv_functions.stub', 'uv_prepare_init' => 'uv/uv_functions.stub', 'uv_prepare_start' => 'uv/uv_functions.stub', 'uv_prepare_stop' => 'uv/uv_functions.stub', 'uv_process_kill' => 'uv/uv_functions.stub', 'uv_queue_work' => 'uv/uv_functions.stub', 'uv_read_start' => 'uv/uv_functions.stub', 'uv_read_stop' => 'uv/uv_functions.stub', 'uv_ref' => 'uv/uv_functions.stub', 'uv_resident_set_memory' => 'uv/uv_functions.stub', 'uv_run' => 'uv/uv_functions.stub', 'uv_run_once' => 'uv/uv_functions.stub', 'uv_rwlock_init' => 'uv/uv_functions.stub', 'uv_rwlock_rdlock' => 'uv/uv_functions.stub', 'uv_rwlock_rdunlock' => 'uv/uv_functions.stub', 'uv_rwlock_tryrdlock' => 'uv/uv_functions.stub', 'uv_rwlock_trywrlock' => 'uv/uv_functions.stub', 'uv_rwlock_wrlock' => 'uv/uv_functions.stub', 'uv_rwlock_wrunlock' => 'uv/uv_functions.stub', 'uv_sem_init' => 'uv/uv_functions.stub', 'uv_sem_post' => 'uv/uv_functions.stub', 'uv_sem_trywait' => 'uv/uv_functions.stub', 'uv_sem_wait' => 'uv/uv_functions.stub', 'uv_shutdown' => 'uv/uv_functions.stub', 'uv_signal_stop' => 'uv/uv_functions.stub', 'uv_spawn' => 'uv/uv_functions.stub', 'uv_stdio_new' => 'uv/uv_functions.stub', 'uv_stop' => 'uv/uv_functions.stub', 'uv_strerror' => 'uv/uv_functions.stub', 'uv_tcp_bind' => 'uv/uv_functions.stub', 'uv_tcp_bind6' => 'uv/uv_functions.stub', 'uv_tcp_connect' => 'uv/uv_functions.stub', 'uv_tcp_connect6' => 'uv/uv_functions.stub', 'uv_tcp_getpeername' => 'uv/uv_functions.stub', 'uv_tcp_getsockname' => 'uv/uv_functions.stub', 'uv_tcp_init' => 'uv/uv_functions.stub', 'uv_tcp_nodelay' => 'uv/uv_functions.stub', 'uv_timer_again' => 'uv/uv_functions.stub', 'uv_timer_get_repeat' => 'uv/uv_functions.stub', 'uv_timer_init' => 'uv/uv_functions.stub', 'uv_timer_set_repeat' => 'uv/uv_functions.stub', 'uv_timer_start' => 'uv/uv_functions.stub', 'uv_timer_stop' => 'uv/uv_functions.stub', 'uv_tty_get_winsize' => 'uv/uv_functions.stub', 'uv_tty_init' => 'uv/uv_functions.stub', 'uv_tty_reset_mode' => 'uv/uv_functions.stub', 'uv_tty_set_mode' => 'uv/uv_functions.stub', 'uv_udp_bind' => 'uv/uv_functions.stub', 'uv_udp_bind6' => 'uv/uv_functions.stub', 'uv_udp_getsockname' => 'uv/uv_functions.stub', 'uv_udp_init' => 'uv/uv_functions.stub', 'uv_udp_recv_start' => 'uv/uv_functions.stub', 'uv_udp_recv_stop' => 'uv/uv_functions.stub', 'uv_udp_send' => 'uv/uv_functions.stub', 'uv_udp_send6' => 'uv/uv_functions.stub', 'uv_udp_set_broadcast' => 'uv/uv_functions.stub', 'uv_udp_set_membership' => 'uv/uv_functions.stub', 'uv_udp_set_multicast_loop' => 'uv/uv_functions.stub', 'uv_udp_set_multicast_ttl' => 'uv/uv_functions.stub', 'uv_unref' => 'uv/uv_functions.stub', 'uv_update_time' => 'uv/uv_functions.stub', 'uv_uptime' => 'uv/uv_functions.stub', 'uv_walk' => 'uv/uv_functions.stub', 'uv_write' => 'uv/uv_functions.stub', 'uv_write2' => 'uv/uv_functions.stub', 'var_dump' => 'standard/standard_4.stub', 'var_export' => 'standard/standard_4.stub', 'variant_abs' => 'com_dotnet/com_dotnet.stub', 'variant_add' => 'com_dotnet/com_dotnet.stub', 'variant_and' => 'com_dotnet/com_dotnet.stub', 'variant_cast' => 'com_dotnet/com_dotnet.stub', 'variant_cat' => 'com_dotnet/com_dotnet.stub', 'variant_cmp' => 'com_dotnet/com_dotnet.stub', 'variant_date_from_timestamp' => 'com_dotnet/com_dotnet.stub', 'variant_date_to_timestamp' => 'com_dotnet/com_dotnet.stub', 'variant_div' => 'com_dotnet/com_dotnet.stub', 'variant_eqv' => 'com_dotnet/com_dotnet.stub', 'variant_fix' => 'com_dotnet/com_dotnet.stub', 'variant_get_type' => 'com_dotnet/com_dotnet.stub', 'variant_idiv' => 'com_dotnet/com_dotnet.stub', 'variant_imp' => 'com_dotnet/com_dotnet.stub', 'variant_int' => 'com_dotnet/com_dotnet.stub', 'variant_mod' => 'com_dotnet/com_dotnet.stub', 'variant_mul' => 'com_dotnet/com_dotnet.stub', 'variant_neg' => 'com_dotnet/com_dotnet.stub', 'variant_not' => 'com_dotnet/com_dotnet.stub', 'variant_or' => 'com_dotnet/com_dotnet.stub', 'variant_pow' => 'com_dotnet/com_dotnet.stub', 'variant_round' => 'com_dotnet/com_dotnet.stub', 'variant_set' => 'com_dotnet/com_dotnet.stub', 'variant_set_type' => 'com_dotnet/com_dotnet.stub', 'variant_sub' => 'com_dotnet/com_dotnet.stub', 'variant_xor' => 'com_dotnet/com_dotnet.stub', 'version_compare' => 'standard/standard_9.stub', 'vfprintf' => 'standard/standard_2.stub', 'virtual' => 'apache/apache.stub', 'vprintf' => 'standard/standard_2.stub', 'vsprintf' => 'standard/standard_2.stub', 'wb_call_function' => 'winbinder/winbinder.stub', 'wb_create_font' => 'winbinder/winbinder.stub', 'wb_create_image' => 'winbinder/winbinder.stub', 'wb_create_mask' => 'winbinder/winbinder.stub', 'wb_create_timer' => 'winbinder/winbinder.stub', 'wb_create_window' => 'winbinder/winbinder.stub', 'wb_delete_items' => 'winbinder/winbinder.stub', 'wb_destroy_control' => 'winbinder/winbinder.stub', 'wb_destroy_font' => 'winbinder/winbinder.stub', 'wb_destroy_image' => 'winbinder/winbinder.stub', 'wb_destroy_timer' => 'winbinder/winbinder.stub', 'wb_destroy_window' => 'winbinder/winbinder.stub', 'wb_draw_ellipse' => 'winbinder/winbinder.stub', 'wb_draw_image' => 'winbinder/winbinder.stub', 'wb_draw_line' => 'winbinder/winbinder.stub', 'wb_draw_point' => 'winbinder/winbinder.stub', 'wb_draw_rect' => 'winbinder/winbinder.stub', 'wb_draw_text' => 'winbinder/winbinder.stub', 'wb_exec' => 'winbinder/winbinder.stub', 'wb_find_file' => 'winbinder/winbinder.stub', 'wb_get_address' => 'winbinder/winbinder.stub', 'wb_get_class' => 'winbinder/winbinder.stub', 'wb_get_control' => 'winbinder/winbinder.stub', 'wb_get_enabled' => 'winbinder/winbinder.stub', 'wb_get_enum_callback' => 'winbinder/winbinder.stub', 'wb_get_focus' => 'winbinder/winbinder.stub', 'wb_get_function_address' => 'winbinder/winbinder.stub', 'wb_get_hook_callback' => 'winbinder/winbinder.stub', 'wb_get_id' => 'winbinder/winbinder.stub', 'wb_get_image_data' => 'winbinder/winbinder.stub', 'wb_get_instance' => 'winbinder/winbinder.stub', 'wb_get_item_count' => 'winbinder/winbinder.stub', 'wb_get_item_list' => 'winbinder/winbinder.stub', 'wb_get_level' => 'winbinder/winbinder.stub', 'wb_get_midi_callback' => 'winbinder/winbinder.stub', 'wb_get_parent' => 'winbinder/winbinder.stub', 'wb_get_pixel' => 'winbinder/winbinder.stub', 'wb_get_position' => 'winbinder/winbinder.stub', 'wb_get_registry_key' => 'winbinder/winbinder.stub', 'wb_get_selected' => 'winbinder/winbinder.stub', 'wb_get_size' => 'winbinder/winbinder.stub', 'wb_get_state' => 'winbinder/winbinder.stub', 'wb_get_system_info' => 'winbinder/winbinder.stub', 'wb_get_value' => 'winbinder/winbinder.stub', 'wb_get_visible' => 'winbinder/winbinder.stub', 'wb_load_image' => 'winbinder/winbinder.stub', 'wb_load_library' => 'winbinder/winbinder.stub', 'wb_main_loop' => 'winbinder/winbinder.stub', 'wb_message_box' => 'winbinder/winbinder.stub', 'wb_peek' => 'winbinder/winbinder.stub', 'wb_play_sound' => 'winbinder/winbinder.stub', 'wb_poke' => 'winbinder/winbinder.stub', 'wb_refresh' => 'winbinder/winbinder.stub', 'wb_release_library' => 'winbinder/winbinder.stub', 'wb_save_image' => 'winbinder/winbinder.stub', 'wb_send_message' => 'winbinder/winbinder.stub', 'wb_set_area' => 'winbinder/winbinder.stub', 'wb_set_cursor' => 'winbinder/winbinder.stub', 'wb_set_enabled' => 'winbinder/winbinder.stub', 'wb_set_focus' => 'winbinder/winbinder.stub', 'wb_set_font' => 'winbinder/winbinder.stub', 'wb_set_handler' => 'winbinder/winbinder.stub', 'wb_set_image' => 'winbinder/winbinder.stub', 'wb_set_item_image' => 'winbinder/winbinder.stub', 'wb_set_location' => 'winbinder/winbinder.stub', 'wb_set_position' => 'winbinder/winbinder.stub', 'wb_set_range' => 'winbinder/winbinder.stub', 'wb_set_registry_key' => 'winbinder/winbinder.stub', 'wb_set_size' => 'winbinder/winbinder.stub', 'wb_set_state' => 'winbinder/winbinder.stub', 'wb_set_style' => 'winbinder/winbinder.stub', 'wb_set_visible' => 'winbinder/winbinder.stub', 'wb_sort' => 'winbinder/winbinder.stub', 'wb_stop_sound' => 'winbinder/winbinder.stub', 'wb_sys_dlg_color' => 'winbinder/winbinder.stub', 'wb_sys_dlg_path' => 'winbinder/winbinder.stub', 'wb_wait' => 'winbinder/winbinder.stub', 'wbtemp_clear_listview_columns' => 'winbinder/winbinder.stub', 'wbtemp_create_control' => 'winbinder/winbinder.stub', 'wbtemp_create_item' => 'winbinder/winbinder.stub', 'wbtemp_create_listview_column' => 'winbinder/winbinder.stub', 'wbtemp_create_listview_item' => 'winbinder/winbinder.stub', 'wbtemp_create_menu' => 'winbinder/winbinder.stub', 'wbtemp_create_statusbar_items' => 'winbinder/winbinder.stub', 'wbtemp_create_toolbar' => 'winbinder/winbinder.stub', 'wbtemp_create_treeview_item' => 'winbinder/winbinder.stub', 'wbtemp_get_listview_columns' => 'winbinder/winbinder.stub', 'wbtemp_get_listview_item_checked' => 'winbinder/winbinder.stub', 'wbtemp_get_listview_text' => 'winbinder/winbinder.stub', 'wbtemp_get_menu_item_checked' => 'winbinder/winbinder.stub', 'wbtemp_get_text' => 'winbinder/winbinder.stub', 'wbtemp_get_treeview_item_text' => 'winbinder/winbinder.stub', 'wbtemp_select_all_listview_items' => 'winbinder/winbinder.stub', 'wbtemp_select_listview_item' => 'winbinder/winbinder.stub', 'wbtemp_select_tab' => 'winbinder/winbinder.stub', 'wbtemp_set_accel_table' => 'winbinder/winbinder.stub', 'wbtemp_set_listview_item_checked' => 'winbinder/winbinder.stub', 'wbtemp_set_listview_item_text' => 'winbinder/winbinder.stub', 'wbtemp_set_menu_item_checked' => 'winbinder/winbinder.stub', 'wbtemp_set_menu_item_image' => 'winbinder/winbinder.stub', 'wbtemp_set_menu_item_selected' => 'winbinder/winbinder.stub', 'wbtemp_set_text' => 'winbinder/winbinder.stub', 'wbtemp_set_treeview_item_selected' => 'winbinder/winbinder.stub', 'wbtemp_set_treeview_item_text' => 'winbinder/winbinder.stub', 'wbtemp_set_treeview_item_value' => 'winbinder/winbinder.stub', 'wbtemp_set_value' => 'winbinder/winbinder.stub', 'wbtemp_sys_dlg_open' => 'winbinder/winbinder.stub', 'wbtemp_sys_dlg_save' => 'winbinder/winbinder.stub', 'wddx_add_vars' => 'wddx/wddx.stub', 'wddx_deserialize' => 'wddx/wddx.stub', 'wddx_packet_end' => 'wddx/wddx.stub', 'wddx_packet_start' => 'wddx/wddx.stub', 'wddx_serialize_value' => 'wddx/wddx.stub', 'wddx_serialize_vars' => 'wddx/wddx.stub', 'win32_continue_service' => 'win32service/win32service.stub', 'win32_create_service' => 'win32service/win32service.stub', 'win32_delete_service' => 'win32service/win32service.stub', 'win32_get_last_control_message' => 'win32service/win32service.stub', 'win32_pause_service' => 'win32service/win32service.stub', 'win32_query_service_status' => 'win32service/win32service.stub', 'win32_set_service_status' => 'win32service/win32service.stub', 'win32_start_service' => 'win32service/win32service.stub', 'win32_start_service_ctrl_dispatcher' => 'win32service/win32service.stub', 'win32_stop_service' => 'win32service/win32service.stub', 'wincache_fcache_fileinfo' => 'wincache/wincache.stub', 'wincache_fcache_meminfo' => 'wincache/wincache.stub', 'wincache_lock' => 'wincache/wincache.stub', 'wincache_ocache_fileinfo' => 'wincache/wincache.stub', 'wincache_ocache_meminfo' => 'wincache/wincache.stub', 'wincache_refresh_if_changed' => 'wincache/wincache.stub', 'wincache_rplist_fileinfo' => 'wincache/wincache.stub', 'wincache_rplist_meminfo' => 'wincache/wincache.stub', 'wincache_scache_info' => 'wincache/wincache.stub', 'wincache_scache_meminfo' => 'wincache/wincache.stub', 'wincache_ucache_add' => 'wincache/wincache.stub', 'wincache_ucache_cas' => 'wincache/wincache.stub', 'wincache_ucache_clear' => 'wincache/wincache.stub', 'wincache_ucache_dec' => 'wincache/wincache.stub', 'wincache_ucache_delete' => 'wincache/wincache.stub', 'wincache_ucache_exists' => 'wincache/wincache.stub', 'wincache_ucache_get' => 'wincache/wincache.stub', 'wincache_ucache_inc' => 'wincache/wincache.stub', 'wincache_ucache_info' => 'wincache/wincache.stub', 'wincache_ucache_meminfo' => 'wincache/wincache.stub', 'wincache_ucache_set' => 'wincache/wincache.stub', 'wincache_unlock' => 'wincache/wincache.stub', 'wordwrap' => 'standard/standard_0.stub', 'xcache_asm' => 'xcache/xcache.stub', 'xcache_clear_cache' => 'xcache/xcache.stub', 'xcache_coredump' => 'xcache/xcache.stub', 'xcache_count' => 'xcache/xcache.stub', 'xcache_coverager_decode' => 'xcache/xcache.stub', 'xcache_coverager_get' => 'xcache/xcache.stub', 'xcache_coverager_start' => 'xcache/xcache.stub', 'xcache_coverager_stop' => 'xcache/xcache.stub', 'xcache_dasm_file' => 'xcache/xcache.stub', 'xcache_dasm_string' => 'xcache/xcache.stub', 'xcache_dec' => 'xcache/xcache.stub', 'xcache_decode' => 'xcache/xcache.stub', 'xcache_encode' => 'xcache/xcache.stub', 'xcache_get' => 'xcache/xcache.stub', 'xcache_get_data_type' => 'xcache/xcache.stub', 'xcache_get_op_spec' => 'xcache/xcache.stub', 'xcache_get_op_type' => 'xcache/xcache.stub', 'xcache_get_opcode' => 'xcache/xcache.stub', 'xcache_get_opcode_spec' => 'xcache/xcache.stub', 'xcache_inc' => 'xcache/xcache.stub', 'xcache_info' => 'xcache/xcache.stub', 'xcache_is_autoglobal' => 'xcache/xcache.stub', 'xcache_isset' => 'xcache/xcache.stub', 'xcache_list' => 'xcache/xcache.stub', 'xcache_set' => 'xcache/xcache.stub', 'xcache_unset' => 'xcache/xcache.stub', 'xcache_unset_by_prefix' => 'xcache/xcache.stub', 'xdebug_break' => 'xdebug/xdebug.stub', 'xdebug_call_class' => 'xdebug/xdebug.stub', 'xdebug_call_file' => 'xdebug/xdebug.stub', 'xdebug_call_function' => 'xdebug/xdebug.stub', 'xdebug_call_line' => 'xdebug/xdebug.stub', 'xdebug_clear_aggr_profiling_data' => 'xdebug/xdebug.stub', 'xdebug_code_coverage_started' => 'xdebug/xdebug.stub', 'xdebug_connect_to_client' => 'xdebug/xdebug.stub', 'xdebug_debug_zval' => 'xdebug/xdebug.stub', 'xdebug_debug_zval_stdout' => 'xdebug/xdebug.stub', 'xdebug_disable' => 'xdebug/xdebug.stub', 'xdebug_dump_aggr_profiling_data' => 'xdebug/xdebug.stub', 'xdebug_dump_superglobals' => 'xdebug/xdebug.stub', 'xdebug_enable' => 'xdebug/xdebug.stub', 'xdebug_get_code_coverage' => 'xdebug/xdebug.stub', 'xdebug_get_collected_errors' => 'xdebug/xdebug.stub', 'xdebug_get_declared_vars' => 'xdebug/xdebug.stub', 'xdebug_get_formatted_function_stack' => 'xdebug/xdebug.stub', 'xdebug_get_function_count' => 'xdebug/xdebug.stub', 'xdebug_get_function_stack' => 'xdebug/xdebug.stub', 'xdebug_get_gc_run_count' => 'xdebug/xdebug.stub', 'xdebug_get_gc_total_collected_roots' => 'xdebug/xdebug.stub', 'xdebug_get_gcstats_filename' => 'xdebug/xdebug.stub', 'xdebug_get_headers' => 'xdebug/xdebug.stub', 'xdebug_get_monitored_functions' => 'xdebug/xdebug.stub', 'xdebug_get_profiler_filename' => 'xdebug/xdebug.stub', 'xdebug_get_stack_depth' => 'xdebug/xdebug.stub', 'xdebug_get_tracefile_name' => 'xdebug/xdebug.stub', 'xdebug_info' => 'xdebug/xdebug.stub', 'xdebug_is_debugger_active' => 'xdebug/xdebug.stub', 'xdebug_is_enabled' => 'xdebug/xdebug.stub', 'xdebug_memory_usage' => 'xdebug/xdebug.stub', 'xdebug_notify' => 'xdebug/xdebug.stub', 'xdebug_peak_memory_usage' => 'xdebug/xdebug.stub', 'xdebug_print_function_stack' => 'xdebug/xdebug.stub', 'xdebug_set_filter' => 'xdebug/xdebug.stub', 'xdebug_start_code_coverage' => 'xdebug/xdebug.stub', 'xdebug_start_error_collection' => 'xdebug/xdebug.stub', 'xdebug_start_function_monitor' => 'xdebug/xdebug.stub', 'xdebug_start_gcstats' => 'xdebug/xdebug.stub', 'xdebug_start_trace' => 'xdebug/xdebug.stub', 'xdebug_stop_code_coverage' => 'xdebug/xdebug.stub', 'xdebug_stop_error_collection' => 'xdebug/xdebug.stub', 'xdebug_stop_function_monitor' => 'xdebug/xdebug.stub', 'xdebug_stop_gcstats' => 'xdebug/xdebug.stub', 'xdebug_stop_trace' => 'xdebug/xdebug.stub', 'xdebug_time_index' => 'xdebug/xdebug.stub', 'xdebug_var_dump' => 'xdebug/xdebug.stub', 'xdiff_file_bdiff' => 'xdiff/xdiff.stub', 'xdiff_file_bdiff_size' => 'xdiff/xdiff.stub', 'xdiff_file_bpatch' => 'xdiff/xdiff.stub', 'xdiff_file_diff' => 'xdiff/xdiff.stub', 'xdiff_file_diff_binary' => 'xdiff/xdiff.stub', 'xdiff_file_merge3' => 'xdiff/xdiff.stub', 'xdiff_file_patch' => 'xdiff/xdiff.stub', 'xdiff_file_patch_binary' => 'xdiff/xdiff.stub', 'xdiff_file_rabdiff' => 'xdiff/xdiff.stub', 'xdiff_string_bdiff' => 'xdiff/xdiff.stub', 'xdiff_string_bdiff_size' => 'xdiff/xdiff.stub', 'xdiff_string_bpatch' => 'xdiff/xdiff.stub', 'xdiff_string_diff' => 'xdiff/xdiff.stub', 'xdiff_string_diff_binary' => 'xdiff/xdiff.stub', 'xdiff_string_merge3' => 'xdiff/xdiff.stub', 'xdiff_string_patch' => 'xdiff/xdiff.stub', 'xdiff_string_patch_binary' => 'xdiff/xdiff.stub', 'xdiff_string_rabdiff' => 'xdiff/xdiff.stub', 'xhprof_disable' => 'xhprof/xhprof.stub', 'xhprof_enable' => 'xhprof/xhprof.stub', 'xhprof_sample_disable' => 'xhprof/xhprof.stub', 'xhprof_sample_enable' => 'xhprof/xhprof.stub', 'xml_error_string' => 'xml/xml.stub', 'xml_get_current_byte_index' => 'xml/xml.stub', 'xml_get_current_column_number' => 'xml/xml.stub', 'xml_get_current_line_number' => 'xml/xml.stub', 'xml_get_error_code' => 'xml/xml.stub', 'xml_parse' => 'xml/xml.stub', 'xml_parse_into_struct' => 'xml/xml.stub', 'xml_parser_create' => 'xml/xml.stub', 'xml_parser_create_ns' => 'xml/xml.stub', 'xml_parser_free' => 'xml/xml.stub', 'xml_parser_get_option' => 'xml/xml.stub', 'xml_parser_set_option' => 'xml/xml.stub', 'xml_set_character_data_handler' => 'xml/xml.stub', 'xml_set_default_handler' => 'xml/xml.stub', 'xml_set_element_handler' => 'xml/xml.stub', 'xml_set_end_namespace_decl_handler' => 'xml/xml.stub', 'xml_set_external_entity_ref_handler' => 'xml/xml.stub', 'xml_set_notation_decl_handler' => 'xml/xml.stub', 'xml_set_object' => 'xml/xml.stub', 'xml_set_processing_instruction_handler' => 'xml/xml.stub', 'xml_set_start_namespace_decl_handler' => 'xml/xml.stub', 'xml_set_unparsed_entity_decl_handler' => 'xml/xml.stub', 'xmlrpc_decode' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_decode_request' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_encode' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_encode_request' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_get_type' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_is_fault' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_parse_method_descriptions' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_server_add_introspection_data' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_server_call_method' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_server_create' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_server_destroy' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_server_register_introspection_callback' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_server_register_method' => 'xmlrpc/xmlrpc.stub', 'xmlrpc_set_type' => 'xmlrpc/xmlrpc.stub', 'xmlwriter_end_attribute' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_cdata' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_comment' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_document' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_dtd' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_dtd_attlist' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_dtd_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_dtd_entity' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_end_pi' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_flush' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_full_end_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_open_memory' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_open_uri' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_output_memory' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_set_indent' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_set_indent_string' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_attribute' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_attribute_ns' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_cdata' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_comment' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_document' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_dtd' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_dtd_attlist' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_dtd_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_dtd_entity' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_element_ns' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_start_pi' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_text' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_attribute' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_attribute_ns' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_cdata' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_comment' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_dtd' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_dtd_attlist' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_dtd_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_dtd_entity' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_element' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_element_ns' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_pi' => 'xmlwriter/xmlwriter.stub', 'xmlwriter_write_raw' => 'xmlwriter/xmlwriter.stub', 'xxtea_decrypt' => 'xxtea/xxtea.stub', 'xxtea_encrypt' => 'xxtea/xxtea.stub', 'yaml_emit' => 'yaml/yaml.stub', 'yaml_emit_file' => 'yaml/yaml.stub', 'yaml_parse' => 'yaml/yaml.stub', 'yaml_parse_file' => 'yaml/yaml.stub', 'yaml_parse_url' => 'yaml/yaml.stub', 'zem_get_extension_info_by_id' => 'ZendUtils/ZendUtils.stub', 'zem_get_extension_info_by_name' => 'ZendUtils/ZendUtils.stub', 'zem_get_extensions_info' => 'ZendUtils/ZendUtils.stub', 'zem_get_license_info' => 'ZendUtils/ZendUtils.stub', 'zend_current_obfuscation_level' => 'zend/zend_f.stub', 'zend_disk_cache_clear' => 'ZendCache/ZendCache.stub', 'zend_disk_cache_delete' => 'ZendCache/ZendCache.stub', 'zend_disk_cache_fetch' => 'ZendCache/ZendCache.stub', 'zend_disk_cache_info' => 'ZendCache/ZendCache.stub', 'zend_disk_cache_store' => 'ZendCache/ZendCache.stub', 'zend_get_id' => 'zend/zend_f.stub', 'zend_is_configuration_changed' => 'ZendUtils/ZendUtils.stub', 'zend_loader_current_file' => 'zend/zend_f.stub', 'zend_loader_enabled' => 'zend/zend_f.stub', 'zend_loader_file_encoded' => 'zend/zend_f.stub', 'zend_loader_file_licensed' => 'zend/zend_f.stub', 'zend_loader_install_license' => 'zend/zend_f.stub', 'zend_logo_guid' => 'standard/standard_0.stub', 'zend_obfuscate_class_name' => 'zend/zend_f.stub', 'zend_obfuscate_function_name' => 'zend/zend_f.stub', 'zend_optimizer_version' => 'zend/zend_f.stub', 'zend_runtime_obfuscate' => 'zend/zend_f.stub', 'zend_send_buffer' => 'zend/zend.stub', 'zend_send_file' => 'zend/zend.stub', 'zend_set_configuration_changed' => 'ZendUtils/ZendUtils.stub', 'zend_shm_cache_clear' => 'ZendCache/ZendCache.stub', 'zend_shm_cache_delete' => 'ZendCache/ZendCache.stub', 'zend_shm_cache_fetch' => 'ZendCache/ZendCache.stub', 'zend_shm_cache_info' => 'ZendCache/ZendCache.stub', 'zend_shm_cache_store' => 'ZendCache/ZendCache.stub', 'zend_version' => 'Core/Core.stub', 'zip_close' => 'zip/zip.stub', 'zip_entry_close' => 'zip/zip.stub', 'zip_entry_compressedsize' => 'zip/zip.stub', 'zip_entry_compressionmethod' => 'zip/zip.stub', 'zip_entry_filesize' => 'zip/zip.stub', 'zip_entry_name' => 'zip/zip.stub', 'zip_entry_open' => 'zip/zip.stub', 'zip_entry_read' => 'zip/zip.stub', 'zip_open' => 'zip/zip.stub', 'zip_read' => 'zip/zip.stub', 'zlib_decode' => 'zlib/zlib.stub', 'zlib_encode' => 'zlib/zlib.stub', 'zlib_get_coding_type' => 'zlib/zlib.stub', 'zstd_compress' => 'zstd/zstd.stub', 'zstd_compress_dict' => 'zstd/zstd.stub', 'zstd_compress_usingcdict' => 'zstd/zstd.stub', 'zstd_decompress_dict' => 'zstd/zstd.stub', 'zstd_decompress_usingcdict' => 'zstd/zstd.stub', 'zstd_uncompress' => 'zstd/zstd.stub', 'zstd_uncompress_dict' => 'zstd/zstd.stub', 'zstd_uncompress_usingcdict' => 'zstd/zstd.stub'); const CONSTANTS = array('ABDAY_1' => 'standard/standard_defines.stub', 'ABDAY_2' => 'standard/standard_defines.stub', 'ABDAY_3' => 'standard/standard_defines.stub', 'ABDAY_4' => 'standard/standard_defines.stub', 'ABDAY_5' => 'standard/standard_defines.stub', 'ABDAY_6' => 'standard/standard_defines.stub', 'ABDAY_7' => 'standard/standard_defines.stub', 'ABMON_1' => 'standard/standard_defines.stub', 'ABMON_10' => 'standard/standard_defines.stub', 'ABMON_11' => 'standard/standard_defines.stub', 'ABMON_12' => 'standard/standard_defines.stub', 'ABMON_2' => 'standard/standard_defines.stub', 'ABMON_3' => 'standard/standard_defines.stub', 'ABMON_4' => 'standard/standard_defines.stub', 'ABMON_5' => 'standard/standard_defines.stub', 'ABMON_6' => 'standard/standard_defines.stub', 'ABMON_7' => 'standard/standard_defines.stub', 'ABMON_8' => 'standard/standard_defines.stub', 'ABMON_9' => 'standard/standard_defines.stub', 'AF_INET' => 'sockets/sockets.stub', 'AF_INET6' => 'sockets/sockets.stub', 'AF_UNIX' => 'sockets/sockets.stub', 'AI_ADDRCONFIG' => 'sockets/sockets.stub', 'AI_ALL' => 'sockets/sockets.stub', 'AI_CANONNAME' => 'sockets/sockets.stub', 'AI_NUMERICHOST' => 'sockets/sockets.stub', 'AI_NUMERICSERV' => 'sockets/sockets.stub', 'AI_PASSIVE' => 'sockets/sockets.stub', 'AI_V4MAPPED' => 'sockets/sockets.stub', 'ALT_DIGITS' => 'standard/standard_defines.stub', 'AMQP_AUTOACK' => 'amqp/amqp.stub', 'AMQP_AUTODELETE' => 'amqp/amqp.stub', 'AMQP_DELIVERY_MODE_PERSISTENT' => 'amqp/amqp.stub', 'AMQP_DELIVERY_MODE_TRANSIENT' => 'amqp/amqp.stub', 'AMQP_DURABLE' => 'amqp/amqp.stub', 'AMQP_EXCLUSIVE' => 'amqp/amqp.stub', 'AMQP_EXTENSION_VERSION' => 'amqp/amqp.stub', 'AMQP_EXTENSION_VERSION_EXTRA' => 'amqp/amqp.stub', 'AMQP_EXTENSION_VERSION_ID' => 'amqp/amqp.stub', 'AMQP_EXTENSION_VERSION_MAJOR' => 'amqp/amqp.stub', 'AMQP_EXTENSION_VERSION_MINOR' => 'amqp/amqp.stub', 'AMQP_EXTENSION_VERSION_PATCH' => 'amqp/amqp.stub', 'AMQP_EX_TYPE_DIRECT' => 'amqp/amqp.stub', 'AMQP_EX_TYPE_FANOUT' => 'amqp/amqp.stub', 'AMQP_EX_TYPE_HEADERS' => 'amqp/amqp.stub', 'AMQP_EX_TYPE_TOPIC' => 'amqp/amqp.stub', 'AMQP_IFEMPTY' => 'amqp/amqp.stub', 'AMQP_IFUNUSED' => 'amqp/amqp.stub', 'AMQP_IMMEDIATE' => 'amqp/amqp.stub', 'AMQP_INTERNAL' => 'amqp/amqp.stub', 'AMQP_JUST_CONSUME' => 'amqp/amqp.stub', 'AMQP_MANDATORY' => 'amqp/amqp.stub', 'AMQP_MULTIPLE' => 'amqp/amqp.stub', 'AMQP_NOLOCAL' => 'amqp/amqp.stub', 'AMQP_NOPARAM' => 'amqp/amqp.stub', 'AMQP_NOWAIT' => 'amqp/amqp.stub', 'AMQP_OS_SOCKET_TIMEOUT_ERRNO' => 'amqp/amqp.stub', 'AMQP_PASSIVE' => 'amqp/amqp.stub', 'AMQP_REQUEUE' => 'amqp/amqp.stub', 'AMQP_SASL_METHOD_EXTERNAL' => 'amqp/amqp.stub', 'AMQP_SASL_METHOD_PLAIN' => 'amqp/amqp.stub', 'AM_STR' => 'standard/standard_defines.stub', 'APACHE_MAP' => 'soap/soap.stub', 'APC_BIN_VERIFY_CRC32' => 'apcu/apcu.stub', 'APC_BIN_VERIFY_MD5' => 'apcu/apcu.stub', 'APC_ITER_ALL' => 'apcu/apcu.stub', 'APC_ITER_ATIME' => 'apcu/apcu.stub', 'APC_ITER_CTIME' => 'apcu/apcu.stub', 'APC_ITER_DEVICE' => 'apcu/apcu.stub', 'APC_ITER_DTIME' => 'apcu/apcu.stub', 'APC_ITER_FILENAME' => 'apcu/apcu.stub', 'APC_ITER_INODE' => 'apcu/apcu.stub', 'APC_ITER_KEY' => 'apcu/apcu.stub', 'APC_ITER_MD5' => 'apcu/apcu.stub', 'APC_ITER_MEM_SIZE' => 'apcu/apcu.stub', 'APC_ITER_MTIME' => 'apcu/apcu.stub', 'APC_ITER_NONE' => 'apcu/apcu.stub', 'APC_ITER_NUM_HITS' => 'apcu/apcu.stub', 'APC_ITER_REFCOUNT' => 'apcu/apcu.stub', 'APC_ITER_TTL' => 'apcu/apcu.stub', 'APC_ITER_TYPE' => 'apcu/apcu.stub', 'APC_ITER_VALUE' => 'apcu/apcu.stub', 'APC_LIST_ACTIVE' => 'apcu/apcu.stub', 'APC_LIST_DELETED' => 'apcu/apcu.stub', 'ARRAY_FILTER_USE_BOTH' => 'standard/standard_9.stub', 'ARRAY_FILTER_USE_KEY' => 'standard/standard_9.stub', 'ASSERT_ACTIVE' => 'standard/standard_defines.stub', 'ASSERT_BAIL' => 'standard/standard_defines.stub', 'ASSERT_CALLBACK' => 'standard/standard_defines.stub', 'ASSERT_EXCEPTION' => 'standard/standard_defines.stub', 'ASSERT_QUIET_EVAL' => 'standard/standard_defines.stub', 'ASSERT_WARNING' => 'standard/standard_defines.stub', 'Accel' => 'winbinder/winbinder.stub', 'AppWindow' => 'winbinder/winbinder.stub', 'BLACK' => 'winbinder/winbinder.stub', 'BLUE' => 'winbinder/winbinder.stub', 'BROTLI_COMPRESS_LEVEL_DEFAULT' => 'brotli/brotli.stub', 'BROTLI_COMPRESS_LEVEL_MAX' => 'brotli/brotli.stub', 'BROTLI_COMPRESS_LEVEL_MIN' => 'brotli/brotli.stub', 'BROTLI_FINISH' => 'brotli/brotli.stub', 'BROTLI_FLUSH' => 'brotli/brotli.stub', 'BROTLI_FONT' => 'brotli/brotli.stub', 'BROTLI_GENERIC' => 'brotli/brotli.stub', 'BROTLI_PROCESS' => 'brotli/brotli.stub', 'BROTLI_TEXT' => 'brotli/brotli.stub', 'BUS_ADRALN' => 'pcntl/pcntl.stub', 'BUS_ADRERR' => 'pcntl/pcntl.stub', 'BUS_OBJERR' => 'pcntl/pcntl.stub', 'CAL_DOW_DAYNO' => 'calendar/calendar.stub', 'CAL_DOW_LONG' => 'calendar/calendar.stub', 'CAL_DOW_SHORT' => 'calendar/calendar.stub', 'CAL_EASTER_ALWAYS_GREGORIAN' => 'calendar/calendar.stub', 'CAL_EASTER_ALWAYS_JULIAN' => 'calendar/calendar.stub', 'CAL_EASTER_DEFAULT' => 'calendar/calendar.stub', 'CAL_EASTER_ROMAN' => 'calendar/calendar.stub', 'CAL_FRENCH' => 'calendar/calendar.stub', 'CAL_GREGORIAN' => 'calendar/calendar.stub', 'CAL_JEWISH' => 'calendar/calendar.stub', 'CAL_JEWISH_ADD_ALAFIM' => 'calendar/calendar.stub', 'CAL_JEWISH_ADD_ALAFIM_GERESH' => 'calendar/calendar.stub', 'CAL_JEWISH_ADD_GERESHAYIM' => 'calendar/calendar.stub', 'CAL_JULIAN' => 'calendar/calendar.stub', 'CAL_MONTH_FRENCH' => 'calendar/calendar.stub', 'CAL_MONTH_GREGORIAN_LONG' => 'calendar/calendar.stub', 'CAL_MONTH_GREGORIAN_SHORT' => 'calendar/calendar.stub', 'CAL_MONTH_JEWISH' => 'calendar/calendar.stub', 'CAL_MONTH_JULIAN_LONG' => 'calendar/calendar.stub', 'CAL_MONTH_JULIAN_SHORT' => 'calendar/calendar.stub', 'CAL_NUM_CALS' => 'calendar/calendar.stub', 'CASE_LOWER' => 'standard/standard_defines.stub', 'CASE_UPPER' => 'standard/standard_defines.stub', 'CHAR_MAX' => 'standard/standard_defines.stub', 'CLD_CONTINUED' => 'pcntl/pcntl.stub', 'CLD_DUMPED' => 'pcntl/pcntl.stub', 'CLD_EXITED' => 'pcntl/pcntl.stub', 'CLD_KILLED' => 'pcntl/pcntl.stub', 'CLD_STOPPED' => 'pcntl/pcntl.stub', 'CLD_TRAPPED' => 'pcntl/pcntl.stub', 'CLONE_NEWCGROUP' => 'pcntl/pcntl.stub', 'CLONE_NEWIPC' => 'pcntl/pcntl.stub', 'CLONE_NEWNET' => 'pcntl/pcntl.stub', 'CLONE_NEWNS' => 'pcntl/pcntl.stub', 'CLONE_NEWPID' => 'pcntl/pcntl.stub', 'CLONE_NEWUSER' => 'pcntl/pcntl.stub', 'CLONE_NEWUTS' => 'pcntl/pcntl.stub', 'CLSCTX_ALL' => 'com_dotnet/com_dotnet.stub', 'CLSCTX_INPROC_HANDLER' => 'com_dotnet/com_dotnet.stub', 'CLSCTX_INPROC_SERVER' => 'com_dotnet/com_dotnet.stub', 'CLSCTX_LOCAL_SERVER' => 'com_dotnet/com_dotnet.stub', 'CLSCTX_REMOTE_SERVER' => 'com_dotnet/com_dotnet.stub', 'CLSCTX_SERVER' => 'com_dotnet/com_dotnet.stub', 'CL_EXPUNGE' => 'imap/imap.stub', 'CODESET' => 'standard/standard_defines.stub', 'CONNECTION_ABORTED' => 'standard/standard_defines.stub', 'CONNECTION_NORMAL' => 'standard/standard_defines.stub', 'CONNECTION_TIMEOUT' => 'standard/standard_defines.stub', 'COUNT_NORMAL' => 'standard/standard_defines.stub', 'COUNT_RECURSIVE' => 'standard/standard_defines.stub', 'CP_ACP' => 'com_dotnet/com_dotnet.stub', 'CP_MACCP' => 'com_dotnet/com_dotnet.stub', 'CP_MOVE' => 'imap/imap.stub', 'CP_OEMCP' => 'com_dotnet/com_dotnet.stub', 'CP_SYMBOL' => 'com_dotnet/com_dotnet.stub', 'CP_THREAD_ACP' => 'com_dotnet/com_dotnet.stub', 'CP_UID' => 'imap/imap.stub', 'CP_UTF7' => 'com_dotnet/com_dotnet.stub', 'CP_UTF8' => 'com_dotnet/com_dotnet.stub', 'CREDITS_ALL' => 'standard/standard_defines.stub', 'CREDITS_DOCS' => 'standard/standard_defines.stub', 'CREDITS_FULLPAGE' => 'standard/standard_defines.stub', 'CREDITS_GENERAL' => 'standard/standard_defines.stub', 'CREDITS_GROUP' => 'standard/standard_defines.stub', 'CREDITS_MODULES' => 'standard/standard_defines.stub', 'CREDITS_QA' => 'standard/standard_defines.stub', 'CREDITS_SAPI' => 'standard/standard_defines.stub', 'CRNCYSTR' => 'standard/standard_defines.stub', 'CRYPT_BLOWFISH' => 'standard/standard_defines.stub', 'CRYPT_EXT_DES' => 'standard/standard_defines.stub', 'CRYPT_MD5' => 'standard/standard_defines.stub', 'CRYPT_SALT_LENGTH' => 'standard/standard_defines.stub', 'CRYPT_SHA256' => 'standard/standard_defines.stub', 'CRYPT_SHA512' => 'standard/standard_defines.stub', 'CRYPT_STD_DES' => 'standard/standard_defines.stub', 'CUBRID_ASSOC' => 'cubrid/cubrid.stub', 'CUBRID_ASYNC' => 'cubrid/cubrid.stub', 'CUBRID_AUTOCOMMIT_FALSE' => 'cubrid/cubrid.stub', 'CUBRID_AUTOCOMMIT_TRUE' => 'cubrid/cubrid.stub', 'CUBRID_BOTH' => 'cubrid/cubrid.stub', 'CUBRID_CURSOR_CURRENT' => 'cubrid/cubrid.stub', 'CUBRID_CURSOR_ERROR' => 'cubrid/cubrid.stub', 'CUBRID_CURSOR_FIRST' => 'cubrid/cubrid.stub', 'CUBRID_CURSOR_LAST' => 'cubrid/cubrid.stub', 'CUBRID_CURSOR_SUCCESS' => 'cubrid/cubrid.stub', 'CUBRID_EXEC_QUERY_ALL' => 'cubrid/cubrid.stub', 'CUBRID_INCLUDE_OID' => 'cubrid/cubrid.stub', 'CUBRID_NO_MORE_DATA' => 'cubrid/cubrid.stub', 'CUBRID_NUM' => 'cubrid/cubrid.stub', 'CUBRID_OBJECT' => 'cubrid/cubrid.stub', 'CURLALTSVC_H1' => 'curl/curl_d.stub', 'CURLALTSVC_H2' => 'curl/curl_d.stub', 'CURLALTSVC_H3' => 'curl/curl_d.stub', 'CURLALTSVC_READONLYFILE' => 'curl/curl_d.stub', 'CURLAUTH_ANY' => 'curl/curl_d.stub', 'CURLAUTH_ANYSAFE' => 'curl/curl_d.stub', 'CURLAUTH_AWS_SIGV4' => 'curl/curl_d.stub', 'CURLAUTH_BASIC' => 'curl/curl_d.stub', 'CURLAUTH_BEARER' => 'curl/curl_d.stub', 'CURLAUTH_DIGEST' => 'curl/curl_d.stub', 'CURLAUTH_DIGEST_IE' => 'curl/curl_d.stub', 'CURLAUTH_GSSAPI' => 'curl/curl_d.stub', 'CURLAUTH_GSSNEGOTIATE' => 'curl/curl_d.stub', 'CURLAUTH_NEGOTIATE' => 'curl/curl_d.stub', 'CURLAUTH_NONE' => 'curl/curl_d.stub', 'CURLAUTH_NTLM' => 'curl/curl_d.stub', 'CURLAUTH_NTLM_WB' => 'curl/curl_d.stub', 'CURLAUTH_ONLY' => 'curl/curl_d.stub', 'CURLCLOSEPOLICY_CALLBACK' => 'curl/curl_d.stub', 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' => 'curl/curl_d.stub', 'CURLCLOSEPOLICY_LEAST_TRAFFIC' => 'curl/curl_d.stub', 'CURLCLOSEPOLICY_OLDEST' => 'curl/curl_d.stub', 'CURLCLOSEPOLICY_SLOWEST' => 'curl/curl_d.stub', 'CURLE_ABORTED_BY_CALLBACK' => 'curl/curl_d.stub', 'CURLE_BAD_CALLING_ORDER' => 'curl/curl_d.stub', 'CURLE_BAD_CONTENT_ENCODING' => 'curl/curl_d.stub', 'CURLE_BAD_DOWNLOAD_RESUME' => 'curl/curl_d.stub', 'CURLE_BAD_FUNCTION_ARGUMENT' => 'curl/curl_d.stub', 'CURLE_BAD_PASSWORD_ENTERED' => 'curl/curl_d.stub', 'CURLE_COULDNT_CONNECT' => 'curl/curl_d.stub', 'CURLE_COULDNT_RESOLVE_HOST' => 'curl/curl_d.stub', 'CURLE_COULDNT_RESOLVE_PROXY' => 'curl/curl_d.stub', 'CURLE_FAILED_INIT' => 'curl/curl_d.stub', 'CURLE_FILESIZE_EXCEEDED' => 'curl/curl_d.stub', 'CURLE_FILE_COULDNT_READ_FILE' => 'curl/curl_d.stub', 'CURLE_FTP_ACCESS_DENIED' => 'curl/curl_d.stub', 'CURLE_FTP_BAD_DOWNLOAD_RESUME' => 'curl/curl_d.stub', 'CURLE_FTP_CANT_GET_HOST' => 'curl/curl_d.stub', 'CURLE_FTP_CANT_RECONNECT' => 'curl/curl_d.stub', 'CURLE_FTP_COULDNT_GET_SIZE' => 'curl/curl_d.stub', 'CURLE_FTP_COULDNT_RETR_FILE' => 'curl/curl_d.stub', 'CURLE_FTP_COULDNT_SET_ASCII' => 'curl/curl_d.stub', 'CURLE_FTP_COULDNT_SET_BINARY' => 'curl/curl_d.stub', 'CURLE_FTP_COULDNT_STOR_FILE' => 'curl/curl_d.stub', 'CURLE_FTP_COULDNT_USE_REST' => 'curl/curl_d.stub', 'CURLE_FTP_PARTIAL_FILE' => 'curl/curl_d.stub', 'CURLE_FTP_PORT_FAILED' => 'curl/curl_d.stub', 'CURLE_FTP_QUOTE_ERROR' => 'curl/curl_d.stub', 'CURLE_FTP_SSL_FAILED' => 'curl/curl_d.stub', 'CURLE_FTP_USER_PASSWORD_INCORRECT' => 'curl/curl_d.stub', 'CURLE_FTP_WEIRD_227_FORMAT' => 'curl/curl_d.stub', 'CURLE_FTP_WEIRD_PASS_REPLY' => 'curl/curl_d.stub', 'CURLE_FTP_WEIRD_PASV_REPLY' => 'curl/curl_d.stub', 'CURLE_FTP_WEIRD_SERVER_REPLY' => 'curl/curl_d.stub', 'CURLE_FTP_WEIRD_USER_REPLY' => 'curl/curl_d.stub', 'CURLE_FTP_WRITE_ERROR' => 'curl/curl_d.stub', 'CURLE_FUNCTION_NOT_FOUND' => 'curl/curl_d.stub', 'CURLE_GOT_NOTHING' => 'curl/curl_d.stub', 'CURLE_HTTP_NOT_FOUND' => 'curl/curl_d.stub', 'CURLE_HTTP_PORT_FAILED' => 'curl/curl_d.stub', 'CURLE_HTTP_POST_ERROR' => 'curl/curl_d.stub', 'CURLE_HTTP_RANGE_ERROR' => 'curl/curl_d.stub', 'CURLE_HTTP_RETURNED_ERROR' => 'curl/curl_d.stub', 'CURLE_LDAP_CANNOT_BIND' => 'curl/curl_d.stub', 'CURLE_LDAP_INVALID_URL' => 'curl/curl_d.stub', 'CURLE_LDAP_SEARCH_FAILED' => 'curl/curl_d.stub', 'CURLE_LIBRARY_NOT_FOUND' => 'curl/curl_d.stub', 'CURLE_MALFORMAT_USER' => 'curl/curl_d.stub', 'CURLE_OBSOLETE' => 'curl/curl_d.stub', 'CURLE_OK' => 'curl/curl_d.stub', 'CURLE_OPERATION_TIMEDOUT' => 'curl/curl_d.stub', 'CURLE_OPERATION_TIMEOUTED' => 'curl/curl_d.stub', 'CURLE_OUT_OF_MEMORY' => 'curl/curl_d.stub', 'CURLE_PARTIAL_FILE' => 'curl/curl_d.stub', 'CURLE_PROXY' => 'curl/curl_d.stub', 'CURLE_READ_ERROR' => 'curl/curl_d.stub', 'CURLE_RECV_ERROR' => 'curl/curl_d.stub', 'CURLE_SEND_ERROR' => 'curl/curl_d.stub', 'CURLE_SHARE_IN_USE' => 'curl/curl_d.stub', 'CURLE_SSH' => 'curl/curl_d.stub', 'CURLE_SSL_CACERT' => 'curl/curl_d.stub', 'CURLE_SSL_CACERT_BADFILE' => 'curl/curl_d.stub', 'CURLE_SSL_CERTPROBLEM' => 'curl/curl_d.stub', 'CURLE_SSL_CIPHER' => 'curl/curl_d.stub', 'CURLE_SSL_CONNECT_ERROR' => 'curl/curl_d.stub', 'CURLE_SSL_ENGINE_NOTFOUND' => 'curl/curl_d.stub', 'CURLE_SSL_ENGINE_SETFAILED' => 'curl/curl_d.stub', 'CURLE_SSL_PEER_CERTIFICATE' => 'curl/curl_d.stub', 'CURLE_SSL_PINNEDPUBKEYNOTMATCH' => 'curl/curl_d.stub', 'CURLE_TELNET_OPTION_SYNTAX' => 'curl/curl_d.stub', 'CURLE_TOO_MANY_REDIRECTS' => 'curl/curl_d.stub', 'CURLE_UNKNOWN_TELNET_OPTION' => 'curl/curl_d.stub', 'CURLE_UNSUPPORTED_PROTOCOL' => 'curl/curl_d.stub', 'CURLE_URL_MALFORMAT' => 'curl/curl_d.stub', 'CURLE_URL_MALFORMAT_USER' => 'curl/curl_d.stub', 'CURLE_WEIRD_SERVER_REPLY' => 'curl/curl_d.stub', 'CURLE_WRITE_ERROR' => 'curl/curl_d.stub', 'CURLFTPAUTH_DEFAULT' => 'curl/curl_d.stub', 'CURLFTPAUTH_SSL' => 'curl/curl_d.stub', 'CURLFTPAUTH_TLS' => 'curl/curl_d.stub', 'CURLFTPMETHOD_DEFAULT' => 'curl/curl_d.stub', 'CURLFTPMETHOD_MULTICWD' => 'curl/curl_d.stub', 'CURLFTPMETHOD_NOCWD' => 'curl/curl_d.stub', 'CURLFTPMETHOD_SINGLECWD' => 'curl/curl_d.stub', 'CURLFTPSSL_ALL' => 'curl/curl_d.stub', 'CURLFTPSSL_CCC_ACTIVE' => 'curl/curl_d.stub', 'CURLFTPSSL_CCC_NONE' => 'curl/curl_d.stub', 'CURLFTPSSL_CCC_PASSIVE' => 'curl/curl_d.stub', 'CURLFTPSSL_CONTROL' => 'curl/curl_d.stub', 'CURLFTPSSL_NONE' => 'curl/curl_d.stub', 'CURLFTPSSL_TRY' => 'curl/curl_d.stub', 'CURLFTP_CREATE_DIR' => 'curl/curl_d.stub', 'CURLFTP_CREATE_DIR_NONE' => 'curl/curl_d.stub', 'CURLFTP_CREATE_DIR_RETRY' => 'curl/curl_d.stub', 'CURLGSSAPI_DELEGATION_FLAG' => 'curl/curl_d.stub', 'CURLGSSAPI_DELEGATION_POLICY_FLAG' => 'curl/curl_d.stub', 'CURLHEADER_SEPARATE' => 'curl/curl_d.stub', 'CURLHEADER_UNIFIED' => 'curl/curl_d.stub', 'CURLHSTS_ENABLE' => 'curl/curl_d.stub', 'CURLHSTS_READONLYFILE' => 'curl/curl_d.stub', 'CURLINFO_APPCONNECT_TIME' => 'curl/curl_d.stub', 'CURLINFO_APPCONNECT_TIME_T' => 'curl/curl_d.stub', 'CURLINFO_CAINFO' => 'curl/curl_d.stub', 'CURLINFO_CAPATH' => 'curl/curl_d.stub', 'CURLINFO_CERTINFO' => 'curl/curl_d.stub', 'CURLINFO_CONDITION_UNMET' => 'curl/curl_d.stub', 'CURLINFO_CONNECT_TIME' => 'curl/curl_d.stub', 'CURLINFO_CONNECT_TIME_T' => 'curl/curl_d.stub', 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' => 'curl/curl_d.stub', 'CURLINFO_CONTENT_LENGTH_DOWNLOAD_T' => 'curl/curl_d.stub', 'CURLINFO_CONTENT_LENGTH_UPLOAD' => 'curl/curl_d.stub', 'CURLINFO_CONTENT_LENGTH_UPLOAD_T' => 'curl/curl_d.stub', 'CURLINFO_CONTENT_TYPE' => 'curl/curl_d.stub', 'CURLINFO_COOKIELIST' => 'curl/curl_d.stub', 'CURLINFO_EFFECTIVE_METHOD' => 'curl/curl_d.stub', 'CURLINFO_EFFECTIVE_URL' => 'curl/curl_d.stub', 'CURLINFO_FILETIME' => 'curl/curl_d.stub', 'CURLINFO_FILETIME_T' => 'curl/curl_d.stub', 'CURLINFO_FTP_ENTRY_PATH' => 'curl/curl_d.stub', 'CURLINFO_HEADER_OUT' => 'curl/curl_d.stub', 'CURLINFO_HEADER_SIZE' => 'curl/curl_d.stub', 'CURLINFO_HTTPAUTH_AVAIL' => 'curl/curl_d.stub', 'CURLINFO_HTTP_CODE' => 'curl/curl_d.stub', 'CURLINFO_HTTP_CONNECTCODE' => 'curl/curl_d.stub', 'CURLINFO_HTTP_VERSION' => 'curl/curl_d.stub', 'CURLINFO_LASTONE' => 'curl/curl_d.stub', 'CURLINFO_LOCAL_IP' => 'curl/curl_d.stub', 'CURLINFO_LOCAL_PORT' => 'curl/curl_d.stub', 'CURLINFO_NAMELOOKUP_TIME' => 'curl/curl_d.stub', 'CURLINFO_NAMELOOKUP_TIME_T' => 'curl/curl_d.stub', 'CURLINFO_NUM_CONNECTS' => 'curl/curl_d.stub', 'CURLINFO_OS_ERRNO' => 'curl/curl_d.stub', 'CURLINFO_PRETRANSFER_TIME' => 'curl/curl_d.stub', 'CURLINFO_PRETRANSFER_TIME_T' => 'curl/curl_d.stub', 'CURLINFO_PRIMARY_IP' => 'curl/curl_d.stub', 'CURLINFO_PRIMARY_PORT' => 'curl/curl_d.stub', 'CURLINFO_PRIVATE' => 'curl/curl_d.stub', 'CURLINFO_PROTOCOL' => 'curl/curl_d.stub', 'CURLINFO_PROXYAUTH_AVAIL' => 'curl/curl_d.stub', 'CURLINFO_PROXY_ERROR' => 'curl/curl_d.stub', 'CURLINFO_PROXY_SSL_VERIFYRESULT' => 'curl/curl_d.stub', 'CURLINFO_REDIRECT_COUNT' => 'curl/curl_d.stub', 'CURLINFO_REDIRECT_TIME' => 'curl/curl_d.stub', 'CURLINFO_REDIRECT_TIME_T' => 'curl/curl_d.stub', 'CURLINFO_REDIRECT_URL' => 'curl/curl_d.stub', 'CURLINFO_REFERER' => 'curl/curl_d.stub', 'CURLINFO_REQUEST_SIZE' => 'curl/curl_d.stub', 'CURLINFO_RESPONSE_CODE' => 'curl/curl_d.stub', 'CURLINFO_RETRY_AFTER' => 'curl/curl_d.stub', 'CURLINFO_RTSP_CLIENT_CSEQ' => 'curl/curl_d.stub', 'CURLINFO_RTSP_CSEQ_RECV' => 'curl/curl_d.stub', 'CURLINFO_RTSP_SERVER_CSEQ' => 'curl/curl_d.stub', 'CURLINFO_RTSP_SESSION_ID' => 'curl/curl_d.stub', 'CURLINFO_SCHEME' => 'curl/curl_d.stub', 'CURLINFO_SIZE_DOWNLOAD' => 'curl/curl_d.stub', 'CURLINFO_SIZE_DOWNLOAD_T' => 'curl/curl_d.stub', 'CURLINFO_SIZE_UPLOAD' => 'curl/curl_d.stub', 'CURLINFO_SIZE_UPLOAD_T' => 'curl/curl_d.stub', 'CURLINFO_SPEED_DOWNLOAD' => 'curl/curl_d.stub', 'CURLINFO_SPEED_DOWNLOAD_T' => 'curl/curl_d.stub', 'CURLINFO_SPEED_UPLOAD' => 'curl/curl_d.stub', 'CURLINFO_SPEED_UPLOAD_T' => 'curl/curl_d.stub', 'CURLINFO_SSL_ENGINES' => 'curl/curl_d.stub', 'CURLINFO_SSL_VERIFYRESULT' => 'curl/curl_d.stub', 'CURLINFO_STARTTRANSFER_TIME' => 'curl/curl_d.stub', 'CURLINFO_STARTTRANSFER_TIME_T' => 'curl/curl_d.stub', 'CURLINFO_TOTAL_TIME' => 'curl/curl_d.stub', 'CURLINFO_TOTAL_TIME_T' => 'curl/curl_d.stub', 'CURLKHMATCH_LAST' => 'curl/curl_d.stub', 'CURLKHMATCH_MISMATCH' => 'curl/curl_d.stub', 'CURLKHMATCH_MISSING' => 'curl/curl_d.stub', 'CURLKHMATCH_OK' => 'curl/curl_d.stub', 'CURLMIMEOPT_FORMESCAPE' => 'curl/curl_d.stub', 'CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE' => 'curl/curl_d.stub', 'CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE' => 'curl/curl_d.stub', 'CURLMOPT_MAXCONNECTS' => 'curl/curl_d.stub', 'CURLMOPT_MAX_CONCURRENT_STREAMS' => 'curl/curl_d.stub', 'CURLMOPT_MAX_HOST_CONNECTIONS' => 'curl/curl_d.stub', 'CURLMOPT_MAX_PIPELINE_LENGTH' => 'curl/curl_d.stub', 'CURLMOPT_MAX_TOTAL_CONNECTIONS' => 'curl/curl_d.stub', 'CURLMOPT_PIPELINING' => 'curl/curl_d.stub', 'CURLMOPT_PUSHFUNCTION' => 'curl/curl_d.stub', 'CURLMSG_DONE' => 'curl/curl_d.stub', 'CURLM_ADDED_ALREADY' => 'curl/curl_d.stub', 'CURLM_BAD_EASY_HANDLE' => 'curl/curl_d.stub', 'CURLM_BAD_HANDLE' => 'curl/curl_d.stub', 'CURLM_CALL_MULTI_PERFORM' => 'curl/curl_d.stub', 'CURLM_INTERNAL_ERROR' => 'curl/curl_d.stub', 'CURLM_OK' => 'curl/curl_d.stub', 'CURLM_OUT_OF_MEMORY' => 'curl/curl_d.stub', 'CURLOPT_ABSTRACT_UNIX_SOCKET' => 'curl/curl_d.stub', 'CURLOPT_ACCEPTTIMEOUT_MS' => 'curl/curl_d.stub', 'CURLOPT_ACCEPT_ENCODING' => 'curl/curl_d.stub', 'CURLOPT_ADDRESS_SCOPE' => 'curl/curl_d.stub', 'CURLOPT_ALTSVC' => 'curl/curl_d.stub', 'CURLOPT_ALTSVC_CTRL' => 'curl/curl_d.stub', 'CURLOPT_APPEND' => 'curl/curl_d.stub', 'CURLOPT_AUTOREFERER' => 'curl/curl_d.stub', 'CURLOPT_AWS_SIGV4' => 'curl/curl_d.stub', 'CURLOPT_BINARYTRANSFER' => 'curl/curl_d.stub', 'CURLOPT_BUFFERSIZE' => 'curl/curl_d.stub', 'CURLOPT_CAINFO' => 'curl/curl_d.stub', 'CURLOPT_CAINFO_BLOB' => 'curl/curl_d.stub', 'CURLOPT_CAPATH' => 'curl/curl_d.stub', 'CURLOPT_CA_CACHE_TIMEOUT' => 'curl/curl_d.stub', 'CURLOPT_CERTINFO' => 'curl/curl_d.stub', 'CURLOPT_CLOSEPOLICY' => 'curl/curl_d.stub', 'CURLOPT_CONNECTTIMEOUT' => 'curl/curl_d.stub', 'CURLOPT_CONNECTTIMEOUT_MS' => 'curl/curl_d.stub', 'CURLOPT_CONNECT_ONLY' => 'curl/curl_d.stub', 'CURLOPT_CONNECT_TO' => 'curl/curl_d.stub', 'CURLOPT_COOKIE' => 'curl/curl_d.stub', 'CURLOPT_COOKIEFILE' => 'curl/curl_d.stub', 'CURLOPT_COOKIEJAR' => 'curl/curl_d.stub', 'CURLOPT_COOKIELIST' => 'curl/curl_d.stub', 'CURLOPT_COOKIESESSION' => 'curl/curl_d.stub', 'CURLOPT_CRLF' => 'curl/curl_d.stub', 'CURLOPT_CRLFILE' => 'curl/curl_d.stub', 'CURLOPT_CUSTOMREQUEST' => 'curl/curl_d.stub', 'CURLOPT_DEFAULT_PROTOCOL' => 'curl/curl_d.stub', 'CURLOPT_DIRLISTONLY' => 'curl/curl_d.stub', 'CURLOPT_DISALLOW_USERNAME_IN_URL' => 'curl/curl_d.stub', 'CURLOPT_DNS_CACHE_TIMEOUT' => 'curl/curl_d.stub', 'CURLOPT_DNS_INTERFACE' => 'curl/curl_d.stub', 'CURLOPT_DNS_LOCAL_IP4' => 'curl/curl_d.stub', 'CURLOPT_DNS_LOCAL_IP6' => 'curl/curl_d.stub', 'CURLOPT_DNS_SERVERS' => 'curl/curl_d.stub', 'CURLOPT_DNS_SHUFFLE_ADDRESSES' => 'curl/curl_d.stub', 'CURLOPT_DNS_USE_GLOBAL_CACHE' => 'curl/curl_d.stub', 'CURLOPT_DOH_SSL_VERIFYHOST' => 'curl/curl_d.stub', 'CURLOPT_DOH_SSL_VERIFYPEER' => 'curl/curl_d.stub', 'CURLOPT_DOH_SSL_VERIFYSTATUS' => 'curl/curl_d.stub', 'CURLOPT_DOH_URL' => 'curl/curl_d.stub', 'CURLOPT_EGDSOCKET' => 'curl/curl_d.stub', 'CURLOPT_ENCODING' => 'curl/curl_d.stub', 'CURLOPT_EXPECT_100_TIMEOUT_MS' => 'curl/curl_d.stub', 'CURLOPT_FAILONERROR' => 'curl/curl_d.stub', 'CURLOPT_FILE' => 'curl/curl_d.stub', 'CURLOPT_FILETIME' => 'curl/curl_d.stub', 'CURLOPT_FNMATCH_FUNCTION' => 'curl/curl_d.stub', 'CURLOPT_FOLLOWLOCATION' => 'curl/curl_d.stub', 'CURLOPT_FORBID_REUSE' => 'curl/curl_d.stub', 'CURLOPT_FRESH_CONNECT' => 'curl/curl_d.stub', 'CURLOPT_FTPAPPEND' => 'curl/curl_d.stub', 'CURLOPT_FTPASCII' => 'curl/curl_d.stub', 'CURLOPT_FTPLISTONLY' => 'curl/curl_d.stub', 'CURLOPT_FTPPORT' => 'curl/curl_d.stub', 'CURLOPT_FTPSSLAUTH' => 'curl/curl_d.stub', 'CURLOPT_FTP_ACCOUNT' => 'curl/curl_d.stub', 'CURLOPT_FTP_ALTERNATIVE_TO_USER' => 'curl/curl_d.stub', 'CURLOPT_FTP_CREATE_MISSING_DIRS' => 'curl/curl_d.stub', 'CURLOPT_FTP_FILEMETHOD' => 'curl/curl_d.stub', 'CURLOPT_FTP_RESPONSE_TIMEOUT' => 'curl/curl_d.stub', 'CURLOPT_FTP_SKIP_PASV_IP' => 'curl/curl_d.stub', 'CURLOPT_FTP_SSL' => 'curl/curl_d.stub', 'CURLOPT_FTP_SSL_CCC' => 'curl/curl_d.stub', 'CURLOPT_FTP_USE_EPRT' => 'curl/curl_d.stub', 'CURLOPT_FTP_USE_EPSV' => 'curl/curl_d.stub', 'CURLOPT_FTP_USE_PRET' => 'curl/curl_d.stub', 'CURLOPT_GSSAPI_DELEGATION' => 'curl/curl_d.stub', 'CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS' => 'curl/curl_d.stub', 'CURLOPT_HAPROXYPROTOCOL' => 'curl/curl_d.stub', 'CURLOPT_HEADER' => 'curl/curl_d.stub', 'CURLOPT_HEADERFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_HEADEROPT' => 'curl/curl_d.stub', 'CURLOPT_HSTS' => 'curl/curl_d.stub', 'CURLOPT_HSTS_CTRL' => 'curl/curl_d.stub', 'CURLOPT_HTTP09_ALLOWED' => 'curl/curl_d.stub', 'CURLOPT_HTTP200ALIASES' => 'curl/curl_d.stub', 'CURLOPT_HTTPAUTH' => 'curl/curl_d.stub', 'CURLOPT_HTTPGET' => 'curl/curl_d.stub', 'CURLOPT_HTTPHEADER' => 'curl/curl_d.stub', 'CURLOPT_HTTPPROXYTUNNEL' => 'curl/curl_d.stub', 'CURLOPT_HTTP_CONTENT_DECODING' => 'curl/curl_d.stub', 'CURLOPT_HTTP_TRANSFER_DECODING' => 'curl/curl_d.stub', 'CURLOPT_HTTP_VERSION' => 'curl/curl_d.stub', 'CURLOPT_IGNORE_CONTENT_LENGTH' => 'curl/curl_d.stub', 'CURLOPT_INFILE' => 'curl/curl_d.stub', 'CURLOPT_INFILESIZE' => 'curl/curl_d.stub', 'CURLOPT_INTERFACE' => 'curl/curl_d.stub', 'CURLOPT_IPRESOLVE' => 'curl/curl_d.stub', 'CURLOPT_ISSUERCERT' => 'curl/curl_d.stub', 'CURLOPT_ISSUERCERT_BLOB' => 'curl/curl_d.stub', 'CURLOPT_KEEP_SENDING_ON_ERROR' => 'curl/curl_d.stub', 'CURLOPT_KEYPASSWD' => 'curl/curl_d.stub', 'CURLOPT_KRB4LEVEL' => 'curl/curl_d.stub', 'CURLOPT_KRBLEVEL' => 'curl/curl_d.stub', 'CURLOPT_LOCALPORT' => 'curl/curl_d.stub', 'CURLOPT_LOCALPORTRANGE' => 'curl/curl_d.stub', 'CURLOPT_LOGIN_OPTIONS' => 'curl/curl_d.stub', 'CURLOPT_LOW_SPEED_LIMIT' => 'curl/curl_d.stub', 'CURLOPT_LOW_SPEED_TIME' => 'curl/curl_d.stub', 'CURLOPT_MAIL_AUTH' => 'curl/curl_d.stub', 'CURLOPT_MAIL_FROM' => 'curl/curl_d.stub', 'CURLOPT_MAIL_RCPT' => 'curl/curl_d.stub', 'CURLOPT_MAIL_RCPT_ALLLOWFAILS' => 'curl/curl_d.stub', 'CURLOPT_MAXAGE_CONN' => 'curl/curl_d.stub', 'CURLOPT_MAXCONNECTS' => 'curl/curl_d.stub', 'CURLOPT_MAXFILESIZE' => 'curl/curl_d.stub', 'CURLOPT_MAXFILESIZE_LARGE' => 'curl/curl_d.stub', 'CURLOPT_MAXLIFETIME_CONN' => 'curl/curl_d.stub', 'CURLOPT_MAXREDIRS' => 'curl/curl_d.stub', 'CURLOPT_MAX_RECV_SPEED_LARGE' => 'curl/curl_d.stub', 'CURLOPT_MAX_SEND_SPEED_LARGE' => 'curl/curl_d.stub', 'CURLOPT_MIME_OPTIONS' => 'curl/curl_d.stub', 'CURLOPT_MUTE' => 'curl/curl_d.stub', 'CURLOPT_NETRC' => 'curl/curl_d.stub', 'CURLOPT_NETRC_FILE' => 'curl/curl_d.stub', 'CURLOPT_NEW_DIRECTORY_PERMS' => 'curl/curl_d.stub', 'CURLOPT_NEW_FILE_PERMS' => 'curl/curl_d.stub', 'CURLOPT_NOBODY' => 'curl/curl_d.stub', 'CURLOPT_NOPROGRESS' => 'curl/curl_d.stub', 'CURLOPT_NOPROXY' => 'curl/curl_d.stub', 'CURLOPT_NOSIGNAL' => 'curl/curl_d.stub', 'CURLOPT_PASSWDFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_PASSWORD' => 'curl/curl_d.stub', 'CURLOPT_PATH_AS_IS' => 'curl/curl_d.stub', 'CURLOPT_PINNEDPUBLICKEY' => 'curl/curl_d.stub', 'CURLOPT_PIPEWAIT' => 'curl/curl_d.stub', 'CURLOPT_PORT' => 'curl/curl_d.stub', 'CURLOPT_POST' => 'curl/curl_d.stub', 'CURLOPT_POSTFIELDS' => 'curl/curl_d.stub', 'CURLOPT_POSTQUOTE' => 'curl/curl_d.stub', 'CURLOPT_POSTREDIR' => 'curl/curl_d.stub', 'CURLOPT_PREQUOTE' => 'curl/curl_d.stub', 'CURLOPT_PREREQFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_PRE_PROXY' => 'curl/curl_d.stub', 'CURLOPT_PRIVATE' => 'curl/curl_d.stub', 'CURLOPT_PROGRESSFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_PROTOCOLS' => 'curl/curl_d.stub', 'CURLOPT_PROTOCOLS_STR' => 'curl/curl_d.stub', 'CURLOPT_PROXY' => 'curl/curl_d.stub', 'CURLOPT_PROXYAUTH' => 'curl/curl_d.stub', 'CURLOPT_PROXYHEADER' => 'curl/curl_d.stub', 'CURLOPT_PROXYPASSWORD' => 'curl/curl_d.stub', 'CURLOPT_PROXYPORT' => 'curl/curl_d.stub', 'CURLOPT_PROXYTYPE' => 'curl/curl_d.stub', 'CURLOPT_PROXYUSERNAME' => 'curl/curl_d.stub', 'CURLOPT_PROXYUSERPWD' => 'curl/curl_d.stub', 'CURLOPT_PROXY_CAINFO' => 'curl/curl_d.stub', 'CURLOPT_PROXY_CAINFO_BLOB' => 'curl/curl_d.stub', 'CURLOPT_PROXY_CAPATH' => 'curl/curl_d.stub', 'CURLOPT_PROXY_CRLFILE' => 'curl/curl_d.stub', 'CURLOPT_PROXY_ISSUERCERT' => 'curl/curl_d.stub', 'CURLOPT_PROXY_ISSUERCERT_BLOB' => 'curl/curl_d.stub', 'CURLOPT_PROXY_KEYPASSWD' => 'curl/curl_d.stub', 'CURLOPT_PROXY_PINNEDPUBLICKEY' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SERVICE_NAME' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLCERT' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLCERTTYPE' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLCERT_BLOB' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLKEY' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLKEYTYPE' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLKEY_BLOB' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSLVERSION' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSL_CIPHER_LIST' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSL_OPTIONS' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSL_VERIFYHOST' => 'curl/curl_d.stub', 'CURLOPT_PROXY_SSL_VERIFYPEER' => 'curl/curl_d.stub', 'CURLOPT_PROXY_TLS13_CIPHERS' => 'curl/curl_d.stub', 'CURLOPT_PROXY_TLSAUTH_PASSWORD' => 'curl/curl_d.stub', 'CURLOPT_PROXY_TLSAUTH_TYPE' => 'curl/curl_d.stub', 'CURLOPT_PROXY_TLSAUTH_USERNAME' => 'curl/curl_d.stub', 'CURLOPT_PROXY_TRANSFER_MODE' => 'curl/curl_d.stub', 'CURLOPT_PUT' => 'curl/curl_d.stub', 'CURLOPT_QUICK_EXIT' => 'curl/curl_d.stub', 'CURLOPT_QUOTE' => 'curl/curl_d.stub', 'CURLOPT_RANDOM_FILE' => 'curl/curl_d.stub', 'CURLOPT_RANGE' => 'curl/curl_d.stub', 'CURLOPT_READDATA' => 'curl/curl_d.stub', 'CURLOPT_READFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_REDIR_PROTOCOLS' => 'curl/curl_d.stub', 'CURLOPT_REDIR_PROTOCOLS_STR' => 'curl/curl_d.stub', 'CURLOPT_REFERER' => 'curl/curl_d.stub', 'CURLOPT_REQUEST_TARGET' => 'curl/curl_d.stub', 'CURLOPT_RESOLVE' => 'curl/curl_d.stub', 'CURLOPT_RESUME_FROM' => 'curl/curl_d.stub', 'CURLOPT_RETURNTRANSFER' => 'curl/curl_d.stub', 'CURLOPT_RTSP_CLIENT_CSEQ' => 'curl/curl_d.stub', 'CURLOPT_RTSP_REQUEST' => 'curl/curl_d.stub', 'CURLOPT_RTSP_SERVER_CSEQ' => 'curl/curl_d.stub', 'CURLOPT_RTSP_SESSION_ID' => 'curl/curl_d.stub', 'CURLOPT_RTSP_STREAM_URI' => 'curl/curl_d.stub', 'CURLOPT_RTSP_TRANSPORT' => 'curl/curl_d.stub', 'CURLOPT_SAFE_UPLOAD' => 'curl/curl_d.stub', 'CURLOPT_SASL_AUTHZID' => 'curl/curl_d.stub', 'CURLOPT_SASL_IR' => 'curl/curl_d.stub', 'CURLOPT_SERVICE_NAME' => 'curl/curl_d.stub', 'CURLOPT_SHARE' => 'curl/curl_d.stub', 'CURLOPT_SOCKS5_AUTH' => 'curl/curl_d.stub', 'CURLOPT_SOCKS5_GSSAPI_NEC' => 'curl/curl_d.stub', 'CURLOPT_SOCKS5_GSSAPI_SERVICE' => 'curl/curl_d.stub', 'CURLOPT_SSH_AUTH_TYPES' => 'curl/curl_d.stub', 'CURLOPT_SSH_COMPRESSION' => 'curl/curl_d.stub', 'CURLOPT_SSH_HOSTKEYFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' => 'curl/curl_d.stub', 'CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256' => 'curl/curl_d.stub', 'CURLOPT_SSH_KNOWNHOSTS' => 'curl/curl_d.stub', 'CURLOPT_SSH_PRIVATE_KEYFILE' => 'curl/curl_d.stub', 'CURLOPT_SSH_PUBLIC_KEYFILE' => 'curl/curl_d.stub', 'CURLOPT_SSLCERT' => 'curl/curl_d.stub', 'CURLOPT_SSLCERTPASSWD' => 'curl/curl_d.stub', 'CURLOPT_SSLCERTTYPE' => 'curl/curl_d.stub', 'CURLOPT_SSLCERT_BLOB' => 'curl/curl_d.stub', 'CURLOPT_SSLENGINE' => 'curl/curl_d.stub', 'CURLOPT_SSLENGINE_DEFAULT' => 'curl/curl_d.stub', 'CURLOPT_SSLKEY' => 'curl/curl_d.stub', 'CURLOPT_SSLKEYPASSWD' => 'curl/curl_d.stub', 'CURLOPT_SSLKEYTYPE' => 'curl/curl_d.stub', 'CURLOPT_SSLKEY_BLOB' => 'curl/curl_d.stub', 'CURLOPT_SSLVERSION' => 'curl/curl_d.stub', 'CURLOPT_SSL_CIPHER_LIST' => 'curl/curl_d.stub', 'CURLOPT_SSL_EC_CURVES' => 'curl/curl_d.stub', 'CURLOPT_SSL_ENABLE_ALPN' => 'curl/curl_d.stub', 'CURLOPT_SSL_ENABLE_NPN' => 'curl/curl_d.stub', 'CURLOPT_SSL_FALSESTART' => 'curl/curl_d.stub', 'CURLOPT_SSL_OPTIONS' => 'curl/curl_d.stub', 'CURLOPT_SSL_SESSIONID_CACHE' => 'curl/curl_d.stub', 'CURLOPT_SSL_VERIFYHOST' => 'curl/curl_d.stub', 'CURLOPT_SSL_VERIFYPEER' => 'curl/curl_d.stub', 'CURLOPT_SSL_VERIFYSTATUS' => 'curl/curl_d.stub', 'CURLOPT_STDERR' => 'curl/curl_d.stub', 'CURLOPT_STREAM_WEIGHT' => 'curl/curl_d.stub', 'CURLOPT_SUPPRESS_CONNECT_HEADERS' => 'curl/curl_d.stub', 'CURLOPT_TCP_FASTOPEN' => 'curl/curl_d.stub', 'CURLOPT_TCP_KEEPALIVE' => 'curl/curl_d.stub', 'CURLOPT_TCP_KEEPCNT' => 'curl/curl_d.stub', 'CURLOPT_TCP_KEEPIDLE' => 'curl/curl_d.stub', 'CURLOPT_TCP_KEEPINTVL' => 'curl/curl_d.stub', 'CURLOPT_TCP_NODELAY' => 'curl/curl_d.stub', 'CURLOPT_TELNETOPTIONS' => 'curl/curl_d.stub', 'CURLOPT_TFTP_BLKSIZE' => 'curl/curl_d.stub', 'CURLOPT_TFTP_NO_OPTIONS' => 'curl/curl_d.stub', 'CURLOPT_TIMECONDITION' => 'curl/curl_d.stub', 'CURLOPT_TIMEOUT' => 'curl/curl_d.stub', 'CURLOPT_TIMEOUT_MS' => 'curl/curl_d.stub', 'CURLOPT_TIMEVALUE' => 'curl/curl_d.stub', 'CURLOPT_TIMEVALUE_LARGE' => 'curl/curl_d.stub', 'CURLOPT_TLS13_CIPHERS' => 'curl/curl_d.stub', 'CURLOPT_TLSAUTH_PASSWORD' => 'curl/curl_d.stub', 'CURLOPT_TLSAUTH_TYPE' => 'curl/curl_d.stub', 'CURLOPT_TLSAUTH_USERNAME' => 'curl/curl_d.stub', 'CURLOPT_TRANSFERTEXT' => 'curl/curl_d.stub', 'CURLOPT_TRANSFER_ENCODING' => 'curl/curl_d.stub', 'CURLOPT_UNIX_SOCKET_PATH' => 'curl/curl_d.stub', 'CURLOPT_UNRESTRICTED_AUTH' => 'curl/curl_d.stub', 'CURLOPT_UPKEEP_INTERVAL_MS' => 'curl/curl_d.stub', 'CURLOPT_UPLOAD' => 'curl/curl_d.stub', 'CURLOPT_UPLOAD_BUFFERSIZE' => 'curl/curl_d.stub', 'CURLOPT_URL' => 'curl/curl_d.stub', 'CURLOPT_USERAGENT' => 'curl/curl_d.stub', 'CURLOPT_USERNAME' => 'curl/curl_d.stub', 'CURLOPT_USERPWD' => 'curl/curl_d.stub', 'CURLOPT_USE_SSL' => 'curl/curl_d.stub', 'CURLOPT_VERBOSE' => 'curl/curl_d.stub', 'CURLOPT_WILDCARDMATCH' => 'curl/curl_d.stub', 'CURLOPT_WRITEFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_WRITEHEADER' => 'curl/curl_d.stub', 'CURLOPT_WS_OPTIONS' => 'curl/curl_d.stub', 'CURLOPT_XFERINFOFUNCTION' => 'curl/curl_d.stub', 'CURLOPT_XOAUTH2_BEARER' => 'curl/curl_d.stub', 'CURLPAUSE_ALL' => 'curl/curl_d.stub', 'CURLPAUSE_CONT' => 'curl/curl_d.stub', 'CURLPAUSE_RECV' => 'curl/curl_d.stub', 'CURLPAUSE_RECV_CONT' => 'curl/curl_d.stub', 'CURLPAUSE_SEND' => 'curl/curl_d.stub', 'CURLPAUSE_SEND_CONT' => 'curl/curl_d.stub', 'CURLPIPE_HTTP1' => 'curl/curl_d.stub', 'CURLPIPE_MULTIPLEX' => 'curl/curl_d.stub', 'CURLPIPE_NOTHING' => 'curl/curl_d.stub', 'CURLPROTO_ALL' => 'curl/curl_d.stub', 'CURLPROTO_DICT' => 'curl/curl_d.stub', 'CURLPROTO_FILE' => 'curl/curl_d.stub', 'CURLPROTO_FTP' => 'curl/curl_d.stub', 'CURLPROTO_FTPS' => 'curl/curl_d.stub', 'CURLPROTO_GOPHER' => 'curl/curl_d.stub', 'CURLPROTO_HTTP' => 'curl/curl_d.stub', 'CURLPROTO_HTTPS' => 'curl/curl_d.stub', 'CURLPROTO_IMAP' => 'curl/curl_d.stub', 'CURLPROTO_IMAPS' => 'curl/curl_d.stub', 'CURLPROTO_LDAP' => 'curl/curl_d.stub', 'CURLPROTO_LDAPS' => 'curl/curl_d.stub', 'CURLPROTO_MQTT' => 'curl/curl_d.stub', 'CURLPROTO_POP3' => 'curl/curl_d.stub', 'CURLPROTO_POP3S' => 'curl/curl_d.stub', 'CURLPROTO_RTMP' => 'curl/curl_d.stub', 'CURLPROTO_RTMPE' => 'curl/curl_d.stub', 'CURLPROTO_RTMPS' => 'curl/curl_d.stub', 'CURLPROTO_RTMPT' => 'curl/curl_d.stub', 'CURLPROTO_RTMPTE' => 'curl/curl_d.stub', 'CURLPROTO_RTMPTS' => 'curl/curl_d.stub', 'CURLPROTO_RTSP' => 'curl/curl_d.stub', 'CURLPROTO_SCP' => 'curl/curl_d.stub', 'CURLPROTO_SFTP' => 'curl/curl_d.stub', 'CURLPROTO_SMB' => 'curl/curl_d.stub', 'CURLPROTO_SMBS' => 'curl/curl_d.stub', 'CURLPROTO_SMTP' => 'curl/curl_d.stub', 'CURLPROTO_SMTPS' => 'curl/curl_d.stub', 'CURLPROTO_TELNET' => 'curl/curl_d.stub', 'CURLPROTO_TFTP' => 'curl/curl_d.stub', 'CURLPROXY_HTTP' => 'curl/curl_d.stub', 'CURLPROXY_HTTPS' => 'curl/curl_d.stub', 'CURLPROXY_HTTP_1_0' => 'curl/curl_d.stub', 'CURLPROXY_SOCKS4' => 'curl/curl_d.stub', 'CURLPROXY_SOCKS4A' => 'curl/curl_d.stub', 'CURLPROXY_SOCKS5' => 'curl/curl_d.stub', 'CURLPROXY_SOCKS5_HOSTNAME' => 'curl/curl_d.stub', 'CURLPX_BAD_ADDRESS_TYPE' => 'curl/curl_d.stub', 'CURLPX_BAD_VERSION' => 'curl/curl_d.stub', 'CURLPX_CLOSED' => 'curl/curl_d.stub', 'CURLPX_GSSAPI' => 'curl/curl_d.stub', 'CURLPX_GSSAPI_PERMSG' => 'curl/curl_d.stub', 'CURLPX_GSSAPI_PROTECTION' => 'curl/curl_d.stub', 'CURLPX_IDENTD' => 'curl/curl_d.stub', 'CURLPX_IDENTD_DIFFER' => 'curl/curl_d.stub', 'CURLPX_LONG_HOSTNAME' => 'curl/curl_d.stub', 'CURLPX_LONG_PASSWD' => 'curl/curl_d.stub', 'CURLPX_LONG_USER' => 'curl/curl_d.stub', 'CURLPX_NO_AUTH' => 'curl/curl_d.stub', 'CURLPX_OK' => 'curl/curl_d.stub', 'CURLPX_RECV_ADDRESS' => 'curl/curl_d.stub', 'CURLPX_RECV_AUTH' => 'curl/curl_d.stub', 'CURLPX_RECV_CONNECT' => 'curl/curl_d.stub', 'CURLPX_RECV_REQACK' => 'curl/curl_d.stub', 'CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED' => 'curl/curl_d.stub', 'CURLPX_REPLY_COMMAND_NOT_SUPPORTED' => 'curl/curl_d.stub', 'CURLPX_REPLY_CONNECTION_REFUSED' => 'curl/curl_d.stub', 'CURLPX_REPLY_GENERAL_SERVER_FAILURE' => 'curl/curl_d.stub', 'CURLPX_REPLY_HOST_UNREACHABLE' => 'curl/curl_d.stub', 'CURLPX_REPLY_NETWORK_UNREACHABLE' => 'curl/curl_d.stub', 'CURLPX_REPLY_NOT_ALLOWED' => 'curl/curl_d.stub', 'CURLPX_REPLY_TTL_EXPIRED' => 'curl/curl_d.stub', 'CURLPX_REPLY_UNASSIGNED' => 'curl/curl_d.stub', 'CURLPX_REQUEST_FAILED' => 'curl/curl_d.stub', 'CURLPX_RESOLVE_HOST' => 'curl/curl_d.stub', 'CURLPX_SEND_AUTH' => 'curl/curl_d.stub', 'CURLPX_SEND_CONNECT' => 'curl/curl_d.stub', 'CURLPX_SEND_REQUEST' => 'curl/curl_d.stub', 'CURLPX_UNKNOWN_FAIL' => 'curl/curl_d.stub', 'CURLPX_UNKNOWN_MODE' => 'curl/curl_d.stub', 'CURLPX_USER_REJECTED' => 'curl/curl_d.stub', 'CURLSHOPT_NONE' => 'curl/curl_d.stub', 'CURLSHOPT_SHARE' => 'curl/curl_d.stub', 'CURLSHOPT_UNSHARE' => 'curl/curl_d.stub', 'CURLSSH_AUTH_AGENT' => 'curl/curl_d.stub', 'CURLSSH_AUTH_ANY' => 'curl/curl_d.stub', 'CURLSSH_AUTH_DEFAULT' => 'curl/curl_d.stub', 'CURLSSH_AUTH_GSSAPI' => 'curl/curl_d.stub', 'CURLSSH_AUTH_HOST' => 'curl/curl_d.stub', 'CURLSSH_AUTH_KEYBOARD' => 'curl/curl_d.stub', 'CURLSSH_AUTH_NONE' => 'curl/curl_d.stub', 'CURLSSH_AUTH_PASSWORD' => 'curl/curl_d.stub', 'CURLSSH_AUTH_PUBLICKEY' => 'curl/curl_d.stub', 'CURLSSLOPT_ALLOW_BEAST' => 'curl/curl_d.stub', 'CURLSSLOPT_AUTO_CLIENT_CERT' => 'curl/curl_d.stub', 'CURLSSLOPT_NATIVE_CA' => 'curl/curl_d.stub', 'CURLSSLOPT_NO_PARTIALCHAIN' => 'curl/curl_d.stub', 'CURLSSLOPT_NO_REVOKE' => 'curl/curl_d.stub', 'CURLSSLOPT_REVOKE_BEST_EFFORT' => 'curl/curl_d.stub', 'CURLUSESSL_ALL' => 'curl/curl_d.stub', 'CURLUSESSL_CONTROL' => 'curl/curl_d.stub', 'CURLUSESSL_NONE' => 'curl/curl_d.stub', 'CURLUSESSL_TRY' => 'curl/curl_d.stub', 'CURLVERSION_NOW' => 'curl/curl_d.stub', 'CURLWS_RAW_MODE' => 'curl/curl_d.stub', 'CURL_FNMATCHFUNC_FAIL' => 'curl/curl_d.stub', 'CURL_FNMATCHFUNC_MATCH' => 'curl/curl_d.stub', 'CURL_FNMATCHFUNC_NOMATCH' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_1_0' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_1_1' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_2' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_2TLS' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_2_0' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_3' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_3ONLY' => 'curl/curl_d.stub', 'CURL_HTTP_VERSION_NONE' => 'curl/curl_d.stub', 'CURL_IPRESOLVE_V4' => 'curl/curl_d.stub', 'CURL_IPRESOLVE_V6' => 'curl/curl_d.stub', 'CURL_IPRESOLVE_WHATEVER' => 'curl/curl_d.stub', 'CURL_LOCK_DATA_CONNECT' => 'curl/curl_d.stub', 'CURL_LOCK_DATA_COOKIE' => 'curl/curl_d.stub', 'CURL_LOCK_DATA_DNS' => 'curl/curl_d.stub', 'CURL_LOCK_DATA_PSL' => 'curl/curl_d.stub', 'CURL_LOCK_DATA_SSL_SESSION' => 'curl/curl_d.stub', 'CURL_MAX_READ_SIZE' => 'curl/curl_d.stub', 'CURL_NETRC_IGNORED' => 'curl/curl_d.stub', 'CURL_NETRC_OPTIONAL' => 'curl/curl_d.stub', 'CURL_NETRC_REQUIRED' => 'curl/curl_d.stub', 'CURL_PREREQFUNC_ABORT' => 'curl/curl_d.stub', 'CURL_PREREQFUNC_OK' => 'curl/curl_d.stub', 'CURL_PUSH_DENY' => 'curl/curl_d.stub', 'CURL_PUSH_OK' => 'curl/curl_d.stub', 'CURL_READFUNC_PAUSE' => 'curl/curl_d.stub', 'CURL_REDIR_POST_301' => 'curl/curl_d.stub', 'CURL_REDIR_POST_302' => 'curl/curl_d.stub', 'CURL_REDIR_POST_303' => 'curl/curl_d.stub', 'CURL_REDIR_POST_ALL' => 'curl/curl_d.stub', 'CURL_RTSPREQ_ANNOUNCE' => 'curl/curl_d.stub', 'CURL_RTSPREQ_DESCRIBE' => 'curl/curl_d.stub', 'CURL_RTSPREQ_GET_PARAMETER' => 'curl/curl_d.stub', 'CURL_RTSPREQ_OPTIONS' => 'curl/curl_d.stub', 'CURL_RTSPREQ_PAUSE' => 'curl/curl_d.stub', 'CURL_RTSPREQ_PLAY' => 'curl/curl_d.stub', 'CURL_RTSPREQ_RECEIVE' => 'curl/curl_d.stub', 'CURL_RTSPREQ_RECORD' => 'curl/curl_d.stub', 'CURL_RTSPREQ_SETUP' => 'curl/curl_d.stub', 'CURL_RTSPREQ_SET_PARAMETER' => 'curl/curl_d.stub', 'CURL_RTSPREQ_TEARDOWN' => 'curl/curl_d.stub', 'CURL_SSLVERSION_DEFAULT' => 'curl/curl_d.stub', 'CURL_SSLVERSION_MAX_DEFAULT' => 'curl/curl_d.stub', 'CURL_SSLVERSION_MAX_NONE' => 'curl/curl_d.stub', 'CURL_SSLVERSION_MAX_TLSv1_0' => 'curl/curl_d.stub', 'CURL_SSLVERSION_MAX_TLSv1_1' => 'curl/curl_d.stub', 'CURL_SSLVERSION_MAX_TLSv1_2' => 'curl/curl_d.stub', 'CURL_SSLVERSION_MAX_TLSv1_3' => 'curl/curl_d.stub', 'CURL_SSLVERSION_SSLv2' => 'curl/curl_d.stub', 'CURL_SSLVERSION_SSLv3' => 'curl/curl_d.stub', 'CURL_SSLVERSION_TLSv1' => 'curl/curl_d.stub', 'CURL_SSLVERSION_TLSv1_0' => 'curl/curl_d.stub', 'CURL_SSLVERSION_TLSv1_1' => 'curl/curl_d.stub', 'CURL_SSLVERSION_TLSv1_2' => 'curl/curl_d.stub', 'CURL_SSLVERSION_TLSv1_3' => 'curl/curl_d.stub', 'CURL_TIMECOND_IFMODSINCE' => 'curl/curl_d.stub', 'CURL_TIMECOND_IFUNMODSINCE' => 'curl/curl_d.stub', 'CURL_TIMECOND_LASTMOD' => 'curl/curl_d.stub', 'CURL_TIMECOND_NONE' => 'curl/curl_d.stub', 'CURL_TLSAUTH_SRP' => 'curl/curl_d.stub', 'CURL_VERSION_ALTSVC' => 'curl/curl_d.stub', 'CURL_VERSION_ASYNCHDNS' => 'curl/curl_d.stub', 'CURL_VERSION_BROTLI' => 'curl/curl_d.stub', 'CURL_VERSION_CONV' => 'curl/curl_d.stub', 'CURL_VERSION_CURLDEBUG' => 'curl/curl_d.stub', 'CURL_VERSION_DEBUG' => 'curl/curl_d.stub', 'CURL_VERSION_GSASL' => 'curl/curl_d.stub', 'CURL_VERSION_GSSAPI' => 'curl/curl_d.stub', 'CURL_VERSION_GSSNEGOTIATE' => 'curl/curl_d.stub', 'CURL_VERSION_HSTS' => 'curl/curl_d.stub', 'CURL_VERSION_HTTP2' => 'curl/curl_d.stub', 'CURL_VERSION_HTTP3' => 'curl/curl_d.stub', 'CURL_VERSION_HTTPS_PROXY' => 'curl/curl_d.stub', 'CURL_VERSION_IDN' => 'curl/curl_d.stub', 'CURL_VERSION_IPV6' => 'curl/curl_d.stub', 'CURL_VERSION_KERBEROS4' => 'curl/curl_d.stub', 'CURL_VERSION_KERBEROS5' => 'curl/curl_d.stub', 'CURL_VERSION_LARGEFILE' => 'curl/curl_d.stub', 'CURL_VERSION_LIBZ' => 'curl/curl_d.stub', 'CURL_VERSION_MULTI_SSL' => 'curl/curl_d.stub', 'CURL_VERSION_NTLM' => 'curl/curl_d.stub', 'CURL_VERSION_NTLM_WB' => 'curl/curl_d.stub', 'CURL_VERSION_PSL' => 'curl/curl_d.stub', 'CURL_VERSION_SPNEGO' => 'curl/curl_d.stub', 'CURL_VERSION_SSL' => 'curl/curl_d.stub', 'CURL_VERSION_SSPI' => 'curl/curl_d.stub', 'CURL_VERSION_TLSAUTH_SRP' => 'curl/curl_d.stub', 'CURL_VERSION_UNICODE' => 'curl/curl_d.stub', 'CURL_VERSION_UNIX_SOCKETS' => 'curl/curl_d.stub', 'CURL_VERSION_ZSTD' => 'curl/curl_d.stub', 'CURL_WRITEFUNC_PAUSE' => 'curl/curl_d.stub', 'CURRENCY_SYMBOL' => 'standard/standard_defines.stub', 'CYAN' => 'winbinder/winbinder.stub', 'Calendar' => 'winbinder/winbinder.stub', 'CheckBox' => 'winbinder/winbinder.stub', 'ComboBox' => 'winbinder/winbinder.stub', 'DARKBLUE' => 'winbinder/winbinder.stub', 'DARKCYAN' => 'winbinder/winbinder.stub', 'DARKGRAY' => 'winbinder/winbinder.stub', 'DARKGREEN' => 'winbinder/winbinder.stub', 'DARKMAGENTA' => 'winbinder/winbinder.stub', 'DARKRED' => 'winbinder/winbinder.stub', 'DARKYELLOW' => 'winbinder/winbinder.stub', 'DATE_ATOM' => 'date/date_d.stub', 'DATE_COOKIE' => 'date/date_d.stub', 'DATE_ISO8601' => 'date/date_d.stub', 'DATE_ISO8601_EXPANDED' => 'date/date_d.stub', 'DATE_RFC1036' => 'date/date_d.stub', 'DATE_RFC1123' => 'date/date_d.stub', 'DATE_RFC2822' => 'date/date_d.stub', 'DATE_RFC3339' => 'date/date_d.stub', 'DATE_RFC3339_EXTENDED' => 'date/date_d.stub', 'DATE_RFC7231' => 'date/date_d.stub', 'DATE_RFC822' => 'date/date_d.stub', 'DATE_RFC850' => 'date/date_d.stub', 'DATE_RSS' => 'date/date_d.stub', 'DATE_W3C' => 'date/date_d.stub', 'DAY_1' => 'standard/standard_defines.stub', 'DAY_2' => 'standard/standard_defines.stub', 'DAY_3' => 'standard/standard_defines.stub', 'DAY_4' => 'standard/standard_defines.stub', 'DAY_5' => 'standard/standard_defines.stub', 'DAY_6' => 'standard/standard_defines.stub', 'DAY_7' => 'standard/standard_defines.stub', 'DB2_AUTOCOMMIT_OFF' => 'ibm_db2/ibm_db2.stub', 'DB2_AUTOCOMMIT_ON' => 'ibm_db2/ibm_db2.stub', 'DB2_BINARY' => 'ibm_db2/ibm_db2.stub', 'DB2_CASE_LOWER' => 'ibm_db2/ibm_db2.stub', 'DB2_CASE_NATURAL' => 'ibm_db2/ibm_db2.stub', 'DB2_CASE_UPPER' => 'ibm_db2/ibm_db2.stub', 'DB2_CHAR' => 'ibm_db2/ibm_db2.stub', 'DB2_CONVERT' => 'ibm_db2/ibm_db2.stub', 'DB2_DEFERRED_PREPARE_OFF' => 'ibm_db2/ibm_db2.stub', 'DB2_DEFERRED_PREPARE_ON' => 'ibm_db2/ibm_db2.stub', 'DB2_DOUBLE' => 'ibm_db2/ibm_db2.stub', 'DB2_FORWARD_ONLY' => 'ibm_db2/ibm_db2.stub', 'DB2_LONG' => 'ibm_db2/ibm_db2.stub', 'DB2_PARAM_FILE' => 'ibm_db2/ibm_db2.stub', 'DB2_PARAM_IN' => 'ibm_db2/ibm_db2.stub', 'DB2_PARAM_INOUT' => 'ibm_db2/ibm_db2.stub', 'DB2_PARAM_OUT' => 'ibm_db2/ibm_db2.stub', 'DB2_PASSTHRU' => 'ibm_db2/ibm_db2.stub', 'DB2_SCROLLABLE' => 'ibm_db2/ibm_db2.stub', 'DB2_XML' => 'ibm_db2/ibm_db2.stub', 'DBA_LMDB_NO_SUB_DIR' => 'dba/dba.stub', 'DBA_LMDB_USE_SUB_DIR' => 'dba/dba.stub', 'DEBUG_BACKTRACE_IGNORE_ARGS' => 'Core/Core_d.stub', 'DEBUG_BACKTRACE_PROVIDE_OBJECT' => 'Core/Core_d.stub', 'DECIMAL_POINT' => 'standard/standard_defines.stub', 'DEFAULT_INCLUDE_PATH' => 'Core/Core_d.stub', 'DIRECTORY_SEPARATOR' => 'standard/standard_defines.stub', 'DISP_E_DIVBYZERO' => 'com_dotnet/com_dotnet.stub', 'DISP_E_OVERFLOW' => 'com_dotnet/com_dotnet.stub', 'DNS_A' => 'standard/standard_defines.stub', 'DNS_A6' => 'standard/standard_defines.stub', 'DNS_AAAA' => 'standard/standard_defines.stub', 'DNS_ALL' => 'standard/standard_defines.stub', 'DNS_ANY' => 'standard/standard_defines.stub', 'DNS_CAA' => 'standard/standard_defines.stub', 'DNS_CNAME' => 'standard/standard_defines.stub', 'DNS_HINFO' => 'standard/standard_defines.stub', 'DNS_MX' => 'standard/standard_defines.stub', 'DNS_NAPTR' => 'standard/standard_defines.stub', 'DNS_NS' => 'standard/standard_defines.stub', 'DNS_PTR' => 'standard/standard_defines.stub', 'DNS_SOA' => 'standard/standard_defines.stub', 'DNS_SRV' => 'standard/standard_defines.stub', 'DNS_TXT' => 'standard/standard_defines.stub', 'DOMSTRING_SIZE_ERR' => 'dom/dom.stub', 'DOM_HIERARCHY_REQUEST_ERR' => 'dom/dom.stub', 'DOM_INDEX_SIZE_ERR' => 'dom/dom.stub', 'DOM_INUSE_ATTRIBUTE_ERR' => 'dom/dom.stub', 'DOM_INVALID_ACCESS_ERR' => 'dom/dom.stub', 'DOM_INVALID_CHARACTER_ERR' => 'dom/dom.stub', 'DOM_INVALID_MODIFICATION_ERR' => 'dom/dom.stub', 'DOM_INVALID_STATE_ERR' => 'dom/dom.stub', 'DOM_NAMESPACE_ERR' => 'dom/dom.stub', 'DOM_NOT_FOUND_ERR' => 'dom/dom.stub', 'DOM_NOT_SUPPORTED_ERR' => 'dom/dom.stub', 'DOM_NO_DATA_ALLOWED_ERR' => 'dom/dom.stub', 'DOM_NO_MODIFICATION_ALLOWED_ERR' => 'dom/dom.stub', 'DOM_PHP_ERR' => 'dom/dom.stub', 'DOM_SYNTAX_ERR' => 'dom/dom.stub', 'DOM_VALIDATION_ERR' => 'dom/dom.stub', 'DOM_WRONG_DOCUMENT_ERR' => 'dom/dom.stub', 'D_FMT' => 'standard/standard_defines.stub', 'D_T_FMT' => 'standard/standard_defines.stub', 'Dom\\HIERARCHY_REQUEST_ERR' => 'dom/dom_n.stub', 'Dom\\HTML_NO_DEFAULT_NS' => 'dom/dom_n.stub', 'Dom\\INDEX_SIZE_ERR' => 'dom/dom_n.stub', 'Dom\\INUSE_ATTRIBUTE_ERR' => 'dom/dom_n.stub', 'Dom\\INVALID_CHARACTER_ERR' => 'dom/dom_n.stub', 'Dom\\INVALID_MODIFICATION_ERR' => 'dom/dom_n.stub', 'Dom\\INVALID_STATE_ERR' => 'dom/dom_n.stub', 'Dom\\NAMESPACE_ERR' => 'dom/dom_n.stub', 'Dom\\NOT_FOUND_ERR' => 'dom/dom_n.stub', 'Dom\\NOT_SUPPORTED_ERR' => 'dom/dom_n.stub', 'Dom\\NO_DATA_ALLOWED_ERR' => 'dom/dom_n.stub', 'Dom\\NO_MODIFICATION_ALLOWED_ERR' => 'dom/dom_n.stub', 'Dom\\STRING_SIZE_ERR' => 'dom/dom_n.stub', 'Dom\\SYNTAX_ERR' => 'dom/dom_n.stub', 'Dom\\VALIDATION_ERR' => 'dom/dom_n.stub', 'Dom\\WRONG_DOCUMENT_ERR' => 'dom/dom_n.stub', 'EIO_DEBUG' => 'eio/eio.stub', 'EIO_DT_BLK' => 'eio/eio.stub', 'EIO_DT_CHR' => 'eio/eio.stub', 'EIO_DT_CMP' => 'eio/eio.stub', 'EIO_DT_DIR' => 'eio/eio.stub', 'EIO_DT_DOOR' => 'eio/eio.stub', 'EIO_DT_FIFO' => 'eio/eio.stub', 'EIO_DT_LNK' => 'eio/eio.stub', 'EIO_DT_MAX' => 'eio/eio.stub', 'EIO_DT_MPB' => 'eio/eio.stub', 'EIO_DT_MPC' => 'eio/eio.stub', 'EIO_DT_NAM' => 'eio/eio.stub', 'EIO_DT_NWK' => 'eio/eio.stub', 'EIO_DT_REG' => 'eio/eio.stub', 'EIO_DT_SOCK' => 'eio/eio.stub', 'EIO_DT_UNKNOWN' => 'eio/eio.stub', 'EIO_DT_WHT' => 'eio/eio.stub', 'EIO_FALLOC_FL_KEEP_SIZE' => 'eio/eio.stub', 'EIO_O_APPEND' => 'eio/eio.stub', 'EIO_O_CREAT' => 'eio/eio.stub', 'EIO_O_EXCL' => 'eio/eio.stub', 'EIO_O_FSYNC' => 'eio/eio.stub', 'EIO_O_NONBLOCK' => 'eio/eio.stub', 'EIO_O_RDONLY' => 'eio/eio.stub', 'EIO_O_RDWR' => 'eio/eio.stub', 'EIO_O_TRUNC' => 'eio/eio.stub', 'EIO_O_WRONLY' => 'eio/eio.stub', 'EIO_PRI_DEFAULT' => 'eio/eio.stub', 'EIO_PRI_MAX' => 'eio/eio.stub', 'EIO_PRI_MIN' => 'eio/eio.stub', 'EIO_READDIR_DENTS' => 'eio/eio.stub', 'EIO_READDIR_DIRS_FIRST' => 'eio/eio.stub', 'EIO_READDIR_FOUND_UNKNOWN' => 'eio/eio.stub', 'EIO_READDIR_STAT_ORDER' => 'eio/eio.stub', 'EIO_SEEK_CUR' => 'eio/eio.stub', 'EIO_SEEK_END' => 'eio/eio.stub', 'EIO_SEEK_SET' => 'eio/eio.stub', 'EIO_SYNC_FILE_RANGE_WAIT_AFTER' => 'eio/eio.stub', 'EIO_SYNC_FILE_RANGE_WAIT_BEFORE' => 'eio/eio.stub', 'EIO_SYNC_FILE_RANGE_WRITE' => 'eio/eio.stub', 'EIO_S_IFBLK' => 'eio/eio.stub', 'EIO_S_IFCHR' => 'eio/eio.stub', 'EIO_S_IFIFO' => 'eio/eio.stub', 'EIO_S_IFREG' => 'eio/eio.stub', 'EIO_S_IFSOCK' => 'eio/eio.stub', 'EIO_S_IRGRP' => 'eio/eio.stub', 'EIO_S_IROTH' => 'eio/eio.stub', 'EIO_S_IRUSR' => 'eio/eio.stub', 'EIO_S_IWGRP' => 'eio/eio.stub', 'EIO_S_IWOTH' => 'eio/eio.stub', 'EIO_S_IWUSR' => 'eio/eio.stub', 'EIO_S_IXGRP' => 'eio/eio.stub', 'EIO_S_IXOTH' => 'eio/eio.stub', 'EIO_S_IXUSR' => 'eio/eio.stub', 'ENC7BIT' => 'imap/imap.stub', 'ENC8BIT' => 'imap/imap.stub', 'ENCBASE64' => 'imap/imap.stub', 'ENCBINARY' => 'imap/imap.stub', 'ENCHANT_ISPELL' => 'enchant/enchant.stub', 'ENCHANT_MYSPELL' => 'enchant/enchant.stub', 'ENCOTHER' => 'imap/imap.stub', 'ENCQUOTEDPRINTABLE' => 'imap/imap.stub', 'ENT_COMPAT' => 'standard/standard_defines.stub', 'ENT_DISALLOWED' => 'standard/standard_defines.stub', 'ENT_HTML401' => 'standard/standard_defines.stub', 'ENT_HTML5' => 'standard/standard_defines.stub', 'ENT_IGNORE' => 'standard/standard_defines.stub', 'ENT_NOQUOTES' => 'standard/standard_defines.stub', 'ENT_QUOTES' => 'standard/standard_defines.stub', 'ENT_SUBSTITUTE' => 'standard/standard_defines.stub', 'ENT_XHTML' => 'standard/standard_defines.stub', 'ENT_XML1' => 'standard/standard_defines.stub', 'ERA' => 'standard/standard_defines.stub', 'ERA_D_FMT' => 'standard/standard_defines.stub', 'ERA_D_T_FMT' => 'standard/standard_defines.stub', 'ERA_T_FMT' => 'standard/standard_defines.stub', 'ERA_YEAR' => 'standard/standard_defines.stub', 'EVBUFFER_EOF' => 'libevent/libevent.stub', 'EVBUFFER_ERROR' => 'libevent/libevent.stub', 'EVBUFFER_READ' => 'libevent/libevent.stub', 'EVBUFFER_TIMEOUT' => 'libevent/libevent.stub', 'EVBUFFER_WRITE' => 'libevent/libevent.stub', 'EVLOOP_NONBLOCK' => 'libevent/libevent.stub', 'EVLOOP_ONCE' => 'libevent/libevent.stub', 'EV_PERSIST' => 'libevent/libevent.stub', 'EV_READ' => 'libevent/libevent.stub', 'EV_SIGNAL' => 'libevent/libevent.stub', 'EV_TIMEOUT' => 'libevent/libevent.stub', 'EV_WRITE' => 'libevent/libevent.stub', 'EXIF_USE_MBSTRING' => 'exif/exif.stub', 'EXP_EOF' => 'expect/expect.stub', 'EXP_EXACT' => 'expect/expect.stub', 'EXP_FULLBUFFER' => 'expect/expect.stub', 'EXP_GLOB' => 'expect/expect.stub', 'EXP_REGEXP' => 'expect/expect.stub', 'EXP_TIMEOUT' => 'expect/expect.stub', 'EXTR_IF_EXISTS' => 'standard/standard_defines.stub', 'EXTR_OVERWRITE' => 'standard/standard_defines.stub', 'EXTR_PREFIX_ALL' => 'standard/standard_defines.stub', 'EXTR_PREFIX_IF_EXISTS' => 'standard/standard_defines.stub', 'EXTR_PREFIX_INVALID' => 'standard/standard_defines.stub', 'EXTR_PREFIX_SAME' => 'standard/standard_defines.stub', 'EXTR_REFS' => 'standard/standard_defines.stub', 'EXTR_SKIP' => 'standard/standard_defines.stub', 'E_ALL' => 'Core/Core_d.stub', 'E_COMPILE_ERROR' => 'Core/Core_d.stub', 'E_COMPILE_WARNING' => 'Core/Core_d.stub', 'E_CORE_ERROR' => 'Core/Core_d.stub', 'E_CORE_WARNING' => 'Core/Core_d.stub', 'E_DEPRECATED' => 'Core/Core_d.stub', 'E_ERROR' => 'Core/Core_d.stub', 'E_NOTICE' => 'Core/Core_d.stub', 'E_PARSE' => 'Core/Core_d.stub', 'E_RECOVERABLE_ERROR' => 'Core/Core_d.stub', 'E_STRICT' => 'Core/Core_d.stub', 'E_USER_DEPRECATED' => 'Core/Core_d.stub', 'E_USER_ERROR' => 'Core/Core_d.stub', 'E_USER_NOTICE' => 'Core/Core_d.stub', 'E_USER_WARNING' => 'Core/Core_d.stub', 'E_WARNING' => 'Core/Core_d.stub', 'EditBox' => 'winbinder/winbinder.stub', 'FANN_COS' => 'fann/fann.stub', 'FANN_COS_SYMMETRIC' => 'fann/fann.stub', 'FANN_ELLIOT' => 'fann/fann.stub', 'FANN_ELLIOT_SYMMETRIC' => 'fann/fann.stub', 'FANN_ERRORFUNC_LINEAR' => 'fann/fann.stub', 'FANN_ERRORFUNC_TANH' => 'fann/fann.stub', 'FANN_E_CANT_ALLOCATE_MEM' => 'fann/fann.stub', 'FANN_E_CANT_OPEN_CONFIG_R' => 'fann/fann.stub', 'FANN_E_CANT_OPEN_CONFIG_W' => 'fann/fann.stub', 'FANN_E_CANT_OPEN_TD_R' => 'fann/fann.stub', 'FANN_E_CANT_OPEN_TD_W' => 'fann/fann.stub', 'FANN_E_CANT_READ_CONFIG' => 'fann/fann.stub', 'FANN_E_CANT_READ_CONNECTIONS' => 'fann/fann.stub', 'FANN_E_CANT_READ_NEURON' => 'fann/fann.stub', 'FANN_E_CANT_READ_TD' => 'fann/fann.stub', 'FANN_E_CANT_TRAIN_ACTIVATION' => 'fann/fann.stub', 'FANN_E_CANT_USE_ACTIVATION' => 'fann/fann.stub', 'FANN_E_CANT_USE_TRAIN_ALG' => 'fann/fann.stub', 'FANN_E_INDEX_OUT_OF_BOUND' => 'fann/fann.stub', 'FANN_E_INPUT_NO_MATCH' => 'fann/fann.stub', 'FANN_E_NO_ERROR' => 'fann/fann.stub', 'FANN_E_OUTPUT_NO_MATCH' => 'fann/fann.stub', 'FANN_E_SCALE_NOT_PRESENT' => 'fann/fann.stub', 'FANN_E_TRAIN_DATA_MISMATCH' => 'fann/fann.stub', 'FANN_E_TRAIN_DATA_SUBSET' => 'fann/fann.stub', 'FANN_E_WRONG_CONFIG_VERSION' => 'fann/fann.stub', 'FANN_E_WRONG_NUM_CONNECTIONS' => 'fann/fann.stub', 'FANN_GAUSSIAN' => 'fann/fann.stub', 'FANN_GAUSSIAN_STEPWISE' => 'fann/fann.stub', 'FANN_GAUSSIAN_SYMMETRIC' => 'fann/fann.stub', 'FANN_LINEAR' => 'fann/fann.stub', 'FANN_LINEAR_PIECE' => 'fann/fann.stub', 'FANN_LINEAR_PIECE_SYMMETRIC' => 'fann/fann.stub', 'FANN_NETTYPE_LAYER' => 'fann/fann.stub', 'FANN_NETTYPE_SHORTCUT' => 'fann/fann.stub', 'FANN_SIGMOID' => 'fann/fann.stub', 'FANN_SIGMOID_STEPWISE' => 'fann/fann.stub', 'FANN_SIGMOID_SYMMETRIC' => 'fann/fann.stub', 'FANN_SIGMOID_SYMMETRIC_STEPWISE' => 'fann/fann.stub', 'FANN_SIN' => 'fann/fann.stub', 'FANN_SIN_SYMMETRIC' => 'fann/fann.stub', 'FANN_STOPFUNC_BIT' => 'fann/fann.stub', 'FANN_STOPFUNC_MSE' => 'fann/fann.stub', 'FANN_THRESHOLD' => 'fann/fann.stub', 'FANN_THRESHOLD_SYMMETRIC' => 'fann/fann.stub', 'FANN_TRAIN_BATCH' => 'fann/fann.stub', 'FANN_TRAIN_INCREMENTAL' => 'fann/fann.stub', 'FANN_TRAIN_QUICKPROP' => 'fann/fann.stub', 'FANN_TRAIN_RPROP' => 'fann/fann.stub', 'FANN_TRAIN_SARPROP' => 'fann/fann.stub', 'FANN_VERSION' => 'fann/fann.stub', 'FILEINFO_APPLE' => 'fileinfo/fileinfo.stub', 'FILEINFO_CONTINUE' => 'fileinfo/fileinfo.stub', 'FILEINFO_DEVICES' => 'fileinfo/fileinfo.stub', 'FILEINFO_EXTENSION' => 'fileinfo/fileinfo.stub', 'FILEINFO_MIME' => 'fileinfo/fileinfo.stub', 'FILEINFO_MIME_ENCODING' => 'fileinfo/fileinfo.stub', 'FILEINFO_MIME_TYPE' => 'fileinfo/fileinfo.stub', 'FILEINFO_NONE' => 'fileinfo/fileinfo.stub', 'FILEINFO_PRESERVE_ATIME' => 'fileinfo/fileinfo.stub', 'FILEINFO_RAW' => 'fileinfo/fileinfo.stub', 'FILEINFO_SYMLINK' => 'fileinfo/fileinfo.stub', 'FILE_APPEND' => 'standard/standard_defines.stub', 'FILE_BINARY' => 'standard/standard_defines.stub', 'FILE_IGNORE_NEW_LINES' => 'standard/standard_defines.stub', 'FILE_NO_DEFAULT_CONTEXT' => 'standard/standard_defines.stub', 'FILE_SKIP_EMPTY_LINES' => 'standard/standard_defines.stub', 'FILE_TEXT' => 'standard/standard_defines.stub', 'FILE_USE_INCLUDE_PATH' => 'standard/standard_defines.stub', 'FILTER_CALLBACK' => 'filter/filter.stub', 'FILTER_DEFAULT' => 'filter/filter.stub', 'FILTER_FLAG_ALLOW_FRACTION' => 'filter/filter.stub', 'FILTER_FLAG_ALLOW_HEX' => 'filter/filter.stub', 'FILTER_FLAG_ALLOW_OCTAL' => 'filter/filter.stub', 'FILTER_FLAG_ALLOW_SCIENTIFIC' => 'filter/filter.stub', 'FILTER_FLAG_ALLOW_THOUSAND' => 'filter/filter.stub', 'FILTER_FLAG_EMAIL_UNICODE' => 'filter/filter.stub', 'FILTER_FLAG_EMPTY_STRING_NULL' => 'filter/filter.stub', 'FILTER_FLAG_ENCODE_AMP' => 'filter/filter.stub', 'FILTER_FLAG_ENCODE_HIGH' => 'filter/filter.stub', 'FILTER_FLAG_ENCODE_LOW' => 'filter/filter.stub', 'FILTER_FLAG_GLOBAL_RANGE' => 'filter/filter.stub', 'FILTER_FLAG_HOSTNAME' => 'filter/filter.stub', 'FILTER_FLAG_HOST_REQUIRED' => 'filter/filter.stub', 'FILTER_FLAG_IPV4' => 'filter/filter.stub', 'FILTER_FLAG_IPV6' => 'filter/filter.stub', 'FILTER_FLAG_NONE' => 'filter/filter.stub', 'FILTER_FLAG_NO_ENCODE_QUOTES' => 'filter/filter.stub', 'FILTER_FLAG_NO_PRIV_RANGE' => 'filter/filter.stub', 'FILTER_FLAG_NO_RES_RANGE' => 'filter/filter.stub', 'FILTER_FLAG_PATH_REQUIRED' => 'filter/filter.stub', 'FILTER_FLAG_QUERY_REQUIRED' => 'filter/filter.stub', 'FILTER_FLAG_SCHEME_REQUIRED' => 'filter/filter.stub', 'FILTER_FLAG_STRIP_BACKTICK' => 'filter/filter.stub', 'FILTER_FLAG_STRIP_HIGH' => 'filter/filter.stub', 'FILTER_FLAG_STRIP_LOW' => 'filter/filter.stub', 'FILTER_FORCE_ARRAY' => 'filter/filter.stub', 'FILTER_NULL_ON_FAILURE' => 'filter/filter.stub', 'FILTER_REQUIRE_ARRAY' => 'filter/filter.stub', 'FILTER_REQUIRE_SCALAR' => 'filter/filter.stub', 'FILTER_SANITIZE_ADD_SLASHES' => 'filter/filter.stub', 'FILTER_SANITIZE_EMAIL' => 'filter/filter.stub', 'FILTER_SANITIZE_ENCODED' => 'filter/filter.stub', 'FILTER_SANITIZE_FULL_SPECIAL_CHARS' => 'filter/filter.stub', 'FILTER_SANITIZE_MAGIC_QUOTES' => 'filter/filter.stub', 'FILTER_SANITIZE_NUMBER_FLOAT' => 'filter/filter.stub', 'FILTER_SANITIZE_NUMBER_INT' => 'filter/filter.stub', 'FILTER_SANITIZE_SPECIAL_CHARS' => 'filter/filter.stub', 'FILTER_SANITIZE_STRING' => 'filter/filter.stub', 'FILTER_SANITIZE_STRIPPED' => 'filter/filter.stub', 'FILTER_SANITIZE_URL' => 'filter/filter.stub', 'FILTER_UNSAFE_RAW' => 'filter/filter.stub', 'FILTER_VALIDATE_BOOL' => 'filter/filter.stub', 'FILTER_VALIDATE_BOOLEAN' => 'filter/filter.stub', 'FILTER_VALIDATE_DOMAIN' => 'filter/filter.stub', 'FILTER_VALIDATE_EMAIL' => 'filter/filter.stub', 'FILTER_VALIDATE_FLOAT' => 'filter/filter.stub', 'FILTER_VALIDATE_INT' => 'filter/filter.stub', 'FILTER_VALIDATE_IP' => 'filter/filter.stub', 'FILTER_VALIDATE_MAC' => 'filter/filter.stub', 'FILTER_VALIDATE_REGEXP' => 'filter/filter.stub', 'FILTER_VALIDATE_URL' => 'filter/filter.stub', 'FNM_CASEFOLD' => 'standard/standard_defines.stub', 'FNM_NOESCAPE' => 'standard/standard_defines.stub', 'FNM_PATHNAME' => 'standard/standard_defines.stub', 'FNM_PERIOD' => 'standard/standard_defines.stub', 'FORCE_DEFLATE' => 'zlib/zlib.stub', 'FORCE_GZIP' => 'zlib/zlib.stub', 'FPE_FLTDIV' => 'pcntl/pcntl.stub', 'FPE_FLTINV' => 'pcntl/pcntl.stub', 'FPE_FLTOVF' => 'pcntl/pcntl.stub', 'FPE_FLTRES' => 'pcntl/pcntl.stub', 'FPE_FLTSUB' => 'pcntl/pcntl.stub', 'FPE_FLTUND' => 'pcntl/pcntl.stub', 'FPE_INTDIV' => 'pcntl/pcntl.stub', 'FPE_INTOVF' => 'pcntl/pcntl.stub', 'FRAC_DIGITS' => 'standard/standard_defines.stub', 'FTA_BOLD' => 'winbinder/winbinder.stub', 'FTA_ITALIC' => 'winbinder/winbinder.stub', 'FTA_NORMAL' => 'winbinder/winbinder.stub', 'FTA_REGULAR' => 'winbinder/winbinder.stub', 'FTA_STRIKEOUT' => 'winbinder/winbinder.stub', 'FTA_UNDERLINE' => 'winbinder/winbinder.stub', 'FTP_ASCII' => 'ftp/ftp.stub', 'FTP_AUTORESUME' => 'ftp/ftp.stub', 'FTP_AUTOSEEK' => 'ftp/ftp.stub', 'FTP_BINARY' => 'ftp/ftp.stub', 'FTP_FAILED' => 'ftp/ftp.stub', 'FTP_FINISHED' => 'ftp/ftp.stub', 'FTP_IMAGE' => 'ftp/ftp.stub', 'FTP_MOREDATA' => 'ftp/ftp.stub', 'FTP_TEXT' => 'ftp/ftp.stub', 'FTP_TIMEOUT_SEC' => 'ftp/ftp.stub', 'FTP_USEPASVADDRESS' => 'ftp/ftp.stub', 'FT_INTERNAL' => 'imap/imap.stub', 'FT_NOT' => 'imap/imap.stub', 'FT_PEEK' => 'imap/imap.stub', 'FT_PREFETCHTEXT' => 'imap/imap.stub', 'FT_UID' => 'imap/imap.stub', 'F_DUPFD' => 'dio/dio_d.stub', 'F_GETFD' => 'dio/dio_d.stub', 'F_GETFL' => 'dio/dio_d.stub', 'F_GETLK' => 'dio/dio_d.stub', 'F_GETOWN' => 'dio/dio_d.stub', 'F_RDLCK' => 'dio/dio_d.stub', 'F_SETFL' => 'dio/dio_d.stub', 'F_SETLK' => 'dio/dio_d.stub', 'F_SETLKW' => 'dio/dio_d.stub', 'F_SETOWN' => 'dio/dio_d.stub', 'F_UNLCK' => 'dio/dio_d.stub', 'F_WRLCK' => 'dio/dio_d.stub', 'Frame' => 'winbinder/winbinder.stub', 'GD_BUNDLED' => 'gd/gd.stub', 'GD_EXTRA_VERSION' => 'gd/gd.stub', 'GD_MAJOR_VERSION' => 'gd/gd.stub', 'GD_MINOR_VERSION' => 'gd/gd.stub', 'GD_RELEASE_VERSION' => 'gd/gd.stub', 'GD_VERSION' => 'gd/gd.stub', 'GEARMAN_ARGS_BUFFER_SIZE' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_ALLOCATED' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_FREE_TASKS' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_NON_BLOCKING' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_NO_NEW' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_STATE_IDLE' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_STATE_NEW' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_STATE_PACKET' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_STATE_SUBMIT' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_TASK_IN_USE' => 'gearman/gearman.stub', 'GEARMAN_CLIENT_UNBUFFERED_RESULT' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_ALL_YOURS' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_CANT_DO' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_CAN_DO' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_CAN_DO_TIMEOUT' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_ECHO_REQ' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_ECHO_RES' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_ERROR' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_GET_STATUS' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_GRAB_JOB' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_GRAB_JOB_UNIQ' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_JOB_ASSIGN' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_JOB_ASSIGN_UNIQ' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_JOB_CREATED' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_MAX' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_NOOP' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_NO_JOB' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_OPTION_REQ' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_OPTION_RES' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_PRE_SLEEP' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_RESET_ABILITIES' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SET_CLIENT_ID' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_STATUS_RES' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_BG' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_EPOCH' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_HIGH' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_HIGH_BG' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_LOW' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_LOW_BG' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_SUBMIT_JOB_SCHED' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_TEXT' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_UNUSED' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_WORK_COMPLETE' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_WORK_DATA' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_WORK_EXCEPTION' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_WORK_FAIL' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_WORK_STATUS' => 'gearman/gearman.stub', 'GEARMAN_COMMAND_WORK_WARNING' => 'gearman/gearman.stub', 'GEARMAN_CON_CLOSE_AFTER_FLUSH' => 'gearman/gearman.stub', 'GEARMAN_CON_EXTERNAL_FD' => 'gearman/gearman.stub', 'GEARMAN_CON_IGNORE_LOST_CONNECTION' => 'gearman/gearman.stub', 'GEARMAN_CON_PACKET_IN_USE' => 'gearman/gearman.stub', 'GEARMAN_CON_READY' => 'gearman/gearman.stub', 'GEARMAN_CON_RECV_STATE_READ_DATA' => 'gearman/gearman.stub', 'GEARMAN_CON_SEND_STATE_NONE' => 'gearman/gearman.stub', 'GEARMAN_COULD_NOT_CONNECT' => 'gearman/gearman.stub', 'GEARMAN_DATA_TOO_LARGE' => 'gearman/gearman.stub', 'GEARMAN_DEFAULT_SOCKET_RECV_SIZE' => 'gearman/gearman.stub', 'GEARMAN_DEFAULT_SOCKET_SEND_SIZE' => 'gearman/gearman.stub', 'GEARMAN_DEFAULT_SOCKET_TIMEOUT' => 'gearman/gearman.stub', 'GEARMAN_DEFAULT_TCP_HOST' => 'gearman/gearman.stub', 'GEARMAN_DEFAULT_TCP_PORT' => 'gearman/gearman.stub', 'GEARMAN_DONT_TRACK_PACKETS' => 'gearman/gearman.stub', 'GEARMAN_ECHO_DATA_CORRUPTION' => 'gearman/gearman.stub', 'GEARMAN_ERRNO' => 'gearman/gearman.stub', 'GEARMAN_EVENT' => 'gearman/gearman.stub', 'GEARMAN_FLUSH_DATA' => 'gearman/gearman.stub', 'GEARMAN_GETADDRINFO' => 'gearman/gearman.stub', 'GEARMAN_IGNORE_PACKET' => 'gearman/gearman.stub', 'GEARMAN_INVALID_COMMAND' => 'gearman/gearman.stub', 'GEARMAN_INVALID_FUNCTION_NAME' => 'gearman/gearman.stub', 'GEARMAN_INVALID_MAGIC' => 'gearman/gearman.stub', 'GEARMAN_INVALID_PACKET' => 'gearman/gearman.stub', 'GEARMAN_INVALID_WORKER_FUNCTION' => 'gearman/gearman.stub', 'GEARMAN_IO_WAIT' => 'gearman/gearman.stub', 'GEARMAN_JOB_EXISTS' => 'gearman/gearman.stub', 'GEARMAN_JOB_HANDLE_SIZE' => 'gearman/gearman.stub', 'GEARMAN_JOB_PRIORITY_HIGH' => 'gearman/gearman.stub', 'GEARMAN_JOB_PRIORITY_LOW' => 'gearman/gearman.stub', 'GEARMAN_JOB_PRIORITY_MAX' => 'gearman/gearman.stub', 'GEARMAN_JOB_PRIORITY_NORMAL' => 'gearman/gearman.stub', 'GEARMAN_JOB_QUEUE_FULL' => 'gearman/gearman.stub', 'GEARMAN_LOST_CONNECTION' => 'gearman/gearman.stub', 'GEARMAN_MAGIC_REQUEST' => 'gearman/gearman.stub', 'GEARMAN_MAGIC_RESPONSE' => 'gearman/gearman.stub', 'GEARMAN_MAGIC_TEXT' => 'gearman/gearman.stub', 'GEARMAN_MAX_COMMAND_ARGS' => 'gearman/gearman.stub', 'GEARMAN_MAX_ERROR_SIZE' => 'gearman/gearman.stub', 'GEARMAN_MAX_RETURN' => 'gearman/gearman.stub', 'GEARMAN_MEMORY_ALLOCATION_FAILURE' => 'gearman/gearman.stub', 'GEARMAN_NEED_WORKLOAD_FN' => 'gearman/gearman.stub', 'GEARMAN_NON_BLOCKING' => 'gearman/gearman.stub', 'GEARMAN_NOT_CONNECTED' => 'gearman/gearman.stub', 'GEARMAN_NOT_FLUSHING' => 'gearman/gearman.stub', 'GEARMAN_NO_ACTIVE_FDS' => 'gearman/gearman.stub', 'GEARMAN_NO_JOBS' => 'gearman/gearman.stub', 'GEARMAN_NO_REGISTERED_FUNCTIONS' => 'gearman/gearman.stub', 'GEARMAN_NO_SERVERS' => 'gearman/gearman.stub', 'GEARMAN_OPTION_SIZE' => 'gearman/gearman.stub', 'GEARMAN_PACKET_HEADER_SIZE' => 'gearman/gearman.stub', 'GEARMAN_PAUSE' => 'gearman/gearman.stub', 'GEARMAN_PIPE_EOF' => 'gearman/gearman.stub', 'GEARMAN_PTHREAD' => 'gearman/gearman.stub', 'GEARMAN_QUEUE_ERROR' => 'gearman/gearman.stub', 'GEARMAN_RECV_BUFFER_SIZE' => 'gearman/gearman.stub', 'GEARMAN_RECV_IN_PROGRESS' => 'gearman/gearman.stub', 'GEARMAN_SEND_BUFFER_SIZE' => 'gearman/gearman.stub', 'GEARMAN_SEND_BUFFER_TOO_SMALL' => 'gearman/gearman.stub', 'GEARMAN_SEND_IN_PROGRESS' => 'gearman/gearman.stub', 'GEARMAN_SERVER_ERROR' => 'gearman/gearman.stub', 'GEARMAN_SHUTDOWN' => 'gearman/gearman.stub', 'GEARMAN_SHUTDOWN_GRACEFUL' => 'gearman/gearman.stub', 'GEARMAN_SUCCESS' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_COMPLETE' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_CREATED' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_DATA' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_EXCEPTION' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_FAIL' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_FINISHED' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_NEW' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_STATUS' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_SUBMIT' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_WARNING' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_WORK' => 'gearman/gearman.stub', 'GEARMAN_TASK_STATE_WORKLOAD' => 'gearman/gearman.stub', 'GEARMAN_TIMEOUT' => 'gearman/gearman.stub', 'GEARMAN_TOO_MANY_ARGS' => 'gearman/gearman.stub', 'GEARMAN_UNEXPECTED_PACKET' => 'gearman/gearman.stub', 'GEARMAN_UNIQUE_SIZE' => 'gearman/gearman.stub', 'GEARMAN_UNKNOWN_OPTION' => 'gearman/gearman.stub', 'GEARMAN_UNKNOWN_STATE' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_CRAZY' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_DEBUG' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_ERROR' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_FATAL' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_INFO' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_MAX' => 'gearman/gearman.stub', 'GEARMAN_VERBOSE_NEVER' => 'gearman/gearman.stub', 'GEARMAN_WORKER_ALLOCATED' => 'gearman/gearman.stub', 'GEARMAN_WORKER_CHANGE' => 'gearman/gearman.stub', 'GEARMAN_WORKER_GRAB_JOB_IN_USE' => 'gearman/gearman.stub', 'GEARMAN_WORKER_GRAB_UNIQ' => 'gearman/gearman.stub', 'GEARMAN_WORKER_NON_BLOCKING' => 'gearman/gearman.stub', 'GEARMAN_WORKER_PACKET_INIT' => 'gearman/gearman.stub', 'GEARMAN_WORKER_PRE_SLEEP_IN_USE' => 'gearman/gearman.stub', 'GEARMAN_WORKER_STATE_CONNECT' => 'gearman/gearman.stub', 'GEARMAN_WORKER_STATE_FUNCTION_SEND' => 'gearman/gearman.stub', 'GEARMAN_WORKER_STATE_GRAB_JOB_RECV' => 'gearman/gearman.stub', 'GEARMAN_WORKER_STATE_GRAB_JOB_SEND' => 'gearman/gearman.stub', 'GEARMAN_WORKER_STATE_PRE_SLEEP' => 'gearman/gearman.stub', 'GEARMAN_WORKER_STATE_START' => 'gearman/gearman.stub', 'GEARMAN_WORKER_TIMEOUT_RETURN' => 'gearman/gearman.stub', 'GEARMAN_WORKER_WAIT_TIMEOUT' => 'gearman/gearman.stub', 'GEARMAN_WORKER_WORK_JOB_IN_USE' => 'gearman/gearman.stub', 'GEARMAN_WORK_DATA' => 'gearman/gearman.stub', 'GEARMAN_WORK_ERROR' => 'gearman/gearman.stub', 'GEARMAN_WORK_EXCEPTION' => 'gearman/gearman.stub', 'GEARMAN_WORK_FAIL' => 'gearman/gearman.stub', 'GEARMAN_WORK_STATUS' => 'gearman/gearman.stub', 'GEARMAN_WORK_WARNING' => 'gearman/gearman.stub', 'GEOIP_ASNUM_EDITION' => 'geoip/geoip.stub', 'GEOIP_CABLEDSL_SPEED' => 'geoip/geoip.stub', 'GEOIP_CITY_EDITION_REV0' => 'geoip/geoip.stub', 'GEOIP_CITY_EDITION_REV1' => 'geoip/geoip.stub', 'GEOIP_CORPORATE_SPEED' => 'geoip/geoip.stub', 'GEOIP_COUNTRY_EDITION' => 'geoip/geoip.stub', 'GEOIP_DIALUP_SPEED' => 'geoip/geoip.stub', 'GEOIP_DOMAIN_EDITION' => 'geoip/geoip.stub', 'GEOIP_ISP_EDITION' => 'geoip/geoip.stub', 'GEOIP_NETSPEED_EDITION' => 'geoip/geoip.stub', 'GEOIP_ORG_EDITION' => 'geoip/geoip.stub', 'GEOIP_PROXY_EDITION' => 'geoip/geoip.stub', 'GEOIP_REGION_EDITION_REV0' => 'geoip/geoip.stub', 'GEOIP_REGION_EDITION_REV1' => 'geoip/geoip.stub', 'GEOIP_UNKNOWN_SPEED' => 'geoip/geoip.stub', 'GEOSBUF_CAP_FLAT' => 'geos/geos.stub', 'GEOSBUF_CAP_ROUND' => 'geos/geos.stub', 'GEOSBUF_CAP_SQUARE' => 'geos/geos.stub', 'GEOSBUF_JOIN_BEVEL' => 'geos/geos.stub', 'GEOSBUF_JOIN_MITRE' => 'geos/geos.stub', 'GEOSBUF_JOIN_ROUND' => 'geos/geos.stub', 'GEOSRELATE_BNR_ENDPOINT' => 'geos/geos.stub', 'GEOSRELATE_BNR_MOD2' => 'geos/geos.stub', 'GEOSRELATE_BNR_MONOVALENT_ENDPOINT' => 'geos/geos.stub', 'GEOSRELATE_BNR_MULTIVALENT_ENDPOINT' => 'geos/geos.stub', 'GEOSRELATE_BNR_OGC' => 'geos/geos.stub', 'GEOSVALID_ALLOW_SELFTOUCHING_RING_FORMING_HOLE' => 'geos/geos.stub', 'GEOS_GEOMETRYCOLLECTION' => 'geos/geos.stub', 'GEOS_LINEARRING' => 'geos/geos.stub', 'GEOS_LINESTRING' => 'geos/geos.stub', 'GEOS_MULTILINESTRING' => 'geos/geos.stub', 'GEOS_MULTIPOINT' => 'geos/geos.stub', 'GEOS_MULTIPOLYGON' => 'geos/geos.stub', 'GEOS_POINT' => 'geos/geos.stub', 'GEOS_POLYGON' => 'geos/geos.stub', 'GLOB_AVAILABLE_FLAGS' => 'standard/standard_defines.stub', 'GLOB_BRACE' => 'standard/standard_defines.stub', 'GLOB_ERR' => 'standard/standard_defines.stub', 'GLOB_MARK' => 'standard/standard_defines.stub', 'GLOB_NOCHECK' => 'standard/standard_defines.stub', 'GLOB_NOESCAPE' => 'standard/standard_defines.stub', 'GLOB_NOSORT' => 'standard/standard_defines.stub', 'GLOB_ONLYDIR' => 'standard/standard_defines.stub', 'GMP_BIG_ENDIAN' => 'gmp/gmp.stub', 'GMP_LITTLE_ENDIAN' => 'gmp/gmp.stub', 'GMP_LSW_FIRST' => 'gmp/gmp.stub', 'GMP_MPIR_VERSION' => 'gmp/gmp.stub', 'GMP_MSW_FIRST' => 'gmp/gmp.stub', 'GMP_NATIVE_ENDIAN' => 'gmp/gmp.stub', 'GMP_ROUND_MINUSINF' => 'gmp/gmp.stub', 'GMP_ROUND_PLUSINF' => 'gmp/gmp.stub', 'GMP_ROUND_ZERO' => 'gmp/gmp.stub', 'GMP_VERSION' => 'gmp/gmp.stub', 'GNUPG_ERROR_EXCEPTION' => 'gnupg/gnupg.stub', 'GNUPG_ERROR_SILENT' => 'gnupg/gnupg.stub', 'GNUPG_ERROR_WARNING' => 'gnupg/gnupg.stub', 'GNUPG_GPGME_VERSION' => 'gnupg/gnupg.stub', 'GNUPG_PK_DSA' => 'gnupg/gnupg.stub', 'GNUPG_PK_ECC' => 'gnupg/gnupg.stub', 'GNUPG_PK_ECDH' => 'gnupg/gnupg.stub', 'GNUPG_PK_ECDSA' => 'gnupg/gnupg.stub', 'GNUPG_PK_EDDSA' => 'gnupg/gnupg.stub', 'GNUPG_PK_ELG' => 'gnupg/gnupg.stub', 'GNUPG_PK_ELG_E' => 'gnupg/gnupg.stub', 'GNUPG_PK_RSA' => 'gnupg/gnupg.stub', 'GNUPG_PK_RSA_E' => 'gnupg/gnupg.stub', 'GNUPG_PK_RSA_S' => 'gnupg/gnupg.stub', 'GNUPG_PROTOCOL_CMS' => 'gnupg/gnupg.stub', 'GNUPG_PROTOCOL_OpenPGP' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_BAD_POLICY' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_CRL_MISSING' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_CRL_TOO_OLD' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_GREEN' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_KEY_EXPIRED' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_KEY_MISSING' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_KEY_REVOKED' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_RED' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_SIG_EXPIRED' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_SYS_ERROR' => 'gnupg/gnupg.stub', 'GNUPG_SIGSUM_VALID' => 'gnupg/gnupg.stub', 'GNUPG_SIG_MODE_CLEAR' => 'gnupg/gnupg.stub', 'GNUPG_SIG_MODE_DETACH' => 'gnupg/gnupg.stub', 'GNUPG_SIG_MODE_NORMAL' => 'gnupg/gnupg.stub', 'GNUPG_VALIDITY_FULL' => 'gnupg/gnupg.stub', 'GNUPG_VALIDITY_MARGINAL' => 'gnupg/gnupg.stub', 'GNUPG_VALIDITY_NEVER' => 'gnupg/gnupg.stub', 'GNUPG_VALIDITY_ULTIMATE' => 'gnupg/gnupg.stub', 'GNUPG_VALIDITY_UNDEFINED' => 'gnupg/gnupg.stub', 'GNUPG_VALIDITY_UNKNOWN' => 'gnupg/gnupg.stub', 'GRAPHEME_EXTR_COUNT' => 'intl/intl.stub', 'GRAPHEME_EXTR_MAXBYTES' => 'intl/intl.stub', 'GRAPHEME_EXTR_MAXCHARS' => 'intl/intl.stub', 'GREEN' => 'winbinder/winbinder.stub', 'GROUPING' => 'standard/standard_defines.stub', 'Gauge' => 'winbinder/winbinder.stub', 'Grpc\\CALL_ERROR' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_ALREADY_ACCEPTED' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_ALREADY_FINISHED' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_ALREADY_INVOKED' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_BATCH_TOO_BIG' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_INVALID_FLAGS' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_INVALID_MESSAGE' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_INVALID_METADATA' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_NOT_INVOKED' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_NOT_ON_CLIENT' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_NOT_ON_SERVER' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_PAYLOAD_TYPE_MISMATCH' => 'grpc/grpc.stub', 'Grpc\\CALL_ERROR_TOO_MANY_OPERATIONS' => 'grpc/grpc.stub', 'Grpc\\CALL_OK' => 'grpc/grpc.stub', 'Grpc\\CHANNEL_CONNECTING' => 'grpc/grpc.stub', 'Grpc\\CHANNEL_FATAL_FAILURE' => 'grpc/grpc.stub', 'Grpc\\CHANNEL_IDLE' => 'grpc/grpc.stub', 'Grpc\\CHANNEL_READY' => 'grpc/grpc.stub', 'Grpc\\CHANNEL_SHUTDOWN' => 'grpc/grpc.stub', 'Grpc\\CHANNEL_TRANSIENT_FAILURE' => 'grpc/grpc.stub', 'Grpc\\OP_RECV_CLOSE_ON_SERVER' => 'grpc/grpc.stub', 'Grpc\\OP_RECV_INITIAL_METADATA' => 'grpc/grpc.stub', 'Grpc\\OP_RECV_MESSAGE' => 'grpc/grpc.stub', 'Grpc\\OP_RECV_STATUS_ON_CLIENT' => 'grpc/grpc.stub', 'Grpc\\OP_SEND_CLOSE_FROM_CLIENT' => 'grpc/grpc.stub', 'Grpc\\OP_SEND_INITIAL_METADATA' => 'grpc/grpc.stub', 'Grpc\\OP_SEND_MESSAGE' => 'grpc/grpc.stub', 'Grpc\\OP_SEND_STATUS_FROM_SERVER' => 'grpc/grpc.stub', 'Grpc\\STATUS_ABORTED' => 'grpc/grpc.stub', 'Grpc\\STATUS_ALREADY_EXISTS' => 'grpc/grpc.stub', 'Grpc\\STATUS_CANCELLED' => 'grpc/grpc.stub', 'Grpc\\STATUS_DATA_LOSS' => 'grpc/grpc.stub', 'Grpc\\STATUS_DEADLINE_EXCEEDED' => 'grpc/grpc.stub', 'Grpc\\STATUS_FAILED_PRECONDITION' => 'grpc/grpc.stub', 'Grpc\\STATUS_INTERNAL' => 'grpc/grpc.stub', 'Grpc\\STATUS_INVALID_ARGUMENT' => 'grpc/grpc.stub', 'Grpc\\STATUS_NOT_FOUND' => 'grpc/grpc.stub', 'Grpc\\STATUS_OK' => 'grpc/grpc.stub', 'Grpc\\STATUS_OUT_OF_RANGE' => 'grpc/grpc.stub', 'Grpc\\STATUS_PERMISSION_DENIED' => 'grpc/grpc.stub', 'Grpc\\STATUS_RESOURCE_EXHAUSTED' => 'grpc/grpc.stub', 'Grpc\\STATUS_UNAUTHENTICATED' => 'grpc/grpc.stub', 'Grpc\\STATUS_UNAVAILABLE' => 'grpc/grpc.stub', 'Grpc\\STATUS_UNIMPLEMENTED' => 'grpc/grpc.stub', 'Grpc\\STATUS_UNKNOWN' => 'grpc/grpc.stub', 'Grpc\\WRITE_BUFFER_HINT' => 'grpc/grpc.stub', 'Grpc\\WRITE_NO_COMPRESS' => 'grpc/grpc.stub', 'HASH_HMAC' => 'hash/hash.stub', 'HTMLControl' => 'winbinder/winbinder.stub', 'HTML_ENTITIES' => 'standard/standard_defines.stub', 'HTML_SPECIALCHARS' => 'standard/standard_defines.stub', 'HTTP_AUTH_ANY' => 'http/http.stub', 'HTTP_AUTH_BASIC' => 'http/http.stub', 'HTTP_AUTH_DIGEST' => 'http/http.stub', 'HTTP_AUTH_GSSNEG' => 'http/http.stub', 'HTTP_AUTH_NTLM' => 'http/http.stub', 'HTTP_COOKIE_HTTPONLY' => 'http/http.stub', 'HTTP_COOKIE_PARSE_RAW' => 'http/http.stub', 'HTTP_COOKIE_SECURE' => 'http/http.stub', 'HTTP_DEFLATE_LEVEL_DEF' => 'http/http.stub', 'HTTP_DEFLATE_LEVEL_MAX' => 'http/http.stub', 'HTTP_DEFLATE_LEVEL_MIN' => 'http/http.stub', 'HTTP_DEFLATE_STRATEGY_DEF' => 'http/http.stub', 'HTTP_DEFLATE_STRATEGY_FILT' => 'http/http.stub', 'HTTP_DEFLATE_STRATEGY_FIXED' => 'http/http.stub', 'HTTP_DEFLATE_STRATEGY_HUFF' => 'http/http.stub', 'HTTP_DEFLATE_STRATEGY_RLE' => 'http/http.stub', 'HTTP_DEFLATE_TYPE_GZIP' => 'http/http.stub', 'HTTP_DEFLATE_TYPE_RAW' => 'http/http.stub', 'HTTP_DEFLATE_TYPE_ZLIB' => 'http/http.stub', 'HTTP_ENCODING_STREAM_FLUSH_FULL' => 'http/http.stub', 'HTTP_ENCODING_STREAM_FLUSH_NONE' => 'http/http.stub', 'HTTP_ENCODING_STREAM_FLUSH_SYNC' => 'http/http.stub', 'HTTP_E_ENCODING' => 'http/http.stub', 'HTTP_E_HEADER' => 'http/http.stub', 'HTTP_E_INVALID_PARAM' => 'http/http.stub', 'HTTP_E_MALFORMED_HEADERS' => 'http/http.stub', 'HTTP_E_MESSAGE_TYPE' => 'http/http.stub', 'HTTP_E_QUERYSTRING' => 'http/http.stub', 'HTTP_E_REQUEST' => 'http/http.stub', 'HTTP_E_REQUEST_METHOD' => 'http/http.stub', 'HTTP_E_REQUEST_POOL' => 'http/http.stub', 'HTTP_E_RESPONSE' => 'http/http.stub', 'HTTP_E_RUNTIME' => 'http/http.stub', 'HTTP_E_SOCKET' => 'http/http.stub', 'HTTP_E_URL' => 'http/http.stub', 'HTTP_IPRESOLVE_ANY' => 'http/http.stub', 'HTTP_IPRESOLVE_V4' => 'http/http.stub', 'HTTP_IPRESOLVE_V6' => 'http/http.stub', 'HTTP_METH_ACL' => 'http/http.stub', 'HTTP_METH_BASELINE_CONTROL' => 'http/http.stub', 'HTTP_METH_CHECKIN' => 'http/http.stub', 'HTTP_METH_CHECKOUT' => 'http/http.stub', 'HTTP_METH_CONNECT' => 'http/http.stub', 'HTTP_METH_COPY' => 'http/http.stub', 'HTTP_METH_DELETE' => 'http/http.stub', 'HTTP_METH_GET' => 'http/http.stub', 'HTTP_METH_HEAD' => 'http/http.stub', 'HTTP_METH_LABEL' => 'http/http.stub', 'HTTP_METH_LOCK' => 'http/http.stub', 'HTTP_METH_MERGE' => 'http/http.stub', 'HTTP_METH_MKACTIVITY' => 'http/http.stub', 'HTTP_METH_MKCOL' => 'http/http.stub', 'HTTP_METH_MKWORKSPACE' => 'http/http.stub', 'HTTP_METH_MOVE' => 'http/http.stub', 'HTTP_METH_OPTIONS' => 'http/http.stub', 'HTTP_METH_POST' => 'http/http.stub', 'HTTP_METH_PROPFIND' => 'http/http.stub', 'HTTP_METH_PROPPATCH' => 'http/http.stub', 'HTTP_METH_PUT' => 'http/http.stub', 'HTTP_METH_REPORT' => 'http/http.stub', 'HTTP_METH_TRACE' => 'http/http.stub', 'HTTP_METH_UNCHECKOUT' => 'http/http.stub', 'HTTP_METH_UNLOCK' => 'http/http.stub', 'HTTP_METH_UPDATE' => 'http/http.stub', 'HTTP_METH_VERSION_CONTROL' => 'http/http.stub', 'HTTP_MSG_NONE' => 'http/http.stub', 'HTTP_MSG_REQUEST' => 'http/http.stub', 'HTTP_MSG_RESPONSE' => 'http/http.stub', 'HTTP_PARAMS_ALLOW_COMMA' => 'http/http.stub', 'HTTP_PARAMS_ALLOW_FAILURE' => 'http/http.stub', 'HTTP_PARAMS_DEFAULT' => 'http/http.stub', 'HTTP_PARAMS_RAISE_ERROR' => 'http/http.stub', 'HTTP_PROXY_HTTP' => 'http/http.stub', 'HTTP_PROXY_SOCKS4' => 'http/http.stub', 'HTTP_PROXY_SOCKS5' => 'http/http.stub', 'HTTP_QUERYSTRING_TYPE_ARRAY' => 'http/http.stub', 'HTTP_QUERYSTRING_TYPE_BOOL' => 'http/http.stub', 'HTTP_QUERYSTRING_TYPE_FLOAT' => 'http/http.stub', 'HTTP_QUERYSTRING_TYPE_INT' => 'http/http.stub', 'HTTP_QUERYSTRING_TYPE_OBJECT' => 'http/http.stub', 'HTTP_QUERYSTRING_TYPE_STRING' => 'http/http.stub', 'HTTP_REDIRECT' => 'http/http.stub', 'HTTP_REDIRECT_FOUND' => 'http/http.stub', 'HTTP_REDIRECT_PERM' => 'http/http.stub', 'HTTP_REDIRECT_POST' => 'http/http.stub', 'HTTP_REDIRECT_PROXY' => 'http/http.stub', 'HTTP_REDIRECT_TEMP' => 'http/http.stub', 'HTTP_SSL_VERSION_ANY' => 'http/http.stub', 'HTTP_SSL_VERSION_SSLv2' => 'http/http.stub', 'HTTP_SSL_VERSION_SSLv3' => 'http/http.stub', 'HTTP_SSL_VERSION_TLSv1' => 'http/http.stub', 'HTTP_SUPPORT' => 'http/http.stub', 'HTTP_SUPPORT_ENCODINGS' => 'http/http.stub', 'HTTP_SUPPORT_EVENTS' => 'http/http.stub', 'HTTP_SUPPORT_MAGICMIME' => 'http/http.stub', 'HTTP_SUPPORT_REQUESTS' => 'http/http.stub', 'HTTP_SUPPORT_SSLREQUESTS' => 'http/http.stub', 'HTTP_URL_FROM_ENV' => 'http/http.stub', 'HTTP_URL_JOIN_PATH' => 'http/http.stub', 'HTTP_URL_JOIN_QUERY' => 'http/http.stub', 'HTTP_URL_REPLACE' => 'http/http.stub', 'HTTP_URL_STRIP_ALL' => 'http/http.stub', 'HTTP_URL_STRIP_AUTH' => 'http/http.stub', 'HTTP_URL_STRIP_FRAGMENT' => 'http/http.stub', 'HTTP_URL_STRIP_PASS' => 'http/http.stub', 'HTTP_URL_STRIP_PATH' => 'http/http.stub', 'HTTP_URL_STRIP_PORT' => 'http/http.stub', 'HTTP_URL_STRIP_QUERY' => 'http/http.stub', 'HTTP_URL_STRIP_USER' => 'http/http.stub', 'HTTP_VERSION_1_0' => 'http/http.stub', 'HTTP_VERSION_1_1' => 'http/http.stub', 'HTTP_VERSION_ANY' => 'http/http.stub', 'HTTP_VERSION_NONE' => 'http/http.stub', 'HyperLink' => 'winbinder/winbinder.stub', 'IBASE_BKP_CONVERT' => 'interbase/interbase.stub', 'IBASE_BKP_IGNORE_CHECKSUMS' => 'interbase/interbase.stub', 'IBASE_BKP_IGNORE_LIMBO' => 'interbase/interbase.stub', 'IBASE_BKP_METADATA_ONLY' => 'interbase/interbase.stub', 'IBASE_BKP_NON_TRANSPORTABLE' => 'interbase/interbase.stub', 'IBASE_BKP_NO_GARBAGE_COLLECT' => 'interbase/interbase.stub', 'IBASE_BKP_OLD_DESCRIPTIONS' => 'interbase/interbase.stub', 'IBASE_COMMITTED' => 'interbase/interbase.stub', 'IBASE_CONCURRENCY' => 'interbase/interbase.stub', 'IBASE_CONSISTENCY' => 'interbase/interbase.stub', 'IBASE_CREATE' => 'interbase/interbase.stub', 'IBASE_DEFAULT' => 'interbase/interbase.stub', 'IBASE_FETCH_ARRAYS' => 'interbase/interbase.stub', 'IBASE_FETCH_BLOBS' => 'interbase/interbase.stub', 'IBASE_NOWAIT' => 'interbase/interbase.stub', 'IBASE_PRP_ACCESS_MODE' => 'interbase/interbase.stub', 'IBASE_PRP_ACTIVATE' => 'interbase/interbase.stub', 'IBASE_PRP_AM_READONLY' => 'interbase/interbase.stub', 'IBASE_PRP_AM_READWRITE' => 'interbase/interbase.stub', 'IBASE_PRP_DB_ONLINE' => 'interbase/interbase.stub', 'IBASE_PRP_DENY_NEW_ATTACHMENTS' => 'interbase/interbase.stub', 'IBASE_PRP_DENY_NEW_TRANSACTIONS' => 'interbase/interbase.stub', 'IBASE_PRP_PAGE_BUFFERS' => 'interbase/interbase.stub', 'IBASE_PRP_RES' => 'interbase/interbase.stub', 'IBASE_PRP_RESERVE_SPACE' => 'interbase/interbase.stub', 'IBASE_PRP_RES_USE_FULL' => 'interbase/interbase.stub', 'IBASE_PRP_SET_SQL_DIALECT' => 'interbase/interbase.stub', 'IBASE_PRP_SHUTDOWN_DB' => 'interbase/interbase.stub', 'IBASE_PRP_SWEEP_INTERVAL' => 'interbase/interbase.stub', 'IBASE_PRP_WM_ASYNC' => 'interbase/interbase.stub', 'IBASE_PRP_WM_SYNC' => 'interbase/interbase.stub', 'IBASE_PRP_WRITE_MODE' => 'interbase/interbase.stub', 'IBASE_READ' => 'interbase/interbase.stub', 'IBASE_REC_NO_VERSION' => 'interbase/interbase.stub', 'IBASE_REC_VERSION' => 'interbase/interbase.stub', 'IBASE_RES_CREATE' => 'interbase/interbase.stub', 'IBASE_RES_DEACTIVATE_IDX' => 'interbase/interbase.stub', 'IBASE_RES_NO_SHADOW' => 'interbase/interbase.stub', 'IBASE_RES_NO_VALIDITY' => 'interbase/interbase.stub', 'IBASE_RES_ONE_AT_A_TIME' => 'interbase/interbase.stub', 'IBASE_RES_REPLACE' => 'interbase/interbase.stub', 'IBASE_RES_USE_ALL_SPACE' => 'interbase/interbase.stub', 'IBASE_RPR_CHECK_DB' => 'interbase/interbase.stub', 'IBASE_RPR_FULL' => 'interbase/interbase.stub', 'IBASE_RPR_IGNORE_CHECKSUM' => 'interbase/interbase.stub', 'IBASE_RPR_KILL_SHADOWS' => 'interbase/interbase.stub', 'IBASE_RPR_MEND_DB' => 'interbase/interbase.stub', 'IBASE_RPR_SWEEP_DB' => 'interbase/interbase.stub', 'IBASE_RPR_VALIDATE_DB' => 'interbase/interbase.stub', 'IBASE_STS_DATA_PAGES' => 'interbase/interbase.stub', 'IBASE_STS_DB_LOG' => 'interbase/interbase.stub', 'IBASE_STS_HDR_PAGES' => 'interbase/interbase.stub', 'IBASE_STS_IDX_PAGES' => 'interbase/interbase.stub', 'IBASE_STS_SYS_RELATIONS' => 'interbase/interbase.stub', 'IBASE_SVC_GET_ENV' => 'interbase/interbase.stub', 'IBASE_SVC_GET_ENV_LOCK' => 'interbase/interbase.stub', 'IBASE_SVC_GET_ENV_MSG' => 'interbase/interbase.stub', 'IBASE_SVC_GET_USERS' => 'interbase/interbase.stub', 'IBASE_SVC_IMPLEMENTATION' => 'interbase/interbase.stub', 'IBASE_SVC_SERVER_VERSION' => 'interbase/interbase.stub', 'IBASE_SVC_SVR_DB_INFO' => 'interbase/interbase.stub', 'IBASE_SVC_USER_DBPATH' => 'interbase/interbase.stub', 'IBASE_TEXT' => 'interbase/interbase.stub', 'IBASE_UNIXTIME' => 'interbase/interbase.stub', 'IBASE_WAIT' => 'interbase/interbase.stub', 'IBASE_WRITE' => 'interbase/interbase.stub', 'ICONV_IMPL' => 'iconv/iconv.stub', 'ICONV_MIME_DECODE_CONTINUE_ON_ERROR' => 'iconv/iconv.stub', 'ICONV_MIME_DECODE_STRICT' => 'iconv/iconv.stub', 'ICONV_VERSION' => 'iconv/iconv.stub', 'IDABORT' => 'winbinder/winbinder.stub', 'IDCANCEL' => 'winbinder/winbinder.stub', 'IDCLOSE' => 'winbinder/winbinder.stub', 'IDDEFAULT' => 'winbinder/winbinder.stub', 'IDHELP' => 'winbinder/winbinder.stub', 'IDIGNORE' => 'winbinder/winbinder.stub', 'IDNA_ALLOW_UNASSIGNED' => 'intl/intl.stub', 'IDNA_CHECK_BIDI' => 'intl/intl.stub', 'IDNA_CHECK_CONTEXTJ' => 'intl/intl.stub', 'IDNA_DEFAULT' => 'intl/intl.stub', 'IDNA_ERROR_BIDI' => 'intl/intl.stub', 'IDNA_ERROR_CONTEXTJ' => 'intl/intl.stub', 'IDNA_ERROR_DISALLOWED' => 'intl/intl.stub', 'IDNA_ERROR_DOMAIN_NAME_TOO_LONG' => 'intl/intl.stub', 'IDNA_ERROR_EMPTY_LABEL' => 'intl/intl.stub', 'IDNA_ERROR_HYPHEN_3_4' => 'intl/intl.stub', 'IDNA_ERROR_INVALID_ACE_LABEL' => 'intl/intl.stub', 'IDNA_ERROR_LABEL_HAS_DOT' => 'intl/intl.stub', 'IDNA_ERROR_LABEL_TOO_LONG' => 'intl/intl.stub', 'IDNA_ERROR_LEADING_COMBINING_MARK' => 'intl/intl.stub', 'IDNA_ERROR_LEADING_HYPHEN' => 'intl/intl.stub', 'IDNA_ERROR_PUNYCODE' => 'intl/intl.stub', 'IDNA_ERROR_TRAILING_HYPHEN' => 'intl/intl.stub', 'IDNA_NONTRANSITIONAL_TO_ASCII' => 'intl/intl.stub', 'IDNA_NONTRANSITIONAL_TO_UNICODE' => 'intl/intl.stub', 'IDNA_USE_STD3_RULES' => 'intl/intl.stub', 'IDNO' => 'winbinder/winbinder.stub', 'IDOK' => 'winbinder/winbinder.stub', 'IDRETRY' => 'winbinder/winbinder.stub', 'IDYES' => 'winbinder/winbinder.stub', 'ILL_BADSTK' => 'pcntl/pcntl.stub', 'ILL_COPROC' => 'pcntl/pcntl.stub', 'ILL_ILLADR' => 'pcntl/pcntl.stub', 'ILL_ILLOPC' => 'pcntl/pcntl.stub', 'ILL_ILLOPN' => 'pcntl/pcntl.stub', 'ILL_ILLTRP' => 'pcntl/pcntl.stub', 'ILL_PRVOPC' => 'pcntl/pcntl.stub', 'ILL_PRVREG' => 'pcntl/pcntl.stub', 'IMAGETYPE_AVIF' => 'standard/standard_defines.stub', 'IMAGETYPE_BMP' => 'standard/standard_defines.stub', 'IMAGETYPE_COUNT' => 'standard/standard_defines.stub', 'IMAGETYPE_GIF' => 'standard/standard_defines.stub', 'IMAGETYPE_ICO' => 'standard/standard_defines.stub', 'IMAGETYPE_IFF' => 'standard/standard_defines.stub', 'IMAGETYPE_JB2' => 'standard/standard_defines.stub', 'IMAGETYPE_JP2' => 'standard/standard_defines.stub', 'IMAGETYPE_JPC' => 'standard/standard_defines.stub', 'IMAGETYPE_JPEG' => 'standard/standard_defines.stub', 'IMAGETYPE_JPEG2000' => 'standard/standard_defines.stub', 'IMAGETYPE_JPX' => 'standard/standard_defines.stub', 'IMAGETYPE_PNG' => 'standard/standard_defines.stub', 'IMAGETYPE_PSD' => 'standard/standard_defines.stub', 'IMAGETYPE_SWC' => 'standard/standard_defines.stub', 'IMAGETYPE_SWF' => 'standard/standard_defines.stub', 'IMAGETYPE_TIFF_II' => 'standard/standard_defines.stub', 'IMAGETYPE_TIFF_MM' => 'standard/standard_defines.stub', 'IMAGETYPE_UNKNOWN' => 'standard/standard_defines.stub', 'IMAGETYPE_WBMP' => 'standard/standard_defines.stub', 'IMAGETYPE_WEBP' => 'standard/standard_defines.stub', 'IMAGETYPE_XBM' => 'standard/standard_defines.stub', 'IMAP_CLOSETIMEOUT' => 'imap/imap.stub', 'IMAP_GC_ELT' => 'imap/imap.stub', 'IMAP_GC_ENV' => 'imap/imap.stub', 'IMAP_GC_TEXTS' => 'imap/imap.stub', 'IMAP_OPENTIMEOUT' => 'imap/imap.stub', 'IMAP_READTIMEOUT' => 'imap/imap.stub', 'IMAP_WRITETIMEOUT' => 'imap/imap.stub', 'IMG_AFFINE_ROTATE' => 'gd/gd.stub', 'IMG_AFFINE_SCALE' => 'gd/gd.stub', 'IMG_AFFINE_SHEAR_HORIZONTAL' => 'gd/gd.stub', 'IMG_AFFINE_SHEAR_VERTICAL' => 'gd/gd.stub', 'IMG_AFFINE_TRANSLATE' => 'gd/gd.stub', 'IMG_ARC_CHORD' => 'gd/gd.stub', 'IMG_ARC_EDGED' => 'gd/gd.stub', 'IMG_ARC_NOFILL' => 'gd/gd.stub', 'IMG_ARC_PIE' => 'gd/gd.stub', 'IMG_ARC_ROUNDED' => 'gd/gd.stub', 'IMG_AVIF' => 'gd/gd.stub', 'IMG_BELL' => 'gd/gd.stub', 'IMG_BESSEL' => 'gd/gd.stub', 'IMG_BICUBIC' => 'gd/gd.stub', 'IMG_BICUBIC_FIXED' => 'gd/gd.stub', 'IMG_BILINEAR_FIXED' => 'gd/gd.stub', 'IMG_BLACKMAN' => 'gd/gd.stub', 'IMG_BMP' => 'gd/gd.stub', 'IMG_BOX' => 'gd/gd.stub', 'IMG_BSPLINE' => 'gd/gd.stub', 'IMG_CATMULLROM' => 'gd/gd.stub', 'IMG_COLOR_BRUSHED' => 'gd/gd.stub', 'IMG_COLOR_STYLED' => 'gd/gd.stub', 'IMG_COLOR_STYLEDBRUSHED' => 'gd/gd.stub', 'IMG_COLOR_TILED' => 'gd/gd.stub', 'IMG_COLOR_TRANSPARENT' => 'gd/gd.stub', 'IMG_CROP_BLACK' => 'gd/gd.stub', 'IMG_CROP_DEFAULT' => 'gd/gd.stub', 'IMG_CROP_SIDES' => 'gd/gd.stub', 'IMG_CROP_THRESHOLD' => 'gd/gd.stub', 'IMG_CROP_TRANSPARENT' => 'gd/gd.stub', 'IMG_CROP_WHITE' => 'gd/gd.stub', 'IMG_EFFECT_ALPHABLEND' => 'gd/gd.stub', 'IMG_EFFECT_MULTIPLY' => 'gd/gd.stub', 'IMG_EFFECT_NORMAL' => 'gd/gd.stub', 'IMG_EFFECT_OVERLAY' => 'gd/gd.stub', 'IMG_EFFECT_REPLACE' => 'gd/gd.stub', 'IMG_FILTER_BRIGHTNESS' => 'gd/gd.stub', 'IMG_FILTER_COLORIZE' => 'gd/gd.stub', 'IMG_FILTER_CONTRAST' => 'gd/gd.stub', 'IMG_FILTER_EDGEDETECT' => 'gd/gd.stub', 'IMG_FILTER_EMBOSS' => 'gd/gd.stub', 'IMG_FILTER_GAUSSIAN_BLUR' => 'gd/gd.stub', 'IMG_FILTER_GRAYSCALE' => 'gd/gd.stub', 'IMG_FILTER_MEAN_REMOVAL' => 'gd/gd.stub', 'IMG_FILTER_NEGATE' => 'gd/gd.stub', 'IMG_FILTER_PIXELATE' => 'gd/gd.stub', 'IMG_FILTER_SCATTER' => 'gd/gd.stub', 'IMG_FILTER_SELECTIVE_BLUR' => 'gd/gd.stub', 'IMG_FILTER_SMOOTH' => 'gd/gd.stub', 'IMG_FLIP_BOTH' => 'gd/gd.stub', 'IMG_FLIP_HORIZONTAL' => 'gd/gd.stub', 'IMG_FLIP_VERTICAL' => 'gd/gd.stub', 'IMG_GAUSSIAN' => 'gd/gd.stub', 'IMG_GD2_COMPRESSED' => 'gd/gd.stub', 'IMG_GD2_RAW' => 'gd/gd.stub', 'IMG_GENERALIZED_CUBIC' => 'gd/gd.stub', 'IMG_GIF' => 'gd/gd.stub', 'IMG_HAMMING' => 'gd/gd.stub', 'IMG_HANNING' => 'gd/gd.stub', 'IMG_HERMITE' => 'gd/gd.stub', 'IMG_JPEG' => 'gd/gd.stub', 'IMG_JPG' => 'gd/gd.stub', 'IMG_MITCHELL' => 'gd/gd.stub', 'IMG_NEAREST_NEIGHBOUR' => 'gd/gd.stub', 'IMG_PNG' => 'gd/gd.stub', 'IMG_POWER' => 'gd/gd.stub', 'IMG_QUADRATIC' => 'gd/gd.stub', 'IMG_SINC' => 'gd/gd.stub', 'IMG_TGA' => 'gd/gd.stub', 'IMG_TRIANGLE' => 'gd/gd.stub', 'IMG_WBMP' => 'gd/gd.stub', 'IMG_WEBP' => 'gd/gd.stub', 'IMG_WEBP_LOSSLESS' => 'gd/gd.stub', 'IMG_WEIGHTED4' => 'gd/gd.stub', 'IMG_XPM' => 'gd/gd.stub', 'INF' => 'standard/standard_defines.stub', 'INFO_ALL' => 'standard/standard_defines.stub', 'INFO_CONFIGURATION' => 'standard/standard_defines.stub', 'INFO_CREDITS' => 'standard/standard_defines.stub', 'INFO_ENVIRONMENT' => 'standard/standard_defines.stub', 'INFO_GENERAL' => 'standard/standard_defines.stub', 'INFO_LICENSE' => 'standard/standard_defines.stub', 'INFO_MODULES' => 'standard/standard_defines.stub', 'INFO_VARIABLES' => 'standard/standard_defines.stub', 'INI_ALL' => 'standard/standard_defines.stub', 'INI_PERDIR' => 'standard/standard_defines.stub', 'INI_SCANNER_NORMAL' => 'standard/standard_defines.stub', 'INI_SCANNER_RAW' => 'standard/standard_defines.stub', 'INI_SCANNER_TYPED' => 'standard/standard_defines.stub', 'INI_SYSTEM' => 'standard/standard_defines.stub', 'INI_USER' => 'standard/standard_defines.stub', 'INPUT_COOKIE' => 'filter/filter.stub', 'INPUT_ENV' => 'filter/filter.stub', 'INPUT_GET' => 'filter/filter.stub', 'INPUT_POST' => 'filter/filter.stub', 'INPUT_REQUEST' => 'filter/filter.stub', 'INPUT_SERVER' => 'filter/filter.stub', 'INPUT_SESSION' => 'filter/filter.stub', 'INTL_ICU_DATA_VERSION' => 'intl/intl.stub', 'INTL_ICU_VERSION' => 'intl/intl.stub', 'INTL_IDNA_VARIANT_2003' => 'intl/intl.stub', 'INTL_IDNA_VARIANT_UTS46' => 'intl/intl.stub', 'INTL_MAX_LOCALE_LEN' => 'intl/intl.stub', 'INT_CURR_SYMBOL' => 'standard/standard_defines.stub', 'INT_FRAC_DIGITS' => 'standard/standard_defines.stub', 'IN_ACCESS' => 'inotify/inotify.stub', 'IN_ALL_EVENTS' => 'inotify/inotify.stub', 'IN_ATTRIB' => 'inotify/inotify.stub', 'IN_CLOSE' => 'inotify/inotify.stub', 'IN_CLOSE_NOWRITE' => 'inotify/inotify.stub', 'IN_CLOSE_WRITE' => 'inotify/inotify.stub', 'IN_CREATE' => 'inotify/inotify.stub', 'IN_DELETE' => 'inotify/inotify.stub', 'IN_DELETE_SELF' => 'inotify/inotify.stub', 'IN_DONT_FOLLOW' => 'inotify/inotify.stub', 'IN_IGNORED' => 'inotify/inotify.stub', 'IN_ISDIR' => 'inotify/inotify.stub', 'IN_MASK_ADD' => 'inotify/inotify.stub', 'IN_MODIFY' => 'inotify/inotify.stub', 'IN_MOVE' => 'inotify/inotify.stub', 'IN_MOVED_FROM' => 'inotify/inotify.stub', 'IN_MOVED_TO' => 'inotify/inotify.stub', 'IN_MOVE_SELF' => 'inotify/inotify.stub', 'IN_ONESHOT' => 'inotify/inotify.stub', 'IN_ONLYDIR' => 'inotify/inotify.stub', 'IN_OPEN' => 'inotify/inotify.stub', 'IN_Q_OVERFLOW' => 'inotify/inotify.stub', 'IN_UNMOUNT' => 'inotify/inotify.stub', 'IPPROTO_IP' => 'sockets/sockets.stub', 'IPPROTO_IPV6' => 'sockets/sockets.stub', 'IPV6_HOPLIMIT' => 'sockets/sockets.stub', 'IPV6_MULTICAST_HOPS' => 'sockets/sockets.stub', 'IPV6_MULTICAST_IF' => 'sockets/sockets.stub', 'IPV6_MULTICAST_LOOP' => 'sockets/sockets.stub', 'IPV6_PKTINFO' => 'sockets/sockets.stub', 'IPV6_RECVHOPLIMIT' => 'sockets/sockets.stub', 'IPV6_RECVPKTINFO' => 'sockets/sockets.stub', 'IPV6_RECVTCLASS' => 'sockets/sockets.stub', 'IPV6_TCLASS' => 'sockets/sockets.stub', 'IPV6_UNICAST_HOPS' => 'sockets/sockets.stub', 'IPV6_V6ONLY' => 'sockets/sockets.stub', 'IP_BIND_ADDRESS_NO_PORT' => 'sockets/sockets.stub', 'IP_MTU_DISCOVER' => 'sockets/sockets.stub', 'IP_MULTICAST_IF' => 'sockets/sockets.stub', 'IP_MULTICAST_LOOP' => 'sockets/sockets.stub', 'IP_MULTICAST_TTL' => 'sockets/sockets.stub', 'IP_PMTUDISC_DO' => 'sockets/sockets.stub', 'IP_PMTUDISC_DONT' => 'sockets/sockets.stub', 'IP_PMTUDISC_INTERFACE' => 'sockets/sockets.stub', 'IP_PMTUDISC_OMIT' => 'sockets/sockets.stub', 'IP_PMTUDISC_PROBE' => 'sockets/sockets.stub', 'IP_PMTUDISC_WANT' => 'sockets/sockets.stub', 'ImageButton' => 'winbinder/winbinder.stub', 'InvisibleArea' => 'winbinder/winbinder.stub', 'JOB_QUEUE_PRIORITY_HIGH' => 'zend/zend_d.stub', 'JOB_QUEUE_PRIORITY_LOW' => 'zend/zend_d.stub', 'JOB_QUEUE_PRIORITY_NORMAL' => 'zend/zend_d.stub', 'JOB_QUEUE_PRIORITY_URGENT' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_COOKIE' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_ENV' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_FILES' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_GET' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_POST' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_RAW_POST' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_SERVER' => 'zend/zend_d.stub', 'JOB_QUEUE_SAVE_SESSION' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_EXECUTION_FAILED' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_IN_PROCESS' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_LOGICALLY_FAILED' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_SCHEDULED' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_SUCCESS' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_SUSPENDED' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_WAITING' => 'zend/zend_d.stub', 'JOB_QUEUE_STATUS_WAITING_PREDECESSOR' => 'zend/zend_d.stub', 'JSON_BIGINT_AS_STRING' => 'json/json.stub', 'JSON_ERROR_CTRL_CHAR' => 'json/json.stub', 'JSON_ERROR_DEPTH' => 'json/json.stub', 'JSON_ERROR_INF_OR_NAN' => 'json/json.stub', 'JSON_ERROR_INVALID_PROPERTY_NAME' => 'json/json.stub', 'JSON_ERROR_NONE' => 'json/json.stub', 'JSON_ERROR_NON_BACKED_ENUM' => 'json/json.stub', 'JSON_ERROR_RECURSION' => 'json/json.stub', 'JSON_ERROR_STATE_MISMATCH' => 'json/json.stub', 'JSON_ERROR_SYNTAX' => 'json/json.stub', 'JSON_ERROR_UNSUPPORTED_TYPE' => 'json/json.stub', 'JSON_ERROR_UTF16' => 'json/json.stub', 'JSON_ERROR_UTF8' => 'json/json.stub', 'JSON_FORCE_OBJECT' => 'json/json.stub', 'JSON_HEX_AMP' => 'json/json.stub', 'JSON_HEX_APOS' => 'json/json.stub', 'JSON_HEX_QUOT' => 'json/json.stub', 'JSON_HEX_TAG' => 'json/json.stub', 'JSON_INVALID_UTF8_IGNORE' => 'json/json.stub', 'JSON_INVALID_UTF8_SUBSTITUTE' => 'json/json.stub', 'JSON_NUMERIC_CHECK' => 'json/json.stub', 'JSON_OBJECT_AS_ARRAY' => 'json/json.stub', 'JSON_PARSER_NOTSTRICT' => 'json/json.stub', 'JSON_PARTIAL_OUTPUT_ON_ERROR' => 'json/json.stub', 'JSON_PRESERVE_ZERO_FRACTION' => 'json/json.stub', 'JSON_PRETTY_PRINT' => 'json/json.stub', 'JSON_THROW_ON_ERROR' => 'json/json.stub', 'JSON_UNESCAPED_LINE_TERMINATORS' => 'json/json.stub', 'JSON_UNESCAPED_SLASHES' => 'json/json.stub', 'JSON_UNESCAPED_UNICODE' => 'json/json.stub', 'LATT_HASCHILDREN' => 'imap/imap.stub', 'LATT_HASNOCHILDREN' => 'imap/imap.stub', 'LATT_MARKED' => 'imap/imap.stub', 'LATT_NOINFERIORS' => 'imap/imap.stub', 'LATT_NOSELECT' => 'imap/imap.stub', 'LATT_REFERRAL' => 'imap/imap.stub', 'LATT_UNMARKED' => 'imap/imap.stub', 'LC_ALL' => 'standard/standard_defines.stub', 'LC_COLLATE' => 'standard/standard_defines.stub', 'LC_CTYPE' => 'standard/standard_defines.stub', 'LC_MESSAGES' => 'standard/standard_defines.stub', 'LC_MONETARY' => 'standard/standard_defines.stub', 'LC_NUMERIC' => 'standard/standard_defines.stub', 'LC_TIME' => 'standard/standard_defines.stub', 'LDAP_CONTROL_ASSERT' => 'ldap/ldap.stub', 'LDAP_CONTROL_AUTHZID_REQUEST' => 'ldap/ldap.stub', 'LDAP_CONTROL_AUTHZID_RESPONSE' => 'ldap/ldap.stub', 'LDAP_CONTROL_DONTUSECOPY' => 'ldap/ldap.stub', 'LDAP_CONTROL_MANAGEDSAIT' => 'ldap/ldap.stub', 'LDAP_CONTROL_PAGEDRESULTS' => 'ldap/ldap.stub', 'LDAP_CONTROL_PASSWORDPOLICYREQUEST' => 'ldap/ldap.stub', 'LDAP_CONTROL_PASSWORDPOLICYRESPONSE' => 'ldap/ldap.stub', 'LDAP_CONTROL_POST_READ' => 'ldap/ldap.stub', 'LDAP_CONTROL_PRE_READ' => 'ldap/ldap.stub', 'LDAP_CONTROL_PROXY_AUTHZ' => 'ldap/ldap.stub', 'LDAP_CONTROL_SORTREQUEST' => 'ldap/ldap.stub', 'LDAP_CONTROL_SORTRESPONSE' => 'ldap/ldap.stub', 'LDAP_CONTROL_SUBENTRIES' => 'ldap/ldap.stub', 'LDAP_CONTROL_SYNC' => 'ldap/ldap.stub', 'LDAP_CONTROL_SYNC_DONE' => 'ldap/ldap.stub', 'LDAP_CONTROL_SYNC_STATE' => 'ldap/ldap.stub', 'LDAP_CONTROL_VALUESRETURNFILTER' => 'ldap/ldap.stub', 'LDAP_CONTROL_VLVREQUEST' => 'ldap/ldap.stub', 'LDAP_CONTROL_VLVRESPONSE' => 'ldap/ldap.stub', 'LDAP_CONTROL_X_DOMAIN_SCOPE' => 'ldap/ldap.stub', 'LDAP_CONTROL_X_EXTENDED_DN' => 'ldap/ldap.stub', 'LDAP_CONTROL_X_INCREMENTAL_VALUES' => 'ldap/ldap.stub', 'LDAP_CONTROL_X_PERMISSIVE_MODIFY' => 'ldap/ldap.stub', 'LDAP_CONTROL_X_SEARCH_OPTIONS' => 'ldap/ldap.stub', 'LDAP_CONTROL_X_TREE_DELETE' => 'ldap/ldap.stub', 'LDAP_DEREF_ALWAYS' => 'ldap/ldap.stub', 'LDAP_DEREF_FINDING' => 'ldap/ldap.stub', 'LDAP_DEREF_NEVER' => 'ldap/ldap.stub', 'LDAP_DEREF_SEARCHING' => 'ldap/ldap.stub', 'LDAP_ESCAPE_DN' => 'ldap/ldap.stub', 'LDAP_ESCAPE_FILTER' => 'ldap/ldap.stub', 'LDAP_EXOP_MODIFY_PASSWD' => 'ldap/ldap.stub', 'LDAP_EXOP_REFRESH' => 'ldap/ldap.stub', 'LDAP_EXOP_START_TLS' => 'ldap/ldap.stub', 'LDAP_EXOP_TURN' => 'ldap/ldap.stub', 'LDAP_EXOP_WHO_AM_I' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_ADD' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_ATTRIB' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_MODTYPE' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_REMOVE' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_REMOVE_ALL' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_REPLACE' => 'ldap/ldap.stub', 'LDAP_MODIFY_BATCH_VALUES' => 'ldap/ldap.stub', 'LDAP_OPT_CLIENT_CONTROLS' => 'ldap/ldap.stub', 'LDAP_OPT_DEBUG_LEVEL' => 'ldap/ldap.stub', 'LDAP_OPT_DEREF' => 'ldap/ldap.stub', 'LDAP_OPT_DIAGNOSTIC_MESSAGE' => 'ldap/ldap.stub', 'LDAP_OPT_ERROR_NUMBER' => 'ldap/ldap.stub', 'LDAP_OPT_ERROR_STRING' => 'ldap/ldap.stub', 'LDAP_OPT_HOST_NAME' => 'ldap/ldap.stub', 'LDAP_OPT_MATCHED_DN' => 'ldap/ldap.stub', 'LDAP_OPT_NETWORK_TIMEOUT' => 'ldap/ldap.stub', 'LDAP_OPT_PROTOCOL_VERSION' => 'ldap/ldap.stub', 'LDAP_OPT_REFERRALS' => 'ldap/ldap.stub', 'LDAP_OPT_RESTART' => 'ldap/ldap.stub', 'LDAP_OPT_SERVER_CONTROLS' => 'ldap/ldap.stub', 'LDAP_OPT_SIZELIMIT' => 'ldap/ldap.stub', 'LDAP_OPT_TIMELIMIT' => 'ldap/ldap.stub', 'LDAP_OPT_TIMEOUT' => 'ldap/ldap.stub', 'LDAP_OPT_X_KEEPALIVE_IDLE' => 'ldap/ldap.stub', 'LDAP_OPT_X_KEEPALIVE_INTERVAL' => 'ldap/ldap.stub', 'LDAP_OPT_X_KEEPALIVE_PROBES' => 'ldap/ldap.stub', 'LDAP_OPT_X_SASL_AUTHCID' => 'ldap/ldap.stub', 'LDAP_OPT_X_SASL_AUTHZID' => 'ldap/ldap.stub', 'LDAP_OPT_X_SASL_MECH' => 'ldap/ldap.stub', 'LDAP_OPT_X_SASL_NOCANON' => 'ldap/ldap.stub', 'LDAP_OPT_X_SASL_REALM' => 'ldap/ldap.stub', 'LDAP_OPT_X_SASL_USERNAME' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_ALLOW' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CACERTDIR' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CACERTFILE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CERTFILE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CIPHER_SUITE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CRLCHECK' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CRLFILE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CRL_ALL' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CRL_NONE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_CRL_PEER' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_DEMAND' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_DHFILE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_HARD' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_KEYFILE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_NEVER' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PACKAGE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_MAX' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_MIN' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_SSL2' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_SSL3' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_0' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_1' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_2' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_3' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_RANDOM_FILE' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_REQUIRE_CERT' => 'ldap/ldap.stub', 'LDAP_OPT_X_TLS_TRY' => 'ldap/ldap.stub', 'LEVELDB_NO_COMPRESSION' => 'leveldb/LevelDB.stub', 'LEVELDB_SNAPPY_COMPRESSION' => 'leveldb/LevelDB.stub', 'LIBEXSLT_DOTTED_VERSION' => 'xsl/xsl.stub', 'LIBEXSLT_VERSION' => 'xsl/xsl.stub', 'LIBXML_BIGLINES' => 'libxml/libxml.stub', 'LIBXML_COMPACT' => 'libxml/libxml.stub', 'LIBXML_DOTTED_VERSION' => 'libxml/libxml.stub', 'LIBXML_DTDATTR' => 'libxml/libxml.stub', 'LIBXML_DTDLOAD' => 'libxml/libxml.stub', 'LIBXML_DTDVALID' => 'libxml/libxml.stub', 'LIBXML_ERR_ERROR' => 'libxml/libxml.stub', 'LIBXML_ERR_FATAL' => 'libxml/libxml.stub', 'LIBXML_ERR_NONE' => 'libxml/libxml.stub', 'LIBXML_ERR_WARNING' => 'libxml/libxml.stub', 'LIBXML_HTML_NODEFDTD' => 'libxml/libxml.stub', 'LIBXML_HTML_NOIMPLIED' => 'libxml/libxml.stub', 'LIBXML_LOADED_VERSION' => 'libxml/libxml.stub', 'LIBXML_NOBLANKS' => 'libxml/libxml.stub', 'LIBXML_NOCDATA' => 'libxml/libxml.stub', 'LIBXML_NOEMPTYTAG' => 'libxml/libxml.stub', 'LIBXML_NOENT' => 'libxml/libxml.stub', 'LIBXML_NOERROR' => 'libxml/libxml.stub', 'LIBXML_NONET' => 'libxml/libxml.stub', 'LIBXML_NOWARNING' => 'libxml/libxml.stub', 'LIBXML_NOXMLDECL' => 'libxml/libxml.stub', 'LIBXML_NSCLEAN' => 'libxml/libxml.stub', 'LIBXML_PARSEHUGE' => 'libxml/libxml.stub', 'LIBXML_PEDANTIC' => 'libxml/libxml.stub', 'LIBXML_RECOVER' => 'libxml/libxml.stub', 'LIBXML_SCHEMA_CREATE' => 'libxml/libxml.stub', 'LIBXML_VERSION' => 'libxml/libxml.stub', 'LIBXML_XINCLUDE' => 'libxml/libxml.stub', 'LIBXSLT_DOTTED_VERSION' => 'xsl/xsl.stub', 'LIBXSLT_VERSION' => 'xsl/xsl.stub', 'LIBZSTD_VERSION_NUMBER' => 'zstd/zstd.stub', 'LIBZSTD_VERSION_STRING' => 'zstd/zstd.stub', 'LIGHTGRAY' => 'winbinder/winbinder.stub', 'LOCK_EX' => 'standard/standard_defines.stub', 'LOCK_NB' => 'standard/standard_defines.stub', 'LOCK_SH' => 'standard/standard_defines.stub', 'LOCK_UN' => 'standard/standard_defines.stub', 'LOG_ALERT' => 'standard/standard_defines.stub', 'LOG_AUTH' => 'standard/standard_defines.stub', 'LOG_AUTHPRIV' => 'standard/standard_defines.stub', 'LOG_CONS' => 'standard/standard_defines.stub', 'LOG_CRIT' => 'standard/standard_defines.stub', 'LOG_CRON' => 'standard/standard_defines.stub', 'LOG_DAEMON' => 'standard/standard_defines.stub', 'LOG_DEBUG' => 'standard/standard_defines.stub', 'LOG_EMERG' => 'standard/standard_defines.stub', 'LOG_ERR' => 'standard/standard_defines.stub', 'LOG_INFO' => 'standard/standard_defines.stub', 'LOG_KERN' => 'standard/standard_defines.stub', 'LOG_LOCAL0' => 'standard/standard_defines.stub', 'LOG_LOCAL1' => 'standard/standard_defines.stub', 'LOG_LOCAL2' => 'standard/standard_defines.stub', 'LOG_LOCAL3' => 'standard/standard_defines.stub', 'LOG_LOCAL4' => 'standard/standard_defines.stub', 'LOG_LOCAL5' => 'standard/standard_defines.stub', 'LOG_LOCAL6' => 'standard/standard_defines.stub', 'LOG_LOCAL7' => 'standard/standard_defines.stub', 'LOG_LPR' => 'standard/standard_defines.stub', 'LOG_MAIL' => 'standard/standard_defines.stub', 'LOG_NDELAY' => 'standard/standard_defines.stub', 'LOG_NEWS' => 'standard/standard_defines.stub', 'LOG_NOTICE' => 'standard/standard_defines.stub', 'LOG_NOWAIT' => 'standard/standard_defines.stub', 'LOG_ODELAY' => 'standard/standard_defines.stub', 'LOG_PERROR' => 'standard/standard_defines.stub', 'LOG_PID' => 'standard/standard_defines.stub', 'LOG_SYSLOG' => 'standard/standard_defines.stub', 'LOG_USER' => 'standard/standard_defines.stub', 'LOG_UUCP' => 'standard/standard_defines.stub', 'LOG_WARNING' => 'standard/standard_defines.stub', 'Label' => 'winbinder/winbinder.stub', 'ListBox' => 'winbinder/winbinder.stub', 'ListView' => 'winbinder/winbinder.stub', 'MAGENTA' => 'winbinder/winbinder.stub', 'MAILPARSE_EXTRACT_OUTPUT' => 'mailparse/mailparse.stub', 'MAILPARSE_EXTRACT_RETURN' => 'mailparse/mailparse.stub', 'MAILPARSE_EXTRACT_STREAM' => 'mailparse/mailparse.stub', 'MB_CASE_FOLD' => 'mbstring/mbstring.stub', 'MB_CASE_FOLD_SIMPLE' => 'mbstring/mbstring.stub', 'MB_CASE_LOWER' => 'mbstring/mbstring.stub', 'MB_CASE_LOWER_SIMPLE' => 'mbstring/mbstring.stub', 'MB_CASE_TITLE' => 'mbstring/mbstring.stub', 'MB_CASE_TITLE_SIMPLE' => 'mbstring/mbstring.stub', 'MB_CASE_UPPER' => 'mbstring/mbstring.stub', 'MB_CASE_UPPER_SIMPLE' => 'mbstring/mbstring.stub', 'MB_ONIGURUMA_VERSION' => 'mbstring/mbstring.stub', 'MB_OVERLOAD_MAIL' => 'mbstring/mbstring.stub', 'MB_OVERLOAD_REGEX' => 'mbstring/mbstring.stub', 'MB_OVERLOAD_STRING' => 'mbstring/mbstring.stub', 'MCAST_BLOCK_SOURCE' => 'sockets/sockets.stub', 'MCAST_JOIN_GROUP' => 'sockets/sockets.stub', 'MCAST_JOIN_SOURCE_GROUP' => 'sockets/sockets.stub', 'MCAST_LEAVE_GROUP' => 'sockets/sockets.stub', 'MCAST_LEAVE_SOURCE_GROUP' => 'sockets/sockets.stub', 'MCAST_UNBLOCK_SOURCE' => 'sockets/sockets.stub', 'MCRYPT_3DES' => 'mcrypt/mcrypt.stub', 'MCRYPT_ARCFOUR' => 'mcrypt/mcrypt.stub', 'MCRYPT_ARCFOUR_IV' => 'mcrypt/mcrypt.stub', 'MCRYPT_BLOWFISH' => 'mcrypt/mcrypt.stub', 'MCRYPT_BLOWFISH_COMPAT' => 'mcrypt/mcrypt.stub', 'MCRYPT_CAST_128' => 'mcrypt/mcrypt.stub', 'MCRYPT_CAST_256' => 'mcrypt/mcrypt.stub', 'MCRYPT_CRYPT' => 'mcrypt/mcrypt.stub', 'MCRYPT_DECRYPT' => 'mcrypt/mcrypt.stub', 'MCRYPT_DES' => 'mcrypt/mcrypt.stub', 'MCRYPT_DES_COMPAT' => 'mcrypt/mcrypt.stub', 'MCRYPT_DEV_RANDOM' => 'mcrypt/mcrypt.stub', 'MCRYPT_DEV_URANDOM' => 'mcrypt/mcrypt.stub', 'MCRYPT_ENCRYPT' => 'mcrypt/mcrypt.stub', 'MCRYPT_ENIGNA' => 'mcrypt/mcrypt.stub', 'MCRYPT_GOST' => 'mcrypt/mcrypt.stub', 'MCRYPT_IDEA' => 'mcrypt/mcrypt.stub', 'MCRYPT_LOKI97' => 'mcrypt/mcrypt.stub', 'MCRYPT_MARS' => 'mcrypt/mcrypt.stub', 'MCRYPT_MODE_CBC' => 'mcrypt/mcrypt.stub', 'MCRYPT_MODE_CFB' => 'mcrypt/mcrypt.stub', 'MCRYPT_MODE_ECB' => 'mcrypt/mcrypt.stub', 'MCRYPT_MODE_NOFB' => 'mcrypt/mcrypt.stub', 'MCRYPT_MODE_OFB' => 'mcrypt/mcrypt.stub', 'MCRYPT_MODE_STREAM' => 'mcrypt/mcrypt.stub', 'MCRYPT_PANAMA' => 'mcrypt/mcrypt.stub', 'MCRYPT_RAND' => 'mcrypt/mcrypt.stub', 'MCRYPT_RC2' => 'mcrypt/mcrypt.stub', 'MCRYPT_RC4' => 'mcrypt/mcrypt.stub', 'MCRYPT_RC6' => 'mcrypt/mcrypt.stub', 'MCRYPT_RC6_128' => 'mcrypt/mcrypt.stub', 'MCRYPT_RC6_192' => 'mcrypt/mcrypt.stub', 'MCRYPT_RC6_256' => 'mcrypt/mcrypt.stub', 'MCRYPT_RIJNDAEL_128' => 'mcrypt/mcrypt.stub', 'MCRYPT_RIJNDAEL_192' => 'mcrypt/mcrypt.stub', 'MCRYPT_RIJNDAEL_256' => 'mcrypt/mcrypt.stub', 'MCRYPT_SAFER128' => 'mcrypt/mcrypt.stub', 'MCRYPT_SAFER64' => 'mcrypt/mcrypt.stub', 'MCRYPT_SAFERPLUS' => 'mcrypt/mcrypt.stub', 'MCRYPT_SERPENT' => 'mcrypt/mcrypt.stub', 'MCRYPT_SERPENT_128' => 'mcrypt/mcrypt.stub', 'MCRYPT_SERPENT_192' => 'mcrypt/mcrypt.stub', 'MCRYPT_SERPENT_256' => 'mcrypt/mcrypt.stub', 'MCRYPT_SKIPJACK' => 'mcrypt/mcrypt.stub', 'MCRYPT_THREEWAY' => 'mcrypt/mcrypt.stub', 'MCRYPT_TRIPLEDES' => 'mcrypt/mcrypt.stub', 'MCRYPT_TWOFISH' => 'mcrypt/mcrypt.stub', 'MCRYPT_WAKE' => 'mcrypt/mcrypt.stub', 'MCRYPT_XTEA' => 'mcrypt/mcrypt.stub', 'MEMCACHE_COMPRESSED' => 'memcache/memcache.stub', 'MEMCACHE_HAVE_SESSION' => 'memcache/memcache.stub', 'MEMCACHE_USER1' => 'memcache/memcache.stub', 'MEMCACHE_USER2' => 'memcache/memcache.stub', 'MEMCACHE_USER3' => 'memcache/memcache.stub', 'MEMCACHE_USER4' => 'memcache/memcache.stub', 'MESSAGEPACK_OPT_PHPONLY' => 'msgpack/msgpack.stub', 'MHASH_ADLER32' => 'hash/hash.stub', 'MHASH_CRC32' => 'hash/hash.stub', 'MHASH_CRC32B' => 'hash/hash.stub', 'MHASH_CRC32C' => 'hash/hash.stub', 'MHASH_FNV132' => 'hash/hash.stub', 'MHASH_FNV164' => 'hash/hash.stub', 'MHASH_FNV1A32' => 'hash/hash.stub', 'MHASH_FNV1A64' => 'hash/hash.stub', 'MHASH_GOST' => 'hash/hash.stub', 'MHASH_HAVAL128' => 'hash/hash.stub', 'MHASH_HAVAL160' => 'hash/hash.stub', 'MHASH_HAVAL192' => 'hash/hash.stub', 'MHASH_HAVAL224' => 'hash/hash.stub', 'MHASH_HAVAL256' => 'hash/hash.stub', 'MHASH_JOAAT' => 'hash/hash.stub', 'MHASH_MD2' => 'hash/hash.stub', 'MHASH_MD4' => 'hash/hash.stub', 'MHASH_MD5' => 'hash/hash.stub', 'MHASH_MURMUR3A' => 'hash/hash.stub', 'MHASH_MURMUR3C' => 'hash/hash.stub', 'MHASH_MURMUR3F' => 'hash/hash.stub', 'MHASH_RIPEMD128' => 'hash/hash.stub', 'MHASH_RIPEMD160' => 'hash/hash.stub', 'MHASH_RIPEMD256' => 'hash/hash.stub', 'MHASH_RIPEMD320' => 'hash/hash.stub', 'MHASH_SHA1' => 'hash/hash.stub', 'MHASH_SHA224' => 'hash/hash.stub', 'MHASH_SHA256' => 'hash/hash.stub', 'MHASH_SHA384' => 'hash/hash.stub', 'MHASH_SHA512' => 'hash/hash.stub', 'MHASH_SNEFRU256' => 'hash/hash.stub', 'MHASH_TIGER' => 'hash/hash.stub', 'MHASH_TIGER128' => 'hash/hash.stub', 'MHASH_TIGER160' => 'hash/hash.stub', 'MHASH_WHIRLPOOL' => 'hash/hash.stub', 'MHASH_XXH128' => 'hash/hash.stub', 'MHASH_XXH3' => 'hash/hash.stub', 'MHASH_XXH32' => 'hash/hash.stub', 'MHASH_XXH64' => 'hash/hash.stub', 'MING_NEW' => 'ming/ming.stub', 'MING_ZLIB' => 'ming/ming.stub', 'MK_E_UNAVAILABLE' => 'com_dotnet/com_dotnet.stub', 'MONGODB_STABILITY' => 'mongodb/mongodb.stub', 'MONGODB_VERSION' => 'mongodb/mongodb.stub', 'MON_1' => 'standard/standard_defines.stub', 'MON_10' => 'standard/standard_defines.stub', 'MON_11' => 'standard/standard_defines.stub', 'MON_12' => 'standard/standard_defines.stub', 'MON_2' => 'standard/standard_defines.stub', 'MON_3' => 'standard/standard_defines.stub', 'MON_4' => 'standard/standard_defines.stub', 'MON_5' => 'standard/standard_defines.stub', 'MON_6' => 'standard/standard_defines.stub', 'MON_7' => 'standard/standard_defines.stub', 'MON_8' => 'standard/standard_defines.stub', 'MON_9' => 'standard/standard_defines.stub', 'MON_DECIMAL_POINT' => 'standard/standard_defines.stub', 'MON_GROUPING' => 'standard/standard_defines.stub', 'MON_THOUSANDS_SEP' => 'standard/standard_defines.stub', 'MQSERIES_MQACT_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_AIX' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_BATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_BROKER' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_CHANNEL_INITIATOR' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_CICS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_CICS_BRIDGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_CICS_VSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_DEFAULT' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_DOS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_DQM' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_GUARDIAN' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_IMS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_IMS_BRIDGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_JAVA' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_MCAST_PUBLISH' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_MVS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_NOTES_AGENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_NO_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_NSK' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_OPEN_TP1' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_OS2' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_OS390' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_OS400' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_QMGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_QMGR_PUBLISH' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_RRS_BATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_SIB' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_SYSTEM_EXTENSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_TPF' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_UNIX' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_UNKNOWN' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_USER' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_USER_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_USER_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_VM' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_VMS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_VOS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_WINDOWS' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_WINDOWS_NT' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_WLM' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_XCF' => 'mqseries/mqseries.stub', 'MQSERIES_MQAT_ZOS' => 'mqseries/mqseries.stub', 'MQSERIES_MQBO_CURRENT_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQBO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQBO_VERSION_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_ADMIN_TOPIC_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_ALTERATION_DATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_ALTERATION_TIME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_APPL_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_AUTH_INFO_CONN_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_AUTH_INFO_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_AUTH_INFO_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_AUTH_INFO_OCSP_URL' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_AUTO_REORG_CATALOG' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_AUTO_REORG_START_TIME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_BACKOUT_REQ_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_BASE_OBJECT_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_BASE_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_BATCH_INTERFACE_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CF_STRUC_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CF_STRUC_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CHANNEL_AUTO_DEF_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CHILD' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CHINIT_SERVICE_PARM' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CHLAUTH_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CICS_FILE_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_DATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_NAMELIST' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_Q_MGR_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_TIME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_WORKLOAD_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUSTER_WORKLOAD_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CLUS_CHL_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_COMMAND_INPUT_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_COMMAND_REPLY_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_COMM_INFO_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_COMM_INFO_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CREATION_DATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CREATION_TIME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_CUSTOM' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_DEAD_LETTER_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_DEF_XMIT_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_DNS_GROUP' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_ENV_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_IGQ_USER_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_INITIATION_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_INSTALLATION_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_INSTALLATION_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_INSTALLATION_PATH' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LAST_USED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LDAP_PASSWORD' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LDAP_USER_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LU62_ARM_SUFFIX' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LU_GROUP_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_LU_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_MODEL_DURABLE_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_MODEL_NON_DURABLE_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_MONITOR_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_NAMELIST_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_NAMELIST_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_NAMES' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_PARENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_PASS_TICKET_APPL' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_POLICY_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_PROCESS_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_PROCESS_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_QSG_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_Q_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_Q_MGR_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_Q_MGR_IDENTIFIER' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_Q_MGR_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_RECIPIENT_DN' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_REMOTE_Q_MGR_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_REMOTE_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_REPOSITORY_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_REPOSITORY_NAMELIST' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_RESUME_DATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_RESUME_TIME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SERVICE_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SERVICE_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SERVICE_START_ARGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SERVICE_START_COMMAND' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SERVICE_STOP_ARGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SERVICE_STOP_COMMAND' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SIGNER_DN' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SSL_CRL_NAMELIST' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SSL_CRYPTO_HARDWARE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SSL_KEY_LIBRARY' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SSL_KEY_MEMBER' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SSL_KEY_REPOSITORY' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_STDERR_DESTINATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_STDOUT_DESTINATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_STORAGE_CLASS' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_STORAGE_CLASS_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_SYSTEM_LOG_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TCP_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TOPIC_DESC' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TOPIC_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TOPIC_STRING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TOPIC_STRING_FILTER' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TPIPE_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TRIGGER_CHANNEL_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TRIGGER_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TRIGGER_PROGRAM_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TRIGGER_TERM_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_TRIGGER_TRANS_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_USER_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_USER_LIST' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_XCF_GROUP_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_XCF_MEMBER_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_XMIT_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_XR_SSL_CIPHER_SUITES' => 'mqseries/mqseries.stub', 'MQSERIES_MQCA_XR_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_APPL' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_AS_PUBLISHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_DEFAULT' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_EMBEDDED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_INHERIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQCCSI_UNDEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCC_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCC_OK' => 'mqseries/mqseries.stub', 'MQSERIES_MQCC_UNKNOWN' => 'mqseries/mqseries.stub', 'MQSERIES_MQCC_WARNING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCI_NEW_SESSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCI_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ACCOUNTING_MQI_DISABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ACCOUNTING_MQI_ENABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ACCOUNTING_Q_DISABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ACCOUNTING_Q_ENABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ACTIVITY_TRACE_DISABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ACTIVITY_TRACE_ENABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ALL_CONVS_SHARE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_CD_FOR_OUTPUT_ONLY' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_CLIENT_BINDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_CURRENT_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_FASTPATH_BINDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_HANDLE_SHARE_BLOCK' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_HANDLE_SHARE_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_HANDLE_SHARE_NO_BLOCK' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_ISOLATED_BINDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_LOCAL_BINDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_NO_CONV_SHARING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_RECONNECT' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_RECONNECT_AS_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_RECONNECT_DISABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_RECONNECT_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_RESTRICT_CONN_TAG_QSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_RESTRICT_CONN_TAG_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_SERIALIZE_CONN_TAG_QSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_SERIALIZE_CONN_TAG_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_SHARED_BINDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_STANDARD_BINDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_USE_CD_SELECTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_VERSION_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_VERSION_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_VERSION_3' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_VERSION_4' => 'mqseries/mqseries.stub', 'MQSERIES_MQCNO_VERSION_5' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_DELETE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_DELETE_PURGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_IMMEDIATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_KEEP_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_QUIESCE' => 'mqseries/mqseries.stub', 'MQSERIES_MQCO_REMOVE_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQEC_CONNECTION_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQEC_MSG_ARRIVED' => 'mqseries/mqseries.stub', 'MQSERIES_MQEC_Q_MGR_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQEC_WAIT_CANCELED' => 'mqseries/mqseries.stub', 'MQSERIES_MQEC_WAIT_INTERVAL_EXPIRED' => 'mqseries/mqseries.stub', 'MQSERIES_MQEI_UNLIMITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_AS_PUBLISHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_DECIMAL_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_DECIMAL_NORMAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_DECIMAL_REVERSED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_DECIMAL_UNDEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_FLOAT_IEEE_NORMAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_FLOAT_IEEE_REVERSED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_FLOAT_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_FLOAT_S390' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_FLOAT_TNS' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_FLOAT_UNDEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_INTEGER_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_INTEGER_NORMAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_INTEGER_REVERSED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_INTEGER_UNDEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_NATIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_NORMAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_RESERVED_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_REVERSED' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_S390' => 'mqseries/mqseries.stub', 'MQSERIES_MQENC_TNS' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_ACTIVITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_APPL_CANNOT_BE_STARTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_APPL_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_APPL_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_APPL_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_BIND_OPEN_CLUSRCVR_DEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_BUFFER_OVERFLOW' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CHANNEL_COMPLETED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CHANNEL_FAIL' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CHANNEL_FAIL_RETRY' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_APPL_ABENDED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_APPL_NOT_STARTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_BRIDGE_FAILURE' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_CCSID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_CIH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_COMMAREA_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_CORREL_ID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_DLQ_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_ENCODING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_INTERNAL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_NOT_AUTHORIZED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_UOW_BACKED_OUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_CICS_UOW_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_COA' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_COD' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_DATA_LENGTH_NEGATIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_DATA_LENGTH_TOO_BIG' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_DATA_LENGTH_ZERO' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_EXPIRATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_IIH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_IMS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_IMS_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_IMS_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_IMS_NACK_1A_REASON_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_IMS_NACK_1A_REASON_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_LENGTH_OFF_BY_ONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_MAX_ACTIVITIES' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_MSG_SCOPE_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NAN' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NOT_AUTHORIZED_FOR_IMS' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NOT_A_GROUPUR_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NOT_A_REPOSITORY_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NOT_DELIVERED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_NOT_FORWARDED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_PAN' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_PUBLICATIONS_ON_REQUEST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_QUIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_SELECTOR_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_STOPPED_BY_CHAD_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_STOPPED_BY_MSG_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_STOPPED_BY_PUBSUB_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_SUBSCRIBER_IS_PUBLISHER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_SYSTEM_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_SYSTEM_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_TM_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_UNSUPPORTED_DELIVERY' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_UNSUPPORTED_FORWARDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQFB_XMIT_Q_MSG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_ADMIN' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_CHANNEL_COMPLETED' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_CICS' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_COMMAND_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_COMMAND_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_DEAD_LETTER_HEADER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_DIST_HEADER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_EMBEDDED_PCF' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_IMS' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_IMS_VAR_STRING' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_MD_EXTENSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_PCF' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_REF_MSG_HEADER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_RF_HEADER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_RF_HEADER_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_RF_HEADER_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_STRING' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_TRIGGER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_WORK_INFO_HEADER' => 'mqseries/mqseries.stub', 'MQSERIES_MQFMT_XMIT_Q_HEADER' => 'mqseries/mqseries.stub', 'MQSERIES_MQGI_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_ACCEPT_TRUNCATED_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_ALL_MSGS_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_ALL_SEGMENTS_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_BROWSE_CO_OP' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_BROWSE_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_BROWSE_HANDLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_BROWSE_MSG_UNDER_CURSOR' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_BROWSE_NEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_COMPLETE_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_CONVERT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_CURRENT_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_FAIL_IF_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_LOCK' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_LOGICAL_ORDER' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_MARK_BROWSE_CO_OP' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_MARK_BROWSE_HANDLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_MARK_SKIP_BACKOUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_MSG_UNDER_CURSOR' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_NO_PROPERTIES' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_NO_SYNCPOINT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_NO_WAIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_PROPERTIES_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_PROPERTIES_COMPATIBILITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_PROPERTIES_FORCE_MQRFH2' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_PROPERTIES_IN_HANDLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_SET_SIGNAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_SYNCPOINT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_SYNCPOINT_IF_PERSISTENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_UNLOCK' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_UNMARKED_BROWSE_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_UNMARK_BROWSE_CO_OP' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_UNMARK_BROWSE_HANDLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_VERSION_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_VERSION_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_VERSION_3' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_VERSION_4' => 'mqseries/mqseries.stub', 'MQSERIES_MQGMO_WAIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACCOUNTING_CONN_OVERRIDE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACCOUNTING_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACCOUNTING_MQI' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACCOUNTING_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACTIVE_CHANNELS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACTIVITY_CONN_OVERRIDE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACTIVITY_RECORDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ACTIVITY_TRACE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ADOPTNEWMCA_CHECK' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ADOPTNEWMCA_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ADOPTNEWMCA_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_APPL_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ARCHIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_AUTHORITY_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_AUTH_INFO_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_AUTO_REORGANIZATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_AUTO_REORG_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_BACKOUT_THRESHOLD' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_BASE_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_BATCH_INTERFACE_AUTO' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_BRIDGE_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CERT_VAL_POLICY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_CFCONLOS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_LEVEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_OFFLDUSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_OFFLOAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_OFFLOAD_THRESHOLD1' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_OFFLOAD_THRESHOLD2' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_OFFLOAD_THRESHOLD3' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_RECAUTO' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_RECOVER' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CF_SMDS_BUFFERS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHANNEL_AUTO_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHANNEL_AUTO_DEF_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHANNEL_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHINIT_ADAPTERS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHINIT_CONTROL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHINIT_DISPATCHERS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHINIT_TRACE_AUTO_START' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHINIT_TRACE_TABLE_SIZE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CHLAUTH_RECORDS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CLUSTER_Q_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CLUSTER_WORKLOAD_LENGTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CLWL_MRU_CHANNELS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CLWL_Q_PRIORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CLWL_Q_RANK' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CLWL_USEQ' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CMD_SERVER_AUTO' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CMD_SERVER_CONTROL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CMD_SERVER_CONVERT_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CMD_SERVER_DLQ_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CODED_CHAR_SET_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_COMMAND_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_COMMAND_LEVEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_COMM_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_COMM_INFO_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CONFIGURATION_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CPI_LEVEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_CURRENT_Q_DEPTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEFINITION_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_BIND' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_CLUSTER_XMIT_Q_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_INPUT_OPEN_OPTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_PERSISTENCE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_PRIORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_PUT_RESPONSE_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DEF_READ_AHEAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DIST_LISTS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DNS_WLM' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_DURABLE_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_ENCRYPTION_ALGORITHM' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_EXPIRY_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_GROUP_UR' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_HARDEN_GET_BACKOUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_HIGH_Q_DEPTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_IGQ_PUT_AUTHORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INDEX_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INHIBIT_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INHIBIT_GET' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INHIBIT_PUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INHIBIT_PUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INHIBIT_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_INTRA_GROUP_QUEUING' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_IP_ADDRESS_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_LISTENER_PORT_NUMBER' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_LISTENER_TIMER' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_LOCAL_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_LOGGER_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_LU62_CHANNELS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MASTER_ADMIN' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_CHANNELS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_CLIENTS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_GLOBAL_LOCKS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_HANDLES' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_LOCAL_LOCKS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_MSG_LENGTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_OPEN_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_PRIORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_PROPERTIES_LENGTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_Q_DEPTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_Q_TRIGGERS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_RECOVERY_TASKS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_RESPONSES' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MAX_UNCOMMITTED_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MCAST_BRIDGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MONITORING_AUTO_CLUSSDR' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MONITORING_CHANNEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MONITORING_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MONITOR_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MSG_DELIVERY_SEQUENCE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MSG_DEQ_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MSG_ENQ_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MSG_MARK_BROWSE_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_MULTICAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_NAMELIST_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_NAME_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_NPM_CLASS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_NPM_DELIVERY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_OPEN_INPUT_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_OPEN_OUTPUT_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_OUTBOUND_PORT_MAX' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_OUTBOUND_PORT_MIN' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PAGESET_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PERFORMANCE_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PLATFORM' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PM_DELIVERY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_POLICY_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PROPERTY_CONTROL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PROT_POLICY_CAPABILITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PROXY_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUBSUB_CLUSTER' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUBSUB_MAXMSG_RETRY_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUBSUB_MODE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUBSUB_NP_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUBSUB_NP_RESP' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUBSUB_SYNC_PT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUB_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_PUB_SCOPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMGR_CFCONLOS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_COMMS_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_CRITICAL_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_ERROR_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_INFO_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_REORG_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_SYSTEM_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CONS_WARNING_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_CSMT_ON_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_INTERNAL_DUMP' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_COMMS_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_CRITICAL_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_ERROR_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_INFO_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_REORG_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_SYSTEM_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_LOG_WARNING_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_TRACE_COMMS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_TRACE_CONVERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_TRACE_MQI_CALLS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_TRACE_REORG' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QMOPT_TRACE_SYSTEM' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_QSG_DISP' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_DEPTH_HIGH_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_DEPTH_HIGH_LIMIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_DEPTH_LOW_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_DEPTH_LOW_LIMIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_DEPTH_MAX_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_SERVICE_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_SERVICE_INTERVAL_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_Q_USERS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_READ_AHEAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_RECEIVE_TIMEOUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_RECEIVE_TIMEOUT_MIN' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_RECEIVE_TIMEOUT_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_REMOTE_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_RESPONSE_RESTART_POINT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_RETENTION_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SCOPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SECURITY_CASE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SERVICE_CONTROL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SERVICE_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SHAREABILITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SHARED_Q_Q_MGR_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SIGNATURE_ALGORITHM' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SSL_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SSL_FIPS_REQUIRED' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SSL_RESET_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SSL_TASKS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_START_STOP_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_STATISTICS_AUTO_CLUSSDR' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_STATISTICS_CHANNEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_STATISTICS_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_STATISTICS_MQI' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_STATISTICS_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SUB_CONFIGURATION_EVENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SUB_COUNT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SUB_SCOPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SUITE_B_STRENGTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_SYNCPOINT' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TCP_CHANNELS' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TCP_KEEP_ALIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TCP_STACK_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TIME_SINCE_RESET' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TOLERATE_UNPROTECTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TOPIC_DEF_PERSISTENCE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TOPIC_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRACE_ROUTE_RECORDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TREE_LIFE_TIME' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRIGGER_CONTROL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRIGGER_DEPTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRIGGER_INTERVAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRIGGER_MSG_PRIORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRIGGER_RESTART' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_TRIGGER_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_UR_DISP' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_USAGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_USER_LIST' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_USE_DEAD_LETTER_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_WILDCARD_OPERATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQIA_XR_CAPABILITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQMD_CURRENT_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQMD_VERSION_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQMD_VERSION_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_ACCEPT_UNSUP_IF_XMIT_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_ACCEPT_UNSUP_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_LAST_MSG_IN_GROUP' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_LAST_SEGMENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_MSG_IN_GROUP' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_REJECT_UNSUP_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_SEGMENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_SEGMENTATION_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQMF_SEGMENTATION_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQMI_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_MATCH_CORREL_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_MATCH_GROUP_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_MATCH_MSG_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_MATCH_MSG_SEQ_NUMBER' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_MATCH_MSG_TOKEN' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_MATCH_OFFSET' => 'mqseries/mqseries.stub', 'MQSERIES_MQMO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQMTOK_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_APPL_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_APPL_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_DATAGRAM' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_MQE_FIELDS' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_MQE_FIELDS_FROM_MQE' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_REPLY' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_REPORT' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_REQUEST' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_SYSTEM_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQMT_SYSTEM_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQOD_CURRENT_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQOD_VERSION_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQOD_VERSION_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQOD_VERSION_3' => 'mqseries/mqseries.stub', 'MQSERIES_MQOD_VERSION_4' => 'mqseries/mqseries.stub', 'MQSERIES_MQOL_UNDEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_ALTERNATE_USER_AUTHORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_BIND_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_BIND_NOT_FIXED' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_BIND_ON_GROUP' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_BIND_ON_OPEN' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_BROWSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_CO_OP' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_FAIL_IF_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_INPUT_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_INPUT_EXCLUSIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_INPUT_SHARED' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_INQUIRE' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_NO_MULTICAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_NO_READ_AHEAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_OUTPUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_PASS_ALL_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_PASS_IDENTITY_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_READ_AHEAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_READ_AHEAD_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_RESOLVE_LOCAL_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_RESOLVE_LOCAL_TOPIC' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_SAVE_ALL_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_SET' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_SET_ALL_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQOO_SET_IDENTITY_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_AUTH_INFO' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_CF_STRUC' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_CHANNEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_COMM_INFO' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_LISTENER' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_NAMELIST' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_PROCESS' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_RESERVED_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_SERVICE' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_STORAGE_CLASS' => 'mqseries/mqseries.stub', 'MQSERIES_MQOT_TOPIC' => 'mqseries/mqseries.stub', 'MQSERIES_MQPER_NOT_PERSISTENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPER_PERSISTENCE_AS_PARENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPER_PERSISTENCE_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQPER_PERSISTENCE_AS_TOPIC_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQPER_PERSISTENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_ALTERNATE_USER_AUTHORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_ASYNC_RESPONSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_CURRENT_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_DEFAULT_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_FAIL_IF_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_LOGICAL_ORDER' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_MD_FOR_OUTPUT_ONLY' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_NEW_CORREL_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_NEW_MSG_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_NOT_OWN_SUBS' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_NO_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_NO_SYNCPOINT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_PASS_ALL_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_PASS_IDENTITY_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_RESOLVE_LOCAL_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_RESPONSE_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_RESPONSE_AS_TOPIC_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_RETAIN' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_SCOPE_QMGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_SET_ALL_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_SET_IDENTITY_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_SUPPRESS_REPLYTO' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_SYNCPOINT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_SYNC_RESPONSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_VERSION_1' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_VERSION_2' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_VERSION_3' => 'mqseries/mqseries.stub', 'MQSERIES_MQPMO_WARN_IF_NO_SUBS_MATCHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRI_PRIORITY_AS_PARENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRI_PRIORITY_AS_PUBLISHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRI_PRIORITY_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRI_PRIORITY_AS_TOPIC_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRT_ASYNC_RESPONSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRT_RESPONSE_AS_PARENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQPRT_SYNC_RESPONSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ACTION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_CONN_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_CONV_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_DEFS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_DEFS_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_DISC_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_SERV_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ADAPTER_STORAGE_SHORTAGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_AIR_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ALIAS_BASE_Q_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ALIAS_TARGTYPE_CHANGED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ALREADY_CONNECTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ALREADY_JOINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ALTER_SUB_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ANOTHER_Q_MGR_CONNECTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_API_EXIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_API_EXIT_INIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_API_EXIT_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_API_EXIT_NOT_FOUND' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_API_EXIT_TERM_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_APPL_FIRST' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_APPL_LAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ASID_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ASYNC_UOW_CONFLICT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ASYNC_XA_CONFLICT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ATTRIBUTE_LOCKED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_AUTH_INFO_CONN_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_AUTH_INFO_REC_COUNT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_AUTH_INFO_REC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_AUTH_INFO_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BACKED_OUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BACKOUT_THRESHOLD_REACHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BAG_CONVERSION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BAG_WRONG_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BINARY_DATA_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BMHO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BRIDGE_STARTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BRIDGE_STOPPED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BUFFER_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BUFFER_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_BUFFER_NOT_AUTOMATIC' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CALLBACK_LINK_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CALLBACK_NOT_REGISTERED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CALLBACK_ROUTINE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CALLBACK_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CALL_INTERRUPTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CALL_IN_PROGRESS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CBD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CBD_OPTIONS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CD_ARRAY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CERT_VAL_POLICY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFBF_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFBS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFGR_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFIF_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFIL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFIN_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFSF_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFSL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CFST_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CF_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CF_STRUC_AUTH_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CF_STRUC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CF_STRUC_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CF_STRUC_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CF_STRUC_LIST_HDR_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_ACTIVATED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_AUTO_DEF_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_AUTO_DEF_OK' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_BLOCKED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_BLOCKED_WARNING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_CONFIG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_CONV_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_NOT_ACTIVATED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_SSL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_SSL_WARNING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_STARTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_STOPPED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHANNEL_STOPPED_BY_USER' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHAR_ATTRS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHAR_ATTRS_TOO_SHORT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHAR_ATTR_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CHAR_CONVERSION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CICS_BRIDGE_RESTRICTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CICS_WAIT_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CIPHER_SPEC_NOT_SUITE_B' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLIENT_CHANNEL_CONFLICT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLIENT_CONN_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLIENT_EXIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLIENT_EXIT_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLUSTER_EXIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLUSTER_EXIT_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLUSTER_PUT_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLUSTER_RESOLUTION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CLUSTER_RESOURCE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CMD_SERVER_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CMHO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CNO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CODED_CHAR_SET_ID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_COD_NOT_VALID_FOR_XCF_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_COMMAND_MQSC' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_COMMAND_PCF' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_COMMAND_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_COMMINFO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONFIG_CHANGE_OBJECT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONFIG_CREATE_OBJECT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONFIG_DELETE_OBJECT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONFIG_REFRESH_OBJECT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_BROKEN' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_NOT_AUTHORIZED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_STOPPED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_STOPPING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONNECTION_SUSPENDED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONN_ID_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONN_TAG_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONN_TAG_NOT_RELEASED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONN_TAG_NOT_USABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONTENT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONTEXT_HANDLE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONTEXT_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONTEXT_OBJECT_NOT_VALID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONTEXT_OPEN_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONVERTED_MSG_TOO_BIG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CONVERTED_STRING_TOO_BIG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CORREL_ID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CRYPTO_HARDWARE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CTLO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CURRENT_RECORD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_CURSOR_NOT_VALID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DATA_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DATA_SET_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DATA_TRUNCATED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DB2_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DBCS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DEF_SYNCPOINT_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DEF_XMIT_Q_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DEF_XMIT_Q_USAGE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DEST_CLASS_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DEST_ENV_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DEST_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DISTRIBUTION_LIST_EMPTY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DLH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DMHO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DMPO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DUPLICATE_GROUP_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DUPLICATE_RECOV_COORD' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DURABILITY_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DURABILITY_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_DYNAMIC_Q_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ENCODING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ENCODING_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ENVIRONMENT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_EPH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_EXIT_PROPS_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_EXIT_REASON_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_EXPIRY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FASTPATH_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FEEDBACK_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FILE_NOT_AUDITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FILE_SYSTEM_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FILTER_OPERATOR_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FORMAT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FORMAT_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FUNCTION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_FUNCTION_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GET_ENABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GET_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GLOBAL_UOW_CONFLICT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GMO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GROUPING_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GROUPING_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GROUP_ADDRESS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_GROUP_ID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HANDLE_IN_USE_FOR_UOW' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HANDLE_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HBAG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HCONFIG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HCONN_ASYNC_ACTIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HCONN_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HEADER_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HMSG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HMSG_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HOBJ_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HOBJ_QUIESCED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HOBJ_QUIESCED_NO_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_HOST_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_IDENTITY_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_IIH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_IMPO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCOMPLETE_GROUP' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCOMPLETE_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_BROWSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_CCSIDS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_ENCODINGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_FORMAT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_ITEM_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_OBJECT_STATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_OPEN_OPTIONS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_PERSISTENCE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INCONSISTENT_UOW' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INDEX_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INDEX_NOT_PRESENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INHIBIT_VALUE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INITIALIZATION_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INQUIRY_COMMAND_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INSTALLATION_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INSTALLATION_MISSING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INSUFFICIENT_BUFFER' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INSUFFICIENT_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INT_ATTRS_ARRAY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INT_ATTR_COUNT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INT_ATTR_COUNT_TOO_SMALL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INVALID_DESTINATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INVALID_MSG_UNDER_CURSOR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_INVALID_SUBSCRIPTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ITEM_COUNT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ITEM_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ITEM_VALUE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_JMS_FORMAT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_JSSE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_KEY_REPOSITORY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_LDAP_PASSWORD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_LDAP_USER_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_LDAP_USER_NAME_LENGTH_ERR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_LOCAL_UOW_CONFLICT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_LOGGER_STATUS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_LOOPING_PUBLICATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MATCH_OPTIONS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MAX_CONNS_LIMIT_REACHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MAX_MSG_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MCAST_PUB_STATUS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MCAST_SUB_STATUS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MDE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MHBO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MISSING_REPLY_TO_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MISSING_WIH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MIXED_CONTENT_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MODULE_ENTRY_NOT_FOUND' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MODULE_INVALID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MODULE_NOT_FOUND' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_FLAGS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_HANDLE_COPY_FAILURE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_HANDLE_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_ID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_MARKED_BROWSE_CO_OP' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_NOT_ALLOWED_IN_GROUP' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_NOT_MATCHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_SEQ_NUMBER_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_TOKEN_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_TOO_BIG_FOR_CHANNEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_TOO_BIG_FOR_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_TOO_BIG_FOR_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MSG_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTICAST_CONFIG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTICAST_INTERFACE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTICAST_INTERNAL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTICAST_ONLY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTICAST_SEND_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTIPLE_INSTANCE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_MULTIPLE_REASONS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NAME_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NAME_NOT_VALID_FOR_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NEGATIVE_LENGTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NEGATIVE_OFFSET' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NESTED_BAG_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NESTED_SELECTOR_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NEXT_OFFSET_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NEXT_RECORD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_AUTHORIZED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_CONNECTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_CONVERTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_BROWSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_INPUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_INQUIRE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_OUTPUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_PASS_ALL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_PASS_IDENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_SET' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_SET_ALL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_OPEN_FOR_SET_IDENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NOT_PRIVILEGED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_BUFFER' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_CALLBACKS_ACTIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_CONNECTION_REFERENCE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_DATA_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_DESTINATIONS_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_EXTERNAL_PARTICIPANTS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_MSG_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_MSG_LOCKED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_MSG_UNDER_CURSOR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_RECORD_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_RETAINED_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_SUBSCRIPTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NO_SUBS_MATCHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_NULL_POINTER' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_ALREADY_EXISTS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_CHANGED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_DAMAGED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_LEVEL_INCOMPATIBLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_NOT_UNIQUE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_Q_MGR_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_RECORDS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_STRING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OBJECT_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OCSP_URL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OFFSET_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPEN_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPERATION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPERATION_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPTIONS_CHANGED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPTIONS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPTION_ENVIRONMENT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OPTION_NOT_VALID_FOR_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ORIGINAL_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OUTCOME_MIXED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OUTCOME_PENDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_OUT_SELECTOR_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PAGESET_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PAGESET_FULL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PARAMETER_MISSING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PARTIALLY_CONVERTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PARTICIPANT_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PARTICIPANT_NOT_DEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PCF_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PERSISTENCE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PERSISTENT_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PMO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PMO_RECORD_FLAGS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PRECONN_EXIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PRECONN_EXIT_LOAD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PRECONN_EXIT_NOT_FOUND' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PRIORITY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PRIORITY_EXCEEDS_MAXIMUM' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTIES_DISABLED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTIES_TOO_BIG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTY_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTY_NAME_LENGTH_ERR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTY_NAME_TOO_BIG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTY_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTY_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROPERTY_VALUE_TOO_BIG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROP_CONV_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROP_NAME_NOT_CONVERTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROP_NUMBER_FORMAT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROP_TYPE_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PROP_VALUE_NOT_CONVERTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PUBLICATION_FAILURE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PUBLISH_EXIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PUBSUB_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PUT_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PUT_MSG_RECORDS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_PUT_NOT_RETAINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_ALREADY_EXISTS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_DELETED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_DEPTH_HIGH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_DEPTH_LOW' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_FULL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_INDEX_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_MGR_ACTIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_MGR_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_MGR_NOT_ACTIVE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_MGR_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_MGR_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_MGR_STOPPING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_NOT_EMPTY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_SERVICE_INTERVAL_HIGH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_SERVICE_INTERVAL_OK' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_SPACE_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_Q_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RAS_PROPERTY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_READ_AHEAD_MSGS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECTING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECT_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECT_INCOMPATIBLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECT_QMID_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECT_Q_MGR_REQD' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECONNECT_TIMED_OUT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RECS_PRESENT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REFERENCE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REMOTE_Q_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REOPEN_EXCL_INPUT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REOPEN_INQUIRE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REOPEN_SAVED_CONTEXT_ERR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REOPEN_TEMPORARY_Q_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_REPORT_OPTIONS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RESERVED_VALUE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RESOURCE_PROBLEM' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RESPONSE_RECORDS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RES_OBJECT_STRING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RETAINED_MSG_Q_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RETAINED_NOT_DELIVERED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_COMMAND_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_DUPLICATE_PARM' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_FORMAT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_HEADER_FIELD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_PARM_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_PARM_MISSING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_RESTRICTED_FORMAT_ERR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RFH_STRING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_RMH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SCO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SD_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SECOND_MARK_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SECURITY_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SEGMENTATION_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SEGMENTS_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SEGMENT_LENGTH_ZERO' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTION_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTION_STRING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_ALWAYS_FALSE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_COUNT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_INVALID_FOR_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_LIMIT_EXCEEDED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_NOT_FOR_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_NOT_PRESENT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_NOT_UNIQUE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_OUT_OF_RANGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_SYNTAX_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SELECTOR_WRONG_TYPE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SERVICE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SERVICE_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SIGNAL1_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SIGNAL_OUTSTANDING' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SIGNAL_REQUEST_ACCEPTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SMPO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOAP_AXIS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOAP_DOTNET_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOAP_URL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOURCE_BUFFER_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOURCE_CCSID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOURCE_DECIMAL_ENC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOURCE_FLOAT_ENC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOURCE_INTEGER_ENC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SOURCE_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SRC_ENV_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SRC_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SRO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_ALREADY_INITIALIZED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_ALT_PROVIDER_REQUIRED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_CERTIFICATE_REVOKED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_CERT_STORE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_CONFIG_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_INITIALIZATION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_KEY_RESET_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_PEER_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SSL_PEER_NAME_MISMATCH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STANDBY_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STAT_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STOPPED_BY_CLUSTER_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STORAGE_CLASS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STORAGE_MEDIUM_FULL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STORAGE_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STRING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STRING_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STRING_TRUNCATED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STRUC_ID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STRUC_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_STS_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUBLEVEL_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUBSCRIPTION_CHANGE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUBSCRIPTION_CREATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUBSCRIPTION_DELETE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUBSCRIPTION_IN_USE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUBSCRIPTION_REFRESH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUB_ALREADY_EXISTS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUB_INHIBITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUB_NAME_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUB_USER_DATA_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUITE_B_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SUPPRESSED_BY_EXIT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYNCPOINT_LIMIT_REACHED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYNCPOINT_NOT_ALLOWED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYNCPOINT_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYSTEM_BAG_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYSTEM_BAG_NOT_DELETABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYSTEM_ITEM_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_SYSTEM_ITEM_NOT_DELETABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TARGET_BUFFER_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TARGET_CCSID_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TARGET_DECIMAL_ENC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TARGET_FLOAT_ENC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TARGET_INTEGER_ENC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TARGET_LENGTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TERMINATION_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TMC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TM_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TOPIC_NOT_ALTERABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TOPIC_STRING_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRIGGER_CONTROL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRIGGER_DEPTH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRIGGER_MSG_PRIORITY_ERR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRIGGER_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRUNCATED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRUNCATED_MSG_ACCEPTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_TRUNCATED_MSG_FAILED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UCS2_CONVERSION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNEXPECTED_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNIT_OF_WORK_NOT_STARTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_ALIAS_BASE_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_AUTH_ENTITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_CHANNEL_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_COMPONENT_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_DEF_XMIT_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_ENTITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_OBJECT_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_OBJECT_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_Q_NAME' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_REF_OBJECT' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_REMOTE_Q_MGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_REPORT_OPTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNKNOWN_XMIT_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNSUPPORTED_CIPHER_SUITE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UNSUPPORTED_PROPERTY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UOW_CANCELED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UOW_COMMITTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UOW_ENLISTMENT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UOW_IN_PROGRESS' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UOW_MIX_NOT_SUPPORTED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_UOW_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_USER_ID_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WAIT_INTERVAL_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WIH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WRONG_CF_LEVEL' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WRONG_GMO_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WRONG_MD_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WRONG_VERSION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_WXP_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XEPO_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XMIT_Q_TYPE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XMIT_Q_USAGE_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XQH_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XR_NOT_AVAILABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XWAIT_CANCELED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_XWAIT_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQRC_ZERO_LENGTH' => 'mqseries/mqseries.stub', 'MQSERIES_MQRL_UNDEFINED' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_ACCEPT_UNSUP_IF_XMIT_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_ACCEPT_UNSUP_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_ACTIVITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COA_WITH_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COA_WITH_FULL_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COD' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COD_WITH_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COD_WITH_FULL_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_COPY_MSG_ID_TO_CORREL_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_DEAD_LETTER_Q' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_DISCARD_MSG' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_EXCEPTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_EXCEPTION_WITH_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_EXCEPTION_WITH_FULL_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_EXPIRATION' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_EXPIRATION_WITH_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_EXPIRATION_WITH_FULL_DATA' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_NAN' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_NEW_MSG_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_PAN' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_PASS_CORREL_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_PASS_DISCARD_AND_EXPIRY' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_PASS_MSG_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQRO_REJECT_UNSUP_MASK' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_ALTER' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_ALTERNATE_USER_AUTHORITY' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_ANY_USERID' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_CREATE' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_DURABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_FAIL_IF_QUIESCING' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_FIXED_USERID' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_GROUP_SUB' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_MANAGED' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_NEW_PUBLICATIONS_ONLY' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_NONE' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_NON_DURABLE' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_NO_MULTICAST' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_NO_READ_AHEAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_PUBLICATIONS_ON_REQUEST' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_READ_AHEAD' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_READ_AHEAD_AS_Q_DEF' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_RESUME' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_SCOPE_QMGR' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_SET_CORREL_ID' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_SET_IDENTITY_CONTEXT' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_WILDCARD_CHAR' => 'mqseries/mqseries.stub', 'MQSERIES_MQSO_WILDCARD_TOPIC' => 'mqseries/mqseries.stub', 'MQSERIES_MQSTAT_TYPE_ASYNC_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQSTAT_TYPE_RECONNECTION' => 'mqseries/mqseries.stub', 'MQSERIES_MQSTAT_TYPE_RECONNECTION_ERROR' => 'mqseries/mqseries.stub', 'MQSERIES_MQWI_UNLIMITED' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_ALL' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_DECNET' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_LOCAL' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_LU62' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_NETBIOS' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_SPX' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_TCP' => 'mqseries/mqseries.stub', 'MQSERIES_MQXPT_UDP' => 'mqseries/mqseries.stub', 'MSG_CMSG_CLOEXEC' => 'sockets/sockets.stub', 'MSG_CONFIRM' => 'sockets/sockets.stub', 'MSG_CTRUNC' => 'sockets/sockets.stub', 'MSG_DONTROUTE' => 'sockets/sockets.stub', 'MSG_DONTWAIT' => 'sockets/sockets.stub', 'MSG_EAGAIN' => 'sysvmsg/sysvmsg.stub', 'MSG_ENOMSG' => 'sysvmsg/sysvmsg.stub', 'MSG_EOF' => 'sockets/sockets.stub', 'MSG_EOR' => 'sockets/sockets.stub', 'MSG_ERRQUEUE' => 'sockets/sockets.stub', 'MSG_EXCEPT' => 'sysvmsg/sysvmsg.stub', 'MSG_IPC_NOWAIT' => 'sysvmsg/sysvmsg.stub', 'MSG_MORE' => 'sockets/sockets.stub', 'MSG_NOERROR' => 'sysvmsg/sysvmsg.stub', 'MSG_NOSIGNAL' => 'sockets/sockets.stub', 'MSG_OOB' => 'sockets/sockets.stub', 'MSG_PEEK' => 'sockets/sockets.stub', 'MSG_TRUNC' => 'sockets/sockets.stub', 'MSG_WAITALL' => 'sockets/sockets.stub', 'MSG_WAITFORONE' => 'sockets/sockets.stub', 'MSG_ZEROCOPY' => 'sockets/sockets.stub', 'MSSQL_ASSOC' => 'mssql/mssql.stub', 'MSSQL_BOTH' => 'mssql/mssql.stub', 'MSSQL_NUM' => 'mssql/mssql.stub', 'MS_ALIGN_CENTER' => 'mapscript/mapscript.stub', 'MS_ALIGN_LEFT' => 'mapscript/mapscript.stub', 'MS_ALIGN_RIGHT' => 'mapscript/mapscript.stub', 'MS_AUTO' => 'mapscript/mapscript.stub', 'MS_AUTO2' => 'mapscript/mapscript.stub', 'MS_CC' => 'mapscript/mapscript.stub', 'MS_CGIERR' => 'mapscript/mapscript.stub', 'MS_CL' => 'mapscript/mapscript.stub', 'MS_CR' => 'mapscript/mapscript.stub', 'MS_DBFERR' => 'mapscript/mapscript.stub', 'MS_DD' => 'mapscript/mapscript.stub', 'MS_DEFAULT' => 'mapscript/mapscript.stub', 'MS_DELETE' => 'mapscript/mapscript.stub', 'MS_EMBED' => 'mapscript/mapscript.stub', 'MS_EOFERR' => 'mapscript/mapscript.stub', 'MS_FALSE' => 'mapscript/mapscript.stub', 'MS_FEET' => 'mapscript/mapscript.stub', 'MS_FOLLOW' => 'mapscript/mapscript.stub', 'MS_GDERR' => 'mapscript/mapscript.stub', 'MS_GD_ALPHA' => 'mapscript/mapscript.stub', 'MS_GET_REQUEST' => 'mapscript/mapscript.stub', 'MS_GIANT' => 'mapscript/mapscript.stub', 'MS_GRATICULE' => 'mapscript/mapscript.stub', 'MS_HASHERR' => 'mapscript/mapscript.stub', 'MS_HILITE' => 'mapscript/mapscript.stub', 'MS_HTTPERR' => 'mapscript/mapscript.stub', 'MS_IDENTERR' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_BYTE' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_FEATURE' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_FLOAT32' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_INT16' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_NULL' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_PC256' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_RGB' => 'mapscript/mapscript.stub', 'MS_IMAGEMODE_RGBA' => 'mapscript/mapscript.stub', 'MS_IMGERR' => 'mapscript/mapscript.stub', 'MS_INCHES' => 'mapscript/mapscript.stub', 'MS_INLINE' => 'mapscript/mapscript.stub', 'MS_IOERR' => 'mapscript/mapscript.stub', 'MS_JOINERR' => 'mapscript/mapscript.stub', 'MS_KILOMETERS' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_ANGLE' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_COLOR' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_FONT' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_OUTLINECOLOR' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_POSITION' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_PRIORITY' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_SHADOWSIZEX' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_SHADOWSIZEY' => 'mapscript/mapscript.stub', 'MS_LABEL_BINDING_SIZE' => 'mapscript/mapscript.stub', 'MS_LARGE' => 'mapscript/mapscript.stub', 'MS_LAYER_ANNOTATION' => 'mapscript/mapscript.stub', 'MS_LAYER_CHART' => 'mapscript/mapscript.stub', 'MS_LAYER_CIRCLE' => 'mapscript/mapscript.stub', 'MS_LAYER_LINE' => 'mapscript/mapscript.stub', 'MS_LAYER_POINT' => 'mapscript/mapscript.stub', 'MS_LAYER_POLYGON' => 'mapscript/mapscript.stub', 'MS_LAYER_QUERY' => 'mapscript/mapscript.stub', 'MS_LAYER_RASTER' => 'mapscript/mapscript.stub', 'MS_LAYER_TILEINDEX' => 'mapscript/mapscript.stub', 'MS_LC' => 'mapscript/mapscript.stub', 'MS_LL' => 'mapscript/mapscript.stub', 'MS_LR' => 'mapscript/mapscript.stub', 'MS_MAPCONTEXTERR' => 'mapscript/mapscript.stub', 'MS_MEDIUM' => 'mapscript/mapscript.stub', 'MS_MEMERR' => 'mapscript/mapscript.stub', 'MS_METERS' => 'mapscript/mapscript.stub', 'MS_MILES' => 'mapscript/mapscript.stub', 'MS_MISCERR' => 'mapscript/mapscript.stub', 'MS_MULTIPLE' => 'mapscript/mapscript.stub', 'MS_NAUTICALMILES' => 'mapscript/mapscript.stub', 'MS_NO' => 'mapscript/mapscript.stub', 'MS_NOERR' => 'mapscript/mapscript.stub', 'MS_NONE' => 'mapscript/mapscript.stub', 'MS_NORMAL' => 'mapscript/mapscript.stub', 'MS_NOTFOUND' => 'mapscript/mapscript.stub', 'MS_OFF' => 'mapscript/mapscript.stub', 'MS_OGR' => 'mapscript/mapscript.stub', 'MS_OGRERR' => 'mapscript/mapscript.stub', 'MS_ON' => 'mapscript/mapscript.stub', 'MS_ORACLESPATIAL' => 'mapscript/mapscript.stub', 'MS_ORACLESPATIALERR' => 'mapscript/mapscript.stub', 'MS_PARSEERR' => 'mapscript/mapscript.stub', 'MS_PIXELS' => 'mapscript/mapscript.stub', 'MS_PLUGIN' => 'mapscript/mapscript.stub', 'MS_POSTGIS' => 'mapscript/mapscript.stub', 'MS_POST_REQUEST' => 'mapscript/mapscript.stub', 'MS_PROJERR' => 'mapscript/mapscript.stub', 'MS_QUERYERR' => 'mapscript/mapscript.stub', 'MS_RASTER' => 'mapscript/mapscript.stub', 'MS_REGEXERR' => 'mapscript/mapscript.stub', 'MS_SDE' => 'mapscript/mapscript.stub', 'MS_SDEERR' => 'mapscript/mapscript.stub', 'MS_SELECTED' => 'mapscript/mapscript.stub', 'MS_SHAPEFILE' => 'mapscript/mapscript.stub', 'MS_SHAPE_LINE' => 'mapscript/mapscript.stub', 'MS_SHAPE_NULL' => 'mapscript/mapscript.stub', 'MS_SHAPE_POINT' => 'mapscript/mapscript.stub', 'MS_SHAPE_POLYGON' => 'mapscript/mapscript.stub', 'MS_SHPERR' => 'mapscript/mapscript.stub', 'MS_SHP_ARC' => 'mapscript/mapscript.stub', 'MS_SHP_MULTIPOINT' => 'mapscript/mapscript.stub', 'MS_SHP_POINT' => 'mapscript/mapscript.stub', 'MS_SHP_POLYGON' => 'mapscript/mapscript.stub', 'MS_SINGLE' => 'mapscript/mapscript.stub', 'MS_SMALL' => 'mapscript/mapscript.stub', 'MS_STYLE_BINDING_ANGLE' => 'mapscript/mapscript.stub', 'MS_STYLE_BINDING_COLOR' => 'mapscript/mapscript.stub', 'MS_STYLE_BINDING_OUTLINECOLOR' => 'mapscript/mapscript.stub', 'MS_STYLE_BINDING_SIZE' => 'mapscript/mapscript.stub', 'MS_STYLE_BINDING_SYMBOL' => 'mapscript/mapscript.stub', 'MS_STYLE_BINDING_WIDTH' => 'mapscript/mapscript.stub', 'MS_SYMBOL_ELLIPSE' => 'mapscript/mapscript.stub', 'MS_SYMBOL_PIXMAP' => 'mapscript/mapscript.stub', 'MS_SYMBOL_SIMPLE' => 'mapscript/mapscript.stub', 'MS_SYMBOL_TRUETYPE' => 'mapscript/mapscript.stub', 'MS_SYMBOL_VECTOR' => 'mapscript/mapscript.stub', 'MS_SYMERR' => 'mapscript/mapscript.stub', 'MS_TILED_OGR' => 'mapscript/mapscript.stub', 'MS_TILED_SHAPEFILE' => 'mapscript/mapscript.stub', 'MS_TINY' => 'mapscript/mapscript.stub', 'MS_TRUE' => 'mapscript/mapscript.stub', 'MS_TTFERR' => 'mapscript/mapscript.stub', 'MS_TYPEERR' => 'mapscript/mapscript.stub', 'MS_UC' => 'mapscript/mapscript.stub', 'MS_UL' => 'mapscript/mapscript.stub', 'MS_UNION' => 'mapscript/mapscript.stub', 'MS_UR' => 'mapscript/mapscript.stub', 'MS_WCSERR' => 'mapscript/mapscript.stub', 'MS_WEBERR' => 'mapscript/mapscript.stub', 'MS_WFS' => 'mapscript/mapscript.stub', 'MS_WFSCONNERR' => 'mapscript/mapscript.stub', 'MS_WFSERR' => 'mapscript/mapscript.stub', 'MS_WMS' => 'mapscript/mapscript.stub', 'MS_WMSCONNERR' => 'mapscript/mapscript.stub', 'MS_WMSERR' => 'mapscript/mapscript.stub', 'MS_XY' => 'mapscript/mapscript.stub', 'MS_YES' => 'mapscript/mapscript.stub', 'MT_RAND_MT19937' => 'standard/standard_defines.stub', 'MT_RAND_PHP' => 'standard/standard_defines.stub', 'MYSQLI_ASSOC' => 'mysqli/mysqli.stub', 'MYSQLI_ASYNC' => 'mysqli/mysqli.stub', 'MYSQLI_AUTO_INCREMENT_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_BINARY_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_BLOB_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_BOTH' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_COMPRESS' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_FOUND_ROWS' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_IGNORE_SPACE' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_INTERACTIVE' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_NO_SCHEMA' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_SSL' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT' => 'mysqli/mysqli.stub', 'MYSQLI_CLIENT_SSL_VERIFY_SERVER_CERT' => 'mysqli/mysqli.stub', 'MYSQLI_CURSOR_TYPE_FOR_UPDATE' => 'mysqli/mysqli.stub', 'MYSQLI_CURSOR_TYPE_NO_CURSOR' => 'mysqli/mysqli.stub', 'MYSQLI_CURSOR_TYPE_READ_ONLY' => 'mysqli/mysqli.stub', 'MYSQLI_CURSOR_TYPE_SCROLLABLE' => 'mysqli/mysqli.stub', 'MYSQLI_DATA_TRUNCATED' => 'mysqli/mysqli.stub', 'MYSQLI_DEBUG_TRACE_ENABLED' => 'mysqli/mysqli.stub', 'MYSQLI_ENUM_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_GROUP_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_INIT_COMMAND' => 'mysqli/mysqli.stub', 'MYSQLI_IS_MARIADB' => 'mysqli/mysqli.stub', 'MYSQLI_MULTIPLE_KEY_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_NOT_NULL_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_NO_DATA' => 'mysqli/mysqli.stub', 'MYSQLI_NO_DEFAULT_VALUE_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_NUM' => 'mysqli/mysqli.stub', 'MYSQLI_NUM_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_ON_UPDATE_NOW_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_CONNECT_TIMEOUT' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_INT_AND_FLOAT_NATIVE' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_LOAD_DATA_LOCAL_DIR' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_LOCAL_INFILE' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_NET_CMD_BUFFER_SIZE' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_NET_READ_BUFFER_SIZE' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_READ_TIMEOUT' => 'mysqli/mysqli.stub', 'MYSQLI_OPT_SSL_VERIFY_SERVER_CERT' => 'mysqli/mysqli.stub', 'MYSQLI_PART_KEY_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_PRI_KEY_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_READ_DEFAULT_FILE' => 'mysqli/mysqli.stub', 'MYSQLI_READ_DEFAULT_GROUP' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_BACKUP_LOG' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_GRANT' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_HOSTS' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_LOG' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_MASTER' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_REPLICA' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_SLAVE' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_STATUS' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_TABLES' => 'mysqli/mysqli.stub', 'MYSQLI_REFRESH_THREADS' => 'mysqli/mysqli.stub', 'MYSQLI_REPORT_ALL' => 'mysqli/mysqli.stub', 'MYSQLI_REPORT_ERROR' => 'mysqli/mysqli.stub', 'MYSQLI_REPORT_INDEX' => 'mysqli/mysqli.stub', 'MYSQLI_REPORT_OFF' => 'mysqli/mysqli.stub', 'MYSQLI_REPORT_STRICT' => 'mysqli/mysqli.stub', 'MYSQLI_SERVER_PS_OUT_PARAMS' => 'mysqli/mysqli.stub', 'MYSQLI_SERVER_PUBLIC_KEY' => 'mysqli/mysqli.stub', 'MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED' => 'mysqli/mysqli.stub', 'MYSQLI_SERVER_QUERY_NO_INDEX_USED' => 'mysqli/mysqli.stub', 'MYSQLI_SERVER_QUERY_WAS_SLOW' => 'mysqli/mysqli.stub', 'MYSQLI_SET_CHARSET_DIR' => 'mysqli/mysqli.stub', 'MYSQLI_SET_CHARSET_NAME' => 'mysqli/mysqli.stub', 'MYSQLI_SET_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_STMT_ATTR_CURSOR_TYPE' => 'mysqli/mysqli.stub', 'MYSQLI_STMT_ATTR_PREFETCH_ROWS' => 'mysqli/mysqli.stub', 'MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH' => 'mysqli/mysqli.stub', 'MYSQLI_STORE_RESULT' => 'mysqli/mysqli.stub', 'MYSQLI_STORE_RESULT_COPY_DATA' => 'mysqli/mysqli.stub', 'MYSQLI_TIMESTAMP_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_COR_AND_CHAIN' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_COR_AND_NO_CHAIN' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_COR_NO_RELEASE' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_COR_RELEASE' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_START_READ_ONLY' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_START_READ_WRITE' => 'mysqli/mysqli.stub', 'MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_BIT' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_BLOB' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_CHAR' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_DATE' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_DATETIME' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_DECIMAL' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_DOUBLE' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_ENUM' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_FLOAT' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_GEOMETRY' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_INT24' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_INTERVAL' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_JSON' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_LONG' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_LONGLONG' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_LONG_BLOB' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_MEDIUM_BLOB' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_NEWDATE' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_NEWDECIMAL' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_NULL' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_SET' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_SHORT' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_STRING' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_TIME' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_TIMESTAMP' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_TINY' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_TINY_BLOB' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_VAR_STRING' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_VECTOR' => 'mysqli/mysqli.stub', 'MYSQLI_TYPE_YEAR' => 'mysqli/mysqli.stub', 'MYSQLI_UNIQUE_KEY_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_UNSIGNED_FLAG' => 'mysqli/mysqli.stub', 'MYSQLI_USE_RESULT' => 'mysqli/mysqli.stub', 'MYSQLI_ZEROFILL_FLAG' => 'mysqli/mysqli.stub', 'MYSQLX_LOCK_DEFAULT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_LOCK_NOWAIT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_LOCK_SKIP_LOCKED' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_BIGINT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_BIT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_BLOB' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_BYTES' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_CHAR' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_DATE' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_DATETIME' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_DECIMAL' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_DOUBLE' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_ENUM' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_FLOAT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_GEOMETRY' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_INT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_INT24' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_INTERVAL' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_JSON' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_LONG' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_LONGLONG' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_LONG_BLOB' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_MEDIUMINT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_MEDIUM_BLOB' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_NEWDATE' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_NEWDECIMAL' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_NULL' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_SET' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_SHORT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_SMALLINT' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_STRING' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_TIME' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_TIMESTAMP' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_TINY' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_TINY_BLOB' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_VAR_STRING' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQLX_TYPE_YEAR' => 'mysql_xdevapi/mysql_xdevapi.stub', 'MYSQL_ASSOC' => 'mysql/mysql.stub', 'MYSQL_BOTH' => 'mysql/mysql.stub', 'MYSQL_CLIENT_COMPRESS' => 'mysql/mysql.stub', 'MYSQL_CLIENT_IGNORE_SPACE' => 'mysql/mysql.stub', 'MYSQL_CLIENT_INTERACTIVE' => 'mysql/mysql.stub', 'MYSQL_CLIENT_SSL' => 'mysql/mysql.stub', 'MYSQL_NUM' => 'mysql/mysql.stub', 'M_1_PI' => 'standard/standard_defines.stub', 'M_2_PI' => 'standard/standard_defines.stub', 'M_2_SQRTPI' => 'standard/standard_defines.stub', 'M_E' => 'standard/standard_defines.stub', 'M_EULER' => 'standard/standard_defines.stub', 'M_LN10' => 'standard/standard_defines.stub', 'M_LN2' => 'standard/standard_defines.stub', 'M_LNPI' => 'standard/standard_defines.stub', 'M_LOG10E' => 'standard/standard_defines.stub', 'M_LOG2E' => 'standard/standard_defines.stub', 'M_PI' => 'standard/standard_defines.stub', 'M_PI_2' => 'standard/standard_defines.stub', 'M_PI_4' => 'standard/standard_defines.stub', 'M_SQRT1_2' => 'standard/standard_defines.stub', 'M_SQRT2' => 'standard/standard_defines.stub', 'M_SQRT3' => 'standard/standard_defines.stub', 'M_SQRTPI' => 'standard/standard_defines.stub', 'Menu' => 'winbinder/winbinder.stub', 'ModalDialog' => 'winbinder/winbinder.stub', 'ModelessDialog' => 'winbinder/winbinder.stub', 'NAN' => 'standard/standard_defines.stub', 'NCURSES_ALL_MOUSE_EVENTS' => 'ncurses/ncurses.stub', 'NCURSES_A_ALTCHARSET' => 'ncurses/ncurses.stub', 'NCURSES_A_BLINK' => 'ncurses/ncurses.stub', 'NCURSES_A_BOLD' => 'ncurses/ncurses.stub', 'NCURSES_A_CHARTEXT' => 'ncurses/ncurses.stub', 'NCURSES_A_DIM' => 'ncurses/ncurses.stub', 'NCURSES_A_INVIS' => 'ncurses/ncurses.stub', 'NCURSES_A_NORMAL' => 'ncurses/ncurses.stub', 'NCURSES_A_PROTECT' => 'ncurses/ncurses.stub', 'NCURSES_A_REVERSE' => 'ncurses/ncurses.stub', 'NCURSES_A_STANDOUT' => 'ncurses/ncurses.stub', 'NCURSES_A_UNDERLINE' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON1_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON1_DOUBLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON1_PRESSED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON1_RELEASED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON1_TRIPLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON2_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON2_DOUBLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON2_PRESSED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON2_RELEASED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON2_TRIPLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON3_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON3_DOUBLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON3_PRESSED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON3_RELEASED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON3_TRIPLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON4_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON4_DOUBLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON4_PRESSED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON4_RELEASED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON4_TRIPLE_CLICKED' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON_ALT' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON_CTRL' => 'ncurses/ncurses.stub', 'NCURSES_BUTTON_SHIFT' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_BLACK' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_BLUE' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_CYAN' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_GREEN' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_MAGENTA' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_RED' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_WHITE' => 'ncurses/ncurses.stub', 'NCURSES_COLOR_YELLOW' => 'ncurses/ncurses.stub', 'NCURSES_KEY_A1' => 'ncurses/ncurses.stub', 'NCURSES_KEY_A3' => 'ncurses/ncurses.stub', 'NCURSES_KEY_B2' => 'ncurses/ncurses.stub', 'NCURSES_KEY_BACKSPACE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_BEG' => 'ncurses/ncurses.stub', 'NCURSES_KEY_BTAB' => 'ncurses/ncurses.stub', 'NCURSES_KEY_C1' => 'ncurses/ncurses.stub', 'NCURSES_KEY_C3' => 'ncurses/ncurses.stub', 'NCURSES_KEY_CANCEL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_CATAB' => 'ncurses/ncurses.stub', 'NCURSES_KEY_CLEAR' => 'ncurses/ncurses.stub', 'NCURSES_KEY_CLOSE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_COMMAND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_COPY' => 'ncurses/ncurses.stub', 'NCURSES_KEY_CREATE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_CTAB' => 'ncurses/ncurses.stub', 'NCURSES_KEY_DC' => 'ncurses/ncurses.stub', 'NCURSES_KEY_DL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_DOWN' => 'ncurses/ncurses.stub', 'NCURSES_KEY_EIC' => 'ncurses/ncurses.stub', 'NCURSES_KEY_END' => 'ncurses/ncurses.stub', 'NCURSES_KEY_ENTER' => 'ncurses/ncurses.stub', 'NCURSES_KEY_EOL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_EOS' => 'ncurses/ncurses.stub', 'NCURSES_KEY_EXIT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F0' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F1' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F10' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F11' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F12' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F2' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F3' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F4' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F5' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F6' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F7' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F8' => 'ncurses/ncurses.stub', 'NCURSES_KEY_F9' => 'ncurses/ncurses.stub', 'NCURSES_KEY_FIND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_HELP' => 'ncurses/ncurses.stub', 'NCURSES_KEY_HOME' => 'ncurses/ncurses.stub', 'NCURSES_KEY_IC' => 'ncurses/ncurses.stub', 'NCURSES_KEY_IL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_LEFT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_LL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_MARK' => 'ncurses/ncurses.stub', 'NCURSES_KEY_MESSAGE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_MOUSE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_MOVE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_NEXT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_NPAGE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_OPEN' => 'ncurses/ncurses.stub', 'NCURSES_KEY_OPTIONS' => 'ncurses/ncurses.stub', 'NCURSES_KEY_PPAGE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_PREVIOUS' => 'ncurses/ncurses.stub', 'NCURSES_KEY_PRINT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_REDO' => 'ncurses/ncurses.stub', 'NCURSES_KEY_REFERENCE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_REFRESH' => 'ncurses/ncurses.stub', 'NCURSES_KEY_REPLACE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_RESET' => 'ncurses/ncurses.stub', 'NCURSES_KEY_RESIZE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_RESTART' => 'ncurses/ncurses.stub', 'NCURSES_KEY_RESUME' => 'ncurses/ncurses.stub', 'NCURSES_KEY_RIGHT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SAVE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SBEG' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SCANCEL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SCOMMAND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SCOPY' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SCREATE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SDC' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SDL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SELECT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SEND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SEOL' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SEXIT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SF' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SFIND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SHELP' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SHOME' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SIC' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SLEFT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SMESSAGE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SMOVE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SNEXT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SOPTIONS' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SPREVIOUS' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SPRINT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SR' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SREDO' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SREPLACE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SRESET' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SRIGHT' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SRSUME' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SSAVE' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SSUSPEND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_STAB' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SUNDO' => 'ncurses/ncurses.stub', 'NCURSES_KEY_SUSPEND' => 'ncurses/ncurses.stub', 'NCURSES_KEY_UNDO' => 'ncurses/ncurses.stub', 'NCURSES_KEY_UP' => 'ncurses/ncurses.stub', 'NCURSES_REPORT_MOUSE_POSITION' => 'ncurses/ncurses.stub', 'NEGATIVE_SIGN' => 'standard/standard_defines.stub', 'NIL' => 'imap/imap.stub', 'NOCOLOR' => 'winbinder/winbinder.stub', 'NOEXPR' => 'standard/standard_defines.stub', 'NORM_IGNORECASE' => 'com_dotnet/com_dotnet.stub', 'NORM_IGNOREKANATYPE' => 'com_dotnet/com_dotnet.stub', 'NORM_IGNOREKASHIDA' => 'com_dotnet/com_dotnet.stub', 'NORM_IGNORENONSPACE' => 'com_dotnet/com_dotnet.stub', 'NORM_IGNORESYMBOLS' => 'com_dotnet/com_dotnet.stub', 'NORM_IGNOREWIDTH' => 'com_dotnet/com_dotnet.stub', 'NOSTR' => 'standard/standard_defines.stub', 'N_CS_PRECEDES' => 'standard/standard_defines.stub', 'N_SEP_BY_SPACE' => 'standard/standard_defines.stub', 'N_SIGN_POSN' => 'standard/standard_defines.stub', 'NakedWindow' => 'winbinder/winbinder.stub', 'OAUTH_AUTH_TYPE_AUTHORIZATION' => 'oauth/oauth.stub', 'OAUTH_AUTH_TYPE_FORM' => 'oauth/oauth.stub', 'OAUTH_AUTH_TYPE_NONE' => 'oauth/oauth.stub', 'OAUTH_AUTH_TYPE_URI' => 'oauth/oauth.stub', 'OAUTH_BAD_NONCE' => 'oauth/oauth.stub', 'OAUTH_BAD_TIMESTAMP' => 'oauth/oauth.stub', 'OAUTH_CONSUMER_KEY_REFUSED' => 'oauth/oauth.stub', 'OAUTH_CONSUMER_KEY_UNKNOWN' => 'oauth/oauth.stub', 'OAUTH_HTTP_METHOD_DELETE' => 'oauth/oauth.stub', 'OAUTH_HTTP_METHOD_GET' => 'oauth/oauth.stub', 'OAUTH_HTTP_METHOD_HEAD' => 'oauth/oauth.stub', 'OAUTH_HTTP_METHOD_POST' => 'oauth/oauth.stub', 'OAUTH_HTTP_METHOD_PUT' => 'oauth/oauth.stub', 'OAUTH_INVALID_SIGNATURE' => 'oauth/oauth.stub', 'OAUTH_OK' => 'oauth/oauth.stub', 'OAUTH_PARAMETER_ABSENT' => 'oauth/oauth.stub', 'OAUTH_REQENGINE_CURL' => 'oauth/oauth.stub', 'OAUTH_REQENGINE_STREAMS' => 'oauth/oauth.stub', 'OAUTH_SIGNATURE_METHOD_REJECTED' => 'oauth/oauth.stub', 'OAUTH_SIG_METHOD_HMACSHA1' => 'oauth/oauth.stub', 'OAUTH_SIG_METHOD_HMACSHA256' => 'oauth/oauth.stub', 'OAUTH_SIG_METHOD_RSASHA1' => 'oauth/oauth.stub', 'OAUTH_TOKEN_EXPIRED' => 'oauth/oauth.stub', 'OAUTH_TOKEN_REJECTED' => 'oauth/oauth.stub', 'OAUTH_TOKEN_USED' => 'oauth/oauth.stub', 'OAUTH_VERIFIER_INVALID' => 'oauth/oauth.stub', 'OCI_ASSOC' => 'oci8/oci8.stub', 'OCI_BOTH' => 'oci8/oci8.stub', 'OCI_B_BFILE' => 'oci8/oci8.stub', 'OCI_B_BIN' => 'oci8/oci8.stub', 'OCI_B_BLOB' => 'oci8/oci8.stub', 'OCI_B_BOL' => 'oci8/oci8.stub', 'OCI_B_CFILEE' => 'oci8/oci8.stub', 'OCI_B_CLOB' => 'oci8/oci8.stub', 'OCI_B_CURSOR' => 'oci8/oci8.stub', 'OCI_B_INT' => 'oci8/oci8.stub', 'OCI_B_NTY' => 'oci8/oci8.stub', 'OCI_B_NUM' => 'oci8/oci8.stub', 'OCI_B_ROWID' => 'oci8/oci8.stub', 'OCI_COMMIT_ON_SUCCESS' => 'oci8/oci8.stub', 'OCI_CRED_EXT' => 'oci8/oci8.stub', 'OCI_DEFAULT' => 'oci8/oci8.stub', 'OCI_DESCRIBE_ONLY' => 'oci8/oci8.stub', 'OCI_DTYPE_FILE' => 'oci8/oci8.stub', 'OCI_DTYPE_LOB' => 'oci8/oci8.stub', 'OCI_DTYPE_ROWID' => 'oci8/oci8.stub', 'OCI_D_FILE' => 'oci8/oci8.stub', 'OCI_D_LOB' => 'oci8/oci8.stub', 'OCI_D_ROWID' => 'oci8/oci8.stub', 'OCI_EXACT_FETCH' => 'oci8/oci8.stub', 'OCI_FETCHSTATEMENT_BY_COLUMN' => 'oci8/oci8.stub', 'OCI_FETCHSTATEMENT_BY_ROW' => 'oci8/oci8.stub', 'OCI_LOB_BUFFER_FREE' => 'oci8/oci8.stub', 'OCI_NO_AUTO_COMMIT' => 'oci8/oci8.stub', 'OCI_NUM' => 'oci8/oci8.stub', 'OCI_RETURN_LOBS' => 'oci8/oci8.stub', 'OCI_RETURN_NULLS' => 'oci8/oci8.stub', 'OCI_SEEK_CUR' => 'oci8/oci8.stub', 'OCI_SEEK_END' => 'oci8/oci8.stub', 'OCI_SEEK_SET' => 'oci8/oci8.stub', 'OCI_SYSDATE' => 'oci8/oci8.stub', 'OCI_SYSDBA' => 'oci8/oci8.stub', 'OCI_SYSOPER' => 'oci8/oci8.stub', 'OCI_TEMP_BLOB' => 'oci8/oci8.stub', 'OCI_TEMP_CLOB' => 'oci8/oci8.stub', 'ODBC_BINMODE_CONVERT' => 'odbc/odbc.stub', 'ODBC_BINMODE_PASSTHRU' => 'odbc/odbc.stub', 'ODBC_BINMODE_RETURN' => 'odbc/odbc.stub', 'ODBC_TYPE' => 'odbc/odbc.stub', 'OPENSSL_ALGO_DSS1' => 'openssl/openssl.stub', 'OPENSSL_ALGO_MD2' => 'openssl/openssl.stub', 'OPENSSL_ALGO_MD4' => 'openssl/openssl.stub', 'OPENSSL_ALGO_MD5' => 'openssl/openssl.stub', 'OPENSSL_ALGO_RMD160' => 'openssl/openssl.stub', 'OPENSSL_ALGO_SHA1' => 'openssl/openssl.stub', 'OPENSSL_ALGO_SHA224' => 'openssl/openssl.stub', 'OPENSSL_ALGO_SHA256' => 'openssl/openssl.stub', 'OPENSSL_ALGO_SHA384' => 'openssl/openssl.stub', 'OPENSSL_ALGO_SHA512' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_3DES' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_AES_128_CBC' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_AES_192_CBC' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_AES_256_CBC' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_DES' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_RC2_128' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_RC2_40' => 'openssl/openssl.stub', 'OPENSSL_CIPHER_RC2_64' => 'openssl/openssl.stub', 'OPENSSL_CMS_BINARY' => 'openssl/openssl.stub', 'OPENSSL_CMS_DETACHED' => 'openssl/openssl.stub', 'OPENSSL_CMS_NOATTR' => 'openssl/openssl.stub', 'OPENSSL_CMS_NOCERTS' => 'openssl/openssl.stub', 'OPENSSL_CMS_NOINTERN' => 'openssl/openssl.stub', 'OPENSSL_CMS_NOSIGS' => 'openssl/openssl.stub', 'OPENSSL_CMS_NOVERIFY' => 'openssl/openssl.stub', 'OPENSSL_CMS_OLDMIMETYPE' => 'openssl/openssl.stub', 'OPENSSL_CMS_TEXT' => 'openssl/openssl.stub', 'OPENSSL_DEFAULT_STREAM_CIPHERS' => 'openssl/openssl.stub', 'OPENSSL_DONT_ZERO_PAD_KEY' => 'openssl/openssl.stub', 'OPENSSL_ENCODING_DER' => 'openssl/openssl.stub', 'OPENSSL_ENCODING_PEM' => 'openssl/openssl.stub', 'OPENSSL_ENCODING_SMIME' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_DH' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_DSA' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_EC' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_ED25519' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_ED448' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_RSA' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_X25519' => 'openssl/openssl.stub', 'OPENSSL_KEYTYPE_X448' => 'openssl/openssl.stub', 'OPENSSL_NO_PADDING' => 'openssl/openssl.stub', 'OPENSSL_PKCS1_OAEP_PADDING' => 'openssl/openssl.stub', 'OPENSSL_PKCS1_PADDING' => 'openssl/openssl.stub', 'OPENSSL_RAW_DATA' => 'openssl/openssl.stub', 'OPENSSL_SSLV23_PADDING' => 'openssl/openssl.stub', 'OPENSSL_TLSEXT_SERVER_NAME' => 'openssl/openssl.stub', 'OPENSSL_VERSION_NUMBER' => 'openssl/openssl.stub', 'OPENSSL_VERSION_TEXT' => 'openssl/openssl.stub', 'OPENSSL_ZERO_PADDING' => 'openssl/openssl.stub', 'OP_ANONYMOUS' => 'imap/imap.stub', 'OP_DEBUG' => 'imap/imap.stub', 'OP_EXPUNGE' => 'imap/imap.stub', 'OP_HALFOPEN' => 'imap/imap.stub', 'OP_PROTOTYPE' => 'imap/imap.stub', 'OP_READONLY' => 'imap/imap.stub', 'OP_SECURE' => 'imap/imap.stub', 'OP_SHORTCACHE' => 'imap/imap.stub', 'OP_SILENT' => 'imap/imap.stub', 'O_APPEND' => 'dio/dio_d.stub', 'O_ASYNC' => 'dio/dio_d.stub', 'O_CREAT' => 'dio/dio_d.stub', 'O_EXCL' => 'dio/dio_d.stub', 'O_NDELAY' => 'dio/dio_d.stub', 'O_NOCTTY' => 'dio/dio_d.stub', 'O_NONBLOCK' => 'dio/dio_d.stub', 'O_RDONLY' => 'dio/dio_d.stub', 'O_RDWR' => 'dio/dio_d.stub', 'O_SYNC' => 'dio/dio_d.stub', 'O_TRUNC' => 'dio/dio_d.stub', 'O_WRONLY' => 'dio/dio_d.stub', 'PASSWORD_ARGON2I' => 'standard/password.stub', 'PASSWORD_ARGON2ID' => 'standard/password.stub', 'PASSWORD_ARGON2_DEFAULT_MEMORY_COST' => 'standard/password.stub', 'PASSWORD_ARGON2_DEFAULT_THREADS' => 'standard/password.stub', 'PASSWORD_ARGON2_DEFAULT_TIME_COST' => 'standard/password.stub', 'PASSWORD_ARGON2_PROVIDER' => 'standard/password.stub', 'PASSWORD_BCRYPT' => 'standard/password.stub', 'PASSWORD_BCRYPT_DEFAULT_COST' => 'standard/password.stub', 'PASSWORD_DEFAULT' => 'standard/password.stub', 'PATHINFO_ALL' => 'standard/standard_defines.stub', 'PATHINFO_BASENAME' => 'standard/standard_defines.stub', 'PATHINFO_DIRNAME' => 'standard/standard_defines.stub', 'PATHINFO_EXTENSION' => 'standard/standard_defines.stub', 'PATHINFO_FILENAME' => 'standard/standard_defines.stub', 'PATH_SEPARATOR' => 'standard/standard_defines.stub', 'PCNTL_E2BIG' => 'pcntl/pcntl.stub', 'PCNTL_EACCES' => 'pcntl/pcntl.stub', 'PCNTL_EAGAIN' => 'pcntl/pcntl.stub', 'PCNTL_ECHILD' => 'pcntl/pcntl.stub', 'PCNTL_EFAULT' => 'pcntl/pcntl.stub', 'PCNTL_EINTR' => 'pcntl/pcntl.stub', 'PCNTL_EINVAL' => 'pcntl/pcntl.stub', 'PCNTL_EIO' => 'pcntl/pcntl.stub', 'PCNTL_EISDIR' => 'pcntl/pcntl.stub', 'PCNTL_ELIBBAD' => 'pcntl/pcntl.stub', 'PCNTL_ELOOP' => 'pcntl/pcntl.stub', 'PCNTL_EMFILE' => 'pcntl/pcntl.stub', 'PCNTL_ENAMETOOLONG' => 'pcntl/pcntl.stub', 'PCNTL_ENFILE' => 'pcntl/pcntl.stub', 'PCNTL_ENOENT' => 'pcntl/pcntl.stub', 'PCNTL_ENOEXEC' => 'pcntl/pcntl.stub', 'PCNTL_ENOMEM' => 'pcntl/pcntl.stub', 'PCNTL_ENOSPC' => 'pcntl/pcntl.stub', 'PCNTL_ENOTDIR' => 'pcntl/pcntl.stub', 'PCNTL_EPERM' => 'pcntl/pcntl.stub', 'PCNTL_ESRCH' => 'pcntl/pcntl.stub', 'PCNTL_ETXTBSY' => 'pcntl/pcntl.stub', 'PCNTL_EUSERS' => 'pcntl/pcntl.stub', 'PCRE_JIT_SUPPORT' => 'pcre/pcre.stub', 'PCRE_VERSION' => 'pcre/pcre.stub', 'PCRE_VERSION_MAJOR' => 'pcre/pcre.stub', 'PCRE_VERSION_MINOR' => 'pcre/pcre.stub', 'PEAR_EXTENSION_DIR' => 'Core/Core_d.stub', 'PEAR_INSTALL_DIR' => 'Core/Core_d.stub', 'PGSQL_ASSOC' => 'pgsql/pgsql.stub', 'PGSQL_BAD_RESPONSE' => 'pgsql/pgsql.stub', 'PGSQL_BOTH' => 'pgsql/pgsql.stub', 'PGSQL_COMMAND_OK' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_AUTH_OK' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_AWAITING_RESPONSE' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_BAD' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_MADE' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_OK' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_SETENV' => 'pgsql/pgsql.stub', 'PGSQL_CONNECTION_STARTED' => 'pgsql/pgsql.stub', 'PGSQL_CONNECT_ASYNC' => 'pgsql/pgsql.stub', 'PGSQL_CONNECT_FORCE_NEW' => 'pgsql/pgsql.stub', 'PGSQL_CONV_FORCE_NULL' => 'pgsql/pgsql.stub', 'PGSQL_CONV_IGNORE_DEFAULT' => 'pgsql/pgsql.stub', 'PGSQL_CONV_IGNORE_NOT_NULL' => 'pgsql/pgsql.stub', 'PGSQL_COPY_IN' => 'pgsql/pgsql.stub', 'PGSQL_COPY_OUT' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_COLUMN_NAME' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_CONSTRAINT_NAME' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_CONTEXT' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_DATATYPE_NAME' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_INTERNAL_POSITION' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_INTERNAL_QUERY' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_MESSAGE_DETAIL' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_MESSAGE_HINT' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_MESSAGE_PRIMARY' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SCHEMA_NAME' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SEVERITY' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SEVERITY_NONLOCALIZED' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SOURCE_FILE' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SOURCE_FUNCTION' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SOURCE_LINE' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_SQLSTATE' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_STATEMENT_POSITION' => 'pgsql/pgsql.stub', 'PGSQL_DIAG_TABLE_NAME' => 'pgsql/pgsql.stub', 'PGSQL_DML_ASYNC' => 'pgsql/pgsql.stub', 'PGSQL_DML_ESCAPE' => 'pgsql/pgsql.stub', 'PGSQL_DML_EXEC' => 'pgsql/pgsql.stub', 'PGSQL_DML_NO_CONV' => 'pgsql/pgsql.stub', 'PGSQL_DML_STRING' => 'pgsql/pgsql.stub', 'PGSQL_EMPTY_QUERY' => 'pgsql/pgsql.stub', 'PGSQL_ERRORS_DEFAULT' => 'pgsql/pgsql.stub', 'PGSQL_ERRORS_SQLSTATE' => 'pgsql/pgsql.stub', 'PGSQL_ERRORS_TERSE' => 'pgsql/pgsql.stub', 'PGSQL_ERRORS_VERBOSE' => 'pgsql/pgsql.stub', 'PGSQL_FATAL_ERROR' => 'pgsql/pgsql.stub', 'PGSQL_LIBPQ_VERSION' => 'pgsql/pgsql.stub', 'PGSQL_LIBPQ_VERSION_STR' => 'pgsql/pgsql.stub', 'PGSQL_NONFATAL_ERROR' => 'pgsql/pgsql.stub', 'PGSQL_NOTICE_ALL' => 'pgsql/pgsql.stub', 'PGSQL_NOTICE_CLEAR' => 'pgsql/pgsql.stub', 'PGSQL_NOTICE_LAST' => 'pgsql/pgsql.stub', 'PGSQL_NUM' => 'pgsql/pgsql.stub', 'PGSQL_PIPELINE_ABORTED' => 'pgsql/pgsql.stub', 'PGSQL_PIPELINE_OFF' => 'pgsql/pgsql.stub', 'PGSQL_PIPELINE_ON' => 'pgsql/pgsql.stub', 'PGSQL_PIPELINE_SYNC' => 'pgsql/pgsql.stub', 'PGSQL_POLLING_ACTIVE' => 'pgsql/pgsql.stub', 'PGSQL_POLLING_FAILED' => 'pgsql/pgsql.stub', 'PGSQL_POLLING_OK' => 'pgsql/pgsql.stub', 'PGSQL_POLLING_READING' => 'pgsql/pgsql.stub', 'PGSQL_POLLING_WRITING' => 'pgsql/pgsql.stub', 'PGSQL_SEEK_CUR' => 'pgsql/pgsql.stub', 'PGSQL_SEEK_END' => 'pgsql/pgsql.stub', 'PGSQL_SEEK_SET' => 'pgsql/pgsql.stub', 'PGSQL_SHOW_CONTEXT_ALWAYS' => 'pgsql/pgsql.stub', 'PGSQL_SHOW_CONTEXT_ERRORS' => 'pgsql/pgsql.stub', 'PGSQL_SHOW_CONTEXT_NEVER' => 'pgsql/pgsql.stub', 'PGSQL_STATUS_LONG' => 'pgsql/pgsql.stub', 'PGSQL_STATUS_STRING' => 'pgsql/pgsql.stub', 'PGSQL_TRACE_REGRESS_MODE' => 'pgsql/pgsql.stub', 'PGSQL_TRANSACTION_ACTIVE' => 'pgsql/pgsql.stub', 'PGSQL_TRANSACTION_IDLE' => 'pgsql/pgsql.stub', 'PGSQL_TRANSACTION_INERROR' => 'pgsql/pgsql.stub', 'PGSQL_TRANSACTION_INTRANS' => 'pgsql/pgsql.stub', 'PGSQL_TRANSACTION_UNKNOWN' => 'pgsql/pgsql.stub', 'PGSQL_TUPLES_OK' => 'pgsql/pgsql.stub', 'PHP_AMQP_MAX_CHANNELS' => 'amqp/amqp.stub', 'PHP_BINARY' => 'Core/Core_d.stub', 'PHP_BINARY_READ' => 'sockets/sockets.stub', 'PHP_BINDIR' => 'Core/Core_d.stub', 'PHP_CLI_PROCESS_TITLE' => 'Core/Core_d.stub', 'PHP_CONFIG_FILE_PATH' => 'Core/Core_d.stub', 'PHP_CONFIG_FILE_SCAN_DIR' => 'Core/Core_d.stub', 'PHP_DATADIR' => 'Core/Core_d.stub', 'PHP_DEBUG' => 'Core/Core_d.stub', 'PHP_EOL' => 'Core/Core_d.stub', 'PHP_EXTENSION_DIR' => 'Core/Core_d.stub', 'PHP_EXTRA_VERSION' => 'Core/Core_d.stub', 'PHP_FD_SETSIZE' => 'Core/Core_d.stub', 'PHP_FLOAT_DIG' => 'Core/Core_d.stub', 'PHP_FLOAT_EPSILON' => 'Core/Core_d.stub', 'PHP_FLOAT_MAX' => 'Core/Core_d.stub', 'PHP_FLOAT_MIN' => 'Core/Core_d.stub', 'PHP_INT_MAX' => 'Core/Core_d.stub', 'PHP_INT_MIN' => 'Core/Core_d.stub', 'PHP_INT_SIZE' => 'Core/Core_d.stub', 'PHP_LIBDIR' => 'Core/Core_d.stub', 'PHP_LOCALSTATEDIR' => 'Core/Core_d.stub', 'PHP_MAJOR_VERSION' => 'Core/Core_d.stub', 'PHP_MANDIR' => 'Core/Core_d.stub', 'PHP_MAXPATHLEN' => 'Core/Core_d.stub', 'PHP_MINOR_VERSION' => 'Core/Core_d.stub', 'PHP_NORMAL_READ' => 'sockets/sockets.stub', 'PHP_OS' => 'Core/Core_d.stub', 'PHP_OS_FAMILY' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_CLEAN' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_CLEANABLE' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_CONT' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_DISABLED' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_END' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_FINAL' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_FLUSH' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_FLUSHABLE' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_PROCESSED' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_REMOVABLE' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_START' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_STARTED' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_STDFLAGS' => 'Core/Core_d.stub', 'PHP_OUTPUT_HANDLER_WRITE' => 'Core/Core_d.stub', 'PHP_PREFIX' => 'Core/Core_d.stub', 'PHP_QUERY_RFC1738' => 'standard/standard_defines.stub', 'PHP_QUERY_RFC3986' => 'standard/standard_defines.stub', 'PHP_RELEASE_VERSION' => 'Core/Core_d.stub', 'PHP_ROUND_HALF_DOWN' => 'standard/standard_defines.stub', 'PHP_ROUND_HALF_EVEN' => 'standard/standard_defines.stub', 'PHP_ROUND_HALF_ODD' => 'standard/standard_defines.stub', 'PHP_ROUND_HALF_UP' => 'standard/standard_defines.stub', 'PHP_SAPI' => 'Core/Core_d.stub', 'PHP_SBINDIR' => 'Core/Core_d.stub', 'PHP_SESSION_ACTIVE' => 'standard/standard_defines.stub', 'PHP_SESSION_DISABLED' => 'standard/standard_defines.stub', 'PHP_SESSION_NONE' => 'standard/standard_defines.stub', 'PHP_SHLIB_SUFFIX' => 'Core/Core_d.stub', 'PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS' => 'svn/svn.stub', 'PHP_SYSCONFDIR' => 'Core/Core_d.stub', 'PHP_URL_FRAGMENT' => 'standard/standard_defines.stub', 'PHP_URL_HOST' => 'standard/standard_defines.stub', 'PHP_URL_PASS' => 'standard/standard_defines.stub', 'PHP_URL_PATH' => 'standard/standard_defines.stub', 'PHP_URL_PORT' => 'standard/standard_defines.stub', 'PHP_URL_QUERY' => 'standard/standard_defines.stub', 'PHP_URL_SCHEME' => 'standard/standard_defines.stub', 'PHP_URL_USER' => 'standard/standard_defines.stub', 'PHP_VERSION' => 'Core/Core_d.stub', 'PHP_VERSION_ID' => 'Core/Core_d.stub', 'PHP_WINDOWS_EVENT_CTRL_BREAK' => 'Core/Core_d.stub', 'PHP_WINDOWS_EVENT_CTRL_C' => 'Core/Core_d.stub', 'PHP_WINDOWS_NT_DOMAIN_CONTROLLER' => 'Core/Core_d.stub', 'PHP_WINDOWS_NT_SERVER' => 'Core/Core_d.stub', 'PHP_WINDOWS_NT_WORKSTATION' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_BUILD' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_MAJOR' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_MINOR' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_PLATFORM' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_PRODUCTTYPE' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_SP_MAJOR' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_SP_MINOR' => 'Core/Core_d.stub', 'PHP_WINDOWS_VERSION_SUITEMASK' => 'Core/Core_d.stub', 'PHP_ZTS' => 'Core/Core_d.stub', 'PKCS7_BINARY' => 'openssl/openssl.stub', 'PKCS7_DETACHED' => 'openssl/openssl.stub', 'PKCS7_NOATTR' => 'openssl/openssl.stub', 'PKCS7_NOCERTS' => 'openssl/openssl.stub', 'PKCS7_NOCHAIN' => 'openssl/openssl.stub', 'PKCS7_NOINTERN' => 'openssl/openssl.stub', 'PKCS7_NOOLDMIMETYPE' => 'openssl/openssl.stub', 'PKCS7_NOSIGS' => 'openssl/openssl.stub', 'PKCS7_NOVERIFY' => 'openssl/openssl.stub', 'PKCS7_TEXT' => 'openssl/openssl.stub', 'PM_STR' => 'standard/standard_defines.stub', 'PNG_ALL_FILTERS' => 'gd/gd.stub', 'PNG_FILTER_AVG' => 'gd/gd.stub', 'PNG_FILTER_NONE' => 'gd/gd.stub', 'PNG_FILTER_PAETH' => 'gd/gd.stub', 'PNG_FILTER_SUB' => 'gd/gd.stub', 'PNG_FILTER_UP' => 'gd/gd.stub', 'PNG_NO_FILTER' => 'gd/gd.stub', 'POLL_ERR' => 'pcntl/pcntl.stub', 'POLL_HUP' => 'pcntl/pcntl.stub', 'POLL_IN' => 'pcntl/pcntl.stub', 'POLL_MSG' => 'pcntl/pcntl.stub', 'POLL_OUT' => 'pcntl/pcntl.stub', 'POLL_PRI' => 'pcntl/pcntl.stub', 'POSITIVE_SIGN' => 'standard/standard_defines.stub', 'POSIX_F_OK' => 'posix/posix.stub', 'POSIX_PC_ALLOC_SIZE_MIN' => 'posix/posix.stub', 'POSIX_PC_CHOWN_RESTRICTED' => 'posix/posix.stub', 'POSIX_PC_LINK_MAX' => 'posix/posix.stub', 'POSIX_PC_MAX_CANON' => 'posix/posix.stub', 'POSIX_PC_MAX_INPUT' => 'posix/posix.stub', 'POSIX_PC_NAME_MAX' => 'posix/posix.stub', 'POSIX_PC_NO_TRUNC' => 'posix/posix.stub', 'POSIX_PC_PATH_MAX' => 'posix/posix.stub', 'POSIX_PC_PIPE_BUF' => 'posix/posix.stub', 'POSIX_PC_SYMLINK_MAX' => 'posix/posix.stub', 'POSIX_RLIMIT_AS' => 'posix/posix.stub', 'POSIX_RLIMIT_CORE' => 'posix/posix.stub', 'POSIX_RLIMIT_CPU' => 'posix/posix.stub', 'POSIX_RLIMIT_DATA' => 'posix/posix.stub', 'POSIX_RLIMIT_FSIZE' => 'posix/posix.stub', 'POSIX_RLIMIT_INFINITY' => 'posix/posix.stub', 'POSIX_RLIMIT_LOCKS' => 'posix/posix.stub', 'POSIX_RLIMIT_MEMLOCK' => 'posix/posix.stub', 'POSIX_RLIMIT_MSGQUEUE' => 'posix/posix.stub', 'POSIX_RLIMIT_NICE' => 'posix/posix.stub', 'POSIX_RLIMIT_NOFILE' => 'posix/posix.stub', 'POSIX_RLIMIT_NPROC' => 'posix/posix.stub', 'POSIX_RLIMIT_RSS' => 'posix/posix.stub', 'POSIX_RLIMIT_RTPRIO' => 'posix/posix.stub', 'POSIX_RLIMIT_RTTIME' => 'posix/posix.stub', 'POSIX_RLIMIT_SIGPENDING' => 'posix/posix.stub', 'POSIX_RLIMIT_STACK' => 'posix/posix.stub', 'POSIX_R_OK' => 'posix/posix.stub', 'POSIX_SC_ARG_MAX' => 'posix/posix.stub', 'POSIX_SC_CHILD_MAX' => 'posix/posix.stub', 'POSIX_SC_CLK_TCK' => 'posix/posix.stub', 'POSIX_SC_NPROCESSORS_CONF' => 'posix/posix.stub', 'POSIX_SC_NPROCESSORS_ONLN' => 'posix/posix.stub', 'POSIX_SC_PAGESIZE' => 'posix/posix.stub', 'POSIX_S_IFBLK' => 'posix/posix.stub', 'POSIX_S_IFCHR' => 'posix/posix.stub', 'POSIX_S_IFIFO' => 'posix/posix.stub', 'POSIX_S_IFREG' => 'posix/posix.stub', 'POSIX_S_IFSOCK' => 'posix/posix.stub', 'POSIX_W_OK' => 'posix/posix.stub', 'POSIX_X_OK' => 'posix/posix.stub', 'PREG_BACKTRACK_LIMIT_ERROR' => 'pcre/pcre.stub', 'PREG_BAD_UTF8_ERROR' => 'pcre/pcre.stub', 'PREG_BAD_UTF8_OFFSET_ERROR' => 'pcre/pcre.stub', 'PREG_GREP_INVERT' => 'pcre/pcre.stub', 'PREG_INTERNAL_ERROR' => 'pcre/pcre.stub', 'PREG_JIT_STACKLIMIT_ERROR' => 'pcre/pcre.stub', 'PREG_NO_ERROR' => 'pcre/pcre.stub', 'PREG_OFFSET_CAPTURE' => 'pcre/pcre.stub', 'PREG_PATTERN_ORDER' => 'pcre/pcre.stub', 'PREG_RECURSION_LIMIT_ERROR' => 'pcre/pcre.stub', 'PREG_SET_ORDER' => 'pcre/pcre.stub', 'PREG_SPLIT_DELIM_CAPTURE' => 'pcre/pcre.stub', 'PREG_SPLIT_NO_EMPTY' => 'pcre/pcre.stub', 'PREG_SPLIT_OFFSET_CAPTURE' => 'pcre/pcre.stub', 'PREG_UNMATCHED_AS_NULL' => 'pcre/pcre.stub', 'PRIO_PGRP' => 'pcntl/pcntl.stub', 'PRIO_PROCESS' => 'pcntl/pcntl.stub', 'PRIO_USER' => 'pcntl/pcntl.stub', 'PSFS_ERR_FATAL' => 'standard/standard_defines.stub', 'PSFS_FEED_ME' => 'standard/standard_defines.stub', 'PSFS_FLAG_FLUSH_CLOSE' => 'standard/standard_defines.stub', 'PSFS_FLAG_FLUSH_INC' => 'standard/standard_defines.stub', 'PSFS_FLAG_NORMAL' => 'standard/standard_defines.stub', 'PSFS_PASS_ON' => 'standard/standard_defines.stub', 'PSPELL_BAD_SPELLERS' => 'pspell/pspell.stub', 'PSPELL_FAST' => 'pspell/pspell.stub', 'PSPELL_NORMAL' => 'pspell/pspell.stub', 'PSPELL_RUN_TOGETHER' => 'pspell/pspell.stub', 'PTHREADS_ALLOW_HEADERS' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_ALL' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_CLASSES' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_COMMENTS' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_CONSTANTS' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_FUNCTIONS' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_INCLUDES' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_INI' => 'pthreads/pthreads.stub', 'PTHREADS_INHERIT_NONE' => 'pthreads/pthreads.stub', 'P_ALL' => 'pcntl/pcntl.stub', 'P_CS_PRECEDES' => 'standard/standard_defines.stub', 'P_PGID' => 'pcntl/pcntl.stub', 'P_PID' => 'pcntl/pcntl.stub', 'P_PIDFD' => 'pcntl/pcntl.stub', 'P_SEP_BY_SPACE' => 'standard/standard_defines.stub', 'P_SIGN_POSN' => 'standard/standard_defines.stub', 'PopupWindow' => 'winbinder/winbinder.stub', 'PushButton' => 'winbinder/winbinder.stub', 'RADIUS_ACCESS_ACCEPT' => 'radius/radius.stub', 'RADIUS_ACCESS_CHALLENGE' => 'radius/radius.stub', 'RADIUS_ACCESS_REJECT' => 'radius/radius.stub', 'RADIUS_ACCESS_REQUEST' => 'radius/radius.stub', 'RADIUS_ACCOUNTING_OFF' => 'radius/radius.stub', 'RADIUS_ACCOUNTING_ON' => 'radius/radius.stub', 'RADIUS_ACCOUNTING_REQUEST' => 'radius/radius.stub', 'RADIUS_ACCOUNTING_RESPONSE' => 'radius/radius.stub', 'RADIUS_ACCT_AUTHENTIC' => 'radius/radius.stub', 'RADIUS_ACCT_DELAY_TIME' => 'radius/radius.stub', 'RADIUS_ACCT_INPUT_OCTETS' => 'radius/radius.stub', 'RADIUS_ACCT_INPUT_PACKETS' => 'radius/radius.stub', 'RADIUS_ACCT_LINK_COUNT' => 'radius/radius.stub', 'RADIUS_ACCT_MULTI_SESSION_ID' => 'radius/radius.stub', 'RADIUS_ACCT_OUTPUT_OCTETS' => 'radius/radius.stub', 'RADIUS_ACCT_OUTPUT_PACKETS' => 'radius/radius.stub', 'RADIUS_ACCT_SESSION_ID' => 'radius/radius.stub', 'RADIUS_ACCT_SESSION_TIME' => 'radius/radius.stub', 'RADIUS_ACCT_STATUS_TYPE' => 'radius/radius.stub', 'RADIUS_ACCT_TERMINATE_CAUSE' => 'radius/radius.stub', 'RADIUS_ADMINISTRATIVE' => 'radius/radius.stub', 'RADIUS_ADSL_CAP' => 'radius/radius.stub', 'RADIUS_ADSL_DMT' => 'radius/radius.stub', 'RADIUS_ARAP' => 'radius/radius.stub', 'RADIUS_ASYNC' => 'radius/radius.stub', 'RADIUS_AUTHENTICATE_ONLY' => 'radius/radius.stub', 'RADIUS_AUTH_LOCAL' => 'radius/radius.stub', 'RADIUS_AUTH_RADIUS' => 'radius/radius.stub', 'RADIUS_AUTH_REMOTE' => 'radius/radius.stub', 'RADIUS_CABLE' => 'radius/radius.stub', 'RADIUS_CALLBACK_FRAMED' => 'radius/radius.stub', 'RADIUS_CALLBACK_ID' => 'radius/radius.stub', 'RADIUS_CALLBACK_LOGIN' => 'radius/radius.stub', 'RADIUS_CALLBACK_NAS_PROMPT' => 'radius/radius.stub', 'RADIUS_CALLBACK_NUMBER' => 'radius/radius.stub', 'RADIUS_CALLED_STATION_ID' => 'radius/radius.stub', 'RADIUS_CALLING_STATION_ID' => 'radius/radius.stub', 'RADIUS_CHAP_CHALLENGE' => 'radius/radius.stub', 'RADIUS_CHAP_PASSWORD' => 'radius/radius.stub', 'RADIUS_CLASS' => 'radius/radius.stub', 'RADIUS_COA_ACK' => 'radius/radius.stub', 'RADIUS_COA_NAK' => 'radius/radius.stub', 'RADIUS_COA_REQUEST' => 'radius/radius.stub', 'RADIUS_COMP_IPXHDR' => 'radius/radius.stub', 'RADIUS_COMP_NONE' => 'radius/radius.stub', 'RADIUS_COMP_VJ' => 'radius/radius.stub', 'RADIUS_CONNECT_INFO' => 'radius/radius.stub', 'RADIUS_DISCONNECT_ACK' => 'radius/radius.stub', 'RADIUS_DISCONNECT_NAK' => 'radius/radius.stub', 'RADIUS_DISCONNECT_REQUEST' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_ADMINISTRATIVELY_PROHIBITED' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_INVALID_EAP_PACKET' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_INVALID_REQUEST' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_MISSING_ATTRIBUTE' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_NAS_IDENTIFICATION_MISMATCH' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_OTHER_PROXY_PROCESSING_ERROR' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_REQUEST_INITIATED' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_REQUEST_NOT_ROUTABLE' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_RESIDUAL_SESSION_CONTEXT_REMOVED' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_RESOURCES_UNAVAILABLE' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_SESSION_CONTEXT_NOT_FOUND' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_SESSION_CONTEXT_NOT_REMOVABLE' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_UNSUPPORTED_ATTRIBUTE' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_UNSUPPORTED_EXCEPTION' => 'radius/radius.stub', 'RADIUS_ERROR_CAUSE_UNSUPPORTED_SERVICE' => 'radius/radius.stub', 'RADIUS_ETHERNET' => 'radius/radius.stub', 'RADIUS_FILTER_ID' => 'radius/radius.stub', 'RADIUS_FRAMED' => 'radius/radius.stub', 'RADIUS_FRAMED_APPLETALK_LINK' => 'radius/radius.stub', 'RADIUS_FRAMED_APPLETALK_NETWORK' => 'radius/radius.stub', 'RADIUS_FRAMED_APPLETALK_ZONE' => 'radius/radius.stub', 'RADIUS_FRAMED_COMPRESSION' => 'radius/radius.stub', 'RADIUS_FRAMED_INTERFACE_ID' => 'radius/radius.stub', 'RADIUS_FRAMED_IPV6_POOL' => 'radius/radius.stub', 'RADIUS_FRAMED_IPV6_PREFIX' => 'radius/radius.stub', 'RADIUS_FRAMED_IPV6_ROUTE' => 'radius/radius.stub', 'RADIUS_FRAMED_IPX_NETWORK' => 'radius/radius.stub', 'RADIUS_FRAMED_IP_ADDRESS' => 'radius/radius.stub', 'RADIUS_FRAMED_IP_NETMASK' => 'radius/radius.stub', 'RADIUS_FRAMED_MTU' => 'radius/radius.stub', 'RADIUS_FRAMED_PROTOCOL' => 'radius/radius.stub', 'RADIUS_FRAMED_ROUTE' => 'radius/radius.stub', 'RADIUS_FRAMED_ROUTING' => 'radius/radius.stub', 'RADIUS_GANDALF' => 'radius/radius.stub', 'RADIUS_G_3_FAX' => 'radius/radius.stub', 'RADIUS_HDLC_CLEAR_CHANNEL' => 'radius/radius.stub', 'RADIUS_IDLE_TIMEOUT' => 'radius/radius.stub', 'RADIUS_IDSL' => 'radius/radius.stub', 'RADIUS_ISDN_ASYNC_V110' => 'radius/radius.stub', 'RADIUS_ISDN_ASYNC_V120' => 'radius/radius.stub', 'RADIUS_ISDN_SYNC' => 'radius/radius.stub', 'RADIUS_LOGIN' => 'radius/radius.stub', 'RADIUS_LOGIN_IPV6_HOST' => 'radius/radius.stub', 'RADIUS_LOGIN_IP_HOST' => 'radius/radius.stub', 'RADIUS_LOGIN_LAT_GROUP' => 'radius/radius.stub', 'RADIUS_LOGIN_LAT_NODE' => 'radius/radius.stub', 'RADIUS_LOGIN_LAT_PORT' => 'radius/radius.stub', 'RADIUS_LOGIN_LAT_SERVICE' => 'radius/radius.stub', 'RADIUS_LOGIN_SERVICE' => 'radius/radius.stub', 'RADIUS_LOGIN_TCP_PORT' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_ARAP_CHALLENGE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_BAP_USAGE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP2_PW' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP2_RESPONSE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP2_SUCCESS' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_CHALLENGE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_DOMAIN' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_ERROR' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_PW_1' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_PW_2' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_CHAP_RESPONSE' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_FILTER' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_MPPE_RECV_KEY' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_MPPE_SEND_KEY' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_RAS_VENDOR' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_RAS_VERSION' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER' => 'radius/radius.stub', 'RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER' => 'radius/radius.stub', 'RADIUS_MPPE_KEY_LEN' => 'radius/radius.stub', 'RADIUS_NAS_IDENTIFIER' => 'radius/radius.stub', 'RADIUS_NAS_IPV6_ADDRESS' => 'radius/radius.stub', 'RADIUS_NAS_IP_ADDRESS' => 'radius/radius.stub', 'RADIUS_NAS_PORT' => 'radius/radius.stub', 'RADIUS_NAS_PORT_TYPE' => 'radius/radius.stub', 'RADIUS_NAS_PROMPT' => 'radius/radius.stub', 'RADIUS_OPTION_NONE' => 'radius/radius.stub', 'RADIUS_OPTION_SALT' => 'radius/radius.stub', 'RADIUS_OPTION_TAGGED' => 'radius/radius.stub', 'RADIUS_OUTBOUND' => 'radius/radius.stub', 'RADIUS_PIAFS' => 'radius/radius.stub', 'RADIUS_PORT_LIMIT' => 'radius/radius.stub', 'RADIUS_PPP' => 'radius/radius.stub', 'RADIUS_PROXY_STATE' => 'radius/radius.stub', 'RADIUS_REPLY_MESSAGE' => 'radius/radius.stub', 'RADIUS_SDSL' => 'radius/radius.stub', 'RADIUS_SERVICE_TYPE' => 'radius/radius.stub', 'RADIUS_SESSION_TIMEOUT' => 'radius/radius.stub', 'RADIUS_SLIP' => 'radius/radius.stub', 'RADIUS_START' => 'radius/radius.stub', 'RADIUS_STATE' => 'radius/radius.stub', 'RADIUS_STOP' => 'radius/radius.stub', 'RADIUS_SYNC' => 'radius/radius.stub', 'RADIUS_TERMINATION_ACTION' => 'radius/radius.stub', 'RADIUS_TERM_ADMIN_REBOOT' => 'radius/radius.stub', 'RADIUS_TERM_ADMIN_RESET' => 'radius/radius.stub', 'RADIUS_TERM_CALLBACK' => 'radius/radius.stub', 'RADIUS_TERM_HOST_REQUEST' => 'radius/radius.stub', 'RADIUS_TERM_IDLE_TIMEOUT' => 'radius/radius.stub', 'RADIUS_TERM_LOST_CARRIER' => 'radius/radius.stub', 'RADIUS_TERM_LOST_SERVICE' => 'radius/radius.stub', 'RADIUS_TERM_NAS_ERROR' => 'radius/radius.stub', 'RADIUS_TERM_NAS_REBOOT' => 'radius/radius.stub', 'RADIUS_TERM_NAS_REQUEST' => 'radius/radius.stub', 'RADIUS_TERM_PORT_ERROR' => 'radius/radius.stub', 'RADIUS_TERM_PORT_PREEMPTED' => 'radius/radius.stub', 'RADIUS_TERM_PORT_SUSPENDED' => 'radius/radius.stub', 'RADIUS_TERM_PORT_UNNEEDED' => 'radius/radius.stub', 'RADIUS_TERM_SERVICE_UNAVAILABLE' => 'radius/radius.stub', 'RADIUS_TERM_SESSION_TIMEOUT' => 'radius/radius.stub', 'RADIUS_TERM_USER_ERROR' => 'radius/radius.stub', 'RADIUS_TERM_USER_REQUEST' => 'radius/radius.stub', 'RADIUS_USER_NAME' => 'radius/radius.stub', 'RADIUS_USER_PASSWORD' => 'radius/radius.stub', 'RADIUS_VENDOR_MICROSOFT' => 'radius/radius.stub', 'RADIUS_VENDOR_SPECIFIC' => 'radius/radius.stub', 'RADIUS_VIRTUAL' => 'radius/radius.stub', 'RADIUS_WIRELESS_IEEE_802_11' => 'radius/radius.stub', 'RADIUS_WIRELESS_OTHER' => 'radius/radius.stub', 'RADIUS_XDSL' => 'radius/radius.stub', 'RADIUS_XYLOGICS' => 'radius/radius.stub', 'RADIUS_X_25' => 'radius/radius.stub', 'RADIUS_X_75' => 'radius/radius.stub', 'RADIXCHAR' => 'standard/standard_defines.stub', 'RAD_OPTION_TAG' => 'radius/radius.stub', 'RD_KAFKA_BUILD_VERSION' => 'rdkafka/constants.stub', 'RD_KAFKA_CONF_INVALID' => 'rdkafka/constants.stub', 'RD_KAFKA_CONF_OK' => 'rdkafka/constants.stub', 'RD_KAFKA_CONF_UNKNOWN' => 'rdkafka/constants.stub', 'RD_KAFKA_CONSUMER' => 'rdkafka/constants.stub', 'RD_KAFKA_LOG_PRINT' => 'rdkafka/constants.stub', 'RD_KAFKA_LOG_SYSLOG' => 'rdkafka/constants.stub', 'RD_KAFKA_LOG_SYSLOG_PRINT' => 'rdkafka/constants.stub', 'RD_KAFKA_MSG_F_BLOCK' => 'rdkafka/constants.stub', 'RD_KAFKA_MSG_PARTITIONER_CONSISTENT' => 'rdkafka/constants.stub', 'RD_KAFKA_MSG_PARTITIONER_CONSISTENT_RANDOM' => 'rdkafka/constants.stub', 'RD_KAFKA_MSG_PARTITIONER_MURMUR2' => 'rdkafka/constants.stub', 'RD_KAFKA_MSG_PARTITIONER_MURMUR2_RANDOM' => 'rdkafka/constants.stub', 'RD_KAFKA_MSG_PARTITIONER_RANDOM' => 'rdkafka/constants.stub', 'RD_KAFKA_OFFSET_BEGINNING' => 'rdkafka/constants.stub', 'RD_KAFKA_OFFSET_END' => 'rdkafka/constants.stub', 'RD_KAFKA_OFFSET_INVALID' => 'rdkafka/constants.stub', 'RD_KAFKA_OFFSET_STORED' => 'rdkafka/constants.stub', 'RD_KAFKA_PARTITION_UA' => 'rdkafka/constants.stub', 'RD_KAFKA_PRODUCER' => 'rdkafka/constants.stub', 'RD_KAFKA_PURGE_F_INFLIGHT' => 'rdkafka/constants.stub', 'RD_KAFKA_PURGE_F_NON_BLOCKING' => 'rdkafka/constants.stub', 'RD_KAFKA_PURGE_F_QUEUE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_BROKER_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_CLUSTER_AUTHORIZATION_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_CONCURRENT_TRANSACTIONS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_COORDINATOR_LOAD_IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_COORDINATOR_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DELEGATION_TOKEN_AUTHORIZATION_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DELEGATION_TOKEN_AUTH_DISABLED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DELEGATION_TOKEN_EXPIRED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DELEGATION_TOKEN_NOT_FOUND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DELEGATION_TOKEN_OWNER_MISMATCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DELEGATION_TOKEN_REQUEST_NOT_ALLOWED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DUPLICATE_RESOURCE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_DUPLICATE_SEQUENCE_NUMBER' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_ELECTION_NOT_NEEDED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_ELIGIBLE_LEADERS_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_FEATURE_UPDATE_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_FENCED_INSTANCE_ID' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_FENCED_LEADER_EPOCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_FETCH_SESSION_ID_NOT_FOUND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_GROUP_AUTHORIZATION_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_GROUP_COORDINATOR_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_GROUP_ID_NOT_FOUND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_GROUP_LOAD_IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_GROUP_MAX_SIZE_REACHED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_GROUP_SUBSCRIBED_TO_TOPIC' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_ILLEGAL_GENERATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_ILLEGAL_SASL_STATE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INCONSISTENT_GROUP_PROTOCOL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INCONSISTENT_VOTER_SET' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_COMMIT_OFFSET_SIZE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_CONFIG' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_FETCH_SESSION_EPOCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_GROUP_ID' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_MSG' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_MSG_SIZE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_PARTITIONS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_PRINCIPAL_TYPE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_PRODUCER_EPOCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_PRODUCER_ID_MAPPING' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_RECORD' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_REPLICATION_FACTOR' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_REPLICA_ASSIGNMENT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_REQUEST' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_REQUIRED_ACKS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_SESSION_TIMEOUT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_TIMESTAMP' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_TRANSACTION_TIMEOUT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_TXN_STATE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_INVALID_UPDATE_VERSION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_LEADER_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_LISTENER_NOT_FOUND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_LOG_DIR_NOT_FOUND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_MEMBER_ID_REQUIRED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_MSG_SIZE_TOO_LARGE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NETWORK_EXCEPTION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NON_EMPTY_GROUP' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NOT_CONTROLLER' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NOT_COORDINATOR' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NOT_COORDINATOR_FOR_GROUP' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NOT_ENOUGH_REPLICAS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NOT_ENOUGH_REPLICAS_AFTER_APPEND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NOT_LEADER_FOR_PARTITION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NO_ERROR' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_NO_REASSIGNMENT_IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_OFFSET_METADATA_TOO_LARGE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_OFFSET_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_OFFSET_OUT_OF_RANGE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_OPERATION_NOT_ATTEMPTED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_OUT_OF_ORDER_SEQUENCE_NUMBER' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_POLICY_VIOLATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_PREFERRED_LEADER_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_PRINCIPAL_DESERIALIZATION_FAILURE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_PRODUCER_FENCED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_REASSIGNMENT_IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_REBALANCE_IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_RECORD_LIST_TOO_LARGE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_REQUEST_TIMED_OUT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_RESOURCE_NOT_FOUND' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_SASL_AUTHENTICATION_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_SECURITY_DISABLED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_STALE_BROKER_EPOCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_STALE_CTRL_EPOCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_THROTTLING_QUOTA_EXCEEDED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_TOPIC_ALREADY_EXISTS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_TOPIC_DELETION_DISABLED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_TOPIC_EXCEPTION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_TRANSACTIONAL_ID_AUTHORIZATION_FAILED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_TRANSACTION_COORDINATOR_FENCED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNACCEPTABLE_CREDENTIAL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNKNOWN' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNKNOWN_LEADER_EPOCH' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNKNOWN_MEMBER_ID' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNKNOWN_PRODUCER_ID' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNSTABLE_OFFSET_COMMIT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNSUPPORTED_COMPRESSION_TYPE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNSUPPORTED_FOR_MESSAGE_FORMAT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNSUPPORTED_SASL_MECHANISM' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR_UNSUPPORTED_VERSION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__ALL_BROKERS_DOWN' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__APPLICATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__ASSIGNMENT_LOST' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__AUTHENTICATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__AUTO_OFFSET_RESET' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__BAD_COMPRESSION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__BAD_MSG' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__BEGIN' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__CONFLICT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__CRIT_SYS_RESOURCE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__DESTROY' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__END' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__EXISTING_SUBSCRIPTION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__FAIL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__FATAL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__FENCED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__FS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__GAPLESS_GUARANTEE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__INCONSISTENT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__INTR' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__INVALID_ARG' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__INVALID_TYPE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__ISR_INSUFF' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__KEY_DESERIALIZATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__KEY_SERIALIZATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__MAX_POLL_EXCEEDED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__MSG_TIMED_OUT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__NODE_UPDATE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__NOENT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__NOOP' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__NOT_CONFIGURED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__NOT_IMPLEMENTED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__NO_OFFSET' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__OUTDATED' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__PARTIAL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__PARTITION_EOF' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__PREV_IN_PROGRESS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__PURGE_INFLIGHT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__PURGE_QUEUE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__QUEUE_FULL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__READ_ONLY' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__RESOLVE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__RETRY' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__SSL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__STATE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__TIMED_OUT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__TIMED_OUT_QUEUE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__TRANSPORT' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNDERFLOW' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNKNOWN_BROKER' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNKNOWN_GROUP' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNKNOWN_PROTOCOL' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNKNOWN_TOPIC' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__UNSUPPORTED_FEATURE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__VALUE_DESERIALIZATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__VALUE_SERIALIZATION' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__WAIT_CACHE' => 'rdkafka/constants.stub', 'RD_KAFKA_RESP_ERR__WAIT_COORD' => 'rdkafka/constants.stub', 'RD_KAFKA_VERSION' => 'rdkafka/constants.stub', 'READLINE_LIB' => 'readline/readline.stub', 'RED' => 'winbinder/winbinder.stub', 'RPMMIRE_DEFAULT' => 'rpminfo/rpminfo.stub', 'RPMMIRE_GLOB' => 'rpminfo/rpminfo.stub', 'RPMMIRE_REGEX' => 'rpminfo/rpminfo.stub', 'RPMMIRE_STRCMP' => 'rpminfo/rpminfo.stub', 'RPMSENSE_ANY' => 'rpminfo/rpminfo.stub', 'RPMSENSE_CONFIG' => 'rpminfo/rpminfo.stub', 'RPMSENSE_EQUAL' => 'rpminfo/rpminfo.stub', 'RPMSENSE_FIND_PROVIDES' => 'rpminfo/rpminfo.stub', 'RPMSENSE_FIND_REQUIRES' => 'rpminfo/rpminfo.stub', 'RPMSENSE_GREATER' => 'rpminfo/rpminfo.stub', 'RPMSENSE_INTERP' => 'rpminfo/rpminfo.stub', 'RPMSENSE_KEYRING' => 'rpminfo/rpminfo.stub', 'RPMSENSE_LESS' => 'rpminfo/rpminfo.stub', 'RPMSENSE_MISSINGOK' => 'rpminfo/rpminfo.stub', 'RPMSENSE_POSTTRANS' => 'rpminfo/rpminfo.stub', 'RPMSENSE_PREREQ' => 'rpminfo/rpminfo.stub', 'RPMSENSE_PRETRANS' => 'rpminfo/rpminfo.stub', 'RPMSENSE_RPMLIB' => 'rpminfo/rpminfo.stub', 'RPMSENSE_SCRIPT_POST' => 'rpminfo/rpminfo.stub', 'RPMSENSE_SCRIPT_POSTUN' => 'rpminfo/rpminfo.stub', 'RPMSENSE_SCRIPT_PRE' => 'rpminfo/rpminfo.stub', 'RPMSENSE_SCRIPT_PREUN' => 'rpminfo/rpminfo.stub', 'RPMSENSE_SCRIPT_VERIFY' => 'rpminfo/rpminfo.stub', 'RPMSENSE_TRIGGERIN' => 'rpminfo/rpminfo.stub', 'RPMSENSE_TRIGGERPOSTUN' => 'rpminfo/rpminfo.stub', 'RPMSENSE_TRIGGERPREIN' => 'rpminfo/rpminfo.stub', 'RPMSENSE_TRIGGERUN' => 'rpminfo/rpminfo.stub', 'RPMTAG_ARCH' => 'rpminfo/rpminfo.stub', 'RPMTAG_ARCHIVESIZE' => 'rpminfo/rpminfo.stub', 'RPMTAG_BASENAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_BUGURL' => 'rpminfo/rpminfo.stub', 'RPMTAG_BUILDARCHS' => 'rpminfo/rpminfo.stub', 'RPMTAG_BUILDHOST' => 'rpminfo/rpminfo.stub', 'RPMTAG_BUILDTIME' => 'rpminfo/rpminfo.stub', 'RPMTAG_C' => 'rpminfo/rpminfo.stub', 'RPMTAG_CHANGELOGNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_CHANGELOGTEXT' => 'rpminfo/rpminfo.stub', 'RPMTAG_CHANGELOGTIME' => 'rpminfo/rpminfo.stub', 'RPMTAG_CLASSDICT' => 'rpminfo/rpminfo.stub', 'RPMTAG_CONFLICTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_CONFLICTNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_CONFLICTNEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_CONFLICTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_CONFLICTVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_COOKIE' => 'rpminfo/rpminfo.stub', 'RPMTAG_DBINSTANCE' => 'rpminfo/rpminfo.stub', 'RPMTAG_DEPENDSDICT' => 'rpminfo/rpminfo.stub', 'RPMTAG_DESCRIPTION' => 'rpminfo/rpminfo.stub', 'RPMTAG_DIRINDEXES' => 'rpminfo/rpminfo.stub', 'RPMTAG_DIRNAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_DISTRIBUTION' => 'rpminfo/rpminfo.stub', 'RPMTAG_DISTTAG' => 'rpminfo/rpminfo.stub', 'RPMTAG_DISTURL' => 'rpminfo/rpminfo.stub', 'RPMTAG_DSAHEADER' => 'rpminfo/rpminfo.stub', 'RPMTAG_E' => 'rpminfo/rpminfo.stub', 'RPMTAG_ENCODING' => 'rpminfo/rpminfo.stub', 'RPMTAG_ENHANCEFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_ENHANCENAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_ENHANCENEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_ENHANCES' => 'rpminfo/rpminfo.stub', 'RPMTAG_ENHANCEVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_EPOCH' => 'rpminfo/rpminfo.stub', 'RPMTAG_EPOCHNUM' => 'rpminfo/rpminfo.stub', 'RPMTAG_EVR' => 'rpminfo/rpminfo.stub', 'RPMTAG_EXCLUDEARCH' => 'rpminfo/rpminfo.stub', 'RPMTAG_EXCLUDEOS' => 'rpminfo/rpminfo.stub', 'RPMTAG_EXCLUSIVEARCH' => 'rpminfo/rpminfo.stub', 'RPMTAG_EXCLUSIVEOS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILECAPS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILECLASS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILECOLORS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILECONTEXTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEDEPENDSN' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEDEPENDSX' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEDEVICES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEDIGESTALGO' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEDIGESTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEGROUPNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEINODES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILELANGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILELINKTOS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEMD5S' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEMODES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEMTIMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILENAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILENLINKS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEPROVIDE' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILERDEVS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEREQUIRE' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILESIGNATURELENGTH' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILESIGNATURES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILESIZES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILESTATES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERCONDS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERINDEX' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERPRIORITIES' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERSCRIPTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERSCRIPTPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERSCRIPTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERTYPE' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILETRIGGERVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEUSERNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_FILEVERIFYFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_FSCONTEXTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_GIF' => 'rpminfo/rpminfo.stub', 'RPMTAG_GROUP' => 'rpminfo/rpminfo.stub', 'RPMTAG_HDRID' => 'rpminfo/rpminfo.stub', 'RPMTAG_HEADERCOLOR' => 'rpminfo/rpminfo.stub', 'RPMTAG_HEADERI18NTABLE' => 'rpminfo/rpminfo.stub', 'RPMTAG_HEADERIMAGE' => 'rpminfo/rpminfo.stub', 'RPMTAG_HEADERIMMUTABLE' => 'rpminfo/rpminfo.stub', 'RPMTAG_HEADERREGIONS' => 'rpminfo/rpminfo.stub', 'RPMTAG_HEADERSIGNATURES' => 'rpminfo/rpminfo.stub', 'RPMTAG_ICON' => 'rpminfo/rpminfo.stub', 'RPMTAG_INSTALLCOLOR' => 'rpminfo/rpminfo.stub', 'RPMTAG_INSTALLTID' => 'rpminfo/rpminfo.stub', 'RPMTAG_INSTALLTIME' => 'rpminfo/rpminfo.stub', 'RPMTAG_INSTFILENAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_INSTPREFIXES' => 'rpminfo/rpminfo.stub', 'RPMTAG_LICENSE' => 'rpminfo/rpminfo.stub', 'RPMTAG_LONGARCHIVESIZE' => 'rpminfo/rpminfo.stub', 'RPMTAG_LONGFILESIZES' => 'rpminfo/rpminfo.stub', 'RPMTAG_LONGSIGSIZE' => 'rpminfo/rpminfo.stub', 'RPMTAG_LONGSIZE' => 'rpminfo/rpminfo.stub', 'RPMTAG_MODULARITYLABEL' => 'rpminfo/rpminfo.stub', 'RPMTAG_N' => 'rpminfo/rpminfo.stub', 'RPMTAG_NAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_NEVR' => 'rpminfo/rpminfo.stub', 'RPMTAG_NEVRA' => 'rpminfo/rpminfo.stub', 'RPMTAG_NOPATCH' => 'rpminfo/rpminfo.stub', 'RPMTAG_NOSOURCE' => 'rpminfo/rpminfo.stub', 'RPMTAG_NVR' => 'rpminfo/rpminfo.stub', 'RPMTAG_NVRA' => 'rpminfo/rpminfo.stub', 'RPMTAG_O' => 'rpminfo/rpminfo.stub', 'RPMTAG_OBSOLETEFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_OBSOLETENAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_OBSOLETENEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_OBSOLETES' => 'rpminfo/rpminfo.stub', 'RPMTAG_OBSOLETEVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDENHANCES' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDENHANCESFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDENHANCESNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDENHANCESVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDFILENAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDSUGGESTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDSUGGESTSFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDSUGGESTSNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_OLDSUGGESTSVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_OPTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORDERFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORDERNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORDERVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORIGBASENAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORIGDIRINDEXES' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORIGDIRNAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_ORIGFILENAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_OS' => 'rpminfo/rpminfo.stub', 'RPMTAG_P' => 'rpminfo/rpminfo.stub', 'RPMTAG_PACKAGER' => 'rpminfo/rpminfo.stub', 'RPMTAG_PATCH' => 'rpminfo/rpminfo.stub', 'RPMTAG_PATCHESFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PATCHESNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_PATCHESVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_PAYLOADCOMPRESSOR' => 'rpminfo/rpminfo.stub', 'RPMTAG_PAYLOADDIGEST' => 'rpminfo/rpminfo.stub', 'RPMTAG_PAYLOADDIGESTALGO' => 'rpminfo/rpminfo.stub', 'RPMTAG_PAYLOADFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PAYLOADFORMAT' => 'rpminfo/rpminfo.stub', 'RPMTAG_PKGID' => 'rpminfo/rpminfo.stub', 'RPMTAG_PLATFORM' => 'rpminfo/rpminfo.stub', 'RPMTAG_POLICIES' => 'rpminfo/rpminfo.stub', 'RPMTAG_POLICYFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_POLICYNAMES' => 'rpminfo/rpminfo.stub', 'RPMTAG_POLICYTYPES' => 'rpminfo/rpminfo.stub', 'RPMTAG_POLICYTYPESINDEXES' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTIN' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTINFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTINPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTTRANS' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTTRANSFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTTRANSPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTUN' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTUNFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_POSTUNPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREFIXES' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREIN' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREINFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREINPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_PRETRANS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PRETRANSFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PRETRANSPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREUN' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREUNFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PREUNPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_PROVIDEFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PROVIDENAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_PROVIDENEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_PROVIDES' => 'rpminfo/rpminfo.stub', 'RPMTAG_PROVIDEVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_PUBKEYS' => 'rpminfo/rpminfo.stub', 'RPMTAG_R' => 'rpminfo/rpminfo.stub', 'RPMTAG_RECOMMENDFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_RECOMMENDNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_RECOMMENDNEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_RECOMMENDS' => 'rpminfo/rpminfo.stub', 'RPMTAG_RECOMMENDVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_RECONTEXTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_RELEASE' => 'rpminfo/rpminfo.stub', 'RPMTAG_REMOVETID' => 'rpminfo/rpminfo.stub', 'RPMTAG_REQUIREFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_REQUIRENAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_REQUIRENEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_REQUIRES' => 'rpminfo/rpminfo.stub', 'RPMTAG_REQUIREVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_RPMVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_RSAHEADER' => 'rpminfo/rpminfo.stub', 'RPMTAG_SHA1HEADER' => 'rpminfo/rpminfo.stub', 'RPMTAG_SHA256HEADER' => 'rpminfo/rpminfo.stub', 'RPMTAG_SIGGPG' => 'rpminfo/rpminfo.stub', 'RPMTAG_SIGMD5' => 'rpminfo/rpminfo.stub', 'RPMTAG_SIGPGP' => 'rpminfo/rpminfo.stub', 'RPMTAG_SIGSIZE' => 'rpminfo/rpminfo.stub', 'RPMTAG_SIZE' => 'rpminfo/rpminfo.stub', 'RPMTAG_SOURCE' => 'rpminfo/rpminfo.stub', 'RPMTAG_SOURCEPACKAGE' => 'rpminfo/rpminfo.stub', 'RPMTAG_SOURCEPKGID' => 'rpminfo/rpminfo.stub', 'RPMTAG_SOURCERPM' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUGGESTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUGGESTNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUGGESTNEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUGGESTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUGGESTVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUMMARY' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUPPLEMENTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUPPLEMENTNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUPPLEMENTNEVRS' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUPPLEMENTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_SUPPLEMENTVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERCONDS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERINDEX' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERPRIORITIES' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERSCRIPTPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERSCRIPTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERTYPE' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRANSFILETRIGGERVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERCONDS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERINDEX' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERNAME' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERSCRIPTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERSCRIPTPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERSCRIPTS' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERTYPE' => 'rpminfo/rpminfo.stub', 'RPMTAG_TRIGGERVERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_URL' => 'rpminfo/rpminfo.stub', 'RPMTAG_V' => 'rpminfo/rpminfo.stub', 'RPMTAG_VCS' => 'rpminfo/rpminfo.stub', 'RPMTAG_VENDOR' => 'rpminfo/rpminfo.stub', 'RPMTAG_VERBOSE' => 'rpminfo/rpminfo.stub', 'RPMTAG_VERIFYSCRIPT' => 'rpminfo/rpminfo.stub', 'RPMTAG_VERIFYSCRIPTFLAGS' => 'rpminfo/rpminfo.stub', 'RPMTAG_VERIFYSCRIPTPROG' => 'rpminfo/rpminfo.stub', 'RPMTAG_VERSION' => 'rpminfo/rpminfo.stub', 'RPMTAG_XPM' => 'rpminfo/rpminfo.stub', 'RPMVERSION' => 'rpminfo/rpminfo.stub', 'RTFEditBox' => 'winbinder/winbinder.stub', 'RadioButton' => 'winbinder/winbinder.stub', 'ResizableWindow' => 'winbinder/winbinder.stub', 'SA_ALL' => 'imap/imap.stub', 'SA_MESSAGES' => 'imap/imap.stub', 'SA_RECENT' => 'imap/imap.stub', 'SA_UIDNEXT' => 'imap/imap.stub', 'SA_UIDVALIDITY' => 'imap/imap.stub', 'SA_UNSEEN' => 'imap/imap.stub', 'SCANDIR_SORT_ASCENDING' => 'standard/standard_defines.stub', 'SCANDIR_SORT_DESCENDING' => 'standard/standard_defines.stub', 'SCANDIR_SORT_NONE' => 'standard/standard_defines.stub', 'SCM_CREDENTIALS' => 'sockets/sockets.stub', 'SCM_RIGHTS' => 'sockets/sockets.stub', 'SEEK_CUR' => 'standard/standard_defines.stub', 'SEEK_END' => 'standard/standard_defines.stub', 'SEEK_SET' => 'standard/standard_defines.stub', 'SEGV_ACCERR' => 'pcntl/pcntl.stub', 'SEGV_MAPERR' => 'pcntl/pcntl.stub', 'SE_FREE' => 'imap/imap.stub', 'SE_NOPREFETCH' => 'imap/imap.stub', 'SE_UID' => 'imap/imap.stub', 'SID' => 'standard/standard_defines.stub', 'SIGABRT' => 'pcntl/pcntl.stub', 'SIGALRM' => 'pcntl/pcntl.stub', 'SIGBABY' => 'pcntl/pcntl.stub', 'SIGBUS' => 'pcntl/pcntl.stub', 'SIGCHLD' => 'pcntl/pcntl.stub', 'SIGCLD' => 'pcntl/pcntl.stub', 'SIGCONT' => 'pcntl/pcntl.stub', 'SIGFPE' => 'pcntl/pcntl.stub', 'SIGHUP' => 'pcntl/pcntl.stub', 'SIGILL' => 'pcntl/pcntl.stub', 'SIGINT' => 'pcntl/pcntl.stub', 'SIGIO' => 'pcntl/pcntl.stub', 'SIGIOT' => 'pcntl/pcntl.stub', 'SIGKILL' => 'pcntl/pcntl.stub', 'SIGPIPE' => 'pcntl/pcntl.stub', 'SIGPOLL' => 'pcntl/pcntl.stub', 'SIGPROF' => 'pcntl/pcntl.stub', 'SIGPWR' => 'pcntl/pcntl.stub', 'SIGQUIT' => 'pcntl/pcntl.stub', 'SIGRTMAX' => 'pcntl/pcntl.stub', 'SIGRTMIN' => 'pcntl/pcntl.stub', 'SIGSEGV' => 'pcntl/pcntl.stub', 'SIGSTKFLT' => 'pcntl/pcntl.stub', 'SIGSTOP' => 'pcntl/pcntl.stub', 'SIGSYS' => 'pcntl/pcntl.stub', 'SIGTERM' => 'pcntl/pcntl.stub', 'SIGTRAP' => 'pcntl/pcntl.stub', 'SIGTSTP' => 'pcntl/pcntl.stub', 'SIGTTIN' => 'pcntl/pcntl.stub', 'SIGTTOU' => 'pcntl/pcntl.stub', 'SIGURG' => 'pcntl/pcntl.stub', 'SIGUSR1' => 'pcntl/pcntl.stub', 'SIGUSR2' => 'pcntl/pcntl.stub', 'SIGVTALRM' => 'pcntl/pcntl.stub', 'SIGWINCH' => 'pcntl/pcntl.stub', 'SIGXCPU' => 'pcntl/pcntl.stub', 'SIGXFSZ' => 'pcntl/pcntl.stub', 'SIG_BLOCK' => 'pcntl/pcntl.stub', 'SIG_DFL' => 'pcntl/pcntl.stub', 'SIG_ERR' => 'pcntl/pcntl.stub', 'SIG_IGN' => 'pcntl/pcntl.stub', 'SIG_SETMASK' => 'pcntl/pcntl.stub', 'SIG_UNBLOCK' => 'pcntl/pcntl.stub', 'SI_ASYNCIO' => 'pcntl/pcntl.stub', 'SI_KERNEL' => 'pcntl/pcntl.stub', 'SI_MESGQ' => 'pcntl/pcntl.stub', 'SI_QUEUE' => 'pcntl/pcntl.stub', 'SI_SIGIO' => 'pcntl/pcntl.stub', 'SI_TIMER' => 'pcntl/pcntl.stub', 'SI_TKILL' => 'pcntl/pcntl.stub', 'SI_USER' => 'pcntl/pcntl.stub', 'SKF_AD_ALU_XOR_X' => 'sockets/sockets.stub', 'SKF_AD_CPU' => 'sockets/sockets.stub', 'SKF_AD_HATYPE' => 'sockets/sockets.stub', 'SKF_AD_IFINDEX' => 'sockets/sockets.stub', 'SKF_AD_MARK' => 'sockets/sockets.stub', 'SKF_AD_MAX' => 'sockets/sockets.stub', 'SKF_AD_NLATTR' => 'sockets/sockets.stub', 'SKF_AD_NLATTR_NEST' => 'sockets/sockets.stub', 'SKF_AD_OFF' => 'sockets/sockets.stub', 'SKF_AD_PAY_OFFSET' => 'sockets/sockets.stub', 'SKF_AD_PKTTYPE' => 'sockets/sockets.stub', 'SKF_AD_PROTOCOL' => 'sockets/sockets.stub', 'SKF_AD_QUEUE' => 'sockets/sockets.stub', 'SKF_AD_RANDOM' => 'sockets/sockets.stub', 'SKF_AD_RXHASH' => 'sockets/sockets.stub', 'SKF_AD_VLAN_TAG' => 'sockets/sockets.stub', 'SKF_AD_VLAN_TAG_PRESENT' => 'sockets/sockets.stub', 'SKF_AD_VLAN_TPID' => 'sockets/sockets.stub', 'SNMP_BIT_STR' => 'snmp/snmp.stub', 'SNMP_COUNTER' => 'snmp/snmp.stub', 'SNMP_COUNTER64' => 'snmp/snmp.stub', 'SNMP_INTEGER' => 'snmp/snmp.stub', 'SNMP_IPADDRESS' => 'snmp/snmp.stub', 'SNMP_NULL' => 'snmp/snmp.stub', 'SNMP_OBJECT_ID' => 'snmp/snmp.stub', 'SNMP_OCTET_STR' => 'snmp/snmp.stub', 'SNMP_OID_OUTPUT_FULL' => 'snmp/snmp.stub', 'SNMP_OID_OUTPUT_MODULE' => 'snmp/snmp.stub', 'SNMP_OID_OUTPUT_NONE' => 'snmp/snmp.stub', 'SNMP_OID_OUTPUT_NUMERIC' => 'snmp/snmp.stub', 'SNMP_OID_OUTPUT_SUFFIX' => 'snmp/snmp.stub', 'SNMP_OID_OUTPUT_UCD' => 'snmp/snmp.stub', 'SNMP_OPAQUE' => 'snmp/snmp.stub', 'SNMP_TIMETICKS' => 'snmp/snmp.stub', 'SNMP_UINTEGER' => 'snmp/snmp.stub', 'SNMP_UNSIGNED' => 'snmp/snmp.stub', 'SNMP_VALUE_LIBRARY' => 'snmp/snmp.stub', 'SNMP_VALUE_OBJECT' => 'snmp/snmp.stub', 'SNMP_VALUE_PLAIN' => 'snmp/snmp.stub', 'SOAP_1_1' => 'soap/soap.stub', 'SOAP_1_2' => 'soap/soap.stub', 'SOAP_ACTOR_NEXT' => 'soap/soap.stub', 'SOAP_ACTOR_NONE' => 'soap/soap.stub', 'SOAP_ACTOR_UNLIMATERECEIVER' => 'soap/soap.stub', 'SOAP_AUTHENTICATION_BASIC' => 'soap/soap.stub', 'SOAP_AUTHENTICATION_DIGEST' => 'soap/soap.stub', 'SOAP_COMPRESSION_ACCEPT' => 'soap/soap.stub', 'SOAP_COMPRESSION_DEFLATE' => 'soap/soap.stub', 'SOAP_COMPRESSION_GZIP' => 'soap/soap.stub', 'SOAP_DOCUMENT' => 'soap/soap.stub', 'SOAP_ENCODED' => 'soap/soap.stub', 'SOAP_ENC_ARRAY' => 'soap/soap.stub', 'SOAP_ENC_OBJECT' => 'soap/soap.stub', 'SOAP_FUNCTIONS_ALL' => 'soap/soap.stub', 'SOAP_LITERAL' => 'soap/soap.stub', 'SOAP_PERSISTENCE_REQUEST' => 'soap/soap.stub', 'SOAP_PERSISTENCE_SESSION' => 'soap/soap.stub', 'SOAP_RPC' => 'soap/soap.stub', 'SOAP_SINGLE_ELEMENT_ARRAYS' => 'soap/soap.stub', 'SOAP_SSL_METHOD_SSLv2' => 'soap/soap.stub', 'SOAP_SSL_METHOD_SSLv23' => 'soap/soap.stub', 'SOAP_SSL_METHOD_SSLv3' => 'soap/soap.stub', 'SOAP_SSL_METHOD_TLS' => 'soap/soap.stub', 'SOAP_USE_XSI_ARRAY_TYPE' => 'soap/soap.stub', 'SOAP_WAIT_ONE_WAY_CALLS' => 'soap/soap.stub', 'SOCKET_E2BIG' => 'sockets/sockets.stub', 'SOCKET_EACCES' => 'sockets/sockets.stub', 'SOCKET_EADDRINUSE' => 'sockets/sockets.stub', 'SOCKET_EADDRNOTAVAIL' => 'sockets/sockets.stub', 'SOCKET_EADV' => 'sockets/sockets.stub', 'SOCKET_EAFNOSUPPORT' => 'sockets/sockets.stub', 'SOCKET_EAGAIN' => 'sockets/sockets.stub', 'SOCKET_EALREADY' => 'sockets/sockets.stub', 'SOCKET_EBADE' => 'sockets/sockets.stub', 'SOCKET_EBADF' => 'sockets/sockets.stub', 'SOCKET_EBADFD' => 'sockets/sockets.stub', 'SOCKET_EBADMSG' => 'sockets/sockets.stub', 'SOCKET_EBADR' => 'sockets/sockets.stub', 'SOCKET_EBADRQC' => 'sockets/sockets.stub', 'SOCKET_EBADSLT' => 'sockets/sockets.stub', 'SOCKET_EBUSY' => 'sockets/sockets.stub', 'SOCKET_ECANCELED' => 'swoole/constants.stub', 'SOCKET_ECHRNG' => 'sockets/sockets.stub', 'SOCKET_ECOMM' => 'sockets/sockets.stub', 'SOCKET_ECONNABORTED' => 'sockets/sockets.stub', 'SOCKET_ECONNREFUSED' => 'sockets/sockets.stub', 'SOCKET_ECONNRESET' => 'sockets/sockets.stub', 'SOCKET_EDESTADDRREQ' => 'sockets/sockets.stub', 'SOCKET_EDISCON' => 'sockets/sockets.stub', 'SOCKET_EDQUOT' => 'sockets/sockets.stub', 'SOCKET_EEXIST' => 'sockets/sockets.stub', 'SOCKET_EFAULT' => 'sockets/sockets.stub', 'SOCKET_EHOSTDOWN' => 'sockets/sockets.stub', 'SOCKET_EHOSTUNREACH' => 'sockets/sockets.stub', 'SOCKET_EIDRM' => 'sockets/sockets.stub', 'SOCKET_EINPROGRESS' => 'sockets/sockets.stub', 'SOCKET_EINTR' => 'sockets/sockets.stub', 'SOCKET_EINVAL' => 'sockets/sockets.stub', 'SOCKET_EIO' => 'sockets/sockets.stub', 'SOCKET_EISCONN' => 'sockets/sockets.stub', 'SOCKET_EISDIR' => 'sockets/sockets.stub', 'SOCKET_EISNAM' => 'sockets/sockets.stub', 'SOCKET_EL2HLT' => 'sockets/sockets.stub', 'SOCKET_EL2NSYNC' => 'sockets/sockets.stub', 'SOCKET_EL3HLT' => 'sockets/sockets.stub', 'SOCKET_EL3RST' => 'sockets/sockets.stub', 'SOCKET_ELNRNG' => 'sockets/sockets.stub', 'SOCKET_ELOOP' => 'sockets/sockets.stub', 'SOCKET_EMEDIUMTYPE' => 'sockets/sockets.stub', 'SOCKET_EMFILE' => 'sockets/sockets.stub', 'SOCKET_EMLINK' => 'sockets/sockets.stub', 'SOCKET_EMSGSIZE' => 'sockets/sockets.stub', 'SOCKET_EMULTIHOP' => 'sockets/sockets.stub', 'SOCKET_ENAMETOOLONG' => 'sockets/sockets.stub', 'SOCKET_ENETDOWN' => 'sockets/sockets.stub', 'SOCKET_ENETRESET' => 'sockets/sockets.stub', 'SOCKET_ENETUNREACH' => 'sockets/sockets.stub', 'SOCKET_ENFILE' => 'sockets/sockets.stub', 'SOCKET_ENOANO' => 'sockets/sockets.stub', 'SOCKET_ENOBUFS' => 'sockets/sockets.stub', 'SOCKET_ENOCSI' => 'sockets/sockets.stub', 'SOCKET_ENODATA' => 'sockets/sockets.stub', 'SOCKET_ENODEV' => 'sockets/sockets.stub', 'SOCKET_ENOENT' => 'sockets/sockets.stub', 'SOCKET_ENOLCK' => 'sockets/sockets.stub', 'SOCKET_ENOLINK' => 'sockets/sockets.stub', 'SOCKET_ENOMEDIUM' => 'sockets/sockets.stub', 'SOCKET_ENOMEM' => 'sockets/sockets.stub', 'SOCKET_ENOMSG' => 'sockets/sockets.stub', 'SOCKET_ENONET' => 'sockets/sockets.stub', 'SOCKET_ENOPROTOOPT' => 'sockets/sockets.stub', 'SOCKET_ENOSPC' => 'sockets/sockets.stub', 'SOCKET_ENOSR' => 'sockets/sockets.stub', 'SOCKET_ENOSTR' => 'sockets/sockets.stub', 'SOCKET_ENOSYS' => 'sockets/sockets.stub', 'SOCKET_ENOTBLK' => 'sockets/sockets.stub', 'SOCKET_ENOTCONN' => 'sockets/sockets.stub', 'SOCKET_ENOTDIR' => 'sockets/sockets.stub', 'SOCKET_ENOTEMPTY' => 'sockets/sockets.stub', 'SOCKET_ENOTSOCK' => 'sockets/sockets.stub', 'SOCKET_ENOTTY' => 'sockets/sockets.stub', 'SOCKET_ENOTUNIQ' => 'sockets/sockets.stub', 'SOCKET_ENXIO' => 'sockets/sockets.stub', 'SOCKET_EOPNOTSUPP' => 'sockets/sockets.stub', 'SOCKET_EPERM' => 'sockets/sockets.stub', 'SOCKET_EPFNOSUPPORT' => 'sockets/sockets.stub', 'SOCKET_EPIPE' => 'sockets/sockets.stub', 'SOCKET_EPROCLIM' => 'sockets/sockets.stub', 'SOCKET_EPROTO' => 'sockets/sockets.stub', 'SOCKET_EPROTONOSUPPORT' => 'sockets/sockets.stub', 'SOCKET_EPROTOTYPE' => 'sockets/sockets.stub', 'SOCKET_EREMCHG' => 'sockets/sockets.stub', 'SOCKET_EREMOTE' => 'sockets/sockets.stub', 'SOCKET_EREMOTEIO' => 'sockets/sockets.stub', 'SOCKET_ERESTART' => 'sockets/sockets.stub', 'SOCKET_EROFS' => 'sockets/sockets.stub', 'SOCKET_ESHUTDOWN' => 'sockets/sockets.stub', 'SOCKET_ESOCKTNOSUPPORT' => 'sockets/sockets.stub', 'SOCKET_ESPIPE' => 'sockets/sockets.stub', 'SOCKET_ESRMNT' => 'sockets/sockets.stub', 'SOCKET_ESTALE' => 'sockets/sockets.stub', 'SOCKET_ESTRPIPE' => 'sockets/sockets.stub', 'SOCKET_ETIME' => 'sockets/sockets.stub', 'SOCKET_ETIMEDOUT' => 'sockets/sockets.stub', 'SOCKET_ETOOMANYREFS' => 'sockets/sockets.stub', 'SOCKET_EUNATCH' => 'sockets/sockets.stub', 'SOCKET_EUSERS' => 'sockets/sockets.stub', 'SOCKET_EWOULDBLOCK' => 'sockets/sockets.stub', 'SOCKET_EXDEV' => 'sockets/sockets.stub', 'SOCKET_EXFULL' => 'sockets/sockets.stub', 'SOCKET_HOST_NOT_FOUND' => 'sockets/sockets.stub', 'SOCKET_NOTINITIALISED' => 'sockets/sockets.stub', 'SOCKET_NO_ADDRESS' => 'sockets/sockets.stub', 'SOCKET_NO_DATA' => 'sockets/sockets.stub', 'SOCKET_NO_RECOVERY' => 'sockets/sockets.stub', 'SOCKET_SYSNOTREADY' => 'sockets/sockets.stub', 'SOCKET_TRY_AGAIN' => 'sockets/sockets.stub', 'SOCKET_VERNOTSUPPORTED' => 'sockets/sockets.stub', 'SOCK_CLOEXEC' => 'sockets/sockets.stub', 'SOCK_DCCP' => 'sockets/sockets.stub', 'SOCK_DGRAM' => 'sockets/sockets.stub', 'SOCK_NONBLOCK' => 'sockets/sockets.stub', 'SOCK_RAW' => 'sockets/sockets.stub', 'SOCK_RDM' => 'sockets/sockets.stub', 'SOCK_SEQPACKET' => 'sockets/sockets.stub', 'SOCK_STREAM' => 'sockets/sockets.stub', 'SODIUM_BASE64_VARIANT_ORIGINAL' => 'sodium/sodium.stub', 'SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING' => 'sodium/sodium.stub', 'SODIUM_BASE64_VARIANT_URLSAFE' => 'sodium/sodium.stub', 'SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_AEGIS128L_ABYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS128L_NSECBYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS256_ABYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AEGIS256_NSECBYTES' => 'libsodium/libsodium_d.stub', 'SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NSECBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AUTH_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_AUTH_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_KEYPAIRBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_MACBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_NONCEBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_PUBLICKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_SEALBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_SECRETKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_BOX_SEEDBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_GENERICHASH_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_GENERICHASH_BYTES_MAX' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_GENERICHASH_BYTES_MIN' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_GENERICHASH_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KDF_BYTES_MAX' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KDF_BYTES_MIN' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KDF_CONTEXTBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KDF_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KX_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KX_KEYPAIRBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KX_PUBLICKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KX_SECRETKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KX_SEEDBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_KX_SESSIONKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_ALG_DEFAULT' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SALTBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_PWHASH_STRPREFIX' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SCALARMULT_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SCALARMULT_SCALARBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETBOX_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETBOX_MACBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETBOX_NONCEBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SHORTHASH_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SHORTHASH_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SIGN_BYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SIGN_KEYPAIRBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SIGN_SECRETKEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_SIGN_SEEDBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_STREAM_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_STREAM_NONCEBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES' => 'sodium/sodium.stub', 'SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES' => 'sodium/sodium.stub', 'SODIUM_LIBRARY_MAJOR_VERSION' => 'sodium/sodium.stub', 'SODIUM_LIBRARY_MINOR_VERSION' => 'sodium/sodium.stub', 'SODIUM_LIBRARY_VERSION' => 'sodium/sodium.stub', 'SOLR_EXTENSION_VERSION' => 'solr/constants.stub', 'SOLR_MAJOR_VERSION' => 'solr/constants.stub', 'SOLR_MINOR_VERSION' => 'solr/constants.stub', 'SOLR_PATCH_VERSION' => 'solr/constants.stub', 'SOL_SOCKET' => 'sockets/sockets.stub', 'SOL_TCP' => 'sockets/sockets.stub', 'SOL_UDP' => 'sockets/sockets.stub', 'SOL_UDPLITE' => 'sockets/sockets.stub', 'SOMAXCONN' => 'sockets/sockets.stub', 'SORTARRIVAL' => 'imap/imap.stub', 'SORTCC' => 'imap/imap.stub', 'SORTDATE' => 'imap/imap.stub', 'SORTFROM' => 'imap/imap.stub', 'SORTSIZE' => 'imap/imap.stub', 'SORTSUBJECT' => 'imap/imap.stub', 'SORTTO' => 'imap/imap.stub', 'SORT_ASC' => 'standard/standard_defines.stub', 'SORT_DESC' => 'standard/standard_defines.stub', 'SORT_FLAG_CASE' => 'standard/standard_defines.stub', 'SORT_LOCALE_STRING' => 'standard/standard_defines.stub', 'SORT_NATURAL' => 'standard/standard_defines.stub', 'SORT_NUMERIC' => 'standard/standard_defines.stub', 'SORT_REGULAR' => 'standard/standard_defines.stub', 'SORT_STRING' => 'standard/standard_defines.stub', 'SO_ATTACH_REUSEPORT_CBPF' => 'sockets/sockets.stub', 'SO_BINDTODEVICE' => 'sockets/sockets.stub', 'SO_BINDTOIFINDEX' => 'sockets/sockets.stub', 'SO_BPF_EXTENSIONS' => 'sockets/sockets.stub', 'SO_BROADCAST' => 'sockets/sockets.stub', 'SO_DEBUG' => 'sockets/sockets.stub', 'SO_DETACH_BPF' => 'sockets/sockets.stub', 'SO_DETACH_FILTER' => 'sockets/sockets.stub', 'SO_DONTROUTE' => 'sockets/sockets.stub', 'SO_ERROR' => 'sockets/sockets.stub', 'SO_FREE' => 'imap/imap.stub', 'SO_INCOMING_CPU' => 'sockets/sockets.stub', 'SO_KEEPALIVE' => 'sockets/sockets.stub', 'SO_LINGER' => 'sockets/sockets.stub', 'SO_MARK' => 'sockets/sockets.stub', 'SO_MEMINFO' => 'sockets/sockets.stub', 'SO_NOSERVER' => 'imap/imap.stub', 'SO_OOBINLINE' => 'sockets/sockets.stub', 'SO_PASSCRED' => 'sockets/sockets.stub', 'SO_RCVBUF' => 'sockets/sockets.stub', 'SO_RCVLOWAT' => 'sockets/sockets.stub', 'SO_RCVTIMEO' => 'sockets/sockets.stub', 'SO_REUSEADDR' => 'sockets/sockets.stub', 'SO_REUSEPORT' => 'sockets/sockets.stub', 'SO_SNDBUF' => 'sockets/sockets.stub', 'SO_SNDLOWAT' => 'sockets/sockets.stub', 'SO_SNDTIMEO' => 'sockets/sockets.stub', 'SO_TYPE' => 'sockets/sockets.stub', 'SO_ZEROCOPY' => 'sockets/sockets.stub', 'SQLBIT' => 'mssql/mssql.stub', 'SQLCHAR' => 'mssql/mssql.stub', 'SQLFLT4' => 'mssql/mssql.stub', 'SQLFLT8' => 'mssql/mssql.stub', 'SQLFLTN' => 'mssql/mssql.stub', 'SQLINT1' => 'mssql/mssql.stub', 'SQLINT2' => 'mssql/mssql.stub', 'SQLINT4' => 'mssql/mssql.stub', 'SQLITE3_ASSOC' => 'sqlite3/sqlite3.stub', 'SQLITE3_BLOB' => 'sqlite3/sqlite3.stub', 'SQLITE3_BOTH' => 'sqlite3/sqlite3.stub', 'SQLITE3_DETERMINISTIC' => 'sqlite3/sqlite3.stub', 'SQLITE3_FLOAT' => 'sqlite3/sqlite3.stub', 'SQLITE3_INTEGER' => 'sqlite3/sqlite3.stub', 'SQLITE3_NULL' => 'sqlite3/sqlite3.stub', 'SQLITE3_NUM' => 'sqlite3/sqlite3.stub', 'SQLITE3_OPEN_CREATE' => 'sqlite3/sqlite3.stub', 'SQLITE3_OPEN_READONLY' => 'sqlite3/sqlite3.stub', 'SQLITE3_OPEN_READWRITE' => 'sqlite3/sqlite3.stub', 'SQLITE3_TEXT' => 'sqlite3/sqlite3.stub', 'SQLITE_ABORT' => 'SQLite/SQLite.stub', 'SQLITE_ASSOC' => 'SQLite/SQLite.stub', 'SQLITE_AUTH' => 'SQLite/SQLite.stub', 'SQLITE_BOTH' => 'SQLite/SQLite.stub', 'SQLITE_BUSY' => 'SQLite/SQLite.stub', 'SQLITE_CANTOPEN' => 'SQLite/SQLite.stub', 'SQLITE_CONSTRAINT' => 'SQLite/SQLite.stub', 'SQLITE_CORRUPT' => 'SQLite/SQLite.stub', 'SQLITE_DONE' => 'SQLite/SQLite.stub', 'SQLITE_EMPTY' => 'SQLite/SQLite.stub', 'SQLITE_ERROR' => 'SQLite/SQLite.stub', 'SQLITE_FORMAT' => 'SQLite/SQLite.stub', 'SQLITE_FULL' => 'SQLite/SQLite.stub', 'SQLITE_INTERNAL' => 'SQLite/SQLite.stub', 'SQLITE_INTERRUPT' => 'SQLite/SQLite.stub', 'SQLITE_IOERR' => 'SQLite/SQLite.stub', 'SQLITE_LOCKED' => 'SQLite/SQLite.stub', 'SQLITE_MISMATCH' => 'SQLite/SQLite.stub', 'SQLITE_MISUSE' => 'SQLite/SQLite.stub', 'SQLITE_NOLFS' => 'SQLite/SQLite.stub', 'SQLITE_NOMEM' => 'SQLite/SQLite.stub', 'SQLITE_NOTADB' => 'SQLite/SQLite.stub', 'SQLITE_NOTFOUND' => 'SQLite/SQLite.stub', 'SQLITE_NUM' => 'SQLite/SQLite.stub', 'SQLITE_OK' => 'SQLite/SQLite.stub', 'SQLITE_PERM' => 'SQLite/SQLite.stub', 'SQLITE_PROTOCOL' => 'SQLite/SQLite.stub', 'SQLITE_READONLY' => 'SQLite/SQLite.stub', 'SQLITE_ROW' => 'SQLite/SQLite.stub', 'SQLITE_SCHEMA' => 'SQLite/SQLite.stub', 'SQLITE_TOOBIG' => 'SQLite/SQLite.stub', 'SQLSRV_CURSOR_CLIENT_BUFFERED' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_CURSOR_DYNAMIC' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_CURSOR_FORWARD' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_CURSOR_KEYSET' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_CURSOR_STATIC' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_ENC_BINARY' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_ENC_CHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_ERR_ALL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_ERR_ERRORS' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_ERR_WARNINGS' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_FETCH_ASSOC' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_FETCH_BOTH' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_FETCH_NUMERIC' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SEVERITY_ALL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SEVERITY_ERROR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SEVERITY_NOTICE' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SEVERITY_WARNING' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SYSTEM_ALL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SYSTEM_CONN' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SYSTEM_INIT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SYSTEM_OFF' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SYSTEM_STMT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_LOG_SYSTEM_UTIL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_NULLABLE_NO' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_NULLABLE_UNKNOWN' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_NULLABLE_YES' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PARAM_IN' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PARAM_INOUT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PARAM_OUT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PHPTYPE_DATETIME' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PHPTYPE_FLOAT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PHPTYPE_INT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_PHPTYPE_NULL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SCROLL_ABSOLUTE' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SCROLL_FIRST' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SCROLL_LAST' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SCROLL_NEXT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SCROLL_PRIOR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SCROLL_RELATIVE' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_BIGINT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_BIT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_CHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_DATE' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_DATETIME' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_DATETIME2' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_DATETIMEOFFSET' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_DECIMAL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_FLOAT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_IMAGE' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_INT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_MONEY' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NCHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NTEXT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NUMERIC' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_NVARCHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_REAL' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_SMALLDATETIME' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_SMALLINT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_SMALLMONEY' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_TEXT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_TIME' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_TIMESTAMP' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_TINYINT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_UDT' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_UNIQUEIDENTIFIER' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_VARBINARY' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_VARCHAR' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_SQLTYPE_XML' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_TXN_READ_COMMITTED' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_TXN_READ_UNCOMMITTED' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_TXN_REPEATABLE_READ' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_TXN_SERIALIZABLE' => 'sqlsrv/sqlsrv.stub', 'SQLSRV_TXN_SNAPSHOT' => 'sqlsrv/sqlsrv.stub', 'SQLTEXT' => 'mssql/mssql.stub', 'SQLT_AFC' => 'oci8/oci8.stub', 'SQLT_AVC' => 'oci8/oci8.stub', 'SQLT_BDOUBLE' => 'oci8/oci8.stub', 'SQLT_BFILEE' => 'oci8/oci8.stub', 'SQLT_BFLOAT' => 'oci8/oci8.stub', 'SQLT_BIN' => 'oci8/oci8.stub', 'SQLT_BLOB' => 'oci8/oci8.stub', 'SQLT_BOL' => 'oci8/oci8.stub', 'SQLT_CFILEE' => 'oci8/oci8.stub', 'SQLT_CHR' => 'oci8/oci8.stub', 'SQLT_CLOB' => 'oci8/oci8.stub', 'SQLT_FLT' => 'oci8/oci8.stub', 'SQLT_INT' => 'oci8/oci8.stub', 'SQLT_LBI' => 'oci8/oci8.stub', 'SQLT_LNG' => 'oci8/oci8.stub', 'SQLT_LVC' => 'oci8/oci8.stub', 'SQLT_NTY' => 'oci8/oci8.stub', 'SQLT_NUM' => 'oci8/oci8.stub', 'SQLT_ODT' => 'oci8/oci8.stub', 'SQLT_RDD' => 'oci8/oci8.stub', 'SQLT_RSET' => 'oci8/oci8.stub', 'SQLT_STR' => 'oci8/oci8.stub', 'SQLT_UIN' => 'oci8/oci8.stub', 'SQLT_VCS' => 'oci8/oci8.stub', 'SQLVARCHAR' => 'mssql/mssql.stub', 'SQL_BEST_ROWID' => 'odbc/odbc.stub', 'SQL_BIGINT' => 'odbc/odbc.stub', 'SQL_BINARY' => 'odbc/odbc.stub', 'SQL_BIT' => 'odbc/odbc.stub', 'SQL_CHAR' => 'odbc/odbc.stub', 'SQL_CONCURRENCY' => 'odbc/odbc.stub', 'SQL_CONCUR_LOCK' => 'odbc/odbc.stub', 'SQL_CONCUR_READ_ONLY' => 'odbc/odbc.stub', 'SQL_CONCUR_ROWVER' => 'odbc/odbc.stub', 'SQL_CONCUR_VALUES' => 'odbc/odbc.stub', 'SQL_CURSOR_DYNAMIC' => 'odbc/odbc.stub', 'SQL_CURSOR_FORWARD_ONLY' => 'odbc/odbc.stub', 'SQL_CURSOR_KEYSET_DRIVEN' => 'odbc/odbc.stub', 'SQL_CURSOR_STATIC' => 'odbc/odbc.stub', 'SQL_CURSOR_TYPE' => 'odbc/odbc.stub', 'SQL_CUR_USE_DRIVER' => 'odbc/odbc.stub', 'SQL_CUR_USE_IF_NEEDED' => 'odbc/odbc.stub', 'SQL_CUR_USE_ODBC' => 'odbc/odbc.stub', 'SQL_DATE' => 'odbc/odbc.stub', 'SQL_DECIMAL' => 'odbc/odbc.stub', 'SQL_DOUBLE' => 'odbc/odbc.stub', 'SQL_ENSURE' => 'odbc/odbc.stub', 'SQL_FETCH_FIRST' => 'odbc/odbc.stub', 'SQL_FETCH_NEXT' => 'odbc/odbc.stub', 'SQL_FLOAT' => 'odbc/odbc.stub', 'SQL_INDEX_ALL' => 'odbc/odbc.stub', 'SQL_INDEX_UNIQUE' => 'odbc/odbc.stub', 'SQL_INTEGER' => 'odbc/odbc.stub', 'SQL_KEYSET_SIZE' => 'odbc/odbc.stub', 'SQL_LONGVARBINARY' => 'odbc/odbc.stub', 'SQL_LONGVARCHAR' => 'odbc/odbc.stub', 'SQL_NO_NULLS' => 'odbc/odbc.stub', 'SQL_NULLABLE' => 'odbc/odbc.stub', 'SQL_NUMERIC' => 'odbc/odbc.stub', 'SQL_ODBC_CURSORS' => 'odbc/odbc.stub', 'SQL_QUICK' => 'odbc/odbc.stub', 'SQL_REAL' => 'odbc/odbc.stub', 'SQL_ROWVER' => 'odbc/odbc.stub', 'SQL_SCOPE_CURROW' => 'odbc/odbc.stub', 'SQL_SCOPE_SESSION' => 'odbc/odbc.stub', 'SQL_SCOPE_TRANSACTION' => 'odbc/odbc.stub', 'SQL_SMALLINT' => 'odbc/odbc.stub', 'SQL_TIME' => 'odbc/odbc.stub', 'SQL_TIMESTAMP' => 'odbc/odbc.stub', 'SQL_TINYINT' => 'odbc/odbc.stub', 'SQL_TYPE_DATE' => 'odbc/odbc.stub', 'SQL_TYPE_TIME' => 'odbc/odbc.stub', 'SQL_TYPE_TIMESTAMP' => 'odbc/odbc.stub', 'SQL_VARBINARY' => 'odbc/odbc.stub', 'SQL_VARCHAR' => 'odbc/odbc.stub', 'SQL_WCHAR' => 'odbc/odbc.stub', 'SQL_WLONGVARCHAR' => 'odbc/odbc.stub', 'SQL_WVARCHAR' => 'odbc/odbc.stub', 'SSH2_DEFAULT_TERMINAL' => 'ssh2/ssh2.stub', 'SSH2_DEFAULT_TERM_HEIGHT' => 'ssh2/ssh2.stub', 'SSH2_DEFAULT_TERM_UNIT' => 'ssh2/ssh2.stub', 'SSH2_DEFAULT_TERM_WIDTH' => 'ssh2/ssh2.stub', 'SSH2_FINGERPRINT_HEX' => 'ssh2/ssh2.stub', 'SSH2_FINGERPRINT_MD5' => 'ssh2/ssh2.stub', 'SSH2_FINGERPRINT_RAW' => 'ssh2/ssh2.stub', 'SSH2_FINGERPRINT_SHA1' => 'ssh2/ssh2.stub', 'SSH2_POLLERR' => 'ssh2/ssh2.stub', 'SSH2_POLLEXT' => 'ssh2/ssh2.stub', 'SSH2_POLLHUP' => 'ssh2/ssh2.stub', 'SSH2_POLLIN' => 'ssh2/ssh2.stub', 'SSH2_POLLNVAL' => 'ssh2/ssh2.stub', 'SSH2_POLLOUT' => 'ssh2/ssh2.stub', 'SSH2_POLL_CHANNEL_CLOSED' => 'ssh2/ssh2.stub', 'SSH2_POLL_LISTENER_CLOSED' => 'ssh2/ssh2.stub', 'SSH2_POLL_SESSION_CLOSED' => 'ssh2/ssh2.stub', 'SSH2_STREAM_STDERR' => 'ssh2/ssh2.stub', 'SSH2_STREAM_STDIO' => 'ssh2/ssh2.stub', 'SSH2_TERM_UNIT_CHARS' => 'ssh2/ssh2.stub', 'SSH2_TERM_UNIT_PIXELS' => 'ssh2/ssh2.stub', 'STDERR' => 'Core/Core_d.stub', 'STDIN' => 'Core/Core_d.stub', 'STDOUT' => 'Core/Core_d.stub', 'STREAM_BUFFER_FULL' => 'standard/standard_defines.stub', 'STREAM_BUFFER_LINE' => 'standard/standard_defines.stub', 'STREAM_BUFFER_NONE' => 'standard/standard_defines.stub', 'STREAM_CAST_AS_STREAM' => 'standard/standard_defines.stub', 'STREAM_CAST_FOR_SELECT' => 'standard/standard_defines.stub', 'STREAM_CLIENT_ASYNC_CONNECT' => 'standard/standard_defines.stub', 'STREAM_CLIENT_CONNECT' => 'standard/standard_defines.stub', 'STREAM_CLIENT_PERSISTENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_ANY_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_ANY_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_SSLv23_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_SSLv23_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_SSLv2_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_SSLv2_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_SSLv3_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_SSLv3_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLS_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLS_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_0_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_1_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_2_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_METHOD_TLSv1_3_SERVER' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_PROTO_SSLv3' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_PROTO_TLSv1_0' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_PROTO_TLSv1_1' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_PROTO_TLSv1_2' => 'standard/standard_defines.stub', 'STREAM_CRYPTO_PROTO_TLSv1_3' => 'standard/standard_defines.stub', 'STREAM_ENFORCE_SAFE_MODE' => 'standard/standard_defines.stub', 'STREAM_FILTER_ALL' => 'standard/standard_defines.stub', 'STREAM_FILTER_READ' => 'standard/standard_defines.stub', 'STREAM_FILTER_WRITE' => 'standard/standard_defines.stub', 'STREAM_IGNORE_URL' => 'standard/standard_defines.stub', 'STREAM_IPPROTO_ICMP' => 'standard/standard_defines.stub', 'STREAM_IPPROTO_IP' => 'standard/standard_defines.stub', 'STREAM_IPPROTO_RAW' => 'standard/standard_defines.stub', 'STREAM_IPPROTO_TCP' => 'standard/standard_defines.stub', 'STREAM_IPPROTO_UDP' => 'standard/standard_defines.stub', 'STREAM_IS_URL' => 'standard/standard_defines.stub', 'STREAM_META_ACCESS' => 'standard/standard_defines.stub', 'STREAM_META_GROUP' => 'standard/standard_defines.stub', 'STREAM_META_GROUP_NAME' => 'standard/standard_defines.stub', 'STREAM_META_OWNER' => 'standard/standard_defines.stub', 'STREAM_META_OWNER_NAME' => 'standard/standard_defines.stub', 'STREAM_META_TOUCH' => 'standard/standard_defines.stub', 'STREAM_MKDIR_RECURSIVE' => 'standard/standard_defines.stub', 'STREAM_MUST_SEEK' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_AUTH_REQUIRED' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_AUTH_RESULT' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_COMPLETED' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_CONNECT' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_FAILURE' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_FILE_SIZE_IS' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_MIME_TYPE_IS' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_PROGRESS' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_REDIRECTED' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_RESOLVE' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_SEVERITY_ERR' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_SEVERITY_INFO' => 'standard/standard_defines.stub', 'STREAM_NOTIFY_SEVERITY_WARN' => 'standard/standard_defines.stub', 'STREAM_OOB' => 'standard/standard_defines.stub', 'STREAM_OPTION_BLOCKING' => 'standard/standard_defines.stub', 'STREAM_OPTION_READ_BUFFER' => 'standard/standard_defines.stub', 'STREAM_OPTION_READ_TIMEOUT' => 'standard/standard_defines.stub', 'STREAM_OPTION_WRITE_BUFFER' => 'standard/standard_defines.stub', 'STREAM_PEEK' => 'standard/standard_defines.stub', 'STREAM_PF_INET' => 'standard/standard_defines.stub', 'STREAM_PF_INET6' => 'standard/standard_defines.stub', 'STREAM_PF_UNIX' => 'standard/standard_defines.stub', 'STREAM_REPORT_ERRORS' => 'standard/standard_defines.stub', 'STREAM_SERVER_BIND' => 'standard/standard_defines.stub', 'STREAM_SERVER_LISTEN' => 'standard/standard_defines.stub', 'STREAM_SHUT_RD' => 'standard/standard_defines.stub', 'STREAM_SHUT_RDWR' => 'standard/standard_defines.stub', 'STREAM_SHUT_WR' => 'standard/standard_defines.stub', 'STREAM_SOCK_DGRAM' => 'standard/standard_defines.stub', 'STREAM_SOCK_RAW' => 'standard/standard_defines.stub', 'STREAM_SOCK_RDM' => 'standard/standard_defines.stub', 'STREAM_SOCK_SEQPACKET' => 'standard/standard_defines.stub', 'STREAM_SOCK_STREAM' => 'standard/standard_defines.stub', 'STREAM_URL_STAT_LINK' => 'standard/standard_defines.stub', 'STREAM_URL_STAT_QUIET' => 'standard/standard_defines.stub', 'STREAM_USE_PATH' => 'standard/standard_defines.stub', 'STR_PAD_BOTH' => 'standard/standard_defines.stub', 'STR_PAD_LEFT' => 'standard/standard_defines.stub', 'STR_PAD_RIGHT' => 'standard/standard_defines.stub', 'ST_SET' => 'imap/imap.stub', 'ST_SILENT' => 'imap/imap.stub', 'ST_UID' => 'imap/imap.stub', 'SUHOSIN_PATCH' => 'Core/Core_d.stub', 'SUHOSIN_PATCH_VERSION' => 'Core/Core_d.stub', 'SUNFUNCS_RET_DOUBLE' => 'date/date_d.stub', 'SUNFUNCS_RET_STRING' => 'date/date_d.stub', 'SUNFUNCS_RET_TIMESTAMP' => 'date/date_d.stub', 'SVN_ALL' => 'svn/svn.stub', 'SVN_AUTH_PARAM_CONFIG' => 'svn/svn.stub', 'SVN_AUTH_PARAM_CONFIG_DIR' => 'svn/svn.stub', 'SVN_AUTH_PARAM_DEFAULT_PASSWORD' => 'svn/svn.stub', 'SVN_AUTH_PARAM_DEFAULT_USERNAME' => 'svn/svn.stub', 'SVN_AUTH_PARAM_DONT_STORE_PASSWORDS' => 'svn/svn.stub', 'SVN_AUTH_PARAM_NON_INTERACTIVE' => 'svn/svn.stub', 'SVN_AUTH_PARAM_NO_AUTH_CACHE' => 'svn/svn.stub', 'SVN_AUTH_PARAM_SERVER_GROUP' => 'svn/svn.stub', 'SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO' => 'svn/svn.stub', 'SVN_AUTH_PARAM_SSL_SERVER_FAILURES' => 'svn/svn.stub', 'SVN_DISCOVER_CHANGED_PATHS' => 'svn/svn.stub', 'SVN_FS_CONFIG_FS_TYPE' => 'svn/svn.stub', 'SVN_FS_TYPE_BDB' => 'svn/svn.stub', 'SVN_FS_TYPE_FSFS' => 'svn/svn.stub', 'SVN_NODE_DIR' => 'svn/svn.stub', 'SVN_NODE_FILE' => 'svn/svn.stub', 'SVN_NODE_NONE' => 'svn/svn.stub', 'SVN_NODE_UNKNOWN' => 'svn/svn.stub', 'SVN_NON_RECURSIVE' => 'svn/svn.stub', 'SVN_NO_IGNORE' => 'svn/svn.stub', 'SVN_OMIT_MESSAGES' => 'svn/svn.stub', 'SVN_PROP_REVISION_AUTHOR' => 'svn/svn.stub', 'SVN_PROP_REVISION_DATE' => 'svn/svn.stub', 'SVN_PROP_REVISION_LOG' => 'svn/svn.stub', 'SVN_PROP_REVISION_ORIG_DATE' => 'svn/svn.stub', 'SVN_REVISION_BASE' => 'svn/svn.stub', 'SVN_REVISION_COMMITTED' => 'svn/svn.stub', 'SVN_REVISION_HEAD' => 'svn/svn.stub', 'SVN_REVISION_INITIAL' => 'svn/svn.stub', 'SVN_REVISION_PREV' => 'svn/svn.stub', 'SVN_REVISION_UNSPECIFIED' => 'svn/svn.stub', 'SVN_SHOW_UPDATES' => 'svn/svn.stub', 'SVN_STOP_ON_COPY' => 'svn/svn.stub', 'SVN_WC_SCHEDULE_ADD' => 'svn/svn.stub', 'SVN_WC_SCHEDULE_DELETE' => 'svn/svn.stub', 'SVN_WC_SCHEDULE_NORMAL' => 'svn/svn.stub', 'SVN_WC_SCHEDULE_REPLACE' => 'svn/svn.stub', 'SVN_WC_STATUS_ADDED' => 'svn/svn.stub', 'SVN_WC_STATUS_CONFLICTED' => 'svn/svn.stub', 'SVN_WC_STATUS_DELETED' => 'svn/svn.stub', 'SVN_WC_STATUS_EXTERNAL' => 'svn/svn.stub', 'SVN_WC_STATUS_IGNORED' => 'svn/svn.stub', 'SVN_WC_STATUS_INCOMPLETE' => 'svn/svn.stub', 'SVN_WC_STATUS_MERGED' => 'svn/svn.stub', 'SVN_WC_STATUS_MISSING' => 'svn/svn.stub', 'SVN_WC_STATUS_MODIFIED' => 'svn/svn.stub', 'SVN_WC_STATUS_NONE' => 'svn/svn.stub', 'SVN_WC_STATUS_NORMAL' => 'svn/svn.stub', 'SVN_WC_STATUS_OBSTRUCTED' => 'svn/svn.stub', 'SVN_WC_STATUS_REPLACED' => 'svn/svn.stub', 'SVN_WC_STATUS_UNVERSIONED' => 'svn/svn.stub', 'SWFACTION_DATA' => 'ming/ming.stub', 'SWFACTION_ENTERFRAME' => 'ming/ming.stub', 'SWFACTION_KEYDOWN' => 'ming/ming.stub', 'SWFACTION_KEYUP' => 'ming/ming.stub', 'SWFACTION_MOUSEDOWN' => 'ming/ming.stub', 'SWFACTION_MOUSEMOVE' => 'ming/ming.stub', 'SWFACTION_MOUSEUP' => 'ming/ming.stub', 'SWFACTION_ONLOAD' => 'ming/ming.stub', 'SWFACTION_UNLOAD' => 'ming/ming.stub', 'SWFBUTTON_DOWN' => 'ming/ming.stub', 'SWFBUTTON_DRAGOUT' => 'ming/ming.stub', 'SWFBUTTON_DRAGOVER' => 'ming/ming.stub', 'SWFBUTTON_HIT' => 'ming/ming.stub', 'SWFBUTTON_MOUSEDOWN' => 'ming/ming.stub', 'SWFBUTTON_MOUSEOUT' => 'ming/ming.stub', 'SWFBUTTON_MOUSEOVER' => 'ming/ming.stub', 'SWFBUTTON_MOUSEUP' => 'ming/ming.stub', 'SWFBUTTON_MOUSEUPOUTSIDE' => 'ming/ming.stub', 'SWFBUTTON_OVER' => 'ming/ming.stub', 'SWFBUTTON_UP' => 'ming/ming.stub', 'SWFFILL_CLIPPED_BITMAP' => 'ming/ming.stub', 'SWFFILL_LINEAR_GRADIENT' => 'ming/ming.stub', 'SWFFILL_RADIAL_GRADIENT' => 'ming/ming.stub', 'SWFFILL_TILED_BITMAP' => 'ming/ming.stub', 'SWFTEXTFIELD_ALIGN_CENTER' => 'ming/ming.stub', 'SWFTEXTFIELD_ALIGN_JUSTIFY' => 'ming/ming.stub', 'SWFTEXTFIELD_ALIGN_LEFT' => 'ming/ming.stub', 'SWFTEXTFIELD_ALIGN_RIGHT' => 'ming/ming.stub', 'SWFTEXTFIELD_AUTOSIZE' => 'ming/ming.stub', 'SWFTEXTFIELD_DRAWBOX' => 'ming/ming.stub', 'SWFTEXTFIELD_HASLENGTH' => 'ming/ming.stub', 'SWFTEXTFIELD_HTML' => 'ming/ming.stub', 'SWFTEXTFIELD_MULTILINE' => 'ming/ming.stub', 'SWFTEXTFIELD_NOEDIT' => 'ming/ming.stub', 'SWFTEXTFIELD_NOSELECT' => 'ming/ming.stub', 'SWFTEXTFIELD_PASSWORD' => 'ming/ming.stub', 'SWFTEXTFIELD_USEFONT' => 'ming/ming.stub', 'SWFTEXTFIELD_WORDWRAP' => 'ming/ming.stub', 'SWF_SOUND_11KHZ' => 'ming/ming.stub', 'SWF_SOUND_16BITS' => 'ming/ming.stub', 'SWF_SOUND_22KHZ' => 'ming/ming.stub', 'SWF_SOUND_44KHZ' => 'ming/ming.stub', 'SWF_SOUND_5KHZ' => 'ming/ming.stub', 'SWF_SOUND_8BITS' => 'ming/ming.stub', 'SWF_SOUND_ADPCM_COMPRESSED' => 'ming/ming.stub', 'SWF_SOUND_MONO' => 'ming/ming.stub', 'SWF_SOUND_MP3_COMPRESSED' => 'ming/ming.stub', 'SWF_SOUND_NELLY_COMPRESSED' => 'ming/ming.stub', 'SWF_SOUND_NOT_COMPRESSED' => 'ming/ming.stub', 'SWF_SOUND_NOT_COMPRESSED_LE' => 'ming/ming.stub', 'SWF_SOUND_STEREO' => 'ming/ming.stub', 'SWOOLE_ASYNC' => 'swoole/constants.stub', 'SWOOLE_BASE' => 'swoole/constants.stub', 'SWOOLE_CHANNEL_CANCELED' => 'swoole/constants.stub', 'SWOOLE_CHANNEL_CLOSED' => 'swoole/constants.stub', 'SWOOLE_CHANNEL_OK' => 'swoole/constants.stub', 'SWOOLE_CHANNEL_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_CORO_END' => 'swoole/constants.stub', 'SWOOLE_CORO_INIT' => 'swoole/constants.stub', 'SWOOLE_CORO_MAX_NUM_LIMIT' => 'swoole/constants.stub', 'SWOOLE_CORO_RUNNING' => 'swoole/constants.stub', 'SWOOLE_CORO_WAITING' => 'swoole/constants.stub', 'SWOOLE_DEBUG' => 'swoole/constants.stub', 'SWOOLE_DEFAULT_MAX_CORO_NUM' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_CO_CONN_LB' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_CO_REQ_LB' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_FDMOD' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_IDLE_WORKER' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_IPMOD' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_RESULT_CLOSE_CONNECTION' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_RESULT_DISCARD_PACKET' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_RESULT_USERFUNC_FALLBACK' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_ROUND' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_STREAM' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_UIDMOD' => 'swoole/constants.stub', 'SWOOLE_DISPATCH_USERFUNC' => 'swoole/constants.stub', 'SWOOLE_DTLS_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_DTLS_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_ERROR_AIO_BAD_REQUEST' => 'swoole/constants.stub', 'SWOOLE_ERROR_AIO_CANCELED' => 'swoole/constants.stub', 'SWOOLE_ERROR_AIO_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_ERROR_BAD_IPV6_ADDRESS' => 'swoole/constants.stub', 'SWOOLE_ERROR_CLIENT_NO_CONNECTION' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_BLOCK_OBJECT_LOCKED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_BLOCK_OBJECT_WAITING' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_CANCELED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_CANNOT_CANCEL' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_DISABLED_MULTI_THREAD' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_GETCONTEXT_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_HAS_BEEN_BOUND' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_HAS_BEEN_DISCARDED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_IOCPINIT_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_MAKECONTEXT_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_MUTEX_DOUBLE_UNLOCK' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_NOT_EXISTS' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_OUT_OF_COROUTINE' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_PROTECT_STACK_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_STD_THREAD_LINK_ERROR' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_SWAPCONTEXT_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_TIMEDOUT' => 'swoole/constants.stub', 'SWOOLE_ERROR_CO_YIELD_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_DATA_LENGTH_TOO_LARGE' => 'swoole/constants.stub', 'SWOOLE_ERROR_DNSLOOKUP_DUPLICATE_REQUEST' => 'swoole/constants.stub', 'SWOOLE_ERROR_DNSLOOKUP_NO_SERVER' => 'swoole/constants.stub', 'SWOOLE_ERROR_DNSLOOKUP_RESOLVE_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_DNSLOOKUP_RESOLVE_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_ERROR_DNSLOOKUP_UNSUPPORTED' => 'swoole/constants.stub', 'SWOOLE_ERROR_EVENT_SOCKET_REMOVED' => 'swoole/constants.stub', 'SWOOLE_ERROR_FILE_EMPTY' => 'swoole/constants.stub', 'SWOOLE_ERROR_FILE_NOT_EXIST' => 'swoole/constants.stub', 'SWOOLE_ERROR_FILE_TOO_LARGE' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP2_STREAM_ID_TOO_BIG' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP2_STREAM_IGNORE' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP2_STREAM_NOT_FOUND' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP2_STREAM_NO_HEADER' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP_INVALID_PROTOCOL' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP_PROXY_BAD_RESPONSE' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP_PROXY_HANDSHAKE_ERROR' => 'swoole/constants.stub', 'SWOOLE_ERROR_HTTP_PROXY_HANDSHAKE_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_INVALID_PARAMS' => 'swoole/constants.stub', 'SWOOLE_ERROR_MALLOC_FAIL' => 'swoole/constants.stub', 'SWOOLE_ERROR_NAME_TOO_LONG' => 'swoole/constants.stub', 'SWOOLE_ERROR_OPERATION_NOT_SUPPORT' => 'swoole/constants.stub', 'SWOOLE_ERROR_OUTPUT_BUFFER_OVERFLOW' => 'swoole/constants.stub', 'SWOOLE_ERROR_OUTPUT_SEND_YIELD' => 'swoole/constants.stub', 'SWOOLE_ERROR_PACKAGE_LENGTH_NOT_FOUND' => 'swoole/constants.stub', 'SWOOLE_ERROR_PACKAGE_LENGTH_TOO_LARGE' => 'swoole/constants.stub', 'SWOOLE_ERROR_PACKAGE_MALFORMED_DATA' => 'swoole/constants.stub', 'SWOOLE_ERROR_PHP_FATAL_ERROR' => 'swoole/constants.stub', 'SWOOLE_ERROR_PROTOCOL_ERROR' => 'swoole/constants.stub', 'SWOOLE_ERROR_QUEUE_FULL' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_CONNECT_FAIL' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_INVALID_COMMAND' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_INVALID_LISTEN_PORT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_INVALID_REQUEST' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_MUST_CREATED_BEFORE_CLIENT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_NO_IDLE_WORKER' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_ONLY_START_ONE' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_PIPE_BUFFER_FULL' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_SEND_IN_MASTER' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_TOO_MANY_LISTEN_PORT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_TOO_MANY_SOCKET' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_WORKER_ABNORMAL_PIPE_DATA' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_WORKER_EXIT_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_WORKER_TERMINATED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SERVER_WORKER_UNPROCESSED_DATA' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_CLOSED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_CLOSED_BY_CLIENT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_CLOSED_BY_SERVER' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_CLOSING' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_DISCARD_DATA' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_DISCARD_TIMEOUT_DATA' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_INVALID_ID' => 'swoole/constants.stub', 'SWOOLE_ERROR_SESSION_NOT_EXIST' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKET_CLOSED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKET_POLL_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKS5_AUTH_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKS5_HANDSHAKE_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKS5_SERVER_ERROR' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKS5_UNSUPPORT_METHOD' => 'swoole/constants.stub', 'SWOOLE_ERROR_SOCKS5_UNSUPPORT_VERSION' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_BAD_CLIENT' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_BAD_PROTOCOL' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_CANNOT_USE_SENFILE' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_EMPTY_PEER_CERTIFICATE' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_HANDSHAKE_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_NOT_READY' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_RESET' => 'swoole/constants.stub', 'SWOOLE_ERROR_SSL_VERIFY_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_SYSTEM_CALL_FAIL' => 'swoole/constants.stub', 'SWOOLE_ERROR_TASK_DISPATCH_FAIL' => 'swoole/constants.stub', 'SWOOLE_ERROR_TASK_PACKAGE_TOO_BIG' => 'swoole/constants.stub', 'SWOOLE_ERROR_TASK_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_ERROR_UNREGISTERED_SIGNAL' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_BAD_CLIENT' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_BAD_OPCODE' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_HANDSHAKE_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_INCOMPLETE_PACKET' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_PACK_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_UNCONNECTED' => 'swoole/constants.stub', 'SWOOLE_ERROR_WEBSOCKET_UNPACK_FAILED' => 'swoole/constants.stub', 'SWOOLE_ERROR_WRONG_OPERATION' => 'swoole/constants.stub', 'SWOOLE_EVENT_READ' => 'swoole/constants.stub', 'SWOOLE_EVENT_WRITE' => 'swoole/constants.stub', 'SWOOLE_EXIT_IN_COROUTINE' => 'swoole/constants.stub', 'SWOOLE_EXIT_IN_SERVER' => 'swoole/constants.stub', 'SWOOLE_EXTRA_VERSION' => 'swoole/constants.stub', 'SWOOLE_FILELOCK' => 'swoole/constants.stub', 'SWOOLE_HAVE_BROTLI' => 'swoole/constants.stub', 'SWOOLE_HAVE_COMPRESSION' => 'swoole/constants.stub', 'SWOOLE_HAVE_ZLIB' => 'swoole/constants.stub', 'SWOOLE_HOOK_ALL' => 'swoole/constants.stub', 'SWOOLE_HOOK_BLOCKING_FUNCTION' => 'swoole/constants.stub', 'SWOOLE_HOOK_CURL' => 'swoole/constants.stub', 'SWOOLE_HOOK_FILE' => 'swoole/constants.stub', 'SWOOLE_HOOK_NATIVE_CURL' => 'swoole/constants.stub', 'SWOOLE_HOOK_PROC' => 'swoole/constants.stub', 'SWOOLE_HOOK_SLEEP' => 'swoole/constants.stub', 'SWOOLE_HOOK_SOCKETS' => 'swoole/constants.stub', 'SWOOLE_HOOK_SSL' => 'swoole/constants.stub', 'SWOOLE_HOOK_STDIO' => 'swoole/constants.stub', 'SWOOLE_HOOK_STREAM_FUNCTION' => 'swoole/constants.stub', 'SWOOLE_HOOK_STREAM_SELECT' => 'swoole/constants.stub', 'SWOOLE_HOOK_TCP' => 'swoole/constants.stub', 'SWOOLE_HOOK_TLS' => 'swoole/constants.stub', 'SWOOLE_HOOK_UDG' => 'swoole/constants.stub', 'SWOOLE_HOOK_UDP' => 'swoole/constants.stub', 'SWOOLE_HOOK_UNIX' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_CANCEL' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_COMPRESSION_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_CONNECT_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_ENHANCE_YOUR_CALM' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_FLOW_CONTROL_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_FRAME_SIZE_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_INADEQUATE_SECURITY' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_INTERNAL_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_NO_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_PROTOCOL_ERROR' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_REFUSED_STREAM' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_SETTINGS_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_HTTP2_ERROR_STREAM_CLOSED' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_CONTINUATION' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_DATA' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_GOAWAY' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_HEADERS' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_PING' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_PRIORITY' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_PUSH_PROMISE' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_RST_STREAM' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_SETTINGS' => 'swoole/constants.stub', 'SWOOLE_HTTP2_TYPE_WINDOW_UPDATE' => 'swoole/constants.stub', 'SWOOLE_HTTP_CLIENT_ESTATUS_CONNECT_FAILED' => 'swoole/constants.stub', 'SWOOLE_HTTP_CLIENT_ESTATUS_REQUEST_TIMEOUT' => 'swoole/constants.stub', 'SWOOLE_HTTP_CLIENT_ESTATUS_SEND_FAILED' => 'swoole/constants.stub', 'SWOOLE_HTTP_CLIENT_ESTATUS_SERVER_RESET' => 'swoole/constants.stub', 'SWOOLE_IOV_MAX' => 'swoole/constants.stub', 'SWOOLE_IPC_MSGQUEUE' => 'swoole/constants.stub', 'SWOOLE_IPC_NONE' => 'swoole/constants.stub', 'SWOOLE_IPC_PREEMPTIVE' => 'swoole/constants.stub', 'SWOOLE_IPC_SOCKET' => 'swoole/constants.stub', 'SWOOLE_IPC_UNIXSOCK' => 'swoole/constants.stub', 'SWOOLE_IPC_UNSOCK' => 'swoole/constants.stub', 'SWOOLE_KEEP' => 'swoole/constants.stub', 'SWOOLE_LOG_DEBUG' => 'swoole/constants.stub', 'SWOOLE_LOG_ERROR' => 'swoole/constants.stub', 'SWOOLE_LOG_INFO' => 'swoole/constants.stub', 'SWOOLE_LOG_NONE' => 'swoole/constants.stub', 'SWOOLE_LOG_NOTICE' => 'swoole/constants.stub', 'SWOOLE_LOG_ROTATION_DAILY' => 'swoole/constants.stub', 'SWOOLE_LOG_ROTATION_EVERY_MINUTE' => 'swoole/constants.stub', 'SWOOLE_LOG_ROTATION_HOURLY' => 'swoole/constants.stub', 'SWOOLE_LOG_ROTATION_MONTHLY' => 'swoole/constants.stub', 'SWOOLE_LOG_ROTATION_SINGLE' => 'swoole/constants.stub', 'SWOOLE_LOG_TRACE' => 'swoole/constants.stub', 'SWOOLE_LOG_WARNING' => 'swoole/constants.stub', 'SWOOLE_MAJOR_VERSION' => 'swoole/constants.stub', 'SWOOLE_MINOR_VERSION' => 'swoole/constants.stub', 'SWOOLE_MUTEX' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_CANT_FIND_CHARSET' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_COMMANDS_OUT_OF_SYNC' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_CONNECTION_ERROR' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_INVALID_BUFFER_USE' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_INVALID_PARAMETER_NO' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_MALFORMED_PACKET' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_NOT_IMPLEMENTED' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_NO_PREPARE_STMT' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_OUT_OF_MEMORY' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_PARAMS_NOT_BOUND' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_SERVER_GONE_ERROR' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_SERVER_LOST' => 'swoole/constants.stub', 'SWOOLE_MYSQLND_CR_UNKNOWN_ERROR' => 'swoole/constants.stub', 'SWOOLE_PROCESS' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_ALLOC' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_CLOSED' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_EOF' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_IO' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_NOAUTH' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_OOM' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_OTHER' => 'swoole/constants.stub', 'SWOOLE_REDIS_ERR_PROTOCOL' => 'swoole/constants.stub', 'SWOOLE_REDIS_MODE_MULTI' => 'swoole/constants.stub', 'SWOOLE_REDIS_MODE_PIPELINE' => 'swoole/constants.stub', 'SWOOLE_REDIS_TYPE_HASH' => 'swoole/constants.stub', 'SWOOLE_REDIS_TYPE_LIST' => 'swoole/constants.stub', 'SWOOLE_REDIS_TYPE_NOT_FOUND' => 'swoole/constants.stub', 'SWOOLE_REDIS_TYPE_SET' => 'swoole/constants.stub', 'SWOOLE_REDIS_TYPE_STRING' => 'swoole/constants.stub', 'SWOOLE_REDIS_TYPE_ZSET' => 'swoole/constants.stub', 'SWOOLE_RELEASE_VERSION' => 'swoole/constants.stub', 'SWOOLE_RWLOCK' => 'swoole/constants.stub', 'SWOOLE_SEM' => 'swoole/constants.stub', 'SWOOLE_SERVER_COMMAND_EVENT_WORKER' => 'swoole/constants.stub', 'SWOOLE_SERVER_COMMAND_MANAGER' => 'swoole/constants.stub', 'SWOOLE_SERVER_COMMAND_MASTER' => 'swoole/constants.stub', 'SWOOLE_SERVER_COMMAND_REACTOR_THREAD' => 'swoole/constants.stub', 'SWOOLE_SERVER_COMMAND_TASK_WORKER' => 'swoole/constants.stub', 'SWOOLE_SERVER_COMMAND_WORKER' => 'swoole/constants.stub', 'SWOOLE_SOCK_ASYNC' => 'swoole/constants.stub', 'SWOOLE_SOCK_SYNC' => 'swoole/constants.stub', 'SWOOLE_SOCK_TCP' => 'swoole/constants.stub', 'SWOOLE_SOCK_TCP6' => 'swoole/constants.stub', 'SWOOLE_SOCK_UDP' => 'swoole/constants.stub', 'SWOOLE_SOCK_UDP6' => 'swoole/constants.stub', 'SWOOLE_SOCK_UNIX_DGRAM' => 'swoole/constants.stub', 'SWOOLE_SOCK_UNIX_STREAM' => 'swoole/constants.stub', 'SWOOLE_SPINLOCK' => 'swoole/constants.stub', 'SWOOLE_SSL' => 'swoole/constants.stub', 'SWOOLE_SSL_DTLS' => 'swoole/constants.stub', 'SWOOLE_SSL_SSLv2' => 'swoole/constants.stub', 'SWOOLE_SSL_TLSv1' => 'swoole/constants.stub', 'SWOOLE_SSL_TLSv1_1' => 'swoole/constants.stub', 'SWOOLE_SSL_TLSv1_2' => 'swoole/constants.stub', 'SWOOLE_SSL_TLSv1_3' => 'swoole/constants.stub', 'SWOOLE_SSLv23_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_SSLv23_METHOD' => 'swoole/constants.stub', 'SWOOLE_SSLv23_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_SSLv3_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_SSLv3_METHOD' => 'swoole/constants.stub', 'SWOOLE_SSLv3_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_STRERROR_DNS' => 'swoole/constants.stub', 'SWOOLE_STRERROR_GAI' => 'swoole/constants.stub', 'SWOOLE_STRERROR_SWOOLE' => 'swoole/constants.stub', 'SWOOLE_STRERROR_SYSTEM' => 'swoole/constants.stub', 'SWOOLE_SYNC' => 'swoole/constants.stub', 'SWOOLE_TASK_CALLBACK' => 'swoole/constants.stub', 'SWOOLE_TASK_COROUTINE' => 'swoole/constants.stub', 'SWOOLE_TASK_NONBLOCK' => 'swoole/constants.stub', 'SWOOLE_TASK_NOREPLY' => 'swoole/constants.stub', 'SWOOLE_TASK_PEEK' => 'swoole/constants.stub', 'SWOOLE_TASK_SERIALIZE' => 'swoole/constants.stub', 'SWOOLE_TASK_TMPFILE' => 'swoole/constants.stub', 'SWOOLE_TASK_WAITALL' => 'swoole/constants.stub', 'SWOOLE_TCP' => 'swoole/constants.stub', 'SWOOLE_TCP6' => 'swoole/constants.stub', 'SWOOLE_TIMER_MAX_MS' => 'swoole/constants.stub', 'SWOOLE_TIMER_MAX_SEC' => 'swoole/constants.stub', 'SWOOLE_TIMER_MIN_MS' => 'swoole/constants.stub', 'SWOOLE_TIMER_MIN_SEC' => 'swoole/constants.stub', 'SWOOLE_TLS_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLS_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLS_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_1_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_1_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_1_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_2_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_2_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_2_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_CLIENT_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_METHOD' => 'swoole/constants.stub', 'SWOOLE_TLSv1_SERVER_METHOD' => 'swoole/constants.stub', 'SWOOLE_TRACE_AIO' => 'swoole/constants.stub', 'SWOOLE_TRACE_ALL' => 'swoole/constants.stub', 'SWOOLE_TRACE_BUFFER' => 'swoole/constants.stub', 'SWOOLE_TRACE_CARES' => 'swoole/constants.stub', 'SWOOLE_TRACE_CHANNEL' => 'swoole/constants.stub', 'SWOOLE_TRACE_CLIENT' => 'swoole/constants.stub', 'SWOOLE_TRACE_CLOSE' => 'swoole/constants.stub', 'SWOOLE_TRACE_CONN' => 'swoole/constants.stub', 'SWOOLE_TRACE_CONTEXT' => 'swoole/constants.stub', 'SWOOLE_TRACE_COROUTINE' => 'swoole/constants.stub', 'SWOOLE_TRACE_CO_CURL' => 'swoole/constants.stub', 'SWOOLE_TRACE_CO_HTTP_SERVER' => 'swoole/constants.stub', 'SWOOLE_TRACE_EOF_PROTOCOL' => 'swoole/constants.stub', 'SWOOLE_TRACE_EVENT' => 'swoole/constants.stub', 'SWOOLE_TRACE_HTTP' => 'swoole/constants.stub', 'SWOOLE_TRACE_HTTP2' => 'swoole/constants.stub', 'SWOOLE_TRACE_HTTP_CLIENT' => 'swoole/constants.stub', 'SWOOLE_TRACE_LENGTH_PROTOCOL' => 'swoole/constants.stub', 'SWOOLE_TRACE_MEMORY' => 'swoole/constants.stub', 'SWOOLE_TRACE_MYSQL_CLIENT' => 'swoole/constants.stub', 'SWOOLE_TRACE_NORMAL' => 'swoole/constants.stub', 'SWOOLE_TRACE_PHP' => 'swoole/constants.stub', 'SWOOLE_TRACE_REACTOR' => 'swoole/constants.stub', 'SWOOLE_TRACE_REDIS_CLIENT' => 'swoole/constants.stub', 'SWOOLE_TRACE_SERVER' => 'swoole/constants.stub', 'SWOOLE_TRACE_SOCKET' => 'swoole/constants.stub', 'SWOOLE_TRACE_SSL' => 'swoole/constants.stub', 'SWOOLE_TRACE_TABLE' => 'swoole/constants.stub', 'SWOOLE_TRACE_TIMER' => 'swoole/constants.stub', 'SWOOLE_TRACE_WEBSOCKET' => 'swoole/constants.stub', 'SWOOLE_TRACE_WORKER' => 'swoole/constants.stub', 'SWOOLE_UDP' => 'swoole/constants.stub', 'SWOOLE_UDP6' => 'swoole/constants.stub', 'SWOOLE_UNIX_DGRAM' => 'swoole/constants.stub', 'SWOOLE_UNIX_STREAM' => 'swoole/constants.stub', 'SWOOLE_USE_HTTP2' => 'swoole/constants.stub', 'SWOOLE_USE_SHORTNAME' => 'swoole/constants.stub', 'SWOOLE_VERSION' => 'swoole/constants.stub', 'SWOOLE_VERSION_ID' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_ABNORMAL' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_DATA_ERROR' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_EXTENSION_MISSING' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_GOING_AWAY' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_MESSAGE_ERROR' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_MESSAGE_TOO_BIG' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_NORMAL' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_POLICY_ERROR' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_PROTOCOL_ERROR' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_SERVER_ERROR' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_STATUS_ERROR' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_CLOSE_TLS' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_FLAG_COMPRESS' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_FLAG_FIN' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_FLAG_MASK' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_FLAG_RSV1' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_FLAG_RSV2' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_FLAG_RSV3' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_OPCODE_BINARY' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_OPCODE_CLOSE' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_OPCODE_CONTINUATION' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_OPCODE_PING' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_OPCODE_PONG' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_OPCODE_TEXT' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_STATUS_ACTIVE' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_STATUS_CLOSING' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_STATUS_CONNECTION' => 'swoole/constants.stub', 'SWOOLE_WEBSOCKET_STATUS_HANDSHAKE' => 'swoole/constants.stub', 'SWOOLE_WORKER_BUSY' => 'swoole/constants.stub', 'SWOOLE_WORKER_EXIT' => 'swoole/constants.stub', 'SWOOLE_WORKER_IDLE' => 'swoole/constants.stub', 'S_ALL' => 'Core/Core_d.stub', 'S_EXECUTOR' => 'Core/Core_d.stub', 'S_FILES' => 'Core/Core_d.stub', 'S_INCLUDE' => 'Core/Core_d.stub', 'S_INTERNAL' => 'Core/Core_d.stub', 'S_IRGRP' => 'dio/dio_d.stub', 'S_IROTH' => 'dio/dio_d.stub', 'S_IRUSR' => 'dio/dio_d.stub', 'S_IRWXG' => 'dio/dio_d.stub', 'S_IRWXO' => 'dio/dio_d.stub', 'S_IRWXU' => 'dio/dio_d.stub', 'S_IWGRP' => 'dio/dio_d.stub', 'S_IWOTH' => 'dio/dio_d.stub', 'S_IWUSR' => 'dio/dio_d.stub', 'S_IXGRP' => 'dio/dio_d.stub', 'S_IXOTH' => 'dio/dio_d.stub', 'S_IXUSR' => 'dio/dio_d.stub', 'S_MAIL' => 'Core/Core_d.stub', 'S_MEMORY' => 'Core/Core_d.stub', 'S_MISC' => 'Core/Core_d.stub', 'S_SESSION' => 'Core/Core_d.stub', 'S_SQL' => 'Core/Core_d.stub', 'S_VARS' => 'Core/Core_d.stub', 'ScrollBar' => 'winbinder/winbinder.stub', 'Slider' => 'winbinder/winbinder.stub', 'Sodium\\CRYPTO_AEAD_AES256GCM_ABYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_AES256GCM_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_AES256GCM_NPUBBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_AES256GCM_NSECBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_CHACHA20POLY1305_ABYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AUTH_BYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_AUTH_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_KEYPAIRBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_MACBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_NONCEBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_PUBLICKEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_SEALBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_SECRETKEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_BOX_SEEDBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_GENERICHASH_BYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_GENERICHASH_BYTES_MAX' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_GENERICHASH_BYTES_MIN' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_GENERICHASH_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_GENERICHASH_KEYBYTES_MAX' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_GENERICHASH_KEYBYTES_MIN' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_KX_BYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_KX_PUBLICKEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_KX_SECRETKEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_MEMLIMIT_MODERATE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_MEMLIMIT_SENSITIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_OPSLIMIT_MODERATE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_OPSLIMIT_SENSITIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SCALARMULT_BYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SCALARMULT_SCALARBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SECRETBOX_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SECRETBOX_MACBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SECRETBOX_NONCEBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SHORTHASH_BYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SHORTHASH_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SIGN_BYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SIGN_KEYPAIRBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SIGN_PUBLICKEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SIGN_SECRETKEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_SIGN_SEEDBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_STREAM_KEYBYTES' => 'libsodium/libsodium.stub', 'Sodium\\CRYPTO_STREAM_NONCEBYTES' => 'libsodium/libsodium.stub', 'Spinner' => 'winbinder/winbinder.stub', 'StatusBar' => 'winbinder/winbinder.stub', 'TCP_CONGESTION' => 'sockets/sockets.stub', 'TCP_DEFER_ACCEPT' => 'sockets/sockets.stub', 'TCP_KEEPCNT' => 'sockets/sockets.stub', 'TCP_KEEPIDLE' => 'sockets/sockets.stub', 'TCP_KEEPINTVL' => 'sockets/sockets.stub', 'TCP_NODELAY' => 'sockets/sockets.stub', 'TCP_NOTSENT_LOWAT' => 'sockets/sockets.stub', 'TCP_QUICKACK' => 'sockets/sockets.stub', 'TCP_REPAIR' => 'sockets/sockets.stub', 'TCP_SYNCNT' => 'sockets/sockets.stub', 'THOUSANDS_SEP' => 'standard/standard_defines.stub', 'THOUSEP' => 'standard/standard_defines.stub', 'TIDY_NODETYPE_ASP' => 'tidy/tidy.stub', 'TIDY_NODETYPE_CDATA' => 'tidy/tidy.stub', 'TIDY_NODETYPE_COMMENT' => 'tidy/tidy.stub', 'TIDY_NODETYPE_DOCTYPE' => 'tidy/tidy.stub', 'TIDY_NODETYPE_END' => 'tidy/tidy.stub', 'TIDY_NODETYPE_JSTE' => 'tidy/tidy.stub', 'TIDY_NODETYPE_PHP' => 'tidy/tidy.stub', 'TIDY_NODETYPE_PROCINS' => 'tidy/tidy.stub', 'TIDY_NODETYPE_ROOT' => 'tidy/tidy.stub', 'TIDY_NODETYPE_SECTION' => 'tidy/tidy.stub', 'TIDY_NODETYPE_START' => 'tidy/tidy.stub', 'TIDY_NODETYPE_STARTEND' => 'tidy/tidy.stub', 'TIDY_NODETYPE_TEXT' => 'tidy/tidy.stub', 'TIDY_NODETYPE_XMLDECL' => 'tidy/tidy.stub', 'TIDY_TAG_A' => 'tidy/tidy.stub', 'TIDY_TAG_ABBR' => 'tidy/tidy.stub', 'TIDY_TAG_ACRONYM' => 'tidy/tidy.stub', 'TIDY_TAG_ADDRESS' => 'tidy/tidy.stub', 'TIDY_TAG_ALIGN' => 'tidy/tidy.stub', 'TIDY_TAG_APPLET' => 'tidy/tidy.stub', 'TIDY_TAG_AREA' => 'tidy/tidy.stub', 'TIDY_TAG_ARTICLE' => 'tidy/tidy.stub', 'TIDY_TAG_ASIDE' => 'tidy/tidy.stub', 'TIDY_TAG_AUDIO' => 'tidy/tidy.stub', 'TIDY_TAG_B' => 'tidy/tidy.stub', 'TIDY_TAG_BASE' => 'tidy/tidy.stub', 'TIDY_TAG_BASEFONT' => 'tidy/tidy.stub', 'TIDY_TAG_BDI' => 'tidy/tidy.stub', 'TIDY_TAG_BDO' => 'tidy/tidy.stub', 'TIDY_TAG_BGSOUND' => 'tidy/tidy.stub', 'TIDY_TAG_BIG' => 'tidy/tidy.stub', 'TIDY_TAG_BLINK' => 'tidy/tidy.stub', 'TIDY_TAG_BLOCKQUOTE' => 'tidy/tidy.stub', 'TIDY_TAG_BODY' => 'tidy/tidy.stub', 'TIDY_TAG_BR' => 'tidy/tidy.stub', 'TIDY_TAG_BUTTON' => 'tidy/tidy.stub', 'TIDY_TAG_CANVAS' => 'tidy/tidy.stub', 'TIDY_TAG_CAPTION' => 'tidy/tidy.stub', 'TIDY_TAG_CENTER' => 'tidy/tidy.stub', 'TIDY_TAG_CITE' => 'tidy/tidy.stub', 'TIDY_TAG_CODE' => 'tidy/tidy.stub', 'TIDY_TAG_COL' => 'tidy/tidy.stub', 'TIDY_TAG_COLGROUP' => 'tidy/tidy.stub', 'TIDY_TAG_COMMAND' => 'tidy/tidy.stub', 'TIDY_TAG_COMMENT' => 'tidy/tidy.stub', 'TIDY_TAG_DATALIST' => 'tidy/tidy.stub', 'TIDY_TAG_DD' => 'tidy/tidy.stub', 'TIDY_TAG_DEL' => 'tidy/tidy.stub', 'TIDY_TAG_DETAILS' => 'tidy/tidy.stub', 'TIDY_TAG_DFN' => 'tidy/tidy.stub', 'TIDY_TAG_DIALOG' => 'tidy/tidy.stub', 'TIDY_TAG_DIR' => 'tidy/tidy.stub', 'TIDY_TAG_DIV' => 'tidy/tidy.stub', 'TIDY_TAG_DL' => 'tidy/tidy.stub', 'TIDY_TAG_DT' => 'tidy/tidy.stub', 'TIDY_TAG_EM' => 'tidy/tidy.stub', 'TIDY_TAG_EMBED' => 'tidy/tidy.stub', 'TIDY_TAG_FIELDSET' => 'tidy/tidy.stub', 'TIDY_TAG_FIGCAPTION' => 'tidy/tidy.stub', 'TIDY_TAG_FIGURE' => 'tidy/tidy.stub', 'TIDY_TAG_FONT' => 'tidy/tidy.stub', 'TIDY_TAG_FOOTER' => 'tidy/tidy.stub', 'TIDY_TAG_FORM' => 'tidy/tidy.stub', 'TIDY_TAG_FRAME' => 'tidy/tidy.stub', 'TIDY_TAG_FRAMESET' => 'tidy/tidy.stub', 'TIDY_TAG_H1' => 'tidy/tidy.stub', 'TIDY_TAG_H2' => 'tidy/tidy.stub', 'TIDY_TAG_H3' => 'tidy/tidy.stub', 'TIDY_TAG_H4' => 'tidy/tidy.stub', 'TIDY_TAG_H5' => 'tidy/tidy.stub', 'TIDY_TAG_H6' => 'tidy/tidy.stub', 'TIDY_TAG_HEAD' => 'tidy/tidy.stub', 'TIDY_TAG_HEADER' => 'tidy/tidy.stub', 'TIDY_TAG_HGROUP' => 'tidy/tidy.stub', 'TIDY_TAG_HR' => 'tidy/tidy.stub', 'TIDY_TAG_HTML' => 'tidy/tidy.stub', 'TIDY_TAG_I' => 'tidy/tidy.stub', 'TIDY_TAG_IFRAME' => 'tidy/tidy.stub', 'TIDY_TAG_ILAYER' => 'tidy/tidy.stub', 'TIDY_TAG_IMG' => 'tidy/tidy.stub', 'TIDY_TAG_INPUT' => 'tidy/tidy.stub', 'TIDY_TAG_INS' => 'tidy/tidy.stub', 'TIDY_TAG_ISINDEX' => 'tidy/tidy.stub', 'TIDY_TAG_KBD' => 'tidy/tidy.stub', 'TIDY_TAG_KEYGEN' => 'tidy/tidy.stub', 'TIDY_TAG_LABEL' => 'tidy/tidy.stub', 'TIDY_TAG_LAYER' => 'tidy/tidy.stub', 'TIDY_TAG_LEGEND' => 'tidy/tidy.stub', 'TIDY_TAG_LI' => 'tidy/tidy.stub', 'TIDY_TAG_LINK' => 'tidy/tidy.stub', 'TIDY_TAG_LISTING' => 'tidy/tidy.stub', 'TIDY_TAG_MAIN' => 'tidy/tidy.stub', 'TIDY_TAG_MAP' => 'tidy/tidy.stub', 'TIDY_TAG_MARK' => 'tidy/tidy.stub', 'TIDY_TAG_MARQUEE' => 'tidy/tidy.stub', 'TIDY_TAG_MENU' => 'tidy/tidy.stub', 'TIDY_TAG_MENUITEM' => 'tidy/tidy.stub', 'TIDY_TAG_META' => 'tidy/tidy.stub', 'TIDY_TAG_METER' => 'tidy/tidy.stub', 'TIDY_TAG_MULTICOL' => 'tidy/tidy.stub', 'TIDY_TAG_NAV' => 'tidy/tidy.stub', 'TIDY_TAG_NOBR' => 'tidy/tidy.stub', 'TIDY_TAG_NOEMBED' => 'tidy/tidy.stub', 'TIDY_TAG_NOFRAMES' => 'tidy/tidy.stub', 'TIDY_TAG_NOLAYER' => 'tidy/tidy.stub', 'TIDY_TAG_NOSAVE' => 'tidy/tidy.stub', 'TIDY_TAG_NOSCRIPT' => 'tidy/tidy.stub', 'TIDY_TAG_OBJECT' => 'tidy/tidy.stub', 'TIDY_TAG_OL' => 'tidy/tidy.stub', 'TIDY_TAG_OPTGROUP' => 'tidy/tidy.stub', 'TIDY_TAG_OPTION' => 'tidy/tidy.stub', 'TIDY_TAG_OUTPUT' => 'tidy/tidy.stub', 'TIDY_TAG_P' => 'tidy/tidy.stub', 'TIDY_TAG_PARAM' => 'tidy/tidy.stub', 'TIDY_TAG_PLAINTEXT' => 'tidy/tidy.stub', 'TIDY_TAG_PRE' => 'tidy/tidy.stub', 'TIDY_TAG_PROGRESS' => 'tidy/tidy.stub', 'TIDY_TAG_Q' => 'tidy/tidy.stub', 'TIDY_TAG_RB' => 'tidy/tidy.stub', 'TIDY_TAG_RBC' => 'tidy/tidy.stub', 'TIDY_TAG_RP' => 'tidy/tidy.stub', 'TIDY_TAG_RT' => 'tidy/tidy.stub', 'TIDY_TAG_RTC' => 'tidy/tidy.stub', 'TIDY_TAG_RUBY' => 'tidy/tidy.stub', 'TIDY_TAG_S' => 'tidy/tidy.stub', 'TIDY_TAG_SAMP' => 'tidy/tidy.stub', 'TIDY_TAG_SCRIPT' => 'tidy/tidy.stub', 'TIDY_TAG_SECTION' => 'tidy/tidy.stub', 'TIDY_TAG_SELECT' => 'tidy/tidy.stub', 'TIDY_TAG_SERVER' => 'tidy/tidy.stub', 'TIDY_TAG_SERVLET' => 'tidy/tidy.stub', 'TIDY_TAG_SMALL' => 'tidy/tidy.stub', 'TIDY_TAG_SOURCE' => 'tidy/tidy.stub', 'TIDY_TAG_SPACER' => 'tidy/tidy.stub', 'TIDY_TAG_SPAN' => 'tidy/tidy.stub', 'TIDY_TAG_STRIKE' => 'tidy/tidy.stub', 'TIDY_TAG_STRONG' => 'tidy/tidy.stub', 'TIDY_TAG_STYLE' => 'tidy/tidy.stub', 'TIDY_TAG_SUB' => 'tidy/tidy.stub', 'TIDY_TAG_SUMMARY' => 'tidy/tidy.stub', 'TIDY_TAG_SUP' => 'tidy/tidy.stub', 'TIDY_TAG_TABLE' => 'tidy/tidy.stub', 'TIDY_TAG_TBODY' => 'tidy/tidy.stub', 'TIDY_TAG_TD' => 'tidy/tidy.stub', 'TIDY_TAG_TEMPLATE' => 'tidy/tidy.stub', 'TIDY_TAG_TEXTAREA' => 'tidy/tidy.stub', 'TIDY_TAG_TFOOT' => 'tidy/tidy.stub', 'TIDY_TAG_TH' => 'tidy/tidy.stub', 'TIDY_TAG_THEAD' => 'tidy/tidy.stub', 'TIDY_TAG_TIME' => 'tidy/tidy.stub', 'TIDY_TAG_TITLE' => 'tidy/tidy.stub', 'TIDY_TAG_TR' => 'tidy/tidy.stub', 'TIDY_TAG_TRACK' => 'tidy/tidy.stub', 'TIDY_TAG_TT' => 'tidy/tidy.stub', 'TIDY_TAG_U' => 'tidy/tidy.stub', 'TIDY_TAG_UL' => 'tidy/tidy.stub', 'TIDY_TAG_UNKNOWN' => 'tidy/tidy.stub', 'TIDY_TAG_VAR' => 'tidy/tidy.stub', 'TIDY_TAG_VIDEO' => 'tidy/tidy.stub', 'TIDY_TAG_WBR' => 'tidy/tidy.stub', 'TIDY_TAG_XMP' => 'tidy/tidy.stub', 'TOKEN_PARSE' => 'tokenizer/tokenizer.stub', 'TRAP_BRKPT' => 'pcntl/pcntl.stub', 'TRAP_TRACE' => 'pcntl/pcntl.stub', 'TYPEAPPLICATION' => 'imap/imap.stub', 'TYPEAUDIO' => 'imap/imap.stub', 'TYPEIMAGE' => 'imap/imap.stub', 'TYPEMESSAGE' => 'imap/imap.stub', 'TYPEMODEL' => 'imap/imap.stub', 'TYPEMULTIPART' => 'imap/imap.stub', 'TYPEOTHER' => 'imap/imap.stub', 'TYPETEXT' => 'imap/imap.stub', 'TYPEVIDEO' => 'imap/imap.stub', 'T_ABSTRACT' => 'tokenizer/tokenizer.stub', 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG' => 'tokenizer/tokenizer.stub', 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG' => 'tokenizer/tokenizer.stub', 'T_AND_EQUAL' => 'tokenizer/tokenizer.stub', 'T_ARRAY' => 'tokenizer/tokenizer.stub', 'T_ARRAY_CAST' => 'tokenizer/tokenizer.stub', 'T_AS' => 'tokenizer/tokenizer.stub', 'T_ATTRIBUTE' => 'tokenizer/tokenizer.stub', 'T_BAD_CHARACTER' => 'tokenizer/tokenizer.stub', 'T_BOOLEAN_AND' => 'tokenizer/tokenizer.stub', 'T_BOOLEAN_OR' => 'tokenizer/tokenizer.stub', 'T_BOOL_CAST' => 'tokenizer/tokenizer.stub', 'T_BREAK' => 'tokenizer/tokenizer.stub', 'T_CALLABLE' => 'tokenizer/tokenizer.stub', 'T_CASE' => 'tokenizer/tokenizer.stub', 'T_CATCH' => 'tokenizer/tokenizer.stub', 'T_CHARACTER' => 'tokenizer/tokenizer.stub', 'T_CLASS' => 'tokenizer/tokenizer.stub', 'T_CLASS_C' => 'tokenizer/tokenizer.stub', 'T_CLONE' => 'tokenizer/tokenizer.stub', 'T_CLOSE_TAG' => 'tokenizer/tokenizer.stub', 'T_COALESCE' => 'tokenizer/tokenizer.stub', 'T_COALESCE_EQUAL' => 'tokenizer/tokenizer.stub', 'T_COMMENT' => 'tokenizer/tokenizer.stub', 'T_CONCAT_EQUAL' => 'tokenizer/tokenizer.stub', 'T_CONST' => 'tokenizer/tokenizer.stub', 'T_CONSTANT_ENCAPSED_STRING' => 'tokenizer/tokenizer.stub', 'T_CONTINUE' => 'tokenizer/tokenizer.stub', 'T_CURLY_OPEN' => 'tokenizer/tokenizer.stub', 'T_DEC' => 'tokenizer/tokenizer.stub', 'T_DECLARE' => 'tokenizer/tokenizer.stub', 'T_DEFAULT' => 'tokenizer/tokenizer.stub', 'T_DIR' => 'tokenizer/tokenizer.stub', 'T_DIV_EQUAL' => 'tokenizer/tokenizer.stub', 'T_DNUMBER' => 'tokenizer/tokenizer.stub', 'T_DO' => 'tokenizer/tokenizer.stub', 'T_DOC_COMMENT' => 'tokenizer/tokenizer.stub', 'T_DOLLAR_OPEN_CURLY_BRACES' => 'tokenizer/tokenizer.stub', 'T_DOUBLE_ARROW' => 'tokenizer/tokenizer.stub', 'T_DOUBLE_CAST' => 'tokenizer/tokenizer.stub', 'T_DOUBLE_COLON' => 'tokenizer/tokenizer.stub', 'T_ECHO' => 'tokenizer/tokenizer.stub', 'T_ELLIPSIS' => 'tokenizer/tokenizer.stub', 'T_ELSE' => 'tokenizer/tokenizer.stub', 'T_ELSEIF' => 'tokenizer/tokenizer.stub', 'T_EMPTY' => 'tokenizer/tokenizer.stub', 'T_ENCAPSED_AND_WHITESPACE' => 'tokenizer/tokenizer.stub', 'T_ENDDECLARE' => 'tokenizer/tokenizer.stub', 'T_ENDFOR' => 'tokenizer/tokenizer.stub', 'T_ENDFOREACH' => 'tokenizer/tokenizer.stub', 'T_ENDIF' => 'tokenizer/tokenizer.stub', 'T_ENDSWITCH' => 'tokenizer/tokenizer.stub', 'T_ENDWHILE' => 'tokenizer/tokenizer.stub', 'T_END_HEREDOC' => 'tokenizer/tokenizer.stub', 'T_ENUM' => 'tokenizer/tokenizer.stub', 'T_EVAL' => 'tokenizer/tokenizer.stub', 'T_EXIT' => 'tokenizer/tokenizer.stub', 'T_EXTENDS' => 'tokenizer/tokenizer.stub', 'T_FILE' => 'tokenizer/tokenizer.stub', 'T_FINAL' => 'tokenizer/tokenizer.stub', 'T_FINALLY' => 'tokenizer/tokenizer.stub', 'T_FMT' => 'standard/standard_defines.stub', 'T_FMT_AMPM' => 'standard/standard_defines.stub', 'T_FN' => 'tokenizer/tokenizer.stub', 'T_FOR' => 'tokenizer/tokenizer.stub', 'T_FOREACH' => 'tokenizer/tokenizer.stub', 'T_FUNCTION' => 'tokenizer/tokenizer.stub', 'T_FUNC_C' => 'tokenizer/tokenizer.stub', 'T_GLOBAL' => 'tokenizer/tokenizer.stub', 'T_GOTO' => 'tokenizer/tokenizer.stub', 'T_HALT_COMPILER' => 'tokenizer/tokenizer.stub', 'T_IF' => 'tokenizer/tokenizer.stub', 'T_IMPLEMENTS' => 'tokenizer/tokenizer.stub', 'T_INC' => 'tokenizer/tokenizer.stub', 'T_INCLUDE' => 'tokenizer/tokenizer.stub', 'T_INCLUDE_ONCE' => 'tokenizer/tokenizer.stub', 'T_INLINE_HTML' => 'tokenizer/tokenizer.stub', 'T_INSTANCEOF' => 'tokenizer/tokenizer.stub', 'T_INSTEADOF' => 'tokenizer/tokenizer.stub', 'T_INTERFACE' => 'tokenizer/tokenizer.stub', 'T_INT_CAST' => 'tokenizer/tokenizer.stub', 'T_ISSET' => 'tokenizer/tokenizer.stub', 'T_IS_EQUAL' => 'tokenizer/tokenizer.stub', 'T_IS_GREATER_OR_EQUAL' => 'tokenizer/tokenizer.stub', 'T_IS_IDENTICAL' => 'tokenizer/tokenizer.stub', 'T_IS_NOT_EQUAL' => 'tokenizer/tokenizer.stub', 'T_IS_NOT_IDENTICAL' => 'tokenizer/tokenizer.stub', 'T_IS_SMALLER_OR_EQUAL' => 'tokenizer/tokenizer.stub', 'T_LINE' => 'tokenizer/tokenizer.stub', 'T_LIST' => 'tokenizer/tokenizer.stub', 'T_LNUMBER' => 'tokenizer/tokenizer.stub', 'T_LOGICAL_AND' => 'tokenizer/tokenizer.stub', 'T_LOGICAL_OR' => 'tokenizer/tokenizer.stub', 'T_LOGICAL_XOR' => 'tokenizer/tokenizer.stub', 'T_MATCH' => 'tokenizer/tokenizer.stub', 'T_METHOD_C' => 'tokenizer/tokenizer.stub', 'T_MINUS_EQUAL' => 'tokenizer/tokenizer.stub', 'T_MOD_EQUAL' => 'tokenizer/tokenizer.stub', 'T_MUL_EQUAL' => 'tokenizer/tokenizer.stub', 'T_NAMESPACE' => 'tokenizer/tokenizer.stub', 'T_NAME_FULLY_QUALIFIED' => 'tokenizer/tokenizer.stub', 'T_NAME_QUALIFIED' => 'tokenizer/tokenizer.stub', 'T_NAME_RELATIVE' => 'tokenizer/tokenizer.stub', 'T_NEW' => 'tokenizer/tokenizer.stub', 'T_NS_C' => 'tokenizer/tokenizer.stub', 'T_NS_SEPARATOR' => 'tokenizer/tokenizer.stub', 'T_NULLSAFE_OBJECT_OPERATOR' => 'tokenizer/tokenizer.stub', 'T_NUM_STRING' => 'tokenizer/tokenizer.stub', 'T_OBJECT_CAST' => 'tokenizer/tokenizer.stub', 'T_OBJECT_OPERATOR' => 'tokenizer/tokenizer.stub', 'T_OPEN_TAG' => 'tokenizer/tokenizer.stub', 'T_OPEN_TAG_WITH_ECHO' => 'tokenizer/tokenizer.stub', 'T_OR_EQUAL' => 'tokenizer/tokenizer.stub', 'T_PAAMAYIM_NEKUDOTAYIM' => 'tokenizer/tokenizer.stub', 'T_PLUS_EQUAL' => 'tokenizer/tokenizer.stub', 'T_POW' => 'tokenizer/tokenizer.stub', 'T_POW_EQUAL' => 'tokenizer/tokenizer.stub', 'T_PRINT' => 'tokenizer/tokenizer.stub', 'T_PRIVATE' => 'tokenizer/tokenizer.stub', 'T_PRIVATE_SET' => 'tokenizer/tokenizer.stub', 'T_PROPERTY_C' => 'tokenizer/tokenizer.stub', 'T_PROTECTED' => 'tokenizer/tokenizer.stub', 'T_PROTECTED_SET' => 'tokenizer/tokenizer.stub', 'T_PUBLIC' => 'tokenizer/tokenizer.stub', 'T_PUBLIC_SET' => 'tokenizer/tokenizer.stub', 'T_READONLY' => 'tokenizer/tokenizer.stub', 'T_REQUIRE' => 'tokenizer/tokenizer.stub', 'T_REQUIRE_ONCE' => 'tokenizer/tokenizer.stub', 'T_RETURN' => 'tokenizer/tokenizer.stub', 'T_SL' => 'tokenizer/tokenizer.stub', 'T_SL_EQUAL' => 'tokenizer/tokenizer.stub', 'T_SPACESHIP' => 'tokenizer/tokenizer.stub', 'T_SR' => 'tokenizer/tokenizer.stub', 'T_SR_EQUAL' => 'tokenizer/tokenizer.stub', 'T_START_HEREDOC' => 'tokenizer/tokenizer.stub', 'T_STATIC' => 'tokenizer/tokenizer.stub', 'T_STRING' => 'tokenizer/tokenizer.stub', 'T_STRING_CAST' => 'tokenizer/tokenizer.stub', 'T_STRING_VARNAME' => 'tokenizer/tokenizer.stub', 'T_SWITCH' => 'tokenizer/tokenizer.stub', 'T_THROW' => 'tokenizer/tokenizer.stub', 'T_TRAIT' => 'tokenizer/tokenizer.stub', 'T_TRAIT_C' => 'tokenizer/tokenizer.stub', 'T_TRY' => 'tokenizer/tokenizer.stub', 'T_UNSET' => 'tokenizer/tokenizer.stub', 'T_UNSET_CAST' => 'tokenizer/tokenizer.stub', 'T_USE' => 'tokenizer/tokenizer.stub', 'T_VAR' => 'tokenizer/tokenizer.stub', 'T_VARIABLE' => 'tokenizer/tokenizer.stub', 'T_WHILE' => 'tokenizer/tokenizer.stub', 'T_WHITESPACE' => 'tokenizer/tokenizer.stub', 'T_XOR_EQUAL' => 'tokenizer/tokenizer.stub', 'T_YIELD' => 'tokenizer/tokenizer.stub', 'T_YIELD_FROM' => 'tokenizer/tokenizer.stub', 'TabControl' => 'winbinder/winbinder.stub', 'Timer' => 'winbinder/winbinder.stub', 'ToolBar' => 'winbinder/winbinder.stub', 'ToolDialog' => 'winbinder/winbinder.stub', 'TreeView' => 'winbinder/winbinder.stub', 'ULOC_ACTUAL_LOCALE' => 'intl/intl.stub', 'ULOC_VALID_LOCALE' => 'intl/intl.stub', 'UNKNOWN_TYPE' => 'soap/soap.stub', 'UPLOAD_ERR_CANT_WRITE' => 'Core/Core_d.stub', 'UPLOAD_ERR_EXTENSION' => 'Core/Core_d.stub', 'UPLOAD_ERR_FORM_SIZE' => 'Core/Core_d.stub', 'UPLOAD_ERR_INI_SIZE' => 'Core/Core_d.stub', 'UPLOAD_ERR_NO_FILE' => 'Core/Core_d.stub', 'UPLOAD_ERR_NO_TMP_DIR' => 'Core/Core_d.stub', 'UPLOAD_ERR_OK' => 'Core/Core_d.stub', 'UPLOAD_ERR_PARTIAL' => 'Core/Core_d.stub', 'UUID_TYPE_DCE' => 'uuid/uuid_c.stub', 'UUID_TYPE_DEFAULT' => 'uuid/uuid_c.stub', 'UUID_TYPE_INVALID' => 'uuid/uuid_c.stub', 'UUID_TYPE_MD5' => 'uuid/uuid_c.stub', 'UUID_TYPE_NAME' => 'uuid/uuid_c.stub', 'UUID_TYPE_NULL' => 'uuid/uuid_c.stub', 'UUID_TYPE_RANDOM' => 'uuid/uuid_c.stub', 'UUID_TYPE_SECURITY' => 'uuid/uuid_c.stub', 'UUID_TYPE_SHA1' => 'uuid/uuid_c.stub', 'UUID_TYPE_TIME' => 'uuid/uuid_c.stub', 'UUID_VARIANT_DCE' => 'uuid/uuid_c.stub', 'UUID_VARIANT_MICROSOFT' => 'uuid/uuid_c.stub', 'UUID_VARIANT_NCS' => 'uuid/uuid_c.stub', 'UUID_VARIANT_OTHER' => 'uuid/uuid_c.stub', 'U_AMBIGUOUS_ALIAS_WARNING' => 'intl/intl.stub', 'U_BAD_VARIABLE_DEFINITION' => 'intl/intl.stub', 'U_BRK_ASSIGN_ERROR' => 'intl/intl.stub', 'U_BRK_ERROR_LIMIT' => 'intl/intl.stub', 'U_BRK_ERROR_START' => 'intl/intl.stub', 'U_BRK_HEX_DIGITS_EXPECTED' => 'intl/intl.stub', 'U_BRK_INIT_ERROR' => 'intl/intl.stub', 'U_BRK_INTERNAL_ERROR' => 'intl/intl.stub', 'U_BRK_MALFORMED_RULE_TAG' => 'intl/intl.stub', 'U_BRK_MISMATCHED_PAREN' => 'intl/intl.stub', 'U_BRK_NEW_LINE_IN_QUOTED_STRING' => 'intl/intl.stub', 'U_BRK_RULE_EMPTY_SET' => 'intl/intl.stub', 'U_BRK_RULE_SYNTAX' => 'intl/intl.stub', 'U_BRK_SEMICOLON_EXPECTED' => 'intl/intl.stub', 'U_BRK_UNCLOSED_SET' => 'intl/intl.stub', 'U_BRK_UNDEFINED_VARIABLE' => 'intl/intl.stub', 'U_BRK_UNRECOGNIZED_OPTION' => 'intl/intl.stub', 'U_BRK_VARIABLE_REDFINITION' => 'intl/intl.stub', 'U_BUFFER_OVERFLOW_ERROR' => 'intl/intl.stub', 'U_CE_NOT_FOUND_ERROR' => 'intl/intl.stub', 'U_COLLATOR_VERSION_MISMATCH' => 'intl/intl.stub', 'U_DIFFERENT_UCA_VERSION' => 'intl/intl.stub', 'U_ENUM_OUT_OF_SYNC_ERROR' => 'intl/intl.stub', 'U_ERROR_LIMIT' => 'intl/intl.stub', 'U_ERROR_WARNING_LIMIT' => 'intl/intl.stub', 'U_ERROR_WARNING_START' => 'intl/intl.stub', 'U_FILE_ACCESS_ERROR' => 'intl/intl.stub', 'U_FMT_PARSE_ERROR_LIMIT' => 'intl/intl.stub', 'U_FMT_PARSE_ERROR_START' => 'intl/intl.stub', 'U_IDNA_ACE_PREFIX_ERROR' => 'intl/intl.stub', 'U_IDNA_CHECK_BIDI_ERROR' => 'intl/intl.stub', 'U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR' => 'intl/intl.stub', 'U_IDNA_ERROR_LIMIT' => 'intl/intl.stub', 'U_IDNA_ERROR_START' => 'intl/intl.stub', 'U_IDNA_LABEL_TOO_LONG_ERROR' => 'intl/intl.stub', 'U_IDNA_PROHIBITED_ERROR' => 'intl/intl.stub', 'U_IDNA_STD3_ASCII_RULES_ERROR' => 'intl/intl.stub', 'U_IDNA_UNASSIGNED_ERROR' => 'intl/intl.stub', 'U_IDNA_VERIFICATION_ERROR' => 'intl/intl.stub', 'U_IDNA_ZERO_LENGTH_LABEL_ERROR' => 'intl/intl.stub', 'U_ILLEGAL_ARGUMENT_ERROR' => 'intl/intl.stub', 'U_ILLEGAL_CHARACTER' => 'intl/intl.stub', 'U_ILLEGAL_CHAR_FOUND' => 'intl/intl.stub', 'U_ILLEGAL_CHAR_IN_SEGMENT' => 'intl/intl.stub', 'U_ILLEGAL_ESCAPE_SEQUENCE' => 'intl/intl.stub', 'U_ILLEGAL_PAD_POSITION' => 'intl/intl.stub', 'U_INDEX_OUTOFBOUNDS_ERROR' => 'intl/intl.stub', 'U_INTERNAL_PROGRAM_ERROR' => 'intl/intl.stub', 'U_INTERNAL_TRANSLITERATOR_ERROR' => 'intl/intl.stub', 'U_INVALID_CHAR_FOUND' => 'intl/intl.stub', 'U_INVALID_FORMAT_ERROR' => 'intl/intl.stub', 'U_INVALID_FUNCTION' => 'intl/intl.stub', 'U_INVALID_ID' => 'intl/intl.stub', 'U_INVALID_PROPERTY_PATTERN' => 'intl/intl.stub', 'U_INVALID_RBT_SYNTAX' => 'intl/intl.stub', 'U_INVALID_STATE_ERROR' => 'intl/intl.stub', 'U_INVALID_TABLE_FILE' => 'intl/intl.stub', 'U_INVALID_TABLE_FORMAT' => 'intl/intl.stub', 'U_INVARIANT_CONVERSION_ERROR' => 'intl/intl.stub', 'U_MALFORMED_EXPONENTIAL_PATTERN' => 'intl/intl.stub', 'U_MALFORMED_PRAGMA' => 'intl/intl.stub', 'U_MALFORMED_RULE' => 'intl/intl.stub', 'U_MALFORMED_SET' => 'intl/intl.stub', 'U_MALFORMED_SYMBOL_REFERENCE' => 'intl/intl.stub', 'U_MALFORMED_UNICODE_ESCAPE' => 'intl/intl.stub', 'U_MALFORMED_VARIABLE_DEFINITION' => 'intl/intl.stub', 'U_MALFORMED_VARIABLE_REFERENCE' => 'intl/intl.stub', 'U_MEMORY_ALLOCATION_ERROR' => 'intl/intl.stub', 'U_MESSAGE_PARSE_ERROR' => 'intl/intl.stub', 'U_MISMATCHED_SEGMENT_DELIMITERS' => 'intl/intl.stub', 'U_MISPLACED_ANCHOR_START' => 'intl/intl.stub', 'U_MISPLACED_COMPOUND_FILTER' => 'intl/intl.stub', 'U_MISPLACED_CURSOR_OFFSET' => 'intl/intl.stub', 'U_MISPLACED_QUANTIFIER' => 'intl/intl.stub', 'U_MISSING_OPERATOR' => 'intl/intl.stub', 'U_MISSING_RESOURCE_ERROR' => 'intl/intl.stub', 'U_MISSING_SEGMENT_CLOSE' => 'intl/intl.stub', 'U_MULTIPLE_ANTE_CONTEXTS' => 'intl/intl.stub', 'U_MULTIPLE_COMPOUND_FILTERS' => 'intl/intl.stub', 'U_MULTIPLE_CURSORS' => 'intl/intl.stub', 'U_MULTIPLE_DECIMAL_SEPARATORS' => 'intl/intl.stub', 'U_MULTIPLE_DECIMAL_SEPERATORS' => 'intl/intl.stub', 'U_MULTIPLE_EXPONENTIAL_SYMBOLS' => 'intl/intl.stub', 'U_MULTIPLE_PAD_SPECIFIERS' => 'intl/intl.stub', 'U_MULTIPLE_PERCENT_SYMBOLS' => 'intl/intl.stub', 'U_MULTIPLE_PERMILL_SYMBOLS' => 'intl/intl.stub', 'U_MULTIPLE_POST_CONTEXTS' => 'intl/intl.stub', 'U_NO_SPACE_AVAILABLE' => 'intl/intl.stub', 'U_NO_WRITE_PERMISSION' => 'intl/intl.stub', 'U_PARSE_ERROR' => 'intl/intl.stub', 'U_PARSE_ERROR_LIMIT' => 'intl/intl.stub', 'U_PARSE_ERROR_START' => 'intl/intl.stub', 'U_PATTERN_SYNTAX_ERROR' => 'intl/intl.stub', 'U_PRIMARY_TOO_LONG_ERROR' => 'intl/intl.stub', 'U_REGEX_BAD_ESCAPE_SEQUENCE' => 'intl/intl.stub', 'U_REGEX_BAD_INTERVAL' => 'intl/intl.stub', 'U_REGEX_ERROR_LIMIT' => 'intl/intl.stub', 'U_REGEX_ERROR_START' => 'intl/intl.stub', 'U_REGEX_INTERNAL_ERROR' => 'intl/intl.stub', 'U_REGEX_INVALID_BACK_REF' => 'intl/intl.stub', 'U_REGEX_INVALID_FLAG' => 'intl/intl.stub', 'U_REGEX_INVALID_STATE' => 'intl/intl.stub', 'U_REGEX_LOOK_BEHIND_LIMIT' => 'intl/intl.stub', 'U_REGEX_MAX_LT_MIN' => 'intl/intl.stub', 'U_REGEX_MISMATCHED_PAREN' => 'intl/intl.stub', 'U_REGEX_NUMBER_TOO_BIG' => 'intl/intl.stub', 'U_REGEX_PROPERTY_SYNTAX' => 'intl/intl.stub', 'U_REGEX_RULE_SYNTAX' => 'intl/intl.stub', 'U_REGEX_SET_CONTAINS_STRING' => 'intl/intl.stub', 'U_REGEX_UNIMPLEMENTED' => 'intl/intl.stub', 'U_RESOURCE_TYPE_MISMATCH' => 'intl/intl.stub', 'U_RULE_MASK_ERROR' => 'intl/intl.stub', 'U_SAFECLONE_ALLOCATED_WARNING' => 'intl/intl.stub', 'U_SORT_KEY_TOO_SHORT_WARNING' => 'intl/intl.stub', 'U_STANDARD_ERROR_LIMIT' => 'intl/intl.stub', 'U_STATE_OLD_WARNING' => 'intl/intl.stub', 'U_STATE_TOO_OLD_ERROR' => 'intl/intl.stub', 'U_STRINGPREP_CHECK_BIDI_ERROR' => 'intl/intl.stub', 'U_STRINGPREP_PROHIBITED_ERROR' => 'intl/intl.stub', 'U_STRINGPREP_UNASSIGNED_ERROR' => 'intl/intl.stub', 'U_STRING_NOT_TERMINATED_WARNING' => 'intl/intl.stub', 'U_TOO_MANY_ALIASES_ERROR' => 'intl/intl.stub', 'U_TRAILING_BACKSLASH' => 'intl/intl.stub', 'U_TRUNCATED_CHAR_FOUND' => 'intl/intl.stub', 'U_UNCLOSED_SEGMENT' => 'intl/intl.stub', 'U_UNDEFINED_SEGMENT_REFERENCE' => 'intl/intl.stub', 'U_UNDEFINED_VARIABLE' => 'intl/intl.stub', 'U_UNEXPECTED_TOKEN' => 'intl/intl.stub', 'U_UNMATCHED_BRACES' => 'intl/intl.stub', 'U_UNQUOTED_SPECIAL' => 'intl/intl.stub', 'U_UNSUPPORTED_ATTRIBUTE' => 'intl/intl.stub', 'U_UNSUPPORTED_ERROR' => 'intl/intl.stub', 'U_UNSUPPORTED_ESCAPE_SEQUENCE' => 'intl/intl.stub', 'U_UNSUPPORTED_PROPERTY' => 'intl/intl.stub', 'U_UNTERMINATED_QUOTE' => 'intl/intl.stub', 'U_USELESS_COLLATOR_ERROR' => 'intl/intl.stub', 'U_USING_DEFAULT_WARNING' => 'intl/intl.stub', 'U_USING_FALLBACK_WARNING' => 'intl/intl.stub', 'U_VARIABLE_RANGE_EXHAUSTED' => 'intl/intl.stub', 'U_VARIABLE_RANGE_OVERLAP' => 'intl/intl.stub', 'U_ZERO_ERROR' => 'intl/intl.stub', 'VARCMP_EQ' => 'com_dotnet/com_dotnet.stub', 'VARCMP_GT' => 'com_dotnet/com_dotnet.stub', 'VARCMP_LT' => 'com_dotnet/com_dotnet.stub', 'VARCMP_NULL' => 'com_dotnet/com_dotnet.stub', 'VIR_CONNECT_FLAG_SOUNDHW_GET_NAMES' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_ACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_INACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_OTHER' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_PAUSED' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_PERSISTENT' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_RUNNING' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_SHUTOFF' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_GET_ALL_DOMAINS_STATS_TRANSIENT' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_LIST_NETWORKS_ACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_LIST_NETWORKS_AUTOSTART' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_LIST_NETWORKS_INACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_LIST_NETWORKS_PERSISTENT' => 'libvirt-php/libvirt-php.stub', 'VIR_CONNECT_LIST_NETWORKS_TRANSIENT' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_AUTHNAME' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_CNONCE' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_ECHOPROMPT' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_EXTERNAL' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_LANGUAGE' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_NOECHOPROMPT' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_PASSPHRASE' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_REALM' => 'libvirt-php/libvirt-php.stub', 'VIR_CRED_USERNAME' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_AFFECT_CONFIG' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_AFFECT_CURRENT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_AFFECT_LIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCKED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COMMIT_ACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COMMIT_BANDWIDTH_BYTES' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COMMIT_DELETE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COMMIT_RELATIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COMMIT_SHALLOW' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COPY_REUSE_EXT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_COPY_SHALLOW' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_INFO_BANDWIDTH_BYTES' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_SPEED_BANDWIDTH_BYTES' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_TYPE_COPY' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_TYPE_PULL' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_BANDWIDTH_BYTES' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_COPY' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_COPY_DEV' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_COPY_RAW' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_RELATIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_REBASE_SHALLOW' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_BLOCK_RESIZE_BYTES' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_CRASHED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DEVICE_MODIFY_CONFIG' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DEVICE_MODIFY_CURRENT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DEVICE_MODIFY_FORCE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DEVICE_MODIFY_LIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DISK_ACCESS_ALL' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DISK_BLOCK' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_DISK_FILE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_FLAG_CLOCK_LOCALTIME' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_FLAG_FEATURE_ACPI' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_FLAG_FEATURE_APIC' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_FLAG_FEATURE_PAE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_FLAG_SOUND_AC97' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_FLAG_TEST_LOCAL_VNC' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_JOB_BOUNDED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_JOB_CANCELLED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_JOB_COMPLETED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_JOB_FAILED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_JOB_NONE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_JOB_UNBOUNDED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_AVAILABLE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_NR' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_RSS' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_SWAP_IN' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_SWAP_OUT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEMORY_STAT_UNUSED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEM_CONFIG' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEM_CURRENT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEM_LIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_MEM_MAXIMUM' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_METADATA_DESCRIPTION' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_METADATA_ELEMENT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_METADATA_TITLE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_NONE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_NOSTATE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_PAUSED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_PMSUSPENDED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_RUNNING' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_SHUTDOWN' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_SHUTOFF' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_START_AUTODESTROY' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_START_BYPASS_CACHE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_START_FORCE_BOOT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_START_PAUSED' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_START_VALIDATE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_STATS_BALLOON' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_STATS_BLOCK' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_STATS_CPU_TOTAL' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_STATS_INTERFACE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_STATS_STATE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_STATS_VCPU' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_UNDEFINE_KEEP_NVRAM' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_UNDEFINE_MANAGED_SAVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_UNDEFINE_NVRAM' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_VCPU_CONFIG' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_VCPU_CURRENT' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_VCPU_GUEST' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_VCPU_LIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_VCPU_MAXIMUM' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_XML_INACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_XML_MIGRATABLE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_XML_SECURE' => 'libvirt-php/libvirt-php.stub', 'VIR_DOMAIN_XML_UPDATE_CPU' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_ATSET1' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_ATSET2' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_ATSET3' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_LINUX' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_OSX' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_RFB' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_USB' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_WIN32' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_XT' => 'libvirt-php/libvirt-php.stub', 'VIR_KEYCODE_SET_XT_KBD' => 'libvirt-php/libvirt-php.stub', 'VIR_MEMORY_PHYSICAL' => 'libvirt-php/libvirt-php.stub', 'VIR_MEMORY_VIRTUAL' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_ABORT_ON_ERROR' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_AUTO_CONVERGE' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_CHANGE_PROTECTION' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_COMPRESSED' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_LIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_NON_SHARED_DISK' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_NON_SHARED_INC' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_OFFLINE' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_PAUSED' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_PEER2PEER' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_PERSIST_DEST' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_TUNNELLED' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_UNDEFINE_SOURCE' => 'libvirt-php/libvirt-php.stub', 'VIR_MIGRATE_UNSAFE' => 'libvirt-php/libvirt-php.stub', 'VIR_NETWORKS_ACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_NETWORKS_ALL' => 'libvirt-php/libvirt-php.stub', 'VIR_NETWORKS_INACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_NODE_CPU_STATS_ALL_CPUS' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_ATOMIC' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_CURRENT' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_DISK_ONLY' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_HALT' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_LIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_NO_METADATA' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_QUIESCE' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_REDEFINE' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_CREATE_REUSE_EXT' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_DELETE_CHILDREN' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_DELETE_CHILDREN_ONLY' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_DELETE_METADATA_ONLY' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_ACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_DESCENDANTS' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_DISK_ONLY' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_EXTERNAL' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_INACTIVE' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_INTERNAL' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_LEAVES' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_METADATA' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_NO_LEAVES' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_NO_METADATA' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_LIST_ROOTS' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_REVERT_FORCE' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_REVERT_PAUSED' => 'libvirt-php/libvirt-php.stub', 'VIR_SNAPSHOT_REVERT_RUNNING' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_POOL_BUILD_NEW' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_POOL_BUILD_REPAIR' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_POOL_BUILD_RESIZE' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_VOL_CREATE_REFLINK' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_VOL_RESIZE_ALLOCATE' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_VOL_RESIZE_DELTA' => 'libvirt-php/libvirt-php.stub', 'VIR_STORAGE_VOL_RESIZE_SHRINK' => 'libvirt-php/libvirt-php.stub', 'VIR_VERSION_BINDING' => 'libvirt-php/libvirt-php.stub', 'VIR_VERSION_LIBVIRT' => 'libvirt-php/libvirt-php.stub', 'VT_ARRAY' => 'com_dotnet/com_dotnet.stub', 'VT_BOOL' => 'com_dotnet/com_dotnet.stub', 'VT_BSTR' => 'com_dotnet/com_dotnet.stub', 'VT_BYREF' => 'com_dotnet/com_dotnet.stub', 'VT_CY' => 'com_dotnet/com_dotnet.stub', 'VT_DATE' => 'com_dotnet/com_dotnet.stub', 'VT_DECIMAL' => 'com_dotnet/com_dotnet.stub', 'VT_DISPATCH' => 'com_dotnet/com_dotnet.stub', 'VT_EMPTY' => 'com_dotnet/com_dotnet.stub', 'VT_ERROR' => 'com_dotnet/com_dotnet.stub', 'VT_I1' => 'com_dotnet/com_dotnet.stub', 'VT_I2' => 'com_dotnet/com_dotnet.stub', 'VT_I4' => 'com_dotnet/com_dotnet.stub', 'VT_INT' => 'com_dotnet/com_dotnet.stub', 'VT_NULL' => 'com_dotnet/com_dotnet.stub', 'VT_R4' => 'com_dotnet/com_dotnet.stub', 'VT_R8' => 'com_dotnet/com_dotnet.stub', 'VT_UI1' => 'com_dotnet/com_dotnet.stub', 'VT_UI2' => 'com_dotnet/com_dotnet.stub', 'VT_UI4' => 'com_dotnet/com_dotnet.stub', 'VT_UINT' => 'com_dotnet/com_dotnet.stub', 'VT_UNKNOWN' => 'com_dotnet/com_dotnet.stub', 'VT_VARIANT' => 'com_dotnet/com_dotnet.stub', 'WBC_ALT' => 'winbinder/winbinder.stub', 'WBC_AUTOREPEAT' => 'winbinder/winbinder.stub', 'WBC_BEEP' => 'winbinder/winbinder.stub', 'WBC_BORDER' => 'winbinder/winbinder.stub', 'WBC_BOTTOM' => 'winbinder/winbinder.stub', 'WBC_CENTER' => 'winbinder/winbinder.stub', 'WBC_CHECKBOXES' => 'winbinder/winbinder.stub', 'WBC_CONTROL' => 'winbinder/winbinder.stub', 'WBC_CUSTOMDRAW' => 'winbinder/winbinder.stub', 'WBC_DBLCLICK' => 'winbinder/winbinder.stub', 'WBC_DEFAULT' => 'winbinder/winbinder.stub', 'WBC_DEFAULTPOS' => 'winbinder/winbinder.stub', 'WBC_DISABLED' => 'winbinder/winbinder.stub', 'WBC_ELLIPSIS' => 'winbinder/winbinder.stub', 'WBC_ENABLED' => 'winbinder/winbinder.stub', 'WBC_GETFOCUS' => 'winbinder/winbinder.stub', 'WBC_GROUP' => 'winbinder/winbinder.stub', 'WBC_HEADERSEL' => 'winbinder/winbinder.stub', 'WBC_IMAGE' => 'winbinder/winbinder.stub', 'WBC_INFO' => 'winbinder/winbinder.stub', 'WBC_INVISIBLE' => 'winbinder/winbinder.stub', 'WBC_KEYDOWN' => 'winbinder/winbinder.stub', 'WBC_KEYUP' => 'winbinder/winbinder.stub', 'WBC_LBUTTON' => 'winbinder/winbinder.stub', 'WBC_LEFT' => 'winbinder/winbinder.stub', 'WBC_LINES' => 'winbinder/winbinder.stub', 'WBC_LV_BACK' => 'winbinder/winbinder.stub', 'WBC_LV_COLUMNS' => 'winbinder/winbinder.stub', 'WBC_LV_DEFAULT' => 'winbinder/winbinder.stub', 'WBC_LV_DRAW' => 'winbinder/winbinder.stub', 'WBC_LV_FORE' => 'winbinder/winbinder.stub', 'WBC_LV_NONE' => 'winbinder/winbinder.stub', 'WBC_MASKED' => 'winbinder/winbinder.stub', 'WBC_MAXIMIZED' => 'winbinder/winbinder.stub', 'WBC_MAXSIZE' => 'winbinder/winbinder.stub', 'WBC_MBUTTON' => 'winbinder/winbinder.stub', 'WBC_MIDDLE' => 'winbinder/winbinder.stub', 'WBC_MINIMIZED' => 'winbinder/winbinder.stub', 'WBC_MINSIZE' => 'winbinder/winbinder.stub', 'WBC_MOUSEDOWN' => 'winbinder/winbinder.stub', 'WBC_MOUSEMOVE' => 'winbinder/winbinder.stub', 'WBC_MOUSEUP' => 'winbinder/winbinder.stub', 'WBC_MULTILINE' => 'winbinder/winbinder.stub', 'WBC_MULTISELECT' => 'winbinder/winbinder.stub', 'WBC_NOHEADER' => 'winbinder/winbinder.stub', 'WBC_NORMAL' => 'winbinder/winbinder.stub', 'WBC_NOTIFY' => 'winbinder/winbinder.stub', 'WBC_NUMBER' => 'winbinder/winbinder.stub', 'WBC_OK' => 'winbinder/winbinder.stub', 'WBC_OKCANCEL' => 'winbinder/winbinder.stub', 'WBC_QUESTION' => 'winbinder/winbinder.stub', 'WBC_RBUTTON' => 'winbinder/winbinder.stub', 'WBC_READONLY' => 'winbinder/winbinder.stub', 'WBC_REDRAW' => 'winbinder/winbinder.stub', 'WBC_RESIZE' => 'winbinder/winbinder.stub', 'WBC_RIGHT' => 'winbinder/winbinder.stub', 'WBC_RTF_TEXT' => 'winbinder/winbinder.stub', 'WBC_SHIFT' => 'winbinder/winbinder.stub', 'WBC_SINGLE' => 'winbinder/winbinder.stub', 'WBC_SORT' => 'winbinder/winbinder.stub', 'WBC_STOP' => 'winbinder/winbinder.stub', 'WBC_TASKBAR' => 'winbinder/winbinder.stub', 'WBC_TITLE' => 'winbinder/winbinder.stub', 'WBC_TOP' => 'winbinder/winbinder.stub', 'WBC_TRANSPARENT' => 'winbinder/winbinder.stub', 'WBC_VERSION' => 'winbinder/winbinder.stub', 'WBC_VISIBLE' => 'winbinder/winbinder.stub', 'WBC_WARNING' => 'winbinder/winbinder.stub', 'WBC_YESNO' => 'winbinder/winbinder.stub', 'WBC_YESNOCANCEL' => 'winbinder/winbinder.stub', 'WCONTINUED' => 'pcntl/pcntl.stub', 'WEBSOCKET_CLOSE_ABNORMAL' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_DATA_ERROR' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_EXTENSION_MISSING' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_GOING_AWAY' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_MESSAGE_ERROR' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_MESSAGE_TOO_BIG' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_NORMAL' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_POLICY_ERROR' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_PROTOCOL_ERROR' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_SERVER_ERROR' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_STATUS_ERROR' => 'swoole/constants.stub', 'WEBSOCKET_CLOSE_TLS' => 'swoole/constants.stub', 'WEBSOCKET_OPCODE_BINARY' => 'swoole/constants.stub', 'WEBSOCKET_OPCODE_CLOSE' => 'swoole/constants.stub', 'WEBSOCKET_OPCODE_CONTINUATION' => 'swoole/constants.stub', 'WEBSOCKET_OPCODE_PING' => 'swoole/constants.stub', 'WEBSOCKET_OPCODE_PONG' => 'swoole/constants.stub', 'WEBSOCKET_OPCODE_TEXT' => 'swoole/constants.stub', 'WEBSOCKET_STATUS_ACTIVE' => 'swoole/constants.stub', 'WEBSOCKET_STATUS_CLOSING' => 'swoole/constants.stub', 'WEBSOCKET_STATUS_CONNECTION' => 'swoole/constants.stub', 'WEBSOCKET_STATUS_FRAME' => 'swoole/constants.stub', 'WEBSOCKET_STATUS_HANDSHAKE' => 'swoole/constants.stub', 'WEXITED' => 'pcntl/pcntl.stub', 'WHITE' => 'winbinder/winbinder.stub', 'WIN32_ABOVE_NORMAL_PRIORITY_CLASS' => 'win32service/win32service.stub', 'WIN32_BELOW_NORMAL_PRIORITY_CLASS' => 'win32service/win32service.stub', 'WIN32_ERROR_ACCESS_DENIED' => 'win32service/win32service.stub', 'WIN32_ERROR_CIRCULAR_DEPENDENCY' => 'win32service/win32service.stub', 'WIN32_ERROR_DATABASE_DOES_NOT_EXIST' => 'win32service/win32service.stub', 'WIN32_ERROR_DEPENDENT_SERVICES_RUNNING' => 'win32service/win32service.stub', 'WIN32_ERROR_DUPLICATE_SERVICE_NAME' => 'win32service/win32service.stub', 'WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT' => 'win32service/win32service.stub', 'WIN32_ERROR_INSUFFICIENT_BUFFER' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_DATA' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_HANDLE' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_LEVEL' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_NAME' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_PARAMETER' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_SERVICE_ACCOUNT' => 'win32service/win32service.stub', 'WIN32_ERROR_INVALID_SERVICE_CONTROL' => 'win32service/win32service.stub', 'WIN32_ERROR_PATH_NOT_FOUND' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_ALREADY_RUNNING' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_CANNOT_ACCEPT_CTRL' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_DATABASE_LOCKED' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_DEPENDENCY_DELETED' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_DEPENDENCY_FAIL' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_DISABLED' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_DOES_NOT_EXIST' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_EXISTS' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_LOGON_FAILED' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_MARKED_FOR_DELETE' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_NOT_ACTIVE' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_NO_THREAD' => 'win32service/win32service.stub', 'WIN32_ERROR_SERVICE_REQUEST_TIMEOUT' => 'win32service/win32service.stub', 'WIN32_ERROR_SHUTDOWN_IN_PROGRESS' => 'win32service/win32service.stub', 'WIN32_HIGH_PRIORITY_CLASS' => 'win32service/win32service.stub', 'WIN32_IDLE_PRIORITY_CLASS' => 'win32service/win32service.stub', 'WIN32_NORMAL_PRIORITY_CLASS' => 'win32service/win32service.stub', 'WIN32_NO_ERROR' => 'win32service/win32service.stub', 'WIN32_REALTIME_PRIORITY_CLASS' => 'win32service/win32service.stub', 'WIN32_SERVICE_ACCEPT_PAUSE_CONTINUE' => 'win32service/win32service.stub', 'WIN32_SERVICE_ACCEPT_PRESHUTDOWN' => 'win32service/win32service.stub', 'WIN32_SERVICE_ACCEPT_SHUTDOWN' => 'win32service/win32service.stub', 'WIN32_SERVICE_ACCEPT_STOP' => 'win32service/win32service.stub', 'WIN32_SERVICE_AUTO_START' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTINUE_PENDING' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTROL_CONTINUE' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTROL_INTERROGATE' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTROL_PAUSE' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTROL_PRESHUTDOWN' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTROL_SHUTDOWN' => 'win32service/win32service.stub', 'WIN32_SERVICE_CONTROL_STOP' => 'win32service/win32service.stub', 'WIN32_SERVICE_DEMAND_START' => 'win32service/win32service.stub', 'WIN32_SERVICE_DISABLED' => 'win32service/win32service.stub', 'WIN32_SERVICE_ERROR_IGNORE' => 'win32service/win32service.stub', 'WIN32_SERVICE_ERROR_NORMAL' => 'win32service/win32service.stub', 'WIN32_SERVICE_INTERACTIVE_PROCESS' => 'win32service/win32service.stub', 'WIN32_SERVICE_PAUSED' => 'win32service/win32service.stub', 'WIN32_SERVICE_PAUSE_PENDING' => 'win32service/win32service.stub', 'WIN32_SERVICE_RUNNING' => 'win32service/win32service.stub', 'WIN32_SERVICE_RUNS_IN_SYSTEM_PROCESS' => 'win32service/win32service.stub', 'WIN32_SERVICE_START_PENDING' => 'win32service/win32service.stub', 'WIN32_SERVICE_STOPPED' => 'win32service/win32service.stub', 'WIN32_SERVICE_STOP_PENDING' => 'win32service/win32service.stub', 'WIN32_SERVICE_WIN32_OWN_PROCESS' => 'win32service/win32service.stub', 'WIN32_SERVICE_WIN32_OWN_PROCESS_INTERACTIVE' => 'win32service/win32service.stub', 'WNOHANG' => 'pcntl/pcntl.stub', 'WNOWAIT' => 'pcntl/pcntl.stub', 'WSDL_CACHE_BOTH' => 'soap/soap.stub', 'WSDL_CACHE_DISK' => 'soap/soap.stub', 'WSDL_CACHE_MEMORY' => 'soap/soap.stub', 'WSDL_CACHE_NONE' => 'soap/soap.stub', 'WSTOPPED' => 'pcntl/pcntl.stub', 'WUNTRACED' => 'pcntl/pcntl.stub', 'X509_PURPOSE_ANY' => 'openssl/openssl.stub', 'X509_PURPOSE_CRL_SIGN' => 'openssl/openssl.stub', 'X509_PURPOSE_NS_SSL_SERVER' => 'openssl/openssl.stub', 'X509_PURPOSE_OCSP_HELPER' => 'openssl/openssl.stub', 'X509_PURPOSE_SMIME_ENCRYPT' => 'openssl/openssl.stub', 'X509_PURPOSE_SMIME_SIGN' => 'openssl/openssl.stub', 'X509_PURPOSE_SSL_CLIENT' => 'openssl/openssl.stub', 'X509_PURPOSE_SSL_SERVER' => 'openssl/openssl.stub', 'X509_PURPOSE_TIMESTAMP_SIGN' => 'openssl/openssl.stub', 'XDEBUG_CC_BRANCH_CHECK' => 'xdebug/xdebug.stub', 'XDEBUG_CC_DEAD_CODE' => 'xdebug/xdebug.stub', 'XDEBUG_CC_UNUSED' => 'xdebug/xdebug.stub', 'XDEBUG_FILTER_CODE_COVERAGE' => 'xdebug/xdebug.stub', 'XDEBUG_FILTER_NONE' => 'xdebug/xdebug.stub', 'XDEBUG_FILTER_STACK' => 'xdebug/xdebug.stub', 'XDEBUG_FILTER_TRACING' => 'xdebug/xdebug.stub', 'XDEBUG_NAMESPACE_BLACKLIST' => 'xdebug/xdebug.stub', 'XDEBUG_NAMESPACE_EXCLUDE' => 'xdebug/xdebug.stub', 'XDEBUG_NAMESPACE_INCLUDE' => 'xdebug/xdebug.stub', 'XDEBUG_NAMESPACE_WHITELIST' => 'xdebug/xdebug.stub', 'XDEBUG_PATH_BLACKLIST' => 'xdebug/xdebug.stub', 'XDEBUG_PATH_EXCLUDE' => 'xdebug/xdebug.stub', 'XDEBUG_PATH_INCLUDE' => 'xdebug/xdebug.stub', 'XDEBUG_PATH_WHITELIST' => 'xdebug/xdebug.stub', 'XDEBUG_STACK_NO_DESC' => 'xdebug/xdebug.stub', 'XDEBUG_TRACE_APPEND' => 'xdebug/xdebug.stub', 'XDEBUG_TRACE_COMPUTERIZED' => 'xdebug/xdebug.stub', 'XDEBUG_TRACE_HTML' => 'xdebug/xdebug.stub', 'XDEBUG_TRACE_NAKED_FILENAME' => 'xdebug/xdebug.stub', 'XDIFF_PATCH_IGNORESPACE' => 'xdiff/xdiff.stub', 'XDIFF_PATCH_NORMAL' => 'xdiff/xdiff.stub', 'XDIFF_PATCH_REVERSE' => 'xdiff/xdiff.stub', 'XHPROF_FLAGS_CPU' => 'xhprof/xhprof.stub', 'XHPROF_FLAGS_MEMORY' => 'xhprof/xhprof.stub', 'XHPROF_FLAGS_NO_BUILTINS' => 'xhprof/xhprof.stub', 'XML_ATTRIBUTE_CDATA' => 'dom/dom.stub', 'XML_ATTRIBUTE_DECL_NODE' => 'dom/dom.stub', 'XML_ATTRIBUTE_ENTITY' => 'dom/dom.stub', 'XML_ATTRIBUTE_ENUMERATION' => 'dom/dom.stub', 'XML_ATTRIBUTE_ID' => 'dom/dom.stub', 'XML_ATTRIBUTE_IDREF' => 'dom/dom.stub', 'XML_ATTRIBUTE_IDREFS' => 'dom/dom.stub', 'XML_ATTRIBUTE_NMTOKEN' => 'dom/dom.stub', 'XML_ATTRIBUTE_NMTOKENS' => 'dom/dom.stub', 'XML_ATTRIBUTE_NODE' => 'dom/dom.stub', 'XML_ATTRIBUTE_NOTATION' => 'dom/dom.stub', 'XML_CDATA_SECTION_NODE' => 'dom/dom.stub', 'XML_COMMENT_NODE' => 'dom/dom.stub', 'XML_DOCUMENT_FRAG_NODE' => 'dom/dom.stub', 'XML_DOCUMENT_NODE' => 'dom/dom.stub', 'XML_DOCUMENT_TYPE_NODE' => 'dom/dom.stub', 'XML_DTD_NODE' => 'dom/dom.stub', 'XML_ELEMENT_DECL_NODE' => 'dom/dom.stub', 'XML_ELEMENT_NODE' => 'dom/dom.stub', 'XML_ENTITY_DECL_NODE' => 'dom/dom.stub', 'XML_ENTITY_NODE' => 'dom/dom.stub', 'XML_ENTITY_REF_NODE' => 'dom/dom.stub', 'XML_ERROR_ASYNC_ENTITY' => 'xml/xml.stub', 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF' => 'xml/xml.stub', 'XML_ERROR_BAD_CHAR_REF' => 'xml/xml.stub', 'XML_ERROR_BINARY_ENTITY_REF' => 'xml/xml.stub', 'XML_ERROR_DUPLICATE_ATTRIBUTE' => 'xml/xml.stub', 'XML_ERROR_EXTERNAL_ENTITY_HANDLING' => 'xml/xml.stub', 'XML_ERROR_INCORRECT_ENCODING' => 'xml/xml.stub', 'XML_ERROR_INVALID_TOKEN' => 'xml/xml.stub', 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT' => 'xml/xml.stub', 'XML_ERROR_MISPLACED_XML_PI' => 'xml/xml.stub', 'XML_ERROR_NONE' => 'xml/xml.stub', 'XML_ERROR_NO_ELEMENTS' => 'xml/xml.stub', 'XML_ERROR_NO_MEMORY' => 'xml/xml.stub', 'XML_ERROR_PARAM_ENTITY_REF' => 'xml/xml.stub', 'XML_ERROR_PARTIAL_CHAR' => 'xml/xml.stub', 'XML_ERROR_RECURSIVE_ENTITY_REF' => 'xml/xml.stub', 'XML_ERROR_SYNTAX' => 'xml/xml.stub', 'XML_ERROR_TAG_MISMATCH' => 'xml/xml.stub', 'XML_ERROR_UNCLOSED_CDATA_SECTION' => 'xml/xml.stub', 'XML_ERROR_UNCLOSED_TOKEN' => 'xml/xml.stub', 'XML_ERROR_UNDEFINED_ENTITY' => 'xml/xml.stub', 'XML_ERROR_UNKNOWN_ENCODING' => 'xml/xml.stub', 'XML_HTML_DOCUMENT_NODE' => 'dom/dom.stub', 'XML_LOCAL_NAMESPACE' => 'dom/dom.stub', 'XML_NAMESPACE_DECL_NODE' => 'dom/dom.stub', 'XML_NOTATION_NODE' => 'dom/dom.stub', 'XML_OPTION_CASE_FOLDING' => 'xml/xml.stub', 'XML_OPTION_PARSE_HUGE' => 'xml/xml.stub', 'XML_OPTION_SKIP_TAGSTART' => 'xml/xml.stub', 'XML_OPTION_SKIP_WHITE' => 'xml/xml.stub', 'XML_OPTION_TARGET_ENCODING' => 'xml/xml.stub', 'XML_PI_NODE' => 'dom/dom.stub', 'XML_SAX_IMPL' => 'xml/xml.stub', 'XML_TEXT_NODE' => 'dom/dom.stub', 'XSD_1999_NAMESPACE' => 'soap/soap.stub', 'XSD_1999_TIMEINSTANT' => 'soap/soap.stub', 'XSD_ANYTYPE' => 'soap/soap.stub', 'XSD_ANYURI' => 'soap/soap.stub', 'XSD_ANYXML' => 'soap/soap.stub', 'XSD_BASE64BINARY' => 'soap/soap.stub', 'XSD_BOOLEAN' => 'soap/soap.stub', 'XSD_BYTE' => 'soap/soap.stub', 'XSD_DATE' => 'soap/soap.stub', 'XSD_DATETIME' => 'soap/soap.stub', 'XSD_DECIMAL' => 'soap/soap.stub', 'XSD_DOUBLE' => 'soap/soap.stub', 'XSD_DURATION' => 'soap/soap.stub', 'XSD_ENTITIES' => 'soap/soap.stub', 'XSD_ENTITY' => 'soap/soap.stub', 'XSD_FLOAT' => 'soap/soap.stub', 'XSD_GDAY' => 'soap/soap.stub', 'XSD_GMONTH' => 'soap/soap.stub', 'XSD_GMONTHDAY' => 'soap/soap.stub', 'XSD_GYEAR' => 'soap/soap.stub', 'XSD_GYEARMONTH' => 'soap/soap.stub', 'XSD_HEXBINARY' => 'soap/soap.stub', 'XSD_ID' => 'soap/soap.stub', 'XSD_IDREF' => 'soap/soap.stub', 'XSD_IDREFS' => 'soap/soap.stub', 'XSD_INT' => 'soap/soap.stub', 'XSD_INTEGER' => 'soap/soap.stub', 'XSD_LANGUAGE' => 'soap/soap.stub', 'XSD_LONG' => 'soap/soap.stub', 'XSD_NAME' => 'soap/soap.stub', 'XSD_NAMESPACE' => 'soap/soap.stub', 'XSD_NCNAME' => 'soap/soap.stub', 'XSD_NEGATIVEINTEGER' => 'soap/soap.stub', 'XSD_NMTOKEN' => 'soap/soap.stub', 'XSD_NMTOKENS' => 'soap/soap.stub', 'XSD_NONNEGATIVEINTEGER' => 'soap/soap.stub', 'XSD_NONPOSITIVEINTEGER' => 'soap/soap.stub', 'XSD_NORMALIZEDSTRING' => 'soap/soap.stub', 'XSD_NOTATION' => 'soap/soap.stub', 'XSD_POSITIVEINTEGER' => 'soap/soap.stub', 'XSD_QNAME' => 'soap/soap.stub', 'XSD_SHORT' => 'soap/soap.stub', 'XSD_STRING' => 'soap/soap.stub', 'XSD_TIME' => 'soap/soap.stub', 'XSD_TOKEN' => 'soap/soap.stub', 'XSD_UNSIGNEDBYTE' => 'soap/soap.stub', 'XSD_UNSIGNEDINT' => 'soap/soap.stub', 'XSD_UNSIGNEDLONG' => 'soap/soap.stub', 'XSD_UNSIGNEDSHORT' => 'soap/soap.stub', 'XSL_CLONE_ALWAYS' => 'xsl/xsl.stub', 'XSL_CLONE_AUTO' => 'xsl/xsl.stub', 'XSL_CLONE_NEVER' => 'xsl/xsl.stub', 'XSL_SECPREF_CREATE_DIRECTORY' => 'xsl/xsl.stub', 'XSL_SECPREF_DEFAULT' => 'xsl/xsl.stub', 'XSL_SECPREF_NONE' => 'xsl/xsl.stub', 'XSL_SECPREF_READ_FILE' => 'xsl/xsl.stub', 'XSL_SECPREF_READ_NETWORK' => 'xsl/xsl.stub', 'XSL_SECPREF_WRITE_FILE' => 'xsl/xsl.stub', 'XSL_SECPREF_WRITE_NETWORK' => 'xsl/xsl.stub', 'YAF\\ENVIRON' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\AUTOLOAD\\FAILED' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\CALL\\FAILED' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\DISPATCH\\FAILED' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\NOTFOUND\\ACTION' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\NOTFOUND\\CONTROLLER' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\NOTFOUND\\MODULE' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\NOTFOUND\\VIEW' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\ROUTE\\FAILED' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\STARTUP\\FAILED' => 'yaf/yaf_namespace.stub', 'YAF\\ERR\\TYPE\\ERROR' => 'yaf/yaf_namespace.stub', 'YAF\\VERSION' => 'yaf/yaf_namespace.stub', 'YAF_ENVIRON' => 'yaf/yaf.stub', 'YAF_ERR_ACCESS_ERROR' => 'yaf/yaf.stub', 'YAF_ERR_AUTOLOAD_FAILED' => 'yaf/yaf.stub', 'YAF_ERR_CALL_FAILED' => 'yaf/yaf.stub', 'YAF_ERR_DISPATCH_FAILED' => 'yaf/yaf.stub', 'YAF_ERR_NOTFOUND_ACTION' => 'yaf/yaf.stub', 'YAF_ERR_NOTFOUND_CONTROLLER' => 'yaf/yaf.stub', 'YAF_ERR_NOTFOUND_MODULE' => 'yaf/yaf.stub', 'YAF_ERR_NOTFOUND_VIEW' => 'yaf/yaf.stub', 'YAF_ERR_ROUTE_FAILED' => 'yaf/yaf.stub', 'YAF_ERR_STARTUP_FAILED' => 'yaf/yaf.stub', 'YAF_ERR_TYPE_ERROR' => 'yaf/yaf.stub', 'YAF_VERSION' => 'yaf/yaf.stub', 'YAML_ANY_BREAK' => 'yaml/yaml.stub', 'YAML_ANY_ENCODING' => 'yaml/yaml.stub', 'YAML_ANY_SCALAR_STYLE' => 'yaml/yaml.stub', 'YAML_BINARY_TAG' => 'yaml/yaml.stub', 'YAML_BOOL_TAG' => 'yaml/yaml.stub', 'YAML_CRLN_BREAK' => 'yaml/yaml.stub', 'YAML_CR_BREAK' => 'yaml/yaml.stub', 'YAML_DOUBLE_QUOTED_SCALAR_STYLE' => 'yaml/yaml.stub', 'YAML_FLOAT_TAG' => 'yaml/yaml.stub', 'YAML_FOLDED_SCALAR_STYLE' => 'yaml/yaml.stub', 'YAML_INT_TAG' => 'yaml/yaml.stub', 'YAML_LITERAL_SCALAR_STYLE' => 'yaml/yaml.stub', 'YAML_LN_BREAK' => 'yaml/yaml.stub', 'YAML_MAP_TAG' => 'yaml/yaml.stub', 'YAML_MERGE_TAG' => 'yaml/yaml.stub', 'YAML_NULL_TAG' => 'yaml/yaml.stub', 'YAML_PHP_TAG' => 'yaml/yaml.stub', 'YAML_PLAIN_SCALAR_STYLE' => 'yaml/yaml.stub', 'YAML_SEQ_TAG' => 'yaml/yaml.stub', 'YAML_SINGLE_QUOTED_SCALAR_STYLE' => 'yaml/yaml.stub', 'YAML_STR_TAG' => 'yaml/yaml.stub', 'YAML_TIMESTAMP_TAG' => 'yaml/yaml.stub', 'YAML_UTF16BE_ENCODING' => 'yaml/yaml.stub', 'YAML_UTF16LE_ENCODING' => 'yaml/yaml.stub', 'YAML_UTF8_ENCODING' => 'yaml/yaml.stub', 'YAR_CLIENT_PROTOCOL_HTTP' => 'yar/yar.stub', 'YAR_CLIENT_PROTOCOL_TCP' => 'yar/yar.stub', 'YAR_CLIENT_PROTOCOL_UNIX' => 'yar/yar.stub', 'YAR_ERR_EXCEPTION' => 'yar/yar.stub', 'YAR_ERR_OKEY' => 'yar/yar.stub', 'YAR_ERR_OUTPUT' => 'yar/yar.stub', 'YAR_ERR_PACKAGER' => 'yar/yar.stub', 'YAR_ERR_PROTOCOL' => 'yar/yar.stub', 'YAR_ERR_REQUEST' => 'yar/yar.stub', 'YAR_ERR_TRANSPORT' => 'yar/yar.stub', 'YAR_OPT_CONNECT_TIMEOUT' => 'yar/yar.stub', 'YAR_OPT_HEADER' => 'yar/yar.stub', 'YAR_OPT_PACKAGER' => 'yar/yar.stub', 'YAR_OPT_PERSISTENT' => 'yar/yar.stub', 'YAR_OPT_RESOLVE' => 'yar/yar.stub', 'YAR_OPT_TIMEOUT' => 'yar/yar.stub', 'YAR_PACKAGER_JSON' => 'yar/yar.stub', 'YAR_PACKAGER_PHP' => 'yar/yar.stub', 'YAR_VERSION' => 'yar/yar.stub', 'YELLOW' => 'winbinder/winbinder.stub', 'YESEXPR' => 'standard/standard_defines.stub', 'YESSTR' => 'standard/standard_defines.stub', 'ZEND_ACC_ABSTRACT' => 'uopz/uopz.stub', 'ZEND_ACC_FETCH' => 'uopz/uopz.stub', 'ZEND_ACC_FINAL' => 'uopz/uopz.stub', 'ZEND_ACC_PPP_MASK' => 'uopz/uopz.stub', 'ZEND_ACC_PRIVATE' => 'uopz/uopz.stub', 'ZEND_ACC_PROTECTED' => 'uopz/uopz.stub', 'ZEND_ACC_PUBLIC' => 'uopz/uopz.stub', 'ZEND_ACC_STATIC' => 'uopz/uopz.stub', 'ZEND_DEBUG_BUILD' => 'Core/Core_d.stub', 'ZEND_MULTIBYTE' => 'Core/Core_d.stub', 'ZEND_THREAD_SAFE' => 'Core/Core_d.stub', 'ZLIB_BLOCK' => 'zlib/zlib.stub', 'ZLIB_BUF_ERROR' => 'zlib/zlib.stub', 'ZLIB_DATA_ERROR' => 'zlib/zlib.stub', 'ZLIB_DEFAULT_STRATEGY' => 'zlib/zlib.stub', 'ZLIB_ENCODING_DEFLATE' => 'zlib/zlib.stub', 'ZLIB_ENCODING_GZIP' => 'zlib/zlib.stub', 'ZLIB_ENCODING_RAW' => 'zlib/zlib.stub', 'ZLIB_ERRNO' => 'zlib/zlib.stub', 'ZLIB_FILTERED' => 'zlib/zlib.stub', 'ZLIB_FINISH' => 'zlib/zlib.stub', 'ZLIB_FIXED' => 'zlib/zlib.stub', 'ZLIB_FULL_FLUSH' => 'zlib/zlib.stub', 'ZLIB_HUFFMAN_ONLY' => 'zlib/zlib.stub', 'ZLIB_MEM_ERROR' => 'zlib/zlib.stub', 'ZLIB_NEED_DICT' => 'zlib/zlib.stub', 'ZLIB_NO_FLUSH' => 'zlib/zlib.stub', 'ZLIB_OK' => 'zlib/zlib.stub', 'ZLIB_PARTIAL_FLUSH' => 'zlib/zlib.stub', 'ZLIB_RLE' => 'zlib/zlib.stub', 'ZLIB_STREAM_END' => 'zlib/zlib.stub', 'ZLIB_STREAM_ERROR' => 'zlib/zlib.stub', 'ZLIB_SYNC_FLUSH' => 'zlib/zlib.stub', 'ZLIB_VERNUM' => 'zlib/zlib.stub', 'ZLIB_VERSION' => 'zlib/zlib.stub', 'ZLIB_VERSION_ERROR' => 'zlib/zlib.stub', 'ZSTD_COMPRESS_LEVEL_DEFAULT' => 'zstd/zstd.stub', 'ZSTD_COMPRESS_LEVEL_MAX' => 'zstd/zstd.stub', 'ZSTD_COMPRESS_LEVEL_MIN' => 'zstd/zstd.stub', '__CLASS__' => 'standard/basic.stub', '__COMPILER_HALT_OFFSET__' => 'standard/_standard_manual.stub', '__DIR__' => 'standard/basic.stub', '__FILE__' => 'standard/basic.stub', '__FUNCTION__' => 'standard/basic.stub', '__LINE__' => 'standard/basic.stub', '__METHOD__' => 'standard/basic.stub', '__NAMESPACE__' => 'standard/basic.stub', '__TRAIT__' => 'standard/basic.stub', '__class__' => 'standard/basic.stub', '__dir__' => 'standard/basic.stub', '__file__' => 'standard/basic.stub', '__function__' => 'standard/basic.stub', '__line__' => 'standard/basic.stub', '__method__' => 'standard/basic.stub', '__namespace__' => 'standard/basic.stub', '__trait__' => 'standard/basic.stub', 'ast\\AST_ARG_LIST' => 'ast/ast.stub', 'ast\\AST_ARRAY' => 'ast/ast.stub', 'ast\\AST_ARRAY_ELEM' => 'ast/ast.stub', 'ast\\AST_ARROW_FUNC' => 'ast/ast.stub', 'ast\\AST_ASSIGN' => 'ast/ast.stub', 'ast\\AST_ASSIGN_OP' => 'ast/ast.stub', 'ast\\AST_ASSIGN_REF' => 'ast/ast.stub', 'ast\\AST_ATTRIBUTE' => 'ast/ast.stub', 'ast\\AST_ATTRIBUTE_GROUP' => 'ast/ast.stub', 'ast\\AST_ATTRIBUTE_LIST' => 'ast/ast.stub', 'ast\\AST_BINARY_OP' => 'ast/ast.stub', 'ast\\AST_BREAK' => 'ast/ast.stub', 'ast\\AST_CALL' => 'ast/ast.stub', 'ast\\AST_CAST' => 'ast/ast.stub', 'ast\\AST_CATCH' => 'ast/ast.stub', 'ast\\AST_CATCH_LIST' => 'ast/ast.stub', 'ast\\AST_CLASS' => 'ast/ast.stub', 'ast\\AST_CLASS_CONST' => 'ast/ast.stub', 'ast\\AST_CLASS_CONST_DECL' => 'ast/ast.stub', 'ast\\AST_CLASS_CONST_GROUP' => 'ast/ast.stub', 'ast\\AST_CLASS_NAME' => 'ast/ast.stub', 'ast\\AST_CLONE' => 'ast/ast.stub', 'ast\\AST_CLOSURE' => 'ast/ast.stub', 'ast\\AST_CLOSURE_USES' => 'ast/ast.stub', 'ast\\AST_CLOSURE_VAR' => 'ast/ast.stub', 'ast\\AST_CONDITIONAL' => 'ast/ast.stub', 'ast\\AST_CONST' => 'ast/ast.stub', 'ast\\AST_CONST_DECL' => 'ast/ast.stub', 'ast\\AST_CONST_ELEM' => 'ast/ast.stub', 'ast\\AST_CONTINUE' => 'ast/ast.stub', 'ast\\AST_DECLARE' => 'ast/ast.stub', 'ast\\AST_DIM' => 'ast/ast.stub', 'ast\\AST_DO_WHILE' => 'ast/ast.stub', 'ast\\AST_ECHO' => 'ast/ast.stub', 'ast\\AST_EMPTY' => 'ast/ast.stub', 'ast\\AST_ENCAPS_LIST' => 'ast/ast.stub', 'ast\\AST_EXIT' => 'ast/ast.stub', 'ast\\AST_EXPR_LIST' => 'ast/ast.stub', 'ast\\AST_FOR' => 'ast/ast.stub', 'ast\\AST_FOREACH' => 'ast/ast.stub', 'ast\\AST_FUNC_DECL' => 'ast/ast.stub', 'ast\\AST_GLOBAL' => 'ast/ast.stub', 'ast\\AST_GOTO' => 'ast/ast.stub', 'ast\\AST_GROUP_USE' => 'ast/ast.stub', 'ast\\AST_HALT_COMPILER' => 'ast/ast.stub', 'ast\\AST_IF' => 'ast/ast.stub', 'ast\\AST_IF_ELEM' => 'ast/ast.stub', 'ast\\AST_INCLUDE_OR_EVAL' => 'ast/ast.stub', 'ast\\AST_INSTANCEOF' => 'ast/ast.stub', 'ast\\AST_ISSET' => 'ast/ast.stub', 'ast\\AST_LABEL' => 'ast/ast.stub', 'ast\\AST_LIST' => 'ast/ast.stub', 'ast\\AST_MAGIC_CONST' => 'ast/ast.stub', 'ast\\AST_MATCH' => 'ast/ast.stub', 'ast\\AST_MATCH_ARM' => 'ast/ast.stub', 'ast\\AST_MATCH_ARM_LIST' => 'ast/ast.stub', 'ast\\AST_METHOD' => 'ast/ast.stub', 'ast\\AST_METHOD_CALL' => 'ast/ast.stub', 'ast\\AST_METHOD_REFERENCE' => 'ast/ast.stub', 'ast\\AST_NAME' => 'ast/ast.stub', 'ast\\AST_NAMED_ARG' => 'ast/ast.stub', 'ast\\AST_NAMESPACE' => 'ast/ast.stub', 'ast\\AST_NAME_LIST' => 'ast/ast.stub', 'ast\\AST_NEW' => 'ast/ast.stub', 'ast\\AST_NULLABLE_TYPE' => 'ast/ast.stub', 'ast\\AST_NULLSAFE_METHOD_CALL' => 'ast/ast.stub', 'ast\\AST_NULLSAFE_PROP' => 'ast/ast.stub', 'ast\\AST_PARAM' => 'ast/ast.stub', 'ast\\AST_PARAM_LIST' => 'ast/ast.stub', 'ast\\AST_POST_DEC' => 'ast/ast.stub', 'ast\\AST_POST_INC' => 'ast/ast.stub', 'ast\\AST_PRE_DEC' => 'ast/ast.stub', 'ast\\AST_PRE_INC' => 'ast/ast.stub', 'ast\\AST_PRINT' => 'ast/ast.stub', 'ast\\AST_PROP' => 'ast/ast.stub', 'ast\\AST_PROP_DECL' => 'ast/ast.stub', 'ast\\AST_PROP_ELEM' => 'ast/ast.stub', 'ast\\AST_PROP_GROUP' => 'ast/ast.stub', 'ast\\AST_REF' => 'ast/ast.stub', 'ast\\AST_RETURN' => 'ast/ast.stub', 'ast\\AST_SHELL_EXEC' => 'ast/ast.stub', 'ast\\AST_STATIC' => 'ast/ast.stub', 'ast\\AST_STATIC_CALL' => 'ast/ast.stub', 'ast\\AST_STATIC_PROP' => 'ast/ast.stub', 'ast\\AST_STMT_LIST' => 'ast/ast.stub', 'ast\\AST_SWITCH' => 'ast/ast.stub', 'ast\\AST_SWITCH_CASE' => 'ast/ast.stub', 'ast\\AST_SWITCH_LIST' => 'ast/ast.stub', 'ast\\AST_THROW' => 'ast/ast.stub', 'ast\\AST_TRAIT_ADAPTATIONS' => 'ast/ast.stub', 'ast\\AST_TRAIT_ALIAS' => 'ast/ast.stub', 'ast\\AST_TRAIT_PRECEDENCE' => 'ast/ast.stub', 'ast\\AST_TRY' => 'ast/ast.stub', 'ast\\AST_TYPE' => 'ast/ast.stub', 'ast\\AST_TYPE_UNION' => 'ast/ast.stub', 'ast\\AST_UNARY_OP' => 'ast/ast.stub', 'ast\\AST_UNPACK' => 'ast/ast.stub', 'ast\\AST_UNSET' => 'ast/ast.stub', 'ast\\AST_USE' => 'ast/ast.stub', 'ast\\AST_USE_ELEM' => 'ast/ast.stub', 'ast\\AST_USE_TRAIT' => 'ast/ast.stub', 'ast\\AST_VAR' => 'ast/ast.stub', 'ast\\AST_WHILE' => 'ast/ast.stub', 'ast\\AST_YIELD' => 'ast/ast.stub', 'ast\\AST_YIELD_FROM' => 'ast/ast.stub', 'ast\\flags\\ARRAY_ELEM_REF' => 'ast/ast.stub', 'ast\\flags\\ARRAY_SYNTAX_LIST' => 'ast/ast.stub', 'ast\\flags\\ARRAY_SYNTAX_LONG' => 'ast/ast.stub', 'ast\\flags\\ARRAY_SYNTAX_SHORT' => 'ast/ast.stub', 'ast\\flags\\BINARY_ADD' => 'ast/ast.stub', 'ast\\flags\\BINARY_BITWISE_AND' => 'ast/ast.stub', 'ast\\flags\\BINARY_BITWISE_OR' => 'ast/ast.stub', 'ast\\flags\\BINARY_BITWISE_XOR' => 'ast/ast.stub', 'ast\\flags\\BINARY_BOOL_AND' => 'ast/ast.stub', 'ast\\flags\\BINARY_BOOL_OR' => 'ast/ast.stub', 'ast\\flags\\BINARY_BOOL_XOR' => 'ast/ast.stub', 'ast\\flags\\BINARY_COALESCE' => 'ast/ast.stub', 'ast\\flags\\BINARY_CONCAT' => 'ast/ast.stub', 'ast\\flags\\BINARY_DIV' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_EQUAL' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_GREATER' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_GREATER_OR_EQUAL' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_IDENTICAL' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_NOT_EQUAL' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_NOT_IDENTICAL' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_SMALLER' => 'ast/ast.stub', 'ast\\flags\\BINARY_IS_SMALLER_OR_EQUAL' => 'ast/ast.stub', 'ast\\flags\\BINARY_MOD' => 'ast/ast.stub', 'ast\\flags\\BINARY_MUL' => 'ast/ast.stub', 'ast\\flags\\BINARY_POW' => 'ast/ast.stub', 'ast\\flags\\BINARY_SHIFT_LEFT' => 'ast/ast.stub', 'ast\\flags\\BINARY_SHIFT_RIGHT' => 'ast/ast.stub', 'ast\\flags\\BINARY_SPACESHIP' => 'ast/ast.stub', 'ast\\flags\\BINARY_SUB' => 'ast/ast.stub', 'ast\\flags\\CLASS_ABSTRACT' => 'ast/ast.stub', 'ast\\flags\\CLASS_ANONYMOUS' => 'ast/ast.stub', 'ast\\flags\\CLASS_FINAL' => 'ast/ast.stub', 'ast\\flags\\CLASS_INTERFACE' => 'ast/ast.stub', 'ast\\flags\\CLASS_TRAIT' => 'ast/ast.stub', 'ast\\flags\\CLOSURE_USE_REF' => 'ast/ast.stub', 'ast\\flags\\DIM_ALTERNATIVE_SYNTAX' => 'ast/ast.stub', 'ast\\flags\\EXEC_EVAL' => 'ast/ast.stub', 'ast\\flags\\EXEC_INCLUDE' => 'ast/ast.stub', 'ast\\flags\\EXEC_INCLUDE_ONCE' => 'ast/ast.stub', 'ast\\flags\\EXEC_REQUIRE' => 'ast/ast.stub', 'ast\\flags\\EXEC_REQUIRE_ONCE' => 'ast/ast.stub', 'ast\\flags\\FUNC_GENERATOR' => 'ast/ast.stub', 'ast\\flags\\FUNC_RETURNS_REF' => 'ast/ast.stub', 'ast\\flags\\MAGIC_CLASS' => 'ast/ast.stub', 'ast\\flags\\MAGIC_DIR' => 'ast/ast.stub', 'ast\\flags\\MAGIC_FILE' => 'ast/ast.stub', 'ast\\flags\\MAGIC_FUNCTION' => 'ast/ast.stub', 'ast\\flags\\MAGIC_LINE' => 'ast/ast.stub', 'ast\\flags\\MAGIC_METHOD' => 'ast/ast.stub', 'ast\\flags\\MAGIC_NAMESPACE' => 'ast/ast.stub', 'ast\\flags\\MAGIC_TRAIT' => 'ast/ast.stub', 'ast\\flags\\MODIFIER_ABSTRACT' => 'ast/ast.stub', 'ast\\flags\\MODIFIER_FINAL' => 'ast/ast.stub', 'ast\\flags\\MODIFIER_PRIVATE' => 'ast/ast.stub', 'ast\\flags\\MODIFIER_PROTECTED' => 'ast/ast.stub', 'ast\\flags\\MODIFIER_PUBLIC' => 'ast/ast.stub', 'ast\\flags\\MODIFIER_STATIC' => 'ast/ast.stub', 'ast\\flags\\NAME_FQ' => 'ast/ast.stub', 'ast\\flags\\NAME_NOT_FQ' => 'ast/ast.stub', 'ast\\flags\\NAME_RELATIVE' => 'ast/ast.stub', 'ast\\flags\\PARAM_MODIFIER_PRIVATE' => 'ast/ast.stub', 'ast\\flags\\PARAM_MODIFIER_PROTECTED' => 'ast/ast.stub', 'ast\\flags\\PARAM_MODIFIER_PUBLIC' => 'ast/ast.stub', 'ast\\flags\\PARAM_REF' => 'ast/ast.stub', 'ast\\flags\\PARAM_VARIADIC' => 'ast/ast.stub', 'ast\\flags\\PARENTHESIZED_CONDITIONAL' => 'ast/ast.stub', 'ast\\flags\\RETURNS_REF' => 'ast/ast.stub', 'ast\\flags\\TYPE_ARRAY' => 'ast/ast.stub', 'ast\\flags\\TYPE_BOOL' => 'ast/ast.stub', 'ast\\flags\\TYPE_CALLABLE' => 'ast/ast.stub', 'ast\\flags\\TYPE_DOUBLE' => 'ast/ast.stub', 'ast\\flags\\TYPE_FALSE' => 'ast/ast.stub', 'ast\\flags\\TYPE_ITERABLE' => 'ast/ast.stub', 'ast\\flags\\TYPE_LONG' => 'ast/ast.stub', 'ast\\flags\\TYPE_MIXED' => 'ast/ast.stub', 'ast\\flags\\TYPE_NULL' => 'ast/ast.stub', 'ast\\flags\\TYPE_OBJECT' => 'ast/ast.stub', 'ast\\flags\\TYPE_STATIC' => 'ast/ast.stub', 'ast\\flags\\TYPE_STRING' => 'ast/ast.stub', 'ast\\flags\\TYPE_VOID' => 'ast/ast.stub', 'ast\\flags\\UNARY_BITWISE_NOT' => 'ast/ast.stub', 'ast\\flags\\UNARY_BOOL_NOT' => 'ast/ast.stub', 'ast\\flags\\UNARY_MINUS' => 'ast/ast.stub', 'ast\\flags\\UNARY_PLUS' => 'ast/ast.stub', 'ast\\flags\\UNARY_SILENCE' => 'ast/ast.stub', 'ast\\flags\\USE_CONST' => 'ast/ast.stub', 'ast\\flags\\USE_FUNCTION' => 'ast/ast.stub', 'ast\\flags\\USE_NORMAL' => 'ast/ast.stub', 'bgrBLACK' => 'winbinder/winbinder.stub', 'bgrBLUE' => 'winbinder/winbinder.stub', 'bgrCYAN' => 'winbinder/winbinder.stub', 'bgrDARKBLUE' => 'winbinder/winbinder.stub', 'bgrDARKCYAN' => 'winbinder/winbinder.stub', 'bgrDARKGRAY' => 'winbinder/winbinder.stub', 'bgrDARKGREEN' => 'winbinder/winbinder.stub', 'bgrDARKMAGENTA' => 'winbinder/winbinder.stub', 'bgrDARKRED' => 'winbinder/winbinder.stub', 'bgrDARKYELLOW' => 'winbinder/winbinder.stub', 'bgrGREEN' => 'winbinder/winbinder.stub', 'bgrLIGHTGRAY' => 'winbinder/winbinder.stub', 'bgrMAGENTA' => 'winbinder/winbinder.stub', 'bgrNOCOLOR' => 'winbinder/winbinder.stub', 'bgrRED' => 'winbinder/winbinder.stub', 'bgrWHITE' => 'winbinder/winbinder.stub', 'bgrYELLOW' => 'winbinder/winbinder.stub', 'false' => 'Core/Core_d.stub', 'http\\Client\\Curl\\AUTH_ANY' => 'http/http3.stub', 'http\\Client\\Curl\\AUTH_BASIC' => 'http/http3.stub', 'http\\Client\\Curl\\AUTH_DIGEST' => 'http/http3.stub', 'http\\Client\\Curl\\AUTH_DIGEST_IE' => 'http/http3.stub', 'http\\Client\\Curl\\AUTH_GSSNEG' => 'http/http3.stub', 'http\\Client\\Curl\\AUTH_NTLM' => 'http/http3.stub', 'http\\Client\\Curl\\AUTH_SPNEGO' => 'http/http3.stub', 'http\\Client\\Curl\\FEATURES' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\ASYNCHDNS' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\GSSAPI' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\GSSNEGOTIATE' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\HTTP2' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\IDN' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\IPV6' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\KERBEROS4' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\KERBEROS5' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\LARGEFILE' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\LIBZ' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\NTLM' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\NTLM_WB' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\PSL' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\SPNEGO' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\SSL' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\SSPI' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\TLSAUTH_SRP' => 'http/http3.stub', 'http\\Client\\Curl\\Features\\UNIX_SOCKETS' => 'http/http3.stub', 'http\\Client\\Curl\\HTTP_VERSION_1_0' => 'http/http3.stub', 'http\\Client\\Curl\\HTTP_VERSION_1_1' => 'http/http3.stub', 'http\\Client\\Curl\\HTTP_VERSION_2TLS' => 'http/http3.stub', 'http\\Client\\Curl\\HTTP_VERSION_2_0' => 'http/http3.stub', 'http\\Client\\Curl\\HTTP_VERSION_ANY' => 'http/http3.stub', 'http\\Client\\Curl\\IPRESOLVE_ANY' => 'http/http3.stub', 'http\\Client\\Curl\\IPRESOLVE_V4' => 'http/http3.stub', 'http\\Client\\Curl\\IPRESOLVE_V6' => 'http/http3.stub', 'http\\Client\\Curl\\POSTREDIR_301' => 'http/http3.stub', 'http\\Client\\Curl\\POSTREDIR_302' => 'http/http3.stub', 'http\\Client\\Curl\\POSTREDIR_303' => 'http/http3.stub', 'http\\Client\\Curl\\POSTREDIR_ALL' => 'http/http3.stub', 'http\\Client\\Curl\\PROXY_HTTP' => 'http/http3.stub', 'http\\Client\\Curl\\PROXY_HTTP_1_0' => 'http/http3.stub', 'http\\Client\\Curl\\PROXY_SOCKS4' => 'http/http3.stub', 'http\\Client\\Curl\\PROXY_SOCKS4A' => 'http/http3.stub', 'http\\Client\\Curl\\PROXY_SOCKS5' => 'http/http3.stub', 'http\\Client\\Curl\\PROXY_SOCKS5_HOSTNAME' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_ANY' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_SSLv2' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_SSLv3' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_TLSv1' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_TLSv1_0' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_TLSv1_1' => 'http/http3.stub', 'http\\Client\\Curl\\SSL_VERSION_TLSv1_2' => 'http/http3.stub', 'http\\Client\\Curl\\TLSAUTH_SRP' => 'http/http3.stub', 'http\\Client\\Curl\\VERSIONS' => 'http/http3.stub', 'http\\Client\\Curl\\Versions\\ARES' => 'http/http3.stub', 'http\\Client\\Curl\\Versions\\CURL' => 'http/http3.stub', 'http\\Client\\Curl\\Versions\\IDN' => 'http/http3.stub', 'http\\Client\\Curl\\Versions\\LIBZ' => 'http/http3.stub', 'http\\Client\\Curl\\Versions\\SSL' => 'http/http3.stub', 'null' => 'Core/Core_d.stub', 'pcov\\all' => 'pcov/pcov.stub', 'pcov\\exclusive' => 'pcov/pcov.stub', 'pcov\\inclusive' => 'pcov/pcov.stub', 'pcov\\version' => 'pcov/pcov.stub', 'true' => 'Core/Core_d.stub', 'yaf\\environ' => 'yaf/yaf_namespace.stub', 'yaf\\err\\autoload\\failed' => 'yaf/yaf_namespace.stub', 'yaf\\err\\call\\failed' => 'yaf/yaf_namespace.stub', 'yaf\\err\\dispatch\\failed' => 'yaf/yaf_namespace.stub', 'yaf\\err\\notfound\\action' => 'yaf/yaf_namespace.stub', 'yaf\\err\\notfound\\controller' => 'yaf/yaf_namespace.stub', 'yaf\\err\\notfound\\module' => 'yaf/yaf_namespace.stub', 'yaf\\err\\notfound\\view' => 'yaf/yaf_namespace.stub', 'yaf\\err\\route\\failed' => 'yaf/yaf_namespace.stub', 'yaf\\err\\startup\\failed' => 'yaf/yaf_namespace.stub', 'yaf\\err\\type\\error' => 'yaf/yaf_namespace.stub', 'yaf\\version' => 'yaf/yaf_namespace.stub', 'yaf_environ' => 'yaf/yaf.stub', 'yaf_err_autoload_failed' => 'yaf/yaf.stub', 'yaf_err_call_failed' => 'yaf/yaf.stub', 'yaf_err_dispatch_failed' => 'yaf/yaf.stub', 'yaf_err_notfound_action' => 'yaf/yaf.stub', 'yaf_err_notfound_controller' => 'yaf/yaf.stub', 'yaf_err_notfound_module' => 'yaf/yaf.stub', 'yaf_err_notfound_view' => 'yaf/yaf.stub', 'yaf_err_route_failed' => 'yaf/yaf.stub', 'yaf_err_startup_failed' => 'yaf/yaf.stub', 'yaf_err_type_error' => 'yaf/yaf.stub', 'yaf_version' => 'yaf/yaf.stub'); } ***NOTE***: * If pq\Connection::$unbuffered is TRUE, each call to pq\Connection::getResult() will generate a distinct pq\Result containing exactly one row. * * @param string $name The identifying name of the cursor. * @param int $flags Any combination of pq\Cursor constants. * @param string $query The query for which to open a cursor. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\BadMethodCallException * @return \pq\Cursor an open cursor instance. */ public function declareAsync(string $name, int $flags, string $query) {} /** * Escape binary data for use within a query with the type bytea. * * ***NOTE:*** * The result is not wrapped in single quotes. * * @param string $binary The binary data to escape. * @throws \pq\Exception\BadMethodCallException * @return string|false string the escaped binary data. * or FALSE if escaping fails. */ public function escapeBytea(string $binary) {} /** * [Execute one or multiple SQL queries](pq/Connection/: Executing Queries) on the connection. * * ***NOTE:*** * Only the last result will be returned, if the query string contains more than one SQL query. * * @param string $query The queries to send to the server, separated by semi-colon. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException * @return \pq\Result */ public function exec(string $query) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) [execute an SQL query](pq/Connection: Executing Queries) on the connection. * * > ***NOTE***: * If pq\Connection::$unbuffered is TRUE, each call to pq\Connection::getResult() will generate a distinct pq\Result containing exactly one row. * * @param string $query The query to send to the server. * @param callable $callback as function(pq\Result $res) * The callback to execute when the query finishes. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function execAsync(string $query, callable $callback = null) {} /** * [Execute an SQL query](pq/Connection: Executing Queries) with properly escaped parameters substituted. * * @param string $query The query to execute. * @param array $params The parameter list to substitute. * @param array $types Corresponding list of type OIDs for the parameters. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException * @return \pq\Result */ public function execParams(string $query, array $params, array $types = null) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) [execute an SQL query](pq/Connection: Executing Queries) with properly escaped parameters substituted. * * > ***NOTE***: * If pq\Connection::$unbuffered is TRUE, each call to pq\Connection::getResult() will generate a distinct pq\Result containing exactly one row. * * @param string $query The query to execute. * @param array $params The parameter list to substitute. * @param array $types Corresponding list of type OIDs for the parameters. * @param callable $cb as function(\pq\Result $res) : void * Result handler callback. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\BadMethodCallException */ public function execParamsAsync(string $query, array $params, array $types = null, callable $cb = null) {} /** * Flush pending writes on the connection. * Call after sending any command or data on a nonblocking connection. * * If it returns FALSE, wait for the socket to become read or write-ready. * If it becomes write-ready, call pq\Connection::flush() again. * If it becomes read-ready, call pq\Connection::poll(), then call pq\Connection::flush() again. * Repeat until pq\Connection::flush() returns TRUE. * * ***NOTE:*** * This method was added in v1.1.0, resp. v2.1.0. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\RuntimeException * @return bool whether everything has been flushed. */ public function flush() {} /** * Fetch the result of an [asynchronous](pq/Connection/: Asynchronous Usage) query. * * If the query hasn't finished yet, the call will block until the result is available. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return \pq\Result|null NULL if there has not been a query * or \pq\Result when the query has finished */ public function getResult() {} /** * Listen on $channel for notifications. * See pq\Connection::unlisten(). * * @param string $channel The channel to listen on. * @param callable $listener as function(string $channel, string $message, int $pid) * A callback automatically called whenever a notification on $channel arrives. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function listen(string $channel, callable $listener) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) start listening on $channel for notifications. * See pq\Connection::listen(). * * @param string $channel The channel to listen on. * @param callable $listener as function(string $channel, string $message, int $pid) * A callback automatically called whenever a notification on $channel arrives. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function listenAsync(string $channel, callable $listener) {} /** * Notify all listeners on $channel with $message. * * @param string $channel The channel to notify. * @param string $message The message to send. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function notify(string $channel, string $message) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) start notifying all listeners on $channel with $message. * * @param string $channel The channel to notify. * @param string $message The message to send. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function notifyAsync(string $channel, string $message) {} /** * Stops listening for an event type. * * @param string $event Any pq\Connection::EVENT_*. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return bool success. */ public function off(string $event) {} /** * Listen for an event. * * @param string $event Any pq\Connection::EVENT_*. * @param callable $callback as function(pq\Connection $c[, pq\Result $r) * The callback to invoke on event. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return int number of previously attached event listeners. */ public function on(string $event, callable $callback) {} /** * Poll an [asynchronously](pq/Connection/: Asynchronous Usage) operating connection. * See pq\Connection::resetAsync() for an usage example. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\BadMethodCallException * @return int pq\Connection::POLLING_* constant */ public function poll() {} /** * Prepare a named statement for later execution with pq\Statement::execute(). * * @param string $name The identifying name of the prepared statement. * @param string $query The query to prepare. * @param array $types An array of type OIDs for the substitution parameters. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\Statement a prepared statement instance. */ public function prepare(string $name, string $query, array $types = null) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) prepare a named statement for later execution with pq\Statement::exec(). * * > ***NOTE***: * If pq\Connection::$unbuffered is TRUE, each call to pq\Connection::getResult() will generate a distinct pq\Result containing exactly one row. * * @param string $name The identifying name of the prepared statement. * @param string $query The query to prepare. * @param array $types An array of type OIDs for the substitution parameters. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\Statement a prepared statement instance. */ public function prepareAsync(string $name, string $query, array $types = null) {} /** * Quote a string for safe use in a query. * The result is truncated at any zero byte and wrapped in single quotes. * * ***NOTE:*** * Beware of matching character encodings. * * @param string $payload The payload to quote for use in a query. * @throws \pq\Exception\BadMethodCallException * @return string|false string a single-quote wrapped string safe for literal use in a query. * or FALSE if quoting fails. */ public function quote(string $payload) {} /** * Quote an identifier for safe usage as name. * * ***NOTE:*** * Beware of case-sensitivity. * * @param string $name The name to quote. * @throws \pq\Exception\BadMethodCallException * @return string|false string the quoted identifier. * or FALSE if quoting fails. */ public function quoteName(string $name) {} /** * Attempt to reset a possibly broken connection to a working state. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function reset() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) reset a possibly broken connection to a working state. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function resetAsync() {} /** * Set a data type converter. * * @param \pq\Converter $converter An instance implementing pq\Converter. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException */ public function setConverter(Converter $converter) {} /** * Begin a transaction. * * @param int $isolation Any pq\Transaction isolation level constant * (defaults to pq\Connection::$defaultTransactionIsolation). * @param bool $readonly Whether the transaction executes only reads * (defaults to pq\Connection::$defaultTransactionReadonly). * @param bool $deferrable Whether the transaction is deferrable * (defaults to pq\Connection::$defaultTransactionDeferrable). * * ***NOTE:*** * A transaction can only be deferrable if it also is readonly and serializable. * See the official [PostgreSQL documentation](http://www.postgresql.org/docs/current/static/sql-set-transaction.html) for further information. * * @return \pq\Transaction a begun transaction instance. * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\InvalidArgumentException */ public function startTransaction(int $isolation = \pq\Transaction::READ_COMMITTED, bool $readonly = false, bool $deferrable = false) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) begin a transaction. * * @param int $isolation Any pq\Transaction isolation level constant * (defaults to pq\Connection::$defaultTransactionIsolation). * @param bool $readonly Whether the transaction executes only reads * (defaults to pq\Connection::$defaultTransactionReadonly). * @param bool $deferrable Whether the transaction is deferrable * (defaults to pq\Connection::$defaultTransactionDeferrable). * * ***NOTE:*** * A transaction can only be deferrable if it also is readonly and serializable. * See the official [PostgreSQL documentation](http://www.postgresql.org/docs/current/static/sql-set-transaction.html) for further information. * * @return \pq\Transaction an asynchronously begun transaction instance. * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\InvalidArgumentException */ public function startTransactionAsync(int $isolation = \pq\Transaction::READ_COMMITTED, bool $readonly = false, bool $deferrable = false) {} /** * Trace protocol communication with the server. * * ***NOTE:*** * Calling pq\Connection::trace() without argument or NULL stops tracing. * * @param resource $stream The resource to which the protocol trace will be output. * (The stream must be castable to STDIO). * @throws \pq\Exception\BadMethodCallException * @return bool success. */ public function trace($stream = null) {} /** * Unescape bytea data retrieved from the server. * * @param string $bytea Bytea data retrieved from the server. * @throws \pq\Exception\BadMethodCallException * @return string|false string unescaped binary data. * or FALSE if unescaping fails. */ public function unescapeBytea(string $bytea) {} /** * Stop listening for notifications on channel $channel. * See pq\Connection::listen(). * * @param string $channel The name of a channel which is currently listened on. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function unlisten(string $channel) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) stop listening for notifications on channel $channel. * See pq\Connection::unlisten() and pq\Connection::listenAsync(). * * @param string $channel The name of a channel which is currently listened on. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function unlistenAsync(string $channel) {} /** * Stop applying a data type converter. * * @param \pq\Converter $converter A converter previously set with pq\Connection::setConverter(). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException */ public function unsetConverter(Converter $converter) {} } /** * Interface for type conversions. */ interface Converter { /** * Convert a string received from the PostgreSQL server back to a PHP type. * * @param string $data String data received from the server. * @param int $type The type OID of the data. Irrelevant for single-type converters. * @return mixed the value converted to a PHP type. */ public function convertFromString(string $data, int $type); /** * Convert a value to a string for use in a query. * * @param mixed $value The PHP value which should be converted to a string. * @param int $type The type OID the converter should handle. Irrelevant for singly-type converters. * @return string a textual representation of the value accepted by the PostgreSQL server. */ public function convertToString($value, int $type); /** * Announce which types the implementing converter can handle. * * @return array OIDs of handled types. */ public function convertTypes(); } /** * Declare a cursor. */ class Cursor { /** * Causes the cursor to return data in binary rather than in text format. You probably do not want to use that. */ public const BINARY = 1; /** * The data returned by the cursor should be unaffected by updates to the tables underlying the cursor that take place after the cursor was opened. */ public const INSENSITIVE = 2; /** * The cursor should stay usable after the transaction that created it was successfully committed. */ public const WITH_HOLD = 4; /** * Force that rows can be retrieved in any order from the cursor. */ public const SCROLL = 16; /** * Force that rows are only retrievable in sequiential order. * * ***NOTE:*** * See the [notes in the official PostgreSQL documentation](http://www.postgresql.org/docs/current/static/sql-declare.html#SQL-DECLARE-NOTES) for more information. */ public const NO_SCROLL = 32; /** * The connection the cursor was declared on. * * @public * @readonly * @var \pq\Connection */ public $connection; /** * The identifying name of the cursor. * * @public * @readonly * @var string */ public $name; /** * Declare a cursor. * See pq\Connection::declare(). * * @param \pq\Connection $connection The connection on which the cursor should be declared. * @param string $name The name of the cursor. * @param int $flags See pq\Cursor constants. * @param string $query The query for which the cursor should be opened. * @param bool $async Whether to declare the cursor [asynchronously](pq/Connection/: Asynchronous Usage). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function __construct(Connection $connection, string $name, int $flags, string $query, bool $async) {} /** * Close an open cursor. * This is a no-op on already closed cursors. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function close() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) close an open cursor. * See pq\Cursor::close(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function closeAsync() {} /** * Fetch rows from the cursor. * See pq\Cursor::move(). * * @param string $spec What to fetch. * * ### Fetch argument: * * FETCH and MOVE usually accepts arguments like the following, where `count` is the number of rows: * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\Result the fetched row(s). */ public function fetch(string $spec = "1") {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) fetch rows from the cursor. * See pq\Cursor::fetch(). * * @param string $spec What to fetch. * @param callable $callback as function(pq\Result $res) * A callback to execute when the result is ready. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function fetchAsync(string $spec = "1", callable $callback = null) {} /** * Move the cursor. * See pq\Cursor::fetch(). * * @param string $spec What to fetch. * * ### Fetch argument: * * FETCH and MOVE usually accepts arguments like the following, where `count` is the number of rows: * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\Result command status. */ public function move(string $spec = "1") {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) move the cursor. * See pq\Cursor::move(). * * @param string $spec What to fetch. * @param callable $callback as function(pq\Result $res) * A callback to execute when the command completed. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function moveAsync(string $spec = "1", callable $callback = null) {} /** * Reopen a cursor. * This is a no-op on already open cursors. * * ***NOTE:*** * Only cursors closed by pq\Cursor::close() will be reopened. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function open() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) reopen a cursor. * See pq\Cursor::open(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function openAsync() {} } /** * A simple DateTime wrapper with predefined formats which supports stringification and JSON. */ class DateTime extends \DateTime implements \JsonSerializable { /** * The default format of any date/time type automatically converted by pq\Result (depends on the actual type of the column). * * @public * @var string */ public $format = "Y-m-d H:i:s.uO"; /** * Stringify the DateTime instance according to pq\DateTime::$format. * * @return string the DateTime as string. */ public function __toString() {} /** * Serialize to JSON. * Alias of pq\DateTime::__toString(). * * @return string the DateTime stringified according to pq\DateTime::$format. */ public function jsonSerialize() {} } /** * A base interface for all pq\Exception classes. */ interface Exception { /** * An invalid argument was passed to a method (pq\Exception\InvalidArgumentException). */ public const INVALID_ARGUMENT = 0; /** * A runtime exception occurred (pq\Exception\RuntimeException). */ public const RUNTIME = 1; /** * The connection failed (pq\Exception\RuntimeException). */ public const CONNECTION_FAILED = 2; /** * An input/output exception occurred (pq\Exception\RuntimeException). */ public const IO = 3; /** * Escaping an argument or identifier failed internally (pq\Exception\RuntimeException). */ public const ESCAPE = 4; /** * An object's constructor was not called (pq\Exception\BadMethodCallException). */ public const UNINITIALIZED = 6; /** * Calling this method was not expected (yet) (pq\Exception\BadMethodCallException). */ public const BAD_METHODCALL = 5; /** * SQL syntax error (pq\Exception\DomainException). */ public const SQL = 8; /** * Implementation domain error (pq\Exception\DomainException). */ public const DOMAIN = 7; } /** * A *large object*. * * ***NOTE:*** * Working with *large objects* requires an active transaction. */ class LOB { /** * 0, representing an invalid OID. */ public const INVALID_OID = 0; /** * Read/write mode. */ public const RW = 393216; /** * The transaction wrapping the operations on the *large object*. * * @public * @readonly * @var \pq\Transaction */ public $transaction; /** * The OID of the *large object*. * * @public * @readonly * @var int */ public $oid; /** * The stream connected to the *large object*. * * @public * @readonly * @var resource */ public $stream; /** * Open or create a *large object*. * See pq\Transaction::openLOB() and pq\Transaction::createLOB(). * * @param \pq\Transaction $txn The transaction which wraps the *large object* operations. * @param int $oid The OID of the existing *large object* to open. * @param int $mode Access mode (read, write or read/write). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function __construct(Transaction $txn, int $oid = \pq\LOB::INVALID_OID, int $mode = \pq\LOB::RW) {} /** * Read a string of data from the current position of the *large object*. * * @param int $length The amount of bytes to read from the *large object*. * @param int &$read The amount of bytes actually read from the *large object*. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return string the data read. */ public function read(int $length = 0x1000, int &$read = null) {} /** * Seek to a position within the *large object*. * * @param int $offset The position to seek to. * @param int $whence From where to seek (SEEK_SET, SEEK_CUR or SEEK_END). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return int the new position. */ public function seek(int $offset, int $whence = SEEK_SET) {} /** * Retrieve the current position within the *large object*. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return int the current position. */ public function tell() {} /** * Truncate the *large object*. * * @param int $length The length to truncate to. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function truncate(int $length = 0) {} /** * Write data to the *large object*. * * @param string $data The data that should be written to the current position. * @return int the number of bytes written. */ public function write(string $data) {} } /** * A query result. * * See [Fetching Results](pq/Result/: Fetching Results) for a general overview. */ class Result implements \Traversable, \Countable { /** * The query sent to the server was empty. */ public const EMPTY_QUERY = 0; /** * The query did not generate a result set and completed successfully. */ public const COMMAND_OK = 1; /** * The query successfully generated a result set. */ public const TUPLES_OK = 2; /** * The result contains a single row of the result set when using pq\Connection::$unbuffered. */ public const SINGLE_TUPLE = 9; /** * COPY data can be received from the server. */ public const COPY_OUT = 3; /** * COPY data can be sent to the server. */ public const COPY_IN = 4; /** * COPY in/out data transfer in progress. */ public const COPY_BOTH = 8; /** * The server sent a bad response. */ public const BAD_RESPONSE = 5; /** * A nonfatal error (notice or warning) occurred. */ public const NONFATAL_ERROR = 6; /** * A fatal error occurred. */ public const FATAL_ERROR = 7; /** * Fetch rows numerically indexed, where the index start with 0. */ public const FETCH_ARRAY = 0; /** * Fetch rows associatively indexed by column name. */ public const FETCH_ASSOC = 1; /** * Fetch rows as stdClass instance, where the column names are the property names. */ public const FETCH_OBJECT = 2; /** * Automatically convert 'f' and 't' to FALSE and TRUE and vice versa. */ public const CONV_BOOL = 1; /** * Automatically convert integral strings to either int if it fits into maximum integer size or else to float and vice versa. */ public const CONV_INT = 2; /** * Automatically convert floating point numbers. */ public const CONV_FLOAT = 4; /** * Do all scalar conversions listed above. */ public const CONV_SCALAR = 15; /** * Automatically convert arrays. */ public const CONV_ARRAY = 16; /** * Automatically convert date strings to pq\DateTime and vice versa. */ public const CONV_DATETIME = 32; /** * Automatically convert JSON. */ public const CONV_JSON = 256; /** * Do all of the above. */ public const CONV_ALL = 65535; /** * A [status constant](pq/Result#Status.values:). * * @public * @readonly * @var int */ public $status; /** * The accompanying status message. * * @public * @readonly * @var string */ public $statusMessage; /** * Any error message if $status indicates an error. * * @public * @readonly * @var string */ public $errorMessage; /** * The number of rows in the result set. * * @public * @readonly * @var int */ public $numRows; /** * The number of fields in a single tuple of the result set. * * @public * @readonly * @var int */ public $numCols; /** * The number of rows affected by a statement. * * @public * @readonly * @var int */ public $affectedRows; /** * Error details. See [PQresultErrorField](https://www.postgresql.org/docs/current/static/libpq-exec.html#LIBPQ-PQRESULTERRORFIELD) docs. * * @public * @readonly * @var array */ public $diag; /** * The [type of return value](pq/Result#Fetch.types:) the fetch methods should return when no fetch type argument was given. Defaults to pq\Connection::$defaultFetchType. * * @public * @var int */ public $fetchType = \pq\Result::FETCH_ARRAY; /** * What [type of conversions](pq/Result#Conversion.bits:) to perform automatically. * * @public * @var int */ public $autoConvert = \pq\Result::CONV_ALL; /** * Bind a variable to a result column. * See pq\Result::fetchBound(). * * @param mixed $col The column name or index to bind to. * @param mixed $var The variable reference. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return bool success. */ public function bind($col, $var) {} /** * Count number of rows in this result set. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return int the number of rows. */ public function count() {} /** * Describe a prepared statement. * * ***NOTE:*** * This will only return meaningful information for a result of pq\Statement::desc(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return array list of parameter type OIDs for the prepared statement. */ public function desc() {} /** * Fetch all rows at once. * * @param int $fetch_type The type the return value should have, see pq\Result::FETCH_* constants, defaults to pq\Result::$fetchType. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @return array all fetched rows. */ public function fetchAll(int $fetch_type = null) {} /** * Fetch all rows of a single column. * * @param int $col The column name or index to fetch. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return array list of column values. */ public function fetchAllCols(int $col = 0) {} /** * Iteratively fetch a row into bound variables. * See pq\Result::bind(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return array|null array the fetched row as numerically indexed array. * or NULL when iteration ends. */ public function fetchBound() {} /** * Iteratively fetch a single column. * * @param mixed $ref The variable where the column value will be stored in. * @param mixed $col The column name or index. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return bool|null bool success. * or NULL when iteration ends. */ public function fetchCol($ref, $col = 0) {} /** * Iteratively fetch a row. * * @param int $fetch_type The type the return value should have, see pq\Result::FETCH_* constants, defaults to pq\Result::$fetchType. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return array|array|object|null array numerically indexed for pq\Result::FETCH_ARRAY * or array associatively indexed for pq\Result::FETCH_ASSOC * or object stdClass instance for pq\Result::FETCH_OBJECT * or NULL when iteration ends. */ public function fetchRow(int $fetch_type = null) {} /** * Fetch the complete result set as a simple map, a *multi dimensional array*, each dimension indexed by a column. * * @param mixed $keys The the column indices/names used to index the map. * @param mixed $vals The column indices/names which should build up the leaf entry of the map. * @param int $fetch_type The type the return value should have, see pq\Result::FETCH_* constants, defaults to pq\Result::$fetchType. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return array|object the mapped columns. */ public function map($keys = 0, $vals = null, int $fetch_type = null) {} } /** * A named prepared statement. * See pq\Connection::prepare(). */ class Statement { /** * The connection to the server. * * @public * @readonly * @var \pq\Connection */ public $connection; /** * The identifiying name of the prepared statement. * * @public * @readonly * @var string */ public $name; /** * The query string used to prepare the statement. * * @public * @readonly * @var string */ public $query; /** * List of corresponding query parameter type OIDs for the prepared statement. * * @public * @readonly * @var array */ public $types; /** * Prepare a new statement. * See pq\Connection::prepare(). * * @param \pq\Connection $conn The connection to prepare the statement on. * @param string $name The name identifying this statement. * @param string $query The actual query to prepare. * @param array $types A list of corresponding query parameter type OIDs. * @param bool $async Whether to prepare the statement [asynchronously](pq/Connection/: Asynchronous Usage). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException */ public function __construct(Connection $conn, string $name, string $query, array $types = null, bool $async = false) {} /** * Bind a variable to an input parameter. * * @param int $param_no The parameter index to bind to. * @param mixed &$param_ref The variable to bind. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException */ public function bind(int $param_no, &$param_ref) {} /** * Free the server resources used by the prepared statement, so it can no longer be executed. * This is done implicitly when the object is destroyed. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function deallocate() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) free the server resources used by the * prepared statement, so it can no longer be executed. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function deallocateAsync() {} /** * Describe the parameters of the prepared statement. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException * @return array list of type OIDs of the substitution parameters. */ public function desc() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) describe the parameters of the prepared statement. * * @param callable $callback as function(array $oids) * A callback to receive list of type OIDs of the substitution parameters. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function descAsync(callable $callback) {} /** * Execute the prepared statement. * * @param array $params Any parameters to substitute in the prepared statement (defaults to any bou * nd variables). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\Result the result of the execution of the prepared statement. */ public function exec(array $params = null) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) execute the prepared statement. * * @param array $params Any parameters to substitute in the prepared statement (defaults to any bou * nd variables). * @param callable $cb as function(\pq\Result $res) : void * Result handler callback. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function execAsync(array $params = null, callable $cb = null) {} /** * Re-prepare a statement that has been deallocated. This is a no-op on already open statements. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function prepare() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) re-prepare a statement that has been * deallocated. This is a no-op on already open statements. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function prepareAsync() {} } /** * A database transaction. * * ***NOTE:*** * Transactional properties like pq\Transaction::$isolation, pq\Transaction::$readonly and pq\Transaction::$deferrable can be changed after the transaction begun and the first query has been executed. Doing this will lead to appropriate `SET TRANSACTION` queries. */ class Transaction { /** * Transaction isolation level where only rows committed before the transaction began can be seen. */ public const READ_COMMITTED = 0; /** * Transaction isolation level where only rows committed before the first query was executed in this transaction. */ public const REPEATABLE_READ = 1; /** * Transaction isolation level that guarantees serializable repeatability which might lead to serialization_failure on high concurrency. */ public const SERIALIZABLE = 2; /** * The connection the transaction was started on. * * @public * @readonly * @var \pq\Connection */ public $connection; /** * The transaction isolation level. * * @public * @var int */ public $isolation = \pq\Transaction::READ_COMMITTED; /** * Whether this transaction performs read only queries. * * @public * @var bool */ public $readonly = false; /** * Whether the transaction is deferrable. See pq\Connection::startTransaction(). * * @public * @var bool */ public $deferrable = false; /** * Start a transaction. * See pq\Connection::startTransaction(). * * @param \pq\Connection $conn The connection to start the transaction on. * @param bool $async Whether to start the transaction [asynchronously](pq/Connection/: Asynchronous Usage). * @param int $isolation The transaction isolation level (defaults to pq\Connection::$defaultTransactionIsolation). * @param bool $readonly Whether the transaction is readonly (defaults to pq\Connection::$defaultTransactionReadonly). * @param bool $deferrable Whether the transaction is deferrable (defaults to pq\Connection::$defaultTransactionDeferrable). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function __construct(Connection $conn, bool $async = false, int $isolation = \pq\Transaction::READ_COMMITTED, bool $readonly = false, bool $deferrable = false) {} /** * Commit the transaction or release the previous savepoint. * See pq\Transaction::savepoint(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException */ public function commit() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) commit the transaction or release the previous savepoint. * See pq\Transaction::commit() and pq\Transaction::savepoint(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function commitAsync() {} /** * Create a new *large object* and open it. * See pq\Transaction::openLOB(). * * @param int $mode How to open the *large object* (read, write or both; see pq\LOB constants). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\LOB instance of the new *large object*. */ public function createLOB(int $mode = \pq\LOB::RW) {} /** * Export a *large object* to a local file. * See pq\Transaction::importLOB(). * * @param int $oid The OID of the *large object*. * @param string $path The path of a local file to export to. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function exportLOB(int $oid, string $path) {} /** * Export a snapshot for transaction synchronization. * See pq\Transaction::importSnapshot(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException * @return string the snapshot identifier usable with pq\Transaction::importSnapshot(). */ public function exportSnapshot() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) export a snapshot for transaction synchronization. * See pq\Transaction::exportSnapshot(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function exportSnapshotAsync() {} /** * Import a local file into a *large object*. * * @param string $local_path A path to a local file to import. * @param int $oid The target OID. A new *large object* will be created if INVALID_OID. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return int the (new) OID of the *large object*. */ public function importLOB(string $local_path, int $oid = \pq\LOB::INVALID_OID) {} /** * Import a snapshot from another transaction to synchronize with. * See pq\Transaction::exportSnapshot(). * * ***NOTE:*** * The transaction must have an isolation level of at least pq\Transaction::REPEATABLE_READ. * * @param string $snapshot_id The snapshot identifier obtained by exporting a snapshot from a transaction. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException */ public function importSnapshot(string $snapshot_id) {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) import a snapshot from another transaction to synchronize with. * See pq\Transaction::importSnapshot(). * * ***NOTE:*** * The transaction must have an isolation level of at least pq\Transaction::REPEATABLE_READ. * * @param string $snapshot_id The snapshot identifier obtained by exporting a snapshot from a transaction. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function importSnapshotAsync(string $snapshot_id) {} /** * Open a *large object*. * See pq\Transaction::createLOB(). * * @param int $oid The OID of the *large object*. * @param int $mode Operational mode; read, write or both. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\LOB instance of the opened *large object*. */ public function openLOB(int $oid, int $mode = \pq\LOB::RW) {} /** * Rollback the transaction or to the previous savepoint within this transaction. * See pq\Transaction::commit() and pq\Transaction::savepoint(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @throws \pq\Exception\DomainException */ public function rollback() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) rollback the transaction or to the previous savepoint within this transaction. * See pq\Transaction::rollback() and pq\Transaction::savepoint(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function rollbackAsync() {} /** * Create a `SAVEPOINT` within this transaction. * * ***NOTE:*** * pq\Transaction tracks an internal counter as savepoint identifier. * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function savepoint() {} /** * [Asynchronously](pq/Connection/: Asynchronous Usage) create a `SAVEPOINT` within this transaction. * See pq\Transaction::savepoint(). * * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function savepointAsync() {} /** * Unlink a *large object*. * See pq\Transaction::createLOB(). * * @param int $oid The OID of the *large object*. * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException * @return \pq\LOB instance of the opened *large object*. */ public function unlinkLOB(int $oid) {} } /** * Accessor to the PostgreSQL `pg_type` relation. * See [here for an overview](pq/Types/: Overview). */ class Types implements \ArrayAccess { /** * OID of the `bool` type. */ public const BOOL = 16; /** * OID of the `bytea` type. */ public const BYTEA = 17; /** * OID of the `char` type. */ public const CHAR = 18; /** * OID of the `name` type. */ public const NAME = 19; /** * OID of the `int8` type. */ public const INT8 = 20; /** * OID of the `int2` type. */ public const INT2 = 21; /** * OID of the `int2vector` type. */ public const INT2VECTOR = 22; /** * OID of the `int4` type. */ public const INT4 = 23; /** * OID of the `regproc` type. */ public const REGPROC = 24; /** * OID of the `text` type. */ public const TEXT = 25; /** * OID of the `oid` type. */ public const OID = 26; /** * OID of the `tid` type. */ public const TID = 27; /** * OID of the `xid` type. */ public const XID = 28; /** * OID of the `cid` type. */ public const CID = 29; /** * OID of the `oidvector` type. */ public const OIDVECTOR = 30; /** * OID of the `pg_type` type. */ public const PG_TYPE = 71; /** * OID of the `pg_attribute` type. */ public const PG_ATTRIBUTE = 75; /** * OID of the `pg_proc` type. */ public const PG_PROC = 81; /** * OID of the `pg_class` type. */ public const PG_CLASS = 83; /** * OID of the `json` type. */ public const JSON = 114; /** * OID of the `xml` type. */ public const XML = 142; /** * OID of the `xmlarray` type. */ public const XMLARRAY = 143; /** * OID of the `jsonarray` type. */ public const JSONARRAY = 199; /** * OID of the `pg_node_tree` type. */ public const PG_NODE_TREE = 194; /** * OID of the `smgr` type. */ public const SMGR = 210; /** * OID of the `point` type. */ public const POINT = 600; /** * OID of the `lseg` type. */ public const LSEG = 601; /** * OID of the `path` type. */ public const PATH = 602; /** * OID of the `box` type. */ public const BOX = 603; /** * OID of the `polygon` type. */ public const POLYGON = 604; /** * OID of the `line` type. */ public const LINE = 628; /** * OID of the `linearray` type. */ public const LINEARRAY = 629; /** * OID of the `float4` type. */ public const FLOAT4 = 700; /** * OID of the `float8` type. */ public const FLOAT8 = 701; /** * OID of the `abstime` type. */ public const ABSTIME = 702; /** * OID of the `reltime` type. */ public const RELTIME = 703; /** * OID of the `tinterval` type. */ public const TINTERVAL = 704; /** * OID of the `unknown` type. */ public const UNKNOWN = 705; /** * OID of the `circle` type. */ public const CIRCLE = 718; /** * OID of the `circlearray` type. */ public const CIRCLEARRAY = 719; /** * OID of the `money` type. */ public const MONEY = 790; /** * OID of the `moneyarray` type. */ public const MONEYARRAY = 791; /** * OID of the `macaddr` type. */ public const MACADDR = 829; /** * OID of the `inet` type. */ public const INET = 869; /** * OID of the `cidr` type. */ public const CIDR = 650; /** * OID of the `boolarray` type. */ public const BOOLARRAY = 1000; /** * OID of the `byteaarray` type. */ public const BYTEAARRAY = 1001; /** * OID of the `chararray` type. */ public const CHARARRAY = 1002; /** * OID of the `namearray` type. */ public const NAMEARRAY = 1003; /** * OID of the `int2array` type. */ public const INT2ARRAY = 1005; /** * OID of the `int2vectorarray` type. */ public const INT2VECTORARRAY = 1006; /** * OID of the `int4array` type. */ public const INT4ARRAY = 1007; /** * OID of the `regprocarray` type. */ public const REGPROCARRAY = 1008; /** * OID of the `textarray` type. */ public const TEXTARRAY = 1009; /** * OID of the `oidarray` type. */ public const OIDARRAY = 1028; /** * OID of the `tidarray` type. */ public const TIDARRAY = 1010; /** * OID of the `xidarray` type. */ public const XIDARRAY = 1011; /** * OID of the `cidarray` type. */ public const CIDARRAY = 1012; /** * OID of the `oidvectorarray` type. */ public const OIDVECTORARRAY = 1013; /** * OID of the `bpchararray` type. */ public const BPCHARARRAY = 1014; /** * OID of the `varchararray` type. */ public const VARCHARARRAY = 1015; /** * OID of the `int8array` type. */ public const INT8ARRAY = 1016; /** * OID of the `pointarray` type. */ public const POINTARRAY = 1017; /** * OID of the `lsegarray` type. */ public const LSEGARRAY = 1018; /** * OID of the `patharray` type. */ public const PATHARRAY = 1019; /** * OID of the `boxarray` type. */ public const BOXARRAY = 1020; /** * OID of the `float4array` type. */ public const FLOAT4ARRAY = 1021; /** * OID of the `float8array` type. */ public const FLOAT8ARRAY = 1022; /** * OID of the `abstimearray` type. */ public const ABSTIMEARRAY = 1023; /** * OID of the `reltimearray` type. */ public const RELTIMEARRAY = 1024; /** * OID of the `tintervalarray` type. */ public const TINTERVALARRAY = 1025; /** * OID of the `polygonarray` type. */ public const POLYGONARRAY = 1027; /** * OID of the `aclitem` type. */ public const ACLITEM = 1033; /** * OID of the `aclitemarray` type. */ public const ACLITEMARRAY = 1034; /** * OID of the `macaddrarray` type. */ public const MACADDRARRAY = 1040; /** * OID of the `inetarray` type. */ public const INETARRAY = 1041; /** * OID of the `cidrarray` type. */ public const CIDRARRAY = 651; /** * OID of the `cstringarray` type. */ public const CSTRINGARRAY = 1263; /** * OID of the `bpchar` type. */ public const BPCHAR = 1042; /** * OID of the `varchar` type. */ public const VARCHAR = 1043; /** * OID of the `date` type. */ public const DATE = 1082; /** * OID of the `time` type. */ public const TIME = 1083; /** * OID of the `timestamp` type. */ public const TIMESTAMP = 1114; /** * OID of the `timestamparray` type. */ public const TIMESTAMPARRAY = 1115; /** * OID of the `datearray` type. */ public const DATEARRAY = 1182; /** * OID of the `timearray` type. */ public const TIMEARRAY = 1183; /** * OID of the `timestamptz` type. */ public const TIMESTAMPTZ = 1184; /** * OID of the `timestamptzarray` type. */ public const TIMESTAMPTZARRAY = 1185; /** * OID of the `interval` type. */ public const INTERVAL = 1186; /** * OID of the `intervalarray` type. */ public const INTERVALARRAY = 1187; /** * OID of the `numericarray` type. */ public const NUMERICARRAY = 1231; /** * OID of the `timetz` type. */ public const TIMETZ = 1266; /** * OID of the `timetzarray` type. */ public const TIMETZARRAY = 1270; /** * OID of the `bit` type. */ public const BIT = 1560; /** * OID of the `bitarray` type. */ public const BITARRAY = 1561; /** * OID of the `varbit` type. */ public const VARBIT = 1562; /** * OID of the `varbitarray` type. */ public const VARBITARRAY = 1563; /** * OID of the `numeric` type. */ public const NUMERIC = 1700; /** * OID of the `refcursor` type. */ public const REFCURSOR = 1790; /** * OID of the `refcursorarray` type. */ public const REFCURSORARRAY = 2201; /** * OID of the `regprocedure` type. */ public const REGPROCEDURE = 2202; /** * OID of the `regoper` type. */ public const REGOPER = 2203; /** * OID of the `regoperator` type. */ public const REGOPERATOR = 2204; /** * OID of the `regclass` type. */ public const REGCLASS = 2205; /** * OID of the `regtype` type. */ public const REGTYPE = 2206; /** * OID of the `regprocedurearray` type. */ public const REGPROCEDUREARRAY = 2207; /** * OID of the `regoperarray` type. */ public const REGOPERARRAY = 2208; /** * OID of the `regoperatorarray` type. */ public const REGOPERATORARRAY = 2209; /** * OID of the `regclassarray` type. */ public const REGCLASSARRAY = 2210; /** * OID of the `regtypearray` type. */ public const REGTYPEARRAY = 2211; /** * OID of the `uuid` type. */ public const UUID = 2950; /** * OID of the `uuidarray` type. */ public const UUIDARRAY = 2951; /** * OID of the `tsvector` type. */ public const TSVECTOR = 3614; /** * OID of the `gtsvector` type. */ public const GTSVECTOR = 3642; /** * OID of the `tsquery` type. */ public const TSQUERY = 3615; /** * OID of the `regconfig` type. */ public const REGCONFIG = 3734; /** * OID of the `regdictionary` type. */ public const REGDICTIONARY = 3769; /** * OID of the `tsvectorarray` type. */ public const TSVECTORARRAY = 3643; /** * OID of the `gtsvectorarray` type. */ public const GTSVECTORARRAY = 3644; /** * OID of the `tsqueryarray` type. */ public const TSQUERYARRAY = 3645; /** * OID of the `regconfigarray` type. */ public const REGCONFIGARRAY = 3735; /** * OID of the `regdictionaryarray` type. */ public const REGDICTIONARYARRAY = 3770; /** * OID of the `txid_snapshot` type. */ public const TXID_SNAPSHOT = 2970; /** * OID of the `txid_snapshotarray` type. */ public const TXID_SNAPSHOTARRAY = 2949; /** * OID of the `int4range` type. */ public const INT4RANGE = 3904; /** * OID of the `int4rangearray` type. */ public const INT4RANGEARRAY = 3905; /** * OID of the `numrange` type. */ public const NUMRANGE = 3906; /** * OID of the `numrangearray` type. */ public const NUMRANGEARRAY = 3907; /** * OID of the `tsrange` type. */ public const TSRANGE = 3908; /** * OID of the `tsrangearray` type. */ public const TSRANGEARRAY = 3909; /** * OID of the `tstzrange` type. */ public const TSTZRANGE = 3910; /** * OID of the `tstzrangearray` type. */ public const TSTZRANGEARRAY = 3911; /** * OID of the `daterange` type. */ public const DATERANGE = 3912; /** * OID of the `daterangearray` type. */ public const DATERANGEARRAY = 3913; /** * OID of the `int8range` type. */ public const INT8RANGE = 3926; /** * OID of the `int8rangearray` type. */ public const INT8RANGEARRAY = 3927; /** * OID of the `record` type. */ public const RECORD = 2249; /** * OID of the `recordarray` type. */ public const RECORDARRAY = 2287; /** * OID of the `cstring` type. */ public const CSTRING = 2275; /** * OID of the `any` type. */ public const ANY = 2276; /** * OID of the `anyarray` type. */ public const ANYARRAY = 2277; /** * OID of the `void` type. */ public const VOID = 2278; /** * OID of the `trigger` type. */ public const TRIGGER = 2279; /** * OID of the `event_trigger` type. */ public const EVENT_TRIGGER = 3838; /** * OID of the `language_handler` type. */ public const LANGUAGE_HANDLER = 2280; /** * OID of the `internal` type. */ public const INTERNAL = 2281; /** * OID of the `opaque` type. */ public const OPAQUE = 2282; /** * OID of the `anyelement` type. */ public const ANYELEMENT = 2283; /** * OID of the `anynonarray` type. */ public const ANYNONARRAY = 2776; /** * OID of the `anyenum` type. */ public const ANYENUM = 3500; /** * OID of the `fdw_handler` type. */ public const FDW_HANDLER = 3115; /** * OID of the `anyrange` type. */ public const ANYRANGE = 3831; /** * The connection which was used to obtain type information. * * @public * @readonly * @var \pq\Connection */ public $connection; /** * Create a new instance populated with information obtained from the `pg_type` relation. * * @param \pq\Connection $conn The connection to use. * @param array $namespaces Which namespaces to query (defaults to `public` and `pg_catalog`). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function __construct(Connection $conn, array $namespaces = null) {} /** * Refresh type information from `pg_type`. * * @param array $namespaces Which namespaces to query (defaults to `public` and `pg_catalog`). * @throws \pq\Exception\InvalidArgumentException * @throws \pq\Exception\BadMethodCallException * @throws \pq\Exception\RuntimeException */ public function refresh(array $namespaces = null) {} } namespace pq\Exception; /** * A method call was not expected. */ class BadMethodCallException extends \BadMethodCallException implements \pq\Exception {} /** * Implementation or SQL syntax error. */ class DomainException extends \DomainException implements \pq\Exception { /** * The SQLSTATE code, see the [official documentation](http://www.postgresql.org/docs/current/static/errcodes-appendix.html) for further information. * * @public * @readonly * @var string */ public $sqlstate; } /** * An invalid argument was passed to a method. */ class InvalidArgumentException extends \InvalidArgumentException implements \pq\Exception {} /** * A runtime exception occurred. */ class RuntimeException extends \RuntimeException implements \pq\Exception {} * The tested string. *

    * @return bool TRUE if every character in text is either * a letter or a digit, FALSE otherwise. */ #[Pure] function ctype_alnum(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for alphabetic character(s) * @link https://php.net/manual/en/function.ctype-alpha.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text is * a letter from the current locale, FALSE otherwise. */ #[Pure] function ctype_alpha(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for control character(s) * @link https://php.net/manual/en/function.ctype-cntrl.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text is * a control character from the current locale, FALSE otherwise. */ #[Pure] function ctype_cntrl(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for numeric character(s) * @link https://php.net/manual/en/function.ctype-digit.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in the string * text is a decimal digit, FALSE otherwise. */ #[Pure] function ctype_digit(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for lowercase character(s) * @link https://php.net/manual/en/function.ctype-lower.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text is * a lowercase letter in the current locale. */ #[Pure] function ctype_lower(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for any printable character(s) except space * @link https://php.net/manual/en/function.ctype-graph.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text is * printable and actually creates visible output (no white space), FALSE * otherwise. */ #[Pure] function ctype_graph(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for printable character(s) * @link https://php.net/manual/en/function.ctype-print.php * @param string $text

    * The tested string. *

    * @return bool 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. */ #[Pure] function ctype_print(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for any printable character which is not whitespace or an * alphanumeric character * @link https://php.net/manual/en/function.ctype-punct.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text * is printable, but neither letter, digit or blank, FALSE otherwise. */ #[Pure] function ctype_punct(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for whitespace character(s) * @link https://php.net/manual/en/function.ctype-space.php * @param string $text

    * The tested string. *

    * @return bool 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. */ #[Pure] function ctype_space(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for uppercase character(s) * @link https://php.net/manual/en/function.ctype-upper.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text is * an uppercase letter in the current locale. */ #[Pure] function ctype_upper(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} /** * Check for character(s) representing a hexadecimal digit * @link https://php.net/manual/en/function.ctype-xdigit.php * @param string $text

    * The tested string. *

    * @return bool TRUE if every character in text is * a hexadecimal 'digit', that is a decimal digit or a character from * [A-Fa-f] , FALSE otherwise. */ #[Pure] function ctype_xdigit(#[LanguageLevelTypeAware(['8.1' => 'string'], default: 'mixed')] mixed $text): bool {} next() method. * * @return void */ function ms_ResetErrorList() {} /** * Class Objects can be returned by the `layerObj`_ class, or can be * created using: */ final class classObj { /** * @var string */ public $group; /** * @var string */ public $keyimage; /** * Removed (6.2) - use addLabel, getLabel, ... * * @var labelObj */ public $label; /** * @var float */ public $maxscaledenom; /** * @var hashTableObj */ public $metadata; /** * @var float */ public $minscaledenom; /** * @var string */ public $name; /** * read-only (since 6.2) * * @var int */ public $numlabels; /** * read-only * * @var int */ public $numstyles; /** * MS_ON, MS_OFF or MS_DELETE * * @var int */ public $status; /** * @var string */ public $template; /** * @var string */ public $title; /** * @var int */ public $type; /** * The second argument class is optional. If given, the new class * created will be a copy of this class. * * @param layerObj $layer * @param classObj $class */ final public function __construct(layerObj $layer, classObj $class) {} /** * Old style constructor * * @param layerObj $layer * @param classObj $class * @return classObj */ final public function ms_newClassObj(layerObj $layer, classObj $class) {} /** * Add a labelObj to the classObj and return its index in the labels * array. * .. versionadded:: 6.2 * * @param labelObj $label * @return int */ final public function addLabel(labelObj $label) {} /** * Saves the object to a string. Provides the inverse option for * updateFromString. * * @return string */ final public function convertToString() {} /** * Draw the legend icon and return a new imageObj. * * @param int $width * @param int $height * @return imageObj */ final public function createLegendIcon($width, $height) {} /** * Delete the style specified by the style index. If there are any * style that follow the deleted style, their index will decrease by 1. * * @param int $index * @return int */ final public function deletestyle($index) {} /** * Draw the legend icon on im object at dstX, dstY. * Returns MS_SUCCESS/MS_FAILURE. * * @param int $width * @param int $height * @param imageObj $im * @param int $dstX * @param int $dstY * @return int */ final public function drawLegendIcon($width, $height, imageObj $im, $dstX, $dstY) {} /** * Free the object properties and break the internal references. * Note that you have to unset the php variable to free totally the * resources. * * @return void */ final public function free() {} /** * Returns the :ref:`expression ` string for the class * object. * * @return string */ final public function getExpressionString() {} /** * Return a reference to the labelObj at *index* in the labels array. * See the labelObj_ section for more details on multiple class * labels. * .. versionadded:: 6.2 * * @param int $index * @return labelObj */ final public function getLabel($index) {} /** * Fetch class metadata entry by name. Returns "" if no entry * matches the name. Note that the search is case sensitive. * .. note:: * getMetaData's query is case sensitive. * * @param string $name * @return int */ final public function getMetaData($name) {} /** * Return the style object using an index. index >= 0 && * index < class->numstyles. * * @param int $index * @return styleObj */ final public function getStyle($index) {} /** * Returns the text string for the class object. * * @return string */ final public function getTextString() {} /** * The style specified by the style index will be moved down into * the array of classes. Returns MS_SUCCESS or MS_FAILURE. * ex class->movestyledown(0) will have the effect of moving style 0 * up to position 1, and the style at position 1 will be moved * to position 0. * * @param int $index * @return int */ final public function movestyledown($index) {} /** * The style specified by the style index will be moved up into * the array of classes. Returns MS_SUCCESS or MS_FAILURE. * ex class->movestyleup(1) will have the effect of moving style 1 * up to position 0, and the style at position 0 will be moved * to position 1. * * @param int $index * @return int */ final public function movestyleup($index) {} /** * Remove the labelObj at *index* from the labels array and return a * reference to the labelObj. numlabels is decremented, and the * array is updated. * .. versionadded:: 6.2 * * @param int $index * @return labelObj */ final public function removeLabel($index) {} /** * Remove a metadata entry for the class. Returns MS_SUCCESS/MS_FAILURE. * * @param string $name * @return int */ final public function removeMetaData($name) {} /** * Set object property to a new value. * * @param string $property_name * @param $new_value * @return int */ final public function set($property_name, $new_value) {} /** * Set the :ref:`expression ` string for the class * object. * * @param string $expression * @return int */ final public function setExpression($expression) {} /** * Set a metadata entry for the class. Returns MS_SUCCESS/MS_FAILURE. * * @param string $name * @param string $value * @return int */ final public function setMetaData($name, $value) {} /** * Set the text string for the class object. * * @param string $text * @return int */ final public function settext($text) {} /** * Update a class from a string snippet. Returns MS_SUCCESS/MS_FAILURE. * .. code-block:: php * set the color * $oClass->updateFromString('CLASS STYLE COLOR 255 0 255 END END'); * * @param string $snippet * @return int */ final public function updateFromString($snippet) {} } /** * Instance of clusterObj is always embedded inside the `layerObj`_. */ final class clusterObj { /** * @var float */ public $buffer; /** * @var float */ public $maxdistance; /** * @var string */ public $region; /** * Saves the object to a string. Provides the inverse option for * updateFromString. * * @return string */ final public function convertToString() {} /** * Returns the :ref:`expression ` for this cluster * filter or NULL on error. * * @return string */ final public function getFilterString() {} /** * Returns the :ref:`expression ` for this cluster group * or NULL on error. * * @return string */ final public function getGroupString() {} /** * Set layer filter :ref:`expression `. * * @param string $expression * @return int */ final public function setFilter($expression) {} /** * Set layer group :ref:`expression `. * * @param string $expression * @return int */ final public function setGroup($expression) {} } /** * Instances of colorObj are always embedded inside other classes. */ final class colorObj { /** * @var int */ public $red; /** * @var int */ public $green; /** * @var int */ public $blue; /** * @var int */ public $alpha; /** * Get the color as a hex string "#rrggbb" or (if alpha is not 255) * "#rrggbbaa". * * @return string */ final public function toHex() {} /** * Set red, green, blue and alpha values. The hex string should have the form * "#rrggbb" (alpha will be set to 255) or "#rrggbbaa". Returns MS_SUCCESS. * * @param string $hex * @return int */ final public function setHex($hex) {} } final class errorObj { /** * //See error code constants above * * @var int */ public $code; /** * @var string */ public $message; /** * @var string */ public $routine; } /** * The grid is always embedded inside a layer object defined as * a grid (layer->connectiontype = MS_GRATICULE) * (for more docs : https://github.com/mapserver/mapserver/wiki/MapServerGrid) * A layer can become a grid layer by adding a grid object to it using : * ms_newGridObj(layerObj layer) * $oLayer = ms_newlayerobj($oMap); * $oLayer->set("name", "GRID"); * ms_newgridobj($oLayer); * $oLayer->grid->set("labelformat", "DDMMSS"); */ final class gridObj { /** * @var string */ public $labelformat; /** * @var float */ public $maxacrs; /** * @var float */ public $maxinterval; /** * @var float */ public $maxsubdivide; /** * @var float */ public $minarcs; /** * @var float */ public $mininterval; /** * @var float */ public $minsubdivide; /** * Set object property to a new value. * * @param string $property_name * @param $new_value * @return int */ final public function set($property_name, $new_value) {} } /** * Instance of hashTableObj is always embedded inside the `classObj`_, * `layerObj`_, `mapObj`_ and `webObj`_. It is uses a read only. * $hashTable = $oLayer->metadata; * $key = null; * while ($key = $hashTable->nextkey($key)) * echo "Key: ".$key." value: ".$hashTable->get($key)."
    "; */ final class hashTableObj { /** * Clear all items in the hashTable (To NULL). * * @return void */ final public function clear() {} /** * Fetch class metadata entry by name. Returns "" if no entry * matches the name. Note that the search is case sensitive. * * @param string $key * @return string */ final public function get($key) {} /** * Return the next key or first key if previousKey = NULL. * Return NULL if no item is in the hashTable or end of hashTable is * reached * * @param string $previousKey * @return string */ final public function nextkey($previousKey) {} /** * Remove a metadata entry in the hashTable. Returns MS_SUCCESS/MS_FAILURE. * * @param string $key * @return int */ final public function remove($key) {} /** * Set a metadata entry in the hashTable. Returns MS_SUCCESS/MS_FAILURE. * * @param string $key * @param string $value * @return int */ final public function set($key, $value) {} } /** * Instances of imageObj are always created by the `mapObj`_ class methods. */ final class imageObj { /** * read-only * * @var int */ public $width; /** * read-only * * @var int */ public $height; /** * read-only * * @var int */ public $resolution; /** * read-only * * @var int */ public $resolutionfactor; /** * @var string */ public $imagepath; /** * @var string */ public $imageurl; /** * Copy srcImg on top of the current imageObj. * transparentColorHex is the color (in 0xrrggbb format) from srcImg * that should be considered transparent (i.e. those pixels won't * be copied). Pass -1 if you don't want any transparent color. * If optional dstx,dsty are provided then it defines the position * where the image should be copied (dstx,dsty = top-left corner * position). * The optional angle is a value between 0 and 360 degrees to rotate * the source image counterclockwise. Note that if an angle is specified * (even if its value is zero) then the dstx and dsty coordinates * specify the CENTER of the destination area. * Note: this function works only with 8 bits GD images (PNG or GIF). * * @param imageObj $srcImg * @param int $transparentColorHex * @param int $dstX * @param int $dstY * @param int $angle * @return void */ final public function pasteImage(imageObj $srcImg, $transparentColorHex, $dstX, $dstY, $angle) {} /** * Writes image object to specified filename. * Passing no filename or an empty filename sends output to stdout. In * this case, the PHP header() function should be used to set the * document's content-type prior to calling saveImage(). The output * format is the one that is currently selected in the map file. The * second argument oMap is not manadatory. It is usful when saving to * formats like GTIFF that needs georeference information contained in * the map file. On success, it returns either MS_SUCCESS if writing to an * external file, or the number of bytes written if output is sent to * stdout. * * @param string $filename * @param mapObj $oMap * @return int */ final public function saveImage($filename, mapObj $oMap) {} /** * Writes image to temp directory. Returns image URL. * The output format is the one that is currently selected in the * map file. * * @return string */ final public function saveWebImage() {} } final class labelcacheMemberObj { /** * read-only * * @var int */ public $classindex; /** * read-only * * @var int */ public $featuresize; /** * read-only * * @var int */ public $layerindex; /** * read-only * * @var int */ public $markerid; /** * read-only * * @var int */ public $numstyles; /** * read-only * * @var int */ public $shapeindex; /** * read-only * * @var int */ public $status; /** * read-only * * @var string */ public $text; /** * read-only * * @var int */ public $tileindex; } final class labelcacheObj { /** * Free the label cache. Always returns MS_SUCCESS. * Ex : map->labelcache->freeCache(); * * @return bool */ final public function freeCache() {} } /** * labelObj are always embedded inside other classes. */ final class labelObj { /** * @var int */ public $align; /** * @var float */ public $angle; /** * @var int */ public $anglemode; /** * @var int */ public $antialias; /** * @var int */ public $autominfeaturesize; /** * (deprecated since 6.0) * * @var colorObj */ public $backgroundcolor; /** * (deprecated since 6.0) * * @var colorObj */ public $backgroundshadowcolor; /** * (deprecated since 6.0) * * @var int */ public $backgroundshadowsizex; /** * (deprecated since 6.0) * * @var int */ public $backgroundshadowsizey; /** * @var int */ public $buffer; /** * @var colorObj */ public $color; /** * @var string */ public $encoding; /** * @var string */ public $font; /** * @var int */ public $force; /** * @var int */ public $maxlength; /** * @var int */ public $maxsize; /** * @var int */ public $mindistance; /** * @var int */ public $minfeaturesize; /** * @var int */ public $minlength; /** * @var int */ public $minsize; /** * @var int */ public $numstyles; /** * @var int */ public $offsetx; /** * @var int */ public $offsety; /** * @var colorObj */ public $outlinecolor; /** * @var int */ public $outlinewidth; /** * @var int */ public $partials; /** * @var int */ public $position; /** * @var int */ public $priority; /** * @var int */ public $repeatdistance; /** * @var colorObj */ public $shadowcolor; /** * @var int */ public $shadowsizex; /** * @var int */ public $shadowsizey; /** * @var int */ public $size; /** * @var int */ public $wrap; final public function __construct() {} /** * Saves the object to a string. Provides the inverse option for * updateFromString. * * @return string */ final public function convertToString() {} /** * Delete the style specified by the style index. If there are any * style that follow the deleted style, their index will decrease by 1. * * @param int $index * @return int */ final public function deleteStyle($index) {} /** * Free the object properties and break the internal references. * Note that you have to unset the php variable to free totally the * resources. * * @return void */ final public function free() {} /** * Get the attribute binding for a specified label property. Returns * NULL if there is no binding for this property. * Example: * .. code-block:: php * $oLabel->setbinding(MS_LABEL_BINDING_COLOR, "FIELD_NAME_COLOR"); * echo $oLabel->getbinding(MS_LABEL_BINDING_COLOR); // FIELD_NAME_COLOR * * @param mixed $labelbinding * @return string */ final public function getBinding($labelbinding) {} /** * Returns the label expression string. * * @return string */ final public function getExpressionString() {} /** * Return the style object using an index. index >= 0 && * index < label->numstyles. * * @param int $index * @return styleObj */ final public function getStyle($index) {} /** * Returns the label text string. * * @return string */ final public function getTextString() {} /** * The style specified by the style index will be moved down into * the array of classes. Returns MS_SUCCESS or MS_FAILURE. * ex label->movestyledown(0) will have the effect of moving style 0 * up to position 1, and the style at position 1 will be moved * to position 0. * * @param int $index * @return int */ final public function moveStyleDown($index) {} /** * The style specified by the style index will be moved up into * the array of classes. Returns MS_SUCCESS or MS_FAILURE. * ex label->movestyleup(1) will have the effect of moving style 1 * up to position 0, and the style at position 0 will be moved * to position 1. * * @param int $index * @return int */ final public function moveStyleUp($index) {} /** * Remove the attribute binding for a specfiled style property. * Example: * .. code-block:: php * $oStyle->removebinding(MS_LABEL_BINDING_COLOR); * * @param mixed $labelbinding * @return int */ final public function removeBinding($labelbinding) {} /** * Set object property to a new value. * * @param string $property_name * @param $new_value * @return int */ final public function set($property_name, $new_value) {} /** * Set the attribute binding for a specified label property. * Example: * .. code-block:: php * $oLabel->setbinding(MS_LABEL_BINDING_COLOR, "FIELD_NAME_COLOR"); * This would bind the color parameter with the data (ie will extract * the value of the color from the field called "FIELD_NAME_COLOR" * * @param mixed $labelbinding * @param string $value * @return int */ final public function setBinding($labelbinding, $value) {} /** * Set the label expression. * * @param string $expression * @return int */ final public function setExpression($expression) {} /** * Set the label text. * * @param string $text * @return int */ final public function setText($text) {} /** * Update a label from a string snippet. Returns MS_SUCCESS/MS_FAILURE. * * @param string $snippet * @return int */ final public function updateFromString($snippet) {} } /** * Layer Objects can be returned by the `mapObj`_ class, or can be * created using: * A second optional argument can be given to ms_newLayerObj() to create * the new layer as a copy of an existing layer. If a layer is given as * argument then all members of a this layer will be copied in the new * layer created. */ final class layerObj { /** * @var int */ public $annotate; /** * @var hashTableObj */ public $bindvals; /** * @var string */ public $classgroup; /** * @var string */ public $classitem; /** * @var clusterObj */ public $cluster; /** * @var string */ public $connection; /** * read-only, use setConnectionType() to set it * * @var int */ public $connectiontype; /** * @var string */ public $data; /** * @var int */ public $debug; /** * deprecated since 6.0 * * @var int */ public $dump; /** * @var string */ public $filteritem; /** * @var string */ public $footer; /** * only available on a layer defined as grid (MS_GRATICULE) * * @var gridObj */ public $grid; /** * @var string */ public $group; /** * @var string */ public $header; /** * read-only * * @var int */ public $index; /** * @var int */ public $labelcache; /** * @var string */ public $labelitem; /** * @var float */ public $labelmaxscaledenom; /** * @var float */ public $labelminscaledenom; /** * @var string */ public $labelrequires; /** * @var string */ public $mask; /** * @var int */ public $maxfeatures; /** * @var float */ public $maxscaledenom; /** * @var hashTableObj */ public $metadata; /** * @var float */ public $minscaledenom; /** * @var string */ public $name; /** * @var int */ public $num_processing; /** * read-only * * @var int */ public $numclasses; /** * @var colorObj */ public $offsite; /** * @var int */ public $opacity; /** * @var projectionObj */ public $projection; /** * @var int */ public $postlabelcache; /** * @var string */ public $requires; /** * @var int */ public $sizeunits; /** * @var int */ public $startindex; /** * MS_ON, MS_OFF, MS_DEFAULT or MS_DELETE * * @var int */ public $status; /** * @var string */ public $styleitem; /** * @var float */ public $symbolscaledenom; /** * @var string */ public $template; /** * @var string */ public $tileindex; /** * @var string */ public $tileitem; /** * @var float */ public $tolerance; /** * @var int */ public $toleranceunits; /** * @var int */ public $transform; /** * @var int */ public $type; /** * Old style constructor * * @param mapObj $map * @param layerObj $layer * @return layerObj */ final public function ms_newLayerObj(mapObj $map, layerObj $layer) {} /** * Add a new feature in a layer. Returns MS_SUCCESS or MS_FAILURE on * error. * * @param shapeObj $shape * @return int */ final public function addFeature(shapeObj $shape) {} /** * Apply the :ref:`SLD ` document to the layer object. * The matching between the sld document and the layer will be done * using the layer's name. * If a namedlayer argument is passed (argument is optional), * the NamedLayer in the sld that matchs it will be used to style * the layer. * See :ref:`SLD HowTo ` for more information on the SLD support. * * @param string $sldxml * @param string $namedlayer * @return int */ final public function applySLD($sldxml, $namedlayer) {} /** * Apply the :ref:`SLD ` document pointed by the URL to the * layer object. The matching between the sld document and the layer * will be done using the layer's name. If a namedlayer argument is * passed (argument is optional), the NamedLayer in the sld that * matchs it will be used to style the layer. See :ref:`SLD HowTo ` * for more information on the SLD support. * * @param string $sldurl * @param string $namedlayer * @return int */ final public function applySLDURL($sldurl, $namedlayer) {} /** * Clears all the processing strings. * * @return void */ final public function clearProcessing() {} /** * Close layer previously opened with open(). * * @return void */ final public function close() {} /** * Saves the object to a string. Provides the inverse option for * updateFromString. * * @return string */ final public function convertToString() {} /** * Draw a single layer, add labels to cache if required. * Returns MS_SUCCESS or MS_FAILURE on error. * * @param imageObj $image * @return int */ final public function draw(imageObj $image) {} /** * Draw query map for a single layer. * string executeWFSGetfeature() * Executes a GetFeature request on a WFS layer and returns the * name of the temporary GML file created. Returns an empty * string on error. * * @param imageObj $image * @return int */ final public function drawQuery(imageObj $image) {} /** * Free the object properties and break the internal references. * Note that you have to unset the php variable to free totally the * resources. * * @return void */ final public function free() {} /** * Returns an SLD XML string based on all the classes found in the * layer (the layer must have `STATUS` `on`). * * @return string */ final public function generateSLD() {} /** * Returns a classObj from the layer given an index value (0=first class) * * @param int $classIndex * @return classObj */ final public function getClass($classIndex) {} /** * Get the class index of a shape for a given scale. Returns -1 if no * class matches. classgroup is an array of class ids to check * (Optional). numclasses is the number of classes that the classgroup * array contains. By default, all the layer classes will be checked. * * @param $shape * @param $classgroup * @param $numclasses * @return int */ final public function getClassIndex($shape, $classgroup, $numclasses) {} /** * Returns the layer's data extents or NULL on error. * If the layer's EXTENT member is set then this value is used, * otherwise this call opens/closes the layer to read the * extents. This is quick on shapefiles, but can be * an expensive operation on some file formats or data sources. * This function is safe to use on both opened or closed layers: it * is not necessary to call open()/close() before/after calling it. * * @return rectObj */ final public function getExtent() {} /** * Returns the :ref:`expression ` for this layer or NULL * on error. * * @return string|null */ final public function getFilterString() {} /** * Returns an array containing the grid intersection coordinates. If * there are no coordinates, it returns an empty array. * * @return array */ final public function getGridIntersectionCoordinates() {} /** * Returns an array containing the items. Must call open function first. * If there are no items, it returns an empty array. * * @return array */ final public function getItems() {} /** * Fetch layer metadata entry by name. Returns "" if no entry * matches the name. Note that the search is case sensitive. * .. note:: * getMetaData's query is case sensitive. * * @param string $name * @return int */ final public function getMetaData($name) {} /** * Returns the number of results in the last query. * * @return int */ final public function getNumResults() {} /** * Returns an array containing the processing strings. * If there are no processing strings, it returns an empty array. * * @return array */ final public function getProcessing() {} /** * Returns a string representation of the :ref:`projection `. * Returns NULL on error or if no projection is set. * * @return string */ final public function getProjection() {} /** * Returns a resultObj by index from a layer object with * index in the range 0 to numresults-1. * Returns a valid object or FALSE(0) if index is invalid. * * @param int $index * @return resultObj */ final public function getResult($index) {} /** * Returns the bounding box of the latest result. * * @return rectObj */ final public function getResultsBounds() {} /** * If the resultObj passed has a valid resultindex, retrieve shapeObj from * a layer's resultset. (You get it from the resultObj returned by * getResult() for instance). Otherwise, it will do a single query on * the layer to fetch the shapeindex * .. code-block:: php * $map = new mapObj("gmap75.map"); * $l = $map->getLayerByName("popplace"); * $l->queryByRect($map->extent); * for ($i = 0; $i < $l->getNumResults(); $i++) { * $s = $l->getShape($l->getResult($i)); * echo $s->getValue($l,"Name"); * echo "\n"; * } * * @param resultObj $result * @return shapeObj */ final public function getShape(resultObj $result) {} /** * Returns a WMS GetFeatureInfo URL (works only for WMS layers) * clickX, clickY is the location of to query in pixel coordinates * with (0,0) at the top left of the image. * featureCount is the number of results to return. * infoFormat is the format the format in which the result should be * requested. Depends on remote server's capabilities. MapServer * WMS servers support only "MIME" (and should support "GML.1" soon). * Returns "" and outputs a warning if layer is not a WMS layer * or if it is not queriable. * * @param int $clickX * @param int $clickY * @param int $featureCount * @param string $infoFormat * @return string */ final public function getWMSFeatureInfoURL($clickX, $clickY, $featureCount, $infoFormat) {} /** * Returns MS_TRUE/MS_FALSE depending on whether the layer is * currently visible in the map (i.e. turned on, in scale, etc.). * * @return bool */ final public function isVisible() {} /** * The class specified by the class index will be moved down into * the array of layers. Returns MS_SUCCESS or MS_FAILURE. * ex layer->moveclassdown(0) will have the effect of moving class 0 * up to position 1, and the class at position 1 will be moved * to position 0. * * @param int $index * @return int */ final public function moveclassdown($index) {} /** * The class specified by the class index will be moved up into * the array of layers. Returns MS_SUCCESS or MS_FAILURE. * ex layer->moveclassup(1) will have the effect of moving class 1 * up to position 0, and the class at position 0 will be moved * to position 1. * * @param int $index * @return int */ final public function moveclassup($index) {} /** * Open the layer for use with getShape(). * Returns MS_SUCCESS/MS_FAILURE. * * @return int */ final public function open() {} /** * Called after msWhichShapes has been called to actually retrieve * shapes within a given area. Returns a shape object or NULL on * error. * .. code-block:: php * $map = ms_newmapobj("d:/msapps/gmap-ms40/htdocs/gmap75.map"); * $layer = $map->getLayerByName('road'); * $status = $layer->open(); * $status = $layer->whichShapes($map->extent); * while ($shape = $layer->nextShape()) * { * echo $shape->index ."
    \n"; * } * $layer->close(); * * @return shapeObj */ final public function nextShape() {} /** * Query layer for shapes that intersect current map extents. qitem * is the item (attribute) on which the query is performed, and * qstring is the expression to match. The query is performed on all * the shapes that are part of a :ref:`CLASS` that contains a * :ref:`TEMPLATE