From f27fefb7606ef4cccaaa25b92a3bcd843ad4c1fa Mon Sep 17 00:00:00 2001 From: Thijs van den Anker Date: Thu, 8 Oct 2015 10:34:16 +0200 Subject: [PATCH 001/663] Use a tagged release of adoy/oauth2 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1a49f231..9c02f051 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "php": ">=5.3.0", "illuminate/support": "5.*", "auth0/auth0-php": "~1.0", - "adoy/oauth2": "dev-master", + "adoy/oauth2": "~1.3", "illuminate/contracts": "5.*" }, "autoload": { From aed8a35ce3466ea22eb141a259f735dcf1f6b90c Mon Sep 17 00:00:00 2001 From: Wade Urry Date: Mon, 19 Oct 2015 21:44:38 +0100 Subject: [PATCH 002/663] Update composer instructions --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index 94e4d4aa..6c0dd3b1 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,7 @@ Besides, laravel-auth0 has full BC, we recommend to check the changes in case yo ### 1. Install the plugin and its dependencies -To install this plugin add the following dependency to your composer.json - -```js -"auth0/login" : "~2.1" -``` - -and run `composer update` +To install this plugin run `composer require auth0/login:"~2.1"` NOTE: Some plugin dependencies are not tagged, so you have to either change the `minimum-stability` to `dev` or you have to add the dependencies manually. From 9589a1b38aaca72a6cd711a0e86906f8f82c0242 Mon Sep 17 00:00:00 2001 From: Thijs van den Anker Date: Fri, 23 Oct 2015 23:31:18 +0200 Subject: [PATCH 003/663] Removed note about unstable dependency from README --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 94e4d4aa..4bc222b1 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,6 @@ To install this plugin add the following dependency to your composer.json and run `composer update` -NOTE: Some plugin dependencies are not tagged, so you have to either change the `minimum-stability` to `dev` or you have to add the dependencies manually. - -```js -"adoy/oauth2": "dev-master", -"illuminate/contracts": "5.*" -``` - ### 2. Enable it in Laravel Add the following in the list of the services providers, located in `app/config/app.php` From faf80a350f029bd34b6a83d378c9ea18ff16e78d Mon Sep 17 00:00:00 2001 From: Thijs van den Anker Date: Sun, 25 Oct 2015 20:55:28 +0100 Subject: [PATCH 004/663] Fixed some typo's in the comments. --- src/Auth0/Login/Auth0Service.php | 3 ++- src/Auth0/Login/LaravelSessionStore.php | 4 ++-- src/Auth0/Login/Middleware/Auth0JWTMiddleware.php | 4 ++-- src/controllers/Auth0Controller.php | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 1cf4c947..868b2d45 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -26,7 +26,7 @@ private function getSDK() { } /** - * Logouts the user from the SDK + * Logs the user out from the SDK. */ public function logout() { $this->getSDK()->logout(); @@ -34,6 +34,7 @@ public function logout() { /** * If the user is logged in, returns the user information + * * @return array with the User info as described in https://docs.auth0.com/user-profile and the user access token */ public function getUser() { diff --git a/src/Auth0/Login/LaravelSessionStore.php b/src/Auth0/Login/LaravelSessionStore.php index 6472d5f8..4b9eaaf2 100644 --- a/src/Auth0/Login/LaravelSessionStore.php +++ b/src/Auth0/Login/LaravelSessionStore.php @@ -6,7 +6,7 @@ class LaravelSessionStore { /** - * Persists $value on $_SESSION, idetified by $key. + * Persists $value on $_SESSION, identified by $key. * * @see Auth0SDK\BaseAuth0 * @@ -40,7 +40,7 @@ public function delete($key) { /** * Constructs a session var name. * - * @param strign $key + * @param string $key * * @return string */ diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index 9b168d41..97fa4e59 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -44,10 +44,10 @@ public function handle($request, \Closure $next) return \Response::make("Unauthorized user", 401); } - // lets log the user in so it is accesible + // lets log the user in so it is accessible \Auth::login($user); - // continue the excecution + // continue the execution return $next($request); } diff --git a/src/controllers/Auth0Controller.php b/src/controllers/Auth0Controller.php index 5c77a45a..4ef09ceb 100644 --- a/src/controllers/Auth0Controller.php +++ b/src/controllers/Auth0Controller.php @@ -28,9 +28,9 @@ public function callback() { $auth0User = $this->userRepository->getUserByUserInfo($profile); if ($auth0User) { - // If we have, we are going to log him in, buut, if + // If we have a user, we are going to log him in, but if // there is an onLogin defined we need to allow the Laravel developer - // to implement the user as he wants an also let him store it + // to implement the user as he wants an also let him store it. if ($service->hasOnLogin()) { $user = $service->callOnLogin($auth0User); } else { From 33485bcfc220f8f3bb3b44561134ed29a7f0ac63 Mon Sep 17 00:00:00 2001 From: Thijs van den Anker Date: Mon, 26 Oct 2015 20:45:54 +0100 Subject: [PATCH 005/663] Middleware contract has been deprecated in 5.1 --- src/Auth0/Login/Middleware/Auth0JWTMiddleware.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index 9b168d41..0214c21d 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -2,10 +2,9 @@ use Auth0\Login\Contract\Auth0UserRepository; -use Illuminate\Contracts\Routing\Middleware; use Auth0\SDK\Exception\CoreException; -class Auth0JWTMiddleware implements Middleware { +class Auth0JWTMiddleware { protected $userRepository; From 4d86800ccd82f3b3d690968f732e154efa76d2c7 Mon Sep 17 00:00:00 2001 From: German Lena Date: Tue, 27 Oct 2015 15:45:06 -0300 Subject: [PATCH 006/663] update doc --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d9f85fcd..e960fe08 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Besides, laravel-auth0 has full BC, we recommend to check the changes in case yo To install this plugin run `composer require auth0/login:"~2.1"` ### 2. Enable it in Laravel -Add the following in the list of the services providers, located in `app/config/app.php` +Add the following in the list of the services providers, located in `config/app.php` ```php 'providers' => array( @@ -84,7 +84,7 @@ The plugin works with the [Laravel security system](http://laravel.com/docs/secu In other words, you need to select a uri (for example `/auth0/callback`) and configure it in your [Auth0 admin page](https://app.auth0.com/#/applications/) and also, add it as a route in Laravel ```php -Route::get('/auth0/callback', 'Auth0\Login\Auth0Controller@callback'); +Route::get('/auth0/callback', '\Auth0\Login\Auth0Controller@callback'); ``` ### 5. Triggering login manually or integrating the Auth0 widget @@ -112,6 +112,15 @@ You can trigger the login in different ways, like redirecting to a login link or ``` +and this controller action + +```php +public function login() { + $auth0Config = config('laravel-auth0'); + return view('login')->with('auth0Config',$auth0Config); +} +``` + ### 6. Defining a user and a user provider The [Laravel Security System](http://laravel.com/docs/security) needs a *User Object* given by a *User Provider*. With these two abstractions, the user entity can have any structure you like and can be stored anywhere. You configure the *User Provider* indirectly, by selecting an auth driver in `app/config/auth.php`. The default driver is Eloquent, which persists the User model in a database using the ORM. From dcc7315398b1289bafafbf45fb23ce77c36b59c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Lena?= Date: Thu, 29 Oct 2015 10:46:43 -0300 Subject: [PATCH 007/663] Update installation to point to the docs page --- README.md | 182 +++--------------------------------------------------- 1 file changed, 10 insertions(+), 172 deletions(-) diff --git a/README.md b/README.md index e960fe08..d1a483d0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,16 @@ # Laravel Auth0 Plugin This plugin helps you integrate your Laravel WebApp with [Auth0](https://auth0.com/) to achieve Single Sign On with a few simple steps. You can see an example application [on the example directory](https://github.com/auth0/laravel-auth0/tree/master/examples/laravel-api). +## Installation + +Check our docs page to get a complete guide on how to install it in an existing project or download a pre configured seedproject: + +* Regular webapp: https://auth0.com/docs/quickstart/webapp/laravel/ +* Web API: https://auth0.com/docs/quickstart/backend/php-laravel/ + +> If you find something wrong in our docs, PR are welcome in our docs repo: https://github.com/auth0/docs + + ##Laravel Compatibility The last version (2.x) targets Laravel 5 compatibility. @@ -13,178 +23,6 @@ The latest version of auth0-php has BC breaks. Besides, laravel-auth0 has full BC, we recommend to check the changes in case you were using it directly. Read the [auth0-php README](https://github.com/auth0/Auth0-PHP). -### 1. Install the plugin and its dependencies - -To install this plugin run `composer require auth0/login:"~2.1"` - -### 2. Enable it in Laravel -Add the following in the list of the services providers, located in `config/app.php` - -```php -'providers' => array( - // ... - 'Auth0\Login\LoginServiceProvider', -); -``` - -Optionally, if you want to use the [facade](http://laravel.com/docs/facades) called `Auth0` you should also add an alias in the same file - -```php -'aliases' => array( - // ... - 'Auth0' => 'Auth0\Login\Facade\Auth0' -); -``` - -Now, you will be able to access to the logged user info with `Auth0::getUser()` and hook to the onLogin event `Auth0::onLogin(function(...))`. - -If you want to restrict access with the Auth0 Middleware, you will need to add it in `app/Http/Kernel.php` - -```php -... - -protected $routeMiddleware = [ - ... - 'auth0.jwt' => 'Auth0\Login\Middleware\Auth0JWTMiddleware', - ]; - -... -``` - -Finally, you will need to bind a class that provides the users (your app model user) each time a user is logged in or a JWT is decoded. You can use the `Auth0UserRepository` provided by this package or build your own (which should implement the `\Auth0\Login\Contract\Auth0UserRepository` interface). -For this you need to add to your AppServiceProvider the following line: - -```php -... - -public function register() -{ - - $this->app->bind( - '\Auth0\Login\Contract\Auth0UserRepository', - '\Auth0\Login\Repository\Auth0UserRepository'); - -} - -... -``` - -### 3. Configure it - -To configure the plugin, you need to publish the plugin configuration and complete the file `app/config/laravel-auth0.php` using the information of your Auth0 account. - -To publish the example configuration file use this command - - php artisan vendor:publish - -### 4. Setup the callback action - -The plugin works with the [Laravel security system](http://laravel.com/docs/security), but instead of using the `Auth::attempt` in a controller that handles a login form submit, you have to hookup the callback uri. - -In other words, you need to select a uri (for example `/auth0/callback`) and configure it in your [Auth0 admin page](https://app.auth0.com/#/applications/) and also, add it as a route in Laravel - -```php -Route::get('/auth0/callback', '\Auth0\Login\Auth0Controller@callback'); -``` - -### 5. Triggering login manually or integrating the Auth0 widget - -You can trigger the login in different ways, like redirecting to a login link or you can use [Lock](https://auth0.com/docs/lock), by adding the following javascript into a Laravel view or layout - -```html - - - - - - -``` - -and this controller action - -```php -public function login() { - $auth0Config = config('laravel-auth0'); - return view('login')->with('auth0Config',$auth0Config); -} -``` - -### 6. Defining a user and a user provider - -The [Laravel Security System](http://laravel.com/docs/security) needs a *User Object* given by a *User Provider*. With these two abstractions, the user entity can have any structure you like and can be stored anywhere. You configure the *User Provider* indirectly, by selecting an auth driver in `app/config/auth.php`. The default driver is Eloquent, which persists the User model in a database using the ORM. - -#### 6.1. Using the auth0 driver - -The plugin comes with an authentication driver called auth0. This driver defines a user structure that wraps the [Normalized User Profile](https://docs.auth0.com/user-profile) defined by Auth0, and it doesn't actually persist the object, it just stores it in the session for future calls. - -This works fine for basic testing or if you don't really need to persist the user. At any point you can call `Auth::check()` to see if there is a user logged in and `Auth::user()` to get the wrapper with the user information. - -To enable this driver, you need to change the following line in `/config/auth.php`: - -```php -... - 'driver' => 'auth0', -... -``` - -If you need to implement a more advanced custom solution, you can always extend the Auth0UserRepository (or implement your own) in order to get and update the user data on your database and event more advaced validations. - -#### 6.2. Using other driver - -If you want to persist the user you can use the authentication driver you like. The plugin gives you a hook that is called with the *Normalized User Profile* when the callback is succesful, there you can store the user structure as you want. For example, if we use Eloquent, we can add the following code, to persist the user in the database - -```php -Auth0::onLogin(function($auth0User) { - // See if the user exists - $user = User::where("auth0id", $auth0User->user_id)->first(); - if ($user === null) { - // If not, create one - $user = new User(); - $user->email = $auth0User->email; - $user->auth0id = $auth0User->user_id; - $user->nickname = $auth0User->nickname; - $user->name = $auth0User->name; - $user->save(); - } - return $user; -}); -``` - -Note that this hook must return the new user, which must implement the `Illuminate\Contracts\Auth\Authenticatable`. The onLogin function is going to be called just once, when the callback uri is called, then its up to the selected auth driver to get the user from the database. - -### 7. Use it! - -Now you can use Laravel middleware as you would normally do to restrict access, for example - -```php -Route::get('admin', array('middleware' => 'auth0.jwt', function() { - // ... -})); -``` - -Or add a logout action like this - -```php -Route::get('/logout', function() { - Auth::logout(); - return Redirect::home(); -}); -``` - -Enjoy! - ## Issue Reporting If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/whitehat) details the procedure for disclosing security issues. From 336668ad772bdb2f2dee56da2e882e64d4ec7cec Mon Sep 17 00:00:00 2001 From: Annyv2 Date: Fri, 6 Nov 2015 13:15:00 -0430 Subject: [PATCH 008/663] Update login.blade.php Changed scope:'openid profile' for scope:'openid name email picture' --- examples/laravel-api/resources/views/welcome/login.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/laravel-api/resources/views/welcome/login.blade.php b/examples/laravel-api/resources/views/welcome/login.blade.php index 318b8e64..cd0e3f11 100644 --- a/examples/laravel-api/resources/views/welcome/login.blade.php +++ b/examples/laravel-api/resources/views/welcome/login.blade.php @@ -14,11 +14,11 @@ callbackURL: '{{ $auth0Config['redirect_uri'] }}' , responseType: 'code' , authParams: { - scope: 'openid profile' + scope: 'openid name email picture' } , container: 'a0-container' }); -@stop \ No newline at end of file +@stop From 990fafd85eedaae3f29d5a53ee1fb612143c6428 Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 30 Nov 2015 19:41:36 -0300 Subject: [PATCH 009/663] updated auth0-php dependency version --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 9c02f051..2013e2d9 100644 --- a/composer.json +++ b/composer.json @@ -5,8 +5,7 @@ "require": { "php": ">=5.3.0", "illuminate/support": "5.*", - "auth0/auth0-php": "~1.0", - "adoy/oauth2": "~1.3", + "auth0/auth0-php": "~2.1", "illuminate/contracts": "5.*" }, "autoload": { From d8b6e2047e2de93953a628962ac1728d55ac7be7 Mon Sep 17 00:00:00 2001 From: German Lena Date: Wed, 6 Jan 2016 11:57:18 -0300 Subject: [PATCH 010/663] updated to be compatible with laravel 5.2 --- README.md | 36 +++++++++++++++++++++++- src/Auth0/Login/Auth0User.php | 9 ++++++ src/Auth0/Login/LaravelSessionStore.php | 2 +- src/Auth0/Login/LoginServiceProvider.php | 11 ++------ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d1a483d0..cf19aeb4 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,44 @@ Check our docs page to get a complete guide on how to install it in an existing > If you find something wrong in our docs, PR are welcome in our docs repo: https://github.com/auth0/docs +###Laravel 5.2 + +####Routes +Your routes need to be in the `web` routes group, otherwise it will not be able to use the session storage: + +``` +Route::group(['middleware' => ['web']], function () { + + Route::get('/auth0/callback', '\Auth0\Login\Auth0Controller@callback'); + + Route::get('/', function () { + + if (Auth::check()) dd('LOGGED IN',Auth::user()); + + return view('welcome'); + + }); +}); +``` + +####Auth setup + +In your `config/auth.php` file update the providers to use the `auth0` driver: + +``` +... + 'providers' => [ + 'users' => [ + 'driver' => 'auth0', + ], + ], +... +``` ##Laravel Compatibility -The last version (2.x) targets Laravel 5 compatibility. +The 2.x branch targets Laravel 5.0 and 5.1 compatibility. +The 3.x branch targets Laravel 5.2 compatibility. If you are working with an older version (Laravel 4.x) you need to point to composer.json to the version 1.0.* diff --git a/src/Auth0/Login/Auth0User.php b/src/Auth0/Login/Auth0User.php index 0a07669e..8743cb98 100644 --- a/src/Auth0/Login/Auth0User.php +++ b/src/Auth0/Login/Auth0User.php @@ -22,6 +22,15 @@ public function getAuthIdentifier() { return $this->userInfo["user_id"]; } + /** + * Get id field name. + * + * @return string + */ + public function getAuthIdentifierName() { + return 'id'; + } + /** * Get the password for the user. * diff --git a/src/Auth0/Login/LaravelSessionStore.php b/src/Auth0/Login/LaravelSessionStore.php index 4b9eaaf2..51ac2ae9 100644 --- a/src/Auth0/Login/LaravelSessionStore.php +++ b/src/Auth0/Login/LaravelSessionStore.php @@ -18,7 +18,7 @@ public function set($key, $value) { Session::put($key_name, $value); } - public function get($key, $default=false) { + public function get($key, $default=null) { $key_name = $this->getSessionKeyName($key); return Session::get($key_name, $default); diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index e6f9898a..35e079b2 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -22,15 +22,10 @@ class LoginServiceProvider extends ServiceProvider { */ public function boot() { - \Auth::extend('auth0', function($app) { - - // Let the container build the repository for us - $userRepository = \App::make('\Auth0\Login\Contract\Auth0UserRepository'); - - $provider = new Auth0UserProvider($userRepository); - - return new \Illuminate\Auth\Guard($provider, $app['session.store']); + \Auth::provider('auth0', function($app, array $config) { + $userRepository = \App::make(\Auth0\Login\Contract\Auth0UserRepository::class); + return new Auth0UserProvider($userRepository); }); $this->publishes([ From 19d9b94717912266a46413424591e6bb4773167c Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 18 Jan 2016 17:34:59 -0300 Subject: [PATCH 011/663] updated auth0-php dependency --- composer.json | 2 +- src/Auth0/Login/LoginServiceProvider.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 2013e2d9..6be5e0b1 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "require": { "php": ">=5.3.0", "illuminate/support": "5.*", - "auth0/auth0-php": "~2.1", + "auth0/auth0-php": "~3.0", "illuminate/contracts": "5.*" }, "autoload": { diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index 35e079b2..dbfda3ac 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -1,8 +1,8 @@ Date: Mon, 18 Jan 2016 17:39:37 -0300 Subject: [PATCH 012/663] updated changelog --- CHANGELOG.md | 56 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1882b3d..93bfb308 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,43 @@ # Change Log -## [2.1.3](https://github.com/auth0/laravel-auth0/tree/2.1.3) (2015-07-17) +## [3.0.1](https://github.com/auth0/laravel-auth0/tree/3.0.1) (2016-01-18) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/3.0.0...3.0.1) + +**Merged pull requests:** + +- updated auth0-php dependency [\#24](https://github.com/auth0/laravel-auth0/pull/24) ([glena](https://github.com/glena)) + +## [3.0.0](https://github.com/auth0/laravel-auth0/tree/3.0.0) (2016-01-06) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.2.0...3.0.0) + +**Closed issues:** + +- auth0/auth0-php ~1.0 requirement doesn't support latest GuzzleHttp [\#21](https://github.com/auth0/laravel-auth0/issues/21) + +**Merged pull requests:** + +- updated to be compatible with laravel 5.2 [\#23](https://github.com/auth0/laravel-auth0/pull/23) ([glena](https://github.com/glena)) + +## [2.2.0](https://github.com/auth0/laravel-auth0/tree/2.2.0) (2015-11-30) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.1.4...2.2.0) + +**Merged pull requests:** + +- updated auth0-php dependency version [\#22](https://github.com/auth0/laravel-auth0/pull/22) ([glena](https://github.com/glena)) +- Update login.blade.php [\#20](https://github.com/auth0/laravel-auth0/pull/20) ([Annyv2](https://github.com/Annyv2)) + +## [2.1.4](https://github.com/auth0/laravel-auth0/tree/2.1.4) (2015-10-27) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.1.3...2.1.4) + +**Merged pull requests:** +- Middleware contract has been deprecated in 5.1 [\#19](https://github.com/auth0/laravel-auth0/pull/19) ([thijsvdanker](https://github.com/thijsvdanker)) +- Fixed some typo's in the comments. [\#18](https://github.com/auth0/laravel-auth0/pull/18) ([thijsvdanker](https://github.com/thijsvdanker)) +- Removed note about unstable dependency from README [\#17](https://github.com/auth0/laravel-auth0/pull/17) ([thijsvdanker](https://github.com/thijsvdanker)) +- Update composer instructions [\#16](https://github.com/auth0/laravel-auth0/pull/16) ([iWader](https://github.com/iWader)) +- Use a tagged release of adoy/oauth2 [\#15](https://github.com/auth0/laravel-auth0/pull/15) ([thijsvdanker](https://github.com/thijsvdanker)) + +## [2.1.3](https://github.com/auth0/laravel-auth0/tree/2.1.3) (2015-07-17) [Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.1.2...2.1.3) **Merged pull requests:** @@ -9,7 +45,6 @@ - updated jwt dependency [\#14](https://github.com/auth0/laravel-auth0/pull/14) ([glena](https://github.com/glena)) ## [2.1.2](https://github.com/auth0/laravel-auth0/tree/2.1.2) (2015-05-15) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.1.1...2.1.2) **Merged pull requests:** @@ -17,13 +52,11 @@ - Added override of info headers [\#13](https://github.com/auth0/laravel-auth0/pull/13) ([glena](https://github.com/glena)) ## [2.1.1](https://github.com/auth0/laravel-auth0/tree/2.1.1) (2015-05-12) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.1.0...2.1.1) **Closed issues:** - SDK Client headers spec compliant [\#11](https://github.com/auth0/laravel-auth0/issues/11) - - Support for Laravel 5? [\#6](https://github.com/auth0/laravel-auth0/issues/6) **Merged pull requests:** @@ -31,7 +64,6 @@ - SDK Client headers spec compliant \#11 [\#12](https://github.com/auth0/laravel-auth0/pull/12) ([glena](https://github.com/glena)) ## [2.1.0](https://github.com/auth0/laravel-auth0/tree/2.1.0) (2015-05-07) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.0.0...2.1.0) **Merged pull requests:** @@ -39,35 +71,27 @@ - Upgrade to auth-php 1.0.0: Added support to API V2 [\#10](https://github.com/auth0/laravel-auth0/pull/10) ([glena](https://github.com/glena)) ## [2.0.0](https://github.com/auth0/laravel-auth0/tree/2.0.0) (2015-04-20) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/1.0.8...2.0.0) **Merged pull requests:** - Package V2 for Laravel5 [\#9](https://github.com/auth0/laravel-auth0/pull/9) ([glena](https://github.com/glena)) -- Package V2 for Laravel5 [\#8](https://github.com/auth0/laravel-auth0/pull/8) ([glena](https://github.com/glena)) - ## [1.0.8](https://github.com/auth0/laravel-auth0/tree/1.0.8) (2015-04-14) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/1.0.7...1.0.8) ## [1.0.7](https://github.com/auth0/laravel-auth0/tree/1.0.7) (2015-04-13) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/1.0.6...1.0.7) **Merged pull requests:** - Fixed the way the access token is pased to the A0User [\#7](https://github.com/auth0/laravel-auth0/pull/7) ([glena](https://github.com/glena)) - - Update README.md [\#5](https://github.com/auth0/laravel-auth0/pull/5) ([pose](https://github.com/pose)) ## [1.0.6](https://github.com/auth0/laravel-auth0/tree/1.0.6) (2014-08-01) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/1.0.5...1.0.6) ## [1.0.5](https://github.com/auth0/laravel-auth0/tree/1.0.5) (2014-08-01) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/1.0.4...1.0.5) **Closed issues:** @@ -78,16 +102,10 @@ - Update README.md [\#3](https://github.com/auth0/laravel-auth0/pull/3) ([patekuru](https://github.com/patekuru)) -- Update README.md [\#2](https://github.com/auth0/laravel-auth0/pull/2) ([patekuru](https://github.com/patekuru)) - -- Update README.md [\#1](https://github.com/auth0/laravel-auth0/pull/1) ([patekuru](https://github.com/patekuru)) - ## [1.0.4](https://github.com/auth0/laravel-auth0/tree/1.0.4) (2014-05-07) - [Full Changelog](https://github.com/auth0/laravel-auth0/compare/1.0.3...1.0.4) ## [1.0.3](https://github.com/auth0/laravel-auth0/tree/1.0.3) (2014-04-21) - \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file From be0d2313bcab8f21898c68b97a723e780e370f17 Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 18 Jan 2016 17:48:34 -0300 Subject: [PATCH 013/663] updated package version --- src/Auth0/Login/LoginServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index dbfda3ac..3b8a834a 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -6,7 +6,7 @@ class LoginServiceProvider extends ServiceProvider { - const SDK_VERSION = "2.1.2"; + const SDK_VERSION = "3.0.1"; /** * Indicates if loading of the provider is deferred. From 62b510d73714ecac289c750dc4d0c873ce1bfc2a Mon Sep 17 00:00:00 2001 From: Troels Johnsen Date: Mon, 25 Jan 2016 07:40:52 +0100 Subject: [PATCH 014/663] Added optional persistence configuration values --- src/config/config.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config/config.php b/src/config/config.php index 82843c64..971f6a2d 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -42,6 +42,18 @@ // 'redirect_uri' => 'http:///auth0/callback' + /* + |-------------------------------------------------------------------------- + | Persistence Configuration + |-------------------------------------------------------------------------- + | persist_user (Boolean) Optional. Indicates if you want to persist the user info, default true + | persist_access_token (Boolean) Optional. Indicates if you want to persist the access token, default false + | persist_id_token (Boolean) Optional. Indicates if you want to persist the id token, default false + | + */ + // 'persist_user' => true, + // 'persist_access_token' => false, + // 'persist_id_token' => false, ); From 66faeaab504e35bf8896014110da681876491333 Mon Sep 17 00:00:00 2001 From: ryannjohnson Date: Wed, 27 Jan 2016 15:55:28 -0800 Subject: [PATCH 015/663] Conform to 5.2's Authenticatable contract Laravel 5.2 introduced the `getAuthIdentifierName` abstract function in its Authenticatable contract, throwing an error if `AuthJWTUser` is used to authenticate. --- src/Auth0/Login/Auth0JWTUser.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Auth0/Login/Auth0JWTUser.php b/src/Auth0/Login/Auth0JWTUser.php index 0b612fa5..7f0e041a 100644 --- a/src/Auth0/Login/Auth0JWTUser.php +++ b/src/Auth0/Login/Auth0JWTUser.php @@ -12,6 +12,16 @@ class Auth0JWTUser implements \Illuminate\Contracts\Auth\Authenticatable { function __construct ($userInfo) { $this->userInfo = get_object_vars($userInfo); } + + /** + * Get the unique identifier for the user. + * + * @return mixed + */ + public function getAuthIdentifierName() { + return $this->userInfo['sub']; + } + /** * Get the unique identifier for the user. * From cf0a6f4db68773beec1a0ac07a8fc0f429c8c31c Mon Sep 17 00:00:00 2001 From: German Lena Date: Thu, 28 Jan 2016 10:27:25 -0300 Subject: [PATCH 016/663] updated changelog --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93bfb308..ddeb7e9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Change Log +## [3.0.3](https://github.com/auth0/laravel-auth0/tree/3.0.3) (2016-01-28) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/3.0.2...3.0.3) + +**Closed issues:** + +- Tag 2.2.2 breaks on Laravel 5.1 [\#30](https://github.com/auth0/laravel-auth0/issues/30) + +**Merged pull requests:** + +- Conform to 5.2's Authenticatable contract [\#31](https://github.com/auth0/laravel-auth0/pull/31) ([ryannjohnson](https://github.com/ryannjohnson)) + +## [3.0.2](https://github.com/auth0/laravel-auth0/tree/3.0.2) (2016-01-25) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/2.2.1...3.0.2) + +**Merged pull requests:** + +- Added optional persistence configuration values [\#29](https://github.com/auth0/laravel-auth0/pull/29) ([carnevalle](https://github.com/carnevalle)) + +## [2.2.1](https://github.com/auth0/laravel-auth0/tree/2.2.1) (2016-01-22) +[Full Changelog](https://github.com/auth0/laravel-auth0/compare/3.0.1...2.2.1) + +**Closed issues:** + +- Create a logout route [\#25](https://github.com/auth0/laravel-auth0/issues/25) + +**Merged pull requests:** + +- Auth0 SDK checks for null values instead of false [\#27](https://github.com/auth0/laravel-auth0/pull/27) ([thijsvdanker](https://github.com/thijsvdanker)) + ## [3.0.1](https://github.com/auth0/laravel-auth0/tree/3.0.1) (2016-01-18) [Full Changelog](https://github.com/auth0/laravel-auth0/compare/3.0.0...3.0.1) From dc1785d39d0015b0d41676c7eddc304beee6bbb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Lena?= Date: Thu, 28 Jan 2016 12:32:27 -0300 Subject: [PATCH 017/663] changed to load the .env file --- examples/laravel-api/config/laravel-auth0.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/laravel-api/config/laravel-auth0.php b/examples/laravel-api/config/laravel-auth0.php index 82843c64..a0f6c8ff 100644 --- a/examples/laravel-api/config/laravel-auth0.php +++ b/examples/laravel-api/config/laravel-auth0.php @@ -10,7 +10,7 @@ | */ - // 'domain' => 'XXXX.auth0.com', + 'domain' => getenv('AUTH0_DOMAIN'), /* |-------------------------------------------------------------------------- | Your APP id @@ -19,7 +19,7 @@ | */ - // 'client_id' => 'XXXX', + 'client_id' => getenv('AUTH0_CLIENT_ID'), /* |-------------------------------------------------------------------------- @@ -28,7 +28,7 @@ | As set in the auth0 administration page | */ - // 'client_secret' => 'XXXXX', + 'client_secret' => getenv('AUTH0_CLIENT_SECRET'), /* @@ -40,7 +40,7 @@ | */ - // 'redirect_uri' => 'http:///auth0/callback' + 'redirect_uri' => getenv('AUTH0_CALLBACK_URL') From 30fe6d332c6741f92d02567a4426f4ccead503d5 Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 5 Feb 2016 14:35:49 +0200 Subject: [PATCH 018/663] update auth0/login dependency in example --- examples/laravel-api/composer.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/laravel-api/composer.json b/examples/laravel-api/composer.json index a9337d3b..9f4a191e 100644 --- a/examples/laravel-api/composer.json +++ b/examples/laravel-api/composer.json @@ -6,9 +6,7 @@ "type": "project", "require": { "laravel/framework": "5.0.*", - "adoy/oauth2": "dev-master", - "firebase/php-jwt" : "dev-master", - "auth0/login": "~2.1" + "auth0/login": "~2.2" }, "require-dev": { "phpunit/phpunit": "~4.0", From f3a40eb8770f1b2d17bad7a9195496eeb4c19cdf Mon Sep 17 00:00:00 2001 From: Annyv2 Date: Wed, 30 Mar 2016 16:20:51 -0430 Subject: [PATCH 019/663] Update lock --- examples/laravel-api/resources/views/welcome/login.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/laravel-api/resources/views/welcome/login.blade.php b/examples/laravel-api/resources/views/welcome/login.blade.php index cd0e3f11..265994fa 100644 --- a/examples/laravel-api/resources/views/welcome/login.blade.php +++ b/examples/laravel-api/resources/views/welcome/login.blade.php @@ -5,7 +5,7 @@
- + - + @@ -30,4 +30,4 @@
- \ No newline at end of file + From 04f96019313eae1f9e5b8bf07e9feed59ad010d1 Mon Sep 17 00:00:00 2001 From: Phillipp Ohlandt Date: Thu, 28 Apr 2016 17:33:53 +0200 Subject: [PATCH 021/663] add rememberUser getter/setter --- src/Auth0/Login/Auth0Service.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 868b2d45..6a6ce620 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -66,6 +66,21 @@ public function hasOnLogin () { public function callOnLogin($auth0User) { return call_user_func($this->_onLoginCb, $auth0User); } + + private $rememberUser = false; + /** + * Use this to either enable or disable the "remember" function for users + * + * @param null $value + * @return bool|null + */ + public function rememberUser($value = null) { + if($value !== null){ + $this->rememberUser = $value; + } + + return $this->rememberUser; + } private $apiuser; public function decodeJWT($encUser) { From fa56fdf620e57b4727197d6157b70f0055afa833 Mon Sep 17 00:00:00 2001 From: Phillipp Ohlandt Date: Thu, 28 Apr 2016 17:35:28 +0200 Subject: [PATCH 022/663] add call to rememberUser() function when the user gets logged in --- src/controllers/Auth0Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/Auth0Controller.php b/src/controllers/Auth0Controller.php index 4ef09ceb..92675442 100644 --- a/src/controllers/Auth0Controller.php +++ b/src/controllers/Auth0Controller.php @@ -37,7 +37,7 @@ public function callback() { // If not, the user will be fine $user = $auth0User; } - \Auth::login($user); + \Auth::login($user, $service->rememberUser()); } return \Redirect::intended('/'); } From d54fbc134d41ea05da1cb4564895f559b0f31fc9 Mon Sep 17 00:00:00 2001 From: German Lena Date: Fri, 29 Apr 2016 16:47:22 -0300 Subject: [PATCH 023/663] RS256 signed tokens support + remember me --- composer.json | 2 +- src/Auth0/Login/Auth0Service.php | 18 ++++++++++++++---- .../Login/Middleware/Auth0JWTMiddleware.php | 4 +--- src/config/config.php | 17 +++++++++++++++++ 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 6be5e0b1..3409f0c8 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "require": { "php": ">=5.3.0", "illuminate/support": "5.*", - "auth0/auth0-php": "~3.0", + "auth0/auth0-php": "~3.2", "illuminate/contracts": "5.*" }, "autoload": { diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 6a6ce620..46babb5d 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -84,15 +84,25 @@ public function rememberUser($value = null) { private $apiuser; public function decodeJWT($encUser) { - $client_id = config('laravel-auth0.client_id'); $client_secret = config('laravel-auth0.client_secret'); - - $this->apiuser = Auth0JWT::decode($encUser, $client_id, $client_secret); - + $authorized_issuers = config('laravel-auth0.authorized_issuers'); + $api_identifier = config('laravel-auth0.api_identifier'); + $audiences = []; + if (!empty($api_identifier)) { + if (is_array($api_identifier)) { + $audiences = $api_identifier; + } + else { + $audiences[] = $api_identifier; + } + } + $audiences[] = $client_id; + $this->apiuser = Auth0JWT::decode($encUser, $audiences, $client_secret, $authorized_issuers); return $this->apiuser; } + public function jwtuser() { return $this->apiuser; } diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index dfad1bfa..16e9e168 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -16,8 +16,6 @@ public function handle($request, \Closure $next) { $auth0 = \App::make('auth0'); - - // Get the encrypted user JWT $authorizationHeader = $request->header("Authorization"); $encUser = str_replace('Bearer ', '', $authorizationHeader); @@ -50,4 +48,4 @@ public function handle($request, \Closure $next) return $next($request); } -} +} \ No newline at end of file diff --git a/src/config/config.php b/src/config/config.php index 971f6a2d..c3472856 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -56,4 +56,21 @@ // 'persist_access_token' => false, // 'persist_id_token' => false, + /* + |-------------------------------------------------------------------------- + | The authorized token issuers + |-------------------------------------------------------------------------- + | This is used to verify the decoded tokens when using RS256 + | + */ + // 'authorized_issuers' => [ 'https://xxxx.auth0.com/' ], + /* + |-------------------------------------------------------------------------- + | The authorized token issuers + |-------------------------------------------------------------------------- + | This is used to verify the decoded tokens when using RS256 + | + */ + // 'api_identifier' => [ ], + ); From 85de9646526419318c91d7064e646ce96a27876e Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 2 May 2016 11:02:49 -0300 Subject: [PATCH 024/663] fix dependency version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 3409f0c8..59db2f65 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "require": { "php": ">=5.3.0", "illuminate/support": "5.*", - "auth0/auth0-php": "~3.2", + "auth0/auth0-php": "^3.2.1", "illuminate/contracts": "5.*" }, "autoload": { From c1e3e120a9085a6cf77f14b779b13ac490cc7391 Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 11 Jul 2016 14:56:11 -0300 Subject: [PATCH 025/663] New optional jwt middleware --- .../Login/Middleware/Auth0JWTMiddleware.php | 49 +++++++++++-------- .../Middleware/Auth0OptionalJWTMiddleware | 9 ++++ 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index 16e9e168..f6d64e72 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -12,37 +12,44 @@ public function __construct(Auth0UserRepository $userRepository) { $this->userRepository = $userRepository; } + protected function getToken($request) { + // Get the encrypted user JWT + $authorizationHeader = $request->header("Authorization"); + return trim(str_replace('Bearer ', '', $authorizationHeader)); + } + + protected function validateToken($token) { + return ($encUser !== ''); + } + public function handle($request, \Closure $next) { $auth0 = \App::make('auth0'); - // Get the encrypted user JWT - $authorizationHeader = $request->header("Authorization"); - $encUser = str_replace('Bearer ', '', $authorizationHeader); - - if (trim($encUser) == '') { + $token = $this->getToken($request); + + if ( ! $this->validateToken($token)) { return \Response::make("Unauthorized user", 401); } - try { - $jwtUser = $auth0->decodeJWT($encUser); - } - catch(CoreException $e) { - return \Response::make("Unauthorized user", 401); - } - catch(Exception $e) { - echo $e;exit; - } + if ($token) { + try { + $jwtUser = $auth0->decodeJWT($token); + } + catch(CoreException $e) { + return \Response::make("Unauthorized user", 401); + } - // if it does not represent a valid user, return a HTTP 401 - $user = $this->userRepository->getUserByDecodedJWT($jwtUser); + // if it does not represent a valid user, return a HTTP 401 + $user = $this->userRepository->getUserByDecodedJWT($jwtUser); - if (!$user) { - return \Response::make("Unauthorized user", 401); - } + if (!$user) { + return \Response::make("Unauthorized user", 401); + } - // lets log the user in so it is accessible - \Auth::login($user); + // lets log the user in so it is accessible + \Auth::login($user); + } // continue the execution return $next($request); diff --git a/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware b/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware new file mode 100644 index 00000000..f2bb76f3 --- /dev/null +++ b/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware @@ -0,0 +1,9 @@ + Date: Mon, 11 Jul 2016 15:37:09 -0300 Subject: [PATCH 026/663] fix var name --- src/Auth0/Login/Middleware/Auth0JWTMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index f6d64e72..6bbc3feb 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -19,7 +19,7 @@ protected function getToken($request) { } protected function validateToken($token) { - return ($encUser !== ''); + return ($token !== ''); } public function handle($request, \Closure $next) From 935ab4d7e0eedc5fb6756e56b4385252527f0c31 Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 11 Jul 2016 15:47:17 -0300 Subject: [PATCH 027/663] fix + new middleware --- ...WTMiddleware => Auth0OptionalJWTMiddleware.php} | 0 src/Auth0/Login/Middleware/ForceAuthMiddleware.php | 14 ++++++++++++++ 2 files changed, 14 insertions(+) rename src/Auth0/Login/Middleware/{Auth0OptionalJWTMiddleware => Auth0OptionalJWTMiddleware.php} (100%) create mode 100644 src/Auth0/Login/Middleware/ForceAuthMiddleware.php diff --git a/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware b/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware.php similarity index 100% rename from src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware rename to src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware.php diff --git a/src/Auth0/Login/Middleware/ForceAuthMiddleware.php b/src/Auth0/Login/Middleware/ForceAuthMiddleware.php new file mode 100644 index 00000000..810b4f0e --- /dev/null +++ b/src/Auth0/Login/Middleware/ForceAuthMiddleware.php @@ -0,0 +1,14 @@ + Date: Mon, 5 Sep 2016 13:50:20 -0300 Subject: [PATCH 028/663] upgrade to use auth0-php 4.0 --- composer.json | 2 +- src/Auth0/Login/Auth0Service.php | 40 +++++++++---------- src/Auth0/Login/LoginServiceProvider.php | 6 +++ .../Login/Middleware/Auth0JWTMiddleware.php | 3 ++ src/config/config.php | 1 + 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/composer.json b/composer.json index 59db2f65..3a76fc72 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "require": { "php": ">=5.3.0", "illuminate/support": "5.*", - "auth0/auth0-php": "^3.2.1", + "auth0/auth0-php": "^4.0.0", "illuminate/contracts": "5.*" }, "autoload": { diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 46babb5d..ca91c42a 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -1,8 +1,8 @@ auth0)) { + private function getSDK() + { + if (is_null($this->auth0)) + { $auth0Config = config('laravel-auth0'); $auth0Config['store'] = new LaravelSessionStore(); - $this->auth0 = new Auth0($auth0Config); + + + $auth0 = new Authentication($auth0Config['domain'], $auth0Config['client_id']); + + $this->auth0 = $auth0->get_oauth_client($auth0Config['client_secret'], $auth0Config['redirect_uri']); } return $this->auth0; @@ -83,22 +89,14 @@ public function rememberUser($value = null) { } private $apiuser; - public function decodeJWT($encUser) { - $client_id = config('laravel-auth0.client_id'); - $client_secret = config('laravel-auth0.client_secret'); - $authorized_issuers = config('laravel-auth0.authorized_issuers'); - $api_identifier = config('laravel-auth0.api_identifier'); - $audiences = []; - if (!empty($api_identifier)) { - if (is_array($api_identifier)) { - $audiences = $api_identifier; - } - else { - $audiences[] = $api_identifier; - } - } - $audiences[] = $client_id; - $this->apiuser = Auth0JWT::decode($encUser, $audiences, $client_secret, $authorized_issuers); + public function decodeJWT($encUser) + { + $verifier = new JWTVerifier([ + 'valid_audiences' => [config('laravel-auth0.client_id'), config('laravel-auth0.api_identifier')], + 'client_secret' => config('laravel-auth0.client_secret'), + 'authorized_issuers' => config('laravel-auth0.authorized_issuers'), + ]); + $this->apiuser = $verifier->verifyAndDecode($encUser); return $this->apiuser; } diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index 3b8a834a..bd0e4585 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -63,6 +63,12 @@ public function register() \Event::listen('auth.logout', function() { \App::make("auth0")->logout(); }); + \Event::listen('user.logout', function() { + \App::make("auth0")->logout(); + }); + \Event::listen('Illuminate\Auth\Events\Logout', function() { + \App::make("auth0")->logout(); + }); } diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index 6bbc3feb..55e142af 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -39,6 +39,9 @@ public function handle($request, \Closure $next) catch(CoreException $e) { return \Response::make("Unauthorized user", 401); } + catch(InvalidTokenException $e) { + return \Response::make("Unauthorized user", 401); + } // if it does not represent a valid user, return a HTTP 401 $user = $this->userRepository->getUserByDecodedJWT($jwtUser); diff --git a/src/config/config.php b/src/config/config.php index c3472856..21d502a1 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -64,6 +64,7 @@ | */ // 'authorized_issuers' => [ 'https://xxxx.auth0.com/' ], + /* |-------------------------------------------------------------------------- | The authorized token issuers From 815f8fe7191f4c290c7a1dbfe342b4ed81483066 Mon Sep 17 00:00:00 2001 From: German Lena Date: Tue, 13 Sep 2016 13:09:50 -0300 Subject: [PATCH 029/663] Added laravel cache manager for JWKs --- README.md | 14 +++++++++++ src/Auth0/Login/Auth0Service.php | 9 +++++++ src/Auth0/Login/LaravelCacheWrapper.php | 31 +++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 src/Auth0/Login/LaravelCacheWrapper.php diff --git a/README.md b/README.md index cf19aeb4..e1aa9748 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,20 @@ Check our docs page to get a complete guide on how to install it in an existing > If you find something wrong in our docs, PR are welcome in our docs repo: https://github.com/auth0/docs +### Setting up a JWKs cache + +In the `register` method of your `AppServiceProvider` add: + +```php + $cache = Cache::store('default'); + + $this->app->bind( + '\Auth0\SDK\Helpers\Cache\CacheHandler', + new \Auth0\SDK\Helpers\Cache\LaravelCacheWrapper($cache)); +``` + +You can implement your own cache strategy by creating a new class that implements the `Auth0\SDK\Helpers\Cache\CacheHandler` contract. + ###Laravel 5.2 ####Routes diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index ca91c42a..585f5ae8 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -3,6 +3,7 @@ use Config; use Auth0\SDK\API\Authentication; use Auth0\SDK\JWTVerifier; +use Illuminate\Contracts\Container\BindingResolutionException; /** * Service that provides access to the Auth0 SDK. @@ -91,11 +92,19 @@ public function rememberUser($value = null) { private $apiuser; public function decodeJWT($encUser) { + try { + $cache = \App::make('\Auth0\SDK\Helpers\Cache\CacheHandler'); + } catch(BindingResolutionException $e) { + $cache = null; + } + $verifier = new JWTVerifier([ 'valid_audiences' => [config('laravel-auth0.client_id'), config('laravel-auth0.api_identifier')], 'client_secret' => config('laravel-auth0.client_secret'), 'authorized_issuers' => config('laravel-auth0.authorized_issuers'), + 'cache' => $cache, ]); + $this->apiuser = $verifier->verifyAndDecode($encUser); return $this->apiuser; } diff --git a/src/Auth0/Login/LaravelCacheWrapper.php b/src/Auth0/Login/LaravelCacheWrapper.php new file mode 100644 index 00000000..345c10c3 --- /dev/null +++ b/src/Auth0/Login/LaravelCacheWrapper.php @@ -0,0 +1,31 @@ +cache = $laravelCache; + } + + public function get($key) + { + return $this->cache->get($key); + } + + public function delete($key) + { + $this->cache->forget($key); + } + + public function set($key, $value) + { + $this->cache->forever($key, $value); + } +} \ No newline at end of file From 60b65aa31044433e67a13b78d0994d5c17b480b0 Mon Sep 17 00:00:00 2001 From: German Lena Date: Thu, 15 Sep 2016 11:04:51 -0300 Subject: [PATCH 030/663] support default passport api auth, fixes --- README.md | 27 ++++++++++---- src/Auth0/Login/Auth0Service.php | 1 - src/Auth0/Login/Auth0UserProvider.php | 35 +++++++++++++++---- src/Auth0/Login/LaravelCacheWrapper.php | 6 ++-- src/Auth0/Login/LoginServiceProvider.php | 7 ++-- .../Login/Middleware/Auth0JWTMiddleware.php | 2 +- 6 files changed, 58 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index e1aa9748..8e65a5fe 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,29 @@ Check our docs page to get a complete guide on how to install it in an existing In the `register` method of your `AppServiceProvider` add: ```php - $cache = Cache::store('default'); - - $this->app->bind( - '\Auth0\SDK\Helpers\Cache\CacheHandler', - new \Auth0\SDK\Helpers\Cache\LaravelCacheWrapper($cache)); + use Illuminate\Support\Facades\Cache; + + ... + public function register() + { + ... + + $this->app->bind( + '\Auth0\SDK\Helpers\Cache\CacheHandler', + function() { + static $cacheWrapper = null; + if ($cacheWrapper === null) { + $cache = Cache::store(); + $cacheWrapper = new LaravelCacheWrapper($cache); + } + return $cacheWrapper; + }); + + ... + } ``` -You can implement your own cache strategy by creating a new class that implements the `Auth0\SDK\Helpers\Cache\CacheHandler` contract. +You can implement your own cache strategy by creating a new class that implements the `Auth0\SDK\Helpers\Cache\CacheHandler` contract, or just use the cache strategy you want by picking that store with `Cache::store('your_store_name')`; ###Laravel 5.2 diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 585f5ae8..63eef3c3 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -24,7 +24,6 @@ private function getSDK() $auth0Config['store'] = new LaravelSessionStore(); - $auth0 = new Authentication($auth0Config['domain'], $auth0Config['client_id']); $this->auth0 = $auth0->get_oauth_client($auth0Config['client_secret'], $auth0Config['redirect_uri']); diff --git a/src/Auth0/Login/Auth0UserProvider.php b/src/Auth0/Login/Auth0UserProvider.php index fbd5118a..5e3b77d2 100644 --- a/src/Auth0/Login/Auth0UserProvider.php +++ b/src/Auth0/Login/Auth0UserProvider.php @@ -1,9 +1,12 @@ userRepository = $userRepository; + $this->auth0 = $auth0; } /** @@ -23,20 +28,36 @@ public function __construct(Auth0UserRepository $userRepository) { * @return Authenticatable */ public function retrieveByID($identifier) { + dd('retrieveByID',$identifier); return $this->userRepository->getUserByIdentifier($identifier); + } - /** - * Required method by the UserProviderInterface, we don't implement it - */ public function retrieveByCredentials(array $credentials) { - return false; + if (!isset($credentials['api_token'])) { + return false; + } + + $encUser = $credentials['api_token']; + + try { + $decodedJWT = $this->auth0->decodeJWT($encUser); + } + catch(CoreException $e) { + return \Response::make("Unauthorized user", 401); + } + catch(InvalidTokenException $e) { + return \Response::make("Unauthorized user", 401); + } + + return $this->userRepository->getUserByDecodedJWT($decodedJWT); } /** * Required method by the UserProviderInterface, we don't implement it */ public function retrieveByToken($identifier, $token) { + dd('retrieveByToken',$identifier, $token); return false; } @@ -44,12 +65,14 @@ public function retrieveByToken($identifier, $token) { * Required method by the UserProviderInterface, we don't implement it */ public function updateRememberToken(Authenticatable $user, $token) { + dd('updateRememberToken',$user, $token); } /** * Required method by the UserProviderInterface, we don't implement it */ public function validateCredentials(Authenticatable $user, array $credentials) { + dd('validateCredentials',$user, $credentials); return false; } } diff --git a/src/Auth0/Login/LaravelCacheWrapper.php b/src/Auth0/Login/LaravelCacheWrapper.php index 345c10c3..44ed138e 100644 --- a/src/Auth0/Login/LaravelCacheWrapper.php +++ b/src/Auth0/Login/LaravelCacheWrapper.php @@ -1,15 +1,15 @@ cache = $laravelCache; } diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index bd0e4585..c3730eac 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -23,9 +23,10 @@ class LoginServiceProvider extends ServiceProvider { public function boot() { - \Auth::provider('auth0', function($app, array $config) { - $userRepository = \App::make(\Auth0\Login\Contract\Auth0UserRepository::class); - return new Auth0UserProvider($userRepository); + \Auth::provider('auth0', function($app, array $config) { + // $userRepository = \App::make(\Auth0\Login\Contract\Auth0UserRepository::class); + // return new Auth0UserProvider($userRepository); + return $app->make(Auth0UserProvider::class); }); $this->publishes([ diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index 55e142af..76a84e4b 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -1,8 +1,8 @@ Date: Thu, 15 Sep 2016 11:25:13 -0300 Subject: [PATCH 031/663] added docs on customizing the user management --- README.md | 61 +++++++++++++++++++ src/Auth0/Login/Auth0UserProvider.php | 8 +-- .../Login/Repository/Auth0UserRepository.php | 15 ++--- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 8e65a5fe..93b2d181 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,67 @@ In the `register` method of your `AppServiceProvider` add: You can implement your own cache strategy by creating a new class that implements the `Auth0\SDK\Helpers\Cache\CacheHandler` contract, or just use the cache strategy you want by picking that store with `Cache::store('your_store_name')`; +### Storing users in your database + +You can customize the way you handle the users in your application by creating your own `UserRepository`. This class should implement the `Auth0\Login\Contract\Auth0UserRepository` contract. + +```php +user_id = $jwt->sub; + + return $this->upsertUser($jwt); + } + + public function getUserByUserInfo($userInfo) { + return $this->upsertUser($userInfo['profile']); + } + + protected function upsertUser($profile) { + + $user = User::where("auth0id", $profile->user_id)->first(); + + if ($user === null) { + // If not, create one + $user = new User(); + $user->email = $profile->email; // you should ask for the email scope + $user->auth0id = $profile->user_id; + $user->name = $profile->name; // you should ask for the name scope + $user->save(); + } + + return $user; + } + + public function getUserByIdentifier($identifier) { + //Get the user info of the user logged in (probably in session) + $user = \App::make('auth0')->getUser(); + + if ($user===null) return null; + + // build the user + $user = $this->getUserByUserInfo($user); + + // it is not the same user as logged in, it is not valid + if ($user && $user->auth0id == $identifier) { + return $auth0User; + } + } + +} +``` + ###Laravel 5.2 ####Routes diff --git a/src/Auth0/Login/Auth0UserProvider.php b/src/Auth0/Login/Auth0UserProvider.php index 5e3b77d2..b60b9318 100644 --- a/src/Auth0/Login/Auth0UserProvider.php +++ b/src/Auth0/Login/Auth0UserProvider.php @@ -28,9 +28,7 @@ public function __construct(Auth0UserRepository $userRepository, Auth0Service $a * @return Authenticatable */ public function retrieveByID($identifier) { - dd('retrieveByID',$identifier); return $this->userRepository->getUserByIdentifier($identifier); - } public function retrieveByCredentials(array $credentials) { @@ -57,7 +55,6 @@ public function retrieveByCredentials(array $credentials) { * Required method by the UserProviderInterface, we don't implement it */ public function retrieveByToken($identifier, $token) { - dd('retrieveByToken',$identifier, $token); return false; } @@ -65,14 +62,13 @@ public function retrieveByToken($identifier, $token) { * Required method by the UserProviderInterface, we don't implement it */ public function updateRememberToken(Authenticatable $user, $token) { - dd('updateRememberToken',$user, $token); + } /** * Required method by the UserProviderInterface, we don't implement it */ public function validateCredentials(Authenticatable $user, array $credentials) { - dd('validateCredentials',$user, $credentials); return false; - } + } } diff --git a/src/Auth0/Login/Repository/Auth0UserRepository.php b/src/Auth0/Login/Repository/Auth0UserRepository.php index e6359644..a0cef87d 100644 --- a/src/Auth0/Login/Repository/Auth0UserRepository.php +++ b/src/Auth0/Login/Repository/Auth0UserRepository.php @@ -1,15 +1,12 @@ - Date: Thu, 15 Sep 2016 12:53:18 -0300 Subject: [PATCH 032/663] added toString method to users --- src/Auth0/Login/Auth0JWTUser.php | 4 ++++ src/Auth0/Login/Auth0Service.php | 1 + src/Auth0/Login/Auth0User.php | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/src/Auth0/Login/Auth0JWTUser.php b/src/Auth0/Login/Auth0JWTUser.php index 7f0e041a..8c12ca5c 100644 --- a/src/Auth0/Login/Auth0JWTUser.php +++ b/src/Auth0/Login/Auth0JWTUser.php @@ -70,4 +70,8 @@ public function getUserInfo() { return $this->userInfo; } + public function __toString() { + return json_encode($this->userInfo); + } + } diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 63eef3c3..ba759382 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -105,6 +105,7 @@ public function decodeJWT($encUser) ]); $this->apiuser = $verifier->verifyAndDecode($encUser); + return $this->apiuser; } diff --git a/src/Auth0/Login/Auth0User.php b/src/Auth0/Login/Auth0User.php index 8743cb98..e004b190 100644 --- a/src/Auth0/Login/Auth0User.php +++ b/src/Auth0/Login/Auth0User.php @@ -70,4 +70,8 @@ public function getUserInfo() { return $this->userInfo; } + public function __toString() { + return json_encode($this->userInfo); + } + } From 564b928c5f84e7d2071cc5dc5273e7fe7dc9584b Mon Sep 17 00:00:00 2001 From: German Lena Date: Thu, 15 Sep 2016 13:21:09 -0300 Subject: [PATCH 033/663] removed commented line --- src/Auth0/Login/LoginServiceProvider.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index c3730eac..6ddd31ab 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -24,8 +24,6 @@ public function boot() { \Auth::provider('auth0', function($app, array $config) { - // $userRepository = \App::make(\Auth0\Login\Contract\Auth0UserRepository::class); - // return new Auth0UserProvider($userRepository); return $app->make(Auth0UserProvider::class); }); From 64ec57a03cf726e93e44aa5e9469a63ff0ce0b4f Mon Sep 17 00:00:00 2001 From: German Lena Date: Mon, 19 Sep 2016 09:34:24 -0300 Subject: [PATCH 034/663] fix error becuase of contract and class with the same name --- src/Auth0/Login/Repository/Auth0UserRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Auth0/Login/Repository/Auth0UserRepository.php b/src/Auth0/Login/Repository/Auth0UserRepository.php index a0cef87d..029f3e3d 100644 --- a/src/Auth0/Login/Repository/Auth0UserRepository.php +++ b/src/Auth0/Login/Repository/Auth0UserRepository.php @@ -4,9 +4,9 @@ use Auth0\Login\Auth0User; use Auth0\Login\Auth0JWTUser; -use Auth0\Login\Contract\Auth0UserRepository; +use Auth0\Login\Contract\Auth0UserRepository as Auth0UserRepositoryContract; -class Auth0UserRepository implements Auth0UserRepository { +class Auth0UserRepository implements Auth0UserRepositoryContract { public function getUserByDecodedJWT($jwt) { return new Auth0JWTUser($jwt); From 40beb0b91bb800c09f66c78ac5a5283c369665f7 Mon Sep 17 00:00:00 2001 From: Adam Engebretson Date: Mon, 26 Sep 2016 02:58:14 -0500 Subject: [PATCH 035/663] Fixing JWTVerifier --- src/Auth0/Login/Auth0Service.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index ba759382..66e6d84c 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -100,7 +100,7 @@ public function decodeJWT($encUser) $verifier = new JWTVerifier([ 'valid_audiences' => [config('laravel-auth0.client_id'), config('laravel-auth0.api_identifier')], 'client_secret' => config('laravel-auth0.client_secret'), - 'authorized_issuers' => config('laravel-auth0.authorized_issuers'), + 'authorized_iss' => config('laravel-auth0.authorized_issuers'), 'cache' => $cache, ]); From a543efd68e446bf9043ffff38dd837cb5a0b75ed Mon Sep 17 00:00:00 2001 From: Adam Engebretson Date: Mon, 26 Sep 2016 03:00:32 -0500 Subject: [PATCH 036/663] Fixing config type When set, you get "array to string conversion" [here](https://github.com/auth0/laravel-auth0/blob/master/src/Auth0/Login/Auth0Service.php#L101) --- src/config/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/config.php b/src/config/config.php index 21d502a1..456213b0 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -72,6 +72,6 @@ | This is used to verify the decoded tokens when using RS256 | */ - // 'api_identifier' => [ ], + // 'api_identifier' => '', ); From 22af6b90eda27ed3482401d55282535d89b09fb4 Mon Sep 17 00:00:00 2001 From: Sean Mangar Date: Mon, 31 Oct 2016 11:43:06 +0400 Subject: [PATCH 037/663] Code style & docblocks Fix code style to PSR-2 & add missing docblocks --- src/Auth0/Login/Auth0JWTUser.php | 74 ++++++++++----- src/Auth0/Login/Auth0Service.php | 89 ++++++++++++------- src/Auth0/Login/Auth0User.php | 73 ++++++++++----- src/Auth0/Login/Auth0UserProvider.php | 59 +++++++----- .../Login/Contract/Auth0UserRepository.php | 12 ++- src/Auth0/Login/LaravelCacheWrapper.php | 59 +++++++----- src/Auth0/Login/LaravelSessionStore.php | 36 +++++--- src/Auth0/Login/LoginServiceProvider.php | 36 ++++---- .../Login/Middleware/Auth0JWTMiddleware.php | 64 ++++++++----- .../Middleware/Auth0OptionalJWTMiddleware.php | 17 ++-- .../Login/Middleware/ForceAuthMiddleware.php | 19 ++-- .../Login/Repository/Auth0UserRepository.php | 41 ++++++--- src/config/config.php | 3 +- src/controllers/Auth0Controller.php | 27 ++++-- src/facade/Auth0.php | 15 ++-- 15 files changed, 411 insertions(+), 213 deletions(-) diff --git a/src/Auth0/Login/Auth0JWTUser.php b/src/Auth0/Login/Auth0JWTUser.php index 8c12ca5c..8dc09178 100644 --- a/src/Auth0/Login/Auth0JWTUser.php +++ b/src/Auth0/Login/Auth0JWTUser.php @@ -1,33 +1,42 @@ -userInfo = get_object_vars($userInfo); } - + /** * Get the unique identifier for the user. * * @return mixed */ - public function getAuthIdentifierName() { + public function getAuthIdentifierName() + { return $this->userInfo['sub']; } - + /** * Get the unique identifier for the user. * * @return mixed */ - public function getAuthIdentifier() { + public function getAuthIdentifier() + { return $this->userInfo['sub']; } @@ -36,42 +45,59 @@ public function getAuthIdentifier() { * * @return string */ - public function getAuthPassword() { - return null; + public function getAuthPassword() + { + return; } - public function getRememberToken() { - return null; + /** + */ + public function getRememberToken() + { + return; } - public function setRememberToken($value) { - + /** + * @param $value + */ + public function setRememberToken($value) + { } - public function getRememberTokenName() { - return null; + /** + */ + public function getRememberTokenName() + { + return; } /** - * Add a generic getter to get all the properties of the userInfo + * Add a generic getter to get all the properties of the userInfo. * * @return the related value or null if it is not set */ - public function __get($name) { - + public function __get($name) + { if (!array_key_exists($name, $this->userInfo)) { - return null; + return; } return $this->userInfo[$name]; } - public function getUserInfo() { + /** + * @return array + */ + public function getUserInfo() + { return $this->userInfo; } - public function __toString() { + /** + * @return string + */ + public function __toString() + { return json_encode($this->userInfo); } - } diff --git a/src/Auth0/Login/Auth0Service.php b/src/Auth0/Login/Auth0Service.php index 66e6d84c..cd2decc9 100644 --- a/src/Auth0/Login/Auth0Service.php +++ b/src/Auth0/Login/Auth0Service.php @@ -1,4 +1,6 @@ -auth0)) - { + if (is_null($this->auth0)) { $auth0Config = config('laravel-auth0'); $auth0Config['store'] = new LaravelSessionStore(); @@ -28,72 +33,93 @@ private function getSDK() $this->auth0 = $auth0->get_oauth_client($auth0Config['client_secret'], $auth0Config['redirect_uri']); } - return $this->auth0; + return $this->auth0; } + /** * Logs the user out from the SDK. */ - public function logout() { + public function logout() + { $this->getSDK()->logout(); } /** - * If the user is logged in, returns the user information - * + * If the user is logged in, returns the user information. + * * @return array with the User info as described in https://docs.auth0.com/user-profile and the user access token */ - public function getUser() { + public function getUser() + { // Get the user info from auth0 $auth0 = $this->getSDK(); $user = $auth0->getUser(); - if ($user === null) return null; + if ($user === null) { + return; + } return [ 'profile' => $user, - 'accessToken' => $auth0->getAccessToken() + 'accessToken' => $auth0->getAccessToken(), ]; } - private $_onLoginCb = null; /** - * Sets a callback to be called when the user is logged in - * @param callback $cb A function that receives an auth0User and receives a Laravel user + * Sets a callback to be called when the user is logged in. + * + * @param callback $cb A function that receives an auth0User and receives a Laravel user */ - public function onLogin($cb) { + public function onLogin($cb) + { $this->_onLoginCb = $cb; } - public function hasOnLogin () { + /** + * @return bool + */ + public function hasOnLogin() + { return $this->_onLoginCb !== null; } - public function callOnLogin($auth0User) { + /** + * @param $auth0User + * + * @return mixed + */ + public function callOnLogin($auth0User) + { return call_user_func($this->_onLoginCb, $auth0User); } - - private $rememberUser = false; + /** - * Use this to either enable or disable the "remember" function for users + * Use this to either enable or disable the "remember" function for users. * * @param null $value + * * @return bool|null */ - public function rememberUser($value = null) { - if($value !== null){ + public function rememberUser($value = null) + { + if ($value !== null) { $this->rememberUser = $value; } return $this->rememberUser; } - private $apiuser; - public function decodeJWT($encUser) + /** + * @param $encUser + * + * @return mixed + */ + public function decodeJWT($encUser) { try { $cache = \App::make('\Auth0\SDK\Helpers\Cache\CacheHandler'); - } catch(BindingResolutionException $e) { + } catch (BindingResolutionException $e) { $cache = null; } @@ -105,12 +131,15 @@ public function decodeJWT($encUser) ]); $this->apiuser = $verifier->verifyAndDecode($encUser); - + return $this->apiuser; } - - public function jwtuser() { + /** + * @return mixed + */ + public function jwtuser() + { return $this->apiuser; } } diff --git a/src/Auth0/Login/Auth0User.php b/src/Auth0/Login/Auth0User.php index e004b190..cd827f0e 100644 --- a/src/Auth0/Login/Auth0User.php +++ b/src/Auth0/Login/Auth0User.php @@ -1,25 +1,36 @@ -userInfo = $userInfo; $this->accessToken = $accessToken; } + /** * Get the unique identifier for the user. * * @return mixed */ - public function getAuthIdentifier() { - return $this->userInfo["user_id"]; + public function getAuthIdentifier() + { + return $this->userInfo['user_id']; } /** @@ -27,7 +38,8 @@ public function getAuthIdentifier() { * * @return string */ - public function getAuthIdentifierName() { + public function getAuthIdentifierName() + { return 'id'; } @@ -36,42 +48,59 @@ public function getAuthIdentifierName() { * * @return string */ - public function getAuthPassword() { + public function getAuthPassword() + { return $this->accessToken; } - public function getRememberToken() { - return null; + /** + */ + public function getRememberToken() + { + return; } - public function setRememberToken($value) { - + /** + * @param $value + */ + public function setRememberToken($value) + { } - public function getRememberTokenName() { - return null; + /** + */ + public function getRememberTokenName() + { + return; } /** - * Add a generic getter to get all the properties of the userInfo + * Add a generic getter to get all the properties of the userInfo. * * @return the related value or null if it is not set */ - public function __get($name) { - + public function __get($name) + { if (!array_key_exists($name, $this->userInfo)) { - return null; + return; } return $this->userInfo[$name]; } - public function getUserInfo() { + /** + * @return mixed + */ + public function getUserInfo() + { return $this->userInfo; } - public function __toString() { + /** + * @return string + */ + public function __toString() + { return json_encode($this->userInfo); } - } diff --git a/src/Auth0/Login/Auth0UserProvider.php b/src/Auth0/Login/Auth0UserProvider.php index b60b9318..30fdf91b 100644 --- a/src/Auth0/Login/Auth0UserProvider.php +++ b/src/Auth0/Login/Auth0UserProvider.php @@ -1,12 +1,13 @@ -userRepository = $userRepository; $this->auth0 = $auth0; } /** * Lets make the repository take care of returning the user related to the - * identifier + * identifier. + * * @param mixed $identifier + * * @return Authenticatable */ - public function retrieveByID($identifier) { + public function retrieveByID($identifier) + { return $this->userRepository->getUserByIdentifier($identifier); } - public function retrieveByCredentials(array $credentials) { + /** + * @param array $credentials + * + * @return bool|Authenticatable + */ + public function retrieveByCredentials(array $credentials) + { if (!isset($credentials['api_token'])) { return false; } @@ -39,36 +56,36 @@ public function retrieveByCredentials(array $credentials) { $encUser = $credentials['api_token']; try { - $decodedJWT = $this->auth0->decodeJWT($encUser); - } - catch(CoreException $e) { - return \Response::make("Unauthorized user", 401); - } - catch(InvalidTokenException $e) { - return \Response::make("Unauthorized user", 401); + $decodedJWT = $this->auth0->decodeJWT($encUser); + } catch (CoreException $e) { + return \Response::make('Unauthorized user', 401); + } catch (InvalidTokenException $e) { + return \Response::make('Unauthorized user', 401); } return $this->userRepository->getUserByDecodedJWT($decodedJWT); } /** - * Required method by the UserProviderInterface, we don't implement it + * Required method by the UserProviderInterface, we don't implement it. */ - public function retrieveByToken($identifier, $token) { + public function retrieveByToken($identifier, $token) + { return false; } /** - * Required method by the UserProviderInterface, we don't implement it + * Required method by the UserProviderInterface, we don't implement it. */ - public function updateRememberToken(Authenticatable $user, $token) { - + public function updateRememberToken(Authenticatable $user, $token) + { } /** - * Required method by the UserProviderInterface, we don't implement it + * Required method by the UserProviderInterface, we don't implement it. */ - public function validateCredentials(Authenticatable $user, array $credentials) { + public function validateCredentials(Authenticatable $user, array $credentials) + { return false; } } diff --git a/src/Auth0/Login/Contract/Auth0UserRepository.php b/src/Auth0/Login/Contract/Auth0UserRepository.php index 312620ff..a87fbc14 100644 --- a/src/Auth0/Login/Contract/Auth0UserRepository.php +++ b/src/Auth0/Login/Contract/Auth0UserRepository.php @@ -1,23 +1,27 @@ -cache = $laravelCache; - } + /** + * LaravelCacheWrapper constructor. + * + * @param Repository $laravelCache + */ + public function __construct(Repository $laravelCache) + { + $this->cache = $laravelCache; + } - public function get($key) - { - return $this->cache->get($key); - } + /** + * @param $key + * + * @return mixed + */ + public function get($key) + { + return $this->cache->get($key); + } - public function delete($key) - { - $this->cache->forget($key); - } - - public function set($key, $value) - { - $this->cache->forever($key, $value); - } -} \ No newline at end of file + /** + * @param $key + */ + public function delete($key) + { + $this->cache->forget($key); + } + + /** + * @param $key + * @param $value + */ + public function set($key, $value) + { + $this->cache->forever($key, $value); + } +} diff --git a/src/Auth0/Login/LaravelSessionStore.php b/src/Auth0/Login/LaravelSessionStore.php index 51ac2ae9..dd0b944a 100644 --- a/src/Auth0/Login/LaravelSessionStore.php +++ b/src/Auth0/Login/LaravelSessionStore.php @@ -1,24 +1,35 @@ -getSessionKeyName($key); Session::put($key_name, $value); } - public function get($key, $default=null) { + /** + * @param $key + * @param null $default + * + * @return mixed + */ + public function get($key, $default = null) + { $key_name = $this->getSessionKeyName($key); return Session::get($key_name, $default); @@ -29,9 +40,10 @@ public function get($key, $default=null) { * * @see Auth0SDK\BaseAuth0 * - * @param string $key + * @param string $key */ - public function delete($key) { + public function delete($key) + { $key_name = $this->getSessionKeyName($key); Session::forget($key_name); @@ -44,8 +56,8 @@ public function delete($key) { * * @return string */ - public function getSessionKeyName($key) { - return self::BASE_NAME . '_' . $key; + public function getSessionKeyName($key) + { + return self::BASE_NAME.'_'.$key; } - -} \ No newline at end of file +} diff --git a/src/Auth0/Login/LoginServiceProvider.php b/src/Auth0/Login/LoginServiceProvider.php index 6ddd31ab..75647160 100644 --- a/src/Auth0/Login/LoginServiceProvider.php +++ b/src/Auth0/Login/LoginServiceProvider.php @@ -1,12 +1,14 @@ -make(Auth0UserProvider::class); }); @@ -37,38 +36,34 @@ public function boot() if ($oldInfoHeaders) { $infoHeaders = InformationHeaders::Extend($oldInfoHeaders); - + $infoHeaders->setEnvironment('Laravel', $laravel::VERSION); $infoHeaders->setPackage('laravel-auth0', self::SDK_VERSION); ApiClient::setInfoHeadersData($infoHeaders); } - } /** * Register the service provider. - * - * @return void */ public function register() { // Bind the auth0 name to a singleton instance of the Auth0 Service - $this->app->singleton("auth0", function() { + $this->app->singleton('auth0', function () { return new Auth0Service(); }); // When Laravel logs out, logout the auth0 SDK trough the service - \Event::listen('auth.logout', function() { - \App::make("auth0")->logout(); + \Event::listen('auth.logout', function () { + \App::make('auth0')->logout(); }); - \Event::listen('user.logout', function() { - \App::make("auth0")->logout(); + \Event::listen('user.logout', function () { + \App::make('auth0')->logout(); }); - \Event::listen('Illuminate\Auth\Events\Logout', function() { - \App::make("auth0")->logout(); + \Event::listen('Illuminate\Auth\Events\Logout', function () { + \App::make('auth0')->logout(); }); - } /** @@ -80,5 +75,4 @@ public function provides() { return array(); } - } diff --git a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php index 76a84e4b..c49f5bbb 100644 --- a/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0JWTMiddleware.php @@ -1,53 +1,78 @@ -userRepository = $userRepository; } - protected function getToken($request) { + /** + * @param $request + * + * @return string + */ + protected function getToken($request) + { // Get the encrypted user JWT - $authorizationHeader = $request->header("Authorization"); + $authorizationHeader = $request->header('Authorization'); + return trim(str_replace('Bearer ', '', $authorizationHeader)); } - protected function validateToken($token) { - return ($token !== ''); + /** + * @param $token + * + * @return bool + */ + protected function validateToken($token) + { + return $token !== ''; } + /** + * @param $request + * @param \Closure $next + * + * @return mixed + */ public function handle($request, \Closure $next) { $auth0 = \App::make('auth0'); $token = $this->getToken($request); - - if ( ! $this->validateToken($token)) { - return \Response::make("Unauthorized user", 401); + + if (!$this->validateToken($token)) { + return \Response::make('Unauthorized user', 401); } if ($token) { try { $jwtUser = $auth0->decodeJWT($token); - } - catch(CoreException $e) { - return \Response::make("Unauthorized user", 401); - } - catch(InvalidTokenException $e) { - return \Response::make("Unauthorized user", 401); + } catch (CoreException $e) { + return \Response::make('Unauthorized user', 401); + } catch (InvalidTokenException $e) { + return \Response::make('Unauthorized user', 401); } // if it does not represent a valid user, return a HTTP 401 $user = $this->userRepository->getUserByDecodedJWT($jwtUser); if (!$user) { - return \Response::make("Unauthorized user", 401); + return \Response::make('Unauthorized user', 401); } // lets log the user in so it is accessible @@ -57,5 +82,4 @@ public function handle($request, \Closure $next) // continue the execution return $next($request); } - -} \ No newline at end of file +} diff --git a/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware.php b/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware.php index f2bb76f3..563bcb1b 100644 --- a/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware.php +++ b/src/Auth0/Login/Middleware/Auth0OptionalJWTMiddleware.php @@ -1,9 +1,16 @@ -getUser(); - if ($user===null) return null; + if ($user === null) { + return; + } - // build the user + // Build the user $auth0User = $this->getUserByUserInfo($user); - // it is not the same user as logged in, it is not valid + // It is not the same user as logged in, it is not valid if ($auth0User && $auth0User->getAuthIdentifier() == $identifier) { return $auth0User; } } - } diff --git a/src/config/config.php b/src/config/config.php index 456213b0..66866cc6 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -30,7 +30,6 @@ */ // 'client_secret' => 'XXXXX', - /* |-------------------------------------------------------------------------- | The redirect URI @@ -64,7 +63,7 @@ | */ // 'authorized_issuers' => [ 'https://xxxx.auth0.com/' ], - + /* |-------------------------------------------------------------------------- | The authorized token issuers diff --git a/src/controllers/Auth0Controller.php b/src/controllers/Auth0Controller.php index 92675442..51d2bf59 100644 --- a/src/controllers/Auth0Controller.php +++ b/src/controllers/Auth0Controller.php @@ -1,23 +1,32 @@ -userRepository = $userRepository; } /** - * Callback action that should be called by auth0, logs the user in + * Callback action that should be called by auth0, logs the user in. */ - public function callback() { + public function callback() + { // Get a handle of the Auth0 service (we don't know if it has an alias) $service = \App::make('auth0'); @@ -39,7 +48,7 @@ public function callback() { } \Auth::login($user, $service->rememberUser()); } - return \Redirect::intended('/'); - } + return \Redirect::intended('/'); + } } diff --git a/src/facade/Auth0.php b/src/facade/Auth0.php index 6f9a1d28..8b28e0e3 100644 --- a/src/facade/Auth0.php +++ b/src/facade/Auth0.php @@ -1,11 +1,16 @@ - Date: Mon, 31 Oct 2016 11:56:22 +0400 Subject: [PATCH 038/663] Correct typos in readme Correct minor typos in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93b2d181..6ced2b8e 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,14 @@ This plugin helps you integrate your Laravel WebApp with [Auth0](https://auth0.c ## Installation -Check our docs page to get a complete guide on how to install it in an existing project or download a pre configured seedproject: +Check our docs page to get a complete guide on how to install it in an existing project or download a pre-configured seed project: * Regular webapp: https://auth0.com/docs/quickstart/webapp/laravel/ * Web API: https://auth0.com/docs/quickstart/backend/php-laravel/ > If you find something wrong in our docs, PR are welcome in our docs repo: https://github.com/auth0/docs -### Setting up a JWKs cache +### Setting up a JWTs cache In the `register` method of your `AppServiceProvider` add: From 6e2b6d60450a41b618565a31b46310f0390124b2 Mon Sep 17 00:00:00 2001 From: German Lena Date: Fri, 25 Nov 2016 15:01:26 -0300 Subject: [PATCH 039/663] added flag for not encoded tokens + removed example --- examples/.DS_Store | Bin 6148 -> 0 bytes examples/laravel-api/.gitattributes | 1 - examples/laravel-api/.gitignore | 7 - examples/laravel-api/.htaccess | 2 - examples/laravel-api/app/Commands/Command.php | 7 - .../app/Console/Commands/Inspire.php | 32 - examples/laravel-api/app/Console/Kernel.php | 29 - examples/laravel-api/app/Events/Event.php | 7 - .../laravel-api/app/Exceptions/Handler.php | 42 - .../app/Handlers/Commands/.gitkeep | 0 .../laravel-api/app/Handlers/Events/.gitkeep | 0 .../Http/Controllers/Auth/AuthController.php | 38 - .../Controllers/Auth/PasswordController.php | 38 - .../app/Http/Controllers/Controller.php | 11 - .../app/Http/Controllers/HomeController.php | 36 - .../Http/Controllers/WelcomeController.php | 60 -- examples/laravel-api/app/Http/Kernel.php | 33 - .../app/Http/Middleware/Authenticate.php | 50 - .../Middleware/RedirectIfAuthenticated.php | 44 - .../app/Http/Middleware/VerifyCsrfToken.php | 20 - .../laravel-api/app/Http/Requests/Request.php | 9 - examples/laravel-api/app/Http/routes.php | 22 - .../app/Providers/AppServiceProvider.php | 38 - .../app/Providers/BusServiceProvider.php | 34 - .../app/Providers/ConfigServiceProvider.php | 23 - .../app/Providers/EventServiceProvider.php | 32 - .../app/Providers/RouteServiceProvider.php | 44 - .../laravel-api/app/Services/Registrar.php | 39 - examples/laravel-api/app/User.php | 34 - examples/laravel-api/artisan | 51 -- examples/laravel-api/bootstrap/app.php | 55 -- examples/laravel-api/bootstrap/autoload.php | 37 - examples/laravel-api/composer.json | 45 - examples/laravel-api/config/app.php | 202 ----- examples/laravel-api/config/auth.php | 67 -- examples/laravel-api/config/cache.php | 79 -- examples/laravel-api/config/compile.php | 41 - examples/laravel-api/config/database.php | 125 --- examples/laravel-api/config/filesystems.php | 71 -- examples/laravel-api/config/laravel-auth0.php | 47 - examples/laravel-api/config/mail.php | 124 --- examples/laravel-api/config/queue.php | 92 -- examples/laravel-api/config/services.php | 38 - examples/laravel-api/config/session.php | 153 ---- examples/laravel-api/config/view.php | 33 - examples/laravel-api/database/.gitignore | 1 - .../laravel-api/database/migrations/.gitkeep | 0 .../2014_10_12_000000_create_users_table.php | 36 - ...12_100000_create_password_resets_table.php | 33 - examples/laravel-api/database/seeds/.gitkeep | 0 .../database/seeds/DatabaseSeeder.php | 20 - examples/laravel-api/gulpfile.js | 16 - examples/laravel-api/package.json | 7 - examples/laravel-api/phpspec.yml | 5 - examples/laravel-api/phpunit.xml | 23 - examples/laravel-api/public/.htaccess | 15 - .../app/home/auth0_logo_final_blue_RGB.png | Bin 17757 -> 0 bytes examples/laravel-api/public/app/home/home.css | 92 -- .../laravel-api/public/app/home/home.html | 6 - examples/laravel-api/public/app/home/home.js | 27 - .../laravel-api/public/app/login/login.css | 3 - .../laravel-api/public/app/login/login.html | 8 - .../laravel-api/public/app/login/login.js | 16 - examples/laravel-api/public/css/app.css | 0 examples/laravel-api/public/favicon.ico | 0 .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 ------ .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes examples/laravel-api/public/index.php | 57 -- examples/laravel-api/public/js/app.js | 63 -- .../laravel-api/public/js/auth0-variables.js | 3 - examples/laravel-api/public/robots.txt | 2 - examples/laravel-api/readme.md | 23 - .../resources/assets/less/app.less | 8 - .../assets/less/bootstrap/alerts.less | 68 -- .../assets/less/bootstrap/badges.less | 61 -- .../assets/less/bootstrap/bootstrap.less | 50 - .../assets/less/bootstrap/breadcrumbs.less | 26 - .../assets/less/bootstrap/button-groups.less | 243 ----- .../assets/less/bootstrap/buttons.less | 160 ---- .../assets/less/bootstrap/carousel.less | 267 ------ .../assets/less/bootstrap/close.less | 33 - .../resources/assets/less/bootstrap/code.less | 69 -- .../less/bootstrap/component-animations.less | 34 - .../assets/less/bootstrap/dropdowns.less | 213 ----- .../assets/less/bootstrap/forms.less | 546 ----------- .../assets/less/bootstrap/glyphicons.less | 234 ----- .../resources/assets/less/bootstrap/grid.less | 84 -- .../assets/less/bootstrap/input-groups.less | 166 ---- .../assets/less/bootstrap/jumbotron.less | 49 - .../assets/less/bootstrap/labels.less | 64 -- .../assets/less/bootstrap/list-group.less | 124 --- .../assets/less/bootstrap/media.less | 47 - .../assets/less/bootstrap/mixins.less | 39 - .../assets/less/bootstrap/mixins/alerts.less | 14 - .../bootstrap/mixins/background-variant.less | 8 - .../less/bootstrap/mixins/border-radius.less | 18 - .../assets/less/bootstrap/mixins/buttons.less | 52 -- .../less/bootstrap/mixins/center-block.less | 7 - .../less/bootstrap/mixins/clearfix.less | 22 - .../assets/less/bootstrap/mixins/forms.less | 85 -- .../less/bootstrap/mixins/gradients.less | 59 -- .../less/bootstrap/mixins/grid-framework.less | 91 -- .../assets/less/bootstrap/mixins/grid.less | 122 --- .../less/bootstrap/mixins/hide-text.less | 21 - .../assets/less/bootstrap/mixins/image.less | 33 - .../assets/less/bootstrap/mixins/labels.less | 12 - .../less/bootstrap/mixins/list-group.less | 29 - .../less/bootstrap/mixins/nav-divider.less | 10 - .../bootstrap/mixins/nav-vertical-align.less | 9 - .../assets/less/bootstrap/mixins/opacity.less | 8 - .../less/bootstrap/mixins/pagination.less | 23 - .../assets/less/bootstrap/mixins/panels.less | 24 - .../less/bootstrap/mixins/progress-bar.less | 10 - .../less/bootstrap/mixins/reset-filter.less | 8 - .../assets/less/bootstrap/mixins/resize.less | 6 - .../mixins/responsive-visibility.less | 15 - .../assets/less/bootstrap/mixins/size.less | 10 - .../less/bootstrap/mixins/tab-focus.less | 9 - .../less/bootstrap/mixins/table-row.less | 28 - .../less/bootstrap/mixins/text-emphasis.less | 8 - .../less/bootstrap/mixins/text-overflow.less | 8 - .../bootstrap/mixins/vendor-prefixes.less | 227 ----- .../assets/less/bootstrap/modals.less | 148 --- .../assets/less/bootstrap/navbar.less | 660 -------------- .../resources/assets/less/bootstrap/navs.less | 244 ----- .../assets/less/bootstrap/normalize.less | 427 --------- .../assets/less/bootstrap/pager.less | 54 -- .../assets/less/bootstrap/pagination.less | 88 -- .../assets/less/bootstrap/panels.less | 261 ------ .../assets/less/bootstrap/popovers.less | 135 --- .../assets/less/bootstrap/print.less | 107 --- .../assets/less/bootstrap/progress-bars.less | 87 -- .../less/bootstrap/responsive-embed.less | 35 - .../less/bootstrap/responsive-utilities.less | 194 ---- .../assets/less/bootstrap/scaffolding.less | 150 --- .../assets/less/bootstrap/tables.less | 234 ----- .../assets/less/bootstrap/theme.less | 272 ------ .../assets/less/bootstrap/thumbnails.less | 36 - .../assets/less/bootstrap/tooltip.less | 103 --- .../resources/assets/less/bootstrap/type.less | 302 ------ .../assets/less/bootstrap/utilities.less | 56 -- .../assets/less/bootstrap/variables.less | 856 ------------------ .../assets/less/bootstrap/wells.less | 29 - .../resources/lang/en/pagination.php | 19 - .../resources/lang/en/passwords.php | 22 - .../resources/lang/en/validation.php | 107 --- .../laravel-api/resources/views/app.blade.php | 62 -- .../resources/views/auth/login.blade.php | 61 -- .../resources/views/auth/password.blade.php | 50 - .../resources/views/auth/register.blade.php | 65 -- .../resources/views/auth/reset.blade.php | 59 -- .../resources/views/emails/password.blade.php | 1 - .../resources/views/errors/503.blade.php | 41 - .../resources/views/home.blade.php | 17 - .../resources/views/layouts/master.blade.php | 10 - .../resources/views/welcome.blade.php | 48 - .../resources/views/welcome/index.blade.php | 14 - .../resources/views/welcome/login.blade.php | 24 - .../resources/views/welcome/spa.blade.php | 33 - examples/laravel-api/server.php | 21 - examples/laravel-api/storage/app/.gitignore | 2 - .../laravel-api/storage/framework/.gitignore | 6 - .../storage/framework/cache/.gitignore | 2 - .../storage/framework/sessions/.gitignore | 2 - .../storage/framework/views/.gitignore | 2 - examples/laravel-api/storage/logs/.gitignore | 2 - examples/laravel-api/tests/ExampleTest.php | 17 - examples/laravel-api/tests/TestCase.php | 19 - src/Auth0/Login/Auth0Service.php | 20 +- src/Auth0/Login/LoginServiceProvider.php | 6 +- src/config/config.php | 14 +- 174 files changed, 28 insertions(+), 11493 deletions(-) delete mode 100644 examples/.DS_Store delete mode 100644 examples/laravel-api/.gitattributes delete mode 100644 examples/laravel-api/.gitignore delete mode 100644 examples/laravel-api/.htaccess delete mode 100644 examples/laravel-api/app/Commands/Command.php delete mode 100644 examples/laravel-api/app/Console/Commands/Inspire.php delete mode 100644 examples/laravel-api/app/Console/Kernel.php delete mode 100644 examples/laravel-api/app/Events/Event.php delete mode 100644 examples/laravel-api/app/Exceptions/Handler.php delete mode 100644 examples/laravel-api/app/Handlers/Commands/.gitkeep delete mode 100644 examples/laravel-api/app/Handlers/Events/.gitkeep delete mode 100644 examples/laravel-api/app/Http/Controllers/Auth/AuthController.php delete mode 100644 examples/laravel-api/app/Http/Controllers/Auth/PasswordController.php delete mode 100644 examples/laravel-api/app/Http/Controllers/Controller.php delete mode 100644 examples/laravel-api/app/Http/Controllers/HomeController.php delete mode 100644 examples/laravel-api/app/Http/Controllers/WelcomeController.php delete mode 100644 examples/laravel-api/app/Http/Kernel.php delete mode 100644 examples/laravel-api/app/Http/Middleware/Authenticate.php delete mode 100644 examples/laravel-api/app/Http/Middleware/RedirectIfAuthenticated.php delete mode 100644 examples/laravel-api/app/Http/Middleware/VerifyCsrfToken.php delete mode 100644 examples/laravel-api/app/Http/Requests/Request.php delete mode 100644 examples/laravel-api/app/Http/routes.php delete mode 100644 examples/laravel-api/app/Providers/AppServiceProvider.php delete mode 100644 examples/laravel-api/app/Providers/BusServiceProvider.php delete mode 100644 examples/laravel-api/app/Providers/ConfigServiceProvider.php delete mode 100644 examples/laravel-api/app/Providers/EventServiceProvider.php delete mode 100644 examples/laravel-api/app/Providers/RouteServiceProvider.php delete mode 100644 examples/laravel-api/app/Services/Registrar.php delete mode 100644 examples/laravel-api/app/User.php delete mode 100644 examples/laravel-api/artisan delete mode 100644 examples/laravel-api/bootstrap/app.php delete mode 100644 examples/laravel-api/bootstrap/autoload.php delete mode 100644 examples/laravel-api/composer.json delete mode 100644 examples/laravel-api/config/app.php delete mode 100644 examples/laravel-api/config/auth.php delete mode 100644 examples/laravel-api/config/cache.php delete mode 100644 examples/laravel-api/config/compile.php delete mode 100644 examples/laravel-api/config/database.php delete mode 100644 examples/laravel-api/config/filesystems.php delete mode 100644 examples/laravel-api/config/laravel-auth0.php delete mode 100644 examples/laravel-api/config/mail.php delete mode 100644 examples/laravel-api/config/queue.php delete mode 100644 examples/laravel-api/config/services.php delete mode 100644 examples/laravel-api/config/session.php delete mode 100644 examples/laravel-api/config/view.php delete mode 100644 examples/laravel-api/database/.gitignore delete mode 100644 examples/laravel-api/database/migrations/.gitkeep delete mode 100644 examples/laravel-api/database/migrations/2014_10_12_000000_create_users_table.php delete mode 100644 examples/laravel-api/database/migrations/2014_10_12_100000_create_password_resets_table.php delete mode 100644 examples/laravel-api/database/seeds/.gitkeep delete mode 100644 examples/laravel-api/database/seeds/DatabaseSeeder.php delete mode 100644 examples/laravel-api/gulpfile.js delete mode 100644 examples/laravel-api/package.json delete mode 100644 examples/laravel-api/phpspec.yml delete mode 100644 examples/laravel-api/phpunit.xml delete mode 100644 examples/laravel-api/public/.htaccess delete mode 100644 examples/laravel-api/public/app/home/auth0_logo_final_blue_RGB.png delete mode 100644 examples/laravel-api/public/app/home/home.css delete mode 100644 examples/laravel-api/public/app/home/home.html delete mode 100644 examples/laravel-api/public/app/home/home.js delete mode 100644 examples/laravel-api/public/app/login/login.css delete mode 100644 examples/laravel-api/public/app/login/login.html delete mode 100644 examples/laravel-api/public/app/login/login.js delete mode 100644 examples/laravel-api/public/css/app.css delete mode 100644 examples/laravel-api/public/favicon.ico delete mode 100644 examples/laravel-api/public/fonts/glyphicons-halflings-regular.eot delete mode 100644 examples/laravel-api/public/fonts/glyphicons-halflings-regular.svg delete mode 100644 examples/laravel-api/public/fonts/glyphicons-halflings-regular.ttf delete mode 100644 examples/laravel-api/public/fonts/glyphicons-halflings-regular.woff delete mode 100644 examples/laravel-api/public/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 examples/laravel-api/public/index.php delete mode 100644 examples/laravel-api/public/js/app.js delete mode 100644 examples/laravel-api/public/js/auth0-variables.js delete mode 100644 examples/laravel-api/public/robots.txt delete mode 100644 examples/laravel-api/readme.md delete mode 100644 examples/laravel-api/resources/assets/less/app.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/alerts.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/badges.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/bootstrap.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/breadcrumbs.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/button-groups.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/buttons.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/carousel.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/close.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/code.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/component-animations.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/dropdowns.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/forms.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/glyphicons.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/grid.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/input-groups.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/jumbotron.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/labels.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/list-group.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/media.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/alerts.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/background-variant.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/border-radius.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/buttons.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/center-block.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/clearfix.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/forms.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/gradients.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/grid-framework.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/grid.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/hide-text.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/image.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/labels.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/list-group.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/nav-divider.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/nav-vertical-align.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/opacity.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/pagination.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/panels.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/progress-bar.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/reset-filter.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/resize.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/responsive-visibility.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/size.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/tab-focus.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/table-row.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/text-emphasis.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/text-overflow.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/mixins/vendor-prefixes.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/modals.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/navbar.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/navs.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/normalize.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/pager.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/pagination.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/panels.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/popovers.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/print.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/progress-bars.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/responsive-embed.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/responsive-utilities.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/scaffolding.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/tables.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/theme.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/thumbnails.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/tooltip.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/type.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/utilities.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/variables.less delete mode 100644 examples/laravel-api/resources/assets/less/bootstrap/wells.less delete mode 100644 examples/laravel-api/resources/lang/en/pagination.php delete mode 100644 examples/laravel-api/resources/lang/en/passwords.php delete mode 100644 examples/laravel-api/resources/lang/en/validation.php delete mode 100644 examples/laravel-api/resources/views/app.blade.php delete mode 100644 examples/laravel-api/resources/views/auth/login.blade.php delete mode 100644 examples/laravel-api/resources/views/auth/password.blade.php delete mode 100644 examples/laravel-api/resources/views/auth/register.blade.php delete mode 100644 examples/laravel-api/resources/views/auth/reset.blade.php delete mode 100644 examples/laravel-api/resources/views/emails/password.blade.php delete mode 100644 examples/laravel-api/resources/views/errors/503.blade.php delete mode 100644 examples/laravel-api/resources/views/home.blade.php delete mode 100644 examples/laravel-api/resources/views/layouts/master.blade.php delete mode 100644 examples/laravel-api/resources/views/welcome.blade.php delete mode 100644 examples/laravel-api/resources/views/welcome/index.blade.php delete mode 100644 examples/laravel-api/resources/views/welcome/login.blade.php delete mode 100644 examples/laravel-api/resources/views/welcome/spa.blade.php delete mode 100644 examples/laravel-api/server.php delete mode 100644 examples/laravel-api/storage/app/.gitignore delete mode 100644 examples/laravel-api/storage/framework/.gitignore delete mode 100644 examples/laravel-api/storage/framework/cache/.gitignore delete mode 100644 examples/laravel-api/storage/framework/sessions/.gitignore delete mode 100644 examples/laravel-api/storage/framework/views/.gitignore delete mode 100644 examples/laravel-api/storage/logs/.gitignore delete mode 100644 examples/laravel-api/tests/ExampleTest.php delete mode 100644 examples/laravel-api/tests/TestCase.php diff --git a/examples/.DS_Store b/examples/.DS_Store deleted file mode 100644 index 7c2dd675bb5a8e34585a1dd98f0ec9d099fcd301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&1%~~5T141R<)9TP~vrVYL-Zc@mhU~sSradD(d-~}NWOO7eVpkwJ{ z^e63egybRmCcQZ`yK7_P=GvMvBWAzZ*_mDGTd_X?AR42f24Dk#g-Tc`Veto{cG5K| z7!RRPeOy5Z5gdRAgSBXOY$5|RcNLs74~D4A^CwTEkvbl;iOYOm3(*Xz@%{mHU+_70EUoe!p;zkL1n{rbnxn_Kn$ zAn>18^332I?&by~Gr$Zm0~^YKS--5xhQ1%a7Bj#M{5u9{eQ;0-U4ywswRB)X$46=} z5|W@zheblipldMKh%G2Wry}Z9VXhcLr=#C7ajwB!qfQ5*M#g^3$im!Egc=?FjtU3i zYUGj`Ucomment(PHP_EOL.Inspiring::quote().PHP_EOL); - } - -} diff --git a/examples/laravel-api/app/Console/Kernel.php b/examples/laravel-api/app/Console/Kernel.php deleted file mode 100644 index 0c088c89..00000000 --- a/examples/laravel-api/app/Console/Kernel.php +++ /dev/null @@ -1,29 +0,0 @@ -command('inspire') - ->hourly(); - } - -} diff --git a/examples/laravel-api/app/Events/Event.php b/examples/laravel-api/app/Events/Event.php deleted file mode 100644 index d59f7690..00000000 --- a/examples/laravel-api/app/Events/Event.php +++ /dev/null @@ -1,7 +0,0 @@ -auth = $auth; - $this->registrar = $registrar; - - $this->middleware('guest', ['except' => 'getLogout']); - } - -} diff --git a/examples/laravel-api/app/Http/Controllers/Auth/PasswordController.php b/examples/laravel-api/app/Http/Controllers/Auth/PasswordController.php deleted file mode 100644 index 31061935..00000000 --- a/examples/laravel-api/app/Http/Controllers/Auth/PasswordController.php +++ /dev/null @@ -1,38 +0,0 @@ -auth = $auth; - $this->passwords = $passwords; - - $this->middleware('guest'); - } - -} diff --git a/examples/laravel-api/app/Http/Controllers/Controller.php b/examples/laravel-api/app/Http/Controllers/Controller.php deleted file mode 100644 index 27b3f452..00000000 --- a/examples/laravel-api/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,11 +0,0 @@ -middleware('auth'); - } - - /** - * Show the application dashboard to the user. - * - * @return Response - */ - public function index() - { - return view('home'); - } - -} diff --git a/examples/laravel-api/app/Http/Controllers/WelcomeController.php b/examples/laravel-api/app/Http/Controllers/WelcomeController.php deleted file mode 100644 index 8c111b08..00000000 --- a/examples/laravel-api/app/Http/Controllers/WelcomeController.php +++ /dev/null @@ -1,60 +0,0 @@ -middleware('guest'); - } - - /** - * Show the application welcome screen to the user. - * - * @return Response - */ - public function index() - { - $isLoggedIn = \Auth::check(); - return view('welcome.index')->with('isLoggedIn', $isLoggedIn); - } - - public function login() { - $auth0Config = config('laravel-auth0'); - return view('welcome.login')->with('auth0Config',$auth0Config); - } - - public function spa() { - return view('welcome.spa'); - } - - public function logout() { - \Auth::logout(); - return \Redirect::intended('/'); - } - - public function dump() { - dd(\Auth::user()->getUserInfo()); - } - - public function api() { - return response()->json(['status' => 'pong!']); - } - - -} diff --git a/examples/laravel-api/app/Http/Kernel.php b/examples/laravel-api/app/Http/Kernel.php deleted file mode 100644 index 1266e3d5..00000000 --- a/examples/laravel-api/app/Http/Kernel.php +++ /dev/null @@ -1,33 +0,0 @@ - 'App\Http\Middleware\Authenticate', - 'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', - 'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', - 'auth0.jwt' => 'Auth0\Login\Middleware\Auth0JWTMiddleware', - ]; - -} diff --git a/examples/laravel-api/app/Http/Middleware/Authenticate.php b/examples/laravel-api/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 72a7613a..00000000 --- a/examples/laravel-api/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,50 +0,0 @@ -auth = $auth; - } - - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed - */ - public function handle($request, Closure $next) - { - if ($this->auth->guest()) - { - if ($request->ajax()) - { - return response('Unauthorized.', 401); - } - else - { - return redirect()->guest('auth/login'); - } - } - - return $next($request); - } - -} diff --git a/examples/laravel-api/app/Http/Middleware/RedirectIfAuthenticated.php b/examples/laravel-api/app/Http/Middleware/RedirectIfAuthenticated.php deleted file mode 100644 index dd5a8672..00000000 --- a/examples/laravel-api/app/Http/Middleware/RedirectIfAuthenticated.php +++ /dev/null @@ -1,44 +0,0 @@ -auth = $auth; - } - - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed - */ - public function handle($request, Closure $next) - { - if ($this->auth->check()) - { - return new RedirectResponse(url('http://github.com/home')); - } - - return $next($request); - } - -} diff --git a/examples/laravel-api/app/Http/Middleware/VerifyCsrfToken.php b/examples/laravel-api/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index 750a39b1..00000000 --- a/examples/laravel-api/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,20 +0,0 @@ - 'home', 'uses' => 'WelcomeController@index']); -Route::get('/auth/login', ['as' => 'login', 'uses' => 'WelcomeController@login']); -Route::get('/logout', ['as' => 'logout', 'uses' => 'WelcomeController@logout']); -Route::get('/auth0/callback', ['as' => 'logincallback', 'uses' => '\Auth0\Login\Auth0Controller@callback']); - -Route::get('/dump', ['as' => 'dump', 'uses' => 'WelcomeController@dump', 'middleware' => 'auth']); - -Route::get('/spa', ['as' => 'spa', 'uses' => 'WelcomeController@spa']); -Route::get('/api/ping', ['as' => 'api', 'uses' => 'WelcomeController@api', 'middleware' => 'auth0.jwt']); diff --git a/examples/laravel-api/app/Providers/AppServiceProvider.php b/examples/laravel-api/app/Providers/AppServiceProvider.php deleted file mode 100644 index 576e7708..00000000 --- a/examples/laravel-api/app/Providers/AppServiceProvider.php +++ /dev/null @@ -1,38 +0,0 @@ -app->bind( - 'Illuminate\Contracts\Auth\Registrar', - 'App\Services\Registrar' - ); - - $this->app->bind( - '\Auth0\Login\Contract\Auth0UserRepository', - '\Auth0\Login\Repository\Auth0UserRepository'); - } - -} diff --git a/examples/laravel-api/app/Providers/BusServiceProvider.php b/examples/laravel-api/app/Providers/BusServiceProvider.php deleted file mode 100644 index f0d9be6f..00000000 --- a/examples/laravel-api/app/Providers/BusServiceProvider.php +++ /dev/null @@ -1,34 +0,0 @@ -mapUsing(function($command) - { - return Dispatcher::simpleMapping( - $command, 'App\Commands', 'App\Handlers\Commands' - ); - }); - } - - /** - * Register any application services. - * - * @return void - */ - public function register() - { - // - } - -} diff --git a/examples/laravel-api/app/Providers/ConfigServiceProvider.php b/examples/laravel-api/app/Providers/ConfigServiceProvider.php deleted file mode 100644 index 06e57992..00000000 --- a/examples/laravel-api/app/Providers/ConfigServiceProvider.php +++ /dev/null @@ -1,23 +0,0 @@ - [ - 'EventListener', - ], - ]; - - /** - * Register any other events for your application. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - */ - public function boot(DispatcherContract $events) - { - parent::boot($events); - - // - } - -} diff --git a/examples/laravel-api/app/Providers/RouteServiceProvider.php b/examples/laravel-api/app/Providers/RouteServiceProvider.php deleted file mode 100644 index e533e0e9..00000000 --- a/examples/laravel-api/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,44 +0,0 @@ -group(['namespace' => $this->namespace], function($router) - { - require app_path('Http/routes.php'); - }); - } - -} diff --git a/examples/laravel-api/app/Services/Registrar.php b/examples/laravel-api/app/Services/Registrar.php deleted file mode 100644 index 10354681..00000000 --- a/examples/laravel-api/app/Services/Registrar.php +++ /dev/null @@ -1,39 +0,0 @@ - 'required|max:255', - 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|confirmed|min:6', - ]); - } - - /** - * Create a new user instance after a valid registration. - * - * @param array $data - * @return User - */ - public function create(array $data) - { - return User::create([ - 'name' => $data['name'], - 'email' => $data['email'], - 'password' => bcrypt($data['password']), - ]); - } - -} diff --git a/examples/laravel-api/app/User.php b/examples/laravel-api/app/User.php deleted file mode 100644 index 2dae8479..00000000 --- a/examples/laravel-api/app/User.php +++ /dev/null @@ -1,34 +0,0 @@ -make('Illuminate\Contracts\Console\Kernel'); - -$status = $kernel->handle( - $input = new Symfony\Component\Console\Input\ArgvInput, - new Symfony\Component\Console\Output\ConsoleOutput -); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running. We will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$kernel->terminate($input, $status); - -exit($status); diff --git a/examples/laravel-api/bootstrap/app.php b/examples/laravel-api/bootstrap/app.php deleted file mode 100644 index f50a3f72..00000000 --- a/examples/laravel-api/bootstrap/app.php +++ /dev/null @@ -1,55 +0,0 @@ -singleton( - 'Illuminate\Contracts\Http\Kernel', - 'App\Http\Kernel' -); - -$app->singleton( - 'Illuminate\Contracts\Console\Kernel', - 'App\Console\Kernel' -); - -$app->singleton( - 'Illuminate\Contracts\Debug\ExceptionHandler', - 'App\Exceptions\Handler' -); - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; diff --git a/examples/laravel-api/bootstrap/autoload.php b/examples/laravel-api/bootstrap/autoload.php deleted file mode 100644 index e0d3db1c..00000000 --- a/examples/laravel-api/bootstrap/autoload.php +++ /dev/null @@ -1,37 +0,0 @@ - true, - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => 'http://localhost/', - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => 'UTC', - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ - - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => env('APP_KEY', 'SomeRandomString'), - - 'cipher' => MCRYPT_RIJNDAEL_128, - - /* - |-------------------------------------------------------------------------- - | Logging Configuration - |-------------------------------------------------------------------------- - | - | Here you may configure the log settings for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Settings: "single", "daily", "syslog", "errorlog" - | - */ - - 'log' => 'daily', - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - 'Illuminate\Foundation\Providers\ArtisanServiceProvider', - 'Illuminate\Auth\AuthServiceProvider', - 'Illuminate\Bus\BusServiceProvider', - 'Illuminate\Cache\CacheServiceProvider', - 'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider', - 'Illuminate\Routing\ControllerServiceProvider', - 'Illuminate\Cookie\CookieServiceProvider', - 'Illuminate\Database\DatabaseServiceProvider', - 'Illuminate\Encryption\EncryptionServiceProvider', - 'Illuminate\Filesystem\FilesystemServiceProvider', - 'Illuminate\Foundation\Providers\FoundationServiceProvider', - 'Illuminate\Hashing\HashServiceProvider', - 'Illuminate\Mail\MailServiceProvider', - 'Illuminate\Pagination\PaginationServiceProvider', - 'Illuminate\Pipeline\PipelineServiceProvider', - 'Illuminate\Queue\QueueServiceProvider', - 'Illuminate\Redis\RedisServiceProvider', - 'Illuminate\Auth\Passwords\PasswordResetServiceProvider', - 'Illuminate\Session\SessionServiceProvider', - 'Illuminate\Translation\TranslationServiceProvider', - 'Illuminate\Validation\ValidationServiceProvider', - 'Illuminate\View\ViewServiceProvider', - - /* - * Application Service Providers... - */ - 'App\Providers\AppServiceProvider', - 'App\Providers\BusServiceProvider', - 'App\Providers\ConfigServiceProvider', - 'App\Providers\EventServiceProvider', - 'App\Providers\RouteServiceProvider', - - 'Auth0\Login\LoginServiceProvider', - - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => [ - - 'App' => 'Illuminate\Support\Facades\App', - 'Artisan' => 'Illuminate\Support\Facades\Artisan', - 'Auth' => 'Illuminate\Support\Facades\Auth', - 'Blade' => 'Illuminate\Support\Facades\Blade', - 'Bus' => 'Illuminate\Support\Facades\Bus', - 'Cache' => 'Illuminate\Support\Facades\Cache', - 'Config' => 'Illuminate\Support\Facades\Config', - 'Cookie' => 'Illuminate\Support\Facades\Cookie', - 'Crypt' => 'Illuminate\Support\Facades\Crypt', - 'DB' => 'Illuminate\Support\Facades\DB', - 'Eloquent' => 'Illuminate\Database\Eloquent\Model', - 'Event' => 'Illuminate\Support\Facades\Event', - 'File' => 'Illuminate\Support\Facades\File', - 'Hash' => 'Illuminate\Support\Facades\Hash', - 'Input' => 'Illuminate\Support\Facades\Input', - 'Inspiring' => 'Illuminate\Foundation\Inspiring', - 'Lang' => 'Illuminate\Support\Facades\Lang', - 'Log' => 'Illuminate\Support\Facades\Log', - 'Mail' => 'Illuminate\Support\Facades\Mail', - 'Password' => 'Illuminate\Support\Facades\Password', - 'Queue' => 'Illuminate\Support\Facades\Queue', - 'Redirect' => 'Illuminate\Support\Facades\Redirect', - 'Redis' => 'Illuminate\Support\Facades\Redis', - 'Request' => 'Illuminate\Support\Facades\Request', - 'Response' => 'Illuminate\Support\Facades\Response', - 'Route' => 'Illuminate\Support\Facades\Route', - 'Schema' => 'Illuminate\Support\Facades\Schema', - 'Session' => 'Illuminate\Support\Facades\Session', - 'Storage' => 'Illuminate\Support\Facades\Storage', - 'URL' => 'Illuminate\Support\Facades\URL', - 'Validator' => 'Illuminate\Support\Facades\Validator', - 'View' => 'Illuminate\Support\Facades\View', - - 'Auth0' => 'Auth0\Login\Facade\Auth0' - - ], - -]; diff --git a/examples/laravel-api/config/auth.php b/examples/laravel-api/config/auth.php deleted file mode 100644 index 4031b7e8..00000000 --- a/examples/laravel-api/config/auth.php +++ /dev/null @@ -1,67 +0,0 @@ - 'auth0', - - /* - |-------------------------------------------------------------------------- - | Authentication Model - |-------------------------------------------------------------------------- - | - | When using the "Eloquent" authentication driver, we need to know which - | Eloquent model should be used to retrieve your users. Of course, it - | is often just the "User" model but you may use whatever you like. - | - */ - - 'model' => 'App\User', - - /* - |-------------------------------------------------------------------------- - | Authentication Table - |-------------------------------------------------------------------------- - | - | When using the "Database" authentication driver, we need to know which - | table should be used to retrieve your users. We have chosen a basic - | default value but you may easily change it to any table you like. - | - */ - - 'table' => 'users', - - /* - |-------------------------------------------------------------------------- - | Password Reset Settings - |-------------------------------------------------------------------------- - | - | Here you may set the options for resetting passwords including the view - | that is your password reset e-mail. You can also set the name of the - | table that maintains all of the reset tokens for your application. - | - | The expire time is the number of minutes that the reset token should be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'password' => [ - 'email' => 'emails.password', - 'table' => 'password_resets', - 'expire' => 60, - ], - -]; diff --git a/examples/laravel-api/config/cache.php b/examples/laravel-api/config/cache.php deleted file mode 100644 index 9ddd5f33..00000000 --- a/examples/laravel-api/config/cache.php +++ /dev/null @@ -1,79 +0,0 @@ - env('CACHE_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Cache Stores - |-------------------------------------------------------------------------- - | - | Here you may define all of the cache "stores" for your application as - | well as their drivers. You may even define multiple stores for the - | same cache driver to group types of items stored in your caches. - | - */ - - 'stores' => [ - - 'apc' => [ - 'driver' => 'apc' - ], - - 'array' => [ - 'driver' => 'array' - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'cache', - 'connection' => null, - ], - - 'file' => [ - 'driver' => 'file', - 'path' => storage_path().'/framework/cache', - ], - - 'memcached' => [ - 'driver' => 'memcached', - 'servers' => [ - [ - 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100 - ], - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing a RAM based store such as APC or Memcached, there might - | be other applications utilizing the same cache. So, we'll specify a - | value to get prefixed to all our keys so we can avoid collisions. - | - */ - - 'prefix' => 'laravel', - -]; diff --git a/examples/laravel-api/config/compile.php b/examples/laravel-api/config/compile.php deleted file mode 100644 index 3a002fca..00000000 --- a/examples/laravel-api/config/compile.php +++ /dev/null @@ -1,41 +0,0 @@ - [ - - realpath(__DIR__.'/../app/Providers/AppServiceProvider.php'), - realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'), - realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'), - realpath(__DIR__.'/../app/Providers/EventServiceProvider.php'), - realpath(__DIR__.'/../app/Providers/RouteServiceProvider.php'), - - ], - - /* - |-------------------------------------------------------------------------- - | Compiled File Providers - |-------------------------------------------------------------------------- - | - | Here you may list service providers which define a "compiles" function - | that returns additional files that should be compiled, providing an - | easy way to get common files from any packages you are utilizing. - | - */ - - 'providers' => [ - // - ], - -]; diff --git a/examples/laravel-api/config/database.php b/examples/laravel-api/config/database.php deleted file mode 100644 index 54c6db0f..00000000 --- a/examples/laravel-api/config/database.php +++ /dev/null @@ -1,125 +0,0 @@ - PDO::FETCH_CLASS, - - /* - |-------------------------------------------------------------------------- - | Default Database Connection Name - |-------------------------------------------------------------------------- - | - | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. - | - */ - - 'default' => 'mysql', - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'database' => storage_path().'/database.sqlite', - 'prefix' => '', - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'host' => env('DB_HOST', 'localhost'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', - 'strict' => false, - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'host' => env('DB_HOST', 'localhost'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'schema' => 'public', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'host' => env('DB_HOST', 'localhost'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'prefix' => '', - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer set of commands than a typical key-value systems - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'cluster' => false, - - 'default' => [ - 'host' => '127.0.0.1', - 'port' => 6379, - 'database' => 0, - ], - - ], - -]; diff --git a/examples/laravel-api/config/filesystems.php b/examples/laravel-api/config/filesystems.php deleted file mode 100644 index 0221fa70..00000000 --- a/examples/laravel-api/config/filesystems.php +++ /dev/null @@ -1,71 +0,0 @@ - 'local', - - /* - |-------------------------------------------------------------------------- - | Default Cloud Filesystem Disk - |-------------------------------------------------------------------------- - | - | Many applications store files both locally and in the cloud. For this - | reason, you may specify a default "cloud" driver here. This driver - | will be bound as the Cloud disk implementation in the container. - | - */ - - 'cloud' => 's3', - - /* - |-------------------------------------------------------------------------- - | Filesystem Disks - |-------------------------------------------------------------------------- - | - | Here you may configure as many filesystem "disks" as you wish, and you - | may even configure multiple disks of the same driver. Defaults have - | been setup for each driver as an example of the required options. - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path().'/app', - ], - - 's3' => [ - 'driver' => 's3', - 'key' => 'your-key', - 'secret' => 'your-secret', - 'region' => 'your-region', - 'bucket' => 'your-bucket', - ], - - 'rackspace' => [ - 'driver' => 'rackspace', - 'username' => 'your-username', - 'key' => 'your-key', - 'container' => 'your-container', - 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/', - 'region' => 'IAD', - 'url_type' => 'publicURL' - ], - - ], - -]; diff --git a/examples/laravel-api/config/laravel-auth0.php b/examples/laravel-api/config/laravel-auth0.php deleted file mode 100644 index a0f6c8ff..00000000 --- a/examples/laravel-api/config/laravel-auth0.php +++ /dev/null @@ -1,47 +0,0 @@ - getenv('AUTH0_DOMAIN'), - /* - |-------------------------------------------------------------------------- - | Your APP id - |-------------------------------------------------------------------------- - | As set in the auth0 administration page - | - */ - - 'client_id' => getenv('AUTH0_CLIENT_ID'), - - /* - |-------------------------------------------------------------------------- - | Your APP secret - |-------------------------------------------------------------------------- - | As set in the auth0 administration page - | - */ - 'client_secret' => getenv('AUTH0_CLIENT_SECRET'), - - - /* - |-------------------------------------------------------------------------- - | The redirect URI - |-------------------------------------------------------------------------- - | Should be the same that the one configure in the route to handle the - | 'Auth0\Login\Auth0Controller@callback' - | - */ - - 'redirect_uri' => getenv('AUTH0_CALLBACK_URL') - - - -); diff --git a/examples/laravel-api/config/mail.php b/examples/laravel-api/config/mail.php deleted file mode 100644 index fc459436..00000000 --- a/examples/laravel-api/config/mail.php +++ /dev/null @@ -1,124 +0,0 @@ - env('MAIL_DRIVER', 'smtp'), - - /* - |-------------------------------------------------------------------------- - | SMTP Host Address - |-------------------------------------------------------------------------- - | - | Here you may provide the host address of the SMTP server used by your - | applications. A default option is provided that is compatible with - | the Mailgun mail service which will provide reliable deliveries. - | - */ - - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), - - /* - |-------------------------------------------------------------------------- - | SMTP Host Port - |-------------------------------------------------------------------------- - | - | This is the SMTP port used by your application to deliver e-mails to - | users of the application. Like the host we have set this value to - | stay compatible with the Mailgun e-mail application by default. - | - */ - - 'port' => env('MAIL_PORT', 587), - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. - | - */ - - 'from' => ['address' => null, 'name' => null], - - /* - |-------------------------------------------------------------------------- - | E-Mail Encryption Protocol - |-------------------------------------------------------------------------- - | - | Here you may specify the encryption protocol that should be used when - | the application send e-mail messages. A sensible default using the - | transport layer security protocol should provide great security. - | - */ - - 'encryption' => 'tls', - - /* - |-------------------------------------------------------------------------- - | SMTP Server Username - |-------------------------------------------------------------------------- - | - | If your SMTP server requires a username for authentication, you should - | set it here. This will get used to authenticate with your server on - | connection. You may also set the "password" value below this one. - | - */ - - 'username' => env('MAIL_USERNAME'), - - /* - |-------------------------------------------------------------------------- - | SMTP Server Password - |-------------------------------------------------------------------------- - | - | Here you may set the password required by your SMTP server to send out - | messages from your application. This will be given to the server on - | connection so that the application will be able to send messages. - | - */ - - 'password' => env('MAIL_PASSWORD'), - - /* - |-------------------------------------------------------------------------- - | Sendmail System Path - |-------------------------------------------------------------------------- - | - | When using the "sendmail" driver to send e-mails, we will need to know - | the path to where Sendmail lives on this server. A default path has - | been provided here, which will work well on most of your systems. - | - */ - - 'sendmail' => '/usr/sbin/sendmail -bs', - - /* - |-------------------------------------------------------------------------- - | Mail "Pretend" - |-------------------------------------------------------------------------- - | - | When this option is enabled, e-mail will not actually be sent over the - | web and will instead be written to your application's logs files so - | you may inspect the message. This is great for local development. - | - */ - - 'pretend' => false, - -]; diff --git a/examples/laravel-api/config/queue.php b/examples/laravel-api/config/queue.php deleted file mode 100644 index 9c39a136..00000000 --- a/examples/laravel-api/config/queue.php +++ /dev/null @@ -1,92 +0,0 @@ - env('QUEUE_DRIVER', 'sync'), - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - */ - - 'connections' => [ - - 'sync' => [ - 'driver' => 'sync', - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'expire' => 60, - ], - - 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'ttr' => 60, - ], - - 'sqs' => [ - 'driver' => 'sqs', - 'key' => 'your-public-key', - 'secret' => 'your-secret-key', - 'queue' => 'your-queue-url', - 'region' => 'us-east-1', - ], - - 'iron' => [ - 'driver' => 'iron', - 'host' => 'mq-aws-us-east-1.iron.io', - 'token' => 'your-token', - 'project' => 'your-project-id', - 'queue' => 'your-queue-name', - 'encrypt' => true, - ], - - 'redis' => [ - 'driver' => 'redis', - 'queue' => 'default', - 'expire' => 60, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => [ - 'database' => 'mysql', 'table' => 'failed_jobs', - ], - -]; diff --git a/examples/laravel-api/config/services.php b/examples/laravel-api/config/services.php deleted file mode 100644 index 45139694..00000000 --- a/examples/laravel-api/config/services.php +++ /dev/null @@ -1,38 +0,0 @@ - [ - 'domain' => '', - 'secret' => '', - ], - - 'mandrill' => [ - 'secret' => '', - ], - - 'ses' => [ - 'key' => '', - 'secret' => '', - 'region' => 'us-east-1', - ], - - 'stripe' => [ - 'model' => 'App\User', - 'key' => '', - 'secret' => '', - ], - -]; diff --git a/examples/laravel-api/config/session.php b/examples/laravel-api/config/session.php deleted file mode 100644 index 47470fab..00000000 --- a/examples/laravel-api/config/session.php +++ /dev/null @@ -1,153 +0,0 @@ - env('SESSION_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => 120, - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. - | - */ - - 'encrypt' => false, - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path().'/framework/sessions', - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => null, - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => 'laravel_session', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => null, - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you if it can not be done securely. - | - */ - - 'secure' => false, - -]; diff --git a/examples/laravel-api/config/view.php b/examples/laravel-api/config/view.php deleted file mode 100644 index 88fc534a..00000000 --- a/examples/laravel-api/config/view.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - realpath(base_path('resources/views')) - ], - - /* - |-------------------------------------------------------------------------- - | Compiled View Path - |-------------------------------------------------------------------------- - | - | This option determines where all the compiled Blade templates will be - | stored for your application. Typically, this is within the storage - | directory. However, as usual, you are free to change this value. - | - */ - - 'compiled' => realpath(storage_path().'/framework/views'), - -]; diff --git a/examples/laravel-api/database/.gitignore b/examples/laravel-api/database/.gitignore deleted file mode 100644 index 9b1dffd9..00000000 --- a/examples/laravel-api/database/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.sqlite diff --git a/examples/laravel-api/database/migrations/.gitkeep b/examples/laravel-api/database/migrations/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/laravel-api/database/migrations/2014_10_12_000000_create_users_table.php b/examples/laravel-api/database/migrations/2014_10_12_000000_create_users_table.php deleted file mode 100644 index 36a1db9b..00000000 --- a/examples/laravel-api/database/migrations/2014_10_12_000000_create_users_table.php +++ /dev/null @@ -1,36 +0,0 @@ -increments('id'); - $table->string('name'); - $table->string('email')->unique(); - $table->string('password', 60); - $table->rememberToken(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('users'); - } - -} diff --git a/examples/laravel-api/database/migrations/2014_10_12_100000_create_password_resets_table.php b/examples/laravel-api/database/migrations/2014_10_12_100000_create_password_resets_table.php deleted file mode 100644 index 679df38f..00000000 --- a/examples/laravel-api/database/migrations/2014_10_12_100000_create_password_resets_table.php +++ /dev/null @@ -1,33 +0,0 @@ -string('email')->index(); - $table->string('token')->index(); - $table->timestamp('created_at'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('password_resets'); - } - -} diff --git a/examples/laravel-api/database/seeds/.gitkeep b/examples/laravel-api/database/seeds/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/laravel-api/database/seeds/DatabaseSeeder.php b/examples/laravel-api/database/seeds/DatabaseSeeder.php deleted file mode 100644 index b3c69b56..00000000 --- a/examples/laravel-api/database/seeds/DatabaseSeeder.php +++ /dev/null @@ -1,20 +0,0 @@ -call('UserTableSeeder'); - } - -} diff --git a/examples/laravel-api/gulpfile.js b/examples/laravel-api/gulpfile.js deleted file mode 100644 index 7cf62673..00000000 --- a/examples/laravel-api/gulpfile.js +++ /dev/null @@ -1,16 +0,0 @@ -var elixir = require('laravel-elixir'); - -/* - |-------------------------------------------------------------------------- - | Elixir Asset Management - |-------------------------------------------------------------------------- - | - | Elixir provides a clean, fluent API for defining some basic Gulp tasks - | for your Laravel application. By default, we are compiling the Less - | file for our application, as well as publishing vendor resources. - | - */ - -elixir(function(mix) { - mix.less('app.less'); -}); diff --git a/examples/laravel-api/package.json b/examples/laravel-api/package.json deleted file mode 100644 index 5595f071..00000000 --- a/examples/laravel-api/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "private": true, - "devDependencies": { - "gulp": "^3.8.8", - "laravel-elixir": "*" - } -} diff --git a/examples/laravel-api/phpspec.yml b/examples/laravel-api/phpspec.yml deleted file mode 100644 index eb57939e..00000000 --- a/examples/laravel-api/phpspec.yml +++ /dev/null @@ -1,5 +0,0 @@ -suites: - main: - namespace: App - psr4_prefix: App - src_path: app \ No newline at end of file diff --git a/examples/laravel-api/phpunit.xml b/examples/laravel-api/phpunit.xml deleted file mode 100644 index d66acd01..00000000 --- a/examples/laravel-api/phpunit.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - ./tests/ - - - - - - - - - diff --git a/examples/laravel-api/public/.htaccess b/examples/laravel-api/public/.htaccess deleted file mode 100644 index 77827ae7..00000000 --- a/examples/laravel-api/public/.htaccess +++ /dev/null @@ -1,15 +0,0 @@ - - - Options -MultiViews - - - RewriteEngine On - - # Redirect Trailing Slashes... - RewriteRule ^(.*)/$ /$1 [L,R=301] - - # Handle Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/examples/laravel-api/public/app/home/auth0_logo_final_blue_RGB.png b/examples/laravel-api/public/app/home/auth0_logo_final_blue_RGB.png deleted file mode 100644 index 8b49dc1fd3fc51f1625653e5c162bacfae3bdf44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17757 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 KT-G@yGywqZg%0fi diff --git a/examples/laravel-api/public/app/home/home.css b/examples/laravel-api/public/app/home/home.css deleted file mode 100644 index b352e546..00000000 --- a/examples/laravel-api/public/app/home/home.css +++ /dev/null @@ -1,92 +0,0 @@ -body { - font-family: "proxima-nova", sans-serif; - text-align: center; - font-size: 300%; - font-weight: 100; -} -input[type=checkbox], -input[type=radio] { - position: absolute; - opacity: 0; -} -input[type=checkbox] + label, -input[type=radio] + label { - display: inline-block; -} -input[type=checkbox] + label:before, -input[type=radio] + label:before { - content: ""; - display: inline-block; - vertical-align: -0.2em; - width: 1em; - height: 1em; - border: 0.15em solid #0074d9; - border-radius: 0.2em; - margin-right: 0.3em; - background-color: white; -} -input[type=radio] + label:before { - border-radius: 50%; -} -input[type=radio]:checked + label:before, -input[type=checkbox]:checked + label:before { - background-color: #0074d9; - box-shadow: inset 0 0 0 0.15em white; -} -input[type=radio]:focus + label:before, -input[type=checkbox]:focus + label:before { - outline: 0; -} -.btn { - font-size: 140%; - text-transform: uppercase; - letter-spacing: 1px; - border: 0; - background-color: #16214D; - color: white; -} -.btn:hover { - background-color: #44C7F4; -} -.btn:focus { - outline: none !important; -} -.btn.btn-lg { - padding: 20px 30px; -} -.btn:disabled { - background-color: #333; - color: #666; -} -h1, -h2, -h3 { - font-weight: 100; -} -#logo img { - width: 300px; - margin-bottom: 60px; -} -.home-description { - font-weight: 100; - margin: 100px 0; -} -h2.ng-binding { - margin-top: 30px; - margin-bottom: 40px; - font-size: 200%; -} -label.ng-binding { - font-size: 100%; - font-weight: 300; -} -.btn-next { - margin-top: 30px; -} -.answer { - width: 70%; - margin: auto; - text-align: left; - padding-left: 10%; - margin-bottom: 20px; -} diff --git a/examples/laravel-api/public/app/home/home.html b/examples/laravel-api/public/app/home/home.html deleted file mode 100644 index c63cc2bc..00000000 --- a/examples/laravel-api/public/app/home/home.html +++ /dev/null @@ -1,6 +0,0 @@ -
-

-

Welcome {{auth.profile.nickname}}

-
- -
diff --git a/examples/laravel-api/public/app/home/home.js b/examples/laravel-api/public/app/home/home.js deleted file mode 100644 index f5a5cc72..00000000 --- a/examples/laravel-api/public/app/home/home.js +++ /dev/null @@ -1,27 +0,0 @@ -angular.module( 'sample.home', [ -'auth0' -]) -.controller( 'HomeCtrl', function HomeController( $scope, auth, $http, $location, store ) { - - $scope.auth = auth; - - $scope.callApi = function() { - // Just call the API as you'd do using $http - $http({ - url: '/api/ping', - method: 'GET' - }).then(function(response) { - alert(response.data.status); - }, function() { - alert("Ups!"); - }); - } - - $scope.logout = function() { - auth.signout(); - store.remove('profile'); - store.remove('token'); - $location.path('/login'); - } - -}); diff --git a/examples/laravel-api/public/app/login/login.css b/examples/laravel-api/public/app/login/login.css deleted file mode 100644 index a3dcd3a3..00000000 --- a/examples/laravel-api/public/app/login/login.css +++ /dev/null @@ -1,3 +0,0 @@ -.login-page .login-box { - padding: 100px 0; -} diff --git a/examples/laravel-api/public/app/login/login.html b/examples/laravel-api/public/app/login/login.html deleted file mode 100644 index 46b5cf42..00000000 --- a/examples/laravel-api/public/app/login/login.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/examples/laravel-api/public/app/login/login.js b/examples/laravel-api/public/app/login/login.js deleted file mode 100644 index c4233c29..00000000 --- a/examples/laravel-api/public/app/login/login.js +++ /dev/null @@ -1,16 +0,0 @@ -angular.module( 'sample.login', [ - 'auth0' -]) -.controller( 'LoginCtrl', function HomeController( $scope, auth, $location, store ) { - - $scope.login = function() { - auth.signin({}, function(profile, token) { - store.set('profile', profile); - store.set('token', token); - $location.path("/"); - }, function(error) { - console.log("There was an error logging in", error); - }); - } - -}); diff --git a/examples/laravel-api/public/css/app.css b/examples/laravel-api/public/css/app.css deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/laravel-api/public/favicon.ico b/examples/laravel-api/public/favicon.ico deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/laravel-api/public/fonts/glyphicons-halflings-regular.eot b/examples/laravel-api/public/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953fff68df523aa7656497ee339d6026d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20127 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/laravel-api/public/fonts/glyphicons-halflings-regular.ttf b/examples/laravel-api/public/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 zcmd?Sd0-pWwLh*qi$?oCk~i6sWlOeWJC3|4juU5JNSu9hSVACzERcmjLV&P^utNzg zIE4Kr1=5g!SxTX#Ern9_%4&01rlrW`Z!56xXTGQR4C z3vR~wXq>NDx$c~e?;ia3YjJ*$!C>69a?2$lLyhpI!CFfJsP=|`8@K0|bbMpWwVUEygg0=0x_)HeHpGSJagJNLA3c!$EuOV>j$wi! zbo{vZ(s8tl>@!?}dmNHXo)ABy7ohD7_1G-P@SdJWT8*oeyBVYVW9*vn}&VI4q++W;Z+uz=QTK}^C75!`aFYCX# zf7fC2;o`%!huaTNJAB&VWrx=szU=VLhwnbT`vc<#<`4WI6n_x@AofA~2d90o?1L3w z9!I|#P*NQ)$#9aASijuw>JRld^-t)Zhmy|i-`Iam|IWkguaMR%lhi4p~cX-9& zjfbx}yz}s`4-6>D^+6FzihR)Y!GsUy=_MWi_v7y#KmYi-{iZ+s@ekkq!@Wxz!~BQwiI&ti z>hC&iBe2m(dpNVvSbZe3DVgl(dxHt-k@{xv;&`^c8GJY%&^LpM;}7)B;5Qg5J^E${ z7z~k8eWOucjX6)7q1a%EVtmnND8cclz8R1=X4W@D8IDeUGXxEWe&p>Z*voO0u_2!! zj3dT(Ki+4E;uykKi*yr?w6!BW2FD55PD6SMj`OfBLwXL5EA-9KjpMo4*5Eqs^>4&> z8PezAcn!9jk-h-Oo!E9EjX8W6@EkTHeI<@AY{f|5fMW<-Ez-z)xCvW3()Z#x0oydB zzm4MzY^NdpIF9qMp-jU;99LjlgY@@s+=z`}_%V*xV7nRV*Kwrx-i`FzI0BZ#yOI8# z!SDeNA5b6u9!Imj89v0(g$;dT_y|Yz!3V`i{{_dez8U@##|X9A};s^7vEd!3AcdyVlhVk$v?$O442KIM1-wX^R{U7`JW&lPr3N(%kXfXT_`7w^? z=#ntx`tTF|N$UT?pELvw7T*2;=Q-x@KmDUIbLyXZ>f5=y7z1DT<7>Bp0k;eItHF?1 zErzhlD2B$Tm|^7DrxnTYm-tgg`Mt4Eivp5{r$o9e)8(fXBO4g|G^6Xy?y$SM*&V52 z6SR*%`%DZC^w(gOWQL?6DRoI*hBNT)xW9sxvmi@!vI^!mI$3kvAMmR_q#SGn3zRb_ zGe$=;Tv3dXN~9XuIHow*NEU4y&u}FcZEZoSlXb9IBOA}!@J3uovp}yerhPMaiI8|SDhvWVr z^BE&yx6e3&RYqIg;mYVZ*3#A-cDJ;#ms4txEmwm@g^s`BB}KmSr7K+ruIoKs=s|gOXP|2 zb1!)87h9?(+1^QRWb(Vo8+@G=o24gyuzF3ytfsKjTHZJ}o{YznGcTDm!s)DRnmOX} z3pPL4wExoN$kyc2>#J`k+<67sy-VsfbQ-1u+HkyFR?9G`9r6g4*8!(!c65Be-5hUg zZHY$M0k(Yd+DT1*8)G(q)1&tDl=g9H7!bZTOvEEFnBOk_K=DXF(d4JOaH zI}*A3jGmy{gR>s}EQzyJa_q_?TYPNXRU1O;fcV_&TQZhd{@*8Tgpraf~nT0BYktu*n{a~ub^UUqQPyr~yBY{k2O zgV)honv{B_CqY|*S~3up%Wn%7i*_>Lu|%5~j)}rQLT1ZN?5%QN`LTJ}vA!EE=1`So z!$$Mv?6T)xk)H8JTrZ~m)oNXxS}pwPd#);<*>zWsYoL6iK!gRSBB{JCgB28C#E{T? z5VOCMW^;h~eMke(w6vLlKvm!!TyIf;k*RtK)|Q>_@nY#J%=h%aVb)?Ni_By)XNxY)E3`|}_u}fn+Kp^3p4RbhFUBRtGsDyx9Eolg77iWN z2iH-}CiM!pfYDIn7;i#Ui1KG01{3D<{e}uWTdlX4Vr*nsb^>l0%{O?0L9tP|KGw8w z+T5F}md>3qDZQ_IVkQ|BzuN08uN?SsVt$~wcHO4pB9~ykFTJO3g<4X({-Tm1w{Ufo zI03<6KK`ZjqVyQ(>{_aMxu7Zm^ck&~)Q84MOsQ-XS~{6j>0lTl@lMtfWjj;PT{nlZ zIn0YL?kK7CYJa)(8?unZ)j8L(O}%$5S#lTcq{rr5_gqqtZ@*0Yw4}OdjL*kBv+>+@ z&*24U=y{Nl58qJyW1vTwqsvs=VRAzojm&V zEn6=WzdL1y+^}%Vg!ap>x%%nFi=V#wn# zUuheBR@*KS)5Mn0`f=3fMwR|#-rPMQJg(fW*5e`7xO&^UUH{L(U8D$JtI!ac!g(Ze89<`UiO@L+)^D zjPk2_Ie0p~4|LiI?-+pHXuRaZKG$%zVT0jn!yTvvM^jlcp`|VSHRt-G@_&~<4&qW@ z?b#zIN)G(}L|60jer*P7#KCu*Af;{mpWWvYK$@Squ|n-Vtfgr@ZOmR5Xpl;0q~VILmjk$$mgp+`<2jP z@+nW5Oap%fF4nFwnVwR7rpFaOdmnfB$-rkO6T3#w^|*rft~acgCP|ZkgA6PHD#Of| zY%E!3tXtsWS`udLsE7cSE8g@p$ceu*tI71V31uA7jwmXUCT7+Cu3uv|W>ZwD{&O4Nfjjvl43N#A$|FWxId! z%=X!HSiQ-#4nS&smww~iXRn<-`&zc)nR~js?|Ei-cei$^$KsqtxNDZvl1oavXK#Pz zT&%Wln^Y5M95w=vJxj0a-ko_iQt(LTX_5x#*QfQLtPil;kkR|kz}`*xHiLWr35ajx zHRL-QQv$|PK-$ges|NHw8k6v?&d;{A$*q15hz9{}-`e6ys1EQ1oNNKDFGQ0xA!x^( zkG*-ueZT(GukSnK&Bs=4+w|(kuWs5V_2#3`!;f}q?>xU5IgoMl^DNf+Xd<=sl2XvkqviJ>d?+G@Z5nxxd5Sqd$*ENUB_mb8Z+7CyyU zA6mDQ&e+S~w49csl*UePzY;^K)Fbs^%?7;+hFc(xz#mWoek4_&QvmT7Fe)*{h-9R4 zqyXuN5{)HdQ6yVi#tRUO#M%;pL>rQxN~6yoZ)*{{!?jU)RD*oOxDoTjVh6iNmhWNC zB5_{R=o{qvxEvi(khbRS`FOXmOO|&Dj$&~>*oo)bZz%lPhEA@ zQ;;w5eu5^%i;)w?T&*=UaK?*|U3~{0tC`rvfEsRPgR~16;~{_S2&=E{fE2=c>{+y} zx1*NTv-*zO^px5TA|B```#NetKg`19O!BK*-#~wDM@KEllk^nfQ2quy25G%)l72<> zzL$^{DDM#jKt?<>m;!?E2p0l12`j+QJjr{Lx*47Nq(v6i3M&*P{jkZB{xR?NOSPN% zU>I+~d_ny=pX??qjF*E78>}Mgts@_yn`)C`wN-He_!OyE+gRI?-a>Om>Vh~3OX5+& z6MX*d1`SkdXwvb7KH&=31RCC|&H!aA1g_=ZY0hP)-Wm6?A7SG0*|$mC7N^SSBh@MG z9?V0tv_sE>X==yV{)^LsygK2=$Mo_0N!JCOU?r}rmWdHD%$h~~G3;bt`lH& zAuOOZ=G1Mih**0>lB5x+r)X^8mz!0K{SScj4|a=s^VhUEp#2M=^#WRqe?T&H9GnWa zYOq{+gBn9Q0e0*Zu>C(BAX=I-Af9wIFhCW6_>TsIH$d>|{fIrs&BX?2G>GvFc=<8` zVJ`#^knMU~65dWGgXcht`Kb>{V2oo%<{NK|iH+R^|Gx%q+env#Js*(EBT3V0=w4F@W+oLFsA)l7Qy8mx_;6Vrk;F2RjKFvmeq} zro&>@b^(?f))OoQ#^#s)tRL>b0gzhRYRG}EU%wr9GjQ#~Rpo|RSkeik^p9x2+=rUr}vfnQoeFAlv=oX%YqbLpvyvcZ3l$B z5bo;hDd(fjT;9o7g9xUg3|#?wU2#BJ0G&W1#wn?mfNR{O7bq747tc~mM%m%t+7YN}^tMa24O4@w<|$lk@pGx!;%pKiq&mZB z?3h<&w>un8r?Xua6(@Txu~Za9tI@|C4#!dmHMzDF_-_~Jolztm=e)@vG11bZQAs!tFvd9{C;oxC7VfWq377Y(LR^X_TyX9bn$)I765l=rJ%9uXcjggX*r?u zk|0!db_*1$&i8>d&G3C}A`{Fun_1J;Vx0gk7P_}8KBZDowr*8$@X?W6v^LYmNWI)lN92yQ;tDpN zOUdS-W4JZUjwF-X#w0r;97;i(l}ZZT$DRd4u#?pf^e2yaFo zbm>I@5}#8FjsmigM8w_f#m4fEP~r~_?OWB%SGWcn$ThnJ@Y`ZI-O&Qs#Y14To( zWAl>9Gw7#}eT(!c%D0m>5D8**a@h;sLW=6_AsT5v1Sd_T-C4pgu_kvc?7+X&n_fct znkHy(_LExh=N%o3I-q#f$F4QJpy>jZBW zRF7?EhqTGk)w&Koi}QQY3sVh?@e-Z3C9)P!(hMhxmXLC zF_+ZSTQU`Gqx@o(~B$dbr zHlEUKoK&`2gl>zKXlEi8w6}`X3kh3as1~sX5@^`X_nYl}hlbpeeVlj#2sv)CIMe%b zBs7f|37f8qq}gA~Is9gj&=te^wN8ma?;vF)7gce;&sZ64!7LqpR!fy)?4cEZposQ8 zf;rZF7Q>YMF1~eQ|Z*!5j0DuA=`~VG$Gg6B?Om1 z6fM@`Ck-K*k(eJ)Kvysb8sccsFf@7~3vfnC=<$q+VNv)FyVh6ZsWw}*vs>%k3$)9| zR9ek-@pA23qswe1io)(Vz!vS1o*XEN*LhVYOq#T`;rDkgt86T@O`23xW~;W_#ZS|x zvwx-XMb7_!hIte-#JNpFxskMMpo2OYhHRr0Yn8d^(jh3-+!CNs0K2B!1dL$9UuAD= zQ%7Ae(Y@}%Cd~!`h|wAdm$2WoZ(iA1(a_-1?znZ%8h72o&Mm*4x8Ta<4++;Yr6|}u zW8$p&izhdqF=m8$)HyS2J6cKyo;Yvb>DTfx4`4R{ zPSODe9E|uflE<`xTO=r>u~u=NuyB&H!(2a8vwh!jP!yfE3N>IiO1jI>7e&3rR#RO3_}G23W?gwDHgSgekzQ^PU&G5z&}V5GO? zfg#*72*$DP1T8i`S7=P;bQ8lYF9_@8^C(|;9v8ZaK2GnWz4$Th2a0$)XTiaxNWfdq z;yNi9veH!j)ba$9pke8`y2^63BP zIyYKj^7;2don3se!P&%I2jzFf|LA&tQ=NDs{r9fIi-F{-yiG-}@2`VR^-LIFN8BC4 z&?*IvLiGHH5>NY(Z^CL_A;yISNdq58}=u~9!Ia7 zm7MkDiK~lsfLpvmPMo!0$keA$`%Tm`>Fx9JpG^EfEb(;}%5}B4Dw!O3BCkf$$W-dF z$BupUPgLpHvr<<+QcNX*w@+Rz&VQz)Uh!j4|DYeKm5IC05T$KqVV3Y|MSXom+Jn8c zgUEaFW1McGi^44xoG*b0JWE4T`vka7qTo#dcS4RauUpE{O!ZQ?r=-MlY#;VBzhHGU zS@kCaZ*H73XX6~HtHd*4qr2h}Pf0Re@!WOyvres_9l2!AhPiV$@O2sX>$21)-3i+_ z*sHO4Ika^!&2utZ@5%VbpH(m2wE3qOPn-I5Tbnt&yn9{k*eMr3^u6zG-~PSr(w$p> zw)x^a*8Ru$PE+{&)%VQUvAKKiWiwvc{`|GqK2K|ZMy^Tv3g|zENL86z7i<c zW`W>zV1u}X%P;Ajn+>A)2iXZbJ5YB_r>K-h5g^N=LkN^h0Y6dPFfSBh(L`G$D%7c` z&0RXDv$}c7#w*7!x^LUes_|V*=bd&aP+KFi((tG*gakSR+FA26%{QJdB5G1F=UuU&koU*^zQA=cEN9}Vd?OEh| zgzbFf1?@LlPkcXH$;YZe`WEJ3si6&R2MRb}LYK&zK9WRD=kY-JMPUurX-t4(Wy{%` zZ@0WM2+IqPa9D(^*+MXw2NWwSX-_WdF0nMWpEhAyotIgqu5Y$wA=zfuXJ0Y2lL3#ji26-P3Z?-&0^KBc*`T$+8+cqp`%g0WB zTH9L)FZ&t073H4?t=(U6{8B+uRW_J_n*vW|p`DugT^3xe8Tomh^d}0k^G7$3wLgP& zn)vTWiMA&=bR8lX9H=uh4G04R6>C&Zjnx_f@MMY!6HK5v$T%vaFm;E8q=`w2Y}ucJ zkz~dKGqv9$E80NTtnx|Rf_)|3wxpnY6nh3U9<)fv2-vhQ6v=WhKO@~@X57N-`7Ppc zF;I7)eL?RN23FmGh0s;Z#+p)}-TgTJE%&>{W+}C`^-sy{gTm<$>rR z-X7F%MB9Sf%6o7A%ZHReD4R;imU6<9h81{%avv}hqugeaf=~^3A=x(Om6Lku-Pn9i zC;LP%Q7Xw*0`Kg1)X~nAsUfdV%HWrpr8dZRpd-#%)c#Fu^mqo|^b{9Mam`^Zw_@j@ zR&ZdBr3?@<@%4Z-%LT&RLgDUFs4a(CTah_5x4X`xDRugi#vI-cw*^{ncwMtA4NKjByYBza)Y$hozZCpuxL{IP&=tw6ZO52WY3|iwGf&IJCn+u(>icK zZB1~bWXCmwAUz|^<&ysd#*!DSp8}DLNbl5lRFat4NkvItxy;9tpp9~|@ z;JctShv^Iq4(z+y7^j&I?GCdKMVg&jCwtCkc4*@O7HY*veGDBtAIn*JgD$QftP}8= zxFAdF=(S>Ra6(4slk#h%b?EOU-96TIX$Jbfl*_7IY-|R%H zF8u|~hYS-YwWt5+^!uGcnKL~jM;)ObZ#q68ZkA?}CzV-%6_vPIdzh_wHT_$mM%vws9lxUj;E@#1UX?WO2R^41(X!nk$+2oJGr!sgcbn1f^yl1 z#pbPB&Bf;1&2+?};Jg5qgD1{4_|%X#s48rOLE!vx3@ktstyBsDQWwDz4GYlcgu$UJ zp|z_32yN72T*oT$SF8<}>e;FN^X&vWNCz>b2W0rwK#<1#kbV)Cf`vN-F$&knLo5T& z8!sO-*^x4=kJ$L&*h%rQ@49l?7_9IG99~xJDDil00<${~D&;kiqRQqeW5*22A`8I2 z(^@`qZoF7_`CO_e;8#qF!&g>UY;wD5MxWU>azoo=E{kW(GU#pbOi%XAn%?W{b>-bTt&2?G=E&BnK9m0zs{qr$*&g8afR_x`B~o zd#dxPpaap;I=>1j8=9Oj)i}s@V}oXhP*{R|@DAQXzQJekJnmuQ;vL90_)H_nD1g6e zS1H#dzg)U&6$fz0g%|jxDdz|FQN{KJ&Yx0vfuzAFewJjv`pdMRpY-wU`-Y6WQnJ(@ zGVb!-8DRJZvHnRFiR3PG3Tu^nCn(CcZHh7hQvyd7i6Q3&ot86XI{jo%WZqCPcTR0< zMRg$ZE=PQx66ovJDvI_JChN~k@L^Pyxv#?X^<)-TS5gk`M~d<~j%!UOWG;ZMi1af< z+86U0=sm!qAVJAIqqU`Qs1uJhQJA&n@9F1PUrYuW!-~IT>l$I!#5dBaiAK}RUufjg{$#GdQBkxF1=KU2E@N=i^;xgG2Y4|{H>s` z$t`k8c-8`fS7Yfb1FM#)vPKVE4Uf(Pk&%HLe z%^4L>@Z^9Z{ZOX<^e)~adVRkKJDanJ6VBC_m@6qUq_WF@Epw>AYqf%r6qDzQ~AEJ!jtUvLp^CcqZ^G-;Kz3T;O4WG45Z zFhrluCxlY`M+OKr2SeI697btH7Kj`O>A!+2DTEQ=48cR>Gg2^5uqp(+y5Sl09MRl* zp|28!v*wvMd_~e2DdKDMMQ|({HMn3D%%ATEecGG8V9>`JeL)T0KG}=}6K8NiSN5W< z79-ZdYWRUb`T}(b{RjN8>?M~opnSRl$$^gT`B27kMym5LNHu-k;A;VF8R(HtDYJHS zU7;L{a@`>jd0svOYKbwzq+pWSC(C~SPgG~nWR3pBA8@OICK$Cy#U`kS$I;?|^-SBC zBFkoO8Z^%8Fc-@X!KebF2Ob3%`8zlVHj6H;^(m7J35(_bS;cZPd}TY~qixY{MhykQ zV&7u7s%E=?i`}Ax-7dB0ih47w*7!@GBt<*7ImM|_mYS|9_K7CH+i}?*#o~a&tF-?C zlynEu1DmiAbGurEX2Flfy$wEVk7AU;`k#=IQE*6DMWafTL|9-vT0qs{A3mmZGzOyN zcM9#Rgo7WgB_ujU+?Q@Ql?V-!E=jbypS+*chI&zA+C_3_@aJal}!Q54?qsL0In({Ly zjH;e+_SK8yi0NQB%TO+Dl77jp#2pMGtwsgaC>K!)NimXG3;m7y`W+&<(ZaV>N*K$j zLL~I+6ouPk6_(iO>61cIsinx`5}DcKSaHjYkkMuDoVl>mKO<4$F<>YJ5J9A2Vl}#BP7+u~L8C6~D zsk`pZ$9Bz3teQS1Wb|8&c2SZ;qo<#F&gS;j`!~!ADr(jJXMtcDJ9cVi>&p3~{bqaP zgo%s8i+8V{UrYTc9)HiUR_c?cfx{Yan2#%PqJ{%?Wux4J;T$#cumM0{Es3@$>}DJg zqe*c8##t;X(4$?A`ve)e@YU3d2Balcivot{1(ahlE5qg@S-h(mPNH&`pBX$_~HdG48~)$x5p z{>ghzqqn_t8~pY<5?-To>cy^6o~mifr;KWvx_oMtXOw$$d6jddXG)V@a#lL4o%N@A zNJlQAz6R8{7jax-kQsH6JU_u*En%k^NHlvBB!$JAK!cYmS)HkLAkm0*9G3!vwMIWv zo#)+EamIJHEUV|$d|<)2iJ`lqBQLx;HgD}c3mRu{iK23C>G{0Mp1K)bt6OU?xC4!_ zZLqpFzeu&+>O1F>%g-%U^~yRg(-wSp@vmD-PT#bCWy!%&H;qT7rfuRCEgw67V!Qob z&tvPU@*4*$YF#2_>M0(75QxqrJr3Tvh~iDeFhxl=MzV@(psx%G8|I{~9;tv#BBE`l z3)_98eZqFNwEF1h)uqhBmT~mSmT8k$7vSHdR97K~kM)P9PuZdS;|Op4A?O<*%!?h` zn`}r_j%xvffs46x2hCWuo0BfIQWCw9aKkH==#B(TJ%p}p-RuIVzsRlaPL_Co{&R0h zQrqn=g1PGjQg3&sc2IlKG0Io#v%@p>tFwF)RG0ahYs@Zng6}M*d}Xua)+h&?$`%rb z;>M=iMh5eIHuJ5c$aC`y@CYjbFsJnSPH&}LQz4}za9YjDuao>Z^EdL@%saRm&LGQWXs*;FzwN#pH&j~SLhDZ+QzhplV_ij(NyMl z;v|}amvxRddO81LJFa~2QFUs z+Lk zZck)}9uK^buJNMo4G(rSdX{57(7&n=Q6$QZ@lIO9#<3pA2ceDpO_340B*pHlh_y{>i&c1?vdpN1j>3UN-;;Yq?P+V5oY`4Z(|P8SwWq<)n`W@AwcQ?E9 zd5j8>FT^m=MHEWfN9jS}UHHsU`&SScib$qd0i=ky0>4dz5ADy70AeIuSzw#gHhQ_c zOp1!v6qU)@8MY+ zMNIID?(CysRc2uZQ$l*QZVY)$X?@4$VT^>djbugLQJdm^P>?51#lXBkdXglYm|4{L zL%Sr?2f`J+xrcN@=0tiJt(<-=+v>tHy{XaGj7^cA6felUn_KPa?V4ebfq7~4i~GKE zpm)e@1=E;PP%?`vK6KVPKXjUXyLS1^NbnQ&?z>epHCd+J$ktT1G&L~T)nQeExe;0Z zlei}<_ni ztFo}j7nBl$)s_3odmdafVieFxc)m!wM+U`2u%yhJ90giFcU1`dR6BBTKc2cQ*d zm-{?M&%(={xYHy?VCx!ogr|4g5;V{2q(L?QzJGsirn~kWHU`l`rHiIrc-Nan!hR7zaLsPr4uR zG{En&gaRK&B@lyWV@yfFpD_^&z>84~_0Rd!v(Nr%PJhFF_ci3D#ixf|(r@$igZiWw za*qbXIJ_Hm4)TaQ=zW^g)FC6uvyO~Hg-#Z5Vsrybz6uOTF>Rq1($JS`imyNB7myWWpxYL(t7`H8*voI3Qz6mvm z$JxtArLJ(1wlCO_te?L{>8YPzQ})xJlvc5wv8p7Z=HviPYB#^#_vGO#*`<0r%MR#u zN_mV4vaBb2RwtoOYCw)X^>r{2a0kK|WyEYoBjGxcObFl&P*??)WEWKU*V~zG5o=s@ z;rc~uuQQf9wf)MYWsWgPR!wKGt6q;^8!cD_vxrG8GMoFGOVV=(J3w6Xk;}i)9(7*U zwR4VkP_5Zx7wqn8%M8uDj4f1aP+vh1Wue&ry@h|wuN(D2W;v6b1^ z`)7XBZ385zg;}&Pt@?dunQ=RduGRJn^9HLU&HaeUE_cA1{+oSIjmj3z+1YiOGiu-H zf8u-oVnG%KfhB8H?cg%@#V5n+L$MO2F4>XoBjBeX>css^h}Omu#)ExTfUE^07KOQS znMfQY2wz?!7!{*C^)aZ^UhMZf=TJNDv8VrrW;JJ9`=|L0`w9DE8MS>+o{f#{7}B4P z{I34>342vLsP}o=ny1eZkEabr@niT5J2AhByUz&i3Ck0H*H`LRHz;>3C_ru!X+EhJ z6(+(lI#4c`2{`q0o9aZhI|jRjBZOV~IA_km7ItNtUa(Wsr*Hmb;b4=;R(gF@GmsRI`pF+0tmq0zy~wnoJD(LSEwHjTOt4xb0XB-+ z&4RO{Snw4G%gS9w#uSUK$Zbb#=jxEl;}6&!b-rSY$0M4pftat-$Q)*y!bpx)R%P>8 zrB&`YEX2%+s#lFCIV;cUFUTIR$Gn2%F(3yLeiG8eG8&)+cpBlzx4)sK?>uIlH+$?2 z9q9wk5zY-xr_fzFSGxYp^KSY0s%1BhsI>ai2VAc8&JiwQ>3RRk?ITx!t~r45qsMnj zkX4bl06ojFCMq<9l*4NHMAtIxDJOX)H=K*$NkkNG<^nl46 zHWH1GXb?Og1f0S+8-((5yaeegCT62&4N*pNQY;%asz9r9Lfr;@Bl${1@a4QAvMLbV6JDp>8SO^q1)#(o%k!QiRSd0eTmzC< zNIFWY5?)+JTl1Roi=nS4%@5iF+%XztpR^BSuM~DX9q`;Mv=+$M+GgE$_>o+~$#?*y zAcD4nd~L~EsAjXV-+li6Lua4;(EFdi|M2qV53`^4|7gR8AJI;0Xb6QGLaYl1zr&eu zH_vFUt+Ouf4SXA~ z&Hh8K@ms^`(hJfdicecj>J^Aqd00^ccqN!-f-!=N7C1?`4J+`_f^nV!B3Q^|fuU)7 z1NDNT04hd4QqE+qBP+>ZE7{v;n3OGN`->|lHjNL5w40pePJ?^Y6bFk@^k%^5CXZ<+4qbOplxpe)l7c6m%o-l1oWmCx%c6@rx85hi(F=v(2 zJ$jN>?yPgU#DnbDXPkHLeQwED5)W5sH#-eS z%#^4dxiVs{+q(Yd^ShMN3GH)!h!@W&N`$L!SbElXCuvnqh{U7lcCvHI#{ZjwnKvu~ zAeo7Pqot+Ohm{8|RJsTr3J4GjCy5UTo_u_~p)MS&Z5UrUc|+;Mc(YS+ju|m3Y_Dvt zonVtpBWlM718YwaN3a3wUNqX;7TqvAFnVUoD5v5WTh~}r)KoLUDw%8Rrqso~bJqd> z_T!&Rmr6ebpV^4|knJZ%qmzL;OvG3~A*loGY7?YS%hS{2R0%NQ@fRoEK52Aiu%gj( z_7~a}eQUh8PnyI^J!>pxB(x7FeINHHC4zLDT`&C*XUpp@s0_B^!k5Uu)^j_uuu^T> z8WW!QK0SgwFHTA%M!L`bl3hHjPp)|wL5Var_*A1-H8LV?uY5&ou{hRjj>#X@rxV>5%-9hbP+v?$4}3EfoRH;l_wSiz{&1<+`Y5%o%q~4rdpRF0jOsCoLnWY5x?V)0ga>CDo`NpqS) z@x`mh1QGkx;f)p-n^*g5M^zRTHz%b2IkLBY{F+HsjrFC9_H(=9Z5W&Eymh~A_FUJ} znhTc9KG((OnjFO=+q>JQZJbeOoUM77M{)$)qQMcxK9f;=L;IOv_J>*~w^YOW744QZ zoG;!b9VD3ww}OX<8sZ0F##8hvfDP{hpa3HjaLsKbLJ8 z0WpY2E!w?&cWi7&N%bOMZD~o7QT*$xCRJ@{t31~qx~+0yYrLXubXh2{_L699Nl_pn z6)9eu+uUTUdjHXYs#pX^L)AIb!FjjNsTp7C399w&B{Q4q%yKfmy}T2uQdU|1EpNcY zDk~(h#AdxybjfzB+mg6rdU9mDZ^V>|U13Dl$Gj+pAL}lR2a1u!SJXU_YqP9N{ose4 zk+$v}BIHX60WSGVWv;S%zvHOWdDP(-ceo(<8`y@Goy%4wDu>57QZNJc)f>Ls+}9h7 z^N=#3q3|l?aG8K#HwiW2^PJu{v|x5;awYfahC?>_af3$LmMc4%N~JwVlRZa4c+eW2 zE!zosAjOv&UeCeu;Bn5OQUC=jtZjF;NDk9$fGbxf3d29SUBekX1!a$Vmq_VK*MHQ4)eB!dQrHH)LVYNF%-t8!d`@!cb z2CsKs3|!}T^7fSZm?0dJ^JE`ZGxA&a!jC<>6_y67On0M)hd$m*RAzo_qM?aeqkm`* zXpDYcc_>TFZYaC3JV>{>mp(5H^efu!Waa7hGTAts29jjuVd1vI*fEeB?A&uG<8dLZ z(j6;-%vJ7R0U9}XkH)1g>&uptXPHBEA*7PSO2TZ+dbhVxspNW~ZQT3fApz}2 z_@0-lZODcd>dLrYp!mHn4k>>7kibI!Em+Vh*;z}l?0qro=aJt68joCr5Jo(Vk<@i) z5BCKb4p6Gdr9=JSf(2Mgr=_6}%4?SwhV+JZj3Ox^_^OrQk$B^v?eNz}d^xRaz&~ zKVnlLnK#8^y=If2f1zmb~^5lPLe?%l}>?~wN4IN((2~U{e9fKhLMtYFj)I$(y zgnKv?R+ZpxA$f)Q2l=aqE6EPTK=i0sY&MDFJp!vQayyvzh4wee<}kybNthRlX>SHh z7S}9he^EBOqzBCww^duHu!u+dnf9veG{HjW!}aT7aJqzze9K6-Z~8pZAgdm1n~aDs z8_s7?WXMPJ3EPJHi}NL&d;lZP8hDhAXf5Hd!x|^kEHu`6QukXrVdLnq5zbI~oPo?7 z2Cbu8U?$K!Z4_yNM1a(bL!GRe!@{Qom+DxjrJ!B99qu5b*Ma%^&-=6UEbC+S2zX&= zQ!%bgJTvmv^2}hhvNQg!l=kbapAgM^hruE3k@jTxsG(B6d=4thBC*4tzVpCYXFc$a zeqgVB^zua)y-YjpiibCCdU%txXYeNFnXcbNj*D?~)5AGjL+!!ij_4{5EWKGav0^={~M^q}baAFOPzxfUM>`KPf|G z&hsaR*7(M6KzTj8Z?;45zX@L#xU{4n$9Q_<-ac(y4g~S|Hyp^-<*d8+P4NHe?~vfm z@y309=`lGdvN8*jw-CL<;o#DKc-%lb0i9a3%{v&2X($|Qxv(_*()&=xD=5oBg=$B0 zU?41h9)JKvP0yR{KsHoC>&`(Uz>?_`tlLjw1&5tPH3FoB%}j;yffm$$s$C=RHi`I3*m@%CPqWnP@B~%DEe;7ZT{9!IMTo1hT3Q347HJ&!)BM2 z3~aClf>aFh0_9||4G}(Npu`9xYY1*SD|M~9!CCFn{-J$u2&Dg*=5$_nozpoD2nxqq zB!--eA8UWZlcEDp4r#vhZ6|vq^9sFvRnA9HpHch5Mq4*T)oGbruj!U8Lx_G%Lby}o zTQ-_4A7b)5A42vA0U}hUJq6&wQ0J%$`w#ph!EGmW96)@{AUx>q6E>-r^Emk!iCR+X zdIaNH`$}7%57D1FyTccs3}Aq0<0Ei{`=S7*>pyg=Kv3nrqblqZcpsCWSQl^uMSsdj zYzh73?6th$c~CI0>%5@!Ej`o)Xm38u0fp9=HE@Sa6l2oX9^^4|Aq%GA z3(AbFR9gA_2T2i%Ck5V2Q2WW-(a&(j#@l6wE4Z`xg#S za#-UWUpU2U!TmIo`CN0JwG^>{+V#9;zvx;ztc$}@NlcyJr?q(Y`UdW6qhq!aWyB5xV1#Jb{I-ghFNO0 zFU~+QgPs{FY1AbiU&S$QSix>*rqYVma<-~s%ALhFyVhAYepId1 zs!gOB&weC18yhE-v6ltKZMV|>JwTX+X)Y_EI(Ff^3$WTD|Ea-1HlP;6L~&40Q&5{0 z$e$2KhUgH8ucMJxJV#M%cs!d~#hR^nRwk|uuCSf6irJCkSyI<%CR==tftx6d%;?ef zYIcjZrP@APzbtOeUe>m-TW}c-ugh+U*RbL1eIY{?>@8aW9bb1NGRy@MTse@>= za%;5=U}X%K2tKTYe9gjMcBvX%qrC&uZ`d(t)g)X8snf?vBe3H%dG=bl^rv8Z@YN$gd9yveHY0@Wt0$s zh^7jCp(q+6XDoekb;=%y=Wr8%6;z0ANH5dDR_VudDG|&_lYykJaiR+(y{zpR=qL3|2e${8 z2V;?jgHj7}Kl(d8C9xWRjhpf_)KOXl+@c4wrHy zL3#9U(`=N59og2KqVh>nK~g9>fX*PI0`>i;;b6KF|8zg+k2hViCt}4dfMdvb1NJ-Rfa7vL2;lPK{Lq*u`JT>S zoM_bZ_?UY6oV6Ja14X^;LqJPl+w?vf*C!nGK;uU^0GRN|UeFF@;H(Hgp8x^|;ygh? zIZx3DuO(lD01ksanR@Mn#lti=p28RTNYY6yK={RMFiVd~k8!@a&^jicZ&rxD3CCI! zVb=fI?;c#f{K4Pp2lnb8iF2mig)|6JEmU86Y%l}m>(VnI*Bj`a6qk8QL&~PFDxI8b z2mcsQBe9$q`Q$LfG2wdvK`M1}7?SwLAV&)nO;kAk`SAz%x9CDVHVbUd$O(*aI@D|s zLxJW7W(QeGpQY<$dSD6U$ja(;Hb3{Zx@)*fIQaW{8<$KJ&fS0caI2Py^clOq9@Irt z7th7F?7W`j{&UmM==Lo~T&^R7A?G=K_e-zfTX|)i`pLitlNE(~tq*}sS1x2}Jlul6 z5+r#4SpQu8h{ntIv#qCVH`uG~+I8l+7ZG&d`Dm!+(rZQDV*1LS^WfH%-!5aTAxry~ z4xl&rot5ct{xQ$w$MtVTUi6tBFSJWq2Rj@?HAX1H$eL*fk{Hq;E`x|hghRkipYNyt zKCO=*KSziiVk|+)qQCGrTYH9X!Z0$k{Nde~0Wl`P{}ca%nv<6fnYw^~9dYxTnTZB&&962jX0DM&wy&8fdxX8xeHSe=UU&Mq zRTaUKnQO|A>E#|PUo+F=Q@dMdt`P*6e92za(TH{5C*2I2S~p?~O@hYiT>1(n^Lqqn zqewq3ctAA%0E)r53*P-a8Ak32mGtUG`L^WVcm`QovX`ecB4E9X60wrA(6NZ7z~*_DV_e z8$I*eZ8m=WtChE{#QzeyHpZ%7GwFHlwo2*tAuloI-j2exx3#x7EL^&D;Re|Kj-XT- zt908^soV2`7s+Hha!d^#J+B)0-`{qIF_x=B811SZlbUe%kvPce^xu7?LY|C z@f1gRPha1jq|=f}Se)}v-7MWH9)YAs*FJ&v3ZT9TSi?e#jarin0tjPNmxZNU_JFJG z+tZi!q)JP|4pQ)?l8$hRaPeoKf!3>MM-bp06RodLa*wD=g3)@pYJ^*YrwSIO!SaZo zDTb!G9d!hb%Y0QdYxqNSCT5o0I!GDD$Z@N!8J3eI@@0AiJmD7brkvF!pJGg_AiJ1I zO^^cKe`w$DsO|1#^_|`6XTfw6E3SJ(agG*G9qj?JiqFSL|6tSD6vUwK?Cwr~gg)Do zp@$D~7~66-=p4`!!UzJDKAymb!!R(}%O?Uel|rMH>OpRGINALtg%gpg`=}M^Q#V5( zMgJY&gF)+;`e38QHI*c%B}m94o&tOfae;og&!J2;6ENW}QeL73jatbI1*9X~y=$Dm%6FwDcnCyMRL}zo`0=y7=}*Uw zo3!qZncAL{HCgY!+}eKr{P8o27ye+;qJP;kOB%RpSesGoHLT6tcYp*6v~Z9NCyb6m zP#qds0jyqXX46qMNhXDn3pyIxw2f_z;L_X9EIB}AhyC`FYI}G3$WnW>#NMy{0aw}nB%1=Z4&*(FaCn5QG(zvdG^pQRU25;{wwG4h z@kuLO0F->{@g2!;NNd!PfqM-;@F0;&wK}0fT9UrH}(8A5I zt33(+&U;CLN|8+71@g z(s!f-kZZZILUG$QXm9iYiE*>2w;gpM>lgM{R9vT3q>qI{ELO2hJHVi`)*jzOk$r)9 zq}$VrE0$GUCm6A3H5J-=Z9i*biw8ng zi<1nM0lo^KqRY@Asucc#DMmWsnCS;5uPR)GL3pL=-IqSd>4&D&NKSGHH?pG;=Xo`w zw~VV9ddkwbp~m>9G0*b?j7-0fOwR?*U#BE#n7A=_fDS>`fwatxQ+`FzhBGQUAyIRZ??eJt46vHBlR>9m!vfb6I)8!v6TmtZ%G6&E|1e zOtx5xy%yOSu+<9Ul5w5N=&~4Oph?I=ZKLX5DXO(*&Po>5KjbY7s@tp$8(fO|`Xy}Y z;NmMypLoG7r#Xz4aHz7n)MYZ7Z1v;DFHLNV{)to;(;TJ=bbMgud96xRMME#0d$z-S z-r1ROBbW^&YdQWA>U|Y>{whex#~K!ZgEEk=LYG8Wqo28NFv)!t!~}quaAt}I^y-m| z8~E{9H2VnyVxb_wCZ7v%y(B@VrM6lzk~|ywCi3HeiSV`TF>j+Ijd|p*kyn;=mqtf8&DK^|*f+y$38+9!sis9N=S)nINm9=CJ<;Y z!t&C>MIeyou4XLM*ywT_JuOXR>VkpFwuT9j5>667A=CU*{TBrMTgb4HuW&!%Yt`;#md7-`R`ouOi$rEd!ErI zo#>qggAcx?C7`rQ2;)~PYCw%CkS(@EJHZ|!!lhi@Dp$*n^mgrrImsS~(ioGak>3)w zvop0lq@IISuA0Ou*#1JkG{U>xSQV1e}c)!d$L1plFX5XDXX5N7Ns{kT{y5|6MfhBD+esT)e7&CgSW8FxsXTAY=}?0A!j_V9 zJ;IJ~d%av<@=fNPJ9)T3qE78kaz64E>dJaYab5uaU`n~Zdp2h{8DV%SKE5G^$LfuOTRRjB;TnT(Jk$r{Pfe4CO!SM_7d)I zquW~FVCpSycJ~c*B*V8?Qqo=GwU8CkmmLFugfHQ7;A{yCy1OL-+X=twLYg9|H=~8H znnN@|tCs^ZLlCBl5wHvYF}2vo>a6%mUWpTds_mt*@wMN4-r`%NTA%+$(`m6{MNpi@ zMx)8f>U4hd!row@gM&PVo&Hx+lV@$j9yWTjTue zG9n0DP<*HUmJ7ZZWwI2x+{t3QEfr6?T}2iXl=6e0b~)J>X3`!fXd9+2wc1%cj&F@Z zgYR|r5Xd5jy9;YW&=4{-0rJ*L5CgDPj9^3%bp-`HkyBs`j1iTUGD4?WilZ6RO8mIE z+~Joc?GID6K96dyuv(dWREK9Os~%?$$FxswxQsoOi8M?RnL%B~Lyk&(-09D0M?^Jy zWjP)n(b)TF<-|CG%!Vz?8Fu&6iU<>oG#kGcrcrrBlfZMVl0wOJvsq%RL9To%iCW@)#& zZAJWhgzYAq)#NTNb~3GBcD%ZZOc43!YWSyA7TD6xkk)n^FaRAz73b}%9d&YisBic(?mv=Iq^r%Ug zzHq-rRrhfOOF+yR=AN!a9*Rd#sM9ONt5h~w)yMP7Dl9lfpi$H0%GPW^lS4~~?vI8Z z%^ToK#NOe0ExmUsb`lLO$W*}yXNOxPe@zD*90uTDULnH6C?InP3J=jYEO2d)&e|mP z1DSd0QOZeuLWo*NqZzopA+LXy9)fJC00NSX=_4Mi1Z)YyZVC>C!g}cY(Amaj%QN+bev|Xxd2OPD zk!dfkY6k!(sDBvsFC2r^?}hb81(WG5Lt9|riT`2?P;B%jaf5UX<~OJ;uAL$=Ien+V zC!V8u0v?CUa)4*Q+Q_u zkx{q;NjLcvyMuU*{+uDsCQ4U{JLowYby-tn@hatL zy}X>9y08#}oytdn^qfFesF)Tt(2!XGw#r%?7&zzFFh2U;#U9XBO8W--#gOpfbJ`Ey z|M8FCKlWQrOJwE;@Sm02l9OBr7N}go4V8ur)}M@m2uWjggb)DC4s`I4d7_8O&E(j; z?3$9~R$QDxNM^rNh9Y;6P7w+bo2q}NEd6f&_raor-v`UCaTM3TT8HK2-$|n{N@U>_ zL-`P7EXoEU5JRMa)?tNUEe8XFis+w8g9k(QQ)%?&Oac}S`2V$b?%`DwXBgja&&fR@ zH_XidF$p1wA)J|Wk1;?lCl?fgc)=TB3>Y8;BoMqHwJqhL)Tgydv9(?(TBX)fq%=~C zmLj!iX-kn7QA(9snzk0LRf<%SzO&~IhLor6A3f*U^UcoAygRe!H#@UCv$JUP&vPxs zeDj$1%#<2T1!e|!7xI+~_VXLl5|jHqvOhU7ZDUGee;HnkcPP=_k_FFxPjXg*9KyI+ zIh0@+s)1JDSuKMeaDZ3|<_*J8{TUFDLl|mXmY8B>Wj_?4mC#=XjsCKPEO=p0c&t&Z zd1%kHxR#o9S*C?du*}tEHfAC7WetnvS}`<%j=o7YVna)6pw(xzkUi7f#$|^y4WQ{7 zu@@lu=j6xr*11VEIY+`B{tgd(c3zO8%nGk0U^%ec6h)G_`ki|XQXr!?NsQkxzV6Bn1ea9L+@ z(Zr7CU_oXaW>VOdfzENm+FlFQ7Se0ROrNdw(QLvb6{f}HRQ{$Je>(c&rws#{dFI^r zZ4^(`J*G0~Pu_+p5AAh>RRpkcbaS2a?Fe&JqxDTp`dIW9;DL%0wxX5;`KxyA4F{(~_`93>NF@bj4LF!NC&D6Zm+Di$Q-tb2*Q z&csGmXyqA%Z9s(AxNO3@Ij=WGt=UG6J7F;r*uqdQa z?7j!nV{8eQE-cwY7L(3AEXF3&V*9{DpSYdyCjRhv#&2johwf{r+k`QB81%!aRVN<& z@b*N^xiw_lU>H~@4MWzgHxSOGVfnD|iC7=hf0%CPm_@@4^t-nj#GHMug&S|FJtr?i z^JVrobltd(-?Ll>)6>jwgX=dUy+^n_ifzM>3)an3iOzpG9Tu;+96TP<0Jm_PIqof3 zMn=~M!#Ky{CTN_2f7Y-i#|gW~32RCWKA4-J9sS&>kYpTOx#xVNLCo)A$LUme^fVNH z@^S7VU^UJ0YR8?Oy$^IYuG*bm|g;@aX~i60%`7XLy*AYpYvZ^F^U(!|RW z*C!rJ@+7TGdL=nNd1gv^%B+;Fcr$y)i0!GRsZXRHPs>QVGVR{9r_#&Qd(wL|5;H;> zD>HUw=4CF++&{7$<8G@j*nGjhEO%BQYfjeItp4mPvY*JYb1HKd!{HJ9*)(3%BR%{Pp?AM&*yHAJsW({ivOzj*qS!-7|XEn6@zo z3L*tBT%<4RxoAh>q{0n_JBmgW6&8hx?kL(_^k%VL>?xjAyrKBmSl`$=V|SK}ELl}@ zd|d0eo#RfG`bw9SK3%r4Y+rdvc}w}~ixV%tqawbdqvE-WcgE+BUpxMT%F@btm76MG zn=oQRWWuTm+a{dy)Oc2V4yX(@M{QAkx>(QB59*`dLT`Pz3Lsj9iB=HSHAiCq()ns|Cr)1*c605Cx}3V&x}Lg?b+6Q?)z7Kl zQh&1Hx`y6JY-Cwvd*ozeps}a1xAA0CR+Da;+O(i)P1C;SjOI}Dtmf6tPqo-Bl`U78 zv$kYgPntPp@G)n1an9tEoL*Vumu9`>_@I(;+5+fBa-*?fEx=mTEjZ7wq}#@Gd5_cW z!mP{N=yqEntDo)|>oy6{9cu+-3*GTnmb^`O0^FzRPO^&aG`f@F_R*aQ_e{F+_9%NW z4KG_B`@X3EVV9L>?_RNDMddA>w=e0KfAiw5?#i1NFT%Zz#nuv(&!yIU>lVxmzYKQ` zzJ*0w9<&L4aJ6A;0j|_~i>+y(q-=;2Xxhx2v%CYY^{} z^J@LO()eLo|7!{ghQ+(u$wxO*xY#)cL(|miH2_ck2yN{mu4O9=hBW*pM_()-_YdH#Ru{JtwJ^R2}3?!>>m1pohh zrn(!xCjE0Q&EH1QK?zA%sxVh&H99cObJUY$veZhQ)MLu-h%`!*G)s$2k;~+A z)Kk->Ri?`oGDEJEtI*wijm(s5f$W78FH{+qBxiU{~kq((J3uK{m z$|C8K#j-?hm8H@x%VfFqpnvu@xn1s%J7uNZC9C99a<_b1J|mx%)$%!6gPU|~<@2&m zz99GDp`|a%m*iggvfL;4%X;~WY>)@!tMWB@P`)k?$;0x9JSrRI8?s3rlgH(o@`OAo zn{f*gZ#t2u6K??hx|aElOM`Xd0t+SAIUEHvFw%?Wsm$s zUXq{6UU?a>Nc@@Xlb_2k9M1Ctr<#+O?yd}rv z_wu&=_t$!Yngd@N_AUj}T; z#*Ce|%XZr_sQcsWcsl{pCnnj+c8ZNIMmx<;w=-g$Q>BU;9k;w|zQ;4!W32Xg2Cd?{ zvmO3kuKQ^Hv;o>6ZHP8ZJ2`4~Bx?N;cf<0fi=!*G^^WzbTF3e$b&d^qqB{>nqLG81 zs94bBh%|Vj+hLu=!8(b9brJ>ZBns9^6s(gdSVyP9qnu2_I{Sg8j-rloG6{d`De5We zDe5WeY3ga}Y3ga}Y3ga}Y3ga}Y3ga}d8y~6o|k%F>UpW>rJk31Ug~+N=cS&HdOqs; zsOO`ek9t1p`Kafko{xGy>iMbXr=FjBxZMYc8a#gL`Kjlpo}YSt>iMY`pk9DF0qO*( z6QE9jIsxhgs1u-0kUBx8D@eT{^@7w3QZGooAoYUO3sNscy%6<6)C*BBM7L`dk$Xk%6}eZQXgo#!75P`>Uy*-B{uTLGUy*-B{uTLGUy*-B{uTLG))v8{5gt_uj9!t5)^yb-JtjRGrhi zYInOUNJxNyf_yKX01)K=WP|Si>HqEj|B{eUl?MR<)%<1&{(~)D+NPwKxWqT-@~snp zg9KCz1VTZDiS?UH`PRk1VPM{29cgT9=D?!Wc_@}qzggFv;gb@2cJQAYWWtpEZ7?y@jSVqjx${B5UV@SO|wH<<0; z{><1KdVI%Ki}>~<`46C0AggwUwx-|QcU;iiZ{NZu`ur>hd*|Hb(|6veERqxu=b@5Bab=rqptGxd{QJg!4*-i_$sES~)AB46}Fjg|ea#e@?J}z%CUJ zOsLWRQR1#ng^sD)A4FDuY!iUhzlgfJh(J@BRqd&P#v2B`+saBx>m+M&q7vk-75$NH%T5pi%m z5FX?`2-5l53=a&GkC9^NZCLpN5(DMKMwwab$FDIs?q>4!!xBS}75gX_5;(luk;3Vl zLCLd5a_8`Iyz}K}+#RMwu6DVk3O_-}n>aE!4NaD*sQn`GxY?cHe!Bl9n?u&g6?aKm z-P8z&;Q3gr;h`YIxX%z^o&GZZg1=>_+hP2$$-DnL_?7?3^!WAsY4I7|@K;aL<>OTK zByfjl2PA$T83*LM9(;espx-qB%wv7H2i6CFsfAg<9V>Pj*OpwX)l?^mQfr$*OPPS$ z=`mzTYs{*(UW^ij1U8UfXjNoY7GK*+YHht(2oKE&tfZuvAyoN(;_OF>-J6AMmS5fB z^sY6wea&&${+!}@R1f$5oC-2J>J-A${@r(dRzc`wnK>a7~8{Y-scc|ETOI8 zjtNY%Y2!PI;8-@a=O}+{ap1Ewk0@T`C`q!|=KceX9gK8wtOtIC96}-^7)v23Mu;MH zhKyLGOQMujfRG$p(s`(2*nP4EH7*J57^=|%t(#PwCcW7U%e=8Jb>p6~>RAlY4a*ts=pl}_J{->@kKzxH|8XQ5{t=E zV&o`$D#ZHdv&iZWFa)(~oBh-Osl{~CS0hfM7?PyWUWsr5oYlsyC1cwULoQ4|Y5RHA2*rN+EnFPnu z`Y_&Yz*#550YJwDy@brZU>0pWV^RxRjL221@2ABq)AtA%Cz?+FG(}Yh?^v)1Lnh%D zeM{{3&-4#F9rZhS@DT0E(WRkrG!jC#5?OFjZv*xQjUP~XsaxL2rqRKvPW$zHqHr8Urp2Z)L z+)EvQeoeJ8c6A#Iy9>3lxiH3=@86uiTbnnJJJoypZ7gco_*HvKOH97B? zWiwp>+r}*Zf9b3ImxwvjL~h~j<<3shN8$k-$V1p|96I!=N6VBqmb==Bec|*;HUg?) z4!5#R*(#Fe)w%+RH#y{8&%%!|fQ5JcFzUE;-yVYR^&Ek55AXb{^w|@j|&G z|6C-+*On%j;W|f8mj?;679?!qY86c{(s1-PI2Wahoclf%1*8%JAvRh1(0)5Vu37Iz z`JY?RW@qKr+FMmBC{TC7k@}fv-k8t6iO}4K-i3WkF!Lc=D`nuD)v#Na zA|R*no51fkUN3^rmI;tty#IK284*2Zu!kG13!$OlxJAt@zLU`kvsazO25TpJLbK&;M8kw*0)*14kpf*)3;GiDh;C(F}$- z1;!=OBkW#ctacN=je*Pr)lnGzX=OwgNZjTpVbFxqb;8kTc@X&L2XR0A7oc!Mf2?u9 zcctQLCCr+tYipa_k=;1ETIpHt!Jeo;iy^xqBES^Ct6-+wHi%2g&)?7N^Yy zUrMIu){Jk)luDa@7We5U!$$3XFNbyRT!YPIbMKj5$IEpTX1IOtVP~(UPO2-+9ZFi6 z-$3<|{Xb#@tABt0M0s1TVCWKwveDy^S!!@4$s|DAqhsEv--Z}Dl)t%0G>U#ycJ7cy z^8%;|pg32=7~MJmqlC-x07Sd!2YX^|2D`?y;-$a!rZ3R5ia{v1QI_^>gi(HSS_e%2 zUbdg^zjMBBiLr8eSI^BqXM6HKKg#@-w`a**w(}RMe%XWl3MipvBODo*hi?+ykYq)z ziqy4goZw0@VIUY65+L7DaM5q=KWFd$;W3S!Zi>sOzpEF#(*3V-27N;^pDRoMh~(ZD zJLZXIam0lM7U#)119Hm947W)p3$%V`0Tv+*n=&ybF&}h~FA}7hEpA&1Y!BiYIb~~D z$TSo9#3ee02e^%*@4|*+=Nq6&JG5>zX4k5f?)z*#pI-G(+j|jye%13CUdcSP;rNlY z#Q!X%zHf|V)GWIcEz-=fW6AahfxI~y7w7i|PK6H@@twdgH>D_R@>&OtKl}%MuAQ7I zcpFmV^~w~8$4@zzh~P~+?B~%L@EM3x(^KXJSgc6I=;)B6 zpRco2LKIlURPE*XUmZ^|1vb?w*ZfF}EXvY13I4af+()bAI5V?BRbFp`Sb{8GRJHd* z4S2s%4A)6Uc=PK%4@PbJ<{1R6+2THMk0c+kif**#ZGE)w6WsqH z`r^DL&r8|OEAumm^qyrryd(HQ9olv$ltnVGB{aY?_76Uk%6p;e)2DTvF(;t=Q+|8b zqfT(u5@BP);6;jmRAEV057E*2d^wx@*aL1GqWU|$6h5%O@cQtVtC^isd%gD7PZ_Io z_BDP5w(2*)Mu&JxS@X%%ByH_@+l>y07jIc~!@;Raw)q_;9oy@*U#mCnc7%t85qa4? z%_Vr5tkN^}(^>`EFhag;!MpRh!&bKnveQZAJ4)gEJo1@wHtT$Gs6IpznN$Lk-$NcM z3ReVC&qcXvfGX$I0nfkS$a|Pm%x+lq{WweNc;K>a1M@EAVWs2IBcQPiEJNt}+Ea8~WiapASoMvo(&PdUO}AfC~>ZGzqWjd)4no( ziLi#e3lOU~sI*XPH&n&J0cWfoh*}eWEEZW%vX?YK!$?w}htY|GALx3;YZoo=JCF4@ zdiaA-uq!*L5;Yg)z-_`MciiIwDAAR3-snC4V+KA>&V%Ak;p{1u>{Lw$NFj)Yn0Ms2*kxUZ)OTddbiJM}PK!DM}Ot zczn?EZXhx3wyu6i{QMz_Ht%b?K&-@5r;8b076YDir`KXF0&2i9NQ~#JYaq*}Ylb}^ z<{{6xy&;dQ;|@k_(31PDr!}}W$zF7Jv@f%um0M$#=8ygpu%j(VU-d5JtQwT714#f0z+Cm$F9JjGr_G!~NS@L9P;C1? z;Ij2YVYuv}tzU+HugU=f9b1Wbx3418+xj$RKD;$gf$0j_A&c;-OhoF*z@DhEW@d9o zbQBjqEQnn2aG?N9{bmD^A#Um6SDKsm0g{g_<4^dJjg_l_HXdDMk!p`oFv8+@_v_9> zq;#WkQ!GNGfLT7f8m60H@$tu?p;o_It#TApmE`xnZr|_|cb3XXE)N^buLE`9R=Qbg zXJu}6r07me2HU<)S7m?@GzrQDTE3UH?FXM7V+-lT#l}P(U>Fvnyw8T7RTeP`R579m zj=Y>qDw1h-;|mX-)cSXCc$?hr;43LQt)7z$1QG^pyclQ1Bd!jbzsVEgIg~u9b38;> zfsRa%U`l%did6HzPRd;TK{_EW;n^Ivp-%pu0%9G-z@Au{Ry+EqEcqW=z-#6;-!{WA z;l+xC6Zke>dl+(R1q7B^Hu~HmrG~Kt575mzve>x*cL-shl+zqp6yuGX)DDGm`cid! znlnZY=+a5*xQ=$qM}5$N+o!^(TqTFHDdyCcL8NM4VY@2gnNXF|D?5a558Lb*Yfm4) z_;0%2EF7k{)i(tTvS`l5he^KvW%l&-suPwpIlWB_Za1Hfa$@J!emrcyPpTKKM@NqL z?X_SqHt#DucWm<3Lp}W|&YyQE27zbGP55=HtZmB(k*WZA79f##?TweCt{%5yuc+Kx zgfSrIZI*Y57FOD9l@H0nzqOu|Bhrm&^m_RK6^Z<^N($=DDxyyPLA z+J)E(gs9AfaO`5qk$IGGY+_*tEk0n_wrM}n4G#So>8Dw6#K7tx@g;U`8hN_R;^Uw9JLRUgOQ?PTMr4YD5H7=ryv)bPtl=<&4&% z*w6k|D-%Tg*F~sh0Ns(h&mOQ_Qf{`#_XU44(VDY8b})RFpLykg10uxUztD>gswTH} z&&xgt>zc(+=GdM2gIQ%3V4AGxPFW0*l0YsbA|nFZpN~ih4u-P!{39d@_MN)DC%d1w z7>SaUs-g@Hp7xqZ3Tn)e z7x^sC`xJ{V<3YrmbB{h9i5rdancCEyL=9ZOJXoVHo@$$-%ZaNm-75Z-Ry9Z%!^+STWyv~To>{^T&MW0-;$3yc9L2mhq z;ZbQ5LGNM+aN628)Cs16>p55^T^*8$Dw&ss_~4G5Go63gW^CY+0+Z07f2WB4Dh0^q z-|6QgV8__5>~&z1gq0FxDWr`OzmR}3aJmCA^d_eufde7;d|OCrKdnaM>4(M%4V`PxpCJc~UhEuddx9)@)9qe_|i z)0EA%&P@_&9&o#9eqZCUCbh?`j!zgih5sJ%c4(7_#|Xt#r7MVL&Q+^PQEg3MBW;4T zG^4-*8L%s|A}R%*eGdx&i}B1He(mLygTmIAc^G(9Si zK7e{Ngoq>r-r-zhyygK)*9cj8_%g z)`>ANlipCdzw(raeqP-+ldhyUv_VOht+!w*>Sh+Z7(7(l=9~_Vk ztsM|g1xW`?)?|@m2jyAgC_IB`Mtz(O`mwgP15`lPb2V+VihV#29>y=H6ujE#rdnK` zH`EaHzABs~teIrh`ScxMz}FC**_Ii?^EbL(n90b(F0r0PMQ70UkL}tv;*4~bKCiYm zqngRuGy`^c_*M6{*_~%7FmOMquOEZXAg1^kM`)0ZrFqgC>C%RJvQSo_OAA(WF3{euE}GaeA?tu5kF@#62mM$a051I zNhE>u>!gFE8g#Jj95BqHQS%|>DOj71MZ?EYfM+MiJcX?>*}vKfGaBfQFZ3f^Q-R1# znhyK1*RvO@nHb|^i4Ep_0s{lZwCNa;Ix<{E5cUReguJf+72QRZIc%`9-Vy)D zWKhb?FbluyDTgT^naN%l2|rm}oO6D0=3kfXO2L{tqj(kDqjbl(pYz9DykeZlk4iW5 zER`)vqJxx(NOa;so@buE!389-YLbEi@6rZG0#GBsC+Z0fzT6+d7deYVU;dy!rPXiE zmu73@Jr&~K{-9MVQD}&`)e>yLNWr>Yh8CXae9XqfvVQ&eC_;#zpoaMxZ0GpZz7xjx z`t_Q-F?u=vrRPaj3r<9&t6K=+egimiJ8D4gh-rUYvaVy zG($v+3zk5sMuOhjxkH7bQ}(5{PD3Mg?!@8PkK&w>n7tO8FmAmoF30_#^B~c(Q_`4L zYWOoDVSnK|1=p{+@`Fk^Qb81Xf89_S`RSTzv(a4ID%71nll%{Wad$!CKfeTKkyC?n zCkMKHU#*nz_(tO$M)UP&ZfJ#*q(0Gr!E(l5(ce<3xut+_i8XrK8?Xr7_oeHz(bZ?~8q5q~$Rah{5@@7SMN zx9PnJ-5?^xeW2m?yC_7A#WK*B@oIy*Y@iC1n7lYKj&m7vV;KP4TVll=II)$39dOJ^czLRU>L> z68P*PFMN+WXxdAu=Hyt3g$l(GTeTVOZYw3KY|W0Fk-$S_`@9`K=60)bEy?Z%tT+Iq z7f>%M9P)FGg3EY$ood+v$pdsXvG? zd2q3abeu-}LfAQWY@=*+#`CX8RChoA`=1!hS1x5dOF)rGjX4KFg!iPHZE2E=rv|A} zro(8h38LLFljl^>?nJkc+wdY&MOOlVa@6>vBki#gKhNVv+%Add{g6#-@Z$k*ps}0Y zQ=8$)+Nm||)mVz^aa4b-Vpg=1daRaOU)8@BY4jS>=5n#6abG@(F2`=k-eQ9@u# zxfNFHv=z2w@{p1dzSOgHokX1AUGT0DY4jQI@YMw)EWQ~q5wmR$KQ}Y;(HPMSQCwzu zdli|G?bj(>++CP)yQ4s6YfpDc3KqPmquQSxg%*EnTWumWugbDW5ef%8j-rT#3rJu? z)5n;4b2c*;2LIW%LmvUu6t1~di~}0&Svy}QX#ER|hDFZwl!~zUP&}B1oKAxIzt~so zb!GaJYOb#&qRUjEI1xe_`@7qv_-LggQ$JE8+{ryT4%ldwC5ete+{G3C#g@^oxfY3#F zcLlj(l2G8>tC<5XWV|6_DZQZ7ow?MD8EZ9mM2oV~WoV-uoExmbwpzc6eMV}%J_{3l zW(4t2a-o}XRlU|NSiYn!*nR(Sc>*@TuU*(S77gfCi7+WR%2b;4#RiyxWR3(u5BIdf zo@#g4wQjtG3T$PqdX$2z8Zi|QP~I^*9iC+(!;?qkyk&Q7v>DLJGjS44q|%yBz}}>i z&Ve%^6>xY<=Pi9WlwpWB%K10Iz`*#gS^YqMeV9$4qFchMFO}(%y}xs2Hn_E}s4=*3 z+lAeCKtS}9E{l(P=PBI;rsYVG-gw}-_x;KwUefIB@V%RLA&}WU2XCL_?hZHoR<7ED zY}4#P_MmX(_G_lqfp=+iX|!*)RdLCr-1w`4rB_@bI&Uz# z!>9C3&LdoB$r+O#n);WTPi;V52OhNeKfW6_NLnw zpFTuLC^@aPy~ZGUPZr;)=-p|b$-R8htO)JXy{ecE5a|b{{&0O%H2rN&9(VHxmvNly zbY?sVk}@^{aw)%#J}|UW=ucLWs%%j)^n7S%8D1Woi$UT}VuU6@Sd6zc2+t_2IMBxd zb4R#ykMr8s5gKy=v+opw6;4R&&46$V+OOpDZwp3iR0Osqpjx))joB*iX+diVl?E~Q zc|$qmb#T#7Kcal042LUNAoPTPUxF-iGFw>ZFnUqU@y$&s8%h-HGD`EoNBbe#S>Y-4 zlkeAP>62k~-N zHQqXXyN67hGD6CxQIq_zoepU&j0 zYO&}<4cS^2sp!;5))(aAD!KmUED#QGr48DVlwbyft31WlS2yU<1>#VMp?>D1BCFfB z_JJ-kxTB{OLI}5XcPHXUo}x~->VP%of!G_N-(3Snvq`*gX3u0GR&}*fFwHo3-vIw0 zeiWskq3ZT9hTg^je{sC^@+z3FAd}KNhbpE5RO+lsLgv$;1igG7pRwI|;BO7o($2>mS(E z$CO@qYf5i=Zh6-xB=U8@mR7Yjk%OUp;_MMBfe_v1A(Hqk6!D})x%JNl838^ZA13Xu zz}LyD@X2;5o1P61Rc$%jcUnJ>`;6r{h5yrEbnbM$$ntA@P2IS1PyW^RyG0$S2tUlh z8?E(McS?7}X3nAAJs2u_n{^05)*D7 zW{Y>o99!I9&KQdzgtG(k@BT|J*;{Pt*b|?A_})e98pXCbMWbhBZ$t&YbNQOwN^=F) z_yIb_az2Pyya2530n@Y@s>s>n?L79;U-O9oPY$==~f1gXro5Y z*3~JaenSl_I}1*&dpYD?i8s<7w%~sEojqq~iFnaYyLgM#so%_ZZ^WTV0`R*H@{m2+ zja4MX^|#>xS9YQo{@F1I)!%RhM{4ZUapHTKgLZLcn$ehRq(emb8 z9<&Nx*RLcS#)SdTxcURrJhxPM2IBP%I zf1bWu&uRf{60-?Gclb5(IFI*!%tU*7d`i!l@>TaHzYQqH4_Y*6!Wy0d-B#Lz7Rg3l zqKsvXUk9@6iKV6#!bDy5n&j9MYpcKm!vG7z*2&4G*Yl}iccl*@WqKZWQSJCgQSj+d ze&}E1mAs^hP}>`{BJ6lv*>0-ft<;P@`u&VFI~P3qRtufE11+|#Y6|RJccqo27Wzr}Tp|DH z`G4^v)_8}R24X3}=6X&@Uqu;hKEQV^-)VKnBzI*|Iskecw~l?+R|WKO*~(1LrpdJ? z0!JKnCe<|m*WR>m+Qm+NKNH<_yefIml z+x32qzkNRrhR^IhT#yCiYU{3oq196nC3ePkB)f%7X1G^Ibog$ZnYu4(HyHUiFB`6x zo$ty-8pknmO|B9|(5TzoHG|%>s#7)CM(i=M7Nl=@GyDi-*ng6ahK(&-_4h(lyUN-oOa$` zo+P;C4d@m^p9J4c~rbi$rq9nhGxayFjhg+Rqa{l#`Y z!(P6K7fK3T;y!VZhGiC#)|pl$QX?a)a9$(4l(usVSH>2&5pIu5ALn*CqBt)9$yAl; z-{fOmgu><7YJ5k>*0Q~>lq72!XFX6P5Z{vW&zLsraKq5H%Z26}$OKDMv=sim;K?vsoVs(JNbgTU8-M%+ zN(+7Xl}`BDl=KDkUHM9fLlV)gN&PqbyX)$86!Wv!y+r*~kAyjFUKPDWL3A)m$@ir9 zjJ;uQV9#3$*`Dqo1Cy5*;^8DQcid^Td=CivAP+D;gl4b7*xa9IQ-R|lY5tIpiM~9- z%Hm9*vDV@_1FfiR|Kqh_5Ml0sm?abD>@peo(cnhiSWs$uy&$RYcd+m`6%X9FN%?w}s~Q=3!pJzbN~iJ}bbM*PPi@!E0eN zhKcuT=kAsz8TQo76CMO+FW#hr6da({mqpGK2K4T|xv9SNIXZ}a=4_K5pbz1HE6T}9 zbApW~m0C`q)S^F}B9Kw5!eT)Bj_h9vlCX8%VRvMOg8PJ*>PU>%yt-hyGOhjg!2pZR4{ z=VR_*?Hw|aai##~+^H>3p$W@6Zi`o4^iO2Iy=FPdEAI58Ebc~*%1#sh8KzUKOVHs( z<3$LMSCFP|!>fmF^oESZR|c|2JI3|gucuLq4R(||_!8L@gHU8hUQZKn2S#z@EVf3? zTroZd&}JK(mJLe>#x8xL)jfx$6`okcHP?8i%dW?F%nZh=VJ)32CmY;^y5C1^?V0;M z<3!e8GZcPej-h&-Osc>6PU2f4x=XhA*<_K*D6U6R)4xbEx~{3*ldB#N+7QEXD^v=I z+i^L+V7_2ld}O2b-(#bmv*PyZI4|U#Q5|22a(-VLOTZc3!9ns1RI-? zA<~h|tPH0y*bO1#EMrsWN>4yJM7vqFZr?uw$H8*PhiHRQg1U9YoscX-G|gck+SSRX!(e7@~eeUEw+POsT;=W9J&=EV`cUc{PIg_#TQVGnZsQbCs7#Q-)v#BicxLw#Fb?#)8TYbu zN)5R=MI1i7FHhF|X}xEl=sW~`-kf;fOR^h1yjthSw?%#F{HqrY2$q>7!nbw~nZ8q9 zh{vY! z%i=H!!P&wh z7_E%pB7l5)*VU>_O-S~d5Z!+;f{pQ4e86*&);?G<9*Q$JEJ!ZxY;Oj5&@^eg0Zs!iLCAR`2K?MSFzjX;kHD6)^`&=EZOIdW>L#O`J zf~$M4}JiV}v6B-e{NUBGFgj-*H%NG zfY0X(@|S8?V)drF;2OQcpDl2LV=~=%gGx?_$fbSsi@%J~taHcMTLLpjNF8FkjnjyM zW;4sSf6RHaa~LijL#EJ0W2m!BmQP(f=%Km_N@hsBFw%q#7{Er?y1V~UEPEih87B`~ zv$jE%>Ug9&=o+sZVZL7^+sp)PSrS;ZIJac4S-M>#V;T--4FXZ*>CI7w%583<{>tb6 zOZ8gZ#B0jplyTbzto2VOs)s9U%trre`m=RlKf{I_Nwdxn(xNG%zaVNurEYiMV3*g| z``3;{j7`UyfFrjlEbIJN{0db|r>|LA@=vX9CHFZYiexnkn$b%8Rvw0TZOQIXa;oTI zv@j;ZP+#~|!J(aBz9S{wL7W%Dr1H)G-XUNt9-lP?ijJ-XEj1e*CI~-Xz@4(Xg;UoG z{uzBf-U+(SHe}6oG%;A*93Zb=oE>uTb^%qsL>|bQf?7_6=KIiPU`I|r;YcZ!YG7y~ zQu@UldAwz$^|uoz3mz1;An-WVBtefSh-pv<`n&TU3oM!hrEI?l@v8A4#^$4t&~T32 zl*J=1q~h+60sNc43>0aVvhzyfjshgPYZoQ(OOh>LbUIoblb@1z~zp?))n?^)q6WGuDh}gMUaA9|X z3qq-XlcNldy5==T4rq*~g@XVY!9sYZjo#R7 zr{n)r5^S{9+$+8l7IVB*3_k5%-TBY@C%`P@&tZf>82sm#nfw7L%92>nN$663yW!yt zhS>EfLcE_Z)gv-Y^h1;xj(<4nD4GY{C-nWUgQc9cMmH{qpa!uEznrGF^?bbJHApScQ$j>$JZHAX80DdXu z--AMgrA0$Otdd#N9#!cg2Z~N8&lj1d+wDh+^ZObWJ$J)_h(&2#msu>q0B$DEERy{1 zCJN{7M@%#E@8pda`@u!v@{gcT3bA*>g*xYLXlbb&o@1vX*x+l}Voys6o~^_7>#GB| z*r!R%kA9k%J`?m>1tMHB9x$ZRe0$r~ui}X}jOC)9LH=Po*2SLdtf3^4?VKnu2ox&mV~0oDgi` z;9d}P$g~9%ThTK8s}5ow2V4?(-lU*ed8ro|}mU}pk% z;bqB0bx3AOk<0Joeh}Vl@_7Po&C`Cg>>gff>e7fu41U3Ic{JQu1W%+!Gvz3GDO2ixKd;KF6UEw8F_cDAh08gB>@ zaRH2Q96sBJ>`4aXvrF0xPtIWoA1pPsRQtU~xDtnEfTJnl{A9u5pR^K8=UdNq%T8F$)FbN> zgK+_(BF#D>R>kK!M#OT~=@@}3yAYqm33?{Bv?2iBr|-aRK0@uapzuXI)wE0=R@m^7 zQ`wLBn(M*wg!mgmQT1d!@3<2z>~rmDW)KG0*B4>_R6LjiI0^9QT8gtDDT|Lclxppm z+OeL6H3QpearJAB%1ellZ6d*)wBQ(hPbE=%?y6i^uf%`RXm*JW*WQ%>&J+=V(=qf{ zri~yItvTZbII+7S0>4Q0U9@>HnMP$X>8TqAfD(vAh};2P{QK)ik`a6$W$nG<{bR2Ufd!^iE z#1K58$gW!xpeYHeehuhQCXZ9p%N8m zB+l~T_u-Ycr!U>!?xu!!*6rNxq37{`DhMMfY6NpD3Jw zkYQDstvt30Hc_SaZuuMP2YrdW@HsPMbf^Y9lI<9$bnMil2X7`Ba-DGLbzgqP>mxwe zf1&JkDH54D3nLar2KjJ3z`*R+rUABq4;>>4Kjc2iQEj7pVLcZYZ~pteAG4rm1{>PQy=!QiV5G|tVk)53 zP?Azw+N)Yq3zZ`dW7Q9Bq@Y*jSK0<1f`HM;_>GH57pf_S%Ounz_yhTY8lplQSM`xx zU{r-Deqs+*I~sLI$Oq`>i`J1kJ(+yNOYy$_>R3Jfi680<|^u#J@aY%Q>O zqfI~sCbk#3--^zMkV&Yj0D(R^rK}+_npgPr_4^kYuG=pO%$C_7v{s@-{M-P@RL3^<`kO@b=YdKMuccfO1ZW# zeRYE%D~CMAgPlo?T!O6?b|pOZv{iMWb;sN=jF%=?$Iz_5zH?K;aFGU^8l7u%zHgiy z%)~y|k;Es-7YX69AMj^epGX#&^c@pp+lc}kKc`5CjPN4Z$$e58$Yn*J?81%`0~A)D zPg-db*pj-t4-G9>ImW4IMi*v#9z^9VD9h@9t;3jMAUVxt=oor+16yHf{lT|G4 zya6{4#BxFw!!~UTRwXXawKU4iz$$GMY6=Z8VM{2@0{=5A0+A#p6$aT3ubRyWMWPq9 zCEH5(Il0v4e4=Yxg(tDglfYAy!UpC>&^4=x7#6_S&Ktds)a8^`^tp6RnRd{KImB^o z2n=t#>iKx<*evmvoE{+fH#@WXGWs$)Uxrtf?r>AaxV0?kf0o@oDboJ6z0cgP@A$;k>SK1UqC?Q_ zk_I?j74;}uNXhOf_5ZxQSgB4otDEb9JJrX1kq`-o%T>g%M5~xXf!2_4P~K64tKgXq z&KHZ0@!cPvUJG4kw-0;tPo$zJrU-Nop>Uo65Pm|yaNvKjhi7V1g98;^N1~V3% zTR>yWa+X2FJ_wpPwz3i^6AGwOa_VMS-&`*KoKgF2&oR10Jn6{!pvVG@n=Jk@vjNuY zL~P7aDGhg~O9G^!bHi$8?G9v9Gp0cmekYkK;(q=47;~gI>h-kx-ceM{ml$#8KI$4ltyjaqP zki^cyDERloAb)dcDBU4na9C(pfD{P@eBGA}0|Rb)p{ISqi60=^FUEdF!ok{Gs;vb) zfj9(#1QA64w*ud^YsN5&PeiI>c`VioE8h)e}W%S9NMA55Gs zrWL6l+@3CKd@8(UQLTwe12SGWMqRn+j)QZRj*g)Xua)%ayzpqs{pD(WWESJYL3{M$ z%qkpM`jFoqLYVv6{IbCkL?fEiJj$VG=$taup&RL9e{s(Sgse2xVJlw0h74EXJKt2eX|dxz{->0)3W`JN7Bv!rLvRZc z0tAOZ2yVe4g9iq826qXAg`f!*+}(o1;1FDb>kKexumFS40KvK0yH1_@Z=LgWZ+}(Y zwYsa;OLz6tTA%gS=>8$=Z7pLh>|K2QElL)E=Q*(n*H`8R`8={-@4mTD-SWBOYRxV? zmF(-rJB8^Wlp?319rTrh^?QEP?|Msxrv?WbJ-+id+V#F2Y4(JPJ6U9bv+U1cIIH^W z)lg$_=g^Ma>2~Pyd_YOAv29Cb-U6DJO?NxnW7~QP*SmYi*vdUVuW#LWQ_u0`hymZi zaQS3Nb^4`ro$>0G%zbXmr5|D|iq0R<;S@?kr0j5Ruq87-Z1>crx%EzVZ9#U;{?}ti zW2W%*9MQg3Nbh%Ti6LhDd|-aFSgXoPG`mHlUU1iCHr>ru>DX?W_#13(`u*!Plu2OP z6jk=2>BC0l)aw;HCmxoYD1i4b%m$1`DYC_^L~ zIEAnFcHvad=-aO3(_MI=9#`z6-9*_!&$?<%meb5;jGd5Qp=MGf z6BD{%`L#TAOq%z%@*ib95Ey7NbUF=BlszVk3Iu3imD&*91N-ij%hW?W@~2TtdHTfP z#n0@Xd7X8Dyu36n{k#PwQ~T~X7mAO^cNV+z<HO@3X-# z_@rAn$k~(l@kciCC;&Qd*fWRI>=;fL{UPlciNDWyj$bX<#r^(r;EE8wwUVQm&7~QY zCXRj!**r^xybAEPq>h3W$uvI1j=yNIyzkE_D7fpGw)OV{U*Uwm{xB;mEg2(|y|ICd zMdQVqzMb-=XM6|E-a9kNh)^9lY`-DjhhHD1w5lufRcy+QLgJ47!fFne86#F; zX{ufroVBEZJOY?rDo!;Te6aOZ^1SO!dYRxQ*2njyA~dCWawn)>!*k7~>8Ikt&e*0>>V5ZbO|*1+2LFOqVe zXHb!aMk03^h%&9L8GMy7UDI2Kev>V@(R}*Iu6x+!Hn4~D@wj`P%#Hdbf(lK{+DD7f zJ&(v*mhn_e(R$^5L#bM^^Q@-!*b!l|+Xrb(q*MRFJYnrE7*xko!SJOy9LngR2|q5k zY`Ioiu+YBfzF{Labszk-E#*BYQk>$()=xWEGZRKwY)*UxP}0dGuPLZOkNJDI9Hy zFjfwiK6RjhH#rHW#B0(MW}i%V`943<6@Z*Nd^JEP5uZonXm=u%AM>{H^U@&Jy*i0s za_Da^xI6pMtXzHc{e~_ZcnKP*;=YL2Z^RmzDl{dJTk7*}E_h*NvgnhnxVKB59Duh~ zqouS_WoOR*{UvUw_K#OWz;gMracr%8>QQ&V*jv!8)ho;U8}9~8EU{N<=Z_gR%IpMT zbkePUG_afm=#|iIfFmdqkpLMGxY5D$`?I}&T7>TexU@v zkBx09kG)O;09ckj#(_Uov6vv{{HOcr-%H#DUQ@*GzF8Zh{iSM13%fuB%>wjdU@3Nf zlnYE!GTyNrqes|;nLFXfWU*Wg-9wmr=NBd$nCk+H?iwNvcd0Wab^3CT9a`>3V~oWI z9=_H+N-Q=MQ(io4u4mpdQ;k&5FXnKV5M7R`@WJ9h(GrAirO#XXOU{qQpk^B^Vd=Dt{wiqT zg-#j9J~@o%H2;W9mg)o6@*Vo;BSs2*4HAHpDk02mndAsov08R_48zJZ@J)s7+hyCo zy*0L#y)?AqZt-wX%+_Vx`8*A95OLHvs1$k~{h-_N_vov_gHJE=`X>L?5K+ zD?u59=mjtImMvd1GsDytuYp{IyUkW&?h zF>$#`n$~bZ)KN0B$XGeMYh&`;g8 zo_2-koaO6+8O!+L>SpIQbG(i;QW9UJi{Ecewlo?s&D!^>i$|#jaW}#HJuxt|W48=? zb^Y&O$a1s5ddr8DIt!sD!t=y1g(d4GR(s;s-HfV$GXl&m;+sAAxB^rk(3_NjE$p#L z*t4em?tA0d+XwRxN^OQwzbDZMuSE0J1)Ky{mq)^t4bnSl*)s>zNM@mMdtd78&ebHN z`!(|lE5q-p+TsRaNnMXwALaN5QIZ2IUi^Z22tsN5>nvIO+YU}Q*xh6}ee6@rR~<&1 z(PB4z>9ZBUMXZwSMmd9-aKKsmJeJq^G|#JclOh*xf0?^e0(`40nsg1z)(48;4}B_( zGwPI)yo|{oX{dVDL-5-aMGr;~vU1cPtJP5JM(sswz&Q`e<@0?y{YhsO9YK8EYJA;L z>7oG_Mts+(wCBC*Md82#XdKw&J*IizR?9k^rf1r{Ot-&>V^ke{9nI9zavlcNkIJtN z7T>?o|4rENk-?|lewZ(EfdR;%BUrzKJ^UkCpsM)EA9QHBVV8trT&*O(9?FO{MLTFL z=5P0H+T6C^jAuX0k4U;~GM!x`!X2N~3_n?qXY$HI>x@(DHEy&Q3ucT1R6fj28wX!I zC=&d$@bJ_v^%?W2Ngl}e8ww`b%BrN-PzGH;$@B2Ky1?%GMkm#~Okj(-Admyy;qya| zOi73kr_pwt?5Nj3p=&H>81!w#>Agj z(QXx{j0r=pTl>micAI_5vUw<3`Sht?Z}-j2Wx~F8DKCUQrsXl2?W8hur42(F_ zsSJ)_36&x6A|YkY6c<2a94SXbv~d>4CC4nkDPvf9Z5Fys^6^5r0j5=E>Cgy_Dk@tS z%?c}9!qB?t6t8(XMH%le8UeNWp@Nsma~Ql+^3Bo%_npMryeQJz4V=BAqE~T?dejng z3ge{fjCHoNAfYBvsfq;G%VL|j7t z`X0sy1EEgpyD;)tS1x+fnv-?C@glP0{RCW}Ma?3qpoq_&IJAYOy3G#s`rsh5=3>`K zkj``=;|*x5HSjZC zXNvPLh372q;=+6ja|SC!R-`JcL}}wwskajjTUGTpL(1zkN-p?BA2lmf+J3WsB7!k`0Brx8^cLTF9h)r+LZ$vsZo}`OpOs)?c6$hclR!R#MAeh|_DY|9r zy+_3c%IO9h9X?ksp?an&>Lw;QeQ`T-Ku6HaK~H?E9-Z5$cZu{YU;1+-6B$|JD;%!^ zt(4l>F8}a-UkC4YtOxFHckhl4VKr6P$P_O*U!)IDory%}Wz`YeFx6TO{y2Y${SBm?H9cTWV=WWJ z`_*CGso!ZN>l@~_jkeXtV}fczfA{TUkyeD>)i3|NFGcCsBmK3HXp&ol_@GVs7PIpfULy!hi zs+%KYgS%(n7_z_}6)hblk~W#LZ@&2)fwm6xkFP%&Ju|MFWbNiTwy{{g-pV1RK`L&=RE2D z4|g;~vd8xd|teYS%w!IlT4W$&FTrk-hcTADX!P?*f1YWEIRwq$Ys%^(Z9w&HT$>} zsMD#6Df=uJrX!JHP7<>Or;e_Cf=}`!`qR=i8fBj)$6Lxx{HRzd8Tnzd0p>kSps{OG zKJkml>bUj8$u|F=``l(-aMxWBC@CGZ#FXClQZ<4|&%jN}Tkg#q8z)=>Ly{$i0`rjU zvt|QddO&i=91e?h3>s~i;+6{ z8X4i6a1wDLrSuE#W(zhan+U*Zq+8p3a))JFVF4ffaV51K^YgTso~3;Y*NmM; zx8T?y-N0uyWY(8=me-HUC9xtABvX5~%yg+Cp&XF$Bq=OcK6T*D7eZ2EmIoCFWm{$S z1PNw8HDpe5hHeCusN8kdeb&f2#=3M^A~7YwJ7FRrhq*)PG9x?JIAaC{MV}5}g#7R$-Ly%)4=IUkRCGOR|XTMjn&okRmFjaO^YF5^* z@)#MCBOBezD)*xQNxydlUyN?dW{fS(s-T`gv*0BEnk}`BdmrbmPO8q8y(X$AA}*RH%I7Av!~84pudHb&%Q5-j zt?=6x(iR?<^_7X0v6Ys#VAL}dKk^hcjI=|EY;kPcZ_w<*H`_*|N7SacaM1ERD@6ab zg`!iTm7$URV+lpW_{V$ruR&A>jrX68k4x2wo$45}&wf7o<|o(@B!u-L@bKyQBAGwy z4#}UrRAu>^>Vb6k2-th^>WjvP;Nl|i3WrjWv3ISkj{m{eAcQIW^_ndxSX@|8T(ASJ z?_$fcP2u*6uOBk-{d>^ z0vWlfGQMvysI%R=iE|A+!!Nw?C917EU*_$`;;)px?s83CRd3i_jBN)k#nR5t$dJ(+ z_sP;wG@Ad)^(3LRj7q}0b2O(b`|i0~5SYb%Sjk^*5ISZ-Ab+}DGu$-X1n^TF1Ndw_ zF|e*1)cI2%`TR&AW~XpqpFb!=3cHbS>np9hYD_Mr5}y5Y`SY^r7isA2Q4(z zazRQEqWDKT2zIEbjSYdCPi1ZOGz80Nsl}gxO^DWMY0AV<2K&OL{&^6#@L1?lXu#6xSMh%3^5c*}oM6DQGY#(a^@z<&D zF(43I9e&5`h|A$5!+UFuOH0>F3$shBV4`0#M4RSB8=6F0ZgIbq<2LQ$Hh^(kAJu=! zt8ZGXTacD{(3W{V1$j_{Jc)Ka7t6u}ho`4kF+4@t_0!mCBn z)}o%eA}L)_L?=jw6BIfll7tb3n}?*yLt&XADa=rW>qz=_6s9ziOd5sXjil>FVFx3r zf>Feewk0v#W9>Gp4GacTRr>Sd2T6dWi-{YX`v!D)kCWzG5xQB=?es5ON(%nkwUhNl zV>@xkWWWv*N+{e$(SrExvN6BXzU(Hxlx27{VYHf+LpIbTO+Yu(ltMk<;)3A(LU@ytVYFkYvTa79idMtUFhfxx?P!)2F`prNWW#Fub#l>N2s@nh&n_ zA4{#}|AIs9|A4P0ZF%fy=hDN!t#ifH<)4u2kirK~JUpjQ-J+~cXOZI&dIts;P}UeXslP6zKvpEKSN-$y>kJ^nw2tC9bv zo(|lT@?vZ!{_l|d^8Yh)eEBh*5ABh+Lzjw+?V)o z#P-W7361>E(Y4;@`sv;VKn G`u_lkUM?>H diff --git a/examples/laravel-api/public/fonts/glyphicons-halflings-regular.woff2 b/examples/laravel-api/public/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 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 diff --git a/examples/laravel-api/public/index.php b/examples/laravel-api/public/index.php deleted file mode 100644 index 37f19c23..00000000 --- a/examples/laravel-api/public/index.php +++ /dev/null @@ -1,57 +0,0 @@ - - */ - -/* -|-------------------------------------------------------------------------- -| Register The Auto Loader -|-------------------------------------------------------------------------- -| -| Composer provides a convenient, automatically generated class loader for -| our application. We just need to utilize it! We'll simply require it -| into the script here so that we don't have to worry about manual -| loading any of our classes later on. It feels nice to relax. -| -*/ - -require __DIR__.'/../bootstrap/autoload.php'; - -/* -|-------------------------------------------------------------------------- -| Turn On The Lights -|-------------------------------------------------------------------------- -| -| We need to illuminate PHP development, so let us turn on the lights. -| This bootstraps the framework and gets it ready for use, then it -| will load up this application so that we can run it and send -| the responses back to the browser and delight our users. -| -*/ - -$app = require_once __DIR__.'/../bootstrap/app.php'; - -/* -|-------------------------------------------------------------------------- -| Run The Application -|-------------------------------------------------------------------------- -| -| Once we have the application, we can handle the incoming request -| through the kernel, and send the associated response back to -| the client's browser allowing them to enjoy the creative -| and wonderful application we have prepared for them. -| -*/ - -$kernel = $app->make('Illuminate\Contracts\Http\Kernel'); - -$response = $kernel->handle( - $request = Illuminate\Http\Request::capture() -); - -$response->send(); - -$kernel->terminate($request, $response); diff --git a/examples/laravel-api/public/js/app.js b/examples/laravel-api/public/js/app.js deleted file mode 100644 index 1d46aa09..00000000 --- a/examples/laravel-api/public/js/app.js +++ /dev/null @@ -1,63 +0,0 @@ -angular.module( 'sample', [ - 'auth0', - 'ngRoute', - 'sample.home', - 'sample.login', - 'angular-storage', - 'angular-jwt' -]) -.config( function myAppConfig ( $routeProvider, authProvider, $httpProvider, $locationProvider, - jwtInterceptorProvider) { - $routeProvider - .when( '/', { - controller: 'HomeCtrl', - templateUrl: '/app/home/home.html', - pageTitle: 'Homepage', - requiresLogin: true - }) - .when( '/login', { - controller: 'LoginCtrl', - templateUrl: '/app/login/login.html', - pageTitle: 'Login' - }); - - - authProvider.init({ - domain: AUTH0_DOMAIN, - clientID: AUTH0_CLIENT_ID, - loginUrl: '/login' - }); - - jwtInterceptorProvider.tokenGetter = function(store) { - return store.get('token'); - } - - // Add a simple interceptor that will fetch all requests and add the jwt token to its authorization header. - // NOTE: in case you are calling APIs which expect a token signed with a different secret, you might - // want to check the delegation-token example - $httpProvider.interceptors.push('jwtInterceptor'); -}).run(function($rootScope, auth, store, jwtHelper, $location) { - $rootScope.$on('$locationChangeStart', function() { - if (!auth.isAuthenticated) { - var token = store.get('token'); - if (token) { - if (!jwtHelper.isTokenExpired(token)) { - auth.authenticate(store.get('profile'), token); - } else { - $location.path('/login'); - } - } - } - - }); -}) -.controller( 'AppCtrl', function AppCtrl ( $scope, $location ) { - $scope.$on('$routeChangeSuccess', function(e, nextRoute){ - if ( nextRoute.$$route && angular.isDefined( nextRoute.$$route.pageTitle ) ) { - $scope.pageTitle = nextRoute.$$route.pageTitle + ' | Auth0 Sample' ; - } - }); -}) - -; - diff --git a/examples/laravel-api/public/js/auth0-variables.js b/examples/laravel-api/public/js/auth0-variables.js deleted file mode 100644 index 34d5f018..00000000 --- a/examples/laravel-api/public/js/auth0-variables.js +++ /dev/null @@ -1,3 +0,0 @@ -var AUTH0_CLIENT_ID='KNuydwEqwGsPNpxdAhACmOWDUmBEZsLn'; -var AUTH0_DOMAIN='wptest.auth0.com'; -var AUTH0_CALLBACK_URL=location.href; \ No newline at end of file diff --git a/examples/laravel-api/public/robots.txt b/examples/laravel-api/public/robots.txt deleted file mode 100644 index eb053628..00000000 --- a/examples/laravel-api/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/examples/laravel-api/readme.md b/examples/laravel-api/readme.md deleted file mode 100644 index a4d8d553..00000000 --- a/examples/laravel-api/readme.md +++ /dev/null @@ -1,23 +0,0 @@ -## Laravel PHP Framework - -[![Build Status](https://travis-ci.org/laravel/framework.svg)](https://travis-ci.org/laravel/framework) -[![Total Downloads](https://poser.pugx.org/laravel/framework/downloads.svg)](https://packagist.org/packages/laravel/framework) -[![Latest Stable Version](https://poser.pugx.org/laravel/framework/v/stable.svg)](https://packagist.org/packages/laravel/framework) -[![Latest Unstable Version](https://poser.pugx.org/laravel/framework/v/unstable.svg)](https://packagist.org/packages/laravel/framework) -[![License](https://poser.pugx.org/laravel/framework/license.svg)](https://packagist.org/packages/laravel/framework) - -Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable, creative experience to be truly fulfilling. Laravel attempts to take the pain out of development by easing common tasks used in the majority of web projects, such as authentication, routing, sessions, queueing, and caching. - -Laravel is accessible, yet powerful, providing powerful tools needed for large, robust applications. A superb inversion of control container, expressive migration system, and tightly integrated unit testing support give you the tools you need to build any application with which you are tasked. - -## Official Documentation - -Documentation for the framework can be found on the [Laravel website](http://laravel.com/docs). - -## Contributing - -Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](http://laravel.com/docs/contributions). - -### License - -The Laravel framework is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT) diff --git a/examples/laravel-api/resources/assets/less/app.less b/examples/laravel-api/resources/assets/less/app.less deleted file mode 100644 index 99be0764..00000000 --- a/examples/laravel-api/resources/assets/less/app.less +++ /dev/null @@ -1,8 +0,0 @@ -@import "http://github.com/bootstrap/bootstrap"; - -@btn-font-weight: 300; -@font-family-sans-serif: "Roboto", Helvetica, Arial, sans-serif; - -body, label, .checkbox label { - font-weight: 300; -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/alerts.less b/examples/laravel-api/resources/assets/less/bootstrap/alerts.less deleted file mode 100644 index df070b8a..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/alerts.less +++ /dev/null @@ -1,68 +0,0 @@ -// -// Alerts -// -------------------------------------------------- - - -// Base styles -// ------------------------- - -.alert { - padding: @alert-padding; - margin-bottom: @line-height-computed; - border: 1px solid transparent; - border-radius: @alert-border-radius; - - // Headings for larger alerts - h4 { - margin-top: 0; - // Specified for the h4 to prevent conflicts of changing @headings-color - color: inherit; - } - // Provide class for links that match alerts - .alert-link { - font-weight: @alert-link-font-weight; - } - - // Improve alignment and spacing of inner content - > p, - > ul { - margin-bottom: 0; - } - > p + p { - margin-top: 5px; - } -} - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. -.alert-dismissible { - padding-right: (@alert-padding + 20); - - // Adjust close link position - .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; - } -} - -// Alternate styles -// -// Generate contextual modifier classes for colorizing the alert. - -.alert-success { - .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); -} -.alert-info { - .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); -} -.alert-warning { - .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); -} -.alert-danger { - .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/badges.less b/examples/laravel-api/resources/assets/less/bootstrap/badges.less deleted file mode 100644 index b27c405a..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/badges.less +++ /dev/null @@ -1,61 +0,0 @@ -// -// Badges -// -------------------------------------------------- - - -// Base class -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: @font-size-small; - font-weight: @badge-font-weight; - color: @badge-color; - line-height: @badge-line-height; - vertical-align: baseline; - white-space: nowrap; - text-align: center; - background-color: @badge-bg; - border-radius: @badge-border-radius; - - // Empty badges collapse automatically (not available in IE8) - &:empty { - display: none; - } - - // Quick fix for badges in buttons - .btn & { - position: relative; - top: -1px; - } - .btn-xs & { - top: 0; - padding: 1px 5px; - } - - // Hover state, but only for links - a& { - &:hover, - &:focus { - color: @badge-link-hover-color; - text-decoration: none; - cursor: pointer; - } - } - - // Account for badges in navs - .list-group-item.active > &, - .nav-pills > .active > a > & { - color: @badge-active-color; - background-color: @badge-active-bg; - } - .list-group-item > & { - float: right; - } - .list-group-item > & + & { - margin-right: 5px; - } - .nav-pills > li > a > & { - margin-left: 3px; - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/bootstrap.less b/examples/laravel-api/resources/assets/less/bootstrap/bootstrap.less deleted file mode 100644 index 61b77474..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/bootstrap.less +++ /dev/null @@ -1,50 +0,0 @@ -// Core variables and mixins -@import "http://github.com/variables.less"; -@import "http://github.com/mixins.less"; - -// Reset and dependencies -@import "http://github.com/normalize.less"; -@import "http://github.com/print.less"; -@import "http://github.com/glyphicons.less"; - -// Core CSS -@import "http://github.com/scaffolding.less"; -@import "http://github.com/type.less"; -@import "http://github.com/code.less"; -@import "http://github.com/grid.less"; -@import "http://github.com/tables.less"; -@import "http://github.com/forms.less"; -@import "http://github.com/buttons.less"; - -// Components -@import "http://github.com/component-animations.less"; -@import "http://github.com/dropdowns.less"; -@import "http://github.com/button-groups.less"; -@import "http://github.com/input-groups.less"; -@import "http://github.com/navs.less"; -@import "http://github.com/navbar.less"; -@import "http://github.com/breadcrumbs.less"; -@import "http://github.com/pagination.less"; -@import "http://github.com/pager.less"; -@import "http://github.com/labels.less"; -@import "http://github.com/badges.less"; -@import "http://github.com/jumbotron.less"; -@import "http://github.com/thumbnails.less"; -@import "http://github.com/alerts.less"; -@import "http://github.com/progress-bars.less"; -@import "http://github.com/media.less"; -@import "http://github.com/list-group.less"; -@import "http://github.com/panels.less"; -@import "http://github.com/responsive-embed.less"; -@import "http://github.com/wells.less"; -@import "http://github.com/close.less"; - -// Components w/ JavaScript -@import "http://github.com/modals.less"; -@import "http://github.com/tooltip.less"; -@import "http://github.com/popovers.less"; -@import "http://github.com/carousel.less"; - -// Utility classes -@import "http://github.com/utilities.less"; -@import "http://github.com/responsive-utilities.less"; diff --git a/examples/laravel-api/resources/assets/less/bootstrap/breadcrumbs.less b/examples/laravel-api/resources/assets/less/bootstrap/breadcrumbs.less deleted file mode 100644 index cb01d503..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/breadcrumbs.less +++ /dev/null @@ -1,26 +0,0 @@ -// -// Breadcrumbs -// -------------------------------------------------- - - -.breadcrumb { - padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; - margin-bottom: @line-height-computed; - list-style: none; - background-color: @breadcrumb-bg; - border-radius: @border-radius-base; - - > li { - display: inline-block; - - + li:before { - content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space - padding: 0 5px; - color: @breadcrumb-color; - } - } - - > .active { - color: @breadcrumb-active-color; - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/button-groups.less b/examples/laravel-api/resources/assets/less/bootstrap/button-groups.less deleted file mode 100644 index f84febbd..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/button-groups.less +++ /dev/null @@ -1,243 +0,0 @@ -// -// Button groups -// -------------------------------------------------- - -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; // match .btn alignment given font-size hack above - > .btn { - position: relative; - float: left; - // Bring the "active" button to the front - &:hover, - &:focus, - &:active, - &.active { - z-index: 2; - } - } -} - -// Prevent double borders when buttons are next to each other -.btn-group { - .btn + .btn, - .btn + .btn-group, - .btn-group + .btn, - .btn-group + .btn-group { - margin-left: -1px; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - margin-left: -5px; // Offset the first child's margin - &:extend(.clearfix all); - - .btn-group, - .input-group { - float: left; - } - > .btn, - > .btn-group, - > .input-group { - margin-left: 5px; - } -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match -.btn-group > .btn:first-child { - margin-left: 0; - &:not(:last-child):not(.dropdown-toggle) { - .border-right-radius(0); - } -} -// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - .border-left-radius(0); -} - -// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child { - > .btn:last-child, - > .dropdown-toggle { - .border-right-radius(0); - } -} -.btn-group > .btn-group:last-child > .btn:first-child { - .border-left-radius(0); -} - -// On active and open, don't show outline -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-xs > .btn { &:extend(.btn-xs); } -.btn-group-sm > .btn { &:extend(.btn-sm); } -.btn-group-lg > .btn { &:extend(.btn-lg); } - - -// Split button dropdowns -// ---------------------- - -// Give the line between buttons some depth -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} - -// The clickable button for toggling the menu -// Remove the gradient and set the same inset shadow as the :active state -.btn-group.open .dropdown-toggle { - .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - .box-shadow(none); - } -} - - -// Reposition the caret -.btn .caret { - margin-left: 0; -} -// Carets in other button sizes -.btn-lg .caret { - border-width: @caret-width-large @caret-width-large 0; - border-bottom-width: 0; -} -// Upside down carets for .dropup -.dropup .btn-lg .caret { - border-width: 0 @caret-width-large @caret-width-large; -} - - -// Vertical button groups -// ---------------------- - -.btn-group-vertical { - > .btn, - > .btn-group, - > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; - } - - // Clear floats so dropdown menus can be properly placed - > .btn-group { - &:extend(.clearfix all); - > .btn { - float: none; - } - } - - > .btn + .btn, - > .btn + .btn-group, - > .btn-group + .btn, - > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; - } -} - -.btn-group-vertical > .btn { - &:not(:first-child):not(:last-child) { - border-radius: 0; - } - &:first-child:not(:last-child) { - border-top-right-radius: @border-radius-base; - .border-bottom-radius(0); - } - &:last-child:not(:first-child) { - border-bottom-left-radius: @border-radius-base; - .border-top-radius(0); - } -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) { - > .btn:last-child, - > .dropdown-toggle { - .border-bottom-radius(0); - } -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - .border-top-radius(0); -} - - -// Justified button groups -// ---------------------- - -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; - > .btn, - > .btn-group { - float: none; - display: table-cell; - width: 1%; - } - > .btn-group .btn { - width: 100%; - } - - > .btn-group .dropdown-menu { - left: auto; - } -} - - -// Checkbox and radio options -// -// In order to support the browser's form validation feedback, powered by the -// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use -// `display: none;` or `visibility: hidden;` as that also hides the popover. -// Simply visually hiding the inputs via `opacity` would leave them clickable in -// certain cases which is prevented by using `clip` and `pointer-events`. -// This way, we ensure a DOM element is visible to position the popover from. -// -// See https://github.com/twbs/bootstrap/pull/12794 and -// https://github.com/twbs/bootstrap/pull/14559 for more information. - -[data-toggle="buttons"] { - > .btn, - > .btn-group > .btn { - input[type="radio"], - input[type="checkbox"] { - position: absolute; - clip: rect(0,0,0,0); - pointer-events: none; - } - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/buttons.less b/examples/laravel-api/resources/assets/less/bootstrap/buttons.less deleted file mode 100644 index 40553c63..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/buttons.less +++ /dev/null @@ -1,160 +0,0 @@ -// -// Buttons -// -------------------------------------------------- - - -// Base styles -// -------------------------------------------------- - -.btn { - display: inline-block; - margin-bottom: 0; // For input.btn - font-weight: @btn-font-weight; - text-align: center; - vertical-align: middle; - touch-action: manipulation; - cursor: pointer; - background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 - border: 1px solid transparent; - white-space: nowrap; - .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base); - .user-select(none); - - &, - &:active, - &.active { - &:focus, - &.focus { - .tab-focus(); - } - } - - &:hover, - &:focus, - &.focus { - color: @btn-default-color; - text-decoration: none; - } - - &:active, - &.active { - outline: 0; - background-image: none; - .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); - } - - &.disabled, - &[disabled], - fieldset[disabled] & { - cursor: @cursor-disabled; - pointer-events: none; // Future-proof disabling of clicks - .opacity(.65); - .box-shadow(none); - } -} - - -// Alternate buttons -// -------------------------------------------------- - -.btn-default { - .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); -} -.btn-primary { - .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); -} -// Success appears as green -.btn-success { - .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); -} -// Info appears as blue-green -.btn-info { - .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); -} -// Warning appears as orange -.btn-warning { - .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); -} -// Danger and error appear as red -.btn-danger { - .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); -} - - -// Link buttons -// ------------------------- - -// Make a button look and behave like a link -.btn-link { - color: @link-color; - font-weight: normal; - border-radius: 0; - - &, - &:active, - &.active, - &[disabled], - fieldset[disabled] & { - background-color: transparent; - .box-shadow(none); - } - &, - &:hover, - &:focus, - &:active { - border-color: transparent; - } - &:hover, - &:focus { - color: @link-hover-color; - text-decoration: underline; - background-color: transparent; - } - &[disabled], - fieldset[disabled] & { - &:hover, - &:focus { - color: @btn-link-disabled-color; - text-decoration: none; - } - } -} - - -// Button Sizes -// -------------------------------------------------- - -.btn-lg { - // line-height: ensure even-numbered height of button next to large input - .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); -} -.btn-sm { - // line-height: ensure proper height of button next to small input - .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} -.btn-xs { - .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} - - -// Block button -// -------------------------------------------------- - -.btn-block { - display: block; - width: 100%; -} - -// Vertically space out multiple block buttons -.btn-block + .btn-block { - margin-top: 5px; -} - -// Specificity overrides -input[type="submit"], -input[type="reset"], -input[type="button"] { - &.btn-block { - width: 100%; - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/carousel.less b/examples/laravel-api/resources/assets/less/bootstrap/carousel.less deleted file mode 100644 index 5724d8a5..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/carousel.less +++ /dev/null @@ -1,267 +0,0 @@ -// -// Carousel -// -------------------------------------------------- - - -// Wrapper for the slide container and indicators -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; - - > .item { - display: none; - position: relative; - .transition(.6s ease-in-out left); - - // Account for jankitude on images - > img, - > a > img { - &:extend(.img-responsive); - line-height: 1; - } - - // WebKit CSS3 transforms for supported devices - @media all and (transform-3d), (-webkit-transform-3d) { - transition: transform .6s ease-in-out; - backface-visibility: hidden; - perspective: 1000; - - &.next, - &.active.right { - transform: translate3d(100%, 0, 0); - left: 0; - } - &.prev, - &.active.left { - transform: translate3d(-100%, 0, 0); - left: 0; - } - &.next.left, - &.prev.right, - &.active { - transform: translate3d(0, 0, 0); - left: 0; - } - } - } - - > .active, - > .next, - > .prev { - display: block; - } - - > .active { - left: 0; - } - - > .next, - > .prev { - position: absolute; - top: 0; - width: 100%; - } - - > .next { - left: 100%; - } - > .prev { - left: -100%; - } - > .next.left, - > .prev.right { - left: 0; - } - - > .active.left { - left: -100%; - } - > .active.right { - left: 100%; - } - -} - -// Left/right controls for nav -// --------------------------- - -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: @carousel-control-width; - .opacity(@carousel-control-opacity); - font-size: @carousel-control-font-size; - color: @carousel-control-color; - text-align: center; - text-shadow: @carousel-text-shadow; - // We can't have this transition here because WebKit cancels the carousel - // animation if you trip this while in the middle of another animation. - - // Set gradients for backgrounds - &.left { - #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); - } - &.right { - left: auto; - right: 0; - #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); - } - - // Hover/focus state - &:hover, - &:focus { - outline: 0; - color: @carousel-control-color; - text-decoration: none; - .opacity(.9); - } - - // Toggles - .icon-prev, - .icon-next, - .glyphicon-chevron-left, - .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - } - .icon-prev, - .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; - } - .icon-next, - .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; - } - .icon-prev, - .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; - } - - - .icon-prev { - &:before { - content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) - } - } - .icon-next { - &:before { - content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) - } - } -} - -// Optional indicator pips -// -// Add an unordered list with the following class and add a list item for each -// slide your carousel holds. - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; - - li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid @carousel-indicator-border-color; - border-radius: 10px; - cursor: pointer; - - // IE8-9 hack for event handling - // - // Internet Explorer 8-9 does not support clicks on elements without a set - // `background-color`. We cannot use `filter` since that's not viewed as a - // background color by the browser. Thus, a hack is needed. - // - // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we - // set alpha transparency for the best results possible. - background-color: #000 \9; // IE8 - background-color: rgba(0,0,0,0); // IE9 - } - .active { - margin: 0; - width: 12px; - height: 12px; - background-color: @carousel-indicator-active-bg; - } -} - -// Optional captions -// ----------------------------- -// Hidden by default for smaller viewports -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: @carousel-caption-color; - text-align: center; - text-shadow: @carousel-text-shadow; - & .btn { - text-shadow: none; // No shadow for button elements in carousel-caption - } -} - - -// Scale up controls for tablets and up -@media screen and (min-width: @screen-sm-min) { - - // Scale up the controls a smidge - .carousel-control { - .glyphicon-chevron-left, - .glyphicon-chevron-right, - .icon-prev, - .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .glyphicon-chevron-left, - .icon-prev { - margin-left: -15px; - } - .glyphicon-chevron-right, - .icon-next { - margin-right: -15px; - } - } - - // Show and left align the captions - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; - } - - // Move up the indicators - .carousel-indicators { - bottom: 20px; - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/close.less b/examples/laravel-api/resources/assets/less/bootstrap/close.less deleted file mode 100644 index 9b4e74f2..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/close.less +++ /dev/null @@ -1,33 +0,0 @@ -// -// Close icons -// -------------------------------------------------- - - -.close { - float: right; - font-size: (@font-size-base * 1.5); - font-weight: @close-font-weight; - line-height: 1; - color: @close-color; - text-shadow: @close-text-shadow; - .opacity(.2); - - &:hover, - &:focus { - color: @close-color; - text-decoration: none; - cursor: pointer; - .opacity(.5); - } - - // Additional properties for button version - // iOS requires the button element instead of an anchor tag. - // If you want the anchor version, it requires `href="#"`. - button& { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/code.less b/examples/laravel-api/resources/assets/less/bootstrap/code.less deleted file mode 100644 index a08b4d48..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/code.less +++ /dev/null @@ -1,69 +0,0 @@ -// -// Code (inline and block) -// -------------------------------------------------- - - -// Inline and block code styles -code, -kbd, -pre, -samp { - font-family: @font-family-monospace; -} - -// Inline code -code { - padding: 2px 4px; - font-size: 90%; - color: @code-color; - background-color: @code-bg; - border-radius: @border-radius-base; -} - -// User input typically entered via keyboard -kbd { - padding: 2px 4px; - font-size: 90%; - color: @kbd-color; - background-color: @kbd-bg; - border-radius: @border-radius-small; - box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); - - kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - box-shadow: none; - } -} - -// Blocks of code -pre { - display: block; - padding: ((@line-height-computed - 1) / 2); - margin: 0 0 (@line-height-computed / 2); - font-size: (@font-size-base - 1); // 14px to 13px - line-height: @line-height-base; - word-break: break-all; - word-wrap: break-word; - color: @pre-color; - background-color: @pre-bg; - border: 1px solid @pre-border-color; - border-radius: @border-radius-base; - - // Account for some code outputs that place code tags in pre tags - code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; - } -} - -// Enable scrollable blocks of code -.pre-scrollable { - max-height: @pre-scrollable-max-height; - overflow-y: scroll; -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/component-animations.less b/examples/laravel-api/resources/assets/less/bootstrap/component-animations.less deleted file mode 100644 index 967715d9..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/component-animations.less +++ /dev/null @@ -1,34 +0,0 @@ -// -// Component animations -// -------------------------------------------------- - -// Heads up! -// -// We don't use the `.opacity()` mixin here since it causes a bug with text -// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. - -.fade { - opacity: 0; - .transition(opacity .15s linear); - &.in { - opacity: 1; - } -} - -.collapse { - display: none; - visibility: hidden; - - &.in { display: block; visibility: visible; } - tr&.in { display: table-row; } - tbody&.in { display: table-row-group; } -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - .transition-property(~"height, visibility"); - .transition-duration(.35s); - .transition-timing-function(ease); -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/dropdowns.less b/examples/laravel-api/resources/assets/less/bootstrap/dropdowns.less deleted file mode 100644 index 84a48c14..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/dropdowns.less +++ /dev/null @@ -1,213 +0,0 @@ -// -// Dropdown menus -// -------------------------------------------------- - - -// Dropdown arrow/caret -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: @caret-width-base solid; - border-right: @caret-width-base solid transparent; - border-left: @caret-width-base solid transparent; -} - -// The dropdown wrapper (div) -.dropdown { - position: relative; -} - -// Prevent the focus on the dropdown toggle when closing dropdowns -.dropdown-toggle:focus { - outline: 0; -} - -// The dropdown menu (ul) -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: @zindex-dropdown; - display: none; // none by default, but block on "open" of the menu - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; // override default ul - list-style: none; - font-size: @font-size-base; - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - background-color: @dropdown-bg; - border: 1px solid @dropdown-fallback-border; // IE8 fallback - border: 1px solid @dropdown-border; - border-radius: @border-radius-base; - .box-shadow(0 6px 12px rgba(0,0,0,.175)); - background-clip: padding-box; - - // Aligns the dropdown menu to right - // - // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` - &.pull-right { - right: 0; - left: auto; - } - - // Dividers (basically an hr) within the dropdown - .divider { - .nav-divider(@dropdown-divider-bg); - } - - // Links within the dropdown menu - > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: @line-height-base; - color: @dropdown-link-color; - white-space: nowrap; // prevent links from randomly breaking onto new lines - } -} - -// Hover/Focus state -.dropdown-menu > li > a { - &:hover, - &:focus { - text-decoration: none; - color: @dropdown-link-hover-color; - background-color: @dropdown-link-hover-bg; - } -} - -// Active state -.dropdown-menu > .active > a { - &, - &:hover, - &:focus { - color: @dropdown-link-active-color; - text-decoration: none; - outline: 0; - background-color: @dropdown-link-active-bg; - } -} - -// Disabled state -// -// Gray out text and ensure the hover/focus state remains gray - -.dropdown-menu > .disabled > a { - &, - &:hover, - &:focus { - color: @dropdown-link-disabled-color; - } - - // Nuke hover/focus effects - &:hover, - &:focus { - text-decoration: none; - background-color: transparent; - background-image: none; // Remove CSS gradient - .reset-filter(); - cursor: @cursor-disabled; - } -} - -// Open state for the dropdown -.open { - // Show the menu - > .dropdown-menu { - display: block; - } - - // Remove the outline when :focus is triggered - > a { - outline: 0; - } -} - -// Menu positioning -// -// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown -// menu with the parent. -.dropdown-menu-right { - left: auto; // Reset the default from `.dropdown-menu` - right: 0; -} -// With v3, we enabled auto-flipping if you have a dropdown within a right -// aligned nav component. To enable the undoing of that, we provide an override -// to restore the default dropdown menu alignment. -// -// This is only for left-aligning a dropdown menu within a `.navbar-right` or -// `.pull-right` nav component. -.dropdown-menu-left { - left: 0; - right: auto; -} - -// Dropdown section headers -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: @font-size-small; - line-height: @line-height-base; - color: @dropdown-header-color; - white-space: nowrap; // as with > li > a -} - -// Backdrop to catch body clicks on mobile, etc. -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: (@zindex-dropdown - 10); -} - -// Right aligned dropdowns -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// -// Just add .dropup after the standard .dropdown class and you're set, bro. -// TODO: abstract this so that the navbar fixed styles are not placed here? - -.dropup, -.navbar-fixed-bottom .dropdown { - // Reverse the caret - .caret { - border-top: 0; - border-bottom: @caret-width-base solid; - content: ""; - } - // Different positioning for bottom up menu - .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; - } -} - - -// Component alignment -// -// Reiterate per navbar.less and the modified component alignment there. - -@media (min-width: @grid-float-breakpoint) { - .navbar-right { - .dropdown-menu { - .dropdown-menu-right(); - } - // Necessary for overrides of the default right aligned menu. - // Will remove come v4 in all likelihood. - .dropdown-menu-left { - .dropdown-menu-left(); - } - } -} diff --git a/examples/laravel-api/resources/assets/less/bootstrap/forms.less b/examples/laravel-api/resources/assets/less/bootstrap/forms.less deleted file mode 100644 index 1bcc2b6b..00000000 --- a/examples/laravel-api/resources/assets/less/bootstrap/forms.less +++ /dev/null @@ -1,546 +0,0 @@ -// -// Forms -// -------------------------------------------------- - - -// Normalize non-controls -// -// Restyle and baseline non-control form elements. - -fieldset { - padding: 0; - margin: 0; - border: 0; - // Chrome and Firefox set a `min-width: min-content;` on fieldsets, - // so we reset that to ensure it behaves more like a standard block element. - // See https://github.com/twbs/bootstrap/issues/12359. - min-width: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: @line-height-computed; - font-size: (@font-size-base * 1.5); - line-height: inherit; - color: @legend-color; - border: 0; - border-bottom: 1px solid @legend-border-color; -} - -label { - display: inline-block; - max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) - margin-bottom: 5px; - font-weight: bold; -} - - -// Normalize form controls -// -// While most of our form styles require extra classes, some basic normalization -// is required to ensure optimum display with or without those classes to better -// address browser inconsistencies. - -// Override content-box in Normalize (* isn't specific enough) -input[type="search"] { - .box-sizing(border-box); -} - -// Position radios and checkboxes better -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; // IE8-9 - line-height: normal; -} - -// Set the height of file controls to match text inputs -input[type="file"] { - display: block; -} - -// Make range inputs behave like textual form controls -input[type="range"] { - display: block; - width: 100%; -} - -// Make multiple select elements height not fixed -select[multiple], -select[size] { - height: auto; -} - -// Focus for file, radio, and checkbox -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - .tab-focus(); -} - -// Adjust output element -output { - display: block; - padding-top: (@padding-base-vertical + 1); - font-size: @font-size-base; - line-height: @line-height-base; - color: @input-color; -} - - -// Common form controls -// -// Shared size and type resets for form controls. Apply `.form-control` to any -// of the following form controls: -// -// select -// textarea -// input[type="text"] -// input[type="password"] -// input[type="datetime"] -// input[type="datetime-local"] -// input[type="date"] -// input[type="month"] -// input[type="time"] -// input[type="week"] -// input[type="number"] -// input[type="email"] -// input[type="url"] -// input[type="search"] -// input[type="tel"] -// input[type="color"] - -.form-control { - display: block; - width: 100%; - height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) - padding: @padding-base-vertical @padding-base-horizontal; - font-size: @font-size-base; - line-height: @line-height-base; - color: @input-color; - background-color: @input-bg; - background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 - border: 1px solid @input-border; - border-radius: @input-border-radius; - .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); - .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); - - // Customize the `:focus` state to imitate native WebKit styles. - .form-control-focus(); - - // Placeholder - .placeholder(); - - // Disabled and read-only inputs - // - // HTML5 says that controls under a fieldset > legend:first-child won't be - // disabled if the fieldset is disabled. Due to implementation difficulty, we - // don't honor that edge case; we style them as disabled anyway. - &[disabled], - &[readonly], - fieldset[disabled] & { - cursor: @cursor-disabled; - background-color: @input-bg-disabled; - opacity: 1; // iOS fix for unreadable disabled content - } - - // Reset height for `textarea`s - textarea& { - height: auto; - } -} - - -// Search inputs in iOS -// -// This overrides the extra rounded corners on search inputs in iOS so that our -// `.form-control` class can properly style them. Note that this cannot simply -// be added to `.form-control` as it's not specific enough. For details, see -// https://github.com/twbs/bootstrap/issues/11586. - -input[type="search"] { - -webkit-appearance: none; -} - - -// Special styles for iOS temporal inputs -// -// In Mobile Safari, setting `display: block` on temporal inputs causes the -// text within the input to become vertically misaligned. As a workaround, we -// set a pixel line-height that matches the given height of the input, but only -// for Safari. - -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"], - input[type="time"], - input[type="datetime-local"], - input[type="month"] { - line-height: @input-height-base; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm { - line-height: @input-height-small; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg { - line-height: @input-height-large; - } -} - - -// Form groups -// -// Designed to help with the organization and spacing of vertical forms. For -// horizontal forms, use the predefined grid classes. - -.form-group { - margin-bottom: 15px; -} - - -// Checkboxes and radios -// -// Indent the labels to position radios/checkboxes as hanging controls. - -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; - - label { - min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; - } -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing -} - -// Radios and checkboxes on same line -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; // space out consecutive inline controls -} - -// Apply same disabled cursor tweak as for inputs -// Some special care is needed because