├── public ├── assets │ ├── common.js │ ├── indieauth-rocks.png │ ├── indieauth-rocks-icon.png │ ├── style.css │ └── jquery-3.6.0.min.js ├── index.php └── identities.php ├── .gitignore ├── resources ├── IndieAuth-Rocks-Logo.ai └── IndieAuth-Rocks-Star.ai ├── CONTRIBUTING.md ├── README.md ├── views ├── client │ └── index.php ├── server │ └── index.php ├── layout.php └── index.php ├── composer.json ├── lib ├── config.template.php └── helpers.php ├── app └── Controller.php ├── LICENSE └── composer.lock /public/assets/common.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | lib/config.php 3 | vendor/ 4 | -------------------------------------------------------------------------------- /public/assets/indieauth-rocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/indieauth.rocks/main/public/assets/indieauth-rocks.png -------------------------------------------------------------------------------- /resources/IndieAuth-Rocks-Logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/indieauth.rocks/main/resources/IndieAuth-Rocks-Logo.ai -------------------------------------------------------------------------------- /resources/IndieAuth-Rocks-Star.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/indieauth.rocks/main/resources/IndieAuth-Rocks-Star.ai -------------------------------------------------------------------------------- /public/assets/indieauth-rocks-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/indieauth.rocks/main/public/assets/indieauth-rocks-icon.png -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | By contributing to this project, you agree to irrevocably release your contributions under the same license as this project. See README.md for more details. 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | IndieAuth 2 | ========= 3 | 4 | In progress. 5 | 6 | IndieAuth test suite and test identities. 7 | 8 | 9 | 10 | License 11 | ------- 12 | 13 | Copyright 2019 by Aaron parecki. 14 | 15 | Available under the Apache 2.0 license. 16 | 17 | -------------------------------------------------------------------------------- /views/client/index.php: -------------------------------------------------------------------------------- 1 | layout('layout', [ 2 | 'title' => $title, 3 | ]); ?> 4 | 5 |
6 |
7 |

Testing your Client

8 | 9 |

Coming soon...

10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /views/server/index.php: -------------------------------------------------------------------------------- 1 | layout('layout', [ 2 | 'title' => $title, 3 | ]); ?> 4 | 5 |
6 |
7 |

Testing your Server

8 | 9 |

Coming soon...

