at path:
ROOT
/
bin.zip
run:
R
W
Run
.well-known
DIR
2024-07-18 07:32:21
R
W
Run
adstesting
DIR
2026-05-07 07:41:07
R
W
Run
androidfamilylocator
DIR
2026-05-07 07:41:18
R
W
Run
axelonyticslostphonefinder
DIR
2026-05-07 07:41:02
R
W
Run
axelonyticsmobiletracker
DIR
2026-05-07 07:41:18
R
W
Run
axelonyticsparentlink
DIR
2026-05-07 07:41:07
R
W
Run
callforhelp
DIR
2026-05-07 07:40:54
R
W
Run
carmanagement
DIR
2026-05-07 07:40:52
R
W
Run
devicetrackerplus
DIR
2026-05-07 07:41:03
R
W
Run
docspot
DIR
2026-05-07 07:40:54
R
W
Run
eventhybrid
DIR
2026-05-07 07:41:03
R
W
Run
excusefinder
DIR
2026-05-07 07:41:18
R
W
Run
findlostphonerapid
DIR
2026-05-07 07:41:18
R
W
Run
findmykids
DIR
2026-05-07 07:41:02
R
W
Run
foodproducts
DIR
2026-05-07 07:41:20
R
W
Run
halalfoodscanner
DIR
2026-05-07 07:41:02
R
W
Run
home
DIR
2023-09-05 11:51:03
R
W
Run
innovagictechnologies
DIR
2026-05-07 07:41:18
R
W
Run
innovagicwebsite
DIR
2026-05-07 07:41:18
R
W
Run
khalis
DIR
2026-05-07 07:40:54
R
W
Run
lastpassmanager
DIR
2026-05-07 07:41:01
R
W
Run
lostphonerainbow
DIR
2026-05-07 07:41:03
R
W
Run
lostphonetrack
DIR
2026-05-07 07:41:02
R
W
Run
lyricstudio
DIR
2026-05-07 07:40:54
R
W
Run
muffinbreak
DIR
2026-05-07 07:41:02
R
W
Run
numanarshad
DIR
2026-05-07 07:41:18
R
W
Run
offlinephonetrack
DIR
2026-05-07 07:41:01
R
W
Run
parentalcontrol
DIR
2026-05-07 07:41:02
R
W
Run
pushnoti
DIR
2026-05-07 07:41:02
R
W
Run
pushnotification
DIR
2026-05-07 07:41:07
R
W
Run
remotemouse
DIR
2026-05-07 07:40:54
R
W
Run
scrum
DIR
2026-05-07 07:40:59
R
W
Run
scrumapp
DIR
2026-05-07 07:41:20
R
W
Run
scrumhrmanagement
DIR
2026-05-07 07:41:03
R
W
Run
scrumlive
DIR
2026-05-07 07:41:02
R
W
Run
seminarhub
DIR
2026-05-07 07:41:03
R
W
Run
seventyfivechallenges
DIR
2026-05-07 07:41:06
R
W
Run
shaheer
DIR
2026-05-07 07:41:07
R
W
Run
smartswitchphone
DIR
2026-05-07 07:41:02
R
W
Run
trackviewblue
DIR
2026-05-07 07:40:52
R
W
Run
trackviewnewapp
DIR
2026-05-07 07:41:18
R
W
Run
virtualstudygroup
DIR
2026-05-07 07:41:03
R
W
Run
vkonnect
DIR
2026-05-07 07:41:06
R
W
Run
warrantyapp
DIR
2026-05-07 07:40:52
R
W
Run
wp-admin
DIR
2026-05-07 07:41:02
R
W
Run
wp-content
DIR
2026-05-07 07:40:54
R
W
Run
wp-includes
DIR
2026-05-07 07:41:18
R
W
Run
zengo
DIR
2026-05-07 07:41:18
R
W
Run
.Archive.tar
4.5 KB
2026-05-07 12:05:59
R
W
Run
Delete
Rename
.Archive.tar.gz
656 By
2026-05-07 12:05:59
R
W
Run
Delete
Rename
.Archive.zip
1.53 KB
2026-05-07 12:04:14
R
W
Run
Delete
Rename
.Sent.zip
673 By
2026-05-07 12:04:07
R
W
Run
Delete
Rename
.Trash.tar
3 KB
2026-05-07 12:05:16
R
W
Run
Delete
Rename
.Trash.tar.gz
339 By
2026-05-07 12:05:16
R
W
Run
Delete
Rename
.Trash.zip
673 By
2026-05-07 12:05:00
R
W
Run
Delete
Rename
.bash_profile.bash_profile.tar.gz
253 By
2026-05-07 11:08:49
R
W
Run
Delete
Rename
.bash_profile.tar
2 KB
2026-05-07 11:08:49
R
W
Run
Delete
Rename
.cache.tar
2.66 MB
2026-05-07 11:07:01
R
W
Run
Delete
Rename
.cache.tar.gz
1.03 MB
2026-05-07 11:07:02
R
W
Run
Delete
Rename
.cache.zip
2.62 MB
2026-05-07 11:06:11
R
W
Run
Delete
Rename
.caldav.tar
10 KB
2026-05-07 11:06:11
R
W
Run
Delete
Rename
.caldav.tar.gz
1.17 KB
2026-05-07 11:06:11
R
W
Run
Delete
Rename
.caldav.zip
4.17 KB
2026-05-07 11:05:50
R
W
Run
Delete
Rename
.channels.zip
4.34 KB
2026-05-07 12:05:08
R
W
Run
Delete
Rename
.composer.zip
320 By
2026-05-07 11:06:59
R
W
Run
Delete
Rename
.config.zip
124.06 MB
2026-05-07 11:06:08
R
W
Run
Delete
Rename
.gnupg.zip
8.08 KB
2026-05-07 11:06:45
R
W
Run
Delete
Rename
.htaccess
2.08 KB
2026-05-06 07:15:54
R
W
Run
Delete
Rename
.htaccess.htaccess.tar.gz
961 By
2026-05-07 10:04:13
R
W
Run
Delete
Rename
.htaccess.tar
4 KB
2026-05-07 10:04:13
R
W
Run
Delete
Rename
.local.tar
2 KB
2026-05-07 12:04:52
R
W
Run
Delete
Rename
.local.tar.gz
119 By
2026-05-07 12:04:52
R
W
Run
Delete
Rename
.local.zip
195 By
2026-05-07 12:04:19
R
W
Run
Delete
Rename
.lock.lock.tar.gz
107 By
2026-05-07 12:03:30
R
W
Run
Delete
Rename
.lock.tar
1.5 KB
2026-05-07 12:03:30
R
W
Run
Delete
Rename
.php.error.log.php.error.log.tar.gz
1.62 KB
2026-05-07 12:06:08
R
W
Run
Delete
Rename
.php.error.log.tar
25 KB
2026-05-07 12:06:08
R
W
Run
Delete
Rename
.razor.tar
37 KB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.razor.tar.gz
4.75 KB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.razor.zip
32.15 KB
2026-05-07 11:05:57
R
W
Run
Delete
Rename
.scrummanager@toptrendingappstudio_com.tar
758.5 KB
2026-05-07 12:07:38
R
W
Run
Delete
Rename
.scrummanager@toptrendingappstudio_com.tar.gz
299.44 KB
2026-05-07 12:07:39
R
W
Run
Delete
Rename
.scrummanager@toptrendingappstudio_com.zip
704.09 KB
2026-05-07 12:08:06
R
W
Run
Delete
Rename
.spamassassin.zip
62.23 KB
2026-05-07 11:06:46
R
W
Run
Delete
Rename
.spamassassinenable.spamassassinenable.tar.gz
114 By
2026-05-07 11:08:47
R
W
Run
Delete
Rename
.spamassassinenable.tar
1.5 KB
2026-05-07 11:08:47
R
W
Run
Delete
Rename
.ssh.tar
6.5 KB
2026-05-07 11:06:10
R
W
Run
Delete
Rename
.ssh.tar.gz
1.93 KB
2026-05-07 11:06:10
R
W
Run
Delete
Rename
.ssh.zip
3.18 KB
2026-05-07 11:05:49
R
W
Run
Delete
Rename
.subaccounts.tar
17.5 KB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.subaccounts.tar.gz
495 By
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.subaccounts.zip
16.16 KB
2026-05-07 11:06:13
R
W
Run
Delete
Rename
.user.ini.tar
2.5 KB
2026-05-07 11:08:46
R
W
Run
Delete
Rename
.user.ini.user.ini.tar.gz
463 By
2026-05-07 11:08:46
R
W
Run
Delete
Rename
.wget-hsts.tar
2 KB
2026-05-07 11:06:06
R
W
Run
Delete
Rename
.wget-hsts.wget-hsts.tar.gz
270 By
2026-05-07 11:06:06
R
W
Run
Delete
Rename
.wp-cli.tar
2 KB
2026-05-07 11:06:04
R
W
Run
Delete
Rename
.wp-cli.tar.gz
125 By
2026-05-07 11:06:04
R
W
Run
Delete
Rename
.wp-cli.zip
209 By
2026-05-07 11:05:25
R
W
Run
Delete
Rename
.wp-toolkit-identifier.tar
2.5 KB
2026-05-07 11:08:50
R
W
Run
Delete
Rename
.wp-toolkit-identifier.wp-toolkit-identifier.tar.gz
669 By
2026-05-07 11:08:50
R
W
Run
Delete
Rename
115743369141451647082_scaled_uu ju jj.jpg.jpg.tar.gz
7.56 KB
2026-05-07 12:07:15
R
W
Run
Delete
Rename
115743369141451647082_scaled_uu ju jj.jpg.tar
9.5 KB
2026-05-07 12:07:15
R
W
Run
Delete
Rename
14_1000016331.jpg.jpg.tar.gz
413.83 KB
2026-05-07 12:06:07
R
W
Run
Delete
Rename
14_1000016331.jpg.tar
454.5 KB
2026-05-07 12:06:07
R
W
Run
Delete
Rename
3_1000016296.jpg.jpg.tar.gz
514.67 KB
2026-05-07 12:06:48
R
W
Run
Delete
Rename
3_1000016296.jpg.tar
552.5 KB
2026-05-07 12:06:48
R
W
Run
Delete
Rename
66.php
1.18 MB
2026-05-07 07:40:04
R
W
Run
Delete
Rename
66.php.php.tar.gz
679.9 KB
2026-05-07 10:03:53
R
W
Run
Delete
Rename
66.php.tar
1.18 MB
2026-05-07 10:03:53
R
W
Run
Delete
Rename
666.php
78.54 KB
2026-05-07 07:40:11
R
W
Run
Delete
Rename
666.php.php.tar.gz
24.71 KB
2026-05-07 10:03:52
R
W
Run
Delete
Rename
666.php.tar
80.5 KB
2026-05-07 10:03:52
R
W
Run
Delete
Rename
8.php
15.05 KB
2026-05-07 07:39:38
R
W
Run
Delete
Rename
8.php.php.tar.gz
4.68 KB
2026-05-07 10:03:14
R
W
Run
Delete
Rename
8.php.tar
17 KB
2026-05-07 10:03:14
R
W
Run
Delete
Rename
a.php.php.tar.gz
242 By
2026-05-07 12:05:14
R
W
Run
Delete
Rename
a.php.tar
2 KB
2026-05-07 12:05:14
R
W
Run
Delete
Rename
access-logs.tar
63.59 MB
2026-05-07 11:08:45
R
W
Run
Delete
Rename
access-logs.tar.gz
3.1 MB
2026-05-07 11:08:47
R
W
Run
Delete
Rename
bin.tar
5.68 MB
2026-05-07 11:07:03
R
W
Run
Delete
Rename
bin.tar.gz
1.21 MB
2026-05-07 11:07:03
R
W
Run
Delete
Rename
bin.zip
5.4 MB
2026-05-07 12:10:49
R
W
Run
Delete
Rename
cache.tar
2 KB
2026-05-07 12:05:54
R
W
Run
Delete
Rename
cache.tar.gz
104 By
2026-05-07 12:05:54
R
W
Run
Delete
Rename
cacheid.tar
2 KB
2026-05-07 12:05:20
R
W
Run
Delete
Rename
cacheid.tar.gz
120 By
2026-05-07 12:05:20
R
W
Run
Delete
Rename
citycam.tar
58.72 MB
2026-05-07 12:05:19
R
W
Run
Delete
Rename
citycam.tar.gz
58.29 MB
2026-05-07 12:05:22
R
W
Run
Delete
Rename
citycam.zip
58.7 MB
2026-05-07 12:05:03
R
W
Run
Delete
Rename
composer.json.json.tar.gz
337 By
2026-05-07 11:08:32
R
W
Run
Delete
Rename
composer.json.tar
2 KB
2026-05-07 11:08:32
R
W
Run
Delete
Rename
composer.lock.lock.tar.gz
9.36 KB
2026-05-07 11:08:37
R
W
Run
Delete
Rename
composer.lock.tar
84 KB
2026-05-07 11:08:37
R
W
Run
Delete
Rename
composer.tar
2.16 MB
2026-05-07 12:04:51
R
W
Run
Delete
Rename
composer.tar.gz
543.1 KB
2026-05-07 11:08:54
R
W
Run
Delete
Rename
composer.zip
1.99 KB
2026-05-07 12:04:24
R
W
Run
Delete
Rename
deletegoogleaccount_php.php.php.tar.gz
627 By
2026-05-07 12:06:23
R
W
Run
Delete
Rename
deletegoogleaccount_php.php.tar
3 KB
2026-05-07 12:06:23
R
W
Run
Delete
Rename
dovecot-acl-list.tar
1.5 KB
2026-05-07 12:06:12
R
W
Run
Delete
Rename
dovecot-acl-list.tar.gz
113 By
2026-05-07 12:06:12
R
W
Run
Delete
Rename
dovecot.list.index.log.list.index.log.tar.gz
1.48 KB
2026-05-07 12:06:53
R
W
Run
Delete
Rename
dovecot.list.index.log.tar
9 KB
2026-05-07 12:06:53
R
W
Run
Delete
Rename
error_log
1.99 MB
2026-05-07 12:11:42
R
W
Run
Delete
Rename
error_log.tar.gz
1.92 KB
2026-05-07 10:03:53
R
W
Run
Delete
Rename
etc.tar
24.04 MB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
etc.tar.gz
795.71 KB
2026-05-07 11:06:42
R
W
Run
Delete
Rename
etc.zip
24.01 MB
2026-05-07 11:05:58
R
W
Run
Delete
Rename
getData.php.php.tar.gz
504 By
2026-05-07 12:06:09
R
W
Run
Delete
Rename
getData.php.tar
2.5 KB
2026-05-07 12:06:09
R
W
Run
Delete
Rename
get_all_contests.php.3.php.3.tar.gz
730 By
2026-05-07 12:06:14
R
W
Run
Delete
Rename
get_all_contests.php.3.tar
3 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
gpg.conf.conf.tar.gz
3.31 KB
2026-05-07 12:06:12
R
W
Run
Delete
Rename
gpg.conf.tar
9 KB
2026-05-07 12:06:12
R
W
Run
Delete
Rename
hmsc.so.so.tar.gz
1.33 MB
2026-05-07 12:06:01
R
W
Run
Delete
Rename
hmsc.so.tar
2.96 MB
2026-05-07 12:06:01
R
W
Run
Delete
Rename
images.tar
241.5 KB
2026-05-07 12:05:23
R
W
Run
Delete
Rename
images.tar.gz
239.71 KB
2026-05-07 12:05:23
R
W
Run
Delete
Rename
index.php.php.tar.gz
2.05 KB
2026-05-07 11:08:28
R
W
Run
Delete
Rename
index.php.tar
11.5 KB
2026-05-07 11:08:28
R
W
Run
Delete
Rename
keys.tar
108.5 KB
2026-05-07 12:05:44
R
W
Run
Delete
Rename
keys.tar.gz
52.97 KB
2026-05-07 12:05:45
R
W
Run
Delete
Rename
logs.tar
86.31 MB
2026-05-07 11:06:12
R
W
Run
Delete
Rename
logs.tar.gz
34.76 MB
2026-05-07 11:06:14
R
W
Run
Delete
Rename
logs.zip
86.15 MB
2026-05-07 11:05:51
R
W
Run
Delete
Rename
mailbox_format.cpanel.cpanel.tar.gz
130 By
2026-05-07 12:06:14
R
W
Run
Delete
Rename
mailbox_format.cpanel.tar
2 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
maildirsize.tar
6 KB
2026-05-07 12:06:10
R
W
Run
Delete
Rename
maildirsize.tar.gz
1.19 KB
2026-05-07 12:06:10
R
W
Run
Delete
Rename
new.tar
22.98 MB
2026-05-07 12:05:44
R
W
Run
Delete
Rename
new.tar.gz
1.37 MB
2026-05-07 12:05:45
R
W
Run
Delete
Rename
p.php.php.tar.gz
307 By
2026-05-07 12:05:08
R
W
Run
Delete
Rename
p.php.tar
2 KB
2026-05-07 12:05:08
R
W
Run
Delete
Rename
php-cli.tar
2 KB
2026-05-07 11:06:07
R
W
Run
Delete
Rename
php-cli.tar.gz
111 By
2026-05-07 11:06:07
R
W
Run
Delete
Rename
php-cli.zip
169 By
2026-05-07 11:05:47
R
W
Run
Delete
Rename
php.ini.swp.ini.swp.tar.gz
3.56 KB
2026-05-07 12:11:16
R
W
Run
Delete
Rename
php.ini.swp.tar
17.5 KB
2026-05-07 12:11:16
R
W
Run
Delete
Rename
php.tar
12 KB
2026-05-07 11:14:27
R
W
Run
Delete
Rename
php.tar.gz
983 By
2026-05-07 11:06:57
R
W
Run
Delete
Rename
php.zip
4.72 KB
2026-05-07 11:15:10
R
W
Run
Delete
Rename
prepend.txt.tar
121.1 MB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
prepend.txt.txt.tar.gz
12.71 MB
2026-05-07 12:06:21
R
W
Run
Delete
Rename
public_ftp.zip
975.85 MB
2026-05-07 11:06:47
R
W
Run
Delete
Rename
public_html.tar
977.12 MB
2026-05-07 12:06:28
R
W
Run
Delete
Rename
public_html.tar.gz
32 KB
2026-05-07 12:06:52
R
W
Run
Delete
Rename
robots.txt
2.34 KB
2026-05-07 07:32:42
R
W
Run
Delete
Rename
robots.txt.tar
4 KB
2026-05-07 10:03:14
R
W
Run
Delete
Rename
robots.txt.txt.tar.gz
322 By
2026-05-07 10:03:14
R
W
Run
Delete
Rename
roundcube.tar
9.5 KB
2026-05-07 12:05:24
R
W
Run
Delete
Rename
roundcube.tar.gz
1.55 KB
2026-05-07 12:05:24
R
W
Run
Delete
Rename
saveData.php.php.tar.gz
445 By
2026-05-07 12:06:09
R
W
Run
Delete
Rename
saveData.php.tar
2.5 KB
2026-05-07 12:06:09
R
W
Run
Delete
Rename
save_admin_details.php.php.tar.gz
779 By
2026-05-07 12:06:15
R
W
Run
Delete
Rename
save_admin_details.php.tar
4 KB
2026-05-07 12:06:15
R
W
Run
Delete
Rename
scrum_toptrendingappstudio_com.php.error.log.php.error.log.tar.gz
125.37 KB
2026-05-07 12:08:05
R
W
Run
Delete
Rename
scrum_toptrendingappstudio_com.php.error.log.tar
1.9 MB
2026-05-07 12:08:04
R
W
Run
Delete
Rename
share.zip
183 By
2026-05-07 12:05:55
R
W
Run
Delete
Rename
ssl.zip
717.75 KB
2026-05-07 11:06:08
R
W
Run
Delete
Rename
storage.sqlite.sqlite.tar.gz
521 By
2026-05-07 12:06:07
R
W
Run
Delete
Rename
storage.sqlite.tar
17.5 KB
2026-05-07 12:06:07
R
W
Run
Delete
Rename
toptrendingappst.rcube.db.1771972649.rcube.db.1771972649.tar.gz
12.34 KB
2026-05-07 12:08:05
R
W
Run
Delete
Rename
toptrendingappst.rcube.db.1771972649.tar
457.5 KB
2026-05-07 12:08:05
R
W
Run
Delete
Rename
userAudio_30.3gp.3gp.tar.gz
22.83 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
userAudio_30.3gp.tar
31 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
userAudio_99.3gp.3gp.tar.gz
612 By
2026-05-07 12:06:15
R
W
Run
Delete
Rename
userAudio_99.3gp.tar
12.5 KB
2026-05-07 12:06:15
R
W
Run
Delete
Rename
www.tar
117.38 MB
2026-05-07 11:06:08
R
W
Run
Delete
Rename
www.tar.gz
39.75 MB
2026-05-07 11:06:12
R
W
Run
Delete
Rename
www.zip
3.54 MB
2026-05-07 11:05:46
R
W
Run
Delete
Rename
error_log
up
📄
bin.zip
Save
PK �h�\xu;9t t @ vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher\Dumper; use Symfony\Component\Routing\RouteCollection; /** * MatcherDumperInterface is the interface that all matcher dumper classes must implement. * * @author Fabien Potencier <fabien@symfony.com> */ interface MatcherDumperInterface { /** * Dumps a set of routes to a string representation of executable code * that can then be used to match a request against these routes. * * @return string */ public function dump(array $options = []); /** * Gets the routes to dump. * * @return RouteCollection */ public function getRoutes(); } PK �h�\��d� � @ vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher\Dumper; use Symfony\Component\Routing\RouteCollection; /** * Prefix tree of routes preserving routes order. * * @author Frank de Jonge <info@frankdejonge.nl> * @author Nicolas Grekas <p@tchwork.com> * * @internal */ class StaticPrefixCollection { private $prefix; /** * @var string[] */ private $staticPrefixes = []; /** * @var string[] */ private $prefixes = []; /** * @var array[]|self[] */ private $items = []; public function __construct(string $prefix = '/') { $this->prefix = $prefix; } public function getPrefix(): string { return $this->prefix; } /** * @return array[]|self[] */ public function getRoutes(): array { return $this->items; } /** * Adds a route to a group. * * @param array|self $route */ public function addRoute(string $prefix, $route) { [$prefix, $staticPrefix] = $this->getCommonPrefix($prefix, $prefix); for ($i = \count($this->items) - 1; 0 <= $i; --$i) { $item = $this->items[$i]; [$commonPrefix, $commonStaticPrefix] = $this->getCommonPrefix($prefix, $this->prefixes[$i]); if ($this->prefix === $commonPrefix) { // the new route and a previous one have no common prefix, let's see if they are exclusive to each others if ($this->prefix !== $staticPrefix && $this->prefix !== $this->staticPrefixes[$i]) { // the new route and the previous one have exclusive static prefixes continue; } if ($this->prefix === $staticPrefix && $this->prefix === $this->staticPrefixes[$i]) { // the new route and the previous one have no static prefix break; } if ($this->prefixes[$i] !== $this->staticPrefixes[$i] && $this->prefix === $this->staticPrefixes[$i]) { // the previous route is non-static and has no static prefix break; } if ($prefix !== $staticPrefix && $this->prefix === $staticPrefix) { // the new route is non-static and has no static prefix break; } continue; } if ($item instanceof self && $this->prefixes[$i] === $commonPrefix) { // the new route is a child of a previous one, let's nest it $item->addRoute($prefix, $route); } else { // the new route and a previous one have a common prefix, let's merge them $child = new self($commonPrefix); [$child->prefixes[0], $child->staticPrefixes[0]] = $child->getCommonPrefix($this->prefixes[$i], $this->prefixes[$i]); [$child->prefixes[1], $child->staticPrefixes[1]] = $child->getCommonPrefix($prefix, $prefix); $child->items = [$this->items[$i], $route]; $this->staticPrefixes[$i] = $commonStaticPrefix; $this->prefixes[$i] = $commonPrefix; $this->items[$i] = $child; } return; } // No optimised case was found, in this case we simple add the route for possible // grouping when new routes are added. $this->staticPrefixes[] = $staticPrefix; $this->prefixes[] = $prefix; $this->items[] = $route; } /** * Linearizes back a set of nested routes into a collection. */ public function populateCollection(RouteCollection $routes): RouteCollection { foreach ($this->items as $route) { if ($route instanceof self) { $route->populateCollection($routes); } else { $routes->add(...$route); } } return $routes; } /** * Gets the full and static common prefixes between two route patterns. * * The static prefix stops at last at the first opening bracket. */ private function getCommonPrefix(string $prefix, string $anotherPrefix): array { $baseLength = \strlen($this->prefix); $end = min(\strlen($prefix), \strlen($anotherPrefix)); $staticLength = null; set_error_handler([__CLASS__, 'handleError']); try { for ($i = $baseLength; $i < $end && $prefix[$i] === $anotherPrefix[$i]; ++$i) { if ('(' === $prefix[$i]) { $staticLength = $staticLength ?? $i; for ($j = 1 + $i, $n = 1; $j < $end && 0 < $n; ++$j) { if ($prefix[$j] !== $anotherPrefix[$j]) { break 2; } if ('(' === $prefix[$j]) { ++$n; } elseif (')' === $prefix[$j]) { --$n; } elseif ('\\' === $prefix[$j] && (++$j === $end || $prefix[$j] !== $anotherPrefix[$j])) { --$j; break; } } if (0 < $n) { break; } if (('?' === ($prefix[$j] ?? '') || '?' === ($anotherPrefix[$j] ?? '')) && ($prefix[$j] ?? '') !== ($anotherPrefix[$j] ?? '')) { break; } $subPattern = substr($prefix, $i, $j - $i); if ($prefix !== $anotherPrefix && !preg_match('/^\(\[[^\]]++\]\+\+\)$/', $subPattern) && !preg_match('{(?<!'.$subPattern.')}', '')) { // sub-patterns of variable length are not considered as common prefixes because their greediness would break in-order matching break; } $i = $j - 1; } elseif ('\\' === $prefix[$i] && (++$i === $end || $prefix[$i] !== $anotherPrefix[$i])) { --$i; break; } } } finally { restore_error_handler(); } if ($i < $end && 0b10 === (\ord($prefix[$i]) >> 6) && preg_match('//u', $prefix.' '.$anotherPrefix)) { do { // Prevent cutting in the middle of an UTF-8 characters --$i; } while (0b10 === (\ord($prefix[$i]) >> 6)); } return [substr($prefix, 0, $i), substr($prefix, 0, $staticLength ?? $i)]; } public static function handleError(int $type, string $msg) { return str_contains($msg, 'Compilation failed: lookbehind assertion is not fixed length'); } } PK �h�\���� � A vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher\Dumper; use Symfony\Component\Routing\Exception\MethodNotAllowedException; use Symfony\Component\Routing\Exception\NoConfigurationException; use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface; use Symfony\Component\Routing\RequestContext; /** * @author Nicolas Grekas <p@tchwork.com> * * @internal * * @property RequestContext $context */ trait CompiledUrlMatcherTrait { private $matchHost = false; private $staticRoutes = []; private $regexpList = []; private $dynamicRoutes = []; /** * @var callable|null */ private $checkCondition; public function match(string $pathinfo): array { $allow = $allowSchemes = []; if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { return $ret; } if ($allow) { throw new MethodNotAllowedException(array_keys($allow)); } if (!$this instanceof RedirectableUrlMatcherInterface) { throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo)); } if (!\in_array($this->context->getMethod(), ['HEAD', 'GET'], true)) { // no-op } elseif ($allowSchemes) { redirect_scheme: $scheme = $this->context->getScheme(); $this->context->setScheme(key($allowSchemes)); try { if ($ret = $this->doMatch($pathinfo)) { return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; } } finally { $this->context->setScheme($scheme); } } elseif ('/' !== $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/') { $pathinfo = $trimmedPathinfo === $pathinfo ? $pathinfo.'/' : $trimmedPathinfo; if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { return $this->redirect($pathinfo, $ret['_route']) + $ret; } if ($allowSchemes) { goto redirect_scheme; } } throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo)); } private function doMatch(string $pathinfo, array &$allow = [], array &$allowSchemes = []): array { $allow = $allowSchemes = []; $pathinfo = rawurldecode($pathinfo) ?: '/'; $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/'; $context = $this->context; $requestMethod = $canonicalMethod = $context->getMethod(); if ($this->matchHost) { $host = strtolower($context->getHost()); } if ('HEAD' === $requestMethod) { $canonicalMethod = 'GET'; } $supportsRedirections = 'GET' === $canonicalMethod && $this instanceof RedirectableUrlMatcherInterface; foreach ($this->staticRoutes[$trimmedPathinfo] ?? [] as [$ret, $requiredHost, $requiredMethods, $requiredSchemes, $hasTrailingSlash, , $condition]) { if ($condition && !($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) { continue; } if ($requiredHost) { if ('{' !== $requiredHost[0] ? $requiredHost !== $host : !preg_match($requiredHost, $host, $hostMatches)) { continue; } if ('{' === $requiredHost[0] && $hostMatches) { $hostMatches['_route'] = $ret['_route']; $ret = $this->mergeDefaults($hostMatches, $ret); } } if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ($supportsRedirections && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } continue; } $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); if ($hasRequiredScheme && $requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { $allow += $requiredMethods; continue; } if (!$hasRequiredScheme) { $allowSchemes += $requiredSchemes; continue; } return $ret; } $matchedPathinfo = $this->matchHost ? $host.'.'.$pathinfo : $pathinfo; foreach ($this->regexpList as $offset => $regex) { while (preg_match($regex, $matchedPathinfo, $matches)) { foreach ($this->dynamicRoutes[$m = (int) $matches['MARK']] as [$ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar, $condition]) { if (null !== $condition) { if (0 === $condition) { // marks the last route in the regexp continue 3; } if (!($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) { continue; } } $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; if ($hasTrailingVar && ($hasTrailingSlash || (null === $n = $matches[\count($vars)] ?? null) || '/' !== ($n[-1] ?? '/')) && preg_match($regex, $this->matchHost ? $host.'.'.$trimmedPathinfo : $trimmedPathinfo, $n) && $m === (int) $n['MARK']) { if ($hasTrailingSlash) { $matches = $n; } else { $hasTrailingVar = false; } } if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ($supportsRedirections && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } continue; } foreach ($vars as $i => $v) { if (isset($matches[1 + $i])) { $ret[$v] = $matches[1 + $i]; } } if ($requiredSchemes && !isset($requiredSchemes[$context->getScheme()])) { $allowSchemes += $requiredSchemes; continue; } if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { $allow += $requiredMethods; continue; } return $ret; } $regex = substr_replace($regex, 'F', $m - $offset, 1 + \strlen($m)); $offset += \strlen($m); } } if ('/' === $pathinfo && !$allow && !$allowSchemes) { throw new NoConfigurationException(); } return []; } } PK �h�\4�%KJ KJ B vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher\Dumper; use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; /** * CompiledUrlMatcherDumper creates PHP arrays to be used with CompiledUrlMatcher. * * @author Fabien Potencier <fabien@symfony.com> * @author Tobias Schultze <http://tobion.de> * @author Arnaud Le Blanc <arnaud.lb@gmail.com> * @author Nicolas Grekas <p@tchwork.com> */ class CompiledUrlMatcherDumper extends MatcherDumper { private $expressionLanguage; private $signalingException; /** * @var ExpressionFunctionProviderInterface[] */ private $expressionLanguageProviders = []; /** * {@inheritdoc} */ public function dump(array $options = []) { return <<<EOF <?php /** * This file has been auto-generated * by the Symfony Routing Component. */ return [ {$this->generateCompiledRoutes()}]; EOF; } public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) { $this->expressionLanguageProviders[] = $provider; } /** * Generates the arrays for CompiledUrlMatcher's constructor. */ public function getCompiledRoutes(bool $forDump = false): array { // Group hosts by same-suffix, re-order when possible $matchHost = false; $routes = new StaticPrefixCollection(); foreach ($this->getRoutes()->all() as $name => $route) { if ($host = $route->getHost()) { $matchHost = true; $host = '/'.strtr(strrev($host), '}.{', '(/)'); } $routes->addRoute($host ?: '/(.*)', [$name, $route]); } if ($matchHost) { $compiledRoutes = [true]; $routes = $routes->populateCollection(new RouteCollection()); } else { $compiledRoutes = [false]; $routes = $this->getRoutes(); } [$staticRoutes, $dynamicRoutes] = $this->groupStaticRoutes($routes); $conditions = [null]; $compiledRoutes[] = $this->compileStaticRoutes($staticRoutes, $conditions); $chunkLimit = \count($dynamicRoutes); while (true) { try { $this->signalingException = new \RuntimeException('Compilation failed: regular expression is too large'); $compiledRoutes = array_merge($compiledRoutes, $this->compileDynamicRoutes($dynamicRoutes, $matchHost, $chunkLimit, $conditions)); break; } catch (\Exception $e) { if (1 < $chunkLimit && $this->signalingException === $e) { $chunkLimit = 1 + ($chunkLimit >> 1); continue; } throw $e; } } if ($forDump) { $compiledRoutes[2] = $compiledRoutes[4]; } unset($conditions[0]); if ($conditions) { foreach ($conditions as $expression => $condition) { $conditions[$expression] = "case {$condition}: return {$expression};"; } $checkConditionCode = <<<EOF static function (\$condition, \$context, \$request) { // \$checkCondition switch (\$condition) { {$this->indent(implode("\n", $conditions), 3)} } } EOF; $compiledRoutes[4] = $forDump ? $checkConditionCode.",\n" : eval('return '.$checkConditionCode.';'); } else { $compiledRoutes[4] = $forDump ? " null, // \$checkCondition\n" : null; } return $compiledRoutes; } private function generateCompiledRoutes(): string { [$matchHost, $staticRoutes, $regexpCode, $dynamicRoutes, $checkConditionCode] = $this->getCompiledRoutes(true); $code = self::export($matchHost).', // $matchHost'."\n"; $code .= '[ // $staticRoutes'."\n"; foreach ($staticRoutes as $path => $routes) { $code .= sprintf(" %s => [\n", self::export($path)); foreach ($routes as $route) { $code .= sprintf(" [%s, %s, %s, %s, %s, %s, %s],\n", ...array_map([__CLASS__, 'export'], $route)); } $code .= " ],\n"; } $code .= "],\n"; $code .= sprintf("[ // \$regexpList%s\n],\n", $regexpCode); $code .= '[ // $dynamicRoutes'."\n"; foreach ($dynamicRoutes as $path => $routes) { $code .= sprintf(" %s => [\n", self::export($path)); foreach ($routes as $route) { $code .= sprintf(" [%s, %s, %s, %s, %s, %s, %s],\n", ...array_map([__CLASS__, 'export'], $route)); } $code .= " ],\n"; } $code .= "],\n"; $code = preg_replace('/ => \[\n (\[.+?),\n \],/', ' => [$1],', $code); return $this->indent($code, 1).$checkConditionCode; } /** * Splits static routes from dynamic routes, so that they can be matched first, using a simple switch. */ private function groupStaticRoutes(RouteCollection $collection): array { $staticRoutes = $dynamicRegex = []; $dynamicRoutes = new RouteCollection(); foreach ($collection->all() as $name => $route) { $compiledRoute = $route->compile(); $staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/'); $hostRegex = $compiledRoute->getHostRegex(); $regex = $compiledRoute->getRegex(); if ($hasTrailingSlash = '/' !== $route->getPath()) { $pos = strrpos($regex, '$'); $hasTrailingSlash = '/' === $regex[$pos - 1]; $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); } if (!$compiledRoute->getPathVariables()) { $host = !$compiledRoute->getHostVariables() ? $route->getHost() : ''; $url = $route->getPath(); if ($hasTrailingSlash) { $url = substr($url, 0, -1); } foreach ($dynamicRegex as [$hostRx, $rx, $prefix]) { if (('' === $prefix || str_starts_with($url, $prefix)) && (preg_match($rx, $url) || preg_match($rx, $url.'/')) && (!$host || !$hostRx || preg_match($hostRx, $host))) { $dynamicRegex[] = [$hostRegex, $regex, $staticPrefix]; $dynamicRoutes->add($name, $route); continue 2; } } $staticRoutes[$url][$name] = [$route, $hasTrailingSlash]; } else { $dynamicRegex[] = [$hostRegex, $regex, $staticPrefix]; $dynamicRoutes->add($name, $route); } } return [$staticRoutes, $dynamicRoutes]; } /** * Compiles static routes in a switch statement. * * Condition-less paths are put in a static array in the switch's default, with generic matching logic. * Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases. * * @throws \LogicException */ private function compileStaticRoutes(array $staticRoutes, array &$conditions): array { if (!$staticRoutes) { return []; } $compiledRoutes = []; foreach ($staticRoutes as $url => $routes) { $compiledRoutes[$url] = []; foreach ($routes as $name => [$route, $hasTrailingSlash]) { $compiledRoutes[$url][] = $this->compileRoute($route, $name, (!$route->compile()->getHostVariables() ? $route->getHost() : $route->compile()->getHostRegex()) ?: null, $hasTrailingSlash, false, $conditions); } } return $compiledRoutes; } /** * Compiles a regular expression followed by a switch statement to match dynamic routes. * * The regular expression matches both the host and the pathinfo at the same time. For stellar performance, * it is built as a tree of patterns, with re-ordering logic to group same-prefix routes together when possible. * * Patterns are named so that we know which one matched (https://pcre.org/current/doc/html/pcre2syntax.html#SEC23). * This name is used to "switch" to the additional logic required to match the final route. * * Condition-less paths are put in a static array in the switch's default, with generic matching logic. * Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases. * * Last but not least: * - Because it is not possible to mix unicode/non-unicode patterns in a single regexp, several of them can be generated. * - The same regexp can be used several times when the logic in the switch rejects the match. When this happens, the * matching-but-failing subpattern is excluded by replacing its name by "(*F)", which forces a failure-to-match. * To ease this backlisting operation, the name of subpatterns is also the string offset where the replacement should occur. */ private function compileDynamicRoutes(RouteCollection $collection, bool $matchHost, int $chunkLimit, array &$conditions): array { if (!$collection->all()) { return [[], [], '']; } $regexpList = []; $code = ''; $state = (object) [ 'regexMark' => 0, 'regex' => [], 'routes' => [], 'mark' => 0, 'markTail' => 0, 'hostVars' => [], 'vars' => [], ]; $state->getVars = static function ($m) use ($state) { if ('_route' === $m[1]) { return '?:'; } $state->vars[] = $m[1]; return ''; }; $chunkSize = 0; $prev = null; $perModifiers = []; foreach ($collection->all() as $name => $route) { preg_match('#[a-zA-Z]*$#', $route->compile()->getRegex(), $rx); if ($chunkLimit < ++$chunkSize || $prev !== $rx[0] && $route->compile()->getPathVariables()) { $chunkSize = 1; $routes = new RouteCollection(); $perModifiers[] = [$rx[0], $routes]; $prev = $rx[0]; } $routes->add($name, $route); } foreach ($perModifiers as [$modifiers, $routes]) { $prev = false; $perHost = []; foreach ($routes->all() as $name => $route) { $regex = $route->compile()->getHostRegex(); if ($prev !== $regex) { $routes = new RouteCollection(); $perHost[] = [$regex, $routes]; $prev = $regex; } $routes->add($name, $route); } $prev = false; $rx = '{^(?'; $code .= "\n {$state->mark} => ".self::export($rx); $startingMark = $state->mark; $state->mark += \strlen($rx); $state->regex = $rx; foreach ($perHost as [$hostRegex, $routes]) { if ($matchHost) { if ($hostRegex) { preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $hostRegex, $rx); $state->vars = []; $hostRegex = '(?i:'.preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]).')\.'; $state->hostVars = $state->vars; } else { $hostRegex = '(?:(?:[^./]*+\.)++)'; $state->hostVars = []; } $state->mark += \strlen($rx = ($prev ? ')' : '')."|{$hostRegex}(?"); $code .= "\n .".self::export($rx); $state->regex .= $rx; $prev = true; } $tree = new StaticPrefixCollection(); foreach ($routes->all() as $name => $route) { preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $route->compile()->getRegex(), $rx); $state->vars = []; $regex = preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]); if ($hasTrailingSlash = '/' !== $regex && '/' === $regex[-1]) { $regex = substr($regex, 0, -1); } $hasTrailingVar = (bool) preg_match('#\{\w+\}/?$#', $route->getPath()); $tree->addRoute($regex, [$name, $regex, $state->vars, $route, $hasTrailingSlash, $hasTrailingVar]); } $code .= $this->compileStaticPrefixCollection($tree, $state, 0, $conditions); } if ($matchHost) { $code .= "\n .')'"; $state->regex .= ')'; } $rx = ")/?$}{$modifiers}"; $code .= "\n .'{$rx}',"; $state->regex .= $rx; $state->markTail = 0; // if the regex is too large, throw a signaling exception to recompute with smaller chunk size set_error_handler(function ($type, $message) { throw str_contains($message, $this->signalingException->getMessage()) ? $this->signalingException : new \ErrorException($message); }); try { preg_match($state->regex, ''); } finally { restore_error_handler(); } $regexpList[$startingMark] = $state->regex; } $state->routes[$state->mark][] = [null, null, null, null, false, false, 0]; unset($state->getVars); return [$regexpList, $state->routes, $code]; } /** * Compiles a regexp tree of subpatterns that matches nested same-prefix routes. * * @param \stdClass $state A simple state object that keeps track of the progress of the compilation, * and gathers the generated switch's "case" and "default" statements */ private function compileStaticPrefixCollection(StaticPrefixCollection $tree, \stdClass $state, int $prefixLen, array &$conditions): string { $code = ''; $prevRegex = null; $routes = $tree->getRoutes(); foreach ($routes as $i => $route) { if ($route instanceof StaticPrefixCollection) { $prevRegex = null; $prefix = substr($route->getPrefix(), $prefixLen); $state->mark += \strlen($rx = "|{$prefix}(?"); $code .= "\n .".self::export($rx); $state->regex .= $rx; $code .= $this->indent($this->compileStaticPrefixCollection($route, $state, $prefixLen + \strlen($prefix), $conditions)); $code .= "\n .')'"; $state->regex .= ')'; ++$state->markTail; continue; } [$name, $regex, $vars, $route, $hasTrailingSlash, $hasTrailingVar] = $route; $compiledRoute = $route->compile(); $vars = array_merge($state->hostVars, $vars); if ($compiledRoute->getRegex() === $prevRegex) { $state->routes[$state->mark][] = $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions); continue; } $state->mark += 3 + $state->markTail + \strlen($regex) - $prefixLen; $state->markTail = 2 + \strlen($state->mark); $rx = sprintf('|%s(*:%s)', substr($regex, $prefixLen), $state->mark); $code .= "\n .".self::export($rx); $state->regex .= $rx; $prevRegex = $compiledRoute->getRegex(); $state->routes[$state->mark] = [$this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions)]; } return $code; } /** * Compiles a single Route to PHP code used to match it against the path info. */ private function compileRoute(Route $route, string $name, $vars, bool $hasTrailingSlash, bool $hasTrailingVar, array &$conditions): array { $defaults = $route->getDefaults(); if (isset($defaults['_canonical_route'])) { $name = $defaults['_canonical_route']; unset($defaults['_canonical_route']); } if ($condition = $route->getCondition()) { $condition = $this->getExpressionLanguage()->compile($condition, ['context', 'request']); $condition = $conditions[$condition] ?? $conditions[$condition] = (str_contains($condition, '$request') ? 1 : -1) * \count($conditions); } else { $condition = null; } return [ ['_route' => $name] + $defaults, $vars, array_flip($route->getMethods()) ?: null, array_flip($route->getSchemes()) ?: null, $hasTrailingSlash, $hasTrailingVar, $condition, ]; } private function getExpressionLanguage(): ExpressionLanguage { if (null === $this->expressionLanguage) { if (!class_exists(ExpressionLanguage::class)) { throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); } $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); } return $this->expressionLanguage; } private function indent(string $code, int $level = 1): string { return preg_replace('/^./m', str_repeat(' ', $level).'$0', $code); } /** * @internal */ public static function export($value): string { if (null === $value) { return 'null'; } if (!\is_array($value)) { if (\is_object($value)) { throw new \InvalidArgumentException('Symfony\Component\Routing\Route cannot contain objects.'); } return str_replace("\n", '\'."\n".\'', var_export($value, true)); } if (!$value) { return '[]'; } $i = 0; $export = '['; foreach ($value as $k => $v) { if ($i === $k) { ++$i; } else { $export .= self::export($k).' => '; if (\is_int($k) && $i < $k) { $i = 1 + $k; } } $export .= self::export($v).', '; } return substr_replace($export, ']', -2); } } PK �h�\�#R� 7 vendor/symfony/routing/Matcher/Dumper/MatcherDumper.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher\Dumper; use Symfony\Component\Routing\RouteCollection; /** * MatcherDumper is the abstract class for all built-in matcher dumpers. * * @author Fabien Potencier <fabien@symfony.com> */ abstract class MatcherDumper implements MatcherDumperInterface { private $routes; public function __construct(RouteCollection $routes) { $this->routes = $routes; } /** * {@inheritdoc} */ public function getRoutes() { return $this->routes; } } PK �h�\c��� � ( vendor/symfony/routing/Matcher/error_lognu �[��� [06-May-2026 02:13:25 UTC] PHP Fatal error: Uncaught Error: Interface "Symfony\Component\Routing\RequestContextAwareInterface" not found in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/UrlMatcherInterface.php:24 Stack trace: #0 {main} thrown in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/UrlMatcherInterface.php on line 24 [06-May-2026 02:13:28 UTC] PHP Fatal error: Uncaught Error: Interface "Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface" not found in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php:23 Stack trace: #0 {main} thrown in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php on line 23 [06-May-2026 02:13:38 UTC] PHP Fatal error: Uncaught Error: Class "Symfony\Component\Routing\Matcher\UrlMatcher" not found in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php:20 Stack trace: #0 {main} thrown in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php on line 20 [06-May-2026 02:13:56 UTC] PHP Fatal error: Uncaught Error: Interface "Symfony\Component\Routing\Matcher\UrlMatcherInterface" not found in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/UrlMatcher.php:29 Stack trace: #0 {main} thrown in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/UrlMatcher.php on line 29 [06-May-2026 02:13:58 UTC] PHP Fatal error: Uncaught Error: Class "Symfony\Component\Routing\Matcher\UrlMatcher" not found in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/TraceableUrlMatcher.php:24 Stack trace: #0 {main} thrown in /home/toptrendingappst/bin/vendor/symfony/routing/Matcher/TraceableUrlMatcher.php on line 24 PK �h�\���,�# �# - vendor/symfony/routing/Matcher/UrlMatcher.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Exception\MethodNotAllowedException; use Symfony\Component\Routing\Exception\NoConfigurationException; use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; /** * UrlMatcher matches URL based on a set of routes. * * @author Fabien Potencier <fabien@symfony.com> */ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface { public const REQUIREMENT_MATCH = 0; public const REQUIREMENT_MISMATCH = 1; public const ROUTE_MATCH = 2; /** @var RequestContext */ protected $context; /** * Collects HTTP methods that would be allowed for the request. */ protected $allow = []; /** * Collects URI schemes that would be allowed for the request. * * @internal */ protected $allowSchemes = []; protected $routes; protected $request; protected $expressionLanguage; /** * @var ExpressionFunctionProviderInterface[] */ protected $expressionLanguageProviders = []; public function __construct(RouteCollection $routes, RequestContext $context) { $this->routes = $routes; $this->context = $context; } /** * {@inheritdoc} */ public function setContext(RequestContext $context) { $this->context = $context; } /** * {@inheritdoc} */ public function getContext() { return $this->context; } /** * {@inheritdoc} */ public function match(string $pathinfo) { $this->allow = $this->allowSchemes = []; if ($ret = $this->matchCollection(rawurldecode($pathinfo) ?: '/', $this->routes)) { return $ret; } if ('/' === $pathinfo && !$this->allow && !$this->allowSchemes) { throw new NoConfigurationException(); } throw 0 < \count($this->allow) ? new MethodNotAllowedException(array_unique($this->allow)) : new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo)); } /** * {@inheritdoc} */ public function matchRequest(Request $request) { $this->request = $request; $ret = $this->match($request->getPathInfo()); $this->request = null; return $ret; } public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) { $this->expressionLanguageProviders[] = $provider; } /** * Tries to match a URL with a set of routes. * * @param string $pathinfo The path info to be parsed * * @return array * * @throws NoConfigurationException If no routing configuration could be found * @throws ResourceNotFoundException If the resource could not be found * @throws MethodNotAllowedException If the resource was found but the request method is not allowed */ protected function matchCollection(string $pathinfo, RouteCollection $routes) { // HEAD and GET are equivalent as per RFC if ('HEAD' === $method = $this->context->getMethod()) { $method = 'GET'; } $supportsTrailingSlash = 'GET' === $method && $this instanceof RedirectableUrlMatcherInterface; $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/'; foreach ($routes as $name => $route) { $compiledRoute = $route->compile(); $staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/'); $requiredMethods = $route->getMethods(); // check the static prefix of the URL first. Only use the more expensive preg_match when it matches if ('' !== $staticPrefix && !str_starts_with($trimmedPathinfo, $staticPrefix)) { continue; } $regex = $compiledRoute->getRegex(); $pos = strrpos($regex, '$'); $hasTrailingSlash = '/' === $regex[$pos - 1]; $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); if (!preg_match($regex, $pathinfo, $matches)) { continue; } $hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath()); if ($hasTrailingVar && ($hasTrailingSlash || (null === $m = $matches[\count($compiledRoute->getPathVariables())] ?? null) || '/' !== ($m[-1] ?? '/')) && preg_match($regex, $trimmedPathinfo, $m)) { if ($hasTrailingSlash) { $matches = $m; } else { $hasTrailingVar = false; } } $hostMatches = []; if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) { continue; } $status = $this->handleRouteRequirements($pathinfo, $name, $route); if (self::REQUIREMENT_MISMATCH === $status[0]) { continue; } if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) { return $this->allow = $this->allowSchemes = []; } continue; } if ($route->getSchemes() && !$route->hasScheme($this->context->getScheme())) { $this->allowSchemes = array_merge($this->allowSchemes, $route->getSchemes()); continue; } if ($requiredMethods && !\in_array($method, $requiredMethods)) { $this->allow = array_merge($this->allow, $requiredMethods); continue; } return $this->getAttributes($route, $name, array_replace($matches, $hostMatches, $status[1] ?? [])); } return []; } /** * Returns an array of values to use as request attributes. * * As this method requires the Route object, it is not available * in matchers that do not have access to the matched Route instance * (like the PHP and Apache matcher dumpers). * * @return array */ protected function getAttributes(Route $route, string $name, array $attributes) { $defaults = $route->getDefaults(); if (isset($defaults['_canonical_route'])) { $name = $defaults['_canonical_route']; unset($defaults['_canonical_route']); } $attributes['_route'] = $name; return $this->mergeDefaults($attributes, $defaults); } /** * Handles specific route requirements. * * @return array The first element represents the status, the second contains additional information */ protected function handleRouteRequirements(string $pathinfo, string $name, Route $route) { // expression condition if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), ['context' => $this->context, 'request' => $this->request ?: $this->createRequest($pathinfo)])) { return [self::REQUIREMENT_MISMATCH, null]; } return [self::REQUIREMENT_MATCH, null]; } /** * Get merged default parameters. * * @return array */ protected function mergeDefaults(array $params, array $defaults) { foreach ($params as $key => $value) { if (!\is_int($key) && null !== $value) { $defaults[$key] = $value; } } return $defaults; } protected function getExpressionLanguage() { if (null === $this->expressionLanguage) { if (!class_exists(ExpressionLanguage::class)) { throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); } $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); } return $this->expressionLanguage; } /** * @internal */ protected function createRequest(string $pathinfo): ?Request { if (!class_exists(Request::class)) { return null; } return Request::create($this->context->getScheme().'://'.$this->context->getHost().$this->context->getBaseUrl().$pathinfo, $this->context->getMethod(), $this->context->getParameters(), [], [], [ 'SCRIPT_FILENAME' => $this->context->getBaseUrl(), 'SCRIPT_NAME' => $this->context->getBaseUrl(), ]); } } PK �h�\K�a� � : vendor/symfony/routing/Matcher/RequestMatcherInterface.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Exception\MethodNotAllowedException; use Symfony\Component\Routing\Exception\NoConfigurationException; use Symfony\Component\Routing\Exception\ResourceNotFoundException; /** * RequestMatcherInterface is the interface that all request matcher classes must implement. * * @author Fabien Potencier <fabien@symfony.com> */ interface RequestMatcherInterface { /** * Tries to match a request with a set of routes. * * If the matcher cannot find information, it must throw one of the exceptions documented * below. * * @return array * * @throws NoConfigurationException If no routing configuration could be found * @throws ResourceNotFoundException If no matching resource could be found * @throws MethodNotAllowedException If a matching resource was found but the request method is not allowed */ public function matchRequest(Request $request); } PK �h�\�=�1t t B vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; /** * RedirectableUrlMatcherInterface knows how to redirect the user. * * @author Fabien Potencier <fabien@symfony.com> */ interface RedirectableUrlMatcherInterface { /** * Redirects the user to another URL and returns the parameters for the redirection. * * @param string $path The path info to redirect to * @param string $route The route name that matched * @param string|null $scheme The URL scheme (null to keep the current one) * * @return array */ public function redirect(string $path, string $route, string $scheme = null); } PK �h�\'�^�o o 6 vendor/symfony/routing/Matcher/UrlMatcherInterface.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\Routing\Exception\MethodNotAllowedException; use Symfony\Component\Routing\Exception\NoConfigurationException; use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\RequestContextAwareInterface; /** * UrlMatcherInterface is the interface that all URL matcher classes must implement. * * @author Fabien Potencier <fabien@symfony.com> */ interface UrlMatcherInterface extends RequestContextAwareInterface { /** * Tries to match a URL path with a set of routes. * * If the matcher cannot find information, it must throw one of the exceptions documented * below. * * @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded) * * @return array * * @throws NoConfigurationException If no routing configuration could be found * @throws ResourceNotFoundException If the resource could not be found * @throws MethodNotAllowedException If the resource was found but the request method is not allowed */ public function match(string $pathinfo); } PK �h�\�v��2 2 9 vendor/symfony/routing/Matcher/RedirectableUrlMatcher.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\Routing\Exception\ExceptionInterface; use Symfony\Component\Routing\Exception\ResourceNotFoundException; /** * @author Fabien Potencier <fabien@symfony.com> */ abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface { /** * {@inheritdoc} */ public function match(string $pathinfo) { try { return parent::match($pathinfo); } catch (ResourceNotFoundException $e) { if (!\in_array($this->context->getMethod(), ['HEAD', 'GET'], true)) { throw $e; } if ($this->allowSchemes) { redirect_scheme: $scheme = $this->context->getScheme(); $this->context->setScheme(current($this->allowSchemes)); try { $ret = parent::match($pathinfo); return $this->redirect($pathinfo, $ret['_route'] ?? null, $this->context->getScheme()) + $ret; } catch (ExceptionInterface $e2) { throw $e; } finally { $this->context->setScheme($scheme); } } elseif ('/' === $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/') { throw $e; } else { try { $pathinfo = $trimmedPathinfo === $pathinfo ? $pathinfo.'/' : $trimmedPathinfo; $ret = parent::match($pathinfo); return $this->redirect($pathinfo, $ret['_route'] ?? null) + $ret; } catch (ExceptionInterface $e2) { if ($this->allowSchemes) { goto redirect_scheme; } throw $e; } } } } } PK �h�\ڙ�i] ] 5 vendor/symfony/routing/Matcher/CompiledUrlMatcher.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait; use Symfony\Component\Routing\RequestContext; /** * Matches URLs based on rules dumped by CompiledUrlMatcherDumper. * * @author Nicolas Grekas <p@tchwork.com> */ class CompiledUrlMatcher extends UrlMatcher { use CompiledUrlMatcherTrait; public function __construct(array $compiledRoutes, RequestContext $context) { $this->context = $context; [$this->matchHost, $this->staticRoutes, $this->regexpList, $this->dynamicRoutes, $this->checkCondition] = $compiledRoutes; } } PK �h�\��4�� � 6 vendor/symfony/routing/Matcher/TraceableUrlMatcher.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Exception\ExceptionInterface; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; /** * TraceableUrlMatcher helps debug path info matching by tracing the match. * * @author Fabien Potencier <fabien@symfony.com> */ class TraceableUrlMatcher extends UrlMatcher { public const ROUTE_DOES_NOT_MATCH = 0; public const ROUTE_ALMOST_MATCHES = 1; public const ROUTE_MATCHES = 2; protected $traces; public function getTraces(string $pathinfo) { $this->traces = []; try { $this->match($pathinfo); } catch (ExceptionInterface $e) { } return $this->traces; } public function getTracesForRequest(Request $request) { $this->request = $request; $traces = $this->getTraces($request->getPathInfo()); $this->request = null; return $traces; } protected function matchCollection(string $pathinfo, RouteCollection $routes) { // HEAD and GET are equivalent as per RFC if ('HEAD' === $method = $this->context->getMethod()) { $method = 'GET'; } $supportsTrailingSlash = 'GET' === $method && $this instanceof RedirectableUrlMatcherInterface; $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/'; foreach ($routes as $name => $route) { $compiledRoute = $route->compile(); $staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/'); $requiredMethods = $route->getMethods(); // check the static prefix of the URL first. Only use the more expensive preg_match when it matches if ('' !== $staticPrefix && !str_starts_with($trimmedPathinfo, $staticPrefix)) { $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); continue; } $regex = $compiledRoute->getRegex(); $pos = strrpos($regex, '$'); $hasTrailingSlash = '/' === $regex[$pos - 1]; $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); if (!preg_match($regex, $pathinfo, $matches)) { // does it match without any requirements? $r = new Route($route->getPath(), $route->getDefaults(), [], $route->getOptions()); $cr = $r->compile(); if (!preg_match($cr->getRegex(), $pathinfo)) { $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); continue; } foreach ($route->getRequirements() as $n => $regex) { $r = new Route($route->getPath(), $route->getDefaults(), [$n => $regex], $route->getOptions()); $cr = $r->compile(); if (\in_array($n, $cr->getVariables()) && !preg_match($cr->getRegex(), $pathinfo)) { $this->addTrace(sprintf('Requirement for "%s" does not match (%s)', $n, $regex), self::ROUTE_ALMOST_MATCHES, $name, $route); continue 2; } } continue; } $hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath()); if ($hasTrailingVar && ($hasTrailingSlash || (null === $m = $matches[\count($compiledRoute->getPathVariables())] ?? null) || '/' !== ($m[-1] ?? '/')) && preg_match($regex, $trimmedPathinfo, $m)) { if ($hasTrailingSlash) { $matches = $m; } else { $hasTrailingVar = false; } } $hostMatches = []; if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) { $this->addTrace(sprintf('Host "%s" does not match the requirement ("%s")', $this->context->getHost(), $route->getHost()), self::ROUTE_ALMOST_MATCHES, $name, $route); continue; } $status = $this->handleRouteRequirements($pathinfo, $name, $route); if (self::REQUIREMENT_MISMATCH === $status[0]) { $this->addTrace(sprintf('Condition "%s" does not evaluate to "true"', $route->getCondition()), self::ROUTE_ALMOST_MATCHES, $name, $route); continue; } if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) { $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route); return $this->allow = $this->allowSchemes = []; } $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); continue; } if ($route->getSchemes() && !$route->hasScheme($this->context->getScheme())) { $this->allowSchemes = array_merge($this->allowSchemes, $route->getSchemes()); $this->addTrace(sprintf('Scheme "%s" does not match any of the required schemes (%s)', $this->context->getScheme(), implode(', ', $route->getSchemes())), self::ROUTE_ALMOST_MATCHES, $name, $route); continue; } if ($requiredMethods && !\in_array($method, $requiredMethods)) { $this->allow = array_merge($this->allow, $requiredMethods); $this->addTrace(sprintf('Method "%s" does not match any of the required methods (%s)', $this->context->getMethod(), implode(', ', $requiredMethods)), self::ROUTE_ALMOST_MATCHES, $name, $route); continue; } $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route); return $this->getAttributes($route, $name, array_replace($matches, $hostMatches, $status[1] ?? [])); } return []; } private function addTrace(string $log, int $level = self::ROUTE_DOES_NOT_MATCH, string $name = null, Route $route = null) { $this->traces[] = [ 'log' => $log, 'name' => $name, 'level' => $level, 'path' => null !== $route ? $route->getPath() : null, ]; } } PK �h�\U�(� � = vendor/symfony/routing/Matcher/ExpressionLanguageProvider.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Matcher; use Symfony\Component\ExpressionLanguage\ExpressionFunction; use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; use Symfony\Contracts\Service\ServiceProviderInterface; /** * Exposes functions defined in the request context to route conditions. * * @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com> */ class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface { private $functions; public function __construct(ServiceProviderInterface $functions) { $this->functions = $functions; } /** * {@inheritdoc} */ public function getFunctions() { $functions = []; foreach ($this->functions->getProvidedServices() as $function => $type) { $functions[] = new ExpressionFunction( $function, static function (...$args) use ($function) { return sprintf('($context->getParameter(\'_functions\')->get(%s)(%s))', var_export($function, true), implode(', ', $args)); }, function ($values, ...$args) use ($function) { return $values['context']->getParameter('_functions')->get($function)(...$args); } ); } return $functions; } public function get(string $function): callable { return $this->functions->get($function); } } PK �h�\ΑC� ; vendor/symfony/routing/Generator/Dumper/GeneratorDumper.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Generator\Dumper; use Symfony\Component\Routing\RouteCollection; /** * GeneratorDumper is the base class for all built-in generator dumpers. * * @author Fabien Potencier <fabien@symfony.com> */ abstract class GeneratorDumper implements GeneratorDumperInterface { private $routes; public function __construct(RouteCollection $routes) { $this->routes = $routes; } /** * {@inheritdoc} */ public function getRoutes() { return $this->routes; } } PK �h�\��"v v D vendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Generator\Dumper; use Symfony\Component\Routing\RouteCollection; /** * GeneratorDumperInterface is the interface that all generator dumper classes must implement. * * @author Fabien Potencier <fabien@symfony.com> */ interface GeneratorDumperInterface { /** * Dumps a set of routes to a string representation of executable code * that can then be used to generate a URL of such a route. * * @return string */ public function dump(array $options = []); /** * Gets the routes to dump. * * @return RouteCollection */ public function getRoutes(); } PK �h�\� 뛐 � F vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Generator\Dumper; use Symfony\Component\Routing\Exception\RouteCircularReferenceException; use Symfony\Component\Routing\Exception\RouteNotFoundException; use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper; /** * CompiledUrlGeneratorDumper creates a PHP array to be used with CompiledUrlGenerator. * * @author Fabien Potencier <fabien@symfony.com> * @author Tobias Schultze <http://tobion.de> * @author Nicolas Grekas <p@tchwork.com> */ class CompiledUrlGeneratorDumper extends GeneratorDumper { public function getCompiledRoutes(): array { $compiledRoutes = []; foreach ($this->getRoutes()->all() as $name => $route) { $compiledRoute = $route->compile(); $compiledRoutes[$name] = [ $compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $compiledRoute->getHostTokens(), $route->getSchemes(), [], ]; } return $compiledRoutes; } public function getCompiledAliases(): array { $routes = $this->getRoutes(); $compiledAliases = []; foreach ($routes->getAliases() as $name => $alias) { $deprecations = $alias->isDeprecated() ? [$alias->getDeprecation($name)] : []; $currentId = $alias->getId(); $visited = []; while (null !== $alias = $routes->getAlias($currentId) ?? null) { if (false !== $searchKey = array_search($currentId, $visited)) { $visited[] = $currentId; throw new RouteCircularReferenceException($currentId, \array_slice($visited, $searchKey)); } if ($alias->isDeprecated()) { $deprecations[] = $deprecation = $alias->getDeprecation($currentId); trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']); } $visited[] = $currentId; $currentId = $alias->getId(); } if (null === $target = $routes->get($currentId)) { throw new RouteNotFoundException(sprintf('Target route "%s" for alias "%s" does not exist.', $currentId, $name)); } $compiledTarget = $target->compile(); $compiledAliases[$name] = [ $compiledTarget->getVariables(), $target->getDefaults(), $target->getRequirements(), $compiledTarget->getTokens(), $compiledTarget->getHostTokens(), $target->getSchemes(), $deprecations, ]; } return $compiledAliases; } /** * {@inheritdoc} */ public function dump(array $options = []) { return <<<EOF <?php // This file has been auto-generated by the Symfony Routing Component. return [{$this->generateDeclaredRoutes()} ]; EOF; } /** * Generates PHP code representing an array of defined routes * together with the routes properties (e.g. requirements). */ private function generateDeclaredRoutes(): string { $routes = ''; foreach ($this->getCompiledRoutes() as $name => $properties) { $routes .= sprintf("\n '%s' => %s,", $name, CompiledUrlMatcherDumper::export($properties)); } foreach ($this->getCompiledAliases() as $alias => $properties) { $routes .= sprintf("\n '%s' => %s,", $alias, CompiledUrlMatcherDumper::export($properties)); } return $routes; } } PK �h�\����� � 9 vendor/symfony/routing/Generator/CompiledUrlGenerator.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Generator; use Psr\Log\LoggerInterface; use Symfony\Component\Routing\Exception\RouteNotFoundException; use Symfony\Component\Routing\RequestContext; /** * Generates URLs based on rules dumped by CompiledUrlGeneratorDumper. */ class CompiledUrlGenerator extends UrlGenerator { private $compiledRoutes = []; private $defaultLocale; public function __construct(array $compiledRoutes, RequestContext $context, LoggerInterface $logger = null, string $defaultLocale = null) { $this->compiledRoutes = $compiledRoutes; $this->context = $context; $this->logger = $logger; $this->defaultLocale = $defaultLocale; } public function generate(string $name, array $parameters = [], int $referenceType = self::ABSOLUTE_PATH) { $locale = $parameters['_locale'] ?? $this->context->getParameter('_locale') ?: $this->defaultLocale; if (null !== $locale) { do { if (($this->compiledRoutes[$name.'.'.$locale][1]['_canonical_route'] ?? null) === $name) { $name .= '.'.$locale; break; } } while (false !== $locale = strstr($locale, '_', true)); } if (!isset($this->compiledRoutes[$name])) { throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); } [$variables, $defaults, $requirements, $tokens, $hostTokens, $requiredSchemes, $deprecations] = $this->compiledRoutes[$name] + [6 => []]; foreach ($deprecations as $deprecation) { trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']); } if (isset($defaults['_canonical_route']) && isset($defaults['_locale'])) { if (!\in_array('_locale', $variables, true)) { unset($parameters['_locale']); } elseif (!isset($parameters['_locale'])) { $parameters['_locale'] = $defaults['_locale']; } } return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes); } } PK �h�\�˂� � F vendor/symfony/routing/Generator/ConfigurableRequirementsInterface.phpnu �Iw�� <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Routing\Generator; /** * ConfigurableRequirementsInterface must be implemented by URL generators that * can be configured whether an exception should be generated when the parameters * do not match the requirements. It is also possible to disable the requirements * check for URL generation completely. * * The possible configurations and use-cases: * - setStrictRequirements(true): Throw an exception for mismatching requirements. This * is mostly useful in development environment. * - setStrictRequirements(false): Don't throw an exception but return an empty string as URL for * mismatching requirements and log the problem. Useful when you cannot control all * params because they come from third party libs but don't want to have a 404 in * production environment. It should log the mismatch so one can review it. * - setStrictRequirements(null): Return the URL with the given parameters without * checking the requirements at all. When generating a URL you should either trust * your params or you validated them beforehand because otherwise it would break your * link anyway. So in production environment you should know that params always pass * the requirements. Thus this option allows to disable the check on URL generation for * performance reasons (saving a preg_match for each requirement every time a URL is * generated). * * @author Fabien Potencier <fabien@symfony.com> * @author Tobias Schultze <http://tobion.de> */ interface ConfigurableRequirementsInterface { /** * Enables or disables the exception on incorrect parameters. * Passing null will deactivate the requirements check completely. */ public function setStrictRequirements(?bool $enabled); /** * Returns whether to throw an exception on incorrect parameters. * Null means the requirements check is deactivated completely. * * @return bool|null */ public function isStrictRequirements(); } PK �h�\��&�<