10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "league/plates": "^3.4", 4 | "predis/predis": "^1.1", 5 | "mf2/mf2": "^0.5.0", 6 | "j4mie/idiorm": "^1.5", 7 | "indieweb/link-rel-parser": "^0.1.3", 8 | "p3k/http": "^0.1.12", 9 | "p3k/utils": "^1.2", 10 | "league/route": "^5.1", 11 | "nikic/fast-route": "^1.3", 12 | "laminas/laminas-diactoros": "^2.8", 13 | "laminas/laminas-httphandlerrunner": "^2.1" 14 | }, 15 | "autoload": { 16 | "psr-4": { 17 | "App\\": "app/" 18 | }, 19 | "files": [ 20 | "lib/helpers.php" 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/config.template.php: -------------------------------------------------------------------------------- 1 | '127.0.0.1', 9 | 'database' => 'indieauthrocks', 10 | 'username' => 'indieauthrocks', 11 | 'password' => 'indieauthrocks', 12 | ]; 13 | 14 | // When set to true, authentication is bypassed, and you can log in by 15 | // entering any email you want in the login form. This is useful when developing 16 | // this or running it locally. 17 | public static $skipauth = false; 18 | } 19 | -------------------------------------------------------------------------------- /app/Controller.php: -------------------------------------------------------------------------------- 1 | getBody()->write(view('index', [ 14 | 'title' => 'IndieAuth Rocks!', 15 | ])); 16 | return $response; 17 | } 18 | 19 | public function client(ServerRequestInterface $request) { 20 | $response = new Response; 21 | \p3k\session_setup(); 22 | 23 | $response->getBody()->write(view('client/index', [ 24 | 'title' => 'Client Tests - IndieAuth Rocks!', 25 | ])); 26 | return $response; 27 | } 28 | 29 | public function server(ServerRequestInterface $request) { 30 | $response = new Response; 31 | \p3k\session_setup(); 32 | 33 | $response->getBody()->write(view('server/index', [ 34 | 'title' => 'Server Tests - IndieAuth Rocks!', 35 | ])); 36 | return $response; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /views/layout.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <?= $this->e($title) ?> 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | > 20 | 21 | 33 | 34 | section('content') ?> 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | map('GET', '/', 'App\\Controller::index'); 16 | $router->map('GET', '/client', 'App\\Controller::client'); 17 | $router->map('GET', '/server', 'App\\Controller::server'); 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | $templates = new League\Plates\Engine(dirname(__FILE__).'/../views'); 31 | 32 | try { 33 | $response = $router->dispatch($request); 34 | (new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response); 35 | } catch(League\Route\Http\Exception\NotFoundException $e) { 36 | $response = new Response; 37 | $response->getBody()->write("Not Found\n"); 38 | (new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response->withStatus(404)); 39 | } catch(League\Route\Http\Exception\MethodNotAllowedException $e) { 40 | $response = new Response; 41 | $response->getBody()->write("Method not allowed\n"); 42 | (new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response->withStatus(405)); 43 | } 44 | -------------------------------------------------------------------------------- /public/assets/style.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | background: #cee0f0; 4 | font-size: 16px; 5 | padding-top: 60px; 6 | } 7 | 8 | .hidden { 9 | display: none !important; 10 | } 11 | 12 | .single-column { 13 | margin: 0 auto; 14 | max-width: 600px; 15 | } 16 | 17 | #header-graphic { 18 | max-width: 600px; 19 | margin-top: -60px; 20 | margin-bottom: -80px; 21 | z-index: -1000; 22 | position: relative; 23 | } 24 | #header-graphic img { 25 | max-width: 600px; 26 | width: 100%; 27 | } 28 | 29 | section.content { 30 | padding: 10px; 31 | border-radius: 4px; 32 | border: 1px #abcce9 solid; 33 | background: #fff; 34 | margin-bottom: 12px; 35 | overflow: hidden; 36 | overflow-wrap: break-word; 37 | } 38 | 39 | section.content.code { 40 | background: #eee; 41 | font-size: 14px; 42 | line-height: 16px; 43 | } 44 | 45 | section.content h4 { 46 | margin: 0; 47 | margin-top: 1em; 48 | } 49 | 50 | @media(max-width: 616px) { 51 | section.content { 52 | margin-left: 8px; 53 | margin-right: 8px; 54 | } 55 | } 56 | 57 | section.content textarea { 58 | border: 1px #abcce9 solid; 59 | border-radius: 4px; 60 | padding: 7px; 61 | -webkit-box-shadow: inset 0px 0px 6px 2px #e0edf9; 62 | -moz-box-shadow: inset 0px 0px 6px 2px #e0edf9; 63 | box-shadow: inset 0px 0px 6px 2px #e0edf9; 64 | } 65 | 66 | .ui.circular.label.prompt { 67 | box-shadow: inset 0 0 10px #aaa; 68 | cursor: pointer; 69 | } 70 | 71 | .step_instructions { 72 | padding-left: 28px; 73 | font-size: 0.8em; 74 | } 75 | -------------------------------------------------------------------------------- /views/index.php: -------------------------------------------------------------------------------- 1 | layout('layout', ['title' => $title]); ?> 2 | 3 |
4 |
5 | 6 |
7 |

About this site

8 |

IndieAuth Rocks! is a validator to help you test your IndieAuth client and server implementations. Several kinds of tests are available on the site.

9 |
10 | 11 | 12 |
13 |
Welcome!
14 |

You are logged in as !

15 |
16 | 17 | 18 | 35 | 36 |
37 |

Roles

38 | 39 |

Testing your Server

40 |

These tests will help you build an IndieAuth server by providing many different types of IndieAuth clients you may encounter in the wild.

41 | 42 |

Testing your Client

43 |

These tests will help you build an IndieAuth client by making sure you are able to handle all types of IndieAuth servers you may encounter in the wild.

44 | 45 |
46 | 47 | 48 |
49 |

This code is open source. Feel free to file an issue if you notice any errors.

50 |
51 | 52 |
53 | -------------------------------------------------------------------------------- /lib/helpers.php: -------------------------------------------------------------------------------- 1 | render($template, $data); 15 | } 16 | 17 | function e($text) { 18 | return htmlspecialchars($text); 19 | } 20 | 21 | function is_logged_in() { 22 | return isset($_SESSION) && array_key_exists('user_id', $_SESSION); 23 | } 24 | 25 | function login_required(&$response) { 26 | return $response->withHeader('Location', '/?login_required')->withStatus(302); 27 | } 28 | 29 | function logged_in_user() { 30 | return ORM::for_table('users')->where('id', $_SESSION['user_id'])->find_one(); 31 | } 32 | 33 | function validate_url($url) { 34 | $url = parse_url($url); 35 | 36 | if(!$url) { 37 | return 'There was an error parsing the URL'; 38 | } 39 | 40 | if(!isset($url['scheme'])) { 41 | return 'The URL was missing a scheme.'; 42 | } 43 | 44 | if(!in_array($url['scheme'], ['http','https'])) { 45 | return 'The URL must have a scheme of either http or https.'; 46 | } 47 | 48 | if(!isset($url['host'])) { 49 | return 'The URL was missing a hostname.'; 50 | } 51 | 52 | $ip=gethostbyname($url['host']); 53 | if(!$ip || $url['host']==$ip) { 54 | return 'No DNS entry was found.'; 55 | } 56 | 57 | return false; 58 | } 59 | 60 | function result_icon($passed, $id=false) { 61 | if($passed == 1) { 62 | return ''; 63 | } elseif($passed == -1) { 64 | return ''; 65 | } elseif($passed == 0) { 66 | return ' '; 67 | } else { 68 | return ''; 69 | } 70 | } 71 | 72 | function streaming_publish($channel, $data) { 73 | $ch = curl_init(Config::$base . 'streaming/pub?id='.$channel); 74 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 75 | curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); 76 | curl_exec($ch); 77 | } 78 | -------------------------------------------------------------------------------- /public/identities.php: -------------------------------------------------------------------------------- 1 | Visit this project on GitHub.'); 28 | #temporary_redirect('https://'.Config::$base.'/all'); 29 | } 30 | 31 | if($URL == 'https://'.Config::$base.'/github') { 32 | die(''); 33 | } 34 | 35 | if($URL == 'https://'.Config::$base.'/twitter') { 36 | die(''); 37 | } 38 | 39 | if($URL == 'https://'.Config::$base.'/authn2') { 40 | echo ' 41 | '; 42 | die(); 43 | } 44 | 45 | if($URL == 'https://'.Config::$base.'/email') { 46 | echo ' 47 | '; 48 | die(); 49 | } 50 | 51 | if($URL == 'https://'.Config::$base.'/pgp') { 52 | echo 'pgp key'; 53 | die(); 54 | } 55 | 56 | if($URL == 'https://'.Config::$base.'/pgp2') { 57 | echo 'pgp key'; 58 | die(); 59 | } 60 | 61 | if($URL == 'https://'.Config::$base.'/pgp3') { 62 | echo 'pgp key 63 | not this one'; 64 | die(); 65 | } 66 | 67 | if($URL == 'https://'.Config::$base.'/pgp4') { 68 | echo 'pgp key 69 | or this one'; 70 | die(); 71 | } 72 | 73 | if($URL == 'https://'.Config::$base.'/pgp5') { 74 | echo 'pgp key 75 | or this one 76 | '; 77 | die(); 78 | } 79 | 80 | 81 | if($URL == 'https://'.Config::$base.'/all') { 82 | echo ' 83 | 84 | 85 | '; 86 | die(); 87 | } 88 | 89 | if($URL == 'http://account.'.Config::$base.'/') { 90 | permanent_redirect('https://account.'.Config::$base.'/'); 91 | } 92 | 93 | if($URL == 'https://account.'.Config::$base.'/') { 94 | temporary_redirect('http://'.Config::$base.'/account'); 95 | } 96 | 97 | if($URL == 'http://dreeves.'.Config::$base.'/') { 98 | temporary_redirect('https://'.Config::$base.'/account'); 99 | } 100 | 101 | if($URL == 'http://'.Config::$base.'/account') { 102 | permanent_redirect('http://'.Config::$base.'/account/'); 103 | } 104 | 105 | if($URL == 'http://header.'.Config::$base.'/') { 106 | header('Link: ; rel="authorization_endpoint"'); 107 | header('Link: ; rel="token_endpoint"', false); 108 | die(); 109 | } 110 | 111 | if($URL == 'https://github.'.Config::$base.'/') { 112 | permanent_redirect('http://'.Config::$base.'/github'); 113 | } 114 | 115 | if($URL == 'https://twitter.'.Config::$base.'/') { 116 | permanent_redirect('http://'.Config::$base.'/twitter'); 117 | } 118 | 119 | 120 | if($SCHEME == 'http' && $HOST == Config::$base) { 121 | permanent_redirect('https://'.$HOST.$PATH); 122 | } 123 | 124 | header('Content-type: text/plain'); 125 | echo "Scheme: ".$SCHEME."\n"; 126 | echo "Host: ".$HOST."\n"; 127 | echo "Path: ".$PATH."\n"; 128 | 129 | 130 | 131 | function permanent_redirect($url) { 132 | header('HTTP/1.1 301 Moved Permanently'); 133 | header('Location: '.$url); 134 | die(); 135 | } 136 | 137 | function temporary_redirect($url) { 138 | header('HTTP/1.1 302 Found'); 139 | header('Location: '.$url); 140 | die(); 141 | } 142 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "70c5241decebb995fe9be9746d783ee2", 8 | "packages": [ 9 | { 10 | "name": "indieweb/link-rel-parser", 11 | "version": "0.1.3", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/indieweb/link-rel-parser-php.git", 15 | "reference": "295420e4f16d9a9d262a3c25a7a583794428f055" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/indieweb/link-rel-parser-php/zipball/295420e4f16d9a9d262a3c25a7a583794428f055", 20 | "reference": "295420e4f16d9a9d262a3c25a7a583794428f055", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.0" 25 | }, 26 | "type": "library", 27 | "autoload": { 28 | "files": [ 29 | "src/IndieWeb/link_rel_parser.php" 30 | ] 31 | }, 32 | "notification-url": "https://packagist.org/downloads/", 33 | "license": [ 34 | "Apache-2.0" 35 | ], 36 | "authors": [ 37 | { 38 | "name": "Aaron Parecki", 39 | "homepage": "http://aaronparecki.com" 40 | }, 41 | { 42 | "name": "Tantek Çelik", 43 | "homepage": "http://tantek.com" 44 | } 45 | ], 46 | "description": "Parse rel values from HTTP headers", 47 | "homepage": "https://github.com/indieweb/link-rel-parser-php", 48 | "keywords": [ 49 | "http", 50 | "indieweb", 51 | "microformats2" 52 | ], 53 | "support": { 54 | "issues": "https://github.com/indieweb/link-rel-parser-php/issues", 55 | "source": "https://github.com/indieweb/link-rel-parser-php/tree/master" 56 | }, 57 | "time": "2017-01-11T17:14:49+00:00" 58 | }, 59 | { 60 | "name": "j4mie/idiorm", 61 | "version": "v1.5.7", 62 | "source": { 63 | "type": "git", 64 | "url": "https://github.com/j4mie/idiorm.git", 65 | "reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4" 66 | }, 67 | "dist": { 68 | "type": "zip", 69 | "url": "https://api.github.com/repos/j4mie/idiorm/zipball/d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4", 70 | "reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4", 71 | "shasum": "" 72 | }, 73 | "require": { 74 | "php": ">=5.2.0" 75 | }, 76 | "require-dev": { 77 | "ext-pdo_sqlite": "*", 78 | "phpunit/phpunit": "^4.8" 79 | }, 80 | "type": "library", 81 | "autoload": { 82 | "classmap": [ 83 | "idiorm.php" 84 | ] 85 | }, 86 | "notification-url": "https://packagist.org/downloads/", 87 | "license": [ 88 | "BSD-2-Clause", 89 | "BSD-3-Clause", 90 | "BSD-4-Clause" 91 | ], 92 | "authors": [ 93 | { 94 | "name": "Jamie Matthews", 95 | "email": "jamie.matthews@gmail.com", 96 | "homepage": "http://j4mie.org", 97 | "role": "Developer" 98 | }, 99 | { 100 | "name": "Simon Holywell", 101 | "email": "treffynnon@php.net", 102 | "homepage": "http://simonholywell.com", 103 | "role": "Maintainer" 104 | }, 105 | { 106 | "name": "Durham Hale", 107 | "email": "me@durhamhale.com", 108 | "homepage": "http://durhamhale.com", 109 | "role": "Maintainer" 110 | } 111 | ], 112 | "description": "A lightweight nearly-zero-configuration object-relational mapper and fluent query builder for PHP5", 113 | "homepage": "http://j4mie.github.com/idiormandparis", 114 | "keywords": [ 115 | "idiorm", 116 | "orm", 117 | "query builder" 118 | ], 119 | "support": { 120 | "issues": "https://github.com/j4mie/idiorm/issues", 121 | "source": "https://github.com/j4mie/idiorm" 122 | }, 123 | "time": "2020-04-29T00:37:09+00:00" 124 | }, 125 | { 126 | "name": "laminas/laminas-diactoros", 127 | "version": "2.8.0", 128 | "source": { 129 | "type": "git", 130 | "url": "https://github.com/laminas/laminas-diactoros.git", 131 | "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" 132 | }, 133 | "dist": { 134 | "type": "zip", 135 | "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", 136 | "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", 137 | "shasum": "" 138 | }, 139 | "require": { 140 | "php": "^7.3 || ~8.0.0 || ~8.1.0", 141 | "psr/http-factory": "^1.0", 142 | "psr/http-message": "^1.0" 143 | }, 144 | "conflict": { 145 | "phpspec/prophecy": "<1.9.0", 146 | "zendframework/zend-diactoros": "*" 147 | }, 148 | "provide": { 149 | "psr/http-factory-implementation": "1.0", 150 | "psr/http-message-implementation": "1.0" 151 | }, 152 | "require-dev": { 153 | "ext-curl": "*", 154 | "ext-dom": "*", 155 | "ext-gd": "*", 156 | "ext-libxml": "*", 157 | "http-interop/http-factory-tests": "^0.8.0", 158 | "laminas/laminas-coding-standard": "~1.0.0", 159 | "php-http/psr7-integration-tests": "^1.1", 160 | "phpspec/prophecy-phpunit": "^2.0", 161 | "phpunit/phpunit": "^9.1", 162 | "psalm/plugin-phpunit": "^0.14.0", 163 | "vimeo/psalm": "^4.3" 164 | }, 165 | "type": "library", 166 | "extra": { 167 | "laminas": { 168 | "config-provider": "Laminas\\Diactoros\\ConfigProvider", 169 | "module": "Laminas\\Diactoros" 170 | } 171 | }, 172 | "autoload": { 173 | "files": [ 174 | "src/functions/create_uploaded_file.php", 175 | "src/functions/marshal_headers_from_sapi.php", 176 | "src/functions/marshal_method_from_sapi.php", 177 | "src/functions/marshal_protocol_version_from_sapi.php", 178 | "src/functions/marshal_uri_from_sapi.php", 179 | "src/functions/normalize_server.php", 180 | "src/functions/normalize_uploaded_files.php", 181 | "src/functions/parse_cookie_header.php", 182 | "src/functions/create_uploaded_file.legacy.php", 183 | "src/functions/marshal_headers_from_sapi.legacy.php", 184 | "src/functions/marshal_method_from_sapi.legacy.php", 185 | "src/functions/marshal_protocol_version_from_sapi.legacy.php", 186 | "src/functions/marshal_uri_from_sapi.legacy.php", 187 | "src/functions/normalize_server.legacy.php", 188 | "src/functions/normalize_uploaded_files.legacy.php", 189 | "src/functions/parse_cookie_header.legacy.php" 190 | ], 191 | "psr-4": { 192 | "Laminas\\Diactoros\\": "src/" 193 | } 194 | }, 195 | "notification-url": "https://packagist.org/downloads/", 196 | "license": [ 197 | "BSD-3-Clause" 198 | ], 199 | "description": "PSR HTTP Message implementations", 200 | "homepage": "https://laminas.dev", 201 | "keywords": [ 202 | "http", 203 | "laminas", 204 | "psr", 205 | "psr-17", 206 | "psr-7" 207 | ], 208 | "support": { 209 | "chat": "https://laminas.dev/chat", 210 | "docs": "https://docs.laminas.dev/laminas-diactoros/", 211 | "forum": "https://discourse.laminas.dev", 212 | "issues": "https://github.com/laminas/laminas-diactoros/issues", 213 | "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", 214 | "source": "https://github.com/laminas/laminas-diactoros" 215 | }, 216 | "funding": [ 217 | { 218 | "url": "https://funding.communitybridge.org/projects/laminas-project", 219 | "type": "community_bridge" 220 | } 221 | ], 222 | "time": "2021-09-22T03:54:36+00:00" 223 | }, 224 | { 225 | "name": "laminas/laminas-httphandlerrunner", 226 | "version": "2.1.0", 227 | "source": { 228 | "type": "git", 229 | "url": "https://github.com/laminas/laminas-httphandlerrunner.git", 230 | "reference": "4d337cde83e6b901a4443b0ab5c3b97cbaa46413" 231 | }, 232 | "dist": { 233 | "type": "zip", 234 | "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/4d337cde83e6b901a4443b0ab5c3b97cbaa46413", 235 | "reference": "4d337cde83e6b901a4443b0ab5c3b97cbaa46413", 236 | "shasum": "" 237 | }, 238 | "require": { 239 | "php": "^7.3 || ~8.0.0 || ~8.1.0", 240 | "psr/http-message": "^1.0", 241 | "psr/http-message-implementation": "^1.0", 242 | "psr/http-server-handler": "^1.0" 243 | }, 244 | "require-dev": { 245 | "laminas/laminas-coding-standard": "~2.3.0", 246 | "laminas/laminas-diactoros": "^2.8.0", 247 | "phpunit/phpunit": "^9.5.9", 248 | "psalm/plugin-phpunit": "^0.16.1", 249 | "vimeo/psalm": "^4.10.0" 250 | }, 251 | "type": "library", 252 | "extra": { 253 | "laminas": { 254 | "config-provider": "Laminas\\HttpHandlerRunner\\ConfigProvider" 255 | } 256 | }, 257 | "autoload": { 258 | "psr-4": { 259 | "Laminas\\HttpHandlerRunner\\": "src/" 260 | } 261 | }, 262 | "notification-url": "https://packagist.org/downloads/", 263 | "license": [ 264 | "BSD-3-Clause" 265 | ], 266 | "description": "Execute PSR-15 RequestHandlerInterface instances and emit responses they generate.", 267 | "homepage": "https://laminas.dev", 268 | "keywords": [ 269 | "components", 270 | "laminas", 271 | "mezzio", 272 | "psr-15", 273 | "psr-7" 274 | ], 275 | "support": { 276 | "chat": "https://laminas.dev/chat", 277 | "docs": "https://docs.laminas.dev/laminas-httphandlerrunner/", 278 | "forum": "https://discourse.laminas.dev", 279 | "issues": "https://github.com/laminas/laminas-httphandlerrunner/issues", 280 | "rss": "https://github.com/laminas/laminas-httphandlerrunner/releases.atom", 281 | "source": "https://github.com/laminas/laminas-httphandlerrunner" 282 | }, 283 | "funding": [ 284 | { 285 | "url": "https://funding.communitybridge.org/projects/laminas-project", 286 | "type": "community_bridge" 287 | } 288 | ], 289 | "time": "2021-09-22T09:27:36+00:00" 290 | }, 291 | { 292 | "name": "league/plates", 293 | "version": "v3.4.0", 294 | "source": { 295 | "type": "git", 296 | "url": "https://github.com/thephpleague/plates.git", 297 | "reference": "6d3ee31199b536a4e003b34a356ca20f6f75496a" 298 | }, 299 | "dist": { 300 | "type": "zip", 301 | "url": "https://api.github.com/repos/thephpleague/plates/zipball/6d3ee31199b536a4e003b34a356ca20f6f75496a", 302 | "reference": "6d3ee31199b536a4e003b34a356ca20f6f75496a", 303 | "shasum": "" 304 | }, 305 | "require": { 306 | "php": "^7.0|^8.0" 307 | }, 308 | "require-dev": { 309 | "mikey179/vfsstream": "^1.6", 310 | "phpunit/phpunit": "^9.5", 311 | "squizlabs/php_codesniffer": "^3.5" 312 | }, 313 | "type": "library", 314 | "extra": { 315 | "branch-alias": { 316 | "dev-master": "3.0-dev" 317 | } 318 | }, 319 | "autoload": { 320 | "psr-4": { 321 | "League\\Plates\\": "src" 322 | } 323 | }, 324 | "notification-url": "https://packagist.org/downloads/", 325 | "license": [ 326 | "MIT" 327 | ], 328 | "authors": [ 329 | { 330 | "name": "Jonathan Reinink", 331 | "email": "jonathan@reinink.ca", 332 | "role": "Developer" 333 | }, 334 | { 335 | "name": "RJ Garcia", 336 | "email": "ragboyjr@icloud.com", 337 | "role": "Developer" 338 | } 339 | ], 340 | "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", 341 | "homepage": "https://platesphp.com", 342 | "keywords": [ 343 | "league", 344 | "package", 345 | "templates", 346 | "templating", 347 | "views" 348 | ], 349 | "support": { 350 | "issues": "https://github.com/thephpleague/plates/issues", 351 | "source": "https://github.com/thephpleague/plates/tree/v3.4.0" 352 | }, 353 | "time": "2020-12-25T05:00:37+00:00" 354 | }, 355 | { 356 | "name": "league/route", 357 | "version": "5.1.2", 358 | "source": { 359 | "type": "git", 360 | "url": "https://github.com/thephpleague/route.git", 361 | "reference": "adf9b961dc5ffdbcffb2b8d7963c7978f2794c92" 362 | }, 363 | "dist": { 364 | "type": "zip", 365 | "url": "https://api.github.com/repos/thephpleague/route/zipball/adf9b961dc5ffdbcffb2b8d7963c7978f2794c92", 366 | "reference": "adf9b961dc5ffdbcffb2b8d7963c7978f2794c92", 367 | "shasum": "" 368 | }, 369 | "require": { 370 | "nikic/fast-route": "^1.3", 371 | "opis/closure": "^3.5.5", 372 | "php": "^7.2 || ^8.0", 373 | "psr/container": "^1.0|^2.0", 374 | "psr/http-factory": "^1.0", 375 | "psr/http-message": "^1.0.1", 376 | "psr/http-server-handler": "^1.0.1", 377 | "psr/http-server-middleware": "^1.0.1", 378 | "psr/simple-cache": "^1.0" 379 | }, 380 | "replace": { 381 | "orno/http": "~1.0", 382 | "orno/route": "~1.0" 383 | }, 384 | "require-dev": { 385 | "laminas/laminas-diactoros": "^2.3", 386 | "phpstan/phpstan": "^0.12", 387 | "phpstan/phpstan-phpunit": "^0.12", 388 | "phpunit/phpunit": "^8.5", 389 | "roave/security-advisories": "dev-master", 390 | "scrutinizer/ocular": "^1.8", 391 | "squizlabs/php_codesniffer": "^3.5" 392 | }, 393 | "type": "library", 394 | "extra": { 395 | "branch-alias": { 396 | "dev-master": "5.x-dev", 397 | "dev-5.x": "5.x-dev", 398 | "dev-4.x": "4.x-dev", 399 | "dev-3.x": "3.x-dev", 400 | "dev-2.x": "2.x-dev", 401 | "dev-1.x": "1.x-dev" 402 | } 403 | }, 404 | "autoload": { 405 | "psr-4": { 406 | "League\\Route\\": "src" 407 | } 408 | }, 409 | "notification-url": "https://packagist.org/downloads/", 410 | "license": [ 411 | "MIT" 412 | ], 413 | "authors": [ 414 | { 415 | "name": "Phil Bennett", 416 | "email": "philipobenito@gmail.com", 417 | "role": "Developer" 418 | } 419 | ], 420 | "description": "Fast routing and dispatch component including PSR-15 middleware, built on top of FastRoute.", 421 | "homepage": "https://github.com/thephpleague/route", 422 | "keywords": [ 423 | "dispatcher", 424 | "league", 425 | "psr-15", 426 | "psr-7", 427 | "psr15", 428 | "psr7", 429 | "route", 430 | "router" 431 | ], 432 | "support": { 433 | "issues": "https://github.com/thephpleague/route/issues", 434 | "source": "https://github.com/thephpleague/route/tree/5.1.2" 435 | }, 436 | "funding": [ 437 | { 438 | "url": "https://github.com/philipobenito", 439 | "type": "github" 440 | } 441 | ], 442 | "time": "2021-07-30T08:33:09+00:00" 443 | }, 444 | { 445 | "name": "mf2/mf2", 446 | "version": "v0.5.0", 447 | "source": { 448 | "type": "git", 449 | "url": "https://github.com/microformats/php-mf2.git", 450 | "reference": "ddc56de6be62ed4a21f569de9b80e17af678ca50" 451 | }, 452 | "dist": { 453 | "type": "zip", 454 | "url": "https://api.github.com/repos/microformats/php-mf2/zipball/ddc56de6be62ed4a21f569de9b80e17af678ca50", 455 | "reference": "ddc56de6be62ed4a21f569de9b80e17af678ca50", 456 | "shasum": "" 457 | }, 458 | "require": { 459 | "php": ">=5.6.0" 460 | }, 461 | "require-dev": { 462 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7", 463 | "mf2/tests": "dev-master#e9e2b905821ba0a5b59dab1a8eaf40634ce9cd49", 464 | "phpcompatibility/php-compatibility": "^9.3", 465 | "phpunit/phpunit": "^5.7", 466 | "squizlabs/php_codesniffer": "^3.6.2" 467 | }, 468 | "suggest": { 469 | "barnabywalters/mf-cleaner": "To more easily handle the canonical data php-mf2 gives you", 470 | "masterminds/html5": "Alternative HTML parser for PHP, for better HTML5 support." 471 | }, 472 | "bin": [ 473 | "bin/fetch-mf2", 474 | "bin/parse-mf2" 475 | ], 476 | "type": "library", 477 | "autoload": { 478 | "files": [ 479 | "Mf2/Parser.php" 480 | ] 481 | }, 482 | "notification-url": "https://packagist.org/downloads/", 483 | "license": [ 484 | "CC0-1.0" 485 | ], 486 | "authors": [ 487 | { 488 | "name": "Barnaby Walters", 489 | "homepage": "http://waterpigs.co.uk" 490 | } 491 | ], 492 | "description": "A pure, generic microformats2 parser — makes HTML as easy to consume as a JSON API", 493 | "keywords": [ 494 | "html", 495 | "microformats", 496 | "microformats 2", 497 | "parser", 498 | "semantic" 499 | ], 500 | "support": { 501 | "issues": "https://github.com/microformats/php-mf2/issues", 502 | "source": "https://github.com/microformats/php-mf2/tree/v0.5.0" 503 | }, 504 | "time": "2022-02-10T01:05:27+00:00" 505 | }, 506 | { 507 | "name": "nikic/fast-route", 508 | "version": "v1.3.0", 509 | "source": { 510 | "type": "git", 511 | "url": "https://github.com/nikic/FastRoute.git", 512 | "reference": "181d480e08d9476e61381e04a71b34dc0432e812" 513 | }, 514 | "dist": { 515 | "type": "zip", 516 | "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", 517 | "reference": "181d480e08d9476e61381e04a71b34dc0432e812", 518 | "shasum": "" 519 | }, 520 | "require": { 521 | "php": ">=5.4.0" 522 | }, 523 | "require-dev": { 524 | "phpunit/phpunit": "^4.8.35|~5.7" 525 | }, 526 | "type": "library", 527 | "autoload": { 528 | "files": [ 529 | "src/functions.php" 530 | ], 531 | "psr-4": { 532 | "FastRoute\\": "src/" 533 | } 534 | }, 535 | "notification-url": "https://packagist.org/downloads/", 536 | "license": [ 537 | "BSD-3-Clause" 538 | ], 539 | "authors": [ 540 | { 541 | "name": "Nikita Popov", 542 | "email": "nikic@php.net" 543 | } 544 | ], 545 | "description": "Fast request router for PHP", 546 | "keywords": [ 547 | "router", 548 | "routing" 549 | ], 550 | "support": { 551 | "issues": "https://github.com/nikic/FastRoute/issues", 552 | "source": "https://github.com/nikic/FastRoute/tree/master" 553 | }, 554 | "time": "2018-02-13T20:26:39+00:00" 555 | }, 556 | { 557 | "name": "opis/closure", 558 | "version": "3.6.3", 559 | "source": { 560 | "type": "git", 561 | "url": "https://github.com/opis/closure.git", 562 | "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" 563 | }, 564 | "dist": { 565 | "type": "zip", 566 | "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", 567 | "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", 568 | "shasum": "" 569 | }, 570 | "require": { 571 | "php": "^5.4 || ^7.0 || ^8.0" 572 | }, 573 | "require-dev": { 574 | "jeremeamia/superclosure": "^2.0", 575 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 576 | }, 577 | "type": "library", 578 | "extra": { 579 | "branch-alias": { 580 | "dev-master": "3.6.x-dev" 581 | } 582 | }, 583 | "autoload": { 584 | "psr-4": { 585 | "Opis\\Closure\\": "src/" 586 | }, 587 | "files": [ 588 | "functions.php" 589 | ] 590 | }, 591 | "notification-url": "https://packagist.org/downloads/", 592 | "license": [ 593 | "MIT" 594 | ], 595 | "authors": [ 596 | { 597 | "name": "Marius Sarca", 598 | "email": "marius.sarca@gmail.com" 599 | }, 600 | { 601 | "name": "Sorin Sarca", 602 | "email": "sarca_sorin@hotmail.com" 603 | } 604 | ], 605 | "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", 606 | "homepage": "https://opis.io/closure", 607 | "keywords": [ 608 | "anonymous functions", 609 | "closure", 610 | "function", 611 | "serializable", 612 | "serialization", 613 | "serialize" 614 | ], 615 | "support": { 616 | "issues": "https://github.com/opis/closure/issues", 617 | "source": "https://github.com/opis/closure/tree/3.6.3" 618 | }, 619 | "time": "2022-01-27T09:35:39+00:00" 620 | }, 621 | { 622 | "name": "p3k/http", 623 | "version": "0.1.12", 624 | "source": { 625 | "type": "git", 626 | "url": "https://github.com/aaronpk/p3k-http.git", 627 | "reference": "cf9c5b7cdbe1800bfb9587a20953ed8d20322e0b" 628 | }, 629 | "dist": { 630 | "type": "zip", 631 | "url": "https://api.github.com/repos/aaronpk/p3k-http/zipball/cf9c5b7cdbe1800bfb9587a20953ed8d20322e0b", 632 | "reference": "cf9c5b7cdbe1800bfb9587a20953ed8d20322e0b", 633 | "shasum": "" 634 | }, 635 | "require": { 636 | "indieweb/link-rel-parser": "0.1.*", 637 | "mf2/mf2": ">=0.3.2" 638 | }, 639 | "type": "library", 640 | "autoload": { 641 | "psr-4": { 642 | "p3k\\": "src/p3k" 643 | } 644 | }, 645 | "notification-url": "https://packagist.org/downloads/", 646 | "license": [ 647 | "MIT" 648 | ], 649 | "authors": [ 650 | { 651 | "name": "Aaron Parecki", 652 | "homepage": "https://aaronparecki.com" 653 | } 654 | ], 655 | "description": "A simple wrapper API around the PHP curl functions", 656 | "homepage": "https://github.com/aaronpk/p3k-http", 657 | "support": { 658 | "issues": "https://github.com/aaronpk/p3k-http/issues", 659 | "source": "https://github.com/aaronpk/p3k-http/tree/0.1.12" 660 | }, 661 | "time": "2021-10-12T14:12:29+00:00" 662 | }, 663 | { 664 | "name": "p3k/utils", 665 | "version": "1.2.1", 666 | "source": { 667 | "type": "git", 668 | "url": "https://github.com/aaronpk/p3k-utils.git", 669 | "reference": "8436f02ec02d916177a23250ae32b34ae5316942" 670 | }, 671 | "dist": { 672 | "type": "zip", 673 | "url": "https://api.github.com/repos/aaronpk/p3k-utils/zipball/8436f02ec02d916177a23250ae32b34ae5316942", 674 | "reference": "8436f02ec02d916177a23250ae32b34ae5316942", 675 | "shasum": "" 676 | }, 677 | "require": { 678 | "php": ">=5.5" 679 | }, 680 | "require-dev": { 681 | "phpunit/phpunit": "^4.8.13", 682 | "predis/predis": "1.1.*" 683 | }, 684 | "type": "library", 685 | "autoload": { 686 | "files": [ 687 | "src/global.php", 688 | "src/url.php", 689 | "src/utils.php", 690 | "src/date.php", 691 | "src/cache.php", 692 | "src/geo.php" 693 | ] 694 | }, 695 | "notification-url": "https://packagist.org/downloads/", 696 | "license": [ 697 | "MIT" 698 | ], 699 | "authors": [ 700 | { 701 | "name": "Aaron Parecki", 702 | "homepage": "https://aaronparecki.com" 703 | } 704 | ], 705 | "description": "Some helpful functions used by https://p3k.io projects", 706 | "homepage": "https://github.com/aaronpk/p3k-utils", 707 | "support": { 708 | "issues": "https://github.com/aaronpk/p3k-utils/issues", 709 | "source": "https://github.com/aaronpk/p3k-utils/tree/1.2.1" 710 | }, 711 | "time": "2021-11-16T21:44:23+00:00" 712 | }, 713 | { 714 | "name": "predis/predis", 715 | "version": "v1.1.10", 716 | "source": { 717 | "type": "git", 718 | "url": "https://github.com/predis/predis.git", 719 | "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e" 720 | }, 721 | "dist": { 722 | "type": "zip", 723 | "url": "https://api.github.com/repos/predis/predis/zipball/a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", 724 | "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", 725 | "shasum": "" 726 | }, 727 | "require": { 728 | "php": ">=5.3.9" 729 | }, 730 | "require-dev": { 731 | "phpunit/phpunit": "~4.8" 732 | }, 733 | "suggest": { 734 | "ext-curl": "Allows access to Webdis when paired with phpiredis", 735 | "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" 736 | }, 737 | "type": "library", 738 | "autoload": { 739 | "psr-4": { 740 | "Predis\\": "src/" 741 | } 742 | }, 743 | "notification-url": "https://packagist.org/downloads/", 744 | "license": [ 745 | "MIT" 746 | ], 747 | "authors": [ 748 | { 749 | "name": "Daniele Alessandri", 750 | "email": "suppakilla@gmail.com", 751 | "homepage": "http://clorophilla.net", 752 | "role": "Creator & Maintainer" 753 | }, 754 | { 755 | "name": "Till Krüss", 756 | "homepage": "https://till.im", 757 | "role": "Maintainer" 758 | } 759 | ], 760 | "description": "Flexible and feature-complete Redis client for PHP and HHVM", 761 | "homepage": "http://github.com/predis/predis", 762 | "keywords": [ 763 | "nosql", 764 | "predis", 765 | "redis" 766 | ], 767 | "support": { 768 | "issues": "https://github.com/predis/predis/issues", 769 | "source": "https://github.com/predis/predis/tree/v1.1.10" 770 | }, 771 | "funding": [ 772 | { 773 | "url": "https://github.com/sponsors/tillkruss", 774 | "type": "github" 775 | } 776 | ], 777 | "time": "2022-01-05T17:46:08+00:00" 778 | }, 779 | { 780 | "name": "psr/container", 781 | "version": "2.0.2", 782 | "source": { 783 | "type": "git", 784 | "url": "https://github.com/php-fig/container.git", 785 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 786 | }, 787 | "dist": { 788 | "type": "zip", 789 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 790 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 791 | "shasum": "" 792 | }, 793 | "require": { 794 | "php": ">=7.4.0" 795 | }, 796 | "type": "library", 797 | "extra": { 798 | "branch-alias": { 799 | "dev-master": "2.0.x-dev" 800 | } 801 | }, 802 | "autoload": { 803 | "psr-4": { 804 | "Psr\\Container\\": "src/" 805 | } 806 | }, 807 | "notification-url": "https://packagist.org/downloads/", 808 | "license": [ 809 | "MIT" 810 | ], 811 | "authors": [ 812 | { 813 | "name": "PHP-FIG", 814 | "homepage": "https://www.php-fig.org/" 815 | } 816 | ], 817 | "description": "Common Container Interface (PHP FIG PSR-11)", 818 | "homepage": "https://github.com/php-fig/container", 819 | "keywords": [ 820 | "PSR-11", 821 | "container", 822 | "container-interface", 823 | "container-interop", 824 | "psr" 825 | ], 826 | "support": { 827 | "issues": "https://github.com/php-fig/container/issues", 828 | "source": "https://github.com/php-fig/container/tree/2.0.2" 829 | }, 830 | "time": "2021-11-05T16:47:00+00:00" 831 | }, 832 | { 833 | "name": "psr/http-factory", 834 | "version": "1.0.1", 835 | "source": { 836 | "type": "git", 837 | "url": "https://github.com/php-fig/http-factory.git", 838 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" 839 | }, 840 | "dist": { 841 | "type": "zip", 842 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 843 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 844 | "shasum": "" 845 | }, 846 | "require": { 847 | "php": ">=7.0.0", 848 | "psr/http-message": "^1.0" 849 | }, 850 | "type": "library", 851 | "extra": { 852 | "branch-alias": { 853 | "dev-master": "1.0.x-dev" 854 | } 855 | }, 856 | "autoload": { 857 | "psr-4": { 858 | "Psr\\Http\\Message\\": "src/" 859 | } 860 | }, 861 | "notification-url": "https://packagist.org/downloads/", 862 | "license": [ 863 | "MIT" 864 | ], 865 | "authors": [ 866 | { 867 | "name": "PHP-FIG", 868 | "homepage": "http://www.php-fig.org/" 869 | } 870 | ], 871 | "description": "Common interfaces for PSR-7 HTTP message factories", 872 | "keywords": [ 873 | "factory", 874 | "http", 875 | "message", 876 | "psr", 877 | "psr-17", 878 | "psr-7", 879 | "request", 880 | "response" 881 | ], 882 | "support": { 883 | "source": "https://github.com/php-fig/http-factory/tree/master" 884 | }, 885 | "time": "2019-04-30T12:38:16+00:00" 886 | }, 887 | { 888 | "name": "psr/http-message", 889 | "version": "1.0.1", 890 | "source": { 891 | "type": "git", 892 | "url": "https://github.com/php-fig/http-message.git", 893 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 894 | }, 895 | "dist": { 896 | "type": "zip", 897 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 898 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 899 | "shasum": "" 900 | }, 901 | "require": { 902 | "php": ">=5.3.0" 903 | }, 904 | "type": "library", 905 | "extra": { 906 | "branch-alias": { 907 | "dev-master": "1.0.x-dev" 908 | } 909 | }, 910 | "autoload": { 911 | "psr-4": { 912 | "Psr\\Http\\Message\\": "src/" 913 | } 914 | }, 915 | "notification-url": "https://packagist.org/downloads/", 916 | "license": [ 917 | "MIT" 918 | ], 919 | "authors": [ 920 | { 921 | "name": "PHP-FIG", 922 | "homepage": "http://www.php-fig.org/" 923 | } 924 | ], 925 | "description": "Common interface for HTTP messages", 926 | "homepage": "https://github.com/php-fig/http-message", 927 | "keywords": [ 928 | "http", 929 | "http-message", 930 | "psr", 931 | "psr-7", 932 | "request", 933 | "response" 934 | ], 935 | "support": { 936 | "source": "https://github.com/php-fig/http-message/tree/master" 937 | }, 938 | "time": "2016-08-06T14:39:51+00:00" 939 | }, 940 | { 941 | "name": "psr/http-server-handler", 942 | "version": "1.0.1", 943 | "source": { 944 | "type": "git", 945 | "url": "https://github.com/php-fig/http-server-handler.git", 946 | "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" 947 | }, 948 | "dist": { 949 | "type": "zip", 950 | "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", 951 | "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", 952 | "shasum": "" 953 | }, 954 | "require": { 955 | "php": ">=7.0", 956 | "psr/http-message": "^1.0" 957 | }, 958 | "type": "library", 959 | "extra": { 960 | "branch-alias": { 961 | "dev-master": "1.0.x-dev" 962 | } 963 | }, 964 | "autoload": { 965 | "psr-4": { 966 | "Psr\\Http\\Server\\": "src/" 967 | } 968 | }, 969 | "notification-url": "https://packagist.org/downloads/", 970 | "license": [ 971 | "MIT" 972 | ], 973 | "authors": [ 974 | { 975 | "name": "PHP-FIG", 976 | "homepage": "http://www.php-fig.org/" 977 | } 978 | ], 979 | "description": "Common interface for HTTP server-side request handler", 980 | "keywords": [ 981 | "handler", 982 | "http", 983 | "http-interop", 984 | "psr", 985 | "psr-15", 986 | "psr-7", 987 | "request", 988 | "response", 989 | "server" 990 | ], 991 | "support": { 992 | "issues": "https://github.com/php-fig/http-server-handler/issues", 993 | "source": "https://github.com/php-fig/http-server-handler/tree/master" 994 | }, 995 | "time": "2018-10-30T16:46:14+00:00" 996 | }, 997 | { 998 | "name": "psr/http-server-middleware", 999 | "version": "1.0.1", 1000 | "source": { 1001 | "type": "git", 1002 | "url": "https://github.com/php-fig/http-server-middleware.git", 1003 | "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" 1004 | }, 1005 | "dist": { 1006 | "type": "zip", 1007 | "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", 1008 | "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", 1009 | "shasum": "" 1010 | }, 1011 | "require": { 1012 | "php": ">=7.0", 1013 | "psr/http-message": "^1.0", 1014 | "psr/http-server-handler": "^1.0" 1015 | }, 1016 | "type": "library", 1017 | "extra": { 1018 | "branch-alias": { 1019 | "dev-master": "1.0.x-dev" 1020 | } 1021 | }, 1022 | "autoload": { 1023 | "psr-4": { 1024 | "Psr\\Http\\Server\\": "src/" 1025 | } 1026 | }, 1027 | "notification-url": "https://packagist.org/downloads/", 1028 | "license": [ 1029 | "MIT" 1030 | ], 1031 | "authors": [ 1032 | { 1033 | "name": "PHP-FIG", 1034 | "homepage": "http://www.php-fig.org/" 1035 | } 1036 | ], 1037 | "description": "Common interface for HTTP server-side middleware", 1038 | "keywords": [ 1039 | "http", 1040 | "http-interop", 1041 | "middleware", 1042 | "psr", 1043 | "psr-15", 1044 | "psr-7", 1045 | "request", 1046 | "response" 1047 | ], 1048 | "support": { 1049 | "issues": "https://github.com/php-fig/http-server-middleware/issues", 1050 | "source": "https://github.com/php-fig/http-server-middleware/tree/master" 1051 | }, 1052 | "time": "2018-10-30T17:12:04+00:00" 1053 | }, 1054 | { 1055 | "name": "psr/simple-cache", 1056 | "version": "1.0.1", 1057 | "source": { 1058 | "type": "git", 1059 | "url": "https://github.com/php-fig/simple-cache.git", 1060 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 1061 | }, 1062 | "dist": { 1063 | "type": "zip", 1064 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1065 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1066 | "shasum": "" 1067 | }, 1068 | "require": { 1069 | "php": ">=5.3.0" 1070 | }, 1071 | "type": "library", 1072 | "extra": { 1073 | "branch-alias": { 1074 | "dev-master": "1.0.x-dev" 1075 | } 1076 | }, 1077 | "autoload": { 1078 | "psr-4": { 1079 | "Psr\\SimpleCache\\": "src/" 1080 | } 1081 | }, 1082 | "notification-url": "https://packagist.org/downloads/", 1083 | "license": [ 1084 | "MIT" 1085 | ], 1086 | "authors": [ 1087 | { 1088 | "name": "PHP-FIG", 1089 | "homepage": "http://www.php-fig.org/" 1090 | } 1091 | ], 1092 | "description": "Common interfaces for simple caching", 1093 | "keywords": [ 1094 | "cache", 1095 | "caching", 1096 | "psr", 1097 | "psr-16", 1098 | "simple-cache" 1099 | ], 1100 | "support": { 1101 | "source": "https://github.com/php-fig/simple-cache/tree/master" 1102 | }, 1103 | "time": "2017-10-23T01:57:42+00:00" 1104 | } 1105 | ], 1106 | "packages-dev": [], 1107 | "aliases": [], 1108 | "minimum-stability": "stable", 1109 | "stability-flags": [], 1110 | "prefer-stable": false, 1111 | "prefer-lowest": false, 1112 | "platform": [], 1113 | "platform-dev": [], 1114 | "plugin-api-version": "2.1.0" 1115 | } 1116 | -------------------------------------------------------------------------------- /public/assets/jquery-3.6.0.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0