diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..7be895e
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,24 @@
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at http://editorconfig.org
+
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.bat]
+end_of_line = crlf
+
+[*.yml]
+indent_style = space
+indent_size = 2
+
+[*.twig]
+insert_final_newline = false
+
+[Makefile]
+indent_style = tab
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..f552ddb
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,46 @@
+# Define the line ending behavior of the different file extensions
+# Set default behavior, in case users don't have core.autocrlf set.
+* text=auto
+* text eol=lf
+
+# Explicitly declare text files we want to always be normalized and converted
+# to native line endings on checkout.
+*.php text
+*.default text
+*.ctp text
+*.sql text
+*.md text
+*.po text
+*.js text
+*.css text
+*.ini text
+*.properties text
+*.txt text
+*.xml text
+*.svg text
+*.yml text
+.htaccess text
+
+# Declare files that will always have CRLF line endings on checkout.
+*.bat eol=crlf
+
+# Declare files that will always have LF line endings on checkout.
+*.pem eol=lf
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.jpg binary
+*.gif binary
+*.ico binary
+*.mo binary
+*.pdf binary
+*.phar binary
+*.woff binary
+*.woff2 binary
+*.ttf binary
+*.otf binary
+*.eot binary
+*.gz binary
+*.bz2 binary
+*.7z binary
+*.zip binary
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..660b539
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,23 @@
+This is a (multiple allowed):
+
+* [x] bug
+* [ ] enhancement
+* [ ] feature-discussion (RFC)
+
+* CakePHP Application Skeleton Version: EXACT RELEASE VERSION OR COMMIT HASH, HERE.
+* Platform and Target: YOUR WEB-SERVER, DATABASE AND OTHER RELEVANT INFO AND HOW THE REQUEST IS BEING MADE, HERE.
+
+### What you did
+EXPLAIN WHAT YOU DID, PREFERABLY WITH CODE EXAMPLES, HERE.
+
+### What happened
+EXPLAIN WHAT IS ACTUALLY HAPPENING, HERE.
+
+### What you expected to happen
+EXPLAIN WHAT IS TO BE EXPECTED, HERE.
+
+P.S. Remember, an issue is not the place to ask questions. You can use [Stack Overflow](https://stackoverflow.com/questions/tagged/cakephp)
+for that or join the #cakephp channel on irc.freenode.net, where we will be more
+than happy to help answer your questions.
+
+Before you open an issue, please check if a similar issue already exists or has been closed before.
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..05ca9eb
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,10 @@
+**PLEASE NOTE:**
+
+This is only a issue tracker for issues related to the CakePHP Application Skeleton.
+For CakePHP Framework issues please use this [issue tracker](https://github.com/cakephp/cakephp/issues).
+
+Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue.
+
+The best way to propose a feature is to open an issue first and discuss your ideas there before implementing them.
+
+Always follow the [contribution guidelines](https://github.com/cakephp/cakephp/blob/master/.github/CONTRIBUTING.md) guidelines when submitting a pull request. In particular, make sure existing tests still pass, and add tests for all new behavior. When fixing a bug, you may want to add a test to verify the fix.
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 80f408e..a8c0da0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,39 @@
-nbproject/
+# CakePHP specific files #
+##########################
+/config/.env
+/logs/*
+/tmp/*
+/vendor/*
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+Icon?
+ehthumbs.db
+Thumbs.db
+
+# Tool specific files #
+#######################
+# vim
+*~
+*.swp
+*.swo
+# sublime text & textmate
+*.sublime-*
+*.stTheme.cache
+*.tmlanguage.cache
+*.tmPreferences.cache
+# Eclipse
+.settings/*
+# JetBrains, aka PHPStorm, IntelliJ IDEA
+.idea/*
+# NetBeans
+nbproject/*
+# Visual Studio Code
+.vscode
+# Sass preprocessor
+.sass-cache/
diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..54b08e8
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,12 @@
+# Uncomment the following to prevent the httpoxy vulnerability
+# See: https://httpoxy.org/
+#
+# RequestHeader unset Proxy
+#
+
+
+ RewriteEngine on
+ RewriteRule ^(\.well-known/.*)$ $1 [L]
+ RewriteRule ^$ webroot/ [L]
+ RewriteRule (.*) webroot/$1 [L]
+
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..9c914f6
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,39 @@
+language: php
+
+dist: trusty
+
+sudo: false
+
+php:
+ - 5.6
+ - 7.0
+ - 7.1
+ - 7.2
+
+matrix:
+ fast_finish: true
+
+ global:
+ - DEFAULT=1
+
+ include:
+ - php: 7.0
+ env: PHPCS=1 DEFAULT=0
+
+ - php: 7.1
+ env: PHPSTAN=1 DEFAULT=0
+
+before_script:
+ - if [[ $PHPCS = 1 ]]; then composer require cakephp/cakephp-codesniffer:~2.1; fi
+ - if [[ $DEFAULT = 1 ]]; then composer install; fi
+ - if [[ $DEFAULT = 1 ]]; then composer require phpunit/phpunit:"^5.7|^6.0"; fi
+ - if [[ $DEFAULT = 1 ]]; then composer run-script post-install-cmd --no-interaction; fi
+ - if [[ $PHPSTAN = 1 ]]; then composer require --dev "phpstan/phpstan"; fi
+
+script:
+ - if [[ $DEFAULT = 1 ]]; then vendor/bin/phpunit; fi
+ - if [[ $PHPCS = 1 ]]; then vendor/bin/phpcs -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests ./config ./webroot; fi
+ - if [[ $PHPSTAN = 1 ]]; then vendor/bin/phpstan analyse -l 5 src; fi
+
+notifications:
+ email: false
diff --git a/CHANGELOG.md b/CHANGELOG.md
old mode 100755
new mode 100644
index b2d6ac1..1b2a4f6
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,128 +1,9 @@
-# LoginRadius PHP SDK Change Log
+## Enhancements
-# Version 5.0.2
-Released on **January 11, 2019**
-## Enhancements
- - Added API Region Option in SDK.
- - Added gzip encoding in api request.
-## Bug Fixed
- - Defined urlReplacement function statically in functions.php file.
+- Updated the demo with the latest PHP SDK11.4.0 version.
-# Version 5.0.1
-Released on **October 15, 2018**
-## Bug Fixed
- - Remove dependency of json option.
-
-# Version 5.0.0
-Released on **October 9, 2018**
-## Enhancements
- - API Request signing: Passed hash value instead of API Secret Key.
- - API's Route changed.
- - Access Token is added as header in all Authentication APIs
- - Implemented Custom Domain option.
- - Added preventEmailVerification (Boolean) option to prevent email verification flow in Auth Login and Registration APIs (where optional email is enabled).
+### Added new parameters in the following API
-## Breaking Changes
- For developers migrating from v4.5.3 or older ones, there are following breaking changes in terms of SDK implementation.
- - register() replaced with registerByEmail()
- - loginByEmail() replaced with authLoginByEmail()
- - loginByUsername() replaced with authLoginByUsername()
- - loginByPhone() replaced with authLoginByPhone
- - instantLinkLoginByEmail() replaced with passwordLessLoginByEmail()
- - instantLinkLoginByUserName() replaced with passwordLessLoginByUserName()
- - instantLinkLoginVerification() replaced with passwordLessLoginVerification()
- - emailPromptAutoLoginbyEmail() replaced with smartLoginByEmail()
- - emailPromptAutoLoginbyUserName() replaced with smartLoginByUserName()
- - emailPromptAutoLoginPing() replaced with smartLoginPing()
- - verifyAutoLoginEmailForLogin() replaced with smartLoginVerifyToken()
- - simplifiedInstantRegistrationByEmail() replaced with oneTouchLoginByEmail()
- - simplifiedInstantRegistrationByPhone() replaced with oneTouchLoginByPhone()
- - simplifiedInstantRegistrationOTPVerification() replaced with oneTouchOtpVerification()
- - twoFALoginByEmail() replaced with mfaEmailLogin()
- - twoFALoginByUsername() replaced with mfaUserNameLogin()
- - twoFALoginByPhone() replaced with mfaPhoneLogin()
- - configureTwoFAByToken() replaced with mfaValidateAccessToken()
- - verifyTwoFAByGoogleAuthCodeOrOtp() replaced with updateMfaByGoogleAuthCode() and updateMfaByOtp()
- - removeOrResetGoogleAuthenticatorByToken() replaced with resetGoogleAuthenticatorByToken() and resetSMSAuthenticatorByToken()
- - removeOrResetGoogleAuthenticator() replaced with mfaResetGoogleAuthenticatorByUid() and mfaResetSMSAuthenticatorByUid()
- - Removed CloudAPI replaced with ConfigAPI
- - Removed ProvidersAPI and SchemaAPI
- - Removed SOTT from utility.
- - Directory name \LoginRadiusSDK\CustomerRegistration\Management -> replaced with \LoginRadiusSDK\CustomerRegistration\Account
-
-# Version 4.5.3
-Released on **August 9, 2018**
-## Bug Fixed
- - HTTP method request bug fixing
-
-# Version 4.5.2
-Released on **April 3, 2018**
-## Bug Fixed
- - SOTT was not generating properly in PHP SDK demo
-
-# Version 4.5.1
-Released on **January 24, 2018**
-## Enhancements
- - Change configuration API endpoint url.
-
-# Version 4.5.0
-Released on **Novemeber 28, 2017**
-## Enhancements
- - Added API to get Identities
- - Added API to invalidate email
- - Added API to get email verification token
- - Added API to get forgot password token
- - Passed APIkey and APISecret key in header for management Api's
- - Removed mcrypt dependency (function deprecated in php 7)
-
-
-# Version 4.4.0
-Released on **Novemeber 7, 2017**
-## Enhancements
- - Added Configuration API
- - Added API to get all active session details
- - Added Reset password by Security Answer API
- - Added Remove Email Management API
-
-# Version 4.3.0
-Released on **September 15, 2017**
-## Enhancements
- - Ability to support proxy server
- - Projection of fields in api's
- - Added management api to generate a new SOTT
- - Custom object edit API enhancements
- - Added security questions api's
- - Added invalidate phone api
- - Added instant link login api
- - Added simplified instant registration data api's
- - Auto login api enhancement
-
-# Version 4.2.0
-Released on **June 20, 2017**
-## Enhancements
- - Added Roles API's
- - Added Web hooks API's
- - Added Email Prompt Auto Login API's
-
-# Version 4.1.0
-Released on **April 10, 2017**
-## Enhancements
- - Added user impersonation API
- - Added Check token validity and invalidate token API
- - Added Two-Factor authentication API's
-
-# 4.0.0
-## Enhancements
-Released on **February 28, 2017**
- - Significantly improved code performance.
- - Wrapper methods for latest LoginRadius APIs have been added in Account API and User API
- - Added email,username and phone login api's
- - Added advance social login api's
- - Added resthooks api's
- - Added role api's
- - Added add or remove email api's
- - Added Custom object api's
-
-
-
-
+- GetProfileByAccessToken
+- MFAValidateGoogleAuthCode
+- MFALoginByEmail
\ No newline at end of file
diff --git a/README.md b/README.md
index dedafc2..7843f5e 100755
--- a/README.md
+++ b/README.md
@@ -1,39 +1,78 @@
-LoginRadius
-==========
+# LoginRadius CakePHP Demo
-
+## Overview
+This demo is meant to help you with a quick implementation of the LoginRadius platform with CakePHP.
+It presumes you have basic knowledge of PHP.
------------------------------------------------
-LoginRadius PHP wrapper provides access to LoginRadius.
+## Getting Started
-LoginRadius is a unified **Customer Identity Management** API platform that combines 30 major social platforms into a single simplified and maintenance-free API. With LoginRadius' API, websites and mobile apps can implement capture user profile data, enable social login, enable social sharing, add single sign-on and many more.
+**Required: Composer needs to be installed **
-LoginRadius helps businesses boost user engagement on their web/mobile platform, manage online identities, utilize social media for marketing, capture accurate consumer data and get unique social insight into their customer base.
+1. Setup a local server. If you don't know how to set up a local server read these guides [here](https://www.maketecheasier.com/setup-local-web-server-all-platforms/) or set up a small GitHub webserver [here](https://pages.github.com/)
-Please visit https://docs.loginradius.com/api/v2/deployment/sdk-libraries/php-library for more information.
+2. Download the demo and put it in your root directory on your server.
-PHP Library
---------------
+3. Install the dependencies by typing following command in your command-line interface.
-This document contains information and examples regarding the LoginRadius PHP SDK. It provides guidance for working with social authentication, capture user profile data, enable social login, enable social sharing, single sign-on, user profile data and sending messages with a variety of social networks such as Facebook, Google, Twitter, Yahoo, LinkedIn, and more.
+ ##### ** Note: intl extension should be enabled in PHP. **
+```
+ composer update
+```
-## Installation
+4. Configure your LoginRadius Credentials in \ "\src\Controller\AppController.php\"
-The recommended way to install is through [Composer](http://getcomposer.org/).
-
-```bash
-# Install Composer
-curl -sS https://getcomposer.org/installer | php
```
+ define('LR_API_KEY', ''); // Pass API Key
+ define('LR_API_SECRET', ''); // Pass API Secret Key
+ define('API_REQUEST_SIGNING', false); // Pass boolean true/false for enable/disable
+ define('AUTH_FLOW', '');
+```
+5. Configure your LoginRadius Credentials in \ "\webroot\js\option.js\ "
-Next, run the Composer command to install the latest stable version of library:
+```
+ var commonOptions = {};
+ commonOptions.apiKey = "";
+ commonOptions.appName = "";
+ commonOptions.hashTemplate = true;
+ commonOptions.sott = "";
+ commonOptions.formValidationMessage = true;
+ commonOptions.verificationUrl = domainName+"/login";
+ commonOptions.resetPasswordUrl = domainName+"/login";
+ var LRObject = new LoginRadiusV2(commonOptions);
-```bash
-composer require loginradius/php-sdk:5.0.2
```
-## Documentation
+6. Go to your web browser and type in the root directory URL that your server is hosting.
+
+## Features Implemented in the Demo
+
+1. Login
+
+2. Register
+
+3. Resend Email Verification
+
+4. Social Login
+
+5. Multi-Factor Authentication
+
+6. Hosted Page
+
+7. Forgot Password
+
+8. Custom Object Management
+
+9. Update Profile
+
+10. Set Password
+
+11. Account Linking
+
+12. Roles Management
+
+
+
+
-[Getting Started](https://docs.loginradius.com/api/v2/sdk-libraries/php) - Everything you need to begin using this SDK.
diff --git a/bin/cake b/bin/cake
new file mode 100644
index 0000000..14f9019
--- /dev/null
+++ b/bin/cake
@@ -0,0 +1,75 @@
+#!/usr/bin/env sh
+################################################################################
+#
+# Cake is a shell script for invoking CakePHP shell commands
+#
+# CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+#
+# @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+# @link https://cakephp.org CakePHP(tm) Project
+# @since 1.2.0
+# @license https://opensource.org/licenses/mit-license.php MIT License
+#
+################################################################################
+
+# Canonicalize by following every symlink of the given name recursively
+canonicalize() {
+ NAME="$1"
+ if [ -f "$NAME" ]
+ then
+ DIR=$(dirname -- "$NAME")
+ NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME")
+ fi
+ while [ -h "$NAME" ]; do
+ DIR=$(dirname -- "$NAME")
+ SYM=$(readlink "$NAME")
+ NAME=$(cd "$DIR" > /dev/null && cd $(dirname -- "$SYM") > /dev/null && pwd)/$(basename -- "$SYM")
+ done
+ echo "$NAME"
+}
+
+# Find a CLI version of PHP
+findCliPhp() {
+ for TESTEXEC in php php-cli /usr/local/bin/php
+ do
+ SAPI=`echo "= PHP_SAPI ?>" | $TESTEXEC 2>/dev/null`
+ if [ "$SAPI" = "cli" ]
+ then
+ echo $TESTEXEC
+ return
+ fi
+ done
+ echo "Failed to find a CLI version of PHP; falling back to system standard php executable" >&2
+ echo "php";
+}
+
+# If current path is a symlink, resolve to real path
+realname="$0"
+if [ -L "$realname" ]
+then
+ realname=$(readlink -f "$0")
+fi
+
+CONSOLE=$(dirname -- "$(canonicalize "$realname")")
+APP=$(dirname "$CONSOLE")
+
+# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment
+# variable with the correct path in it.
+if [ -z "$PHP" ]
+then
+ PHP=$(findCliPhp)
+fi
+
+if [ $(basename $realname) != 'cake' ]
+then
+ exec $PHP "$CONSOLE"/cake.php $(basename $realname) "$@"
+else
+ exec $PHP "$CONSOLE"/cake.php "$@"
+fi
+
+exit
diff --git a/bin/cake.bat b/bin/cake.bat
new file mode 100644
index 0000000..ad13782
--- /dev/null
+++ b/bin/cake.bat
@@ -0,0 +1,27 @@
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Cake is a Windows batch script for invoking CakePHP shell commands
+::
+:: CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+:: Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+::
+:: Licensed under The MIT License
+:: Redistributions of files must retain the above copyright notice.
+::
+:: @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+:: @link https://cakephp.org CakePHP(tm) Project
+:: @since 2.0.0
+:: @license https://opensource.org/licenses/mit-license.php MIT License
+::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+
+SET app=%0
+SET lib=%~dp0
+
+php "%lib%cake.php" %*
+
+echo.
+
+exit /B %ERRORLEVEL%
diff --git a/bin/cake.php b/bin/cake.php
new file mode 100644
index 0000000..320ee36
--- /dev/null
+++ b/bin/cake.php
@@ -0,0 +1,12 @@
+#!/usr/bin/php -q
+run($argv));
diff --git a/composer.json b/composer.json
index 7c2eccd..d93c7f8 100755
--- a/composer.json
+++ b/composer.json
@@ -1,21 +1,56 @@
{
- "name": "loginradius/php-sdk",
- "description": "LoginRadius PHP SDK v5.0.2",
- "keywords": ["loginradius", "phpsdk"],
- "type": "library",
+ "name": "cakephp/app",
+ "description": "CakePHP skeleton app",
+ "homepage": "https://cakephp.org",
+ "type": "project",
"license": "MIT",
- "authors": [
- {
- "name": "LoginRadius Team",
- "email": "developers@loginradius.com"
- }
- ],
"require": {
- "php": ">=5.4.0"
+ "php": ">=5.6",
+ "cakephp/cakephp": "3.7.4",
+ "cakephp/migrations": "^2.0.0",
+ "cakephp/plugin-installer": "^1.0",
+ "loginradius/php-sdk": "11.4.0",
+ "mobiledetect/mobiledetectlib": "2.*"
+ },
+ "require-dev": {
+ "cakephp/bake": "^1.9.0",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "cakephp/debug_kit": "^3.17.0",
+ "josegonzalez/dotenv": "3.*",
+ "phpunit/phpunit": "^5|^6",
+ "psy/psysh": "@stable"
+ },
+ "suggest": {
+ "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.",
+ "dereuromark/cakephp-ide-helper": "After baking your code, this keeps your annotations in sync with the code evolving from there on for maximum IDE and PHPStan compatibility."
},
"autoload": {
"psr-4": {
- "LoginRadiusSDK\\": "src/LoginRadiusSDK/"
+ "App\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "App\\Test\\": "tests/",
+ "Cake\\Test\\": "vendor/cakephp/cakephp/tests/"
+ }
+ },
+ "scripts": {
+ "post-install-cmd": "App\\Console\\Installer::postInstall",
+ "post-create-project-cmd": "App\\Console\\Installer::postInstall",
+ "check": [
+ "@test",
+ "@cs-check"
+ ],
+ "cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/",
+ "cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/",
+ "test": "phpunit --colors=always"
+ },
+ "prefer-stable": true,
+ "config": {
+ "sort-packages": true,
+ "allow-plugins": {
+ "cakephp/plugin-installer": true
}
}
}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..5a8aae6
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,5541 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "1d8f681e246f4274001eb93e3e356240",
+ "packages": [
+ {
+ "name": "aura/intl",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/auraphp/Aura.Intl.git",
+ "reference": "642cab45c9c88a217f89b65c2d7219a8cd7f803b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/auraphp/Aura.Intl/zipball/642cab45c9c88a217f89b65c2d7219a8cd7f803b",
+ "reference": "642cab45c9c88a217f89b65c2d7219a8cd7f803b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "yoast/phpunit-polyfills": "~1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Aura\\Intl\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aura.Intl Contributors",
+ "homepage": "https://github.com/auraphp/Aura.Intl/contributors"
+ }
+ ],
+ "description": "The Aura Intl package provides internationalization tools, specifically message translation.",
+ "homepage": "https://github.com/auraphp/Aura.Intl",
+ "keywords": [
+ "g11n",
+ "globalization",
+ "i18n",
+ "internationalization",
+ "intl",
+ "l10n",
+ "localization"
+ ],
+ "support": {
+ "issues": "https://github.com/auraphp/Aura.Intl/issues",
+ "source": "https://github.com/auraphp/Aura.Intl/tree/3.0.1"
+ },
+ "time": "2022-01-28T10:55:50+00:00"
+ },
+ {
+ "name": "cakephp/cakephp",
+ "version": "3.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/cakephp.git",
+ "reference": "5c78a61c0ed7fbd56ce9d7cee3c6d6f9b27af46b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/cakephp/zipball/5c78a61c0ed7fbd56ce9d7cee3c6d6f9b27af46b",
+ "reference": "5c78a61c0ed7fbd56ce9d7cee3c6d6f9b27af46b",
+ "shasum": ""
+ },
+ "require": {
+ "aura/intl": "^3.0.0",
+ "cakephp/chronos": "^1.0.1",
+ "ext-intl": "*",
+ "ext-mbstring": "*",
+ "php": ">=5.6.0",
+ "psr/log": "^1.0.0",
+ "psr/simple-cache": "^1.0.0",
+ "zendframework/zend-diactoros": "^1.4.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.7"
+ },
+ "replace": {
+ "cakephp/cache": "self.version",
+ "cakephp/collection": "self.version",
+ "cakephp/core": "self.version",
+ "cakephp/database": "self.version",
+ "cakephp/datasource": "self.version",
+ "cakephp/event": "self.version",
+ "cakephp/filesystem": "self.version",
+ "cakephp/form": "self.version",
+ "cakephp/i18n": "self.version",
+ "cakephp/log": "self.version",
+ "cakephp/orm": "self.version",
+ "cakephp/utility": "self.version",
+ "cakephp/validation": "self.version"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "cakephp/chronos": "^1.2.1",
+ "phpunit/phpunit": "^5.7.14|^6.0"
+ },
+ "suggest": {
+ "ext-curl": "To enable more efficient network calls in Http\\Client.",
+ "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.",
+ "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Core/functions.php",
+ "src/Collection/functions.php",
+ "src/I18n/functions.php",
+ "src/Utility/bootstrap.php"
+ ],
+ "psr-4": {
+ "Cake\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/cakephp/graphs/contributors"
+ }
+ ],
+ "description": "The CakePHP framework",
+ "homepage": "https://cakephp.org",
+ "keywords": [
+ "conventions over configuration",
+ "dry",
+ "form",
+ "framework",
+ "mvc",
+ "orm",
+ "psr-7",
+ "rapid-development",
+ "validation"
+ ],
+ "support": {
+ "forum": "https://stackoverflow.com/tags/cakephp",
+ "irc": "irc://irc.freenode.org/cakephp",
+ "issues": "https://github.com/cakephp/cakephp/issues",
+ "source": "https://github.com/cakephp/cakephp"
+ },
+ "time": "2019-02-09T20:30:00+00:00"
+ },
+ {
+ "name": "cakephp/chronos",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/chronos.git",
+ "reference": "ba2bab98849e7bf29b02dd634ada49ab36472959"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/chronos/zipball/ba2bab98849e7bf29b02dd634ada49ab36472959",
+ "reference": "ba2bab98849e7bf29b02dd634ada49ab36472959",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpbench/phpbench": "@dev",
+ "phpunit/phpunit": "<6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/carbon_compat.php"
+ ],
+ "psr-4": {
+ "Cake\\Chronos\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ },
+ {
+ "name": "The CakePHP Team",
+ "homepage": "http://cakephp.org"
+ }
+ ],
+ "description": "A simple API extension for DateTime.",
+ "homepage": "http://cakephp.org",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/cakephp",
+ "issues": "https://github.com/cakephp/chronos/issues",
+ "source": "https://github.com/cakephp/chronos"
+ },
+ "time": "2019-11-30T02:33:19+00:00"
+ },
+ {
+ "name": "cakephp/migrations",
+ "version": "2.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/migrations.git",
+ "reference": "7fa4f1f8a4cd90df59cd8e3a46958c822abe457e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/migrations/zipball/7fa4f1f8a4cd90df59cd8e3a46958c822abe457e",
+ "reference": "7fa4f1f8a4cd90df59cd8e3a46958c822abe457e",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cache": "^3.6.0",
+ "cakephp/orm": "^3.6.0",
+ "php": ">=5.6.0",
+ "robmorgan/phinx": "^0.10.3|^0.11.1"
+ },
+ "require-dev": {
+ "cakephp/bake": "^1.7.0",
+ "cakephp/cakephp": "^3.6.0",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7.14|^6.0"
+ },
+ "suggest": {
+ "cakephp/bake": "If you want to generate migrations."
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Migrations\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/migrations/graphs/contributors"
+ }
+ ],
+ "description": "Database Migration plugin for CakePHP based on Phinx",
+ "homepage": "https://github.com/cakephp/migrations",
+ "keywords": [
+ "cakephp",
+ "migrations"
+ ],
+ "support": {
+ "forum": "https://stackoverflow.com/tags/cakephp",
+ "irc": "irc://irc.freenode.org/cakephp",
+ "issues": "https://github.com/cakephp/migrations/issues",
+ "source": "https://github.com/cakephp/migrations"
+ },
+ "time": "2020-02-05T15:00:43+00:00"
+ },
+ {
+ "name": "cakephp/plugin-installer",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/plugin-installer.git",
+ "reference": "e27027aa2d3d8ab64452c6817629558685a064cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/plugin-installer/zipball/e27027aa2d3d8ab64452c6817629558685a064cb",
+ "reference": "e27027aa2d3d8ab64452c6817629558685a064cb",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.3",
+ "composer/composer": "^2.0",
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^8.5 || ^9.3"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Cake\\Composer\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cake\\Composer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://cakephp.org"
+ }
+ ],
+ "description": "A composer installer for CakePHP 3.0+ plugins.",
+ "support": {
+ "issues": "https://github.com/cakephp/plugin-installer/issues",
+ "source": "https://github.com/cakephp/plugin-installer/tree/1.3.1"
+ },
+ "time": "2020-10-29T04:00:42+00:00"
+ },
+ {
+ "name": "loginradius/php-sdk",
+ "version": "11.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/LoginRadius/php-sdk.git",
+ "reference": "70d9dd45ad2dba89a5d5d00912e83e38dfb023be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/LoginRadius/php-sdk/zipball/70d9dd45ad2dba89a5d5d00912e83e38dfb023be",
+ "reference": "70d9dd45ad2dba89a5d5d00912e83e38dfb023be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "LoginRadiusSDK\\": "src/LoginRadiusSDK/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "LoginRadius Team",
+ "email": "developers@loginradius.com"
+ }
+ ],
+ "description": "LoginRadius PHP SDK v11.4.0",
+ "keywords": [
+ "loginradius",
+ "phpsdk"
+ ],
+ "support": {
+ "issues": "https://github.com/LoginRadius/php-sdk/issues",
+ "source": "https://github.com/LoginRadius/php-sdk/tree/11.4.0"
+ },
+ "time": "2022-06-01T11:56:33+00:00"
+ },
+ {
+ "name": "mobiledetect/mobiledetectlib",
+ "version": "2.8.39",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/serbanghita/Mobile-Detect.git",
+ "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/0fd6753003fc870f6e229bae869cc1337c99bc45",
+ "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8.35||~5.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Detection": "namespaced/"
+ },
+ "classmap": [
+ "Mobile_Detect.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Serban Ghita",
+ "email": "serbanghita@gmail.com",
+ "homepage": "http://mobiledetect.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
+ "homepage": "https://github.com/serbanghita/Mobile-Detect",
+ "keywords": [
+ "detect mobile devices",
+ "mobile",
+ "mobile detect",
+ "mobile detector",
+ "php mobile detect"
+ ],
+ "support": {
+ "issues": "https://github.com/serbanghita/Mobile-Detect/issues",
+ "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.39"
+ },
+ "time": "2022-02-17T19:24:25+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/1.1.2"
+ },
+ "time": "2021-11-05T16:50:12+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/master"
+ },
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
+ },
+ "time": "2021-05-03T11:20:27+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/master"
+ },
+ "time": "2017-10-23T01:57:42+00:00"
+ },
+ {
+ "name": "robmorgan/phinx",
+ "version": "0.11.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/phinx.git",
+ "reference": "3cdde73e0c33c410e076108b3e1603fabb5b330d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/phinx/zipball/3cdde73e0c33c410e076108b3e1603fabb5b330d",
+ "reference": "3cdde73e0c33c410e076108b3e1603fabb5b330d",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/collection": "^3.7",
+ "cakephp/database": "^3.7",
+ "php": ">=5.6",
+ "symfony/config": "^3.4|^4.0|^5.0",
+ "symfony/console": "^3.4|^4.0|^5.0",
+ "symfony/yaml": "^3.4|^4.0|^5.0"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "ext-json": "*",
+ "phpunit/phpunit": ">=5.7,<8.0",
+ "sebastian/comparator": ">=1.2.3"
+ },
+ "suggest": {
+ "ext-json": "Install if using JSON configuration format",
+ "symfony/yaml": "Install if using YAML configuration format"
+ },
+ "bin": [
+ "bin/phinx"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Phinx\\": "src/Phinx/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Rob Morgan",
+ "email": "robbym@gmail.com",
+ "homepage": "https://robmorgan.id.au",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Woody Gilk",
+ "email": "woody.gilk@gmail.com",
+ "homepage": "https://shadowhand.me",
+ "role": "Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Developer"
+ },
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/phinx/graphs/contributors",
+ "role": "Developer"
+ }
+ ],
+ "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.",
+ "homepage": "https://phinx.org",
+ "keywords": [
+ "database",
+ "database migrations",
+ "db",
+ "migrations",
+ "phinx"
+ ],
+ "support": {
+ "issues": "https://github.com/cakephp/phinx/issues",
+ "source": "https://github.com/cakephp/phinx/tree/0.11.7"
+ },
+ "time": "2020-05-09T13:59:05+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/8f551fe22672ac7ab2c95fe46d899f960ed4d979",
+ "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22"
+ },
+ "conflict": {
+ "symfony/finder": "<4.4"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v5.4.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-17T10:39:36+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb",
+ "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
+ },
+ "conflict": {
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v5.4.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-18T06:17:34+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+ "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-01-02T09:53:40+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba",
+ "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-20T13:55:35+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "219aa369ceff116e673852dce47c3a41794c14bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
+ "reference": "219aa369ceff116e673852dce47c3a41794c14bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php73",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
+ "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-10T07:21:04+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+ "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
+ "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.1",
+ "symfony/deprecation-contracts": "^2.1|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-13T20:07:29+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
+ "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "conflict": {
+ "symfony/translation-contracts": ">=3.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v5.4.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-19T10:40:37+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v5.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.3"
+ },
+ "require-dev": {
+ "symfony/console": "^5.3|^6.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v5.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-01-26T16:32:32+00:00"
+ },
+ {
+ "name": "zendframework/zend-diactoros",
+ "version": "1.8.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-diactoros.git",
+ "reference": "a85e67b86e9b8520d07e6415fcbcb8391b44a75b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/a85e67b86e9b8520d07e6415fcbcb8391b44a75b",
+ "reference": "a85e67b86e9b8520d07e6415fcbcb8391b44a75b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php-http/psr7-integration-tests": "dev-master",
+ "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7",
+ "zendframework/zend-coding-standard": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-release-1.8": "1.8.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions/create_uploaded_file.php",
+ "src/functions/marshal_headers_from_sapi.php",
+ "src/functions/marshal_method_from_sapi.php",
+ "src/functions/marshal_protocol_version_from_sapi.php",
+ "src/functions/marshal_uri_from_sapi.php",
+ "src/functions/normalize_server.php",
+ "src/functions/normalize_uploaded_files.php",
+ "src/functions/parse_cookie_header.php"
+ ],
+ "psr-4": {
+ "Zend\\Diactoros\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "PSR HTTP Message implementations",
+ "homepage": "https://github.com/zendframework/zend-diactoros",
+ "keywords": [
+ "http",
+ "psr",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/zendframework/zend-diactoros/issues",
+ "source": "https://github.com/zendframework/zend-diactoros"
+ },
+ "abandoned": "laminas/laminas-diactoros",
+ "time": "2019-08-06T17:53:53+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "ajgl/breakpoint-twig-extension",
+ "version": "0.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ajgarlag/AjglBreakpointTwigExtension.git",
+ "reference": "9875feea0ac4bc3c9f308c62bae4727669d6052a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ajgarlag/AjglBreakpointTwigExtension/zipball/9875feea0ac4bc3c9f308c62bae4727669d6052a",
+ "reference": "9875feea0ac4bc3c9f308c62bae4727669d6052a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "twig/twig": "^1.34|^2.0|^3.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.18",
+ "symfony/framework-bundle": "^2.7|^3.4|^4.4|^5.2",
+ "symfony/phpunit-bridge": "^4.4|^5.2",
+ "symfony/twig-bundle": "^2.7|^3.4|^4.4|^5.2"
+ },
+ "suggest": {
+ "ext-xdebug": "The Xdebug extension is required for the breakpoint to work",
+ "symfony/framework-bundle": "The framework bundle to integrate the extension into Symfony",
+ "symfony/twig-bundle": "The twig bundle to integrate the extension into Symfony"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ajgl\\Twig\\Extension\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Antonio J. García Lagar",
+ "email": "aj@garcialagar.es",
+ "homepage": "http://aj.garcialagar.es",
+ "role": "developer"
+ }
+ ],
+ "description": "Twig extension to set breakpoints",
+ "homepage": "https://github.com/ajgarlag/AjglBreakpointTwigExtension",
+ "keywords": [
+ "Xdebug",
+ "breakpoint",
+ "twig"
+ ],
+ "support": {
+ "issues": "https://github.com/ajgarlag/AjglBreakpointTwigExtension/issues",
+ "source": "https://github.com/ajgarlag/AjglBreakpointTwigExtension/tree/0.3.5"
+ },
+ "time": "2021-02-08T10:48:05+00:00"
+ },
+ {
+ "name": "aptoma/twig-markdown",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/aptoma/twig-markdown.git",
+ "reference": "64a9c5c7418c08faf91c4410b34bdb65fb25c23d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/aptoma/twig-markdown/zipball/64a9c5c7418c08faf91c4410b34bdb65fb25c23d",
+ "reference": "64a9c5c7418c08faf91c4410b34bdb65fb25c23d",
+ "shasum": ""
+ },
+ "require": {
+ "twig/twig": "~1.12"
+ },
+ "require-dev": {
+ "codeclimate/php-test-reporter": "dev-master",
+ "erusev/parsedown": "^1.6",
+ "knplabs/github-api": "~1.2",
+ "league/commonmark": "~0.5",
+ "michelf/php-markdown": "~1",
+ "phpunit/phpunit": "~4.0",
+ "satooshi/php-coveralls": "~0.6"
+ },
+ "suggest": {
+ "knplabs/github-api": "Needed for using GitHub's Markdown engine provided through their API.",
+ "michelf/php-markdown": "Original Markdown engine with MarkdownExtra."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Aptoma": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joris Berthelot",
+ "email": "joris@berthelot.tel"
+ },
+ {
+ "name": "Gunnar Lium",
+ "email": "gunnar@aptoma.com"
+ }
+ ],
+ "description": "Twig extension to work with Markdown content",
+ "keywords": [
+ "markdown",
+ "twig"
+ ],
+ "support": {
+ "issues": "https://github.com/aptoma/twig-markdown/issues",
+ "source": "https://github.com/aptoma/twig-markdown/tree/master"
+ },
+ "time": "2015-10-23T20:27:08+00:00"
+ },
+ {
+ "name": "asm89/twig-cache-extension",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/asm89/twig-cache-extension.git",
+ "reference": "13787226956ec766f4770722082288097aebaaf3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/asm89/twig-cache-extension/zipball/13787226956ec766f4770722082288097aebaaf3",
+ "reference": "13787226956ec766f4770722082288097aebaaf3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2",
+ "twig/twig": "^1.0|^2.0"
+ },
+ "require-dev": {
+ "doctrine/cache": "~1.0",
+ "phpunit/phpunit": "^5.0 || ^4.8.10"
+ },
+ "suggest": {
+ "psr/cache-implementation": "To make use of PSR-6 cache implementation via PsrCacheAdapter."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alexander",
+ "email": "iam.asm89@gmail.com"
+ }
+ ],
+ "description": "Cache fragments of templates directly within Twig.",
+ "homepage": "https://github.com/asm89/twig-cache-extension",
+ "keywords": [
+ "cache",
+ "extension",
+ "twig"
+ ],
+ "support": {
+ "issues": "https://github.com/asm89/twig-cache-extension/issues",
+ "source": "https://github.com/asm89/twig-cache-extension/tree/1.4.0"
+ },
+ "abandoned": "twig/cache-extension",
+ "time": "2020-01-01T20:47:37+00:00"
+ },
+ {
+ "name": "cakephp/bake",
+ "version": "1.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/bake.git",
+ "reference": "b1fa1d2d4f3a6b74c69ab24c90c880dcc1f8751c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/bake/zipball/b1fa1d2d4f3a6b74c69ab24c90c880dcc1f8751c",
+ "reference": "b1fa1d2d4f3a6b74c69ab24c90c880dcc1f8751c",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "~3.7.0",
+ "cakephp/plugin-installer": "^1.0",
+ "php": ">=5.6.0",
+ "wyrihaximus/twig-view": "^4.3.7"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^5.7.14|^6.0"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "Bake\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/bake/graphs/contributors"
+ }
+ ],
+ "description": "Bake plugin for CakePHP 3",
+ "homepage": "https://github.com/cakephp/bake",
+ "keywords": [
+ "bake",
+ "cakephp"
+ ],
+ "support": {
+ "forum": "http://stackoverflow.com/tags/cakephp",
+ "irc": "irc://irc.freenode.org/cakephp",
+ "issues": "https://github.com/cakephp/bake/issues",
+ "source": "https://github.com/cakephp/bake"
+ },
+ "time": "2019-07-01T21:34:33+00:00"
+ },
+ {
+ "name": "cakephp/cakephp-codesniffer",
+ "version": "3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/cakephp-codesniffer.git",
+ "reference": "7998a191e787fd5b68cb635d7050cb0d7b55e1a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/7998a191e787fd5b68cb635d7050cb0d7b55e1a1",
+ "reference": "7998a191e787fd5b68cb635d7050cb0d7b55e1a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "squizlabs/php_codesniffer": "^3.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "type": "phpcodesniffer-standard",
+ "autoload": {
+ "psr-4": {
+ "CakePHP\\": "CakePHP/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/cakephp-codesniffer/graphs/contributors"
+ }
+ ],
+ "description": "CakePHP CodeSniffer Standards",
+ "homepage": "https://cakephp.org",
+ "keywords": [
+ "codesniffer",
+ "framework"
+ ],
+ "support": {
+ "forum": "https://stackoverflow.com/tags/cakephp",
+ "irc": "irc://irc.freenode.org/cakephp",
+ "issues": "https://github.com/cakephp/cakephp-codesniffer/issues",
+ "source": "https://github.com/cakephp/cakephp-codesniffer"
+ },
+ "time": "2019-12-07T03:02:34+00:00"
+ },
+ {
+ "name": "cakephp/debug_kit",
+ "version": "3.23.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/debug_kit.git",
+ "reference": "49506b55d0b7becf4803e895b07a8cd8599ab1e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/49506b55d0b7becf4803e895b07a8cd8599ab1e4",
+ "reference": "49506b55d0b7becf4803e895b07a8cd8599ab1e4",
+ "shasum": ""
+ },
+ "require": {
+ "cakephp/cakephp": "^3.7.0",
+ "cakephp/chronos": "^1.0.0",
+ "composer/composer": "^1.3 | ^2.0",
+ "jdorn/sql-formatter": "^1.2.0",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "cakephp/authorization": "^1.3.2",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "cakephp/plugin-installer": "^1.3",
+ "phpunit/phpunit": "^5.7.14|^6.0"
+ },
+ "suggest": {
+ "ext-pdo_sqlite": "DebugKit needs to store panel data in a database. SQLite is simple and easy to use."
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "DebugKit\\": "src/",
+ "DebugKit\\Test\\Fixture\\": "tests/Fixture/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Story",
+ "homepage": "https://mark-story.com",
+ "role": "Author"
+ },
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/debug_kit/graphs/contributors"
+ }
+ ],
+ "description": "CakePHP Debug Kit",
+ "homepage": "https://github.com/cakephp/debug_kit",
+ "keywords": [
+ "cakephp",
+ "debug",
+ "kit"
+ ],
+ "support": {
+ "forum": "http://stackoverflow.com/tags/cakephp",
+ "irc": "irc://irc.freenode.org/cakephp",
+ "issues": "https://github.com/cakephp/debug_kit/issues",
+ "source": "https://github.com/cakephp/debug_kit"
+ },
+ "time": "2021-05-16T04:58:57+00:00"
+ },
+ {
+ "name": "composer/ca-bundle",
+ "version": "1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "fd5dd441932a7e10ca6e5b490e272d34c8430640"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/fd5dd441932a7e10ca6e5b490e272d34c8430640",
+ "reference": "fd5dd441932a7e10ca6e5b490e272d34c8430640",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.55",
+ "psr/log": "^1.0",
+ "symfony/phpunit-bridge": "^4.2 || ^5",
+ "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/ca-bundle/issues",
+ "source": "https://github.com/composer/ca-bundle/tree/1.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:56:16+00:00"
+ },
+ {
+ "name": "composer/composer",
+ "version": "2.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/composer.git",
+ "reference": "10cd375cf85dede2ff417ceab517ef9a0dc55407"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/composer/zipball/10cd375cf85dede2ff417ceab517ef9a0dc55407",
+ "reference": "10cd375cf85dede2ff417ceab517ef9a0dc55407",
+ "shasum": ""
+ },
+ "require": {
+ "composer/ca-bundle": "^1.0",
+ "composer/metadata-minifier": "^1.0",
+ "composer/pcre": "^2 || ^3",
+ "composer/semver": "^3.0",
+ "composer/spdx-licenses": "^1.2",
+ "composer/xdebug-handler": "^2.0.2 || ^3.0.3",
+ "justinrainbow/json-schema": "^5.2.11",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
+ "react/promise": "^2.8",
+ "seld/jsonlint": "^1.4",
+ "seld/phar-utils": "^1.2",
+ "symfony/console": "^5.4.7 || ^6.0.7",
+ "symfony/filesystem": "^5.4 || ^6.0",
+ "symfony/finder": "^5.4 || ^6.0",
+ "symfony/polyfill-php73": "^1.24",
+ "symfony/polyfill-php80": "^1.24",
+ "symfony/process": "^5.4 || ^6.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4.1",
+ "phpstan/phpstan-deprecation-rules": "^1",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1",
+ "phpstan/phpstan-symfony": "^1.1",
+ "symfony/phpunit-bridge": "^6.0"
+ },
+ "suggest": {
+ "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+ "ext-zip": "Enabling the zip extension allows you to unzip archives",
+ "ext-zlib": "Allow gzip compression of HTTP requests"
+ },
+ "bin": [
+ "bin/composer"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.3-dev"
+ },
+ "phpstan": {
+ "includes": [
+ "phpstan/rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\": "src/Composer"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "https://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
+ "homepage": "https://getcomposer.org/",
+ "keywords": [
+ "autoload",
+ "dependency",
+ "package"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/composer/issues",
+ "source": "https://github.com/composer/composer/tree/2.3.7"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-06-06T14:43:28+00:00"
+ },
+ {
+ "name": "composer/metadata-minifier",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/metadata-minifier.git",
+ "reference": "c549d23829536f0d0e984aaabbf02af91f443207"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207",
+ "reference": "c549d23829536f0d0e984aaabbf02af91f443207",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "composer/composer": "^2",
+ "phpstan/phpstan": "^0.12.55",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\MetadataMinifier\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Small utility library that handles metadata minification and expansion.",
+ "keywords": [
+ "composer",
+ "compression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/metadata-minifier/issues",
+ "source": "https://github.com/composer/metadata-minifier/tree/1.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-04-07T13:37:33+00:00"
+ },
+ {
+ "name": "composer/pcre",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd",
+ "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.3",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-25T20:21:48+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-01T19:23:25+00:00"
+ },
+ {
+ "name": "composer/spdx-licenses",
+ "version": "1.5.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/spdx-licenses.git",
+ "reference": "c848241796da2abf65837d51dce1fae55a960149"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149",
+ "reference": "c848241796da2abf65837d51dce1fae55a960149",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.55",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Spdx\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "SPDX licenses list and validation library.",
+ "keywords": [
+ "license",
+ "spdx",
+ "validator"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/spdx-licenses/issues",
+ "source": "https://github.com/composer/spdx-licenses/tree/1.5.7"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-23T07:37:50+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-25T21:32:43+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
+ "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.16 || ^1",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.22"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-03T08:28:38+00:00"
+ },
+ {
+ "name": "jasny/twig-extensions",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jasny/twig-extensions.git",
+ "reference": "30bdf3a3903c021544f36332c9d5d4d563527da4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jasny/twig-extensions/zipball/30bdf3a3903c021544f36332c9d5d4d563527da4",
+ "reference": "30bdf3a3903c021544f36332c9d5d4d563527da4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0 | >=5.6.0",
+ "twig/twig": "^2.0 | ^1.12"
+ },
+ "require-dev": {
+ "ext-intl": "*",
+ "ext-pcre": "*",
+ "jasny/php-code-quality": "^2.1",
+ "phpunit/phpunit": "^5.0"
+ },
+ "suggest": {
+ "ext-intl": "Required for the use of the LocalDate Twig extension",
+ "ext-pcre": "Required for the use of the PCRE Twig extension"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Jasny\\Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Arnold Daniels",
+ "email": "arnold@jasny.net",
+ "homepage": "http://www.jasny.net"
+ }
+ ],
+ "description": "A set of useful Twig filters",
+ "homepage": "http://github.com/jasny/twig-extensions#README",
+ "keywords": [
+ "PCRE",
+ "array",
+ "date",
+ "datetime",
+ "preg",
+ "regex",
+ "templating",
+ "text",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/jasny/twig-extensions/issues",
+ "source": "https://github.com/jasny/twig-extensions"
+ },
+ "time": "2017-09-13T07:38:01+00:00"
+ },
+ {
+ "name": "jdorn/sql-formatter",
+ "version": "v1.2.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jdorn/sql-formatter.git",
+ "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc",
+ "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "lib"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "http://jeremydorn.com/"
+ }
+ ],
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/jdorn/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/jdorn/sql-formatter/issues",
+ "source": "https://github.com/jdorn/sql-formatter/tree/master"
+ },
+ "time": "2014-01-12T16:20:24+00:00"
+ },
+ {
+ "name": "josegonzalez/dotenv",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/josegonzalez/php-dotenv.git",
+ "reference": "f19174d9d7213a6c20e8e5e268aa7dd042d821ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/josegonzalez/php-dotenv/zipball/f19174d9d7213a6c20e8e5e268aa7dd042d821ca",
+ "reference": "f19174d9d7213a6c20e8e5e268aa7dd042d821ca",
+ "shasum": ""
+ },
+ "require": {
+ "m1/env": "2.*",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "php-mock/php-mock-phpunit": "^1.1",
+ "satooshi/php-coveralls": "1.*",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "josegonzalez\\Dotenv": [
+ "src",
+ "tests"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jose Diaz-Gonzalez",
+ "email": "dotenv@josegonzalez.com",
+ "homepage": "http://josediazgonzalez.com",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "dotenv file parsing for PHP",
+ "homepage": "https://github.com/josegonzalez/php-dotenv",
+ "keywords": [
+ "configuration",
+ "dotenv",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/josegonzalez/php-dotenv/issues",
+ "source": "https://github.com/josegonzalez/php-dotenv/tree/master"
+ },
+ "time": "2017-09-19T15:49:58+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "5.2.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
+ "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/justinrainbow/json-schema/issues",
+ "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12"
+ },
+ "time": "2022-04-13T08:02:27+00:00"
+ },
+ {
+ "name": "m1/env",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/m1/Env.git",
+ "reference": "5c296e3e13450a207e12b343f3af1d7ab569f6f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/m1/Env/zipball/5c296e3e13450a207e12b343f3af1d7ab569f6f3",
+ "reference": "5c296e3e13450a207e12b343f3af1d7ab569f6f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "scrutinizer/ocular": "~1.1",
+ "squizlabs/php_codesniffer": "^2.3"
+ },
+ "suggest": {
+ "josegonzalez/dotenv": "For loading of .env",
+ "m1/vars": "For loading of configs"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "M1\\Env\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Miles Croxford",
+ "email": "hello@milescroxford.com",
+ "homepage": "http://milescroxford.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Env is a lightweight library bringing .env file parser compatibility to PHP. In short - it enables you to read .env files with PHP.",
+ "homepage": "https://github.com/m1/Env",
+ "keywords": [
+ ".env",
+ "config",
+ "dotenv",
+ "env",
+ "loader",
+ "m1",
+ "parser",
+ "support"
+ ],
+ "support": {
+ "issues": "https://github.com/m1/Env/issues",
+ "source": "https://github.com/m1/Env/tree/2.2.0"
+ },
+ "time": "2020-02-19T09:02:13+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-03T13:19:32+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.14.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
+ },
+ "time": "2022-05-31T20:59:12+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^1.0.1",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/master"
+ },
+ "time": "2017-03-05T18:14:27+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/master"
+ },
+ "time": "2017-03-05T17:38:23+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2",
+ "psalm/phar": "^4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
+ },
+ "time": "2021-10-19T17:43:47+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "77a32518733312af16a44300404e945338981de3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
+ "reference": "77a32518733312af16a44300404e945338981de3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "psalm/phar": "^4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
+ },
+ "time": "2022-03-15T21:29:03+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.10.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5 || ^3.2",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
+ },
+ "time": "2020-03-05T15:02:03+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "5.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "c89677919c5dd6d3b3852f230a663118762218ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac",
+ "reference": "c89677919c5dd6d3b3852f230a663118762218ac",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0",
+ "phpunit/php-file-iterator": "^1.4.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^2.0.1",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^3.0",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/5.3"
+ },
+ "time": "2018-04-06T15:36:58+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.net/phpunit",
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5"
+ },
+ "time": "2017-11-27T13:52:08+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+ },
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
+ },
+ "time": "2017-02-26T11:10:40+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "791198a2c6254db10131eecfe8c06670700904db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
+ "reference": "791198a2c6254db10131eecfe8c06670700904db",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
+ "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master"
+ },
+ "abandoned": true,
+ "time": "2017-11-27T05:48:46+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "6.5.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7",
+ "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.6.1",
+ "phar-io/manifest": "^1.0.1",
+ "phar-io/version": "^1.0",
+ "php": "^7.0",
+ "phpspec/prophecy": "^1.7",
+ "phpunit/php-code-coverage": "^5.3",
+ "phpunit/php-file-iterator": "^1.4.3",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^1.0.9",
+ "phpunit/phpunit-mock-objects": "^5.0.9",
+ "sebastian/comparator": "^2.1",
+ "sebastian/diff": "^2.0",
+ "sebastian/environment": "^3.1",
+ "sebastian/exporter": "^3.1",
+ "sebastian/global-state": "^2.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0.1"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2",
+ "phpunit/dbunit": "<3.0"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.5.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/6.5.14"
+ },
+ "time": "2019-02-01T05:22:47+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "5.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f",
+ "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.5",
+ "php": "^7.0",
+ "phpunit/php-text-template": "^1.2.1",
+ "sebastian/exporter": "^3.1"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5.11"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/5.0.10"
+ },
+ "abandoned": true,
+ "time": "2018-08-09T05:50:03+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.11.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "c23686f9c48ca202710dbb967df8385a952a2daf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/c23686f9c48ca202710dbb967df8385a952a2daf",
+ "reference": "c23686f9c48ca202710dbb967df8385a952a2daf",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nikic/php-parser": "^4.0 || ^3.1",
+ "php": "^8.0 || ^7.0.8",
+ "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4",
+ "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4"
+ },
+ "conflict": {
+ "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.2"
+ },
+ "suggest": {
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.11.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "support": {
+ "issues": "https://github.com/bobthecow/psysh/issues",
+ "source": "https://github.com/bobthecow/psysh/tree/v0.11.5"
+ },
+ "time": "2022-05-27T18:03:49+00:00"
+ },
+ {
+ "name": "react/promise",
+ "version": "v2.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910",
+ "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "React\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+ "keywords": [
+ "promise",
+ "promises"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/promise/issues",
+ "source": "https://github.com/reactphp/promise/tree/v2.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/WyriHaximus",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-11T10:27:51+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T08:15:22+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "2.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9",
+ "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/diff": "^2.0 || ^3.0",
+ "sebastian/exporter": "^3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/master"
+ },
+ "time": "2018-02-01T13:46:46+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
+ "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/master"
+ },
+ "time": "2017-08-03T08:09:46+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/master"
+ },
+ "time": "2017-07-01T08:51:00+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
+ "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^8.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-11-11T13:51:24+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0"
+ },
+ "time": "2017-04-27T15:39:26+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:40:27+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:37:18+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb",
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:34:24+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/master"
+ },
+ "time": "2015-07-28T20:34:47+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/master"
+ },
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "seld/jsonlint",
+ "version": "1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "4211420d25eba80712bff236a98960ef68b866b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7",
+ "reference": "4211420d25eba80712bff236a98960ef68b866b7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.5",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/jsonlint/issues",
+ "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-01T13:37:23+00:00"
+ },
+ {
+ "name": "seld/phar-utils",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/phar-utils.git",
+ "reference": "9f3452c93ff423469c0d56450431562ca423dcee"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee",
+ "reference": "9f3452c93ff423469c0d56450431562ca423dcee",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\PharUtils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "PHAR file format utilities, for when PHP phars you up",
+ "keywords": [
+ "phar"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/phar-utils/issues",
+ "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0"
+ },
+ "time": "2021-12-10T11:20:11+00:00"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "3.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563",
+ "reference": "a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "bin": [
+ "bin/phpcs",
+ "bin/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "lead"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "keywords": [
+ "phpcs",
+ "standards"
+ ],
+ "support": {
+ "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
+ "source": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+ },
+ "time": "2022-06-13T06:31:38+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9",
+ "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v5.4.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-15T08:07:45+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v5.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+ "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v5.4.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-08T05:07:18+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "af52239a330fafd192c773795520dc2dd62b5657"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657",
+ "reference": "af52239a330fafd192c773795520dc2dd62b5657",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<4.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/uid": "^5.1|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v5.4.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-21T10:24:18+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v1.44.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/ae39480f010ef88adc7938503c9b02d3baf2f3b3",
+ "reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "require-dev": {
+ "psr/container": "^1.0",
+ "symfony/phpunit-bridge": "^4.4.9|^5.0.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.44-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Twig_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Twig Team",
+ "role": "Contributors"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "https://twig.symfony.com",
+ "keywords": [
+ "templating"
+ ],
+ "support": {
+ "issues": "https://github.com/twigphp/Twig/issues",
+ "source": "https://github.com/twigphp/Twig/tree/v1.44.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-11-25T13:31:46+00:00"
+ },
+ {
+ "name": "umpirsky/twig-php-function",
+ "version": "v0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/umpirsky/twig-php-function.git",
+ "reference": "53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/umpirsky/twig-php-function/zipball/53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc",
+ "reference": "53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "twig/twig": "~1.12"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "~2.0",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Umpirsky\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Saša Stamenković",
+ "email": "umpirsky@gmail.com"
+ }
+ ],
+ "description": "Call (almost) any PHP function from your Twig templates.",
+ "support": {
+ "issues": "https://github.com/umpirsky/twig-php-function/issues",
+ "source": "https://github.com/umpirsky/twig-php-function/tree/master"
+ },
+ "time": "2016-03-12T16:36:32+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ },
+ {
+ "name": "wyrihaximus/twig-view",
+ "version": "4.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/legacy-twig-view.git",
+ "reference": "463e1a6ed493d4fe99eaeaaf39d80172b51fc0fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/legacy-twig-view/zipball/463e1a6ed493d4fe99eaeaaf39d80172b51fc0fb",
+ "reference": "463e1a6ed493d4fe99eaeaaf39d80172b51fc0fb",
+ "shasum": ""
+ },
+ "require": {
+ "ajgl/breakpoint-twig-extension": "^0.3.0",
+ "aptoma/twig-markdown": "^2.0",
+ "asm89/twig-cache-extension": "^1.0",
+ "cakephp/cakephp": "^3.7",
+ "jasny/twig-extensions": "^1.0",
+ "php": "^5.6 || ^7.0",
+ "twig/twig": "^1.27",
+ "umpirsky/twig-php-function": "0.1"
+ },
+ "require-dev": {
+ "cakephp/bake": "^1.5",
+ "cakephp/debug_kit": "^3.0",
+ "phake/phake": "^2.3.2",
+ "phpunit/phpunit": "^5.7.14",
+ "squizlabs/php_codesniffer": "^3.4.0",
+ "wyrihaximus/phpunit-class-reflection-helpers": "dev-master"
+ },
+ "type": "cakephp-plugin",
+ "autoload": {
+ "psr-4": {
+ "WyriHaximus\\TwigView\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "ceesjank@gmail.com",
+ "homepage": "http://wyrihaximus.net/"
+ }
+ ],
+ "description": "Twig powered View for CakePHP3",
+ "keywords": [
+ "cakephp",
+ "cakephp3",
+ "twig",
+ "view"
+ ],
+ "support": {
+ "issues": "https://github.com/cakephp/legacy-twig-view/issues",
+ "source": "https://github.com/cakephp/legacy-twig-view/tree/4.4.0"
+ },
+ "time": "2021-04-06T15:42:50+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "psy/psysh": 0
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.6"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/config/.env.default b/config/.env.default
new file mode 100644
index 0000000..15060f7
--- /dev/null
+++ b/config/.env.default
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+# Used as a default to seed config/.env which
+# enables you to use environment variables to configure
+# the aspects of your application that vary by
+# environment.
+#
+# Having this file in production is considered a **SECURITY RISK** and also decreases
+# the boostrap performance of your application.
+#
+# To use this file, first copy it into `config/.env`. Also ensure the related
+# code block for loading this file is uncommented in `config/boostrap.php`
+#
+# In development .env files are parsed by PHP
+# and set into the environment. This provides a simpler
+# development workflow over standard environment variables.
+export APP_NAME="__APP_NAME__"
+export DEBUG="true"
+export APP_ENCODING="UTF-8"
+export APP_DEFAULT_LOCALE="en_US"
+export APP_DEFAULT_TIMEZONE="UTC"
+export SECURITY_SALT="__SALT__"
+
+# Uncomment these to define cache configuration via environment variables.
+#export CACHE_DURATION="+2 minutes"
+#export CACHE_DEFAULT_URL="file://tmp/cache/?prefix=${APP_NAME}_default&duration=${CACHE_DURATION}"
+#export CACHE_CAKECORE_URL="file://tmp/cache/persistent?prefix=${APP_NAME}_cake_core&serialize=true&duration=${CACHE_DURATION}"
+#export CACHE_CAKEMODEL_URL="file://tmp/cache/models?prefix=${APP_NAME}_cake_model&serialize=true&duration=${CACHE_DURATION}"
+
+# Uncomment these to define email transport configuration via environment variables.
+#export EMAIL_TRANSPORT_DEFAULT_URL=""
+
+# Uncomment these to define database configuration via environment variables.
+#export DATABASE_URL="mysql://my_app:secret@localhost/${APP_NAME}?encoding=utf8&timezone=UTC&cacheMetadata=true"eIdentifiers=false&persistent=false"
+#export DATABASE_TEST_URL="mysql://my_app:secret@localhost/test_${APP_NAME}?encoding=utf8&timezone=UTC&cacheMetadata=true"eIdentifiers=false&persistent=false"
+
+# Uncomment these to define logging configuration via environment variables.
+#export LOG_DEBUG_URL="file://logs/?levels[]=notice&levels[]=info&levels[]=debug&file=debug"
+#export LOG_ERROR_URL="file://logs/?levels[]=warning&levels[]=error&levels[]=critical&levels[]=alert&levels[]=emergency&file=error"
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000..b7c2b81
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,386 @@
+ filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
+
+ /**
+ * Configure basic information about the application.
+ *
+ * - namespace - The namespace to find app classes under.
+ * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time.
+ * - encoding - The encoding used for HTML + database connections.
+ * - base - The base directory the app resides in. If false this
+ * will be auto detected.
+ * - dir - Name of app directory.
+ * - webroot - The webroot directory.
+ * - wwwRoot - The file path to webroot.
+ * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
+ * use CakePHP pretty URLs, remove these .htaccess
+ * files:
+ * /.htaccess
+ * /webroot/.htaccess
+ * And uncomment the baseUrl key below.
+ * - fullBaseUrl - A base URL to use for absolute links. When set to false (default)
+ * CakePHP generates required value based on `HTTP_HOST` environment variable.
+ * However, you can define it manually to optimize performance or if you
+ * are concerned about people manipulating the `Host` header.
+ * - imageBaseUrl - Web path to the public images directory under webroot.
+ * - cssBaseUrl - Web path to the public css directory under webroot.
+ * - jsBaseUrl - Web path to the public js directory under webroot.
+ * - paths - Configure paths for non class based resources. Supports the
+ * `plugins`, `templates`, `locales` subkeys, which allow the definition of
+ * paths for plugins, view templates and locale files respectively.
+ */
+ 'App' => [
+ 'namespace' => 'App',
+ 'encoding' => env('APP_ENCODING', 'UTF-8'),
+ 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
+ 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
+ 'base' => false,
+ 'dir' => 'src',
+ 'webroot' => 'webroot',
+ 'wwwRoot' => WWW_ROOT,
+ //'baseUrl' => env('SCRIPT_NAME'),
+ 'fullBaseUrl' => false,
+ 'imageBaseUrl' => 'img/',
+ 'cssBaseUrl' => 'css/',
+ 'jsBaseUrl' => 'js/',
+ 'paths' => [
+ 'plugins' => [ROOT . DS . 'plugins' . DS],
+ 'templates' => [APP . 'Template' . DS],
+ 'locales' => [APP . 'Locale' . DS],
+ ],
+ ],
+
+ /**
+ * Security and encryption configuration
+ *
+ * - salt - A random string used in security hashing methods.
+ * The salt value is also used as the encryption key.
+ * You should treat it as extremely sensitive data.
+ */
+ 'Security' => [
+ 'salt' => env('SECURITY_SALT', '__SALT__'),
+ ],
+
+ /**
+ * Apply timestamps with the last modified time to static assets (js, css, images).
+ * Will append a querystring parameter containing the time the file was modified.
+ * This is useful for busting browser caches.
+ *
+ * Set to true to apply timestamps when debug is true. Set to 'force' to always
+ * enable timestamping regardless of debug value.
+ */
+ 'Asset' => [
+ //'timestamp' => true,
+ // 'cacheTime' => '+1 year'
+ ],
+
+ /**
+ * Configure the cache adapters.
+ */
+ 'Cache' => [
+ 'default' => [
+ 'className' => 'Cake\Cache\Engine\FileEngine',
+ 'path' => CACHE,
+ 'url' => env('CACHE_DEFAULT_URL', null),
+ ],
+
+ /**
+ * Configure the cache used for general framework caching.
+ * Translation cache files are stored with this configuration.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ * If you set 'className' => 'Null' core cache will be disabled.
+ */
+ '_cake_core_' => [
+ 'className' => 'Cake\Cache\Engine\FileEngine',
+ 'prefix' => 'myapp_cake_core_',
+ 'path' => CACHE . 'persistent/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKECORE_URL', null),
+ ],
+
+ /**
+ * Configure the cache for model and datasource caches. This cache
+ * configuration is used to store schema descriptions, and table listings
+ * in connections.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ */
+ '_cake_model_' => [
+ 'className' => 'Cake\Cache\Engine\FileEngine',
+ 'prefix' => 'myapp_cake_model_',
+ 'path' => CACHE . 'models/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKEMODEL_URL', null),
+ ],
+
+ /**
+ * Configure the cache for routes. The cached routes collection is built the
+ * first time the routes are processed via `config/routes.php`.
+ * Duration will be set to '+2 seconds' in bootstrap.php when debug = true
+ */
+ '_cake_routes_' => [
+ 'className' => 'Cake\Cache\Engine\FileEngine',
+ 'prefix' => 'myapp_cake_routes_',
+ 'path' => CACHE,
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKEROUTES_URL', null),
+ ],
+ ],
+
+ /**
+ * Configure the Error and Exception handlers used by your application.
+ *
+ * By default errors are displayed using Debugger, when debug is true and logged
+ * by Cake\Log\Log when debug is false.
+ *
+ * In CLI environments exceptions will be printed to stderr with a backtrace.
+ * In web environments an HTML page will be displayed for the exception.
+ * With debug true, framework errors like Missing Controller will be displayed.
+ * When debug is false, framework errors will be coerced into generic HTTP errors.
+ *
+ * Options:
+ *
+ * - `errorLevel` - int - The level of errors you are interested in capturing.
+ * - `trace` - boolean - Whether or not backtraces should be included in
+ * logged errors/exceptions.
+ * - `log` - boolean - Whether or not you want exceptions logged.
+ * - `exceptionRenderer` - string - The class responsible for rendering
+ * uncaught exceptions. If you choose a custom class you should place
+ * the file for that class in src/Error. This class needs to implement a
+ * render method.
+ * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
+ * extend one of the listed exceptions will also be skipped for logging.
+ * E.g.:
+ * `'skipLog' => ['Cake\Http\Exception\NotFoundException', 'Cake\Http\Exception\UnauthorizedException']`
+ * - `extraFatalErrorMemory` - int - The number of megabytes to increase
+ * the memory limit by when a fatal error is encountered. This allows
+ * breathing room to complete logging or error handling.
+ */
+ 'Error' => [
+ 'errorLevel' => E_ALL,
+ 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
+ 'skipLog' => [],
+ 'log' => true,
+ 'trace' => true,
+ ],
+
+ /**
+ * Email configuration.
+ *
+ * By defining transports separately from delivery profiles you can easily
+ * re-use transport configuration across multiple profiles.
+ *
+ * You can specify multiple configurations for production, development and
+ * testing.
+ *
+ * Each transport needs a `className`. Valid options are as follows:
+ *
+ * Mail - Send using PHP mail function
+ * Smtp - Send using SMTP
+ * Debug - Do not send the email, just return the result
+ *
+ * You can add custom transports (or override existing transports) by adding the
+ * appropriate file to src/Mailer/Transport. Transports should be named
+ * 'YourTransport.php', where 'Your' is the name of the transport.
+ */
+ 'EmailTransport' => [
+ 'default' => [
+ 'className' => 'Cake\Mailer\Transport\MailTransport',
+ /*
+ * The following keys are used in SMTP transports:
+ */
+ 'host' => 'localhost',
+ 'port' => 25,
+ 'timeout' => 30,
+ 'username' => null,
+ 'password' => null,
+ 'client' => null,
+ 'tls' => null,
+ 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
+ ],
+ ],
+
+ /**
+ * Email delivery profiles
+ *
+ * Delivery profiles allow you to predefine various properties about email
+ * messages from your application and give the settings a name. This saves
+ * duplication across your application and makes maintenance and development
+ * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email`
+ * for more information.
+ */
+ 'Email' => [
+ 'default' => [
+ 'transport' => 'default',
+ 'from' => 'you@localhost',
+ //'charset' => 'utf-8',
+ //'headerCharset' => 'utf-8',
+ ],
+ ],
+
+ /**
+ * Connection information used by the ORM to connect
+ * to your application's datastores.
+ *
+ * ### Notes
+ * - Drivers include Mysql Postgres Sqlite Sqlserver
+ * See vendor\cakephp\cakephp\src\Database\Driver for complete list
+ * - Do not use periods in database name - it may lead to error.
+ * See https://github.com/cakephp/cakephp/issues/6471 for details.
+ * - 'encoding' is recommended to be set to full UTF-8 4-Byte support.
+ * E.g set it to 'utf8mb4' in MariaDB and MySQL and 'utf8' for any
+ * other RDBMS.
+ */
+ 'Datasources' => [
+ 'default' => [
+ 'className' => 'Cake\Database\Connection',
+ 'driver' => 'Cake\Database\Driver\Mysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ /*
+ * CakePHP will use the default DB port based on the driver selected
+ * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
+ * the following line and set the port accordingly
+ */
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'my_app',
+ /*
+ * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6).
+ */
+ //'encoding' => 'utf8mb4',
+ 'timezone' => 'UTC',
+ 'flags' => [],
+ 'cacheMetadata' => true,
+ 'log' => false,
+
+ /**
+ * Set identifier quoting to true if you are using reserved words or
+ * special characters in your table or column names. Enabling this
+ * setting will result in queries built using the Query Builder having
+ * identifiers quoted when creating SQL. It should be noted that this
+ * decreases performance because each query needs to be traversed and
+ * manipulated before being executed.
+ */
+ 'quoteIdentifiers' => false,
+
+ /**
+ * During development, if using MySQL < 5.6, uncommenting the
+ * following line could boost the speed at which schema metadata is
+ * fetched from the database. It can also be set directly with the
+ * mysql configuration directive 'innodb_stats_on_metadata = 0'
+ * which is the recommended value in production environments
+ */
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+
+ 'url' => env('DATABASE_URL', null),
+ ],
+
+ /**
+ * The test connection is used during the test suite.
+ */
+ 'test' => [
+ 'className' => 'Cake\Database\Connection',
+ 'driver' => 'Cake\Database\Driver\Mysql',
+ 'persistent' => false,
+ 'host' => 'localhost',
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'test_myapp',
+ //'encoding' => 'utf8mb4',
+ 'timezone' => 'UTC',
+ 'cacheMetadata' => true,
+ 'quoteIdentifiers' => false,
+ 'log' => false,
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+ 'url' => env('DATABASE_TEST_URL', null),
+ ],
+ ],
+
+ /**
+ * Configures logging options
+ */
+ 'Log' => [
+ 'debug' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'debug',
+ 'url' => env('LOG_DEBUG_URL', null),
+ 'scopes' => false,
+ 'levels' => ['notice', 'info', 'debug'],
+ ],
+ 'error' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'error',
+ 'url' => env('LOG_ERROR_URL', null),
+ 'scopes' => false,
+ 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
+ ],
+ // To enable this dedicated query log, you need set your datasource's log flag to true
+ 'queries' => [
+ 'className' => 'Cake\Log\Engine\FileLog',
+ 'path' => LOGS,
+ 'file' => 'queries',
+ 'url' => env('LOG_QUERIES_URL', null),
+ 'scopes' => ['queriesLog'],
+ ],
+ ],
+
+ /**
+ * Session configuration.
+ *
+ * Contains an array of settings to use for session configuration. The
+ * `defaults` key is used to define a default preset to use for sessions, any
+ * settings declared here will override the settings of the default config.
+ *
+ * ## Options
+ *
+ * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. Avoid using `.` in cookie names,
+ * as PHP will drop sessions from cookies with `.` in the name.
+ * - `cookiePath` - The url path for which session cookie is set. Maps to the
+ * `session.cookie_path` php.ini config. Defaults to base path of app.
+ * - `timeout` - The time in minutes the session should be valid for.
+ * Pass 0 to disable checking timeout.
+ * Please note that php.ini's session.gc_maxlifetime must be equal to or greater
+ * than the largest Session['timeout'] in all served websites for it to have the
+ * desired effect.
+ * - `defaults` - The default configuration set to use as a basis for your session.
+ * There are four built-in options: php, cake, cache, database.
+ * - `handler` - Can be used to enable a custom session handler. Expects an
+ * array with at least the `engine` key, being the name of the Session engine
+ * class to use for managing the session. CakePHP bundles the `CacheSession`
+ * and `DatabaseSession` engines.
+ * - `ini` - An associative array of additional ini values to set.
+ *
+ * The built-in `defaults` options are:
+ *
+ * - 'php' - Uses settings defined in your php.ini.
+ * - 'cake' - Saves session files in CakePHP's /tmp directory.
+ * - 'database' - Uses CakePHP's database sessions.
+ * - 'cache' - Use the Cache class to save sessions.
+ *
+ * To define a custom session handler, save it at src/Network/Session/.php.
+ * Make sure the class implements PHP's `SessionHandlerInterface` and set
+ * Session.handler to
+ *
+ * To use database sessions, load the SQL file located at config/schema/sessions.sql
+ */
+ 'Session' => [
+ 'defaults' => 'php',
+ ],
+];
diff --git a/config/bootstrap.php b/config/bootstrap.php
new file mode 100644
index 0000000..1c266a4
--- /dev/null
+++ b/config/bootstrap.php
@@ -0,0 +1,203 @@
+parse()
+// ->putenv()
+// ->toEnv()
+// ->toServer();
+// }
+
+/*
+ * Read configuration file and inject configuration into various
+ * CakePHP classes.
+ *
+ * By default there is only one configuration file. It is often a good
+ * idea to create multiple configuration files, and separate the configuration
+ * that changes from configuration that does not. This makes deployment simpler.
+ */
+try {
+ Configure::config('default', new PhpConfig());
+ Configure::load('app', 'default', false);
+} catch (\Exception $e) {
+ exit($e->getMessage() . "\n");
+}
+
+/*
+ * Load an environment local configuration file.
+ * You can use a file like app_local.php to provide local overrides to your
+ * shared configuration.
+ */
+//Configure::load('app_local', 'default');
+
+/*
+ * When debug = true the metadata cache should only last
+ * for a short time.
+ */
+if (Configure::read('debug')) {
+ Configure::write('Cache._cake_model_.duration', '+2 minutes');
+ Configure::write('Cache._cake_core_.duration', '+2 minutes');
+ // disable router cache during development
+ Configure::write('Cache._cake_routes_.duration', '+2 seconds');
+}
+
+/*
+ * Set the default server timezone. Using UTC makes time calculations / conversions easier.
+ * Check http://php.net/manual/en/timezones.php for list of valid timezone strings.
+ */
+date_default_timezone_set(Configure::read('App.defaultTimezone'));
+
+/*
+ * Configure the mbstring extension to use the correct encoding.
+ */
+mb_internal_encoding(Configure::read('App.encoding'));
+
+/*
+ * Set the default locale. This controls how dates, number and currency is
+ * formatted and sets the default language to use for translations.
+ */
+ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
+
+/*
+ * Register application error and exception handlers.
+ */
+$isCli = PHP_SAPI === 'cli';
+if ($isCli) {
+ (new ConsoleErrorHandler(Configure::read('Error')))->register();
+} else {
+ (new ErrorHandler(Configure::read('Error')))->register();
+}
+
+/*
+ * Include the CLI bootstrap overrides.
+ */
+if ($isCli) {
+ require __DIR__ . '/bootstrap_cli.php';
+}
+
+/*
+ * Set the full base URL.
+ * This URL is used as the base of all absolute links.
+ *
+ * If you define fullBaseUrl in your config file you can remove this.
+ */
+if (!Configure::read('App.fullBaseUrl')) {
+ $s = null;
+ if (env('HTTPS')) {
+ $s = 's';
+ }
+
+ $httpHost = env('HTTP_HOST');
+ if (isset($httpHost)) {
+ Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost);
+ }
+ unset($httpHost, $s);
+}
+
+Cache::setConfig(Configure::consume('Cache'));
+ConnectionManager::setConfig(Configure::consume('Datasources'));
+TransportFactory::setConfig(Configure::consume('EmailTransport'));
+Email::setConfig(Configure::consume('Email'));
+Log::setConfig(Configure::consume('Log'));
+Security::setSalt(Configure::consume('Security.salt'));
+
+/*
+ * The default crypto extension in 3.0 is OpenSSL.
+ * If you are migrating from 2.x uncomment this code to
+ * use a more compatible Mcrypt based implementation
+ */
+//Security::engine(new \Cake\Utility\Crypto\Mcrypt());
+
+/*
+ * Setup detectors for mobile and tablet.
+ */
+ServerRequest::addDetector('mobile', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isMobile();
+});
+ServerRequest::addDetector('tablet', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isTablet();
+});
+
+/*
+ * Enable immutable time objects in the ORM.
+ *
+ * You can enable default locale format parsing by adding calls
+ * to `useLocaleParser()`. This enables the automatic conversion of
+ * locale specific date formats. For details see
+ * @link https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data
+ */
+Type::build('time')
+ ->useImmutable();
+Type::build('date')
+ ->useImmutable();
+Type::build('datetime')
+ ->useImmutable();
+Type::build('timestamp')
+ ->useImmutable();
+
+/*
+ * Custom Inflector rules, can be set to correctly pluralize or singularize
+ * table, model, controller names or whatever other string is passed to the
+ * inflection functions.
+ */
+//Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']);
+//Inflector::rules('irregular', ['red' => 'redlings']);
+//Inflector::rules('uninflected', ['dontinflectme']);
+//Inflector::rules('transliteration', ['/å/' => 'aa']);
diff --git a/config/bootstrap_cli.php b/config/bootstrap_cli.php
new file mode 100644
index 0000000..d3679d7
--- /dev/null
+++ b/config/bootstrap_cli.php
@@ -0,0 +1,28 @@
+registerMiddleware('csrf', new CsrfProtectionMiddleware([
+ 'httpOnly' => true
+
+ ]));
+
+ /**
+ * Apply a middleware to the current route scope.
+ * Requires middleware to be registered via `Application::routes()` with `registerMiddleware()`
+ */
+ $routes->applyMiddleware('csrf');
+ /**
+ * view router
+ */
+
+ $routes->connect('/signup/*', ['controller' => 'Home', 'action' => 'registrationView']);
+ $routes->connect('/loginscreen/*', ['controller' => 'Home', 'action' => 'loginScreen']);
+ $routes->connect('/minimal/*', ['controller' => 'Home', 'action' => 'minimal']);
+ $routes->connect('/', ['controller' => 'Home', 'action' => 'minimal']);
+ $routes->connect('/profileview/*', ['controller' => 'Profile', 'action' => 'profileView']);
+ $routes->connect('/forgot/*', ['controller' => 'Home', 'action' => 'forgotPasswordView']);
+ $routes->connect('/changepasswordview/*', ['controller' => 'Profile', 'action' => 'changePasswordView']);
+ $routes->connect('/accountView/*', ['controller' => 'Profile', 'action' => ' accountView']);
+ $routes->connect('/setpasswordview/*', ['controller' => 'Profile', 'action' => ' setPasswordView']);
+ $routes->connect('/accountLinkingView/*', ['controller' => 'Profile', 'action' => 'accountLinkingView']);
+ $routes->connect('/customObjectView/*', ['controller' => 'Profile', 'action' => 'customObjectView']);
+ $routes->connect('/resetMultifactorView/*', ['controller' => 'Profile', 'action' => 'resetMultifactorView']);
+ $routes->connect('/roleView/*', ['controller' => 'Profile', 'action' => 'roleView']);
+
+
+ /**
+ * Here, we are connecting '/' (base path) to a controller called 'Pages',
+ * its action called 'display', and we pass a param to select the view file
+ * to use (in this case, src/Template/Pages/home.ctp)...
+ */
+ $routes->connect('/registration/*', ['controller' => 'Home', 'action' => 'registration']);
+ $routes->connect('/login/*', ['controller' => 'Home', 'action' => 'login']);
+ $routes->connect('/profile/*', ['controller' => 'Profile', 'action' => 'profile']);
+ $routes->connect('/forgotpassword/*', ['controller' => 'Home', 'action' => 'forgotPassword']);
+ $routes->connect('/resetpassword/*', ['controller' => 'Home', 'action' => 'resetPassword']);
+
+ /**
+ * ...and connect the rest of 'Pages' controller's URLs.
+ */
+ $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
+
+ /**
+ * Connect catchall routes for all controllers.
+ *
+ * Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for
+ *
+ * ```
+ * $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);
+ * $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
+ * ```
+ *
+ * Any route class can be used with this method, such as:
+ * - DashedRoute
+ * - InflectedRoute
+ * - Route
+ * - Or your own route class
+ *
+ * You can remove these routes once you've connected the
+ * routes you want in your application.
+ */
+ $routes->fallbacks(DashedRoute::class);
+});
+
+/**
+ * If you need a different set of middleware or none at all,
+ * open new scope and define routes there.
+ *
+ * ```
+ * Router::scope('/api', function (RouteBuilder $routes) {
+ * // No $routes->applyMiddleware() here.
+ * // Connect API actions here.
+ * });
+ * ```
+ */
diff --git a/config/schema/i18n.sql b/config/schema/i18n.sql
new file mode 100644
index 0000000..e59d1e6
--- /dev/null
+++ b/config/schema/i18n.sql
@@ -0,0 +1,18 @@
+# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (https://opensource.org/licenses/mit-license.php)
+
+CREATE TABLE i18n (
+ id int NOT NULL auto_increment,
+ locale varchar(6) NOT NULL,
+ model varchar(255) NOT NULL,
+ foreign_key int(10) NOT NULL,
+ field varchar(255) NOT NULL,
+ content text,
+ PRIMARY KEY (id),
+ UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
+ INDEX I18N_FIELD(model, foreign_key, field)
+);
diff --git a/config/schema/sessions.sql b/config/schema/sessions.sql
new file mode 100644
index 0000000..1aa0a0f
--- /dev/null
+++ b/config/schema/sessions.sql
@@ -0,0 +1,15 @@
+# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (https://opensource.org/licenses/mit-license.php)
+
+CREATE TABLE `sessions` (
+ `id` char(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
+ `created` datetime DEFAULT CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+
+ `modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+
+ `data` blob DEFAULT NULL, -- for PostgreSQL use bytea instead of blob
+ `expires` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
diff --git a/demo/README.md b/demo/README.md
deleted file mode 100644
index 2c0c6d6..0000000
--- a/demo/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-
-LoginRadius
-==========
-
-
-
------------------------------------------------
-LoginRadius PHP wrapper provides access to LoginRadius.
-
-LoginRadius is a unified **Customer Identity Management** API platform that combines 30 major social platforms into a single simplified and maintenance-free API. With LoginRadius' API, websites and mobile apps can implement capture user profile data, enable social login, enable social sharing, add single sign-on and many more.
-
-LoginRadius helps businesses boost user engagement on their web/mobile platform, manage online identities, utilize social media for marketing, capture accurate consumer data and get unique social insight into their customer base.
-
-Please visit https://docs.loginradius.com/api/v2/deployment/sdk-libraries/php-library for more information.
-
-PHP Library
---------------
-
-This document contains information and examples regarding the LoginRadius PHP SDK. It provides guidance for working with social authentication, capture user profile data, enable social login, enable social sharing, single sign-on, user profile data and sending messages with a variety of social networks such as Facebook, Google, Twitter, Yahoo, LinkedIn, and more.
-
-# LoginRadius
-
-A demo PHP web application using the PHP SDK. The following features are included:
-
-* Traditional Email Login
-* Multi-Factor Email Login
-* Passwordless Login
-* Social Login
-* Registration
-* Email Verification
-* Forgot Password
-* Reset Password
-* Change Password
-* Set Password
-* Update Account
-* Multi-Factor Configuration
-* Account Linking
-* Custom Object Management
-* Roles Management
-
-## Configuration
-
-1. Download the demo, src/LoginRadiusSDK from php sdk repo or clone the whole repo.
-2. Upload these on server and wrapped in one directory.
-3. Set your LoginRadius credentials on the client and server side:
- * Server side: `demo/ajax_handler/config.php`
- * Client side: `demo/js/options.js`
-4. Demo will appear on `//demo`
diff --git a/demo/ajax_handler/.htaccess b/demo/ajax_handler/.htaccess
deleted file mode 100644
index 98e5c47..0000000
--- a/demo/ajax_handler/.htaccess
+++ /dev/null
@@ -1,4 +0,0 @@
-RewriteEngine on
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteCond %{REQUEST_FILENAME} !-d
-RewriteRule ^(.+)(/?)$ index.php?page=$1 [NE,L]
\ No newline at end of file
diff --git a/demo/ajax_handler/config.php b/demo/ajax_handler/config.php
deleted file mode 100644
index 9255574..0000000
--- a/demo/ajax_handler/config.php
+++ /dev/null
@@ -1,20 +0,0 @@
-'); // Pass API Key
-define('API_SECRET', ''); // Pass API Secret Key
-define('API_REQUEST_SIGNING', ''); // Pass true/false for enable/disable
-define('AUTH_FLOW', ''); // Pass optional/disabled, if email verification flow optional or disabled, no need to mention if required flow
-
-//If you have Custom API Domain then define 'API_DOMAIN' then replaced it with your custom API domain,
-//otherwise no need to define these option in configuration.
-//define('API_DOMAIN', 'https://api.example.com');
-
-require_once "../../src/LoginRadiusSDK/Utility/Functions.php";
-require_once "../../src/LoginRadiusSDK/LoginRadiusException.php";
-require_once "../../src/LoginRadiusSDK/Clients/IHttpClient.php";
-require_once "../../src/LoginRadiusSDK/Clients/DefaultHttpClient.php";
-require_once "../../src/LoginRadiusSDK/CustomerRegistration/Social/SocialLoginAPI.php";
-require_once "../../src/LoginRadiusSDK/CustomerRegistration/Account/AccountAPI.php";
-require_once "../../src/LoginRadiusSDK/CustomerRegistration/Account/RoleAPI.php";
-require_once "../../src/LoginRadiusSDK/CustomerRegistration/Authentication/AuthCustomObjectAPI.php";
-require_once "../../src/LoginRadiusSDK/CustomerRegistration/Authentication/UserAPI.php";
diff --git a/demo/ajax_handler/index.php b/demo/ajax_handler/index.php
deleted file mode 100644
index ef508c0..0000000
--- a/demo/ajax_handler/index.php
+++ /dev/null
@@ -1,14 +0,0 @@
- 'error', 'message' => 'An error occurred.');
- if (empty($email) || empty($password)) {
- $response['message'] = 'Email Id and Password are required fields.';
- } else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $payload = array('email' => $email, 'password' => $password);
- $result = $authenticationObj->authLoginByEmail($payload);
- if (isset($result->access_token) && $result->access_token != '') {
- $response['data'] = $result;
- $response['message'] = "Logged in successfully";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- }
- }
- return json_encode($response);
-}
-
-function getProfile(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($token)) {
- $response['message'] = 'Access Token is a required field.';
- }
- else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->getProfile($token);
- if ((isset($result->EmailVerified) && $result->EmailVerified) || AUTH_FLOW == 'optional' || AUTH_FLOW == 'disabled') {
- $response['data'] = $result;
- $response['message'] = "Profile successfully retrieved.";
- $response['status'] = 'success';
- }
- else {
- $response['message'] = "Email is not verified.";
- $response['status'] = 'error';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function registration(array $request) {
- $email = isset($request['email']) ? trim($request['email']) : '';
- $password = isset($request['password']) ? trim($request['password']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($email) || empty($password)) {
- $response['message'] = 'Email Id and Password are required fields.';
- } else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $payload = array('Email' => array(array('Type' => 'Primary', 'Value' => $email)), 'password' => $password);
- $result = $authenticationObj->registerByEmail($payload, $request['verificationurl']);
- if ((isset($result->EmailVerified) && $result->EmailVerified) || AUTH_FLOW == 'optional' || AUTH_FLOW == 'disabled') {
- $response['result'] = $result;
- $response['message'] = "Successfully registered.";
- $response['status'] = 'success';
- } else {
- $response['message'] = "Successfully registered, please check your email to verify your account.";
- $response['status'] = 'registered';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function pwLessLogin(array $request) {
- $email = isset($request['email']) ? trim($request['email']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($email)) {
- $response['message'] = 'Email Id is a required field.';
- }
- else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->passwordLessLoginByEmail($email, $request['verificationurl']);
- if ((isset($result->IsPosted) && $result->IsPosted)) {
- $response['message'] = "One time login link has been sent to your provided email id, check email for further instruction.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function forgotPassword(array $request) {
- $email = isset($request['email']) ? trim($request['email']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($email)) {
- $response['message'] = 'Email Id is a required field.';
- }
- else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->forgotPassword($email, $request['resetPasswordUrl']);
- if ((isset($result->IsPosted) && $result->IsPosted)) {
- $response['message'] = "An email has been sent to your address with instructions to reset your password.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function resetPassword(array $request) {
- $token = isset($request['resettoken']) ? trim($request['resettoken']) : '';
- $password = isset($request['password']) ? trim($request['password']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($token) || empty($password)) {
- $response['message'] = 'Password are required fields.';
- } else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->resetPassword($token, $password);
- if ((isset($result->IsPosted) && $result->IsPosted)) {
- $response['message'] = "Password has been reset successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function pwLessLinkVerify(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($token)) {
- $response['message'] = 'Token is a required field.';
- }
- else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->passwordLessLoginVerification($token);
- if ((isset($result->access_token) && $result->access_token != '')) {
- $response['data'] = $result;
- $response['message'] = "Link successfully verified.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function emailVerify(array $request) {
- $vtoken = isset($request['vtoken']) ? trim($request['vtoken']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($vtoken)) {
- $response['message'] = 'Verification Token is a required field.';
- }
- else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->verifyEmail($vtoken);
- if ((isset($result->IsPosted) && $result->IsPosted)) {
- $response['message'] = "Your email has been verified successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function mfaLogin(array $request) {
- $email = isset($request['email']) ? trim($request['email']) : '';
- $password = isset($request['password']) ? trim($request['password']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($email) || empty($password)) {
- $response['message'] = 'Email Id and Password are required fields.';
- } else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $payload = array('email' => $email, 'password' => $password);
- $result = $authenticationObj->mfaEmailLogin($payload);
- $response['data'] = $result;
- $response['message'] = "Successful MFA Login.";
- $response['status'] = 'success';
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function mfaValidate(array $request) {
- $secondFactorAuthenticationToken = isset($request['secondFactorAuthenticationToken']) ? trim($request['secondFactorAuthenticationToken']) : '';
- $googleAuthCode = isset($request['googleAuthCode']) ? trim($request['googleAuthCode']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($secondFactorAuthenticationToken)) {
- $response['message'] = 'Second Factor Auth Token is a required field.';
- } else if (empty($googleAuthCode)) {
- $response['message'] = 'Google Auth Code is a required field.';
- } else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authenticationObj->mfaValidateGoogleAuthCode($secondFactorAuthenticationToken, $googleAuthCode);
- if ((isset($result->access_token) && $result->access_token != '')) {
- $response['data'] = $result;
- $response['message'] = "Google Auth Code successfully validated.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
diff --git a/demo/ajax_handler/profile.php b/demo/ajax_handler/profile.php
deleted file mode 100644
index 69dc27c..0000000
--- a/demo/ajax_handler/profile.php
+++ /dev/null
@@ -1,343 +0,0 @@
- 'error', 'message' => 'An error occurred.');
- if (empty($token)) {
- $response['message'] = 'Access Token is a required field.';
- }
- else {
- $authObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authObj->getProfile($token);
- if ((isset($result->Uid) && $result->Uid != '')) {
- $response['data'] = $result;
- $response['message'] = "Profile successfully retrieved.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->getMessage();
- $response['status'] = "error";
- }
- }
- return json_encode($response);
-}
-
-function updateAccount(array $request) {
- $firstname = isset($request['firstname']) ? trim($request['firstname']) : '';
- $lastname = isset($request['lastname']) ? trim($request['lastname']) : '';
- $about = isset($request['about']) ? trim($request['about']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
-
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json'));
- try {
- $payload = array('FirstName' => $firstname, 'LastName' => $lastname, 'About' => $about);
- $result = $authenticationObj->updateProfile($request['token'], $payload);
- if (isset($result->IsPosted) && $result->IsPosted) {
- $response['message'] = "Profile has been updated successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- return json_encode($response);
-}
-
-function changePassword(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $oldpassword = isset($request['oldpassword']) ? trim($request['oldpassword']) : '';
- $newpassword = isset($request['newpassword']) ? trim($request['newpassword']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($oldpassword)) {
- $response['message'] = 'Old password is a required field.';
- }
- elseif (empty($newpassword)) {
- $response['message'] = 'New password is a required field.';
- }
- else {
- $authenticationObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json'));
- try {
- $result = $authenticationObj->changeAccountPassword($token, $oldpassword, $newpassword);
- if (isset($result->IsPosted) && $result->IsPosted) {
- $response['message'] = "Password has been changed successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function setPassword(array $request) {
- $uid = isset($request['uid']) ? trim($request['uid']) : '';
- $newpassword = isset($request['newpassword']) ? trim($request['newpassword']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($newpassword)) {
- $response['message'] = 'New password is a required field.';
- }
- else {
- $accountObj = new AccountAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $accountObj->setPassword($uid, $newpassword);
- if (isset($result->PasswordHash) && $result->PasswordHash != '') {
- $response['message'] = "The password has been set successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function createCustomObjects(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $objectName = isset($request['objectName']) ? trim($request['objectName']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($objectName)) {
- $response['message'] = 'Object name is a required field.';
- }
- else {
- $authCustomObj = new AuthCustomObjectAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authCustomObj->createCustomObject($token, $objectName, $request['payload']);
- if (isset($result->Uid) && $result->Uid != '') {
- $response['message'] = "Custom object created successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function getCustomObjects(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $objectName = isset($request['objectName']) ? trim($request['objectName']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($objectName)) {
- $response['message'] = 'Object name is a required field.';
- }
- else {
- $authCustomObj = new AuthCustomObjectAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authCustomObj->getCustomObjectSetsByToken($token, $objectName);
- if (isset($result->Count) && $result->Count != '0') {
- $response['result'] = $result;
- $response['status'] = 'success';
- }
- else {
- $response['status'] = 'empty';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function updateCustomObjects(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $objectName = isset($request['objectName']) ? trim($request['objectName']) : '';
- $objectRecordId = isset($request['objectRecordId']) ? trim($request['objectRecordId']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($objectName)) {
- $response['message'] = 'Object name is a required field.';
- }
- elseif (empty($objectRecordId)) {
- $response['message'] = 'Object Id is a required field.';
- }
- else {
- $authCustomObj = new AuthCustomObjectAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authCustomObj->updateCustomObjectData($token, $objectName, $objectRecordId, 'replace', $request['payload']);
- if (isset($result->Uid) && $result->Uid != '') {
- $response['message'] = "Custom object updated successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function deleteCustomObjects(array $request) {
- $token = isset($request['token']) ? trim($request['token']) : '';
- $objectName = isset($request['objectName']) ? trim($request['objectName']) : '';
- $objectRecordId = isset($request['objectRecordId']) ? trim($request['objectRecordId']) : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($objectName)) {
- $response['message'] = 'Object name is a required field.';
- }
- elseif (empty($objectRecordId)) {
- $response['message'] = 'Object Id is a required field.';
- }
- else {
- $authCustomObj = new AuthCustomObjectAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authCustomObj->deleteCustomObjectSet($token, $objectName, $objectRecordId);
- if (isset($result->IsDeleted) && $result->IsDeleted) {
- $response['message'] = "Custom object deleted successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function handleCreateRole(array $request) {
- $roles = isset($request['roles']) ? $request['roles'] : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($roles)) {
- $response['message'] = 'Role is a required field.';
- }
- else {
- $roleObj = new RoleAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $roleObj->create($roles);
- if (isset($result->Count) && $result->Count != '') {
- $response['message'] = "Role successfully created.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function handleDeleteRole(array $request) {
- $roles = isset($request['roles']) ? $request['roles'] : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($roles)) {
- $response['message'] = 'Role is a required field.';
- }
- else {
- $roleObj = new RoleAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $roleObj->delete($roles);
- if (isset($result->IsDeleted) && $result->IsDeleted) {
- $response['message'] = "Role has been deleted.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function handleAssignUserRole(array $request) {
- $uid = isset($request['uid']) ? trim($request['uid']) : '';
- $roles = isset($request['roles']) ? $request['roles'] : '';
- $response = array('status' => 'error', 'message' => 'An error occurred.');
- if (empty($roles)) {
- $response['message'] = 'Role is a required field.';
- }
- else {
- $roleObj = new RoleAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $roleObj->assignRolesByUid($uid, $roles);
- if (isset($result->Roles) && $result->Roles != '') {
- $response['message'] = "Role assigned successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- }
- return json_encode($response);
-}
-
-function getAllRoles(array $request) {
- $roleObj = new RoleAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $roleObj->get();
- if (isset($result->Count) && $result->Count != '0') {
- $response['result'] = $result;
- $response['status'] = 'success';
- }
- else {
- $response['message'] = 'No existing roles found.';
- $response['status'] = 'rolesempty';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->getMessage();
- $response['status'] = 'error';
- }
- return json_encode($response);
-}
-
-function getUserRoles(array $request) {
- $roleObj = new RoleAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $roleObj->getAccountRolesByUid($request['uid']);
- if (isset($result->Roles) && $result->Roles != '') {
- $response['data'] = $result;
- $response['status'] = 'success';
- }
- else {
- $response['message'] = 'User has no roles assigned.';
- $response['status'] = 'userrolesempty';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->getMessage();
- $response['status'] = 'error';
- }
- return json_encode($response);
-}
-
-function resetMultifactor(array $request) {
- $authObj = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- try {
- $result = $authObj->resetGoogleAuthenticatorByToken($request['token'], true);
- if (isset($result->IsDeleted) && $result->IsDeleted) {
- $response['message'] = "Reset successfully.";
- $response['status'] = 'success';
- }
- }
- catch (LoginRadiusException $e) {
- $response['message'] = $e->error_response->Description;
- $response['status'] = 'error';
- }
- return json_encode($response);
-}
diff --git a/demo/emailverification.html b/demo/emailverification.html
deleted file mode 100644
index 3482864..0000000
--- a/demo/emailverification.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
- SDK Demo Verification Page
-
-
-
-
-
-
-
-
-
-
Email Verification
-
-
-
-
-
-
-
-
diff --git a/demo/index.html b/demo/index.html
deleted file mode 100644
index b6a5cb8..0000000
--- a/demo/index.html
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
- SDK Demo Index Page
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Login
-
-
-
Login
-
-
-
-
-
-
- Next
-
-
-
-
-
Email me a link to sign in
-
-
-
-
Social Login
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/demo/js/emailVerification.js b/demo/js/emailVerification.js
deleted file mode 100644
index ae3e879..0000000
--- a/demo/js/emailVerification.js
+++ /dev/null
@@ -1,62 +0,0 @@
-const url = window.location.href;
-const params = url.split("?")[1];
-const domainName = url.substring(0, url.lastIndexOf("/"));
-
-let paramsObj = {};
-
-if (params) {
- paramsObj = JSON.parse('{"' + decodeURI(params.replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}');
-
- if (paramsObj.vtype === "emailverification") {
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- dataType: "json",
- data: $.param({
- vtoken: paramsObj.vtoken,
- action: "emailVerify"
- }),
- error: function(xhr){
- $("#minimal-verification-message").text(xhr.responseJSON);
- $("#minimal-verification-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- localStorage.setItem("LrEmailStatus", "verified");
- $("#minimal-verification-message").text(ret.message);
- $("#minimal-verification-message").attr("class", "success-message");
- } else if (ret.status == "error") {
- $("#minimal-verification-message").text(ret.message);
- $("#minimal-verification-message").attr("class", "error-message");
- }
- });
- } else if (paramsObj.vtype === "oneclicksignin") {
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- data: $.param({
- token: paramsObj.vtoken,
- action: "pwLessLinkVerify"
- }),
- dataType: "json",
- error: function(xhr) {
- $("#minimal-verification-message").text(xhr.responseJSON);
- $("#minimal-verification-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- localStorage.setItem("LRTokenKey", ret.data.access_token);
- localStorage.removeItem("LrEmailStatus");
- localStorage.setItem("lr-user-uid", ret.data.Profile.Uid);
- window.location.replace("profile.html");
- } else if (ret.status == "error") {
- $("#minimal-verification-message").text(ret.message);
- $("#minimal-verification-message").attr("class", "error-message");
- }
- });
- } else {
- window.location.replace("index.html");
- }
-} else {
- window.location.replace("index.html");
-}
diff --git a/demo/js/indexControl.js b/demo/js/indexControl.js
deleted file mode 100644
index 7205a0c..0000000
--- a/demo/js/indexControl.js
+++ /dev/null
@@ -1,248 +0,0 @@
-const url = window.location.href;
-const domainName = url.substring(0, url.lastIndexOf("/"));
-let multiFactorAuthToken;
-
-let custom_interface_option = {};
-custom_interface_option.templateName = 'loginradiuscustom_tmpl';
-LRObject.util.ready(function() {
- LRObject.customInterface(".interfacecontainerdiv", custom_interface_option);
-});
-
-let sl_options = {};
-sl_options.onSuccess = function(response) {
- localStorage.setItem("LRTokenKey", response.access_token);
- localStorage.removeItem("LrEmailStatus");
- localStorage.setItem("lr-user-uid", response.Profile.Uid);
- window.location.replace("profile.html");
-};
-sl_options.onError = function(errors) {
- localStorage.setItem("LrEmailStatus", 'unverified');
- $("#sociallogin-message").text(errors[0].Description);
- $("#sociallogin-message").attr("class", "error-message");
-};
-sl_options.container = "sociallogin-container";
-
-LRObject.util.ready(function() {
- LRObject.init('socialLogin', sl_options);
-});
-
-$("#btn-minimal-login").click(function() {
- $("#minimal-login-message").text("");
-
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- dataType: "json",
- data: $.param({
- email: $("#minimal-login-email").val(),
- password: $("#minimal-login-password").val(),
- action: "loginByEmail"
- }),
- error: function(xhr) {
- $("#minimal-login-message").text(xhr.responseJSON);
- $("#minimal-login-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- localStorage.setItem("LRTokenKey", ret.data.access_token);
- localStorage.removeItem("LrEmailStatus");
- localStorage.setItem("lr-user-uid", ret.data.Profile.Uid);
- $("#minimal-login-email").val("");
- $("#minimal-login-password").val("");
- window.location.replace("profile.html");
- } else if (ret.status == "error") {
- $("#minimal-login-message").text(ret.message);
- $("#minimal-login-message").attr("class", "error-message");
- }
- });
-});
-
-$("#btn-minimal-mfalogin-next").click(function() {
- $("#minimal-mfalogin-message").text("");
-
- data = {
- "Email" : $("#minimal-mfalogin-email").val(),
- "Password" : $("#minimal-mfalogin-password").val()
- }
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- data: $.param({
- email: $("#minimal-mfalogin-email").val(),
- password: $("#minimal-mfalogin-password").val(),
- action: "mfaLogin"
- }),
- dataType: "json",
- error: function(xhr) {
- $("#minimal-mfalogin-message").text(xhr.responseJSON);
- $("#minimal-mfalogin-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- $("#minimal-mfalogin-email").val("");
- $("#minimal-mfalogin-password").val("");
- if (typeof(ret.data.SecondFactorAuthentication) != "undefined" && ret.data.SecondFactorAuthentication != null) {
- if (ret.data.SecondFactorAuthentication.IsGoogleAuthenticatorVerified === false) {
- $("#minimal-mfalogin-qrcode").append(' ');
- }
- $("#minimal-mfalogin-next")
- .html('' +
- 'Login ');
- multiFactorAuthToken = ret.data.SecondFactorAuthentication.SecondFactorAuthenticationToken;
- } else {
- localStorage.setItem("LRTokenKey", ret.data.access_token);
- localStorage.removeItem("LrEmailStatus");
- localStorage.setItem("lr-user-uid", ret.data.Profile.Uid);
- window.location.replace("profile.html");
- }
- } else if (ret.status == "error") {
- $("#minimal-mfalogin-message").text(ret.message);
- $("#minimal-mfalogin-message").attr("class", "error-message");
- }
- });
-});
-
-$("#minimal-mfalogin-next").on('click', "#btn-minimal-mfalogin-login", function() {
- $("#minimal-mfalogin-message").text("");
-
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- data: $.param({
- secondFactorAuthenticationToken: multiFactorAuthToken,
- googleAuthCode: $("#minimal-mfalogin-googlecode").val(),
- action: "mfaValidate"
- }),
- dataType: "json",
- error: function(xhr) {
- $("#minimal-mfalogin-message").text(xhr.responseJSON);
- $("#minimal-mfalogin-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- localStorage.setItem("LRTokenKey", ret.data.access_token);
- localStorage.removeItem("LrEmailStatus");
- localStorage.setItem("lr-user-uid", ret.data.Profile.Uid);
- window.location.replace("profile.html");
- } else if (ret.status == "error") {
- $("#minimal-mfalogin-message").text(ret.message);
- $("#minimal-mfalogin-message").attr("class", "error-message");
- }
- });
-});
-
-$("#btn-minimal-pwless").click(function() {
- $("#minimal-pwless-message").text("");
-
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- data: $.param({
- email: $("#minimal-pwless-email").val(),
- verificationurl: commonOptions.verificationUrl,
- action: "pwLessLogin"
- }),
- dataType: "json",
- error: function(xhr) {
- $("#minimal-pwless-message").text(xhr.responseJSON);
- $("#minimal-pwless-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- $("#minimal-pwless-email").val("");
- $("#minimal-pwless-message").text(ret.message);
- $("#minimal-pwless-message").attr("class", "success-message");
- } else if (ret.status == "error") {
- $("#minimal-pwless-message").text(ret.message);
- $("#minimal-pwless-message").attr("class", "error-message");
- }
- });
-});
-
-$("#btn-minimal-signup").click(function() {
- $("#minimal-signup-message").text("");
-
- if($("#minimal-signup-password").val() != $("#minimal-signup-confirmpassword").val()) {
- $("#minimal-signup-message").text("Passwords do not match!");
- $("#minimal-signup-message").attr("class", "error-message");
- return
- }
-
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- dataType: "json",
- data: $.param({
- email: $("#minimal-signup-email").val(),
- password: $("#minimal-signup-password").val(),
- verificationurl: commonOptions.verificationUrl,
- action: "registration"
- }),
- error: function(xhr) {
- $("#minimal-signup-message").text(xhr.responseJSON);
- $("#minimal-signup-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- localStorage.setItem("LRTokenKey", ret.result.Data.access_token);
- localStorage.removeItem("LrEmailStatus");
- localStorage.setItem("lr-user-uid", ret.result.Data.Profile.Uid);
- $("#minimal-signup-email").val('');
- $("#minimal-signup-password").val('');
- $("#minimal-signup-confirmpassword").val('');
- window.location.replace("profile.html");
- } else if (ret.status == "registered") {
- $("#minimal-signup-message").text(ret.message);
- $("#minimal-signup-message").attr("class", "success-message");
- $("#minimal-signup-email").val('');
- $("#minimal-signup-password").val('');
- $("#minimal-signup-confirmpassword").val('');
-
- } else if (ret.status == "error") {
- $("#minimal-signup-message").text(ret.message);
- $("#minimal-signup-message").attr("class", "error-message");
- }
- });
-});
-
-$("#btn-minimal-forgotpassword").click(function() {
- $("#minimal-forgotpassword-message").text("");
-
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- dataType: "json",
- data: $.param({
- email: $("#minimal-forgotpassword-email").val(),
- resetPasswordUrl: commonOptions.resetPasswordUrl,
- action: "forgotPassword"
- }),
- error: function(xhr){
- $("#minimal-forgotpassword-message").text(xhr.responseJSON);
- $("#minimal-forgotpassword-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- $("#minimal-forgotpassword-email").val("");
- $("#minimal-forgotpassword-message").text(ret.message);
- $("#minimal-forgotpassword-message").attr("class", "success-message");
- } else if (ret.status == "error") {
- $("#minimal-forgotpassword-message").text(ret.message);
- $("#minimal-forgotpassword-message").attr("class", "error-message");
- }
- });
-});
-
-function checkSession() {
- var accesstoken = localStorage.getItem("LRTokenKey");
- var lremailstatus = localStorage.getItem("LrEmailStatus");
- var lruid= localStorage.getItem("lr-user-uid");
- if (accesstoken != "" && accesstoken != null && lruid != "" && lruid != null && (lremailstatus == "" || lremailstatus == null)) {
- window.location.replace("profile.html");
- return;
- }
-}
-
-checkSession();
diff --git a/demo/js/indexView.js b/demo/js/indexView.js
deleted file mode 100644
index 30e73c5..0000000
--- a/demo/js/indexView.js
+++ /dev/null
@@ -1,82 +0,0 @@
-$(function () {
-
- $(window).on('hashchange', function () {
- // On every hash change the render function is called with the new hash.
- // This is how the navigation of our app happens.
- render(decodeURI(window.location.hash));
- }).trigger('hashchange');
-
- function render(url) {
- // This function decides what type of page to show
- // depending on the current url hash value.
-
- // Get the keyword from the url.
- let temp = url.split('/')[0];
- temp = temp.split('?')[0];
- // Hide whatever page is currently shown.
- $('.right-elem').removeClass('visible');
- $('.menu-options').removeClass('active');
-
- let map = {
- // The Homepage.
- '': function () {
- renderLogin();
- },
- // Login page.
- '#login': function () {
- renderLogin();
- },
- // Register page.
- '#signup': function () {
- renderSignup();
- },
- // Forgot Password page.
- '#forgotpassword': function () {
- renderForgotPassword();
- },
- // Reset Password page.
- '#resetpassword': function () {
- renderResetPassword();
- }
- };
-
- // Execute the needed function depending on the url keyword (stored in temp).
- if (map[temp]) {
- map[temp]();
- }
- // If the keyword isn't listed in the above - render the error page.
- else {
- renderErrorPage();
- }
- }
-
- function renderLogin() {
- let page = $('.login-elem')
- let menuOption = $('#menu-login')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the login page.
- }
-
- function renderSignup() {
- let page = $('.signup-elem')
- let menuOption = $('#menu-signup')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the signup page.
- }
-
- function renderForgotPassword() {
- let page = $('.forgotpassword-elem')
- let menuOption = $('#menu-forgotpassword')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderResetPassword() {
- let page = $('.resetpassword-elem')
- page.addClass('visible');
- // Shows the reset password page.
- }
-});
\ No newline at end of file
diff --git a/demo/js/jquery-3.3.1.min.js b/demo/js/jquery-3.3.1.min.js
deleted file mode 100644
index 41f8bad..0000000
--- a/demo/js/jquery-3.3.1.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML=" ";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML=" ","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML=" ",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/'
-);
-
-$("#script-accountlinking").append(script);
-
-let la_options = {};
-la_options.container = "interfacecontainerdiv";
-la_options.templateName = 'loginradiuscustom_tmpl_link';
-la_options.onSuccess = function() {
- $("#interfacecontainerdiv").empty();
- LRObject.util.ready(function() {
- LRObject.init("linkAccount", la_options);
- });
-}
-la_options.onError = function(errors) {
- $("#user-accountlinking-message").text(errors[0].Description);
- $("#user-accountlinking-message").attr("class", "error-message");
-}
-
-let unlink_options = {};
-unlink_options.onSuccess = function() {
- $("#interfacecontainerdiv").empty();
- LRObject.util.ready(function() {
- LRObject.init("linkAccount", la_options);
- });
-}
-unlink_options.onError = function(errors) {
- $("#user-accountlinking-message").text(errors[0].Description);
- $("#user-accountlinking-message").attr("class", "error-message");
-}
-
-LRObject.util.ready(function() {
- LRObject.init("linkAccount", la_options);
- LRObject.init("unLinkAccount", unlink_options);
-});
-
-profileUpdate();
-roleUpdate();
diff --git a/demo/js/profileView.js b/demo/js/profileView.js
deleted file mode 100644
index 6509aaa..0000000
--- a/demo/js/profileView.js
+++ /dev/null
@@ -1,153 +0,0 @@
-$(function () {
-
- $(window).on('hashchange', function () {
- // On every hash change the render function is called with the new hash.
- // This is how the navigation of our app happens.
- render(decodeURI(window.location.hash));
- }).trigger('hashchange');
-
- function render(url) {
- // This function decides what type of page to show
- // depending on the current url hash value.
-
- // Get the keyword from the url.
- let temp = url.split('/')[0];
-
- // Hide whatever page is currently shown.
- $('.right-elem').removeClass('visible');
- $('.menu-options').removeClass('active');
-
- let map = {
- // The Homepage.
- '': function () {
- renderProfile();
- },
- // Profile page.
- '#profile': function () {
- renderProfile();
- },
- // Reset Password page.
- '#resetpassword': function () {
- renderResetPassword();
- },
- // Change Password page.
- '#changepassword': function () {
- renderChangePassword();
- },
- // Set Password page.
- '#setpassword': function () {
- renderSetPassword();
- },
- // Update Account page.
- '#account': function () {
- renderUpdateAccount();
- },
- // Account Linking page.
- '#accountlinking': function () {
- renderAccountLinking();
- },
- // Account Linking page.
- '#accountlinking': function () {
- renderAccountLinking();
- },
- // Custom Objects page.
- '#customobjects': function () {
- renderCustomObjects();
- },
- // Multifactor page.
- '#multifactor': function () {
- renderMultifactor();
- },
- // Roles page.
- '#roles': function () {
- renderRoles();
- }
- };
-
- // Execute the needed function depending on the url keyword (stored in temp).
- if (map[temp]) {
- map[temp]();
- }
- // If the keyword isn't listed in the above - render the error page.
- else {
- renderErrorPage();
- }
- }
-
- function renderProfile() {
- let page = $('.profile-elem')
- let menuOption = $('#menu-profile')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the profile page.
- }
-
- function renderResetPassword() {
- let page = $('.resetpassword-elem')
- let menuOption = $('#menu-resetpassword')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderChangePassword() {
- let page = $('.changepassword-elem')
- let menuOption = $('#menu-changepassword')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderSetPassword() {
- let page = $('.setpassword-elem')
- let menuOption = $('#menu-setpassword')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderUpdateAccount() {
- let page = $('.updateaccount-elem')
- let menuOption = $('#menu-account')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderAccountLinking() {
- let page = $('.accountlinking-elem')
- let menuOption = $('#menu-accountlinking')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderCustomObjects() {
- let page = $('.customobj-elem')
- let menuOption = $('#menu-customobjects')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderMultifactor() {
- let page = $('.multifactor-elem')
- let menuOption = $('#menu-multifactor')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderRoles() {
- let page = $('.roles-elem')
- let menuOption = $('#menu-roles')
- page.addClass('visible');
- menuOption.addClass('active');
- // Shows the forgot password page.
- }
-
- function renderErrorPage() {
- // Shows the error page.
- }
-
-});
\ No newline at end of file
diff --git a/demo/js/resetPassword.js b/demo/js/resetPassword.js
deleted file mode 100644
index 95d2ff6..0000000
--- a/demo/js/resetPassword.js
+++ /dev/null
@@ -1,49 +0,0 @@
-const url = window.location.href;
-const params = url.split("?")[1];
-const domainName = url.substring(0, url.lastIndexOf("/"));
-let paramsObj = {};
-
-$("#btn-minimal-resetpassword").click(function() {
- $("#minimal-resetpassword-message").text("");
-
- if($("#minimal-resetpassword-password").val() !== $("#minimal-resetpassword-confirmpassword").val()) {
- $("#minimal-resetpassword-message").text("Passwords do not match!");
- $("#minimal-resetpassword-message").attr("class", "error-message");
- return;
- }
-
- $.ajax({
- method: "POST",
- url: domainName + "/ajax_handler/login",
- dataType: "json",
- data: $.param({
- resettoken: paramsObj.vtoken,
- password: $("#minimal-resetpassword-password").val(),
- action: "resetPassword"
- }),
- error: function(xhr) {
- $("#minimal-resetpassword-message").text(xhr.responseJSON);
- $("#minimal-resetpassword-message").attr("class", "error-message");
- }
- }).done(function(ret) {
- if (ret.status == "success") {
- $("#minimal-resetpassword-password").val("");
- $("#minimal-resetpassword-confirmpassword").val("");
- $("#minimal-resetpassword-message").text(ret.message);
- $("#minimal-resetpassword-message").attr("class", "success-message");
- } else if (ret.status == "error") {
- $("#minimal-resetpassword-message").text(ret.message);
- $("#minimal-resetpassword-message").attr("class", "error-message");
- }
- });
-});
-
-if (params) {
- paramsObj = JSON.parse('{"' + decodeURI(params.replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}');
-
- if (paramsObj.vtype != "reset") {
- window.location.replace("index.html");
- }
-} else {
- window.location.replace("index.html");
-}
diff --git a/demo/loginscreen.html b/demo/loginscreen.html
deleted file mode 100644
index 2b601b6..0000000
--- a/demo/loginscreen.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
- SDK Demo Index Page
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/demo/logo-white.png b/demo/logo-white.png
deleted file mode 100644
index 4821715..0000000
Binary files a/demo/logo-white.png and /dev/null differ
diff --git a/demo/profile.html b/demo/profile.html
deleted file mode 100644
index d341339..0000000
--- a/demo/profile.html
+++ /dev/null
@@ -1,190 +0,0 @@
-
-
-
-
- SDK Demo Account Page
-
-
-
-
-
-
-
-
-
-
-
-
-
Profile
-
-
-
-
-
-
-
-
-
-
-
-
-
Set Password
-
- Password:
- Change Password
-
-
-
-
-
-
-
Custom Object Management
-
-
-
Create
-
-
-
-
-
Update
-
-
-
-
-
Delete
-
-
-
-
-
-
Read
- Object Name:
-
Fetch Data
-
-
-
-
-
-
Configure MultiFactor
-
- Reset Google Authenticator
- Reset
-
-
-
-
-
-
Roles Management
-
-
All Roles
-
-
-
-
-
Create Role
- Role:
-
Create
-
-
-
-
Delete Role
- Role:
-
Delete
-
-
-
-
Current User Role(s)
-
-
-
-
-
Assign Role to User
- Role:
-
Assign
-
-
-
-
-
-
-
-
-
-
diff --git a/demo/resetpassword.html b/demo/resetpassword.html
deleted file mode 100644
index d662b9c..0000000
--- a/demo/resetpassword.html
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
- SDK Demo Reset Password Page
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..4591769
--- /dev/null
+++ b/index.php
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ tests/TestCase/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ src/
+ plugins/*/src/
+
+ src/Console/Installer.php
+
+
+
+
diff --git a/plugins/empty b/plugins/empty
new file mode 100644
index 0000000..e69de29
diff --git a/src/Application.php b/src/Application.php
new file mode 100644
index 0000000..49a0bec
--- /dev/null
+++ b/src/Application.php
@@ -0,0 +1,85 @@
+addPlugin('Bake');
+ } catch (MissingPluginException $e) {
+ // Do not halt if the plugin is missing
+ }
+
+ $this->addPlugin('Migrations');
+ }
+
+ /*
+ * Only try to load DebugKit in development mode
+ * Debug Kit should not be installed on a production system
+ */
+ if (Configure::read('debug')) {
+ $this->addPlugin(\DebugKit\Plugin::class);
+ }
+ }
+
+ /**
+ * Setup the middleware queue your application will use.
+ *
+ * @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
+ * @return \Cake\Http\MiddlewareQueue The updated middleware queue.
+ */
+ public function middleware($middlewareQueue)
+ {
+ $middlewareQueue
+ // Catch any exceptions in the lower layers,
+ // and make an error page/response
+ ->add(new ErrorHandlerMiddleware(null, Configure::read('Error')))
+
+ // Handle plugin/theme assets like CakePHP normally does.
+ ->add(new AssetMiddleware([
+ 'cacheTime' => Configure::read('Asset.cacheTime')
+ ]))
+
+ // Add routing middleware.
+ // Routes collection cache enabled by default, to disable route caching
+ // pass null as cacheConfig, example: `new RoutingMiddleware($this)`
+ // you might want to disable this cache in case your routing is extremely simple
+ ->add(new RoutingMiddleware($this, '_cake_routes_'));
+
+ return $middlewareQueue;
+ }
+}
diff --git a/src/Console/Installer.php b/src/Console/Installer.php
new file mode 100644
index 0000000..3bcef47
--- /dev/null
+++ b/src/Console/Installer.php
@@ -0,0 +1,246 @@
+getIO();
+
+ $rootDir = dirname(dirname(__DIR__));
+
+ static::createAppConfig($rootDir, $io);
+ static::createWritableDirectories($rootDir, $io);
+
+ // ask if the permissions should be changed
+ if ($io->isInteractive()) {
+ $validator = function ($arg) {
+ if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
+ return $arg;
+ }
+ throw new Exception('This is not a valid answer. Please choose Y or n.');
+ };
+ $setFolderPermissions = $io->askAndValidate(
+ 'Set Folder Permissions ? (Default to Y) [Y,n ]? ',
+ $validator,
+ 10,
+ 'Y'
+ );
+
+ if (in_array($setFolderPermissions, ['Y', 'y'])) {
+ static::setFolderPermissions($rootDir, $io);
+ }
+ } else {
+ static::setFolderPermissions($rootDir, $io);
+ }
+
+ static::setSecuritySalt($rootDir, $io);
+
+ $class = 'Cake\Codeception\Console\Installer';
+ if (class_exists($class)) {
+ $class::customizeCodeceptionBinary($event);
+ }
+ }
+
+ /**
+ * Create the config/app.php file if it does not exist.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createAppConfig($dir, $io)
+ {
+ $appConfig = $dir . '/config/app.php';
+ $defaultConfig = $dir . '/config/app.default.php';
+ if (!file_exists($appConfig)) {
+ copy($defaultConfig, $appConfig);
+ $io->write('Created `config/app.php` file');
+ }
+ }
+
+ /**
+ * Create the `logs` and `tmp` directories.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createWritableDirectories($dir, $io)
+ {
+ foreach (static::WRITABLE_DIRS as $path) {
+ $path = $dir . '/' . $path;
+ if (!file_exists($path)) {
+ mkdir($path);
+ $io->write('Created `' . $path . '` directory');
+ }
+ }
+ }
+
+ /**
+ * Set globally writable permissions on the "tmp" and "logs" directory.
+ *
+ * This is not the most secure default, but it gets people up and running quickly.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setFolderPermissions($dir, $io)
+ {
+ // Change the permissions on a path and output the results.
+ $changePerms = function ($path) use ($io) {
+ $currentPerms = fileperms($path) & 0777;
+ $worldWritable = $currentPerms | 0007;
+ if ($worldWritable == $currentPerms) {
+ return;
+ }
+
+ $res = chmod($path, $worldWritable);
+ if ($res) {
+ $io->write('Permissions set on ' . $path);
+ } else {
+ $io->write('Failed to set permissions on ' . $path);
+ }
+ };
+
+ $walker = function ($dir) use (&$walker, $changePerms) {
+ $files = array_diff(scandir($dir), ['.', '..']);
+ foreach ($files as $file) {
+ $path = $dir . '/' . $file;
+
+ if (!is_dir($path)) {
+ continue;
+ }
+
+ $changePerms($path);
+ $walker($path);
+ }
+ };
+
+ $walker($dir . '/tmp');
+ $changePerms($dir . '/tmp');
+ $changePerms($dir . '/logs');
+ }
+
+ /**
+ * Set the security.salt value in the application's config file.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setSecuritySalt($dir, $io)
+ {
+ $newKey = hash('sha256', Security::randomBytes(64));
+ static::setSecuritySaltInFile($dir, $io, $newKey, 'app.php');
+ }
+
+ /**
+ * Set the security.salt value in a given file
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @param string $newKey key to set in the file
+ * @param string $file A path to a file relative to the application's root
+ * @return void
+ */
+ public static function setSecuritySaltInFile($dir, $io, $newKey, $file)
+ {
+ $config = $dir . '/config/' . $file;
+ $content = file_get_contents($config);
+
+ $content = str_replace('__SALT__', $newKey, $content, $count);
+
+ if ($count == 0) {
+ $io->write('No Security.salt placeholder to replace.');
+
+ return;
+ }
+
+ $result = file_put_contents($config, $content);
+ if ($result) {
+ $io->write('Updated Security.salt value in config/' . $file);
+
+ return;
+ }
+ $io->write('Unable to update Security.salt value.');
+ }
+
+ /**
+ * Set the APP_NAME value in a given file
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @param string $appName app name to set in the file
+ * @param string $file A path to a file relative to the application's root
+ * @return void
+ */
+ public static function setAppNameInFile($dir, $io, $appName, $file)
+ {
+ $config = $dir . '/config/' . $file;
+ $content = file_get_contents($config);
+ $content = str_replace('__APP_NAME__', $appName, $content, $count);
+
+ if ($count == 0) {
+ $io->write('No __APP_NAME__ placeholder to replace.');
+
+ return;
+ }
+
+ $result = file_put_contents($config, $content);
+ if ($result) {
+ $io->write('Updated __APP_NAME__ value in config/' . $file);
+
+ return;
+ }
+ $io->write('Unable to update __APP_NAME__ value.');
+ }
+}
diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php
new file mode 100644
index 0000000..25bdb9f
--- /dev/null
+++ b/src/Controller/AppController.php
@@ -0,0 +1,62 @@
+loadComponent('Security');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ parent::initialize();
+
+ // INSERT API KEY AND SECRET
+ define('LR_API_KEY', ''); // Pass API Key
+ define('LR_API_SECRET', ''); // Pass API Secret Key
+ define('API_REQUEST_SIGNING', ''); // Pass boolean true/false for enable/disable
+ define('AUTH_FLOW', ''); // Pass optional/disabled, if email verification flow optional or disabled, no need to mention if required flow
+
+
+ $this->loadComponent('RequestHandler', [
+ 'enableBeforeRedirect' => false,
+ ]);
+ $this->loadComponent('Flash');
+
+ /*
+ * Enable the following component for recommended CakePHP security settings.
+ * see https://book.cakephp.org/3.0/en/controllers/components/security.html
+ */
+ //$this->loadComponent('Security');
+ }
+}
diff --git a/src/Controller/Component/empty b/src/Controller/Component/empty
new file mode 100644
index 0000000..e69de29
diff --git a/src/Controller/ErrorController.php b/src/Controller/ErrorController.php
new file mode 100644
index 0000000..43bd2fb
--- /dev/null
+++ b/src/Controller/ErrorController.php
@@ -0,0 +1,70 @@
+loadComponent('RequestHandler', [
+ 'enableBeforeRedirect' => false,
+ ]);
+ }
+
+ /**
+ * beforeFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Http\Response|null|void
+ */
+ public function beforeFilter(Event $event)
+ {
+ }
+
+ /**
+ * beforeRender callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Http\Response|null|void
+ */
+ public function beforeRender(Event $event)
+ {
+ parent::beforeRender($event);
+
+ $this->viewBuilder()->setTemplatePath('Error');
+ }
+
+ /**
+ * afterFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Http\Response|null|void
+ */
+ public function afterFilter(Event $event)
+ {
+ }
+}
diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php
new file mode 100644
index 0000000..dfbd4bf
--- /dev/null
+++ b/src/Controller/HomeController.php
@@ -0,0 +1,314 @@
+viewBuilder()->setLayout('minimallayout');
+ }
+ public function minimal()
+ {
+ }
+ public function loginScreen()
+ {
+ }
+ public function registrationView()
+ {
+ }
+ public function forgotPasswordView()
+ {
+ }
+ /**
+ * manage all login action
+ */
+ public function login()
+ {
+ $this->autoRender = false;
+ $action = $this->request->getdata('action');
+ if (method_exists($this, $action)) {
+ $this->$action();
+ }
+ }
+ /**
+ * function for login by email
+ */
+ public function loginByEmail()
+ {
+ $this->autoRender = false;
+ $email = $this->request->getdata('email');
+ $password = $this->request->getdata('password');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($email)) {
+ $response['message'] = 'The Email Id field is required.';
+ } else if (empty($password)) {
+ $response['message'] = 'The Password field is required.';
+ } else {
+ $authenticationAPI = new AuthenticationAPI();
+ $payload = array('email' => $email, 'password' => $password);
+ $result = $authenticationAPI->loginByEmail($payload);
+ if (isset($result->access_token) && $result->access_token != '') {
+ $response['data'] = $result;
+ $response['message'] = "Logged in successfully";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+
+ /**
+ * function for multifactor authentication
+ */
+
+ public function mfaLogin()
+ {
+
+ $email = $this->request->getdata('email');
+ $password = $this->request->getdata('password');
+ $emailTemplate = '';//Optional
+ $fields = ''; //Optional
+ $loginUrl = ''; //Optional
+ $smsTemplate = ''; //Optional
+ $smsTemplate2FA = ''; //Optional
+ $verificationUrl = ''; //Optional
+ $emailTemplate2FA = ''; //Optional
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($email)) {
+ $response['message'] = 'The Email Id field is required.';
+ } elseif (empty($password)) {
+ $response['message'] = 'The Password field is required.';
+ } else {
+ $authenticationAPI = new MultiFactorAuthenticationAPI();
+
+ //$payload = array('email' => $email, 'password' => $password); No need of payload in this API
+ $result = $authenticationAPI->mfaLoginByEmail($email, $password, $emailTemplate, $fields, $loginUrl, $smsTemplate, $smsTemplate2FA, $verificationUrl, $emailTemplate2FA);
+ $response['data'] = $result;
+ $response['message'] = "Mfa login successfully";
+ $response['status'] = 'success';
+ if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+
+ /**
+ * function for multifactor validation
+ */
+ public function mfaValidate()
+ {
+
+ $secondFactorAuthenticationToken = $this->request->getdata('secondFactorAuthenticationToken');
+ $googleAuthCode = $this->request->getdata('googleAuthCode');
+ $fields = null; //Optional
+ $rbaBrowserEmailTemplate = ''; //Optional
+ $rbaCityEmailTemplate = ''; //Optional
+ $rbaCountryEmailTemplate = ''; //Optional
+ $rbaIpEmailTemplate = ''; //Optional
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($secondFactorAuthenticationToken)) {
+ $response['message'] = 'second factor auth token is required';
+ } elseif (empty($googleAuthCode)) {
+ $response['message'] = 'google auth code is required';
+ } else {
+ $authenticationAPI = new MultiFactorAuthenticationAPI();
+
+ $result = $authenticationAPI->mfaValidateGoogleAuthCode($googleAuthCode,$secondFactorAuthenticationToken,$fields,$rbaBrowserEmailTemplate,$rbaCityEmailTemplate,$rbaCountryEmailTemplate,$rbaIpEmailTemplate);
+ if ((isset($result->access_token) && $result->access_token != '')) {
+ $response['data'] = $result;
+ $response['message'] = "Mfa validate google auth code.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+
+ /**
+ * function for password less login
+ */
+
+ public function pwLessLogin()
+ {
+
+ $email = $this->request->getdata('email');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($email)) {
+ $response['message'] = 'The Email Id field is required.';
+ } else {
+ $authenticationAPI = new PasswordLessLoginAPI();
+
+ $result = $authenticationAPI->passwordLessLoginByEmail($email, $this->request->getdata('verificationurl'));
+ if ((isset($result->IsPosted) && $result->IsPosted)) {
+ $response['message'] = "One time login link has been sent to your provided email id, check email for further instruction.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+
+ /**
+ * function for password less link verify
+ */
+ public function pwLessLinkVerify()
+ {
+
+ $token = $this->request->getdata('token');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($token)) {
+ $response['message'] = 'Token is required';
+ } else {
+ $passwordLessLoginAPI = new PasswordLessLoginAPI();
+
+ $result = $passwordLessLoginAPI->passwordLessLoginVerification($token);
+ if ((isset($result->access_token) && $result->access_token != '')) {
+ $response['data'] = $result;
+ $response['message'] = "Link has been verified.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+ public function emailVerify()
+ {
+
+ $this->autoRender = false;
+ $vtoken = $this->request->getdata('vtoken');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($vtoken)) {
+ $response['message'] = 'Verification token is required';
+ } else {
+ $authenticationAPI = new AuthenticationAPI();
+
+ $result = $authenticationAPI->verifyEmail($vtoken);
+ if ((isset($result->IsPosted) && $result->IsPosted)) {
+ $response['message'] = "Your email has been verified successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+ public function registration()
+ {
+
+ $this->autoRender = false;
+ $email = $this->request->getdata('email');
+ $password = $this->request->getdata('password');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+
+ if (empty($email)) {
+ $response['message'] = 'The Email Id field is required.';
+ } elseif (empty($password)) {
+ $response['message'] = 'The Password field is required.';
+ } else {
+
+ $authenticationAPI = new AuthenticationAPI();
+
+ $payload = array('Email' => array(array('Type' => 'Primary', 'Value' => $email)), 'password' => $password);
+ $sottObj = new SottAPI();
+ $sott = $sottObj->generateSott();
+
+
+ if (!is_object($sott)) {
+ $sott = json_decode($sott);
+ }
+ $verificationUrl=$this->request->getdata('verificationUrl');
+
+ $result = $authenticationAPI->userRegistrationByEmail($payload, $sott->Sott,$verificationUrl );
+
+ if ((isset($result->EmailVerified) && $result->EmailVerified) || AUTH_FLOW == 'optional' || AUTH_FLOW == 'disabled') {
+ $response['result'] = $result;
+ $response['message'] = "Successfully registered.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ } else {
+ $response['message'] = "Successfully registered, please check your email to verify your account.";
+ $response['status'] = 'registered';
+ }
+ }
+ echo json_encode($response);
+ }
+
+
+
+ public function forgotPassword()
+ {
+
+ $this->autoRender = false;
+ $email = $this->request->getdata('email');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($email)) {
+ $response['message'] = 'The Email Id field is required.';
+ } else {
+ $authenticationAPI = new AuthenticationAPI();
+
+ $result = $authenticationAPI->forgotPassword($email, $this->request->getdata('resetPasswordUrl'));
+ if ((isset($result->IsPosted) && $result->IsPosted)) {
+ $response['message'] = "We'll email you an instruction on how to reset your password";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+ public function resetPassword()
+ {
+ $this->autoRender = false;
+ $token = $this->request->getdata('resettoken');
+ $password = $this->request->getdata('password');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($token)) {
+ $response['message'] = 'Reset token is required';
+ } elseif (empty($password)) {
+ $response['message'] = 'The Password field is required.';
+ } else {
+ $authenticationAPI = new AuthenticationAPI();
+
+ $payload = array('password' => $password, 'resetToken' => $token);
+ $result = $authenticationAPI->resetPasswordByResetToken($payload);
+ if ((isset($result->IsPosted) && $result->IsPosted)) {
+ $response['message'] = "Password has been reset successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+}
diff --git a/src/Controller/PagesController.php b/src/Controller/PagesController.php
new file mode 100644
index 0000000..d023661
--- /dev/null
+++ b/src/Controller/PagesController.php
@@ -0,0 +1,69 @@
+redirect('/');
+ }
+ if (in_array('..', $path, true) || in_array('.', $path, true)) {
+ throw new ForbiddenException();
+ }
+ $page = $subpage = null;
+
+ if (!empty($path[0])) {
+ $page = $path[0];
+ }
+ if (!empty($path[1])) {
+ $subpage = $path[1];
+ }
+ $this->set(compact('page', 'subpage'));
+
+ try {
+ $this->render(implode('/', $path));
+ } catch (MissingTemplateException $exception) {
+ if (Configure::read('debug')) {
+ throw $exception;
+ }
+ throw new NotFoundException();
+ }
+ }
+}
diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php
new file mode 100644
index 0000000..7951b02
--- /dev/null
+++ b/src/Controller/ProfileController.php
@@ -0,0 +1,444 @@
+viewBuilder()->setLayout('profilelayout');
+ }
+ public function profileView()
+ {
+ }
+ public function changePasswordView()
+ {
+ }
+ public function setPasswordView()
+ {
+ }
+ public function accountView()
+ {
+ }
+ public function accountLinkingView()
+ {
+ }
+ public function customObjectView()
+ {
+ }
+ public function resetMultifactorView()
+ {
+ }
+ public function roleView()
+ {
+ }
+ /**
+ * manage all profile action]
+ */
+ public function profile()
+ {
+ $this->autoRender = false;
+ $action = $this->request->getdata('action');
+ if (method_exists($this, $action)) {
+ $this->$action();
+ }
+ }
+ public function getProfileByUid()
+ {
+ $this->autoRender = false;
+ $uid = $this->request->getdata('uid');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($uid)) {
+ $response['message'] = 'uid is required field';
+ } else {
+
+ $accountObject = new AccountAPI();
+
+ $result = $accountObject->getAccountProfileByUid($uid);
+
+ if ((isset($result->Uid) && $result->Uid != '')) {
+ $response['data'] = $result;
+
+ $response['message'] = "fetched profile";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+
+
+ public function getProfile()
+ {
+ $this->autoRender = false;
+ $token = $this->request->getdata('token');
+ $fields = null; //Optional
+ $emailTemplate = ''; //Optional
+ $verificationUrl = ''; //Optional
+ $welcomeEmailTemplate = ''; //Optional
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($token)) {
+ $response['message'] = 'Token is required';
+ } else {
+ $authenticationAPI = new AuthenticationAPI();
+
+ $result = $authenticationAPI->getProfileByAccessToken($token,$fields,$emailTemplate,$verificationUrl,$welcomeEmailTemplate);
+
+ $response['data'] = $result;
+ $response['message'] = "Profile fetched";
+ $response['status'] = 'success';
+ }
+
+ echo json_encode($response);
+ exit;
+ }
+
+
+
+ /**
+ * function to change password
+ */
+
+
+ public function changePassword()
+ {
+ $token = $this->request->getdata('token');
+ $oldpassword = $this->request->getdata('oldpassword');
+ $newpassword = $this->request->getdata('newpassword');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($oldpassword)) {
+ $response['message'] = 'Old password is required';
+ } elseif (empty($newpassword)) {
+ $response['message'] = 'New password is required';
+ } else {
+ $authenticationAPI = new AuthenticationAPI();
+
+ $result = $authenticationAPI->changePassword($token, $newpassword, $oldpassword);
+ if (isset($result->IsPosted) && $result->IsPosted) {
+ $response['message'] = "Password has been changed successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+
+ echo json_encode($response);
+ }
+ }
+
+
+
+ /*
+ * function to set account password
+ */
+ public function setPassword()
+ {
+ $uid = $this->request->getdata('uid');
+ $newpassword = $this->request->getdata('newpassword');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($newpassword)) {
+ $response['message'] = 'New password field is required';
+ } else {
+ $accountObject = new AccountAPI();
+
+ $result = $accountObject->setAccountPasswordByUid($newpassword, $uid);
+ if (isset($result->PasswordHash) && $result->PasswordHash != '') {
+ $response['message'] = "The password has been set successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+ public function updateAccount()
+ {
+ $firstname = $this->request->getdata('firstname');
+ $lastname = $this->request->getdata('lastname');
+ $about = $this->request->getdata('about');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ $authenticationObj = new AuthenticationAPI();
+
+ $payload = array('FirstName' => $firstname, 'LastName' => $lastname, 'About' => $about);
+
+ $result = $authenticationObj->updateProfileByAccessToken($this->request->getdata('token'), $payload);
+ if (isset($result->IsPosted) && $result->IsPosted) {
+
+ $response['message'] = "Profile has been updated successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ echo json_encode($response);
+ }
+
+ /**
+ * function to create custom pbject
+ */
+ public function createCustomObjects()
+ {
+ $token = $this->request->getdata('token');
+ $objectName = $this->request->getdata('objectName');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($objectName)) {
+ $response['message'] = 'Object name is required.';
+ } else {
+ $customObj = new CustomObjectAPI();
+
+ $result = $customObj->createCustomObjectByToken($token, $objectName, $this->request->getdata('payload'));
+
+
+ if (isset($result->Uid) && $result->Uid != '') {
+
+ $response['message'] = "Custom object created successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+
+ /**
+ *function to get custom object
+
+ */
+ public function getCustomObjects()
+ {
+ $token = $this->request->getdata('token');
+ $objectName = $this->request->getdata('objectName');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($objectName)) {
+ $response['message'] = 'Object name is required.';
+ } else {
+ $customObj = new CustomObjectAPI();
+
+ $result = $customObj->getCustomObjectByToken($token, $objectName);
+ if (isset($result->Count) && $result->Count != '0') {
+ $response['result'] = $result;
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ } else {
+ $response['status'] = 'empty';
+ }
+ }
+ echo json_encode($response);
+ }
+ /**
+ *function to update custom object
+
+ */
+
+ public function updateCustomObjects()
+ {
+ $token = $this->request->getdata('token');
+ $objectName = $this->request->getdata('objectName');
+ $objectRecordId = $this->request->getdata('objectRecordId');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($objectName)) {
+ $response['message'] = 'Object name is required';
+ } elseif (empty($objectRecordId)) {
+ $response['message'] = 'Object Id is required';
+ } else {
+ $customObj = new CustomObjectAPI();
+
+ $result = $customObj->updateCustomObjectByToken($token, $objectName, $objectRecordId, $this->request->getdata('payload'));
+
+ if (isset($result->Uid) && $result->Uid != '') {
+ $response['message'] = "Custom object updated successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+ /**
+ *function to delete custom object
+
+ */
+ public function deleteCustomObjects()
+ {
+ $token = $this->request->getdata('token');
+ $objectName = $this->request->getdata('objectName');
+ $objectRecordId = $this->request->getdata('objectRecordId');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($objectName)) {
+ $response['message'] = 'Object name is required';
+ } elseif (empty($objectRecordId)) {
+ $response['message'] = 'Object Id is required';
+ } else {
+ $customObj = new CustomObjectAPI();
+
+ $result = $customObj->deleteCustomObjectByToken($token,$objectName,$objectRecordId);
+ if (isset($result->IsDeleted) && $result->IsDeleted) {
+ $response['message'] = "Custom object deleted successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+ /**
+ * function to reset multi factor authentication
+ */
+ public function resetMultifactor()
+ {
+ $accountObject = new MultiFactorAuthenticationAPI();
+ $googleauthenticator = "true"; //Required
+ $result = $accountObject->mfaResetGoogleAuthenticatorByUid($googleauthenticator, $this->request->getdata('uid'));
+ if (isset($result->IsDeleted) && $result->IsDeleted) {
+ $response['message'] = "Reset successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ } else {
+ $response['message'] = "Reset Failed.";
+ $response['status'] = 'error';
+ }
+ echo json_encode($response);
+ }
+
+ /**
+ *function to create Role
+
+ */
+ public function handleCreateRole()
+ {
+ $roles = $this->request->getdata('roles');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($roles)) {
+ $response['message'] = 'Roles field is required';
+ } else {
+ $roleObj = new RoleAPI();
+
+ $result = $roleObj->createRoles($roles);
+ if (isset($result->Count) && $result->Count != '') {
+ $response['message'] = "Roles has been created.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+
+
+ /**
+ *function to delete role
+
+ */
+
+ public function handleDeleteRole()
+ {
+ $roles = $this->request->getdata('roles');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($roles)) {
+ $response['message'] = 'Roles field is required';
+ } else {
+ $roleObj = new RoleAPI();
+
+ $result = $roleObj->deleteRole($roles);
+ if (isset($result->IsDeleted) && $result->IsDeleted) {
+ $response['message'] = "Role has been deleted.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+
+ /**
+ *function to assign user role
+
+ */
+ public function handleAssignUserRole()
+ {
+ $uid = $this->request->getdata('uid');
+ $payload = $this->request->getdata('roles');
+ $response = array('status' => 'error', 'message' => 'an error occoured');
+ if (empty($payload)) {
+ $response['message'] = 'Roles field is required';
+ } else {
+ $roleObj = new RoleAPI();
+
+ $result = $roleObj->assignRolesByUid($payload, $uid);
+ if (isset($result->Roles) && $result->Roles != '') {
+ $response['message'] = "Role assigned successfully.";
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ }
+ }
+ echo json_encode($response);
+ }
+
+ /**
+ *function to fetch all role
+
+ */
+
+ public function getAllRoles()
+ {
+ $roleObj = new RoleAPI();
+
+ $result = $roleObj->getRolesList();
+ if (isset($result->Count) && $result->Count != '0') {
+ $response['result'] = $result;
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ } else {
+ $response['message'] = 'Roles is empty';
+ $response['status'] = 'rolesempty';
+ }
+
+ echo json_encode($response);
+ }
+
+
+ public function getUserRoles()
+ {
+ $roleObj = new RoleAPI();
+
+ $result = $roleObj->getRolesByUid($this->request->getdata('uid'));
+ if (isset($result->Roles) && $result->Roles != '') {
+ $response['data'] = $result;
+ $response['status'] = 'success';
+ } else if (isset($result->error_response)) {
+ $response['message'] = $result->error_response->Description;
+ $response['status'] = "error";
+ } else {
+ $response['message'] = 'user roles is empty';
+ $response['status'] = 'userrolesempty';
+ }
+ echo json_encode($response);
+ }
+}
diff --git a/src/LoginRadiusSDK/Advance/ConfigAPI.php b/src/LoginRadiusSDK/Advance/ConfigAPI.php
deleted file mode 100644
index d3e4021..0000000
--- a/src/LoginRadiusSDK/Advance/ConfigAPI.php
+++ /dev/null
@@ -1,56 +0,0 @@
- 'key'));
- }
-
-
- /**
- * This API allows you to query your LoginRadius account for basic server information and server time information which is useful when generating an SOTT token.
- *
- * @param $time_difference = "10";
- * @return Serverinfo Object
- */
- public function getServerTime($time_difference = '10') {
- return Functions::apiClient(API_DOMAIN. "/identity/v2/serverinfo", array("timedifference" => $time_difference), array('authentication' => 'key'));
- }
-
-}
diff --git a/src/LoginRadiusSDK/Advance/WebHooksAPI.php b/src/LoginRadiusSDK/Advance/WebHooksAPI.php
deleted file mode 100755
index 38fb34d..0000000
--- a/src/LoginRadiusSDK/Advance/WebHooksAPI.php
+++ /dev/null
@@ -1,90 +0,0 @@
-apiClientHandler('webhook/test', array('apikey' => Functions::getApiKey(), 'apisecret' => Functions::getApiSecret()));
- }
-
- /**
- * This API allow you to subscribe WebHook on your LoginRadius site.
- *
- * @param $target_url //URL where trigger will send data when it invoke
- * @param $event //Name of event, Login, Register, UpdateProfile, ResetPassword, ChangePassword, emailVerification, AddEmail, RemoveEmail, BlockAccount, DeleteAccount, SetUsername, CreateTraditionalAccount, AssignRoles, UnassignRoles, SetPassword, LinkAccount, UnlinkAccount, UpdatePhoneId, VerifyPhoneNumber
- * @return type
- */
- public function subscribeWebHooks($target_url, $event = 'Login')
- {
- return $this->apiClientHandler('webhook', array('apikey' => Functions::getApiKey(), 'apisecret' => Functions::getApiSecret()), array('method' => 'POST', 'post_data' => array('TargetUrl' => $target_url, 'Event' => $event), 'content_type' => 'json'));
- }
-
-
- /**
- * This API retrieves all of the Urls subscribed to a given WebHook event
- *
- * @param string $event
- * @return type
- */
- public function getWebHooksSubscribedUrls($event = 'Login')
- {
- return $this->apiClientHandler('webhook', array('apikey' => Functions::getApiKey(), 'apisecret' => Functions::getApiSecret(), 'event' => $event));
- }
-
-
- /**
- * This API allow you to unsubscribe WebHook on your LoginRadius site.
- *
- * @param $target_url //URL where trigger will send data when it invoke
- * @return type
- */
- public function unsubscribeWebHooks($target_url, $event = 'Login')
- {
- return $this->apiClientHandler('webhook', array('apikey' => Functions::getApiKey(), 'apisecret' => Functions::getApiSecret()), array('method' => 'DELETE', 'post_data' => array('TargetUrl' => $target_url, 'Event' => $event), 'content_type' => 'json'));
- }
-
- /**
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array())
- {
- return Functions::apiClient("/api/v2/" . $path, $query_array, array_merge(array('authentication' => 'secret'), $options));
- }
-}
diff --git a/src/LoginRadiusSDK/Clients/DefaultHttpClient.php b/src/LoginRadiusSDK/Clients/DefaultHttpClient.php
deleted file mode 100755
index 9dacf26..0000000
--- a/src/LoginRadiusSDK/Clients/DefaultHttpClient.php
+++ /dev/null
@@ -1,212 +0,0 @@
-curlApiMethod($request_url, $options);
- } elseif (ini_get('allow_url_fopen')) {
- $response = $this->fsockopenApiMethod($request_url, $options);
- } else {
- throw new LoginRadiusException('cURL or FSOCKOPEN is not enabled, enable cURL or FSOCKOPEN to get response from LoginRadius API.');
- }
-
- if (!empty($response)) {
- $result = json_decode($response);
- if (isset($result->ErrorCode) && !empty($result->ErrorCode)) {
- throw new LoginRadiusException($result->Message, $result);
- }
- }
- return $response;
- }
-
- /**
- * Access LoginRadius API server by curl method
- *
- * @param type $request_url
- * @param type $options
- * @return type
- */
- private function curlApiMethod($request_url, $options = array()) {
- $ssl_verify = isset($options['ssl_verify']) ? $options['ssl_verify'] : false;
- $method = isset($options['method']) ? strtoupper($options['method']) : 'GET';
- $data = isset($options['post_data']) ? $options['post_data'] : array();
- $content_type = isset($options['content_type']) ? trim($options['content_type']) : 'x-www-form-urlencoded';
- $auth_access_token = isset($options['access-token']) ? trim($options['access-token']) : '';
- $sott_header_content = isset($options['X-LoginRadius-Sott']) ? trim($options['X-LoginRadius-Sott']) : '';
- $secret_header_content = isset($options['X-LoginRadius-ApiSecret']) ? trim($options['X-LoginRadius-ApiSecret']) : '';
- $expiry_time = isset($options['X-Request-Expires']) ? trim($options['X-Request-Expires']) : '';
- $digest = isset($options['digest']) ? trim($options['digest']) : '';
-
- $curl_handle = curl_init();
- curl_setopt($curl_handle, CURLOPT_URL, $request_url);
- curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 15);
- curl_setopt($curl_handle, CURLOPT_TIMEOUT, 50);
- curl_setopt($curl_handle, CURLOPT_ENCODING, "gzip");
- curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify);
- $optionsArray = array('Content-type: application/' . $content_type);
- if ($auth_access_token != '') {
- $optionsArray[] = 'Authorization:' . $auth_access_token;
- }
- if ($sott_header_content != '') {
- $optionsArray[] = 'X-LoginRadius-Sott:' . $sott_header_content;
- }
- if ($secret_header_content != '') {
- $optionsArray[] = 'X-LoginRadius-ApiSecret:' . $secret_header_content;
- }
- if ($expiry_time != '') {
- $optionsArray[] = 'X-Request-Expires:' . $expiry_time;
- }
- if ($digest != '') {
- $optionsArray[] = 'digest:' . $digest;
- }
- curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $optionsArray);
-
- if (isset($options['proxy']) && $options['proxy']['host'] != '' && $options['proxy']['port'] != '') {
- curl_setopt($curl_handle, CURLOPT_PROXY, $options['proxy']['protocol'] . '://' . $options['proxy']['user'] . ':' . $options['proxy']['password'] . '@' . $options['proxy']['host'] . ':' . $options['proxy']['port']);
- }
-
- if (!empty($data) || $data === true) {
- if (($content_type == 'json') && (is_array($data) || is_object($data))) {
- $data = json_encode($data);
- }
-
- curl_setopt($curl_handle, CURLOPT_POSTFIELDS, (($content_type == 'json') ? $data : Functions::queryBuild($data)));
-
- if (in_array($method, array('POST', 'PUT', 'DELETE'))) {
- curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, $method);
- }
- }
- curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1);
- curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
-
- $json_response = curl_exec($curl_handle);
- if (curl_error($curl_handle)) {
- $json_response = curl_error($curl_handle);
- }
- curl_close($curl_handle);
- return $json_response;
- }
-
- /**
- * Access LoginRadius API server by fsockopen method
- *
- * @param type $request_url
- * @param type $options
- * @return type
- */
- private function fsockopenApiMethod($request_url, $options = array()) {
- $ssl_verify = isset($options['ssl_verify']) ? $options['ssl_verify'] : false;
- $method = isset($options['method']) ? strtoupper($options['method']) : 'GET';
- $data = isset($options['post_data']) ? $options['post_data'] : array();
- $content_type = isset($options['content_type']) ? $options['content_type'] : 'form_params';
- $auth_access_token = isset($options['access-token']) ? trim($options['access-token']) : '';
- $sott_header_content = isset($options['X-LoginRadius-Sott']) ? trim($options['X-LoginRadius-Sott']) : '';
- $secret_header_content = isset($options['X-LoginRadius-ApiSecret']) ? trim($options['X-LoginRadius-ApiSecret']) : '';
- $expiry_time = isset($options['X-Request-Expires']) ? trim($options['X-Request-Expires']) : '';
- $digest = isset($options['digest']) ? trim($options['digest']) : '';
-
- $optionsArray = array('http' =>
- array(
- 'method' => strtoupper($method),
- 'timeout' => 50,
- 'ignore_errors' => true,
- 'header' => 'Content-Type: application/' . $content_type
- ),
- "ssl" => array(
- "verify_peer" => $ssl_verify
- )
- );
- if (!empty($data) || $data === true) {
- if (($content_type == 'json') && (is_array($data) || is_object($data))) {
- $data = json_encode($data);
- }
- $optionsArray['http']['header'] .= "\r\n" . 'Content-Length:' . (($data === true) ? '0' : strlen($data));
- $optionsArray['http']['header'] .= "\r\n" . 'Accept-Encoding: gzip';
- $optionsArray['http']['content'] = (($content_type == 'json') ? $data : Functions::queryBuild($data));
- }
- if ($auth_access_token != '') {
- $optionsArray['http']['header'] .= "\r\n" . 'Authorization: ' . $auth_access_token;
- }
- if ($sott_header_content != '') {
- $optionsArray['http']['header'] .= "\r\n" . 'X-LoginRadius-Sott: ' . $sott_header_content;
- }
- if ($secret_header_content != '') {
- $optionsArray['http']['header'] .= "\r\n" . 'X-LoginRadius-ApiSecret: ' . $secret_header_content;
- }
- if ($expiry_time != '') {
- $optionsArray['http']['header'] .= "\r\n" . 'X-Request-Expires: ' . $expiry_time;
- }
- if ($digest != '') {
- $optionsArray['http']['header'] .= "\r\n" . 'digest: ' . $digest;
- }
-
- $context = stream_context_create($optionsArray);
- $json_response = file_get_contents($request_url, false, $context);
- if (!$json_response) {
- throw new LoginRadiusException('file_get_contents error');
- }
- return $json_response;
- }
-}
diff --git a/src/LoginRadiusSDK/Clients/IHttpClient.php b/src/LoginRadiusSDK/Clients/IHttpClient.php
deleted file mode 100755
index 63cfed6..0000000
--- a/src/LoginRadiusSDK/Clients/IHttpClient.php
+++ /dev/null
@@ -1,24 +0,0 @@
-apiClientHandler("", array('fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API Returns an Email Verification token.
- *
- * @param $email
- *
- * @return
- */
- public function getEmailVerificationToken($email, $fields = '*') {
- return $this->apiClientHandler('/verify/token', array('fields' => $fields), array('method' => 'POST', 'post_data' => array('Email' => $email), 'content_type' => 'json'));
- }
-
- /**
- * This API Returns a forgot password token.
- *
- * @param $email
- *
- * @return
- */
- public function getForgotPasswordToken($email, $fields = '*') {
- return $this->apiClientHandler('/forgot/token', array('fields' => $fields), array('method' => 'POST', 'post_data' => array('Email' => $email), 'content_type' => 'json'));
- }
-
- /**
- * This API is used to Get Identities by Email Id.
- *
- * @param $email
- * @return array
- */
- public function getIdentitiesByEmail($email, $fields = '*') {
- return $this->apiClientHandler('/identities', array('email' => $email, 'fields' => $fields));
- }
-
- /**
- * This API is used to retrieve Access Token based on UID or user impersonation API.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- *
- * return Array of user profile
- */
- public function getAccessTokenByUid($uid, $fields = '*') {
- return $this->apiClientHandler("/access_token", array('uid' => $uid, 'fields' => $fields));
- }
-
- /**
- * This API is used to get the password field of an account.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- *
- * return {passwordHash : passwordhash}
- */
- public function getHashPassword($uid, $fields = '*') {
- return $this->apiClientHandler("/" . $uid . "/password", array('fields' => $fields));
- }
-
- /**
- * This API retrieves the profile data associated with the specific user using the passing in email address.
- *
- * @param $email = 'example@doamin.com';
- *
- * return all user profile
- */
- public function getProfileByEmail($email, $fields = '*') {
- return $this->apiClientHandler('', array('email' => $email, 'fields' => $fields));
- }
-
- /**
- * This API retrieves the profile data associated with the specific user using the passing in username.
- *
- * @param $username = 'example';
- *
- * return all user profile
- */
- public function getProfileByUsername($username, $fields = '*') {
- return $this->apiClientHandler('', array('username' => $username, 'fields' => $fields));
- }
-
- /**
- * This API retrieves the profile data associated with the specific user using the passing in phone number.
- *
- * @param $phone = 'example';
- *
- * return all user profile
- */
- public function getProfileByPhone($phone, $fields = '*') {
- return $this->apiClientHandler('', array('phone' => $phone, 'fields' => $fields));
- }
-
- /**
- * This API is used to retrieve all of the profile data from each of the linked social provider accounts associated with the account. For ex: A user has linked facebook and google account then this api will retrieve both profile data.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- *
- * return Array of user profile
- */
- public function getProfileByUid($uid, $fields = '*') {
- return $this->apiClientHandler("/" . $uid, array('fields' => $fields));
- }
-
- /**
- * This API is used to set a password for an account. It does not require to know the previous(old) password.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- * @param $password = 'xxxxxxxxxx';
- *
- * return {PasswordHash : passwordhash}
- */
- public function setPassword($uid, $password, $fields = '*') {
- return $this->apiClientHandler("/" . $uid . "/password", array('fields' => $fields), array('method' => 'PUT', 'post_data' => array('password' => $password), 'content_type' => 'json'));
- }
-
- /**
- * This API is used to Modify/Update details of an existing user.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- * @param $payload = '{
- "Prefix":"",
- "FirstName":"",
- "MiddleName":null,
- "LastName":"",
- "Suffix":null,
- "FullName":"",
- "NickName":null,
- "ProfileName":null,
- "BirthDate":"10-12-1985",
- "Gender":"M",
- "Website":null
- }';
- * @return type Object
- */
- public function update($uid, $payload, $is_null_support = 'false', $fields = '*') {
- return $this->apiClientHandler('/' . $uid, array('nullsupport' => $is_null_support, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to update security questions configuration using uid.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- * @param $payload =
- {
- "securityquestionanswer": {
- "MiddleName": "value1",
- "PetName": "value1"
- }
- }
- * @return type object
- */
- public function updateSecurityQuestionByUid($uid, $payload, $fields = '*') {
- return $this->apiClientHandler("/" . $uid, array('fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to invalidate the account.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- * @param $data = true(boolean type) if have you no body parameters
- *
- * @return array
- */
- public function invalidateEmail($uid, $data, $fields = '*') {
- return $this->apiClientHandler("/" . $uid . '/invalidateemail', array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to remove email using uid.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- * @param $email = 'xxxx@xxxxxx.com'
- * @return type object
- */
- public function removeEmailByUidAndEmail($uid, $email, $fields = '*') {
- return $this->apiClientHandler('/' . $uid . '/email', array('fields' => $fields), array('method' => 'DELETE', 'post_data' => array('Email' => $email), 'content_type' => 'json'));
- }
-
- /**
- * Delete an account from your LoginRadius app.
- *
- * @param $uid = 'xxxxxxxxxx' //UID, the unified identifier for each user account.
- *
- * return {"IsDeleted": "true"}
- */
- public function delete($uid, $fields = '*') {
- return $this->apiClientHandler('/' . $uid, array('fields' => $fields), array('method' => 'DELETE', 'post_data' => true));
- }
-
- /**
- * This API is used to update or insert email using uid.
- *
- * @param $uid
- * @param $payload =
- '{
- "Email" : [
- {
- "Type" : "Primary",
- "Value" : "xxx@xxxxxxxx.com"
- }
- ]
- }';
- * @return type object
- */
- public function updateOrInsertEmailByUid($uid, $payload, $fields = '*') {
- return $this->apiClientHandler('/' . $uid . '/email', array('fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to receive a backup code to login via the UID.
- *
- * @param $uid
- * @return type object
- */
- public function mfaGetBackupCodeByUid($uid, $fields = '*') {
- return $this->apiClientHandler("/2fa/backupcode", array('uid' => $uid, 'fields' => $fields));
- }
-
- /**
- * This API is used to get backup codes for login by the UID.
- *
- * @param $uid
- * @return type object
- */
- public function mfaResetBackupCodeByUid($uid, $fields = '*') {
- return $this->apiClientHandler("/2fa/backupcode/reset", array('uid' => $uid, 'fields' => $fields));
- }
-
- /**
- * MFA Reset Google Authenticator By UID
- *
- * @param $uid
- * @param $googleauthenticator
- * @return {"IsDeleted": "true"}
- */
- public function mfaResetGoogleAuthenticatorByUid($uid, $googleauthenticator) {
- return $this->apiClientHandler("/2fa/authenticator", array('uid' => $uid), array('method' => 'DELETE', 'post_data' => array('googleauthenticator' => $googleauthenticator), 'content_type' => 'json'));
- }
-
- /**
- * MFA Reset SMS Authenticator By UID
- *
- * @param $uid
- * @param $otpauthenticator
- * @return {"IsDeleted": "true"}
- */
- public function mfaResetSMSAuthenticatorByUid($uid, $otpauthenticator) {
- return $this->apiClientHandler("/2fa/authenticator", array('uid' => $uid), array('method' => 'DELETE', 'post_data' => array('otpauthenticator' => $otpauthenticator), 'content_type' => 'json'));
- }
-
- /**
- * This API is used to reset phone id verification by the UID.
- *
- * @param $uid
- * @param $data = true(boolean type) if have you no body parameters
- * @return type object
- */
- public function resetPhoneIdVerification($uid, $data, $fields = '*') {
- return $this->apiClientHandler('/' . $uid . '/invalidatephone', array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API allows you to generate SOTT with a given expiration time.
- *
- * @param $time_difference
- * @return type object
- */
- public function generateSOTT($time_difference = '10', $fields = '*') {
- return $this->apiClientHandler("/sott", array('timedifference' => $time_difference, 'fields' => $fields));
- }
-
- /**
- * Handle account APIs
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array()) {
- return Functions::apiClient("/identity/v2/manage/account" . $path, $query_array, array_merge(array('authentication' => 'secret'), $options));
- }
-
-}
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Account/CustomObjectAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Account/CustomObjectAPI.php
deleted file mode 100644
index d989140..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Account/CustomObjectAPI.php
+++ /dev/null
@@ -1,115 +0,0 @@
-apiClientHandler($uid . '/customObject/', array('ObjectName' => $object_name, 'fields' => $fields), array('method' => 'POST', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to retrieve the Custom Object for the specified account based on the account ID(UID).
- *
- * @param $uid='xxxxxx';//// UID, the identifier for each user account
- * @param $object_name= 'xxxxxxxxxxxx';//LoginRadius Custom Object name
- * @return type
- */
- public function getObjectByAccountid($uid, $object_name, $fields = '*')
- {
- return $this->apiClientHandler($uid . '/customObject/', array('ObjectName' => $object_name, 'fields' => $fields));
- }
-
- /**
- * This API is used to update the Custom Object for the specified account based on the record ID($object_record_id).
- *
- * @param $uid='xxxxxx';//// UID, the identifier for each user account
- * @param $object_name= 'xxxxxxxxxxxx';//LoginRadius Custom Object name
- * @param $object_record_id='xxxxxxxxx';//Unique identifier of the user's record in Custom Object
- * @param $update_type='xxxxxxxxx';
- * @param $data='{
- * "field1": "Store my field1 value",
- * "field2": "Store my field2 value"
- * }';
- * @return type
- */
- public function updateObjectByRecordID($uid, $object_name, $object_record_id, $update_type, $data, $fields = '*')
- {
- return $this->apiClientHandler($uid . '/customObject/' . $object_record_id, array('ObjectName' => $object_name, 'updatetype'=> $update_type, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to retrieve the Custom Object for the specified account based on the record ID($object_record_id).
- *
- * @param $uid='xxxxxx';//// UID, the identifier for each user account
- * @param $object_name= 'xxxxxxxxxxxx';//LoginRadius Custom Object name
- * @param $object_record_id='xxxxxxxxx';//Unique identifier of the user's record in Custom Object
- * @return type
- */
- public function getObjectByRecordID($uid, $object_name, $object_record_id, $fields = '*')
- {
- return $this->apiClientHandler($uid . '/customObject/' . $object_record_id, array('ObjectName' => $object_name, 'fields' => $fields));
- }
-
- /**
- * This API is used to remove the specified Custom Object based on the account ID(UID).
- *
- * @param $uid='xxxxxx';//// UID, the identifier for each user account
- * @param $object_name= 'xxxxxxxxxxxx';//LoginRadius Custom Object name
- * @param $object_record_id='xxxxxxxxx';//Unique identifier of the user's record in Custom Object
- * @return type
- */
- public function delete($uid, $object_name, $object_record_id, $fields = '*')
- {
- return $this->apiClientHandler($uid . '/customObject/' . $object_record_id, array('ObjectName' => $object_name, 'fields' => $fields), array('method' => 'DELETE', 'post_data' => true));
- }
-
- /**
- * Custom Object API handler
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array())
- {
- return Functions::apiClient("/identity/v2/manage/account/" . $path, $query_array, array_merge(array('authentication' => 'secret'), $options));
- }
-}
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Account/CustomRegistrationDataAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Account/CustomRegistrationDataAPI.php
deleted file mode 100644
index 629bb01..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Account/CustomRegistrationDataAPI.php
+++ /dev/null
@@ -1,107 +0,0 @@
-apiClientHandler("registrationdata", array('fields' => $fields), array('method' => 'POST', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to retrieve dropdown data.
- *
- * @param $type
- * @param string $parentid
- * @param string $skip
- * @param string $limit
- * @return type json object
- */
- public function getRegistrationData($type, $parent_id = '', $skip = '', $limit = '', $fields = '*') {
- return $this->apiClientHandler("registrationdata/" . $type, array('parentid' => $parent_id, 'skip' => $skip, 'limit' => $limit, 'fields' => $fields));
- }
-
- /**
- * This API allows you to update member of dropDown.
- * @param $recordid
- * {
- * "IsActive": true,
- * "Type": "",
- * "Key": "",
- * "Value": "",
- * "ParentId": "",
- * "Code": ""
- * }
- *
- * return type
- */
- public function updateRegistrationData($recordid, $data, $fields = '*') {
- return $this->apiClientHandler("registrationdata/" . $recordid, array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API allows you to delete a member from dropDownList.
- * @param $record_id
- *
- * return {"IsDeleted": "true"}
- */
- public function deleteRegistrationData($record_id, $fields = '*') {
- return $this->apiClientHandler('registrationdata/' . $record_id, array('fields' => $fields), array('method' => 'DELETE', 'post_data' => true));
- }
-
- /**
- * handle account APIs
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array()) {
- return Functions::apiClient("/identity/v2/manage/" . $path, $query_array, array_merge(array('authentication' => 'secret'), $options));
- }
-
-}
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Account/RoleAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Account/RoleAPI.php
deleted file mode 100644
index 862f98f..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Account/RoleAPI.php
+++ /dev/null
@@ -1,229 +0,0 @@
-apiClientHandler("role", array('fields' => $fields), array('method' => 'POST', 'post_data' => $roles, 'content_type' => 'json'));
- }
-
-
- /**
- * Get Context with Roles and Permissions.
- *
- * @param $uid = xxxxxxxxxxxxxxxxxxxxx;
- *
- * @return type
- */
- public function getContext($uid, $fields = '*') {
- return $this->apiClientHandler("account/" . $uid . "/rolecontext", array('fields' => $fields));
- }
-
- /**
- * Get Role of customer.
- *
- * @return type
- */
- public function get($fields = '*') {
- return $this->apiClientHandler("role", array('fields' => $fields));
- }
-
- /**
- * Get Account Role by uid.
- *
- * @param $uid
- * @return type
- */
- public function getAccountRolesByUid($uid, $fields = '*') {
- return $this->apiClientHandler('account/' . $uid . '/role', array('fields' => $fields));
- }
-
- /**
- * This API is used to add permission to role..
- *
- * $role = 'xxxxxx'; // role name
- * $permissions = {
- * "permissions": [
- * "permission_name1",
- * "permission_name2"
- * ]
- * }
- *
- * return object
- */
- public function addPermission($role, $permissions, $fields = '*') {
- return $this->apiClientHandler("role/" . $role . "/permission", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $permissions, 'content_type' => 'json'));
- }
-
- /**
- * Insert role to account.
- *
- * @param $uid
- * @param $data = {"roles": ["role_name"]}
- * @return type
- */
- public function assignRolesByUid($uid, $data, $fields = '*') {
- return $this->apiClientHandler('account/' . $uid . '/role', array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * Add/Update Roles Context.
- *
- * @param $uid = xxxxxxxxxxxxxxxxxxxxx;
- * @param $rolesContext Json data
- *
- * {
- * "RoleContext": [
- * {
- * "Context": "Home",
- * "Roles": ["admin","user"],
- * "AdditionalPermissions": ["X","Y","Z"]
- * },
- * {
- * "Context": "Work",
- * "Roles": ["admin"],
- * "AdditionalPermissions": ["X","Y","Z"]
- * }
- * ]
- * }
- * @return type
- */
- public function upsertContext($uid, $rolesContext, $fields = '*') {
- return $this->apiClientHandler("account/" . $uid . "/rolecontext", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $rolesContext, 'content_type' => 'json'));
- }
-
-
- /**
- * Delete role.
- *
- * $role = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //Name of Role
- *
- * return {IsDeleted : true}
- */
- public function delete($role, $fields = '*') {
- return $this->apiClientHandler('role/' . $role, array('fields' => $fields), array('method' => 'DELETE', 'post_data' => true));
- }
-
- /**
- * Unassign Roles by UID.
- *
- * @param $uid
- * @param $data = {"roles": ["role_name"]}
- * @return type
- */
- public function deleteAccountRoles($uid, $data, $fields = '*') {
- return $this->apiClientHandler('account/' . $uid . '/role', array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to remove permission to role.
- *
- * $role = 'xxxxxx'; // role name
- * $permissions = {
- * "permissions": [
- * "permission_name1"
- * ]
- * }
- *
- * return { "Name" : "Editor", "Permissions" :[{"Permission" : true},{"Permission" : true}]}
- */
- public function removePermission($role, $permissions, $fields = '*') {
- return $this->apiClientHandler('role/' . $role . '/permission', array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $permissions, 'content_type' => 'json'));
- }
-
- /**
- * Delete Roles Context by Role Context Name
- *
- * @param $uid = xxxxxxxxxxxxxxxxxxxxx;
- * @param $roleContextName String data
- * @return type
- */
- public function deleteContextbyContextName($uid, $roleContextName, $fields = '*') {
- return $this->apiClientHandler("account/" . $uid . "/rolecontext/" . $roleContextName, array('fields' => $fields), array('method' => 'DELETE', 'post_data' => true));
- }
- /**
- * Delete Roles From Context
- * @param type $uid
- * @param type $roles
- * {
- * "Role" : ["admin"]
- * }
- * @return type
- */
- public function deleteRoleFromContext($uid, $roleContextName, $roles, $fields = '*') {
- return $this->apiClientHandler("account/" . $uid . "/rolecontext/" . $roleContextName. "/role", array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $roles, 'content_type' => 'json'));
- }
- /**
- * Delete Additional Permission by Role Context Name
- *
- * @param type $uid
- * @param type $roleContextName
- * @param type $additionalPermission Json data
- * * {
- * "AdditionalPermissions": ["X"]
- * }
- * @return type
- */
- public function deleteAdditionalPermissionFromContext($uid, $roleContextName, $additionalPermission, $fields = '*') {
- return $this->apiClientHandler("account/" . $uid . "/rolecontext/" . $roleContextName. "/additionalpermission", array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $additionalPermission, 'content_type' => 'json'));
- }
-
- /**
- * handle Roles APIs
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array()) {
- return Functions::apiClient("/identity/v2/manage/" . $path, $query_array, array_merge(array('authentication' => 'secret'), $options));
- }
-
-}
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Authentication/AuthCustomObjectAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Authentication/AuthCustomObjectAPI.php
deleted file mode 100755
index b1838ff..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Authentication/AuthCustomObjectAPI.php
+++ /dev/null
@@ -1,108 +0,0 @@
-apiClientHandler("CustomObject", array('ObjectName' => $objectname, 'fields' => $fields), array('method' => 'POST', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Update custom object data.
- *
- * @param $access_token
- * @param $object_name
- * @param $object_record_id
- * @param $update_type
- * @param $data
- * @return type
- */
- public function updateCustomObjectData($access_token, $object_name, $object_record_id, $update_type, $data, $fields = '*')
- {
- return $this->apiClientHandler("CustomObject/" . $object_record_id, array('ObjectName' => $object_name, 'updatetype' => $update_type, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Get custom object Sets.
- *
- *
- * @param $access_token
- * @param $object_name
- * @return type
- */
- public function getCustomObjectSetsByToken($access_token, $object_name, $fields = '*')
- {
- return $this->apiClientHandler("CustomObject", array('ObjectName' => $object_name, 'fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Get custom object Set by id.
- *
- * @param $object_record_id
- * @param $object_name
- * @return type
- */
- public function getCustomObjectSetByID($access_token, $object_name, $object_record_id, $fields = '*')
- {
- return $this->apiClientHandler("CustomObject/" . $object_record_id, array('ObjectName' => $object_name, 'fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Delete custom object using ObjectRecordId.
- *
- * @param $object_record_id
- * @return type
- */
- public function deleteCustomObjectSet($access_token, $object_name, $object_record_id, $fields = '*')
- {
- return $this->apiClientHandler("CustomObject/" . $object_record_id, array('ObjectName' => $object_name, 'fields' => $fields), array('method' => 'DELETE', 'post_data' => true, 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * handle CustomObject APIs
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array())
- {
- return Functions::apiClient("/identity/v2/auth/" . $path, $query_array, array_merge(array('authentication' => 'key'), $options));
- }
-}
\ No newline at end of file
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Authentication/UserAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Authentication/UserAPI.php
deleted file mode 100755
index 65d4d54..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Authentication/UserAPI.php
+++ /dev/null
@@ -1,1118 +0,0 @@
-generateSOTT();
- if(!is_object($response)) {
- $response = json_decode($response);
- }
- return $this->apiClientHandler("register", array('verificationurl' => $verification_url, 'emailtemplate' => $email_template, 'options' => $options, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json', 'X-LoginRadius-Sott' => $response->Sott));
- }
-
- /**
- * This API retrieves a copy of the user data based on the Email.
- * @param $payload =
- '{
- "email":"xxxx@xxxx.com",
- "password": "xxxxxxxx",
- "securityanswer": ""
- }';
- * @param string $verification_url email verification url (Optional)
- * @param string $login_url url from where user is going login (Optional)
- * @param string $email_template email template name (Optional)
- * @param string $g_recaptcha_response It is only required for locked accounts when logging in (Optional)
- * @return type userprofile object
- */
- public function authLoginByEmail($payload, $verification_url = '', $login_url = '', $email_template = '', $g_recaptcha_response = '', $fields = '*') {
- return $this->apiClientHandler("login", array('verificationUrl' => $verification_url, 'loginUrl' => $login_url, 'emailTemplate' => $email_template, 'g-recaptcha-response' => $g_recaptcha_response, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API retrieves a copy of the user data based on the username.
- *
- * @param $payload=
- '{
- "username":"xxxxxx",
- "password": "xxxxxxxx",
- "securityanswer": ""
- }';
- * @param string $verification_url email verification (Optional)
- * @param string $login_url url from where user is going login (Optional)
- * @param string $email_template email template name (Optional)
- * @param string $g_recaptcha_response It is only required for locked accounts when logging in (Optional)
- * @return type userprofile object
- */
- public function authLoginByUsername($payload, $verification_url = '', $login_url = '', $email_template = '', $g_recaptcha_response = '', $fields = '*') {
- return $this->apiClientHandler("login", array('verificationUrl' => $verification_url, 'loginUrl' => $login_url, 'emailTemplate' => $email_template, 'g-recaptcha-response' => $g_recaptcha_response, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * Add email to account.
- *
- * @param $access_token (Required)
- * @param $email Email to be added to the user's account(Required)
- * @param $type String to identify the type of email(Required)
- * @param $verificationUrl Email verification url(Optional)
- * @param $email_template Name of the email template(Optional)
- * @return type
- */
- public function addEmail($access_token, $email, $type, $verification_url = '', $email_template = '', $fields = '*') {
- return $this->apiClientHandler("email", array('verificationurl' => $verification_url, 'emailtemplate' => $email_template, 'fields' => $fields), array('method' => 'POST', 'post_data' => array('email' => $email, 'type' => $type), 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Forgot password
- *
- * @param $email
- * @param $reset_password_url
- * @param $email_template (Optional)
- * @return type
- */
- public function forgotPassword($email, $reset_password_url, $email_template = '', $fields = '*') {
- return $this->apiClientHandler("password", array('resetpasswordurl' => $reset_password_url, 'emailtemplate' => $email_template, 'fields' => $fields), array('method' => 'POST', 'post_data' => array('email' => $email), 'content_type' => 'json'));
- }
-
- /**
- * check email exist.
- *
- * @param $email
- * @return type
- */
- public function checkAvailablityOfEmail($email, $fields = '*') {
- return $this->apiClientHandler("email", array('email' => $email, 'fields' => $fields));
- }
-
- /**
- * check username.exist
- *
- * @param $username
- * @return type
- */
- public function checkUsername($username, $fields = '*') {
- return $this->apiClientHandler("username", array('username' => $username, 'fields' => $fields));
- }
-
- /**
- * Get profile by access token.
- *
- * @param $access_token
- * @return userprofile object
- */
- public function getProfile($access_token, $fields = '*') {
- return $this->apiClientHandler("account", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API is used update the privacy policy stored in the user's profile.
- *
- * @param $access_token
- * @return userprofile object
- */
- public function privacyPolicyAccept($access_token, $fields = '*') {
- return $this->apiClientHandler("privacypolicy/accept", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API will send welcome email.
- *
- * @param $access_token
- * @param $welcome_email_template
- * @return IsPosted object
- */
- public function sendWelcomeEmail($access_token, $welcome_email_template = '', $fields = '*') {
- return $this->apiClientHandler("account/sendwelcomeemail", array('welcomeemailtemplate' => $welcome_email_template, 'fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Get Social Profile.
- *
- * @param $access_token
- * @param $fields
- * @return type
- */
- public function getSocialProfile($access_token, $fields = '*') {
- return $this->apiClientHandler("socialidentity", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Validates access token,if valid then returns a response with its expiry otherwise error
- *
- * @param $access_token *
- * @return object type
- */
- public function checkTokenValidity($access_token, $fields = '*') {
- return $this->apiClientHandler("access_token/validate", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Verify email *
- * @param $vtoken
- * @param $url
- * @param $welcome_email_template
- * @return type
- */
- public function verifyEmail($vtoken, $url = '', $welcome_email_template = '', $fields = '*') {
- return $this->apiClientHandler("email", array('verificationtoken' => $vtoken, 'url' => $url, 'welcomeemailtemplate' => $welcome_email_template, 'fields' => $fields));
- }
-
- /**
- * Delete Account.
- *
- * @param $deletetoken
- * @return type
- */
- public function deleteAccount($deletetoken, $fields = '*') {
- return $this->apiClientHandler("account/delete", array('deletetoken' => $deletetoken, 'fields' => $fields));
- }
-
- /**
- * Invalidates access token or expires an access token validity.
- *
- * @param $access_token *
- * @return "IsPosted": "true"
- */
- public function invalidateTokenByAccessToken($access_token, $fields = '*') {
- return $this->apiClientHandler("access_token/invalidate", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API is used to retrieve the list of questions using access token.
- *
- * @param string $access_token
- * @param $fields
- * @return type json object
- */
- public function getSecurityQuestionsByAccessToken($access_token, $fields = '*') {
- return $this->apiClientHandler("securityquestion/accesstoken", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API is used to retrieve the list of questions using email.
- *
- * @param type $email
- * @param type $fields
- * @return type json object
- */
- public function getSecurityQuestionsByEmail($email, $fields = '*') {
- return $this->apiClientHandler("securityquestion/email", array('email' => $email, 'fields' => $fields));
- }
-
- /**
- * This API is used to retrieve the list of questions using username.
- *
- * @param string $username
- * @param $fields
- * @return type json object
- */
- public function getSecurityQuestionsByUserName($username, $fields = '*') {
- return $this->apiClientHandler("securityquestion/username", array('username' => $username, 'fields' => $fields));
- }
-
- /**
- * This API is used to retrieve the list of questions using phone id.
- *
- * @param string $phone
- * @param $fields
- * @return type json object
- */
- public function getSecurityQuestionsByPhone($phone, $fields = '*') {
- return $this->apiClientHandler("securityquestion/phone", array('phone' => $phone, 'fields' => $fields));
- }
-
- /**
- * Verify email by OTP .
- *
- * @param $payload json data
- * @param $url Mention URL to log the main URL(Domain name) in Database(Optional)
- * @param $welcome_email_template Email template for welcome email(Optional)
- * @return type
- */
- public function verifyEmailByOtp($payload, $url = '', $welcome_email_template = '', $fields = '*') {
- return $this->apiClientHandler("email", array('url' => $url, 'welcomeemailtemplate' => $welcome_email_template, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /* Change Account Password.
- *
- * @param $access_token
- * @param $old_password
- * @param $new_password
- * @return type
- */
-
- public function changeAccountPassword($access_token, $old_password, $new_password, $fields = '*') {
- $data = array('oldpassword' => $old_password, 'newpassword' => $new_password);
- return $this->apiClientHandler("password/change", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Link account.
- *
- * @param $access_token
- * @param $candidate_token
- * @return type
- */
- public function accountLink($access_token, $candidate_token, $fields = '*') {
- $data = array('candidatetoken' => $candidate_token);
- return $this->apiClientHandler("socialidentity", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This api used to resend email verification link.
- *
- * @param $email
- * @param string $verification_url
- * @param string $email_template
- * @return {"isPosted": "true"}
- */
- public function resendEmailVerification($email, $verification_url = '', $email_template = '', $fields = '*') {
- return $this->apiClientHandler("register", array('verificationUrl' => $verification_url, 'emailTemplate' => $email_template, 'fields' => $fields), array('method' => 'PUT', 'post_data' => array('email' => $email), 'content_type' => 'json'));
- }
-
- /**
- * Reset Password by reset token.
- *
- * @param $reset_token
- * @param $password
- * @param string $welcome_email_template (Optional)
- * @param string $reset_password_email_template (Optional)
- * @return type
- */
- public function resetPassword($reset_token, $password, $welcome_email_template = '', $reset_password_email_template = '', $fields = '*') {
- return $this->apiClientHandler("password/reset", array('fields' => $fields), array('method' => 'PUT', 'post_data' => array('resettoken' => $reset_token, 'password' => $password, 'welcomeEmailTemplate' => $welcome_email_template, 'resetpasswordemailtemplate' => $reset_password_email_template), 'content_type' => 'json'));
- }
-
- /**
- * Reset Password by OTP.
- *
- * @param $password
- * @param $otp
- * @param $email
- * @param $welcome_email_template (Optional)
- * @param $reset_password_email_template (Optional)
- * @return type
- */
- public function resetPasswordByOtp($password, $otp, $email, $welcome_email_template = '', $reset_password_email_template = '', $fields = '*') {
- return $this->apiClientHandler("password/reset", array('fields' => $fields), array('method' => 'PUT', 'post_data' => array('password' => $password, 'otp' => $otp, 'email' => $email, 'welcomeemailtemplate' => $welcome_email_template, 'resetpasswordemailtemplate' => $reset_password_email_template), 'content_type' => 'json'));
- }
-
- /**
- * This API is used to reset password for the specified account By email.
- *
- * @param $payload =
- '{
- "securityanswer": {
- "cb7*******3e40ef8a****01fb****20": "Answer"
- },
- "email": "",
- "password": "xxxxxxxxxx",
- "resetpasswordemailtemplate": ""
- }';
- * @return {"IsPosted" : "true"}
- */
-
- public function authResetPasswordBySecurityAnswerAndEmail($payload, $fields = '*') {
- return $this->apiClientHandler("password/securityanswer", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to reset password for the specified account By phone.
- *
- * @param $payload =
- '{
- "securityanswer": {
- "cb7*******3e40ef8a****01fb****20": "Answer"
- },
- "phone": "",
- "password": "xxxxxxxxxx",
- "resetpasswordemailtemplate": ""
- }';
- * @return {"IsPosted" : "true"}
- */
-
- public function authResetPasswordBySecurityAnswerAndPhone($payload, $fields = '*') {
- return $this->apiClientHandler("password/securityanswer", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to reset password for the specified account By UserName.
- *
- * @param $payload =
- '{
- "securityanswer": {
- "cb7*******3e40ef8a****01fb****20": "Answer"
- },
- "userName": "",
- "password": "xxxxxxxxxx",
- "resetpasswordemailtemplate": ""
- }';
- * @return {"IsPosted" : "true"}
- */
-
- public function authResetPasswordBySecurityAnswerAndUserName($payload, $fields = '*') {
- return $this->apiClientHandler("password/securityanswer", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * change Username .
- *
- * @param $access_token
- * @param $username
- * @return type
- */
- public function changeUsername($access_token, $username, $fields = '*') {
- return $this->apiClientHandler("username", array('fields' => $fields), array('method' => 'PUT', 'post_data' => array('username' => $username), 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Update user profile by access token.
- * @param $access_token
- * @param $payload = '{
- "Prefix":"",
- "FirstName":"Joe",
- "MiddleName":null,
- "LastName":"Smith",
- "BirthDate":"10-12-1985",
- "Gender":"M",
- "Website":null
- }';
- * @param string $verification_url (Optional)
- * @param string $email_template (Optional)
- * @param string $sms_template (Optional)
- * @return type object
- */
-
- public function updateProfile($access_token, $payload, $verification_url = '', $email_template = '', $sms_template = '', $fields = '*') {
- return $this->apiClientHandler("account", array('verificationUrl' => $verification_url, 'emailTemplate' => $email_template, 'smstemplate ' => $sms_template ,'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API is used to update security questions by the access token.
- * @param string $access_token
- * @param $payload =
- * '{
- * "securityquestionanswer": {
- * "db7****8a73e4******bd9****8c20": "Answer"
- * }
- * }';
- * @return type json object
- */
- public function updateSecurityQuestionByAccessToken($access_token, $payload, $fields = '*') {
- return $this->apiClientHandler("account", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Delete account after email confirmation.
- *
- * @param $access_token
- * @param string $deleteUrl
- * @param string $email_template
- * @return type
- */
- public function deleteAccountByEmailConfirmation($access_token, $delete_url = '', $email_template = '', $fields = '*') {
- return $this->apiClientHandler('account', array('deleteUrl' => $delete_url, 'emailTemplate' => $email_template, 'fields' => $fields), array('method' => 'DELETE', 'post_data' => true, 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Remove Email to account.
- *
- * @param $access_token
- * @param $email string "xxx@xxxxxxx.com"
- * @return type
-
- */
- public function removeEmail($access_token, $email, $fields = '*') {
- $data = array('Email' => $email);
- return $this->apiClientHandler("email", array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Unlink account.
- *
- * @param $access_token
- * @param $provider_id Unique ID of the linked account
- * @param $provider Name of the provider
- * @return type
- */
- public function accountUnlink($access_token, $provider_id, $provider, $fields = '*') {
- $data = array('Provider' => $provider, 'ProviderId' => $provider_id);
- return $this->apiClientHandler("socialidentity", array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /* Custom Registration Data */
-
- /**
- * This API allows you to validate code for a particular dropdown member.
- *
- * @param json $payload
- * @return type json object
- */
- public function validateRegistrationDataCode($payload, $fields = '*') {
- return $this->apiClientHandler("registrationdata/validatecode", array('fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to retrieve dropdown data.
- *
- * @param $type
- * @param string $parentid
- * @param string $skip
- * @param string $limit
- * @return type json object
- */
- public function authGetRegistrationDataServer($type, $parent_id = '', $skip = '', $limit = '', $fields = '*') {
- return $this->apiClientHandler("registrationdata/" . $type, array('parentid' => $parent_id, 'skip' => $skip, 'limit' => $limit, 'fields' => $fields));
- }
-
-
- /* Password Less Login API's */
-
- /**
- * This API is used to send a Passwordless Login verification link to the provided Email ID.
- *
- * @param $email
- * @param string $passwordlesslogintemplate (Optional)
- * @param string $verificationurl (Optional)
- * @return type {"IsPosted": true}
- */
- public function passwordLessLoginByEmail($email, $verificationurl = '', $passwordlesslogintemplate = '') {
- return $this->apiClientHandler("login/passwordlesslogin/email", array('email' => $email, 'passwordlesslogintemplate' => $passwordlesslogintemplate, 'verificationurl' => $verificationurl));
- }
-
- /**
- * This API is used to send a Passwordless Login Verification Link to a user by providing their UserName.
- *
- * @param $username
- * @param string $passwordlesslogintemplate (Optional)
- * @param string $verificationurl (Optional)
- * @return type {"IsPosted": true}
- */
- public function passwordLessLoginByUserName($username, $verificationurl = '', $passwordlesslogintemplate = '') {
- return $this->apiClientHandler("login/passwordlesslogin/email", array('username' => $username, 'passwordlesslogintemplate' => $passwordlesslogintemplate, 'verificationurl' => $verificationurl));
- }
-
- /**
- * This API is used to verify the Passwordless Login verification link.
- *
- * @param $verificationtoken
- * @param string $welcomeemailtemplate (Optional)
- * @return type object
- */
- public function passwordLessLoginVerification($verificationtoken, $welcomeemailtemplate = '') {
- return $this->apiClientHandler("login/passwordlesslogin/email/verify", array('verificationtoken' => $verificationtoken, 'welcomeemailtemplate' => $welcomeemailtemplate));
- }
-
- /**
- * API can be used to send a One-time Passcode.
- *
- * @param $phone
- * @param $sms_template (Optional)
- * @return type object
- */
- public function phoneSendOtp($phone, $sms_template = '') {
- return $this->apiClientHandler("login/passwordlesslogin/otp", array('phone' => $phone, 'smstemplate' => $sms_template));
- }
-
- /**
- * This API verifies an account by OTP and allows the user to login.
- *
- * @param $data
- * @param $sms_template (Optional)
- * @return type object
- */
- public function phoneLoginByOtp($data, $sms_template = '') {
- return $this->apiClientHandler("login/passwordlesslogin/otp/verify", array('smstemplate' => $sms_template), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /* Smart Login API's */
-
- /**
- * This API sends a Smart Login link to the user's Email Id.
- *
- * @param type $clientguid
- * @param type $email
- * @param type $smartloginemailtemplate (Optional)
- * @param type $welcomeemailtemplate (Optional)
- * @param type $redirecturl (Optional)
- * @return type {"IsPosted": true}
- */
- public function smartLoginByEmail($clientguid, $email, $smartloginemailtemplate = "", $welcomeemailtemplate = "", $redirecturl = "") {
- return $this->apiClientHandler("login/smartlogin", array('email' => $email, 'clientguid' => $clientguid,
- 'smartloginemailtemplate' => $smartloginemailtemplate,
- 'welcomeemailtemplate' => $welcomeemailtemplate,
- 'redirecturl' => $redirecturl)
- );
- }
-
- /**
- * This API sends a Smart Login link to the user's Email Id.
- *
- * @param type $clientguid
- * @param type $username
- * @param type $smartloginemailtemplate (Optional)
- * @param type $welcomeemailtemplate (Optional)
- * @param type $redirecturl (Optional)
- * @return type {"IsPosted": true}
- */
- public function smartLoginByUserName($clientguid, $username, $smartloginemailtemplate = "", $welcomeemailtemplate = "", $redirecturl = "") {
- return $this->apiClientHandler("login/smartlogin", array('username' => $username,
- 'clientguid' => $clientguid, 'smartloginemailtemplate' => $smartloginemailtemplate,
- 'welcomeemailtemplate' => $welcomeemailtemplate, 'redirecturl' => $redirecturl)
- );
- }
-
- /**
- * This API is used to check if the Smart Login link has been clicked or not.
- *
- * @param type $clientguid
- * @return type object
- */
- public function smartLoginPing($clientguid) {
- return $this->apiClientHandler("login/smartlogin/ping", array('clientguid' => $clientguid));
- }
-
- /**
- * This API verifies the provided token for Smart Login.
- *
- * @param type $verificationtoken
- * @param type $welcomeemailtemplate (Optional)
- * @return type {"IsPosted": true,"IsVerified": true}
- */
- public function smartLoginVerifyToken($verificationtoken, $welcomeemailtemplate = "") {
- return $this->apiClientHandler("email/smartlogin", array('verificationtoken' => $verificationtoken,
- 'welcomeemailtemplate' => $welcomeemailtemplate)
- );
- }
-
- /* One Touch Login API's */
-
- /**
- * This API is used to send a link to a specified email for a frictionless login/registration
- *
- * @param $payload = '{
- "clientguid": "",
- "email": "",
- "name": "",
- "qq_captcha_ticket": "",
- "qq_captcha_randstr": "",
- "g-recaptcha-response ": ""
- }';
- * @param type $redirecturl (Optional)
- * @param type $onetouchloginemailtemplate (Optional)
- * @param type $welcomeemailtemplate (Optional)
- * @return {"isPosted" : true}
- */
-
- public function oneTouchLoginByEmail($payload, $redirecturl = '', $onetouchloginemailtemplate = '', $welcomeemailtemplate = '') {
- return $this->apiClientHandler("onetouchlogin/email", array('redirecturl' => $redirecturl, 'onetouchloginemailtemplate' => $onetouchloginemailtemplate, 'welcomeemailtemplate' => $welcomeemailtemplate), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to send one time password to a given phone number for a frictionless login/registration.
- *
- * @param $payload = '{
- "phone": "",
- "name": "",
- "qq_captcha_ticket": "",
- "qq_captcha_randstr": "",
- "g-recaptcha-response ": ""
- }'
- * @param string $smstemplate (Optional)
- * @return type object
- */
- public function oneTouchLoginByPhone($payload, $smstemplate = '') {
- return $this->apiClientHandler("onetouchlogin/phone", array('smstemplate' => $smstemplate), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to verify the otp for One Touch Login.
- *
- * @param $otp = "xxxxxx"
- * @param $phone = "xxxxxxxxx"
- * @param $sms_template (Optional)
- * @return type object
- */
- public function oneTouchOtpVerification($otp, $phone, $sms_template = '') {
- return $this->apiClientHandler("onetouchlogin/phone/verify", array('otp' => $otp, 'smstemplate' => $sms_template), array('method' => 'PUT', 'post_data' => array('phone' => $phone), 'content_type' => 'json'));
- }
-
- /* Phone Authentication API's */
-
- /**
- * This API retrieves a copy of the user data based on the Phone.
- *
- * @param $payload = '{
- "phone":"xxxxxxxxxx",
- "password": "xxxxxxxx",
- "securityanswer": ""
- }';
- * @param string $login_url url from where user is going login
- * @param string $sms_template sms template name
- * @param string $g_recaptcha_response It is only required for locked accounts when logging in
- * @return type userprofile object
- */
- public function authLoginByPhone($payload, $login_url = '', $sms_template = '', $g_recaptcha_response = '', $fields = '*') {
- return $this->apiClientHandler("login", array('loginUrl' => $login_url, 'smstemplate' => $sms_template, 'g-recaptcha-response' => $g_recaptcha_response, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * Phone Forgot password By OTP
- *
- * @param $phone = "xxxxxxxx" The Registered Phone Number
- * @param $sms_template (Optional)
- * @return type object
- */
- public function forgotPasswordByOtp($phone, $sms_template = '') {
- return $this->apiClientHandler("password/otp", array('smstemplate' => $sms_template), array('method' => 'POST', 'post_data' => array('phone' => $phone), 'content_type' => 'json'));
- }
-
- /**
- * Phone Resend OTP.
- *
- * @param $phone = "xxxxxxxx" The Registered Phone Number
- * @param string $sms_template (Optional)
- * @return type object
- */
- public function resendOTP($phone, $sms_template = '') {
- return $this->apiClientHandler("phone/otp", array('smsTemplate' => $sms_template), array('method' => 'POST', 'post_data' => array('phone' => $phone), 'content_type' => 'json'));
- }
-
- /**
- * Phone Resend OTP by token.
- *
- * @param $access_token
- * @param $phone = "xxxxxxxx" The Registered Phone Number
- * @param string $sms_template (Optional)
- * @return type object
- */
- public function resendOTPByToken($access_token, $phone, $sms_template = '') {
- return $this->apiClientHandler("phone/otp", array('smsTemplate' => $sms_template), array('method' => 'POST', 'post_data' => array('phone' => $phone), 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API used to register a user using phone.
- *
- * @param $payload = '{
- "FirstName": "",
- "PhoneId": "**************",
- "Password": "*********",
- "Email":[
- {
- "Type": "Primary",
- "Value": "xxx@xxxxxx.com"
- }
- ]}';
- * @param string $verification_url email verification
- * @param string $sms_template email template name
- * @return {"isPosted": "true"}
- */
- public function registerByPhone($payload, $verification_url = '', $sms_template = '', $options = '') {
- $accountObj = new AccountAPI();
- $response = $accountObj->generateSOTT();
- if(!is_object($response)) {
- $response = json_decode($response);
- }
- return $this->apiClientHandler("register", array('verificationurl' => $verification_url, 'smstemplate' => $sms_template, 'options' => $options), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json', 'X-LoginRadius-Sott' => $response->Sott));
- }
-
- /**
- * Check Phone number exist.
- *
- * @param $phone = "xxxxxxxxx" The Registered Phone Number
- * @return type {"IsExist": true}
- */
- public function checkAvailablityOfPhone($phone) {
- return $this->apiClientHandler("phone", array('phone' => $phone));
- }
-
- /**
- * Update phone number.
- *
- * @param $access_token
- * @param $phone = "xxxxxxxx" New Phone number
- * @param string $sms_template (Optional)
- * @return type object
- */
- public function updatePhone($access_token, $phone, $sms_template = '') {
- return $this->apiClientHandler("phone", array('smsTemplate' => $sms_template), array('method' => 'PUT', 'post_data' => array('phone' => $phone), 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Phone reset password by OTP.
- *
- * @param $phone The Registered Phone Number
- * @param $otp The Verification Code
- * @param $password New password
- * @param $sms_template SMS Template Name (Optional)
- * @param $reset_password_email_template Reset Password Email Template (Optional)
- * @return type {"IsPosted": true}
- */
- public function phoneResetPasswordByOtp($phone, $otp, $password, $sms_template = '', $reset_password_email_template = '') {
- return $this->apiClientHandler("password/otp", array(), array('method' => 'PUT', 'post_data' => array('phone' => $phone, 'otp' => $otp, 'password' => $password, 'smstemplate' => $sms_template, 'resetpasswordemailtemplate' => $reset_password_email_template), 'content_type' => 'json'));
- }
-
- /**
- * Phone Verify OTP.
- *
- * @param $otp = 'xxxxxxxxx'
- * @param $phone = 'xxxxxxxxxxx'
- * @param $sms_template (Optional)
- * @return type object
- */
- public function verifyOTP($otp, $phone, $sms_template = '', $fields = '*') {
- return $this->apiClientHandler("phone/otp", array('otp' => $otp, 'smstemplate' => $sms_template, 'fields' => $fields), array('method' => 'PUT', 'post_data' => array('phone' => $phone), 'content_type' => 'json'));
- }
-
- /**
- * Verify OTP by token.
- *
- * @param $access_token = 'xxxxxxxxxxxx'
- * @param $otp = 'xxxxxx'
- * @param $sms_template (Optional)
- * @return type {"IsPosted": true}
- */
- public function verifyOTPByToken($access_token, $otp, $sms_template = '') {
- return $this->apiClientHandler("phone/otp", array('otp' => $otp, 'smstemplate' => $sms_template), array('method' => 'PUT', 'post_data' => array('phone' => ''), 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * This API is used to delete the Phone ID.
- *
- * @param $access_token
- * @return type {"IsDeleted": true}
- */
- public function deletePhoneIdByAccessToken($access_token) {
- return $this->apiClientHandler("phone", array(), array('method' => 'DELETE', 'post_data' => true, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
-
- /* Multi Factor Authenctiation API's */
-
- /**
- * This API used to provide multi factor login with email/password combination.
- * @param $payload =
- '{
- "email":"xxxx@xxxxxxx.com",
- "password": "xxxxxx"
- }';
- * @param string $login_url url from where user is going login (Optional)
- * @param string $verification_url email verification (Optional)
- * @param string $email_template email template name (Optional)
- * @param string $sms_template_2fa sms template 2fa name (Optional)
- * @return type SecondFactorAuthentication object
- */
-
- public function mfaEmailLogin($payload, $login_url = '', $verification_url = '', $email_template = '', $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("login/2fa", array('loginUrl' => $login_url, 'verificationUrl' => $verification_url, 'emailTemplate' => $email_template, 'smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API used to provide multi factor login with username/password combination.
- *
- * @param $payload =
- '{
- "username":"xxxxxxx",
- "password": "xxxxxx"
- }';
- * @param string $login_url url from where user is going login (Optional)
- * @param string $verification_url email verification (Optional)
- * @param string $email_template email template name (Optional)
- * @param string $sms_template_2fa sms template 2fa name (Optional)
- * @return type SecondFactorAuthentication object
- */
- public function mfaUserNameLogin($payload, $login_url = '', $verification_url = '', $email_template = '', $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("login/2fa", array('loginUrl' => $login_url, 'verificationUrl' => $verification_url, 'emailTemplate' => $email_template, 'smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API used to provide multi factor login with phone/password combination.
- *
- * @param $payload =
- '{
- "phone":"xxxxxxx",
- "password": "xxxxxx"
- }';
- * @param string $login_url url from where user is going login (Optional)
- * @param string $verification_url email verification (Optional)
- * @param string $sms_template sms template name (Optional)
- * @param string $sms_template_2fa sms template 2fa name (Optional)
- * @return type SecondFactorAuthentication object
- */
- public function mfaPhoneLogin($payload, $login_url = '', $verification_url = '', $sms_template = '', $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("login/2fa", array('loginUrl' => $login_url, 'verificationUrl' => $verification_url, 'smsTemplate' => $sms_template, 'smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('method' => 'POST', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * MFA Validate Access Token
- * This API is used to configure the multi-factor-authentication after login by using the access token
- *
- * @param $access_token
- * @param string $sms_template_2fa (Optional)
- * @return type object
- */
- public function mfaValidateAccessToken($access_token, $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("account/2fa", array('smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * MFA Backup Code by Access Token
- *
- * @param type $access_token
- * @return type backup codes object
- */
- public function getBackupCodeForLoginbyAccessToken($access_token, $fields = '*') {
- return $this->apiClientHandler("account/2fa/backupcode", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Reset Back Up code by access token
- *
- * @param type $access_token
- * @return type
- */
- public function resetBackupCodebyAccessToken($access_token, $fields = '*') {
- return $this->apiClientHandler("account/2fa/backupcode/reset", array('fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * MFA Validate Backup code
- * @param type $second_factor_auth_token Second factor authentication token
- * @param type $backupcode = 'xxxxxxxx' Backup Code for login
- * @return type
- */
- public function getLoginbyBackupCode($second_factor_auth_token, $backupcode, $fields = '*') {
- $data = array('backupcode' => $backupcode);
- return $this->apiClientHandler("login/2fa/verification/backupcode", array('SecondFactorAuthenticationToken' => $second_factor_auth_token, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to log in by completing the multi-factor-authentication by passing the one time passcode.
- * @param $second_factor_auth_token
- * @param $payload json data
- * @param string $sms_template_2fa sms template 2fa name (optional)
- * @return type
- */
-
- public function mfaValidateOtp($second_factor_auth_token, $payload, $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("login/2fa/verification/otp", array('SecondFactorAuthenticationToken' => $second_factor_auth_token, 'smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to log in by completing the multi-factor-authentication by passing the google authenticator code.
- * @param $second_factor_auth_token
- * @param $google_auth_code 'xxxxxxxxxx' The code generated by google authenticator app.
- * @param $sms_template_2fa SMS Template Name (optional)
- * @return type
- */
-
- public function mfaValidateGoogleAuthCode($second_factor_auth_token, $google_auth_code, $sms_template_2fa = '', $fields = '*') {
- $data = array('googleauthenticatorcode' => $google_auth_code);
- return $this->apiClientHandler("login/2fa/verification/googleauthenticatorcode", array('SecondFactorAuthenticationToken' => $second_factor_auth_token, 'smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to update the multi-factor-authentication phone number by sending the verification OTP to the provided phone number.
- *
- * @param $second_factor_auth_token
- * @param $phoneno2fa = 'xxxxxxxxxx'
- * @param string $sms_template_2fa (optional)
- * @return type
- */
- public function mfaUpdatePhoneNo($second_factor_auth_token, $phoneno2fa, $sms_template_2fa = '') {
- $data = array('phoneno2fa' => $phoneno2fa);
- return $this->apiClientHandler("login/2fa", array('SecondFactorAuthenticationToken' => $second_factor_auth_token, 'smstemplate2fa' => $sms_template_2fa), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json'));
- }
-
- /**
- * This API is used to update the multi-factor-authentication phone number by sending the access token to the provided phone number.
- *
- * @param $access_token
- * @param $phoneno2fa = 'xxxxxxxxxx'
- * @param string $sms_template_2fa (optional)
- * @return type
- */
- public function mfaUpdatePhoneNoByToken($access_token, $phoneno2fa, $sms_template_2fa = '') {
- $data = array('phoneno2fa' => $phoneno2fa);
- return $this->apiClientHandler("account/2fa", array('smstemplate2fa' => $sms_template_2fa), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Update MFA by Access Token
- * This API is used to Enable Multi-factor authentication by access token on user login.
- *
- * @param $access_token
- * @param $google_auth_code = 'xxxxxxxxxx' The code generated by google authenticator app after scanning QR code
- * @param string $sms_template (optional)
- * @return type
- */
-
- public function updateMfaByGoogleAuthCode($access_token, $google_auth_code, $sms_template = '', $fields = '*') {
- $data = array('googleauthenticatorcode' => $google_auth_code);
- return $this->apiClientHandler("account/2fa/verification/googleauthenticatorcode", array('smstemplate' => $sms_template, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Update MFA Setting
- * This API is used to trigger the Multi-factor authentication settings after login for secure actions.
- *
- * @param $access_token
- * @param $payload
- * @param string $sms_template (optional)
- * @return type
- */
-
- public function updateMfaByOtp($access_token, $payload, $sms_template = '', $fields = '*') {
- return $this->apiClientHandler("account/2fa/verification/otp", array('smstemplate' => $sms_template, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * MFA Reset Google Authenticator by Token
- * This API Removes/Reset Google Authenticator By Token.
- *
- * @param $access_token
- * @param $googleauthenticator pass boolean(true) to remove Google Authenticator
- * @return {"IsDeleted": "true"}
- */
- public function resetGoogleAuthenticatorByToken($access_token, $googleauthenticator, $fields = '*') {
- $data = array('googleauthenticator' => $googleauthenticator);
- return $this->apiClientHandler("account/2fa/authenticator", array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * MFA Reset SMS Authenticator by Token
- * This API Removes/Reset SMS Authenticator By Token.
- *
- * @param $access_token
- * @param $otpauthenticator pass boolean(true) to remove SMS Authenticator
- * @return "IsDeleted": "true"
- */
- public function resetSMSAuthenticatorByToken($access_token, $otpauthenticator, $fields = '*') {
- $data = array('otpauthenticator' => $otpauthenticator);
- return $this->apiClientHandler("account/2fa/authenticator", array('fields' => $fields), array('method' => 'DELETE', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /* Re-Authentication API */
-
- /**
- * Multi Factor Re-Authenticate
- * This API can be used to trigger Multi-Factor Autentication workflow for the provided access_token.
- * @param $access_token
- * @param $sms_template_2fa (optional)
- * @return type
- */
-
- public function mfaReAuthentiation($access_token, $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("account/reauth/2fa", array('smstemplate2fa' => $sms_template_2fa, 'fields' => $fields), array('access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Validate MFA by Google Authenticator Code
- * This API is used to re-authenticate via Multi-factor-authentication by passing the google authenticator code.
- * @param $access_token
- * @param $google_authenticator = 'xxxxxxxxxx'
- * @return type
- */
-
- public function validateMfaByGoogleAuthCode($access_token, $google_authenticator, $fields = '*') {
- $data = array('googleauthenticatorcode' => $google_authenticator);
- return $this->apiClientHandler("account/reauth/2fa/googleauthenticatorcode", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Validate MFA by Backup Code
- * This API is used to re-authenticate by set of backup codes via access token.
- * @param $access_token
- * @param $backupcode = 'xxxxxxxx'
- * @return type
- */
-
- public function validateMfaByBackupCode($access_token, $backupcode, $fields = '*') {
- $data = array('backupcode' => $backupcode);
- return $this->apiClientHandler("account/reauth/2fa/backupcode", array('fields' => $fields), array('method' => 'PUT', 'post_data' => $data, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Validate MFA by OTP
- * This API is used to re-authenticate via Multi-factor authentication by passing the One Time Password received via SMS.
- * @param $access_token
- * @param $payload json data
- * @param string $sms_template_2fa (Optional)
- * @return type
- */
-
- public function validateMfaByOtp($access_token, $payload, $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("account/reauth/2fa/otp", array('smstemplate' => $sms_template_2fa, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
- /**
- * This API can be used to verify event based multi factor authentication by Password.
- * @param $access_token
- * @param $payload json data
- * @param string $sms_template_2fa (Optional)
- * @return type
- */
-
- public function validateMfaByPassword($access_token, $payload, $sms_template_2fa = '', $fields = '*') {
- return $this->apiClientHandler("account/reauth/password", array('smstemplate' => $sms_template_2fa, 'fields' => $fields), array('method' => 'PUT', 'post_data' => $payload, 'content_type' => 'json', 'access-token' => "Bearer ".$access_token));
- }
-
- /**
- * Handle User APIs
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
-
- private function apiClientHandler($path, $query_array = array(), $options = array()) {
- return Functions::apiClient("/identity/v2/auth/" . $path, $query_array, array_merge(array('authentication' => 'key'), $options));
- }
-}
\ No newline at end of file
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Social/AdvanceSocialLoginAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Social/AdvanceSocialLoginAPI.php
deleted file mode 100755
index 65a4dc0..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Social/AdvanceSocialLoginAPI.php
+++ /dev/null
@@ -1,209 +0,0 @@
-apiClientHandler('access_token/facebook', array("key" => Functions::getApiKey(), "fb_access_token" => $fb_access_token, 'fields' => $fields));
- }
-
- /**
- * Get LoginRadius Access token by Passing Twitter token
- *
- * @param $tw_access_token
- * @param $tw_token_secret
- * @return type
- */
- public function getAccessTokenByPassingTwitterToken($tw_access_token, $tw_token_secret, $fields = '*')
- {
- return $this->apiClientHandler('access_token/twitter', array("key" => Functions::getApiKey(), "tw_access_token" => $tw_access_token, 'tw_token_secret' => $tw_token_secret, 'fields' => $fields));
- }
-
- /**
- * The User Profile API is used to get the latest updated social profile data from the user’s social account after authentication.
- * The social profile will be retrieved via oAuth and OpenID protocols.
- * The data is normalized into LoginRadius’ standard data format.
- * This API should be called using the access token retrieved from the refresh access token API.
- *
- * @param $access_token
- * @return type
- */
- public function refreshUserProfile($access_token, $fields = '*')
- {
- return $this->apiClientHandler('userprofile/refresh', array('access_token' => $access_token, 'fields' => $fields));
- }
- /**
- * The Refresh Access Token API is used to refresh the provider access token after authentication.
- * It will be valid for 60 days on LoginRadius' side but it also depends on the provider side.
- * In order to use the access token in other APIs always refresh the token with this API.
- * Supported Providers : Facebook,Yahoo,Google,Twitter, Linkedin Contact LoginRadius support team to enable this API.
- *
- * @param $access_token
- * @return type
- */
- public function refreshAccessToken($access_token, $fields = '*')
- {
- return $this->apiClientHandler('access_token/refresh', array('access_token' => $access_token, "secret" => Functions::getApiSecret(), 'fields' => $fields));
- }
-
-
- /**
- * Get all active seesions by Access Token
- *
- * @param $access_token
- * @return type
- */
-
- public function getActiveSessionByToken($access_token, $fields = '*')
- {
- return $this->apiClientHandler('access_token/activesession', array('token' => $access_token, "key" => Functions::getApiKey(), "secret" => Functions::getApiSecret(), 'fields' => $fields));
- }
-
-
- /**
- * This API is used to retrieve a tracked post based on the passed in post ID value. This API requires setting permissions in your LoginRadius Dashboard.
- *
- * @param $post_id
- * @return type
- */
- public function trackableStatus($post_id, $fields = '*')
- {
- return $this->apiClientHandler('status/trackable', array('postid' => $post_id, "secret" => Functions::getApiSecret(), 'fields' => $fields));
- }
-
- /**
- * The Message API is used to post messages to the user’s contacts. Supported Providers: LinkedIn, Twitter.
- *
- * @param $access_token
- * @param $to
- * @param $subject
- * @param $message
- * @return type
- */
- public function postMessage($access_token, $to, $subject, $message, $fields = '*')
- {
- return $this->apiClientHandler('message/js', array('access_token' => $access_token, "to" => $to, 'subject' => $subject, 'message' => $message, 'fields' => $fields));
- }
- /**
- * The Status API is used to update the status on the user’s wall. It is commonly referred to as Permission based sharing or Push notifications.
- * This API requires setting permissions in your LoginRadius Dashboard.
- *
- * @param $access_token
- * @param $title
- * @param $url
- * @param $imageurl
- * @param $status
- * @param $caption
- * @param $description
- * @return type
- */
- public function postStatus($access_token, $status, $title = '', $url = '', $imageurl = '', $caption = '', $description = '', $fields = '*')
- {
- return $this->apiClientHandler('status/js', array('access_token' => $access_token, "title" => $title, 'url' => $url, 'imageurl' => $imageurl, 'status' => $status, 'caption' => $caption, 'description' => $description, 'fields' => $fields));
- }
-
- /**
- * The Shorten URL API is used to convert your URLs to the LoginRadius short URL - ish.re
- *
- * @param $url
- * @return type
- */
- public function shortenUrl($url, $fields = '*')
- {
- return Functions::apiClient('/sharing/v1/shorturl/', array('key' => Functions::getApiKey(), "url" => $url, 'fields' => $fields));
- }
-
- /**
- * The Trackable status API works very similar to the Status API but it returns a Post id that you can use to track the stats(shares, likes, comments) for a specific share/post/status update.
- * This API requires setting permissions in your LoginRadius Dashboard.
- *
- * @param $access_token
- * @param $title
- * @param $url
- * @param $imageurl
- * @param $status
- * @param $caption
- * @param $description
- * @return type
- */
- public function trackableStatusStats($access_token, $status, $title = '', $url = '', $imageurl = '', $caption = '', $description = '', $fields = '*')
- {
- return $this->apiClientHandler('status/trackable/js', array('access_token' => $access_token, "title" => $title, 'url' => $url, 'imageurl' => $imageurl, 'status' => $status, 'caption' => $caption, 'description' => $description, 'fields' => $fields));
- }
- /**
- * The Trackable Status API is used to update the status on the user’s wall and return an Post ID value. It is commonly referred to as Permission based sharing or Push notifications.
- *
- * @param $access_token
- * @param $title
- * @param $url
- * @param $imageurl
- * @param $status
- * @param $caption
- * @param $description
- * @return type
- */
- public function trackableStatusPosting($access_token, $status, $title = '', $url = '', $imageurl = '', $caption = '', $description = '', $fields = '*')
- {
- $data = array(
- 'title' => $title,
- 'url' => $url,
- 'imageurl' => $imageurl,
- 'status' => $status,
- 'caption' => $caption,
- 'description' => $description
- );
- return $this->apiClientHandler("status/trackable", array('access_token' => $access_token, 'fields' => $fields), array('method' => 'POST', 'post_data' => $data, 'content_type' => 'json'));
-
- }
-
-
- /**
- * Social API handler
- *
- * @param type $path
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $query_array = array(), $options = array())
- {
- return Functions::apiClient("/api/v2/" . $path, $query_array, $options);
- }
-
-}
diff --git a/src/LoginRadiusSDK/CustomerRegistration/Social/SocialLoginAPI.php b/src/LoginRadiusSDK/CustomerRegistration/Social/SocialLoginAPI.php
deleted file mode 100755
index e8db44b..0000000
--- a/src/LoginRadiusSDK/CustomerRegistration/Social/SocialLoginAPI.php
+++ /dev/null
@@ -1,373 +0,0 @@
-apiClientHandler('access_token', false, array("token" => $request_token, "secret" => Functions::getApiSecret(), 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch social profile data from the user's social account after authentication. The social profile will be retrieved via oAuth and OpenID protocols. The data is normalized into LoginRadius' standard data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User profile data.
- */
- public function getUserProfiledata($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler('userprofile', $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch custom fileds of raas. The social profile will be retrieved via oAuth and OpenID protocols. The data is normalized into LoginRadius' standard data format.
- *
- * @param string $apiKey LoginRadius api key
- * @param string $secret LoginRadius secret key
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object custom fields of raas.
- */
- public function getUserCustomFields($apikey, $secret, $raw = false, $fields = '*') {
- return $this->apiClientHandler('userprofile/fields', $raw, array('apikey' => $apikey, 'apisecret' => $secret, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get the Albums data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's albums data.
- */
- public function getPhotoAlbums($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler('album', $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch photo data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param string $album_id ID of the album to fetch photos from
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's photo data.
- */
- public function getPhotos($access_token, $album_id, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("photo", $raw, array("access_token" => $access_token, "albumid" => $album_id, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch check-ins data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's check-ins.
- */
- public function getCheckins($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler('checkin', $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch user's audio files data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's audio files data.
- */
- public function getAudio($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("audio", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch user's contacts/friends/connections data from the user's social account. The data will normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param integer $next_cursor Offset to start fetching contacts from
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's contacts/friends/followers.
- */
- public function getContacts($access_token, $next_cursor = '', $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("contact", $raw, array("access_token" => $access_token, "nextcursor" => $next_cursor, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get mention data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's twitter mentions.
- */
- public function getMentions($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("mention", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To fetch information of the people, user is following on Twitter.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object Information of the people, user is following.
- */
- public function getFollowing($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("following", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get the event data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's event data.
- */
- public function getEvents($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("event", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get posted messages from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object User's posted messages.
- *
- */
- public function getPosts($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("post", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get the followed company's data in the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object Companies followed by user.
- */
- public function getFollowedCompanies($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("company", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get group data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object Group data.
- */
- public function getGroups($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("group", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get the status messages from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object Status messages.
- */
- public function getStatus($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("status", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get videos data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object Videos data.
- */
- public function getVideos($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("video", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get likes data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object likes data.
- */
- public function getLikes($access_token, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("like", $raw, array("access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To get the page data from the user's social account. The data will be normalized into LoginRadius' data format.
- *
- * @param string $access_token LoginRadius access token
- * @param string $page_name Page name
- * @param boolean $raw If true, raw data is fetched
- *
- * @return object Page data.
- */
- public function getPages($access_token, $page_name, $raw = false, $fields = '*')
- {
- return $this->apiClientHandler("page", $raw, array("access_token" => $access_token, "pagename" => $page_name, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - To update the status on the user's wall.
- *
- * @param string $access_token LoginRadius access token
- * @param string $status The status message text (Required).
- * @param string $title Title for status message (Optional).
- * @param string $url A web link of the status message (Optional).
- * @param string $imageurl An image URL of the status message (Optional).
- * @param string $caption Caption of the status message (Optional).
- * @param string $description Description of the status message (Optional).
- *
- * @return boolean Returns true if successful, false otherwise.
- *
- */
- public function postStatus($access_token, $status, $title = '', $url = '', $imageurl = '', $caption = '', $description = '', $fields = '*')
- {
- $data = array(
- 'access_token' => $access_token,
- 'title' => $title,
- 'url' => $url,
- 'imageurl' => $imageurl,
- 'status' => $status,
- 'caption' => $caption,
- 'description' => $description,
- 'fields' => $fields
- );
- return $this->apiClientHandler("status", false, $data, array('method' => 'POST', 'post_data' => true));
- }
-
- /**
- * LoginRadius function - Post messages to the user's contacts. After using the Contact API, you can send messages to the retrieved contacts.
- *
- * @param string $access_token LoginRadius access token
- * @param string $to Social ID of the receiver
- * @param string $subject Subject of the message
- * @param string $message Message
- *
- * @return bool True on success, false otherwise
- */
- public function sendMessage($access_token, $to, $subject, $message, $fields = '*')
- {
- $data = array(
- 'access_token' => $access_token,
- 'to' => $to,
- 'subject' => $subject,
- 'message' => $message,
- 'fields' => $fields
- );
- return $this->apiClientHandler("message", false, $data, array('method' => 'POST', 'post_data' => true));
- }
-
- /**
- * LoginRadius function - This API is used to validate access_token, check it is valid, expired or active.
- *
- * @param string $access_token LoginRadius access token
- *
- * @return object User profile data.
- */
- public function tokenValidate($access_token, $fields = '*')
- {
- return $this->apiClientHandler('access_token/Validate', false, array("key" => Functions::getApiKey(),"secret" => Functions::getApiSecret(),"access_token" => $access_token, 'fields' => $fields));
- }
-
- /**
- * LoginRadius function - This API is used to invalidate access token, means expiring token. After this API call passed access_token no longer be active and will not accepted by LoginRadius APIs.
- *
- * @param string $access_token LoginRadius access token
- *
- * @return object User profile data.
- */
- public function tokenInvalidate($access_token, $fields = '*')
- {
- return $this->apiClientHandler('access_token/invalidate', false, array("key" => Functions::getApiKey(),"secret" => Functions::getApiSecret(),"access_token" => $access_token, 'fields' => $fields));
- }
-
-
- /**
- * LoginRadius function - This API is used to validate API key and Secret.
- *
- * @return object.
- */
- public function validateKeyandSecret($fields = '*')
- {
- return $this->apiClientHandler('app/validate', false, array("apikey" => rawurlencode(Functions::getApiKey()),"apisecret" => rawurlencode(Functions::getApiSecret()), 'fields' => $fields));
- }
-
- /**
- * Social API heandler
- *
- * @param type $path
- * @param type $raw_data
- * @param type $query_array
- * @param type $options
- * @return type
- */
- private function apiClientHandler($path, $raw_data, $query_array = array(), $options = array())
- {
- $raw = $raw_data ? '/raw' : '';
- return Functions::apiClient("/api/v2/" . $path . $raw, $query_array, $options);
- }
-
-}
diff --git a/src/LoginRadiusSDK/LoginRadiusException.php b/src/LoginRadiusSDK/LoginRadiusException.php
deleted file mode 100755
index a9ba791..0000000
--- a/src/LoginRadiusSDK/LoginRadiusException.php
+++ /dev/null
@@ -1,44 +0,0 @@
-error_response = $error_response;
- }
-
- /**
- * Get error Response from API.
- *
- * @return array
- */
- public function getErrorResponse()
- {
- return $this->error_response;
- }
-}
\ No newline at end of file
diff --git a/src/LoginRadiusSDK/Utility/Functions.php b/src/LoginRadiusSDK/Utility/Functions.php
deleted file mode 100755
index 92aad3b..0000000
--- a/src/LoginRadiusSDK/Utility/Functions.php
+++ /dev/null
@@ -1,219 +0,0 @@
-request($path, $query_array, $merge_options);
- return $output_format && (is_object(json_decode($response)) || is_array(json_decode($response))) ? json_decode($response) : $response;
- }
-
- /**
- * Manage LoginRadius Authentication
- *
- * @param type $array
- * @return type
- */
- public static function authentication($array = array(), $secure = 'key', $request_url = '') {
- $result = array();
- if ($secure == 'key') {
- $result = array('apikey' => Functions::getApiKey());
- } else if ($secure == 'secret') {
- $result = array('X-LoginRadius-ApiSecret' => Functions::getApiSecret());
- } else if ($secure == 'hashsecret') {
- $expiry_time = gmdate("Y-m-d H:i:s", strtotime('1 hour'));
- $encoded_url = self::urlReplacement(urlencode(urldecode($request_url)));
-
- if (isset($array['method']) && (($array['method'] == 'POST') || ($array['method'] == 'PUT') || ($array['method'] == 'DELETE')) && $array['post_data'] !== true) {
- $post_data = $array['post_data'];
- if ((is_array($array['post_data']) || is_object($array['post_data']))) {
- $post_data = json_encode($array['post_data']);
- }
- $string_to_hash = $expiry_time . ':' . strtolower($encoded_url) . ':' . $post_data;
- } else {
- $string_to_hash = $expiry_time . ':' . strtolower($encoded_url);
- }
- $sha_hash = hash_hmac('sha256', $string_to_hash, Functions::getApiSecret(), true);
- $result = array('X-Request-Expires' => $expiry_time, 'digest' => "SHA-256=" . base64_encode($sha_hash));
- }
-
- return (is_array($array) && sizeof($array) > 0) ? array_merge($result, $array) : $result;
- }
-
-
- /**
- * URL replacement
- *
- * @param type $decoded_url
- * @return type
- */
- public static function urlReplacement($decoded_url) {
- $replacementArray = array('%2A' => '*','%28' => '(','%29' => ')');
- return str_replace(array_keys($replacementArray), array_values($replacementArray), $decoded_url);
- }
-
- /**
- * Build Query string
- *
- * @param type $data
- * @return type
- */
- public static function queryBuild($data = array()) {
- if (is_array($data) && sizeof($data) > 0) {
- return http_build_query($data);
- }
- return '';
- }
-}
diff --git a/src/Model/Behavior/empty b/src/Model/Behavior/empty
new file mode 100644
index 0000000..e69de29
diff --git a/src/Model/Entity/empty b/src/Model/Entity/empty
new file mode 100644
index 0000000..e69de29
diff --git a/src/Model/Table/empty b/src/Model/Table/empty
new file mode 100644
index 0000000..e69de29
diff --git a/src/Shell/ConsoleShell.php b/src/Shell/ConsoleShell.php
new file mode 100644
index 0000000..f7bfe8e
--- /dev/null
+++ b/src/Shell/ConsoleShell.php
@@ -0,0 +1,81 @@
+err('Unable to load Psy\Shell. ');
+ $this->err('');
+ $this->err('Make sure you have installed psysh as a dependency,');
+ $this->err('and that Psy\Shell is registered in your autoloader.');
+ $this->err('');
+ $this->err('If you are using composer run');
+ $this->err('');
+ $this->err('$ php composer.phar require --dev psy/psysh ');
+ $this->err('');
+
+ return self::CODE_ERROR;
+ }
+
+ $this->out("You can exit with `CTRL-C` or `exit` ");
+ $this->out('');
+
+ Log::drop('debug');
+ Log::drop('error');
+ $this->_io->setLoggers(false);
+ restore_error_handler();
+ restore_exception_handler();
+
+ $psy = new PsyShell();
+ $psy->run();
+ }
+
+ /**
+ * Display help for this console.
+ *
+ * @return \Cake\Console\ConsoleOptionParser
+ */
+ public function getOptionParser()
+ {
+ $parser = new ConsoleOptionParser('console');
+ $parser->setDescription(
+ 'This shell provides a REPL that you can use to interact with ' .
+ 'your application in a command line designed to run PHP code. ' .
+ 'You can use it to run adhoc queries with your models, or ' .
+ 'explore the features of CakePHP and your application.' .
+ "\n\n" .
+ 'You will need to have psysh installed for this Shell to work.'
+ );
+
+ return $parser;
+ }
+}
diff --git a/src/Template/Cell/empty b/src/Template/Cell/empty
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/Template/Cell/empty
@@ -0,0 +1 @@
+
diff --git a/src/Template/Element/Flash/default.ctp b/src/Template/Element/Flash/default.ctp
new file mode 100644
index 0000000..736b27d
--- /dev/null
+++ b/src/Template/Element/Flash/default.ctp
@@ -0,0 +1,10 @@
+
+= $message ?>
diff --git a/src/Template/Element/Flash/error.ctp b/src/Template/Element/Flash/error.ctp
new file mode 100644
index 0000000..e7c4af1
--- /dev/null
+++ b/src/Template/Element/Flash/error.ctp
@@ -0,0 +1,6 @@
+
+= $message ?>
diff --git a/src/Template/Element/Flash/success.ctp b/src/Template/Element/Flash/success.ctp
new file mode 100644
index 0000000..becd5a1
--- /dev/null
+++ b/src/Template/Element/Flash/success.ctp
@@ -0,0 +1,6 @@
+
+= $message ?>
diff --git a/src/Template/Email/html/default.ctp b/src/Template/Email/html/default.ctp
new file mode 100644
index 0000000..ac3daa7
--- /dev/null
+++ b/src/Template/Email/html/default.ctp
@@ -0,0 +1,20 @@
+ ' . $line . "
\n";
+endforeach;
diff --git a/src/Template/Email/text/default.ctp b/src/Template/Email/text/default.ctp
new file mode 100644
index 0000000..862cd9f
--- /dev/null
+++ b/src/Template/Email/text/default.ctp
@@ -0,0 +1,16 @@
+layout = 'error';
+
+if (Configure::read('debug')) :
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error400.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+= $this->element('auto_table_warning') ?>
+end();
+endif;
+?>
+= h($message) ?>
+
+ = __d('cake', 'Error') ?>:
+ = __d('cake', 'The requested address {0} was not found on this server.', "'{$url}' ") ?>
+
diff --git a/src/Template/Error/error500.ctp b/src/Template/Error/error500.ctp
new file mode 100644
index 0000000..3328cc5
--- /dev/null
+++ b/src/Template/Error/error500.ctp
@@ -0,0 +1,43 @@
+layout = 'error';
+
+if (Configure::read('debug')) :
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error500.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+
+ Error in:
+ = sprintf('%s, line %s', str_replace(ROOT, 'ROOT', $error->getFile()), $error->getLine()) ?>
+
+element('auto_table_warning');
+
+ if (extension_loaded('xdebug')) :
+ xdebug_print_function_stack();
+ endif;
+
+ $this->end();
+endif;
+?>
+= __d('cake', 'An Internal Error Has Occurred') ?>
+
+ = __d('cake', 'Error') ?>:
+ = h($message) ?>
+
diff --git a/src/Template/Home/change_password_view.ctp b/src/Template/Home/change_password_view.ctp
new file mode 100644
index 0000000..5a73ad7
--- /dev/null
+++ b/src/Template/Home/change_password_view.ctp
@@ -0,0 +1,13 @@
+
+
+
+
+
Change Password
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/Home/forgot_password_view.ctp b/src/Template/Home/forgot_password_view.ctp
new file mode 100644
index 0000000..3b27aa5
--- /dev/null
+++ b/src/Template/Home/forgot_password_view.ctp
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/src/Template/Home/login_screen.ctp b/src/Template/Home/login_screen.ctp
new file mode 100644
index 0000000..a066c4c
--- /dev/null
+++ b/src/Template/Home/login_screen.ctp
@@ -0,0 +1,207 @@
+
+
+
+
diff --git a/src/Template/Home/minimal.ctp b/src/Template/Home/minimal.ctp
new file mode 100644
index 0000000..0746a6f
--- /dev/null
+++ b/src/Template/Home/minimal.ctp
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
Login
+
+
+
+
+
+
Next
+
+
+
+
+
+
+
Email me a link to sign in
+
+
+
+
+
Social Login
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Template/Home/registration_view.ctp b/src/Template/Home/registration_view.ctp
new file mode 100644
index 0000000..dacd6b7
--- /dev/null
+++ b/src/Template/Home/registration_view.ctp
@@ -0,0 +1,15 @@
+
+
diff --git a/src/Template/Layout/Email/html/default.ctp b/src/Template/Layout/Email/html/default.ctp
new file mode 100644
index 0000000..3ff87ff
--- /dev/null
+++ b/src/Template/Layout/Email/html/default.ctp
@@ -0,0 +1,24 @@
+
+
+
+
+ = $this->fetch('title') ?>
+
+
+ = $this->fetch('content') ?>
+
+
diff --git a/src/Template/Layout/Email/text/default.ctp b/src/Template/Layout/Email/text/default.ctp
new file mode 100644
index 0000000..29b439c
--- /dev/null
+++ b/src/Template/Layout/Email/text/default.ctp
@@ -0,0 +1,16 @@
+fetch('content');
diff --git a/src/Template/Layout/ajax.ctp b/src/Template/Layout/ajax.ctp
new file mode 100644
index 0000000..29b439c
--- /dev/null
+++ b/src/Template/Layout/ajax.ctp
@@ -0,0 +1,16 @@
+fetch('content');
diff --git a/src/Template/Layout/default.ctp b/src/Template/Layout/default.ctp
new file mode 100644
index 0000000..caf014e
--- /dev/null
+++ b/src/Template/Layout/default.ctp
@@ -0,0 +1,57 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>:
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('style.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
diff --git a/src/Template/Layout/error.ctp b/src/Template/Layout/error.ctp
new file mode 100644
index 0000000..7367c1b
--- /dev/null
+++ b/src/Template/Layout/error.ctp
@@ -0,0 +1,47 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('style.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
+
diff --git a/src/Template/Layout/minimallayout.ctp b/src/Template/Layout/minimallayout.ctp
new file mode 100644
index 0000000..5e33f56
--- /dev/null
+++ b/src/Template/Layout/minimallayout.ctp
@@ -0,0 +1,56 @@
+
+
+ Login
+
+
+
+ = $this->Html->css('stylelr.css') ?>
+ = $this->Html->script('jquery.min.js') ?>
+ = $this->Html->script('options.js') ?>
+ = $this->Html->script('index.js') ?>
+ = $this->Html->script('sociallogin.js') ?>
+ = $this->Html->script('emailverification.js') ?>
+ = $this->Html->script('LoginRadiusLoginScreen.1.0.0.js') ?>
+
+
+
+
+
+
+
+
+
+ = $this->fetch('content') ?>
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/Layout/profilelayout.ctp b/src/Template/Layout/profilelayout.ctp
new file mode 100644
index 0000000..3f20338
--- /dev/null
+++ b/src/Template/Layout/profilelayout.ctp
@@ -0,0 +1,45 @@
+
+
+
+
+
+ profile
+
+
+ = $this->Html->css('stylelr.css') ?>
+
+ = $this->Html->script('jquery.min.js') ?>
+ = $this->Html->script('logout.js') ?>
+
+ = $this->Html->script('options.js') ?>
+ = $this->Html->script('profile.js') ?>
+ = $this->Html->script('account.js') ?>
+ = $this->Html->script('accountlinking.js') ?>
+
+
+
+
+
+ = $this->fetch('content') ?>
+
+
+
\ No newline at end of file
diff --git a/src/Template/Layout/rss/default.ctp b/src/Template/Layout/rss/default.ctp
new file mode 100644
index 0000000..8269be2
--- /dev/null
+++ b/src/Template/Layout/rss/default.ctp
@@ -0,0 +1,11 @@
+fetch('title');
+endif;
+
+echo $this->Rss->document(
+ $this->Rss->channel([], $channel, $this->fetch('content'))
+);
diff --git a/src/Template/Pages/home.ctp b/src/Template/Pages/home.ctp
new file mode 100644
index 0000000..37f2a50
--- /dev/null
+++ b/src/Template/Pages/home.ctp
@@ -0,0 +1,276 @@
+layout = false;
+
+if (!Configure::read('debug')) :
+ throw new NotFoundException(
+ 'Please replace src/Template/Pages/home.ctp with your own version or re-enable debug mode.'
+ );
+endif;
+
+$cakeDescription = 'CakePHP: the rapid development PHP framework';
+?>
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>
+
+
+ = $this->Html->meta('icon') ?>
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('style.css') ?>
+ = $this->Html->css('home.css') ?>
+
+
+
+
+
+
+
+
+
+
Please be aware that this page will not be shown if you turn off debug mode unless you replace src/Template/Pages/home.ctp with your own version.
+
+
+
+
+
+
+
+
+
Environment
+
+ =')) : ?>
+ Your version of PHP is 5.6.0 or higher (detected = PHP_VERSION ?>).
+
+ Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected = PHP_VERSION ?>).
+
+
+
+ Your version of PHP has the mbstring extension loaded.
+
+ Your version of PHP does NOT have the mbstring extension loaded.
+
+
+
+ Your version of PHP has the openssl extension loaded.
+
+ Your version of PHP has the mcrypt extension loaded.
+
+ Your version of PHP does NOT have the openssl or mcrypt extension loaded.
+
+
+
+ Your version of PHP has the intl extension loaded.
+
+ Your version of PHP does NOT have the intl extension loaded.
+
+
+
+
+
Filesystem
+
+
+ Your tmp directory is writable.
+
+ Your tmp directory is NOT writable.
+
+
+
+ Your logs directory is writable.
+
+ Your logs directory is NOT writable.
+
+
+
+
+ The = $settings['className'] ?>Engine is being used for core caching. To change the config edit config/app.php
+
+ Your cache is NOT working. Please check the settings in config/app.php
+
+
+
+
+
+
+
+
+
Database
+ connect();
+ } catch (Exception $connectionError) {
+ $connected = false;
+ $errorMsg = $connectionError->getMessage();
+ if (method_exists($connectionError, 'getAttributes')) :
+ $attributes = $connectionError->getAttributes();
+ if (isset($errorMsg['message'])) :
+ $errorMsg .= '
' . $attributes['message'];
+ endif;
+ endif;
+ }
+ ?>
+
+
+ CakePHP is able to connect to the database.
+
+ CakePHP is NOT able to connect to the database. = $errorMsg ?>
+
+
+
+
+
DebugKit
+
+
+ DebugKit is loaded.
+
+ DebugKit is NOT loaded. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
+
+
+
+
+
+
+
+
+
Editing this Page
+
+ To change the content of this page, edit: src/Template/Pages/home.ctp.
+ You can also add some CSS styles for your pages at: webroot/css/.
+
+
+
+
+
+
+
+
More about Cake
+
+ CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Front Controller and MVC.
+ Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility.
+
+
+
+
+
+
+
+
P
+
Help and Bug Reports
+
+
+
+
r
+
Docs and Downloads
+
+
+
+
s
+
Training and Certification
+
+
+
+
+
+
diff --git a/src/Template/profile/account_linking_view.ctp b/src/Template/profile/account_linking_view.ctp
new file mode 100644
index 0000000..9e3d958
--- /dev/null
+++ b/src/Template/profile/account_linking_view.ctp
@@ -0,0 +1,27 @@
+
\ No newline at end of file
diff --git a/src/Template/profile/account_view.ctp b/src/Template/profile/account_view.ctp
new file mode 100644
index 0000000..034f038
--- /dev/null
+++ b/src/Template/profile/account_view.ctp
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/profile/change_password_view.ctp b/src/Template/profile/change_password_view.ctp
new file mode 100644
index 0000000..498cf38
--- /dev/null
+++ b/src/Template/profile/change_password_view.ctp
@@ -0,0 +1,13 @@
+
+
+
+
+
Change Password
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/profile/custom_object_view.ctp b/src/Template/profile/custom_object_view.ctp
new file mode 100644
index 0000000..7aa6f95
--- /dev/null
+++ b/src/Template/profile/custom_object_view.ctp
@@ -0,0 +1,46 @@
+
+
+
+
+
Create
+
+
+
+
+
+
Update
+
+
+
+
+
+
Delete
+
+
+
+
+
Read
+ Object Name:
+
Fetch Data
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/profile/profile_view.ctp b/src/Template/profile/profile_view.ctp
new file mode 100644
index 0000000..6246bbe
--- /dev/null
+++ b/src/Template/profile/profile_view.ctp
@@ -0,0 +1,25 @@
+
+
+
+
+
+ =$this->Html->image('user-blank.png')?>
+
+
Hello,
+
+
+
+
+
+ Uid:
+
+
+
+ Last Login:
+
+
+
+
+
+
+
diff --git a/src/Template/profile/reset_multifactor_view.ctp b/src/Template/profile/reset_multifactor_view.ctp
new file mode 100644
index 0000000..4c5bece
--- /dev/null
+++ b/src/Template/profile/reset_multifactor_view.ctp
@@ -0,0 +1,10 @@
+
+
+
+ Reset Google Authenticator configurations
+ Reset
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/profile/role_view.ctp b/src/Template/profile/role_view.ctp
new file mode 100644
index 0000000..994f8cd
--- /dev/null
+++ b/src/Template/profile/role_view.ctp
@@ -0,0 +1,35 @@
+
+
+
+
+
All Roles
+
+
+
+
Create Role
+ Role:
+
Create
+
+
+
+
+
Delete Role
+ Role:
+
Delete
+
+
+
+
+
Current User Role(s)
+
+
+
+
Assign Role to User
+ Role:
+
Assign
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Template/profile/set_password_view.ctp b/src/Template/profile/set_password_view.ctp
new file mode 100644
index 0000000..ab30059
--- /dev/null
+++ b/src/Template/profile/set_password_view.ctp
@@ -0,0 +1,10 @@
+
+
+
+ Password:
+ Set Password
+
+
+
+
+
\ No newline at end of file
diff --git a/src/View/AjaxView.php b/src/View/AjaxView.php
new file mode 100644
index 0000000..3cb7869
--- /dev/null
+++ b/src/View/AjaxView.php
@@ -0,0 +1,49 @@
+response = $this->response->withType('ajax');
+ }
+}
diff --git a/src/View/AppView.php b/src/View/AppView.php
new file mode 100644
index 0000000..7b92ebf
--- /dev/null
+++ b/src/View/AppView.php
@@ -0,0 +1,40 @@
+loadHelper('Html');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ }
+}
diff --git a/src/View/Cell/empty b/src/View/Cell/empty
new file mode 100644
index 0000000..e69de29
diff --git a/src/View/Helper/empty b/src/View/Helper/empty
new file mode 100644
index 0000000..e69de29
diff --git a/tests/AccountTest.php b/tests/AccountTest.php
deleted file mode 100644
index 5ffb300..0000000
--- a/tests/AccountTest.php
+++ /dev/null
@@ -1,142 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function setUp() {
- $data = '{
- "Email": [
- {
- "Type": "Primary",
- "Value": "phpunittester96@mailinator.com"
- },
- {
- "Type": "Secondary",
- "Value": "phpunittester96secondary@mailinator.com"
- }
- ],
- "UserName": "put96",
- "PhoneId": "12016768877",
- "Password": "password"
- }';
- $result = self::$accountApi->create($data);
- $this->testerUid = $result->Uid;
- $this->testerEmail = $result->Email[0]->Value;
- $this->testerEmailSecondary = $result->Email[1]->Value;
- $this->testerUsername = $result->UserName;
- $this->testerPhoneId = $result->PhoneId;
- }
-
- public function tearDown() {
- self::$accountApi->delete($this->testerUid);
- }
-
- public function testAccountCreate() {
- $this->assertNotNull($this->testerUid);
- }
-
- public function testGetEmailVerificationToken() {
- $result = self::$accountApi->getEmailVerificationToken($this->testerEmail);
- $this->assertObjectHasAttribute("VerificationToken", $result);
- }
-
- public function testGetForgotPasswordToken() {
- $result = self::$accountApi->getForgotPasswordToken($this->testerEmail);
- $this->assertObjectHasAttribute("ForgotToken", $result);
- }
-
- public function testGetIdentitiesByEmail() {
- $result = self::$accountApi->getIdentitiesByEmail($this->testerEmail);
- $this->assertObjectHasAttribute("Data", $result);
- }
-
- public function testAccountImpersonation() {
- $result = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $this->assertObjectHasAttribute("access_token", $result);
- }
-
- public function testAccountGetPassword() {
- $result = self::$accountApi->getHashPassword($this->testerUid);
- $this->assertObjectHasAttribute("PasswordHash", $result);
- }
-
- public function testAccountProfileByEmail() {
- $result = self::$accountApi->getProfileByEmail($this->testerEmail);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAccountProfileByUsername() {
- $result = self::$accountApi->getProfileByUsername($this->testerUsername);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAccountProfileByPhoneId() {
- $result = self::$accountApi->getProfileByPhone($this->testerPhoneId);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAccountProfileByUid() {
- $result = self::$accountApi->getProfileByUid($this->testerUid);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAccountSetPassword() {
- $result = self::$accountApi->setPassword($this->testerUid, "password1");
- $this->assertObjectHasAttribute("PasswordHash", $result);
- }
-
- public function testAccountUpdate() {
- $data = '{
- "Gender": "M"
- }';
-
- $result = self::$accountApi->update($this->testerUid, $data);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAccountUpdateSecurityQuestionConfiguration() {
- if (SECURITY_QUESTION_ID === "") {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- } else {
- $data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "Answer"
- }
- }';
- $result = self::$accountApi->updateSecurityQuestionByUid($this->testerUid, $data);
- $this->assertObjectHasAttribute("Uid", $result);
- }
- }
-
- public function testAccountInvalidateVerificationEmail() {
- $data = '{
- "EmailVerified": true
- }';
- self::$accountApi->update($this->testerUid, $data);
- $result = self::$accountApi->invalidateEmail($this->testerUid, true);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAccountEmailDelete() {
- $result = self::$accountApi->removeEmailByUidAndEmail($this->testerUid, $this->testerEmailSecondary);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAccountDelete() {
- print_r("testAccountDelete passes if tests are being taken down properly.");
- $this->assertTrue(true);
- }
-}
diff --git a/tests/AuthenticationTest.php b/tests/AuthenticationTest.php
deleted file mode 100644
index 9a85569..0000000
--- a/tests/AuthenticationTest.php
+++ /dev/null
@@ -1,383 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$userApi = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function setUp() {
- $data = '{
- "Email": [
- {
- "Type": "Primary",
- "Value": "phpunittester96@mailinator.com"
- },
- {
- "Type": "Secondary",
- "Value": "phpunittester96secondary2@mailinator.com"
- }
- ],
- "UserName": "put96",
- "PhoneId": "12016768877",
- "Password": "password",
- "EmailVerified": true
- }';
- $resultCreate = self::$accountApi->create($data);
- $this->testerUid = $resultCreate->Uid;
- $this->testerEmail = $resultCreate->Email[0]->Value;
- $this->testerUsername = $resultCreate->UserName;
- $this->testerPhoneId = $resultCreate->PhoneId;
-
- $loginData = '{
- "email": "phpunittester96@mailinator.com",
- "password": "password"
- }';
- $resultLogin = self::$userApi->authLoginByEmail($loginData);
- $this->testerAccessToken = $resultLogin->access_token;
- }
-
- public function tearDown() {
- self::$accountApi->delete($this->testerUid);
- }
-
- public function testAuthAddEmail() {
- $result = self::$userApi->addEmail($this->testerAccessToken, "phpunittester96secondary@mailinator.com", "Secondary");
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthForgotPassword() {
- $result = self::$userApi->forgotPassword($this->testerEmail, "www.example.com");
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthUserRegistrationByEmail() {
- $registrationData = '{
- "Email": [
- {
- "Type": "Primary",
- "Value": "phpunittester95@mailinator.com"
- }
- ],
- "Password": "password"
- }';
- $result = self::$userApi->registerByEmail($registrationData);
- $this->assertObjectHasAttribute("IsPosted", $result);
-
- $uid = self::$accountApi->getProfileByEmail("phpunittester95@mailinator.com")->Uid;
- self::$accountApi->delete($uid);
- }
-
- public function testAuthLoginByEmail() {
- $this->assertNotNull($this->testerAccessToken);
- }
-
- public function testAuthLoginByUsername() {
- $data = '{
- "UserName": "' . $this->testerUsername . '",
- "Password": "password"
- }';
- $result = self::$userApi->authLoginByUsername($data);
- $this->assertObjectHasAttribute("access_token", $result);
- }
-
- public function testAuthCheckEmailAvailability() {
- $result = self::$userApi->checkAvailablityOfEmail("phpunittester96@mailinator.com");
- $this->assertObjectHasAttribute("IsExist", $result);
- }
-
- public function testAuthCheckUsernameAvailability() {
- $result = self::$userApi->checkUsername("put96");
- $this->assertObjectHasAttribute("IsExist", $result);
- }
-
- public function testAuthReadProfileByToken() {
- $result = self::$userApi->getProfile($this->testerAccessToken);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAuthPrivacyPolicyAccept() {
- try {
- $result = self::$userApi->privacyPolicyAccept($this->testerAccessToken);
- $this->assertObjectHasAttribute("Uid", $result);
- } catch (Exception $e) {
- $this->assertEquals($e->getMessage(), "Privacy policy is not available");
- }
- }
-
- public function testAuthSendWelcomeEmail() {
- $result = self::$userApi->sendWelcomeEmail($this->testerAccessToken);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthSocialIdentity() {
- $result = self::$userApi->getSocialProfile($this->testerAccessToken);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testAuthValidateAccessToken() {
- $result = self::$userApi->checkTokenValidity($this->testerAccessToken);
- $this->assertObjectHasAttribute("access_token", $result);
- }
-
- public function testAuthVerifyEmail() {
- $updateData = '{
- "EmailVerified": false
- }';
- self::$accountApi->update($this->testerUid, $updateData);
- $vtoken = self::$accountApi->getEmailVerificationToken($this->testerEmail)->VerificationToken;
- $result = self::$userApi->verifyEmail($vtoken);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthVerifyEmailByOtp() {
- $data = '{
- "otp": "99999",
- "email": "' . $this->testerEmail . '"
- }';
- try {
- $result = self::$userApi->verifyEmailByOtp($data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- } catch (Exception $e) {
- $this->assertEquals($e->getMessage(), "Invalid email verification OTP");
- }
- }
-
- public function testAuthDeleteAccount() {
- try {
- $result = self::$userApi->deleteAccount("99999999999");
- $this->assertObjectHasAttribute("IsPosted", $result);
- } catch (Exception $e) {
- $this->assertEquals($e->getMessage(), "The LoginRadius DeleteToken is invalid");
- }
- }
-
- public function testAuthAccessTokenInvalidate() {
- $result = self::$userApi->invalidateTokenByAccessToken($this->testerAccessToken);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthSecurityQuestionsByAccessToken() {
- if (SECURITY_QUESTION_ID !== "") {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
- $result = self::$userApi->getSecurityQuestionsByAccessToken($this->testerAccessToken);
- $this->assertObjectHasAttribute("QuestionId", $result[0]);
- } else {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- }
- }
-
- public function testAuthSecurityQuestionsByEmail() {
- if (SECURITY_QUESTION_ID !== "") {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
- $result = self::$userApi->getSecurityQuestionsByEmail($this->testerEmail);
- $this->assertObjectHasAttribute("QuestionId", $result[0]);
- } else {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- }
- }
-
- public function testAuthSecurityQuestionsByUsername() {
- if (SECURITY_QUESTION_ID !== "") {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
- $result = self::$userApi->getSecurityQuestionsByUserName($this->testerUsername);
- $this->assertObjectHasAttribute("QuestionId", $result[0]);
- } else {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- }
- }
-
- public function testAuthSecurityQuestionsByPhone() {
- if (SECURITY_QUESTION_ID !== "") {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
- $result = self::$userApi->getSecurityQuestionsByPhone($this->testerPhoneId);
- $this->assertObjectHasAttribute("QuestionId", $result[0]);
- } else {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- }
- }
-
- public function testAuthChangePassword() {
- $result = self::$userApi->changeAccountPassword($this->testerAccessToken, "password", "passwords");
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthResendEmailVerification() {
- $updateData = '{
- "EmailVerified": false
- }';
- self::$accountApi->update($this->testerUid, $updateData);
- $result = self::$userApi->resendEmailVerification($this->testerEmail);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthResetPasswordByResetToken() {
- $resetToken = self::$accountApi->getForgotPasswordToken($this->testerEmail)->ForgotToken;
- $result = self::$userApi->resetPassword($resetToken, "password1");
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthResetPasswordByOtp() {
- try {
- $result = self::$userApi->resetPasswordByOtp("password1", "99999", $this->testerEmail);
- $this->assertObjectHasAttribute("IsPosted", $result);
- } catch (Exception $e) {
- $this->assertEquals("Verification OTP is invalid", $e->getMessage());
- }
- }
-
- public function testAuthResetPasswordBySecurityAnswerAndEmail() {
- if (SECURITY_QUESTION_ID === "") {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- } else {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
-
- $data = '{
- "securityanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- },
- "email": "' . $this->testerEmail . '",
- "password": "password1"
- }';
- $result = self::$userApi->authResetPasswordBySecurityAnswerAndEmail($data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
- }
-
- public function testAuthResetPasswordBySecurityAnswerAndPhone() {
- if (SECURITY_QUESTION_ID === "") {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- } else {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
-
- $data = '{
- "securityanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- },
- "phone": "' . $this->testerPhoneId . '",
- "password": "password1"
- }';
- $result = self::$userApi->authResetPasswordBySecurityAnswerAndPhone($data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
- }
-
- public function testAuthResetPasswordBySecurityAnswerAndUserName() {
- if (SECURITY_QUESTION_ID === "") {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- } else {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
-
- $data = '{
- "securityanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- },
- "username": "' . $this->testerUsername . '",
- "password": "password1"
- }';
- $result = self::$userApi->authResetPasswordBySecurityAnswerAndUserName($data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
- }
-
- public function testAuthSetOrChangeUserName() {
- $result = self::$userApi->changeUsername($this->testerAccessToken, "putester96");
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthUpdateProfileByToken() {
- $data = '{
- "Gender": "M"
- }';
- $result = self::$userApi->updateProfile($this->testerAccessToken, $data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testAuthUpdateSecurityQuestionByAccessToken() {
- if (SECURITY_QUESTION_ID === "") {
- $this->markTestSkipped("Security Question ID in config.php needs to be defined.");
- } else {
- $sq_data = '{
- "securityquestionanswer": {
- "' . SECURITY_QUESTION_ID . '": "answer"
- }
- }';
- $result = self::$userApi->updateSecurityQuestionByAccessToken($this->testerAccessToken, $sq_data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
- }
-
- public function testAuthDeleteAccountWithEmailConfirmation() {
- $result = self::$userApi->deleteAccountByEmailConfirmation($this->testerAccessToken);
- $this->assertObjectHasAttribute("IsDeleteRequestAccepted", $result);
- }
-
- public function testAuthRemoveEmail() {
- $result = self::$userApi->removeEmail($this->testerAccessToken, $this->testerEmail);
- $this->assertObjectHasAttribute("IsDeleted", $result);
- }
-
- public function testAuthLinkUnlinkSocialIdentities() {
- if (SOCIAL_LOGIN_REQUEST_TOKEN === "") {
- $this->markTestSkipped("Social Login Request Token in config.php needs to be defined.");
- } else {
- $linkResult = self::$userApi->accountLink($this->testerAccessToken, SOCIAL_LOGIN_REQUEST_TOKEN);
- $this->assertObjectHasAttribute("IsPosted", $linkResult);
-
- $testerProfile = self::$accountApi->getProfileByEmail($this->testerEmail);
- $accountProvider = $testerProfile->Identities[0]->Provider;
- $accountProviderId = $testerProfile->Identities[0]->ID;
-
- $unlinkResult = self::$userApi->accountUnlink($this->testerAccessToken, $accountProviderId, $accountProvider);
- $this->assertObjectHasAttribute("IsDeleted", $unlinkResult);
- }
- }
-}
diff --git a/tests/ConfigurationTest.php b/tests/ConfigurationTest.php
deleted file mode 100644
index 4756ef7..0000000
--- a/tests/ConfigurationTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$configApi = new ConfigAPI(API_KEY, API_SECRET, array('output_format' => 'json'));
- }
-
- public function testGetConfigurations() {
- $result = self::$configApi->getConfigurationList();
- $this->assertObjectHasAttribute("AppName", $result);
- }
-
- public function testGetServerTime() {
- $result = self::$configApi->getServerTime();
- $this->assertObjectHasAttribute("ServerName", $result);
- }
-
- public function testGenerateSott() {
- $result = self::$accountApi->generateSOTT();
- $this->assertObjectHasAttribute("Sott", $result);
- }
-}
diff --git a/tests/CustomObjectManagementTest.php b/tests/CustomObjectManagementTest.php
deleted file mode 100644
index 8a21600..0000000
--- a/tests/CustomObjectManagementTest.php
+++ /dev/null
@@ -1,107 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$authCustomObjApi = new AuthCustomObjectAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$customObjApi = new CustomObjectAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
-
- $createResult = self::$accountApi->create($data);
- self::$testerUid = $createResult->Uid;
- self::$testerAccessToken = self::$accountApi->getAccessTokenByUid(self::$testerUid)->access_token;
- }
-
- public static function tearDownAfterClass() {
- self::$accountApi->delete(self::$testerUid);
- }
-
- public function testCustomObjectManagement() {
- if (CUSTOM_OBJECT_NAME === "") {
- $this->markTestSkipped("Custom Object Name in config.php needs to be defined.");
- } else {
- $createData1 = '{
- "testKey1": "testValue1"
- }';
- $createData2 = '{
- "testKey2": "testValue2"
- }';
- $updateData1 = '{
- "testKey12": "testValue12"
- }';
- $updateData2 = '{
- "testKey22": "testValue22"
- }';
-
- // Create Custom Object by UID
- $createByUidResult = self::$customObjApi->insert(self::$testerUid, CUSTOM_OBJECT_NAME, $createData1);
- $this->assertObjectHasAttribute("Id", $createByUidResult);
- $customObjId1 = $createByUidResult->Id;
-
- // Create Custom Object by Token
- $createByTokenResult = self::$authCustomObjApi->createCustomObject(self::$testerAccessToken, CUSTOM_OBJECT_NAME, $createData2);
- $this->assertObjectHasAttribute("Id", $createByTokenResult);
- $customObjId2 = $createByTokenResult->Id;
-
- // Get Custom Object by ObjectRecordId and UID
- $getByUidAndRecordId = self::$customObjApi->getObjectByRecordID(self::$testerUid, CUSTOM_OBJECT_NAME, $customObjId1);
- $this->assertObjectHasAttribute("Id", $getByUidAndRecordId);
-
- // Get Custom Object by ObjectRecordId and Token
- $getByTokenAndRecordId = self::$authCustomObjApi->getCustomObjectSetByID(self::$testerAccessToken, CUSTOM_OBJECT_NAME, $customObjId2);
- $this->assertObjectHasAttribute("Id", $getByTokenAndRecordId);
-
- // Get Custom Object by Token
- $getByTokenResult = self::$authCustomObjApi->getCustomObjectSetsByToken(self::$testerAccessToken, CUSTOM_OBJECT_NAME);
- $this->assertObjectHasAttribute("data", $getByTokenResult);
-
- // Get Custom Object by UID
- $getByUidResult = self::$customObjApi->getObjectByAccountid(self::$testerUid, CUSTOM_OBJECT_NAME);
- $this->assertObjectHasAttribute("data", $getByUidResult);
-
- // Update Custom Object by ObjectRecordId and UID
- $updateByUid = self::$customObjApi->updateObjectByRecordID(self::$testerUid, CUSTOM_OBJECT_NAME, $customObjId1, "replace", $updateData1);
- $this->assertObjectHasAttribute("Id", $updateByUid);
-
- // Update Custom Object by ObjectRecordId and Access Token
- $updateByAccessToken = self::$authCustomObjApi->updateCustomObjectData(self::$testerAccessToken, CUSTOM_OBJECT_NAME, $customObjId2, "replace", $updateData2);
- $this->assertObjectHasAttribute("Id", $updateByAccessToken);
-
- // Delete Custom Object by ObjectRecordId and UID
- $deleteByUidResult = self::$customObjApi->delete(self::$testerUid, CUSTOM_OBJECT_NAME, $customObjId1);
- $this->assertObjectHasAttribute("IsDeleted", $deleteByUidResult);
-
- // Delete Custom Object by ObjectRecordId and Token
- $deleteByTokenResult = self::$authCustomObjApi->deleteCustomObjectSet(self::$testerAccessToken, CUSTOM_OBJECT_NAME, $customObjId2);
- $this->assertObjectHasAttribute("IsDeleted", $deleteByTokenResult);
- }
- }
-}
diff --git a/tests/CustomRegistrationDataTest.php b/tests/CustomRegistrationDataTest.php
deleted file mode 100644
index 93c964b..0000000
--- a/tests/CustomRegistrationDataTest.php
+++ /dev/null
@@ -1,74 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$customRegistrationDataApi = new CustomRegistrationDataAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function testCustomRegistrationData() {
- if (CUSTOM_REGISTRATION_DATA_TYPE === "") {
- $this->markTestSkipped("Custom Registration Data Type needs to be defined in config.php.");
- } else {
- // Add Registration Data
- $registrationData = '{
- "Data": [
- {
- "type": "' . CUSTOM_REGISTRATION_DATA_TYPE . '",
- "key": "example1",
- "value": "value1",
- "parentid": "",
- "code": "examplecode",
- "isactive": true
- }
- ]
- }';
-
- $addDataResult = self::$customRegistrationDataApi->addRegistrationData($registrationData);
- $this->assertObjectHasAttribute("IsPosted", $addDataResult);
-
- // Get Registration Data
- $getDataResult = self::$customRegistrationDataApi->getRegistrationData(CUSTOM_REGISTRATION_DATA_TYPE, "", "0", "50");
- $this->assertNotEmpty($getDataResult);
-
- // Auth Get Registration Data
- $authGetDataResult = self::$userApi->authGetRegistrationDataServer(CUSTOM_REGISTRATION_DATA_TYPE, "", "0", "50");
- $this->assertNotEmpty($authGetDataResult);
-
- $lastRecord = end($getDataResult);
- $rdRecordId = $lastRecord->Id;
- $rdCode = $lastRecord->Code;
-
- // Validate Code
- $validateData = '{
- "recordid": "' . $rdRecordId . '",
- "code": "' . $rdCode . '"
- }';
- $validateResult = self::$userApi->validateRegistrationDataCode($validateData);
- $this->assertObjectHasAttribute("IsValid", $validateResult);
-
- // Update Registration Data
- $updateData = '{
- "IsActive": true,
- "Type": "' . CUSTOM_REGISTRATION_DATA_TYPE . '",
- "Key": "Key",
- "Value": "A value",
- "ParentId": "",
- "Code": "' . $rdCode . '"
- }';
- $updateResult = self::$customRegistrationDataApi->updateRegistrationData($rdRecordId, $updateData);
- $this->assertObjectHasAttribute("IsPosted", $updateResult);
-
- // Delete Registration Data
- $deleteResult = self::$customRegistrationDataApi->deleteRegistrationData($rdRecordId);
- $this->assertObjectHasAttribute("IsDeleted", $deleteResult);
- }
- }
-}
diff --git a/tests/Fixture/empty b/tests/Fixture/empty
new file mode 100644
index 0000000..e69de29
diff --git a/tests/MultiFactorAuthenticationTest.php b/tests/MultiFactorAuthenticationTest.php
deleted file mode 100644
index 9d33ac8..0000000
--- a/tests/MultiFactorAuthenticationTest.php
+++ /dev/null
@@ -1,262 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$userApi = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function setUp() {
- $data = '{
- "Email": [
- {
- "Type": "Primary",
- "Value": "phpunittester96@mailinator.com"
- },
- {
- "Type": "Secondary",
- "Value": "phpunittester96secondary2@mailinator.com"
- }
- ],
- "UserName": "put96",
- "PhoneId": "12016768877",
- "Password": "password",
- "EmailVerified": true,
- "PhoneIdVerified": true
- }';
- $resultCreate = self::$accountApi->create($data);
- $this->testerUid = $resultCreate->Uid;
- $this->testerEmail = $resultCreate->Email[0]->Value;
- $this->testerUsername = $resultCreate->UserName;
- $this->testerPhoneId = $resultCreate->PhoneId;
- }
-
- public function tearDown() {
- self::$accountApi->delete($this->testerUid);
- }
-
- public function testMfaEmailLogin() {
- $loginData = '{
- "email": "' . $this->testerEmail . '",
- "password": "password"
- }';
-
- $result = self::$userApi->mfaEmailLogin($loginData);
- $this->assertObjectHasAttribute("SecondFactorAuthentication", $result);
- }
-
- public function testMfaUsernameLogin() {
- $loginData = '{
- "username": "' . $this->testerUsername . '",
- "password": "password"
- }';
-
- $result = self::$userApi->mfaUserNameLogin($loginData);
- $this->assertObjectHasAttribute("SecondFactorAuthentication", $result);
- }
-
- public function testMfaPhoneLogin() {
- $loginData = '{
- "phone": "' . $this->testerPhoneId . '",
- "password": "password"
- }';
-
- $result = self::$userApi->mfaPhoneLogin($loginData);
- $this->assertObjectHasAttribute("SecondFactorAuthentication", $result);
- }
-
- public function testMfaValidateAccessToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- $result = self::$userApi->mfaValidateAccessToken($access_token);
- $this->assertObjectHasAttribute("QRCode", $result);
- }
-
- public function testMfaBackupCodeByAccessToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- try {
- $result = self::$userApi->getBackupCodeForLoginbyAccessToken($access_token);
- $this->assertObjectHasAttribute("BackUpCodes", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaResetBackupCodeByAccessToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- try {
- $result = self::$userApi->resetBackupCodebyAccessToken($access_token);
- $this->assertObjectHasAttribute("BackUpCodes", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaBackupCodeByUid() {
- try {
- $result = self::$accountApi->mfaGetBackupCodeByUid($this->testerUid);
- $this->assertObjectHasAttribute("BackUpCodes", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaResetBackupCodeByUid() {
- try {
- $result = self::$accountApi->mfaResetBackupCodeByUid($this->testerUid);
- $this->assertObjectHasAttribute("BackUpCodes", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaValidateBackupCode() {
- $loginData = '{
- "email": "' . $this->testerEmail . '",
- "password": "password"
- }';
-
- $loginResult = self::$userApi->mfaEmailLogin($loginData);
- $secondFactorAuthToken = $loginResult->SecondFactorAuthentication->SecondFactorAuthenticationToken;
- try {
- $result = self::$userApi->getLoginbyBackupCode($secondFactorAuthToken, "9999999");
- $this->assertObjectHasAttribute("access_token", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication backup code is not configured", $e->getMessage());
- }
- }
-
- public function testMfaValidateOtp() {
- $loginData = '{
- "email": "' . $this->testerEmail . '",
- "password": "password"
- }';
-
- $loginResult = self::$userApi->mfaEmailLogin($loginData);
- $secondFactorAuthToken = $loginResult->SecondFactorAuthentication->SecondFactorAuthenticationToken;
- try {
- $otpData = '{
- "otp": "99999"
- }';
-
- $result = self::$userApi->mfaValidateOtp($secondFactorAuthToken, $otpData);
- $this->assertObjectHasAttribute("access_token", $result);
- } catch (Exception $e) {
- $this->assertEquals("Invalid OTP Code", $e->getMessage());
- }
- }
-
- public function testMfaValidateGoogleAuthCode() {
- $loginData = '{
- "email": "' . $this->testerEmail . '",
- "password": "password"
- }';
-
- $loginResult = self::$userApi->mfaEmailLogin($loginData);
- $secondFactorAuthToken = $loginResult->SecondFactorAuthentication->SecondFactorAuthenticationToken;
- try {
- $result = self::$userApi->mfaValidateGoogleAuthCode($secondFactorAuthToken, "999999999");
- $this->assertObjectHasAttribute("access_token", $result);
- } catch (Exception $e) {
- $this->assertEquals("Google two factor authentication code is incorrect", $e->getMessage());
- }
- }
-
- public function testMfaUpdatePhoneNumber() {
- $loginData = '{
- "email": "' . $this->testerEmail . '",
- "password": "password"
- }';
-
- $loginResult = self::$userApi->mfaEmailLogin($loginData);
- $secondFactorAuthToken = $loginResult->SecondFactorAuthentication->SecondFactorAuthenticationToken;
- $result = self::$userApi->mfaUpdatePhoneNo($secondFactorAuthToken, "12016768877");
- $this->assertObjectHasAttribute("AccountSid", $result);
- }
-
- public function testMfaUpdatePhoneNumberByToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- $result = self::$userApi->mfaUpdatePhoneNoByToken($access_token, "12016768877");
- $this->assertObjectHasAttribute("AccountSid", $result);
- }
-
- public function testMfaResetGoogleAuthenticatorByToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- try {
- $result = self::$userApi->resetGoogleAuthenticatorByToken($access_token, true);
- $this->assertObjectHasAttribute("IsDeleted", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaResetSmsAuthenticatorByToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- try {
- $result = self::$userApi->resetSMSAuthenticatorByToken($access_token, true);
- $this->assertObjectHasAttribute("IsDeleted", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaResetGoogleAuthenticatorByUid() {
- try {
- $result = self::$accountApi->mfaResetGoogleAuthenticatorByUid($this->testerUid, true);
- $this->assertObjectHasAttribute("IsDeleted", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaResetSmsAuthenticatorByUid() {
- try {
- $result = self::$accountApi->mfaResetSMSAuthenticatorByUid($this->testerUid, true);
- $this->assertObjectHasAttribute("IsDeleted", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication client is not configured", $e->getMessage());
- }
- }
-
- public function testMfaUpdateByAccessToken() {
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- try {
- $result = self::$userApi->updateMfaByGoogleAuthCode($access_token, "999999");
- $this->assertObjectHasAttribute("Uid", $result);
- } catch (Exception $e) {
- $this->assertEquals("Two factor authentication is not enabled", $e->getMessage());
- }
- }
-
- public function testMfaUpdateSetting() {
- $otpData = '{
- "otp": "999999"
- }';
- $impersonationResult = self::$accountApi->getAccessTokenByUid($this->testerUid);
- $access_token = $impersonationResult->access_token;
- try {
- $result = self::$userApi->updateMfaByOtp($access_token, $otpData);
- $this->assertObjectHasAttribute("Uid", $result);
- } catch (Exception $e) {
- $this->assertEquals("Invalid OTP Code", $e->getMessage());
- }
- }
-}
diff --git a/tests/OneTouchLoginTest.php b/tests/OneTouchLoginTest.php
deleted file mode 100644
index a0b7c4e..0000000
--- a/tests/OneTouchLoginTest.php
+++ /dev/null
@@ -1,92 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$userApi = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
-
- $createResult = self::$accountApi->create($data);
- self::$testerUid = $createResult->Uid;
- self::$testerEmail = $createResult->Email[0]->Value;
- self::$testerPhone = $createResult->PhoneId;
- }
-
- public static function tearDownAfterClass() {
- self::$accountApi->delete(self::$testerUid);
- }
-
- public function testOneTouchLoginByEmail() {
- $data = '{
- "email": "' . self::$testerEmail . '",
- "clientguid": "testguid' . rand() . '",
- "g-recaptcha-response": "abcd"
- }';
-
- try {
- $result = self::$userApi->oneTouchLoginByEmail($data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- } catch (Exception $e) {
- $this->assertEquals("CAPTCHA is invalid", $e->getMessage());
- }
- }
-
- public function testOneTouchLoginByPhone() {
- $data = '{
- "phone": "' . self::$testerPhone . '",
- "g-recaptcha-response": "abcd"
- }';
-
- try {
- $result = self::$userApi->oneTouchLoginByPhone($data);
- $this->assertObjectHasAttribute("IsPosted", $result);
- } catch (Exception $e) {
- $this->assertEquals("CAPTCHA is invalid", $e->getMessage());
- }
- }
-
- public function testOneTouchLoginVerifyByOtp() {
- try {
- $result = self::$userApi->oneTouchOtpVerification("99999", "16135550185");
- $this->assertObjectHasAttribute("Profile", $result);
- } catch (Exception $e) {
- $this->assertEquals("Invalid OTP Code", $e->getMessage());
- }
- }
-
- public function testOneTouchLoginVerifyOtpByEmail() {
- try {
- $result = self::$userApi->smartLoginVerifyToken("abc");
- $this->assertObjectHasAttribute("IsVerified", $result);
- } catch (Exception $e) {
- $this->assertEquals("Verification token (vtoken) is invalid", $e->getMessage());
- }
- }
-}
diff --git a/tests/PasswordlessLoginTest.php b/tests/PasswordlessLoginTest.php
deleted file mode 100644
index fc6e24e..0000000
--- a/tests/PasswordlessLoginTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$userApi = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
-
- $createResult = self::$accountApi->create($data);
- self::$testerUid = $createResult->Uid;
- self::$testerEmail = $createResult->Email[0]->Value;
- self::$testerUsername = $createResult->UserName;
- }
-
- public static function tearDownAfterClass() {
- self::$accountApi->delete(self::$testerUid);
- }
-
- public function testPasswordlessLoginByEmail() {
- $result = self::$userApi->passwordLessLoginByEmail(self::$testerEmail);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testPasswordlessLoginByUsername() {
- $result = self::$userApi->passwordLessLoginByUserName(self::$testerUsername);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testPasswordlessLoginVerification() {
- try {
- $result = self::$userApi->passwordLessLoginVerification("a");
- $this->assertObjectHasAttribute("Profile", $result);
- } catch (Exception $e) {
- $this->assertEquals("Verification token (vtoken) is invalid", $e->getMessage());
- }
- }
-}
diff --git a/tests/PhoneAuthenticationTest.php b/tests/PhoneAuthenticationTest.php
deleted file mode 100644
index 209851d..0000000
--- a/tests/PhoneAuthenticationTest.php
+++ /dev/null
@@ -1,172 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$userApi = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function setUp() {
- $data = '{
- "Email": [
- {
- "Type": "Primary",
- "Value": "phpunittester96@mailinator.com"
- },
- {
- "Type": "Secondary",
- "Value": "phpunittester96secondary2@mailinator.com"
- }
- ],
- "UserName": "put96",
- "PhoneId": "12016768877",
- "Password": "password",
- "EmailVerified": true,
- "PhoneIdVerified": true
- }';
- $resultCreate = self::$accountApi->create($data);
- $this->testerUid = $resultCreate->Uid;
- $this->testerPhoneId = $resultCreate->PhoneId;
-
- $loginData = '{
- "phone": "' . $this->testerPhoneId . '",
- "password": "password"
- }';
- $resultLogin = self::$userApi->authLoginByPhone($loginData);
- $this->testerAccessToken = $resultLogin->access_token;
- }
-
- public function tearDown() {
- self::$accountApi->delete($this->testerUid);
- }
-
- public function testPhoneLogin() {
- $this->assertNotNull($this->testerAccessToken);
- }
-
- public function testPhoneForgotPasswordByOtp() {
- $result = self::$userApi->forgotPasswordByOtp($this->testerPhoneId);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testPhoneResendVerificationOtp() {
- $updateData = '{
- "PhoneIdVerified": false
- }';
- self::$accountApi->update($this->testerUid, $updateData);
-
- $result = self::$userApi->resendOTP($this->testerPhoneId);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testPhoneResendVerificationOtpByToken() {
- $updateData = '{
- "PhoneIdVerified": false
- }';
- self::$accountApi->update($this->testerUid, $updateData);
-
- $result = self::$userApi->resendOTPByToken($this->testerAccessToken, $this->testerPhoneId);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testPhoneUserRegistrationBySms() {
- $testPhoneId = "12368008106";
- $registerData = '{
- "Email": [
- {
- "Type": "Primary",
- "Value": "phpunittester90@mailinator.com"
- }
- ],
- "PhoneId": "' . $testPhoneId . '",
- "Password": "password",
- "EmailVerified": true,
- "PhoneIdVerified": true
- }';
-
- $result = self::$userApi->registerByPhone($registerData);
- $this->assertObjectHasAttribute("IsPosted", $result);
-
- $profileData = self::$accountApi->getProfileByPhone($testPhoneId);
- $profileUid = $profileData->Uid;
- $deleteResult = self::$accountApi->delete($profileUid);
- $this->assertObjectHasAttribute("IsDeleted", $deleteResult);
- }
-
- public function testPhoneNumberAvailability() {
- $result = self::$userApi->checkAvailablityOfPhone($this->testerPhoneId);
- $this->assertObjectHasAttribute("IsExist", $result);
- }
-
- public function testPhoneNumberUpdate() {
- $testPhoneId = "12368008106";
- $result = self::$userApi->updatePhone($this->testerAccessToken, $testPhoneId);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testPhoneResetPasswordByOtp() {
- try {
- $result = self::$userApi->phoneResetPasswordByOtp($this->testerPhoneId, "99999", "password");
- $this->assertObjectHasAttribute("IsPosted", $result);
- } catch (Exception $e) {
- $this->assertEquals("Invalid OTP Code", $e->getMessage());
- }
- }
-
- public function testPhoneVerificationByOtp() {
- try {
- $result = self::$userApi->verifyOTP("99999", $this->testerPhoneId);
- $this->assertObjectHasAttribute("Profile", $result);
- } catch (Exception $e) {
- $this->assertEquals("This phone number has already been confirmed", $e->getMessage());
- }
- }
-
- public function testPhoneVerificationOtpByToken() {
- try {
- $result = self::$userApi->verifyOTPByToken($this->testerAccessToken, "99999");
- $this->assertObjectHasAttribute("Profile", $result);
- } catch (Exception $e) {
- $this->assertEquals("Invalid OTP Code", $e->getMessage());
- }
- }
-
- public function testResetPhoneIdVerification() {
- $result = self::$accountApi->resetPhoneIdVerification($this->testerUid, true);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testRemovePhoneIdByAccessToken() {
- $result = self::$userApi->deletePhoneIdByAccessToken($this->testerAccessToken);
- $this->assertObjectHasAttribute("IsDeleted", $result);
- }
-
- public function testPhoneSendOtp() {
- $result = self::$userApi->phoneSendOtp($this->testerPhoneId);
- $this->assertObjectHasAttribute("Data", $result);
- }
-
- public function testPhoneLoginUsingOtp() {
- $loginData = '{
- "phone": "' . $this->testerPhoneId . '",
- "otp": "99999"
- }';
-
- try {
- $result = self::$userApi->phoneLoginByOtp($loginData);
- } catch (Exception $e) {
- $this->assertEquals("Invalid OTP Code", $e->getMessage());
- }
- }
-}
diff --git a/tests/RolesManagementTest.php b/tests/RolesManagementTest.php
deleted file mode 100644
index 4141f93..0000000
--- a/tests/RolesManagementTest.php
+++ /dev/null
@@ -1,173 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$roleApi = new RoleAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
-
- $createResult = self::$accountApi->create($data);
- self::$testerUid = $createResult->Uid;
- self::$testerAccessToken = self::$accountApi->getAccessTokenByUid(self::$testerUid)->access_token;
- }
-
- public static function tearDownAfterClass() {
- self::$accountApi->delete(self::$testerUid);
- }
-
- public function testRolesManagement() {
- // Create Roles
- $roleData = '{
- "roles": [
- {
- "name": "example_test_role1",
- "permissions": {
- "pname1": true,
- "pname2": true
- }
- },
- {
- "name": "example_test_role2",
- "permissions": {
- "pname3": true,
- "pname4": true
- }
- }
- ]
- }';
-
- $rolesCreateResult = self::$roleApi->create($roleData);
- $this->assertObjectHasAttribute("data", $rolesCreateResult);
-
- // Get Roles List
- $rolesGetResult = self::$roleApi->get();
- $this->assertObjectHasAttribute("data", $rolesGetResult);
-
- // Add Permissions to Role
- $permissionData = '{
- "permissions": [
- "pname5",
- "pname6"
- ]
- }';
-
- $addPermissionResult = self::$roleApi->addPermission("example_test_role2", $permissionData);
- $this->assertObjectHasAttribute("Name", $addPermissionResult);
-
- // Assign Role to User
- $assignData = '{
- "roles": [
- "example_test_role1",
- "example_test_role2"
- ]
- }';
-
- $assignRoleResult = self::$roleApi->assignRolesByUid(self::$testerUid, $assignData);
- $this->assertObjectHasAttribute("Roles", $assignRoleResult);
-
- // Get Roles by Uid
- $getRolesByUidResult = self::$roleApi->getAccountRolesByUid(self::$testerUid);
- $this->assertObjectHasAttribute("Roles", $getRolesByUidResult);
-
- // Upsert Context
- $contextData = '{
- "rolecontext": [
- {
- "context": "example_context",
- "roles": [
- "example_test_role1",
- "example_test_role2"
- ],
- "additionalpermissions": [
- "eap1",
- "eap2"
- ],
- "expiration": "2020-10-01 8:30:00 AM"
- }
- ]
- }';
-
- $upsertContextResult = self::$roleApi->upsertContext(self::$testerUid, $contextData);
- $this->assertObjectHasAttribute("Data", $upsertContextResult);
-
- // Get Context
- $getContextResult = self::$roleApi->getContext(self::$testerUid);
- $this->assertObjectHasAttribute("Data", $getContextResult);
-
- // Delete Additional Permissions from Context
- $deleteAdditionalPermissionsData = '{
- "additionalpermissions": [
- "eap1",
- "eap2"
- ]
- }';
- $deleteAPFCResult = self::$roleApi->deleteAdditionalPermissionFromContext(self::$testerUid, "example_context", $deleteAdditionalPermissionsData);
- $this->assertObjectHasAttribute("IsDeleted", $deleteAPFCResult);
-
- // Delete Role from Context
- $deleteRoleFromContextData = '{
- "roles": [
- "example_test_role2"
- ]
- }';
-
- $deleteRoleFromContextResult = self::$roleApi->deleteRoleFromContext(self::$testerUid, "example_context", $deleteRoleFromContextData);
- $this->assertObjectHasAttribute("IsDeleted", $deleteRoleFromContextResult);
-
- // Delete Context
- $deleteContextResult = self::$roleApi->deleteContextbyContextName(self::$testerUid, "example_context");
- $this->assertObjectHasAttribute("IsDeleted", $deleteContextResult);
-
- // Unassign Roles
- $unassignData = '{
- "roles": [
- "example_test_role2"
- ]
- }';
-
- $unassignRolesResult = self::$roleApi->deleteAccountRoles(self::$testerUid, $unassignData);
- $this->assertObjectHasAttribute("IsDeleted", $unassignRolesResult);
-
- // Delete Permissions from Role
- $deletePermissionData = '{
- "permissions": [
- "pname2"
- ]
- }';
-
- $deletePermissionsFromRoleResult = self::$roleApi->removePermission("example_test_role1", $deletePermissionData);
- $this->assertObjectHasAttribute("Name", $deletePermissionsFromRoleResult);
-
- // Delete Role
- $deleteRoleResult1 = self::$roleApi->delete("example_test_role1");
- $deleteRoleResult2 = self::$roleApi->delete("example_test_role2");
- $this->assertObjectHasAttribute("IsDeleted", $deleteRoleResult1);
- $this->assertObjectHasAttribute("IsDeleted", $deleteRoleResult2);
- }
-}
diff --git a/tests/SmartLoginTest.php b/tests/SmartLoginTest.php
deleted file mode 100644
index c4122b3..0000000
--- a/tests/SmartLoginTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$userApi = new UserAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
-
- $createResult = self::$accountApi->create($data);
- self::$testerUid = $createResult->Uid;
- self::$testerEmail = $createResult->Email[0]->Value;
- self::$testerUsername = $createResult->UserName;
- }
-
- public static function tearDownAfterClass() {
- self::$accountApi->delete(self::$testerUid);
- }
-
- public function testSmartLoginByEmailAndPing() {
- $clientGuid = "testguid" . rand();
- $result = self::$userApi->smartLoginByEmail($clientGuid, self::$testerEmail);
- $this->assertObjectHasAttribute("IsPosted", $result);
-
- try {
- $pingResult = self::$userApi->smartLoginPing($clientGuid);
- $this->assertObjectHasAttribute("access_token", $result);
- } catch (Exception $e) {
- $this->assertEquals("The smart login link has not been verified", $e->getMessage());
- }
- }
-
- public function testSmartLoginByUsername() {
- $result = self::$userApi->smartLoginByUserName("testguid" . rand(), self::$testerUsername);
- $this->assertObjectHasAttribute("IsPosted", $result);
- }
-
- public function testSmartLoginVerifyToken() {
- try {
- $result = self::$userApi->smartLoginVerifyToken("1234567890");
- $this->assertObjectHasAttribute("Profile", $result);
- } catch (Exception $e) {
- $this->assertEquals("Verification token (vtoken) is invalid", $e->getMessage());
- }
- }
-}
diff --git a/tests/SocialTest.php b/tests/SocialTest.php
deleted file mode 100644
index 9525d0c..0000000
--- a/tests/SocialTest.php
+++ /dev/null
@@ -1,285 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$socialApi = new SocialLoginAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function testPostMessage() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->sendMessage($accessTokenFromTwitter, "991413461560131585", "Test Message", "This is a test message.");
- $this->assertObjectHasAttribute("isPosted", $result);
- }
- }
-
- public function testStatusPostingPost() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->postStatus($accessTokenFromTwitter, "Test Post", "www.test.com", "www.test.com", "This is a test post. -" . rand(), "A post.", "A post.");
- $this->assertObjectHasAttribute("isPosted", $result);
- }
- }
-
- public function testAccessTokenTranslate() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->exchangeAccessToken($accessTokenFromTwitter);
- $this->assertObjectHasAttribute("access_token", $result);
- }
- }
-
- public function testAccessTokenValidate() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->tokenValidate($accessTokenFromTwitter);
- $this->assertObjectHasAttribute("access_token", $result);
- }
- }
-
- public function testAccessTokenInvalidate() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->tokenInvalidate($accessTokenFromTwitter);
- $this->assertObjectHasAttribute("isPosted", $result);
- }
- }
-
- public function testGetAlbum() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getPhotoAlbums($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetAudio() {
- // Using Vkontakte
- if (VKONTAKTE_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Vkontakte Access Token in config.php needs to be defined.");
- } else {
- $this->markTestIncomplete();
- }
- }
-
- public function testGetCheckIns() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getCheckins($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetCompanies() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getFollowedCompanies($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetContacts() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->getContacts($accessTokenFromTwitter);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetEvents() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getEvents($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetFollowing() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->getFollowing($accessTokenFromTwitter);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetGroups() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getGroups($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetLikes() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getLikes($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetMentions() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->getMentions($accessTokenFromTwitter);
- $this->assertNotNull($result);
- }
- }
-
- public function testGetMessage() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$advancedSocialApi->postMessage($accessTokenFromTwitter, "991413461560131585", "Test Message", "This is a test message.");
- $this->assertObjectHasAttribute("isPosted", $result);
- }
- }
-
- public function testGetPages() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getPages($accessTokenFromFacebook, "loginradius");
- $this->assertNotNull($result);
- }
- }
-
- public function testGetPhotos() {
- // Using Vkontakte
- if (VKONTAKTE_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Vkontakte Access Token in config.php needs to be defined.");
- } else {
- $this->markTestIncomplete();
- }
- }
-
- public function testGetPosts() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getPosts($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-
- public function testStatusFetching() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$socialApi->getStatus($accessTokenFromTwitter);
- $this->assertNotNull($result);
- }
- }
-
- public function testStatusPostingGet() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$advancedSocialApi->postStatus($accessTokenFromTwitter, "This is a test post. -" . rand(), "Test Post", "www.test.com", "www.test.com", "A post.", "A post.");
- $this->assertObjectHasAttribute("isPosted", $result);
- }
- }
-
- public function testGetUserProfile() {
- // Using Twitter
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $twitterAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $accessTokenFromTwitter = $twitterAccessTokenResult->access_token;
- $result = self::$advancedSocialApi->refreshUserProfile($accessTokenFromTwitter);
- $this->assertObjectHasAttribute("Uid", $result);
- }
- }
-
- public function testGetVideos() {
- // Using Facebook
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $fbAccessTokenResult = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $accessTokenFromFacebook = $fbAccessTokenResult->access_token;
- $result = self::$socialApi->getVideos($accessTokenFromFacebook);
- $this->assertNotNull($result);
- }
- }
-}
diff --git a/tests/TestCase/ApplicationTest.php b/tests/TestCase/ApplicationTest.php
new file mode 100644
index 0000000..e75e135
--- /dev/null
+++ b/tests/TestCase/ApplicationTest.php
@@ -0,0 +1,84 @@
+bootstrap();
+ $plugins = $app->getPlugins();
+
+ $this->assertCount(3, $plugins);
+ $this->assertSame('Bake', $plugins->get('Bake')->getName());
+ $this->assertSame('Migrations', $plugins->get('Migrations')->getName());
+ $this->assertSame('DebugKit', $plugins->get('DebugKit')->getName());
+ }
+
+ /**
+ * testBootstrapPluginWitoutHalt
+ *
+ * @return void
+ */
+ public function testBootstrapPluginWitoutHalt()
+ {
+ $this->expectException(InvalidArgumentException::class);
+
+ $app = $this->getMockBuilder(Application::class)
+ ->setConstructorArgs([dirname(dirname(__DIR__)) . '/config'])
+ ->setMethods(['addPlugin'])
+ ->getMock();
+
+ $app->method('addPlugin')
+ ->will($this->throwException(new InvalidArgumentException('test exception.')));
+
+ $app->bootstrap();
+ }
+
+ /**
+ * testMiddleware
+ *
+ * @return void
+ */
+ public function testMiddleware()
+ {
+ $app = new Application(dirname(dirname(__DIR__)) . '/config');
+ $middleware = new MiddlewareQueue();
+
+ $middleware = $app->middleware($middleware);
+
+ $this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0));
+ $this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1));
+ $this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2));
+ }
+}
diff --git a/tests/TestCase/Controller/Component/empty b/tests/TestCase/Controller/Component/empty
new file mode 100644
index 0000000..e69de29
diff --git a/tests/TestCase/Controller/PagesControllerTest.php b/tests/TestCase/Controller/PagesControllerTest.php
new file mode 100644
index 0000000..11b8b1d
--- /dev/null
+++ b/tests/TestCase/Controller/PagesControllerTest.php
@@ -0,0 +1,97 @@
+get('/');
+ $this->assertResponseOk();
+ $this->get('/');
+ $this->assertResponseOk();
+ }
+
+ /**
+ * testDisplay method
+ *
+ * @return void
+ */
+ public function testDisplay()
+ {
+ $this->get('/pages/home');
+ $this->assertResponseOk();
+ $this->assertResponseContains('CakePHP');
+ $this->assertResponseContains('');
+ }
+
+ /**
+ * Test that missing template renders 404 page in production
+ *
+ * @return void
+ */
+ public function testMissingTemplate()
+ {
+ Configure::write('debug', false);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseError();
+ $this->assertResponseContains('Error');
+ }
+
+ /**
+ * Test that missing template in debug mode renders missing_template error page
+ *
+ * @return void
+ */
+ public function testMissingTemplateInDebug()
+ {
+ Configure::write('debug', true);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseFailure();
+ $this->assertResponseContains('Missing Template');
+ $this->assertResponseContains('Stacktrace');
+ $this->assertResponseContains('not_existing.ctp');
+ }
+
+ /**
+ * Test directory traversal protection
+ *
+ * @return void
+ */
+ public function testDirectoryTraversalProtection()
+ {
+ $this->get('/pages/../Layout/ajax');
+ $this->assertResponseCode(403);
+ $this->assertResponseContains('Forbidden');
+ }
+}
diff --git a/tests/TestCase/Model/Behavior/empty b/tests/TestCase/Model/Behavior/empty
new file mode 100644
index 0000000..e69de29
diff --git a/tests/TestCase/View/Helper/empty b/tests/TestCase/View/Helper/empty
new file mode 100644
index 0000000..e69de29
diff --git a/tests/TokenManagementTest.php b/tests/TokenManagementTest.php
deleted file mode 100644
index c3be1ba..0000000
--- a/tests/TokenManagementTest.php
+++ /dev/null
@@ -1,84 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- self::$advancedSocialApi = new AdvanceSocialLoginAPI(API_KEY, API_SECRET, array('output_format' => 'json', 'api_request_signing' => API_REQUEST_SIGNING));
-
- $createResult = self::$accountApi->create($data);
- self::$testerUid = $createResult->Uid;
- self::$testerAccessToken = self::$accountApi->getAccessTokenByUid(self::$testerUid)->access_token;
- }
-
- public static function tearDownAfterClass() {
- self::$accountApi->delete(self::$testerUid);
- }
-
- public function testAccessTokenViaFacebookAccessToken() {
- if (FACEBOOK_ACCESS_TOKEN === "") {
- $this->markTestSkipped("Facebook Access Token in config.php needs to be defined.");
- } else {
- $result = self::$advancedSocialApi->getAccessTokenByPassingFacebookToken(FACEBOOK_ACCESS_TOKEN);
- $this->assertObjectHasAttribute("access_token", $result);
- }
- }
-
- public function testAccessTokenViaTwitterToken() {
- if (TWITTER_ACCESS_TOKEN === "" || TWITTER_TOKEN_SECRET === "") {
- $this->markTestSkipped("Twitter Access Token and Token Secret in config.php needs to be defined.");
- } else {
- $result = self::$advancedSocialApi->getAccessTokenByPassingTwitterToken(TWITTER_ACCESS_TOKEN, TWITTER_TOKEN_SECRET);
- $this->assertObjectHasAttribute("access_token", $result);
- }
- }
-
- public function testAccessTokenViaVkontakteToken() {
- $this->markTestIncomplete("testAccessTokenViaVkontakteToken not implemented.");
- }
-
- public function testAccessTokenViaGoogleToken() {
- $this->markTestIncomplete("testAccessTokenViaGoogleToken not implemented.");
- }
-
- public function testRefreshUserProfile() {
- $result = self::$advancedSocialApi->refreshUserProfile(self::$testerAccessToken);
- $this->assertObjectHasAttribute("Uid", $result);
- }
-
- public function testRefreshToken() {
- $result = self::$advancedSocialApi->refreshAccessToken(self::$testerAccessToken);
- $this->assertObjectHasAttribute("access_token", $result);
- }
-
- public function testGetActiveSessions() {
- $result = self::$advancedSocialApi->getActiveSessionByToken(self::$testerAccessToken);
- $this->assertObjectHasAttribute("data", $result);
- }
-}
diff --git a/tests/WebhooksTest.php b/tests/WebhooksTest.php
deleted file mode 100644
index 44d101d..0000000
--- a/tests/WebhooksTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
- 'json', 'api_request_signing' => API_REQUEST_SIGNING));
- }
-
- public function testWebhooks() {
- // Subscribe Webhooks
- $subscribeResult = self::$webHooksApi->subscribeWebHooks("https://www.testphpsdk.com", "Login");
- $this->assertObjectHasAttribute("IsPosted", $subscribeResult);
-
- // Webhooks Test
- $testResult = self::$webHooksApi->webHooksSettings();
- $this->assertObjectHasAttribute("IsAllowed", $testResult);
-
- // Webhooks Subscribed Urls
- $subscribedUrlsResult = self::$webHooksApi->getWebHooksSubscribedUrls("Login");
- $this->assertObjectHasAttribute("data", $subscribedUrlsResult);
-
- // Webhooks Unsubscribe
- $unsubscribeResult = self::$webHooksApi->unsubscribeWebHooks("https://www.testphpsdk.com", "Login");
- $this->assertObjectHasAttribute("IsDeleted", $unsubscribeResult);
- }
-}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 2d90b9d..0ca191e 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,5 +1,12 @@
'
-
-Note MultiFactorAuthenticationTest.php needs to have MFA set to enabled and required in the LoginRadius Dashboard.
diff --git a/webroot/.htaccess b/webroot/.htaccess
new file mode 100644
index 0000000..f5f2d63
--- /dev/null
+++ b/webroot/.htaccess
@@ -0,0 +1,5 @@
+
+ RewriteEngine On
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
diff --git a/webroot/css/base.css b/webroot/css/base.css
new file mode 100644
index 0000000..458cd94
--- /dev/null
+++ b/webroot/css/base.css
@@ -0,0 +1,455 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+/**
+ * Foundation for Sites by ZURB
+ * Version 5
+ */
+
+/*
+ * Copyright (c) 2013-2014 ZURB, inc.
+* MIT License
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+meta.foundation-version{font-family:"{{ VERSION }}"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}html{box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}html,body{font-size:100%}body{background:#fff;color:#222;cursor:auto;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.5;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{margin:0 auto;max-width:62.5rem;width:100%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{margin:0 -0.9375rem;max-width:none;width:auto}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{margin:0;max-width:none;width:auto}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:0.9375rem;padding-right:0.9375rem;width:100%;float:left}.column+.column:last-child,.columns+.column:last-child,.column+.columns:last-child,.columns+.columns:last-child{float:right}.column+.column.end,.columns+.column.end,.column+.columns.end,.columns+.columns.end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0 !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{float:left;margin-left:0;margin-right:0}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0 !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{float:left;margin-left:0;margin-right:0}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0 !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{float:left;margin-left:0;margin-right:0}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}button,.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-align:center;text-decoration:none;display:inline-block;padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;background-color:#008CBA;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding:1.125rem 2.25rem 1.1875rem 2.25rem;font-size:1.25rem}button.small,.button.small{padding:0.875rem 1.75rem 0.9375rem 1.75rem;font-size:0.8125rem}button.tiny,.button.tiny{padding:0.625rem 1.25rem 0.6875rem 1.25rem;font-size:0.6875rem}button.expand,.button.expand{padding-left:0;padding-right:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:0.75rem}button.right-align,.button.right-align{text-align:right;padding-right:0.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008CBA;border-color:#007095;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008CBA}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}form{margin:0 0 1rem}form .row .row{margin:0 -0.5rem}form .row .row .column,form .row .row .columns{padding:0 0.5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:0.5rem}label{color:#4d4d4d;cursor:pointer;display:block;font-size:0.875rem;font-weight:normal;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:0.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{border-style:solid;border-width:1px;display:block;font-size:0.875rem;height:2.3125rem;line-height:2.3125rem;overflow:visible;padding-bottom:0;padding-top:0;position:relative;text-align:center;width:100%;z-index:2}.postfix.button{border-color:true}.prefix.button{border:none;padding-left:0;padding-right:0;padding-bottom:0;padding-top:0;text-align:center}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;-moz-appearance:none;border-radius:0;background-color:#fff;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-family:inherit;font-size:0.875rem;height:2.3125rem;margin:0 0 1rem 0;padding:0.5rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color 0.15s linear,background 0.15s linear;-moz-transition:border-color 0.15s linear,background 0.15s linear;-ms-transition:border-color 0.15s linear,background 0.15s linear;-o-transition:border-color 0.15s linear,background 0.15s linear;transition:border-color 0.15s linear,background 0.15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;-moz-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}::-webkit-input-placeholder{color:#ccc}:-moz-placeholder{color:#ccc}::-moz-placeholder{color:#ccc}:-ms-input-placeholder{color:#ccc}select{-webkit-appearance:none !important;-moz-appearance:none !important;background-color:#FAFAFA;border-radius:0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;color:rgba(0,0,0,0.75);font-family:inherit;font-size:0.875rem;line-height:normal;padding:0.5rem;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:0.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;margin:1.125rem 0;padding:1.25rem}fieldset legend{background:#fff;font-weight:bold;margin-left:-0.1875rem;margin:0;padding:0 0.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;font-size:0.75rem;font-style:italic;font-weight:normal;margin-bottom:1rem;margin-top:-1px;padding:0.375rem 0.5625rem 0.5625rem;background:#f04124;color:#fff}.error>label>small{background:transparent;color:#676767;display:inline;font-size:60%;font-style:normal;margin:0;padding:0;text-transform:capitalize}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{position:fixed;top:0;width:100%;z-index:99;left:0}.fixed.expanded:not(.top-bar){height:auto;max-height:100%;overflow-y:auto;width:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{margin-top:2.8125rem;z-index:98}.top-bar{background:#333;height:2.8125rem;line-height:2.8125rem;margin-bottom:0;overflow:hidden;position:relative}.top-bar ul{list-style:none;margin-bottom:0}.top-bar .row{max-width:none}.top-bar form,.top-bar input,.top-bar select{margin-bottom:0}.top-bar input,.top-bar select{font-size:0.75rem;height:1.75rem;padding-bottom:.35rem;padding-top:.35rem}.top-bar .button,.top-bar button{font-size:0.75rem;margin-bottom:0;padding-bottom:0.4125rem;padding-top:0.4125rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{margin:0;position:relative}.top-bar .name{font-size:16px;height:2.8125rem;margin:0}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{font-size:1.0625rem;line-height:2.8125rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{color:#fff;display:block;font-weight:normal;padding:0 0.9375rem;width:75%}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;display:block;font-size:0.8125rem;font-weight:bold;height:2.8125rem;line-height:2.8125rem;padding:0 0.9375rem;position:relative;text-transform:uppercase}.top-bar .toggle-topbar.menu-icon{margin-top:-16px;top:50%}.top-bar .toggle-topbar.menu-icon a{color:#fff;height:34px;line-height:33px;padding:0 2.5rem 0 0.9375rem;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";display:block;height:0;position:absolute;margin-top:-8px;top:50%;right:0.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{background:transparent;height:auto}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}@media screen and (-webkit-min-device-pixel-ratio: 0){.top-bar.expanded .top-bar-section .has-dropdown.moved>.dropdown,.top-bar.expanded .top-bar-section .dropdown{clip:initial}.top-bar.expanded .top-bar-section .has-dropdown:not(.moved)>ul{padding:0}}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{display:block;font-size:16px;height:auto;margin:0;padding:0;width:100%}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{color:#fff;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.8125rem;font-weight:normal;padding-left:0.9375rem;padding:12px 0 12px 0.9375rem;text-transform:none;width:100%}.top-bar-section ul li>a.button{font-size:0.8125rem;padding-left:0.9375rem;padding-right:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#007095}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>a.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{background-color:#61b6d9}.top-bar-section ul li>a.button.info:hover,.top-bar-section ul li>a.button.info:focus{color:#fff}.top-bar-section ul li>button{font-size:0.8125rem;padding-left:0.9375rem;padding-right:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#007095}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li>button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{background-color:#61b6d9}.top-bar-section ul li>button.info:hover,.top-bar-section ul li>button.info:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;color:#fff;background:#222}.top-bar-section ul li.active>a{background:#008CBA;color:#fff}.top-bar-section ul li.active>a:hover{background:#0078a0;color:#fff}.top-bar-section .has-form{padding:0.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:0.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px;display:block;padding:0;position:absolute;top:0;z-index:99;left:100%}.top-bar-section .dropdown li{height:auto;width:100%}.top-bar-section .dropdown li a{font-weight:normal;padding:8px 0.9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:normal}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px 0.9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{color:#777;font-size:0.625rem;font-weight:bold;margin-bottom:0;padding:8px 0.9375rem 2px;text-transform:uppercase}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar select,.top-bar .button,.top-bar button{font-size:0.875rem;height:1.75rem;position:relative;top:0.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{margin-bottom:0;margin:0 auto;max-width:62.5rem}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{display:inline;height:auto !important;width:auto}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#222;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){background:#333;line-height:2.8125rem;padding:0 0.9375rem}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#222}.top-bar-section li.active:not(.has-form) a:not(.button){background:#008CBA;color:#fff;line-height:2.8125rem;padding:0 0.9375rem}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#0078a0;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{border:inset 5px;content:"";display:block;height:0;width:0;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px;display:block}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:0.1875rem;right:5px}.top-bar-section .dropdown{left:0;background:transparent;min-width:100%;top:auto}.top-bar-section .dropdown li a{background:#333;color:#fff;line-height:2.8125rem;padding:12px 0.9375rem;white-space:nowrap}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){background:#333;color:#fff}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){background-color:#555;color:#fff;background:#222}.top-bar-section .dropdown li label{background:#333;white-space:nowrap}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-right:solid 1px #4e4e4e;border-bottom:none;border-top:none;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;height:2.8125rem;padding:0 0.9375rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#222;color:#fff}.no-js .top-bar-section ul li:active>a{background:#008CBA;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{position:static !important;height:auto;width:auto;overflow:visible;clip:auto;display:block;position:absolute !important}}.breadcrumbs{border-style:solid;border-width:1px;display:block;list-style:none;margin-left:0;overflow:hidden;padding:0.5625rem 0.875rem 0.5625rem;background-color:#f4f4f4;border-color:#dcdcdc;border-radius:3px}.breadcrumbs>*{color:#008CBA;float:left;font-size:0.6875rem;line-height:0.6875rem;margin:0;text-transform:uppercase}.breadcrumbs>*:hover a,.breadcrumbs>*:focus a{text-decoration:underline}.breadcrumbs>* a{color:#008CBA}.breadcrumbs>*.current{color:#333;cursor:default}.breadcrumbs>*.current a{color:#333;cursor:default}.breadcrumbs>*.current:hover,.breadcrumbs>*.current:hover a,.breadcrumbs>*.current:focus,.breadcrumbs>*.current:focus a{text-decoration:none}.breadcrumbs>*.unavailable{color:#999}.breadcrumbs>*.unavailable a{color:#999}.breadcrumbs>*.unavailable:hover,.breadcrumbs>*.unavailable:hover a,.breadcrumbs>*.unavailable:focus,.breadcrumbs>*.unavailable a:focus{color:#999;cursor:not-allowed;text-decoration:none}.breadcrumbs>*:before{color:#aaa;content:"/";margin:0 0.75rem;position:relative;top:1px}.breadcrumbs>*:first-child:before{content:" ";margin:0}[aria-label="breadcrumbs"] [aria-hidden="true"]:after{content:"/"}.alert-box{border-style:solid;border-width:1px;display:block;font-size:0.8125rem;font-weight:normal;margin-bottom:1.25rem;padding:0.875rem 1.5rem 0.875rem 0.875rem;position:relative;transition:opacity 300ms ease-out;background-color:#008CBA;border-color:#0078a0;color:#fff}.alert-box .close{right:0.25rem;background:inherit;color:#333;font-size:1.375rem;line-height:.9;margin-top:-0.6875rem;opacity:0.3;padding:0 6px 4px;position:absolute;top:50%}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{border-radius:3px}.alert-box.round{border-radius:1000px}.alert-box.success{background-color:#43AC6A;border-color:#3a945b;color:#fff}.alert-box.alert{background-color:#f04124;border-color:#de2d0f;color:#fff}.alert-box.secondary{background-color:#e7e7e7;border-color:#c7c7c7;color:#4f4f4f}.alert-box.warning{background-color:#f08a24;border-color:#de770f;color:#fff}.alert-box.info{background-color:#a0d3e8;border-color:#74bfdd;color:#4f4f4f}.alert-box.alert-close{opacity:0}.inline-list{list-style:none;margin-left:-1.375rem;margin-right:0;margin:0 auto 1.0625rem auto;overflow:hidden;padding:0}.inline-list>li{display:block;float:left;list-style:none;margin-left:1.375rem}.inline-list>li>*{display:block}.button-group{list-style:none;margin:0;left:0}.button-group:before,.button-group:after{content:" ";display:table}.button-group:after{clear:both}.button-group.even-2 li{display:inline-block;margin:0 -2px;width:50%}.button-group.even-2 li>button,.button-group.even-2 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-2 li:first-child button,.button-group.even-2 li:first-child .button{border-left:0}.button-group.even-2 li button,.button-group.even-2 li .button{width:100%}.button-group.even-3 li{display:inline-block;margin:0 -2px;width:33.33333%}.button-group.even-3 li>button,.button-group.even-3 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-3 li:first-child button,.button-group.even-3 li:first-child .button{border-left:0}.button-group.even-3 li button,.button-group.even-3 li .button{width:100%}.button-group.even-4 li{display:inline-block;margin:0 -2px;width:25%}.button-group.even-4 li>button,.button-group.even-4 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-4 li:first-child button,.button-group.even-4 li:first-child .button{border-left:0}.button-group.even-4 li button,.button-group.even-4 li .button{width:100%}.button-group.even-5 li{display:inline-block;margin:0 -2px;width:20%}.button-group.even-5 li>button,.button-group.even-5 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-5 li:first-child button,.button-group.even-5 li:first-child .button{border-left:0}.button-group.even-5 li button,.button-group.even-5 li .button{width:100%}.button-group.even-6 li{display:inline-block;margin:0 -2px;width:16.66667%}.button-group.even-6 li>button,.button-group.even-6 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-6 li:first-child button,.button-group.even-6 li:first-child .button{border-left:0}.button-group.even-6 li button,.button-group.even-6 li .button{width:100%}.button-group.even-7 li{display:inline-block;margin:0 -2px;width:14.28571%}.button-group.even-7 li>button,.button-group.even-7 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-7 li:first-child button,.button-group.even-7 li:first-child .button{border-left:0}.button-group.even-7 li button,.button-group.even-7 li .button{width:100%}.button-group.even-8 li{display:inline-block;margin:0 -2px;width:12.5%}.button-group.even-8 li>button,.button-group.even-8 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-8 li:first-child button,.button-group.even-8 li:first-child .button{border-left:0}.button-group.even-8 li button,.button-group.even-8 li .button{width:100%}.button-group>li{display:inline-block;margin:0 -2px}.button-group>li>button,.button-group>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group>li:first-child button,.button-group>li:first-child .button{border-left:0}.button-group.stack>li{display:block;margin:0;float:none}.button-group.stack>li>button,.button-group.stack>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-left:0}.button-group.stack>li>button,.button-group.stack>li .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.stack>li>button{width:100%}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-top:0}.button-group.stack-for-small>li{display:inline-block;margin:0 -2px}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}@media only screen and (max-width: 40em){.button-group.stack-for-small>li{display:block;margin:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.stack-for-small>li>button{width:100%}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-top:0}}.button-group.radius>*{display:inline-block;margin:0 -2px}.button-group.radius>*>button,.button-group.radius>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius>*:first-child button,.button-group.radius>*:first-child .button{border-left:0}.button-group.radius>*,.button-group.radius>*>a,.button-group.radius>*>button,.button-group.radius>*>.button{border-radius:0}.button-group.radius>*:first-child,.button-group.radius>*:first-child>a,.button-group.radius>*:first-child>button,.button-group.radius>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius>*:last-child,.button-group.radius>*:last-child>a,.button-group.radius>*:last-child>button,.button-group.radius>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*{display:block;margin:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-left:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.radius.stack>*>button{width:100%}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-top:0}.button-group.radius.stack>*,.button-group.radius.stack>*>a,.button-group.radius.stack>*>button,.button-group.radius.stack>*>.button{border-radius:0}.button-group.radius.stack>*:first-child,.button-group.radius.stack>*:first-child>a,.button-group.radius.stack>*:first-child>button,.button-group.radius.stack>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*:last-child,.button-group.radius.stack>*:last-child>a,.button-group.radius.stack>*:last-child>button,.button-group.radius.stack>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}@media only screen and (min-width: 40.0625em){.button-group.radius.stack-for-small>*{display:inline-block;margin:0 -2px}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}}@media only screen and (max-width: 40em){.button-group.radius.stack-for-small>*{display:block;margin:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.radius.stack-for-small>*>button{width:100%}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-top:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}}.button-group.round>*{display:inline-block;margin:0 -2px}.button-group.round>*>button,.button-group.round>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round>*:first-child button,.button-group.round>*:first-child .button{border-left:0}.button-group.round>*,.button-group.round>*>a,.button-group.round>*>button,.button-group.round>*>.button{border-radius:0}.button-group.round>*:first-child,.button-group.round>*:first-child>a,.button-group.round>*:first-child>button,.button-group.round>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round>*:last-child,.button-group.round>*:last-child>a,.button-group.round>*:last-child>button,.button-group.round>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.button-group.round.stack>*{display:block;margin:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-left:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.round.stack>*>button{width:100%}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-top:0}.button-group.round.stack>*,.button-group.round.stack>*>a,.button-group.round.stack>*>button,.button-group.round.stack>*>.button{border-radius:0}.button-group.round.stack>*:first-child,.button-group.round.stack>*:first-child>a,.button-group.round.stack>*:first-child>button,.button-group.round.stack>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack>*:last-child,.button-group.round.stack>*:last-child>a,.button-group.round.stack>*:last-child>button,.button-group.round.stack>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}@media only screen and (min-width: 40.0625em){.button-group.round.stack-for-small>*{display:inline-block;margin:0 -2px}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}}@media only screen and (max-width: 40em){.button-group.round.stack-for-small>*{display:block;margin:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-color:rgba(255,255,255,0.5);border-left-width:0;border-top:1px solid;display:block;margin:0}.button-group.round.stack-for-small>*>button{width:100%}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-top:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}}.button-bar:before,.button-bar:after{content:" ";display:table}.button-bar:after{clear:both}.button-bar .button-group{float:left;margin-right:0.625rem}.button-bar .button-group div{overflow:hidden}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:0.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#ecfaff;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:0.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#008CBA}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#0078a0}.panel.radius{border-radius:3px}.dropdown.button,button.dropdown{position:relative;padding-right:3.5625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent;border-style:solid;content:"";display:block;height:0;position:absolute;top:50%;width:0}.dropdown.button::after,button.dropdown::after{border-width:0.375rem;right:1.40625rem;margin-top:-0.15625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent}.dropdown.button.tiny,button.dropdown.tiny{padding-right:2.625rem}.dropdown.button.tiny:after,button.dropdown.tiny:after{border-width:0.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown.button.tiny::after,button.dropdown.tiny::after{border-color:#fff transparent transparent transparent}.dropdown.button.small,button.dropdown.small{padding-right:3.0625rem}.dropdown.button.small::after,button.dropdown.small::after{border-width:0.4375rem;right:1.3125rem;margin-top:-0.15625rem}.dropdown.button.small::after,button.dropdown.small::after{border-color:#fff transparent transparent transparent}.dropdown.button.large,button.dropdown.large{padding-right:3.625rem}.dropdown.button.large::after,button.dropdown.large::after{border-width:0.3125rem;right:1.71875rem;margin-top:-0.15625rem}.dropdown.button.large::after,button.dropdown.large::after{border-color:#fff transparent transparent transparent}.dropdown.button.secondary:after,button.dropdown.secondary:after{border-color:#333 transparent transparent transparent}.th{border:solid 4px #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.2);display:inline-block;line-height:0;max-width:100%;transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(0,140,186,0.5)}.th.radius{border-radius:3px}.pricing-table{border:solid 1px #ddd;margin-left:0;margin-bottom:1.25rem}.pricing-table *{list-style:none;line-height:1}.pricing-table .title{background-color:#333;color:#eee;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;font-weight:normal;padding:0.9375rem 1.25rem;text-align:center}.pricing-table .price{background-color:#F6F6F6;color:#333;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:2rem;font-weight:normal;padding:0.9375rem 1.25rem;text-align:center}.pricing-table .description{background-color:#fff;border-bottom:dotted 1px #ddd;color:#777;font-size:0.75rem;font-weight:normal;line-height:1.4;padding:0.9375rem;text-align:center}.pricing-table .bullet-item{background-color:#fff;border-bottom:dotted 1px #ddd;color:#333;font-size:0.875rem;font-weight:normal;padding:0.9375rem;text-align:center}.pricing-table .cta-button{background-color:#fff;padding:1.25rem 1.25rem 0;text-align:center}@-webkit-keyframes rotate{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{from{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}.slideshow-wrapper{position:relative}.slideshow-wrapper ul{list-style-type:none;margin:0}.slideshow-wrapper ul li,.slideshow-wrapper ul li .orbit-caption{display:none}.slideshow-wrapper ul li:first-child{display:block}.slideshow-wrapper .orbit-container{background-color:transparent}.slideshow-wrapper .orbit-container li{display:block}.slideshow-wrapper .orbit-container li .orbit-caption{display:block}.slideshow-wrapper .orbit-container .orbit-bullets li{display:inline-block}.slideshow-wrapper .preloader{border-radius:1000px;animation-duration:1.5s;animation-iteration-count:infinite;animation-name:rotate;animation-timing-function:linear;border-color:#555 #fff;border:solid 3px;display:block;height:40px;left:50%;margin-left:-20px;margin-top:-20px;position:absolute;top:50%;width:40px}.orbit-container{background:none;overflow:hidden;position:relative;width:100%}.orbit-container .orbit-slides-container{list-style:none;margin:0;padding:0;position:relative;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.orbit-container .orbit-slides-container img{display:block;max-width:100%}.orbit-container .orbit-slides-container>*{position:absolute;top:0;width:100%;margin-left:100%}.orbit-container .orbit-slides-container>*:first-child{margin-left:0}.orbit-container .orbit-slides-container>* .orbit-caption{bottom:0;position:absolute;background-color:rgba(51,51,51,0.8);color:#fff;font-size:0.875rem;padding:0.625rem 0.875rem;width:100%}.orbit-container .orbit-slide-number{left:10px;background:transparent;color:#fff;font-size:12px;position:absolute;top:10px;z-index:10}.orbit-container .orbit-slide-number span{font-weight:700;padding:0.3125rem}.orbit-container .orbit-timer{position:absolute;top:12px;right:10px;height:6px;width:100px;z-index:10}.orbit-container .orbit-timer .orbit-progress{height:3px;background-color:rgba(255,255,255,0.3);display:block;width:0;position:relative;right:20px;top:5px}.orbit-container .orbit-timer>span{border:solid 4px #fff;border-bottom:none;border-top:none;display:none;height:14px;position:absolute;top:0;width:11px;right:0}.orbit-container .orbit-timer.paused>span{top:0;width:11px;height:14px;border:inset 8px;border-left-style:solid;border-color:transparent;border-left-color:#fff;right:-4px}.orbit-container .orbit-timer.paused>span.dark{border-left-color:#333}.orbit-container:hover .orbit-timer>span{display:block}.orbit-container .orbit-prev,.orbit-container .orbit-next{background-color:transparent;color:white;height:60px;line-height:50px;margin-top:-25px;position:absolute;text-indent:-9999px !important;top:45%;width:36px;z-index:10}.orbit-container .orbit-prev:hover,.orbit-container .orbit-next:hover{background-color:rgba(0,0,0,0.3)}.orbit-container .orbit-prev>span,.orbit-container .orbit-next>span{border:inset 10px;display:block;height:0;margin-top:-10px;position:absolute;top:50%;width:0}.orbit-container .orbit-prev{left:0}.orbit-container .orbit-prev>span{border-right-style:solid;border-color:transparent;border-right-color:#fff}.orbit-container .orbit-prev:hover>span{border-right-color:#fff}.orbit-container .orbit-next{right:0}.orbit-container .orbit-next>span{border-color:transparent;border-left-style:solid;border-left-color:#fff;left:50%;margin-left:-4px}.orbit-container .orbit-next:hover>span{border-left-color:#fff}.orbit-bullets-container{text-align:center}.orbit-bullets{display:block;float:none;margin:0 auto 30px auto;overflow:hidden;position:relative;text-align:center;top:10px}.orbit-bullets li{background:#ccc;cursor:pointer;display:inline-block;float:none;height:0.5625rem;margin-right:6px;width:0.5625rem;border-radius:1000px}.orbit-bullets li.active{background:#999}.orbit-bullets li:last-child{margin-right:0}.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:none}.touch .orbit-bullets{display:none}@media only screen and (min-width: 40.0625em){.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:inherit}.touch .orbit-bullets{display:block}}@media only screen and (max-width: 40em){.orbit-stack-on-small .orbit-slides-container{height:auto !important}.orbit-stack-on-small .orbit-slides-container>*{margin:0 !important;opacity:1 !important;position:relative}.orbit-stack-on-small .orbit-slide-number{display:none}.orbit-timer{display:none}.orbit-next,.orbit-prev{display:none}.orbit-bullets{display:none}}[data-magellan-expedition],[data-magellan-expedition-clone]{background:#fff;min-width:100%;padding:10px;z-index:50}[data-magellan-expedition] .sub-nav,[data-magellan-expedition-clone] .sub-nav{margin-bottom:0}[data-magellan-expedition] .sub-nav dd,[data-magellan-expedition-clone] .sub-nav dd{margin-bottom:0}[data-magellan-expedition] .sub-nav a,[data-magellan-expedition-clone] .sub-nav a{line-height:1.8em}.icon-bar{display:inline-block;font-size:0;width:100%;background:#333}.icon-bar>*{display:block;float:left;font-size:1rem;margin:0 auto;padding:1.25rem;text-align:center;width:25%}.icon-bar>* i,.icon-bar>* img{display:block;margin:0 auto}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem;vertical-align:middle}.icon-bar>* img{height:1.875rem;width:1.875rem}.icon-bar.label-right>* i,.icon-bar.label-right>* img{display:inline-block;margin:0 .0625rem 0 0}.icon-bar.label-right>* i+label,.icon-bar.label-right>* img+label{margin-top:0}.icon-bar.label-right>* label{display:inline-block}.icon-bar.vertical.label-right>*{text-align:left}.icon-bar.vertical,.icon-bar.small-vertical{height:100%;width:auto}.icon-bar.vertical .item,.icon-bar.small-vertical .item{float:none;margin:auto;width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.medium-vertical{height:100%;width:auto}.icon-bar.medium-vertical .item{float:none;margin:auto;width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.large-vertical{height:100%;width:auto}.icon-bar.large-vertical .item{float:none;margin:auto;width:auto}}.icon-bar>*{font-size:1rem;padding:1.25rem}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem;font-size:1rem}.icon-bar>* i{font-size:1.875rem}.icon-bar>* img{height:1.875rem;width:1.875rem}.icon-bar>* label{color:#fff}.icon-bar>* i{color:#fff}.icon-bar>a:hover{background:#008CBA}.icon-bar>a:hover label{color:#fff}.icon-bar>a:hover i{color:#fff}.icon-bar>a.active{background:#008CBA}.icon-bar>a.active label{color:#fff}.icon-bar>a.active i{color:#fff}.icon-bar .item.disabled{cursor:not-allowed;opacity:0.7;pointer-events:none}.icon-bar .item.disabled>*{opacity:0.7;cursor:not-allowed}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.eight-up.large-vertical .item{width:auto}}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.six-up.large-vertical .item{width:auto}}.icon-bar.seven-up .item{width:14.28571%}.icon-bar.seven-up.vertical .item,.icon-bar.seven-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.seven-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.seven-up.large-vertical .item{width:auto}}.icon-bar.eight-up .item{width:12.5%}.icon-bar.eight-up.vertical .item,.icon-bar.eight-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.0625em){.icon-bar.eight-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.0625em){.icon-bar.eight-up.large-vertical .item{width:auto}}.tabs{margin-bottom:0 !important;margin-left:0}.tabs:before,.tabs:after{content:" ";display:table}.tabs:after{clear:both}.tabs dd,.tabs .tab-title{float:left;list-style:none;margin-bottom:0 !important;position:relative}.tabs dd>a,.tabs .tab-title>a{display:block;background-color:#EFEFEF;color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;padding:1rem 2rem}.tabs dd>a:hover,.tabs .tab-title>a:hover{background-color:#e1e1e1}.tabs dd.active a,.tabs .tab-title.active a{background-color:#fff;color:#222}.tabs.radius dd:first-child a,.tabs.radius .tab:first-child a{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.tabs.radius dd:last-child a,.tabs.radius .tab:last-child a{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.tabs.vertical dd,.tabs.vertical .tab-title{position:inherit;float:none;display:block;top:auto}.tabs-content{margin-bottom:1.5rem;width:100%}.tabs-content:before,.tabs-content:after{content:" ";display:table}.tabs-content:after{clear:both}.tabs-content>.content{display:none;float:left;padding:0.9375rem 0;width:100%}.tabs-content>.content.active{display:block;float:none}.tabs-content>.content.contained{padding:0.9375rem}.tabs-content.vertical{display:block}.tabs-content.vertical>.content{padding:0 0.9375rem}@media only screen and (min-width: 40.0625em){.tabs.vertical{float:left;margin:0;margin-bottom:1.25rem !important;max-width:20%;width:20%}.tabs-content.vertical{float:left;margin-left:-1px;max-width:80%;padding-left:1rem;width:80%}}.no-js .tabs-content>.content{display:block;float:none}ul.pagination{display:block;margin-left:-0.3125rem;min-height:1.5rem}ul.pagination li{color:#222;font-size:0.875rem;height:1.5rem;margin-left:0.3125rem}ul.pagination li a,ul.pagination li button{border-radius:3px;transition:background-color 300ms ease-out;background:none;color:#999;display:block;font-size:1em;font-weight:normal;line-height:inherit;padding:0.0625rem 0.625rem 0.0625rem}ul.pagination li:hover a,ul.pagination li a:focus,ul.pagination li:hover button,ul.pagination li button:focus{background:#e6e6e6}ul.pagination li.unavailable a,ul.pagination li.unavailable button{cursor:default;color:#999}ul.pagination li.unavailable:hover a,ul.pagination li.unavailable a:focus,ul.pagination li.unavailable:hover button,ul.pagination li.unavailable button:focus{background:transparent}ul.pagination li.current a,ul.pagination li.current button{background:#008CBA;color:#fff;cursor:default;font-weight:bold}ul.pagination li.current a:hover,ul.pagination li.current a:focus,ul.pagination li.current button:hover,ul.pagination li.current button:focus{background:#008CBA}ul.pagination li{display:block;float:left}.pagination-centered{text-align:center}.pagination-centered ul.pagination li{display:inline-block;float:none}.side-nav{display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;list-style-position:outside;list-style-type:none;margin:0;padding:0.875rem 0}.side-nav li{font-size:0.875rem;font-weight:normal;margin:0 0 0.4375rem 0}.side-nav li a:not(.button){color:#008CBA;display:block;margin:0;padding:0.4375rem 0.875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#1cc7ff}.side-nav li a:not(.button):active{color:#1cc7ff}.side-nav li.active>a:first-child:not(.button){color:#1cc7ff;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal}.side-nav li.divider{border-top:1px solid;height:0;list-style:none;padding:0;border-top-color:#e6e6e6}.side-nav li.heading{color:#008CBA;font-size:0.875rem;font-weight:bold;text-transform:uppercase}.accordion{margin-bottom:0}.accordion:before,.accordion:after{content:" ";display:table}.accordion:after{clear:both}.accordion .accordion-navigation,.accordion dd{display:block;margin-bottom:0 !important}.accordion .accordion-navigation.active>a,.accordion dd.active>a{background:#e8e8e8}.accordion .accordion-navigation>a,.accordion dd>a{background:#EFEFEF;color:#222;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem;padding:1rem}.accordion .accordion-navigation>a:hover,.accordion dd>a:hover{background:#e3e3e3}.accordion .accordion-navigation>.content,.accordion dd>.content{display:none;padding:0.9375rem}.accordion .accordion-navigation>.content.active,.accordion dd>.content.active{background:#fff;display:block}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 6249999.9375em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008CBA;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#0078a0}a img{border:none}p{font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:0.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.4;margin-bottom:0.5rem;margin-top:0.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:0.2rem;margin-bottom:0.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;padding:0.125rem 0.3125rem 0.0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:0.3rem;font-weight:bold}dl dd{margin-bottom:0.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:0.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:0.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:0.625rem 0.75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}.split.button{position:relative;padding-right:5.0625rem}.split.button span{display:block;height:100%;position:absolute;right:0;top:0;border-left:solid 1px}.split.button span:after{position:absolute;content:"";width:0;height:0;display:block;border-style:inset;top:50%;left:50%}.split.button span:active{background-color:rgba(0,0,0,0.1)}.split.button span{border-left-color:rgba(255,255,255,0.5)}.split.button span{width:3.09375rem}.split.button span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button span:after{border-color:#fff transparent transparent transparent}.split.button.secondary span{border-left-color:rgba(255,255,255,0.5)}.split.button.secondary span:after{border-color:#fff transparent transparent transparent}.split.button.alert span{border-left-color:rgba(255,255,255,0.5)}.split.button.success span{border-left-color:rgba(255,255,255,0.5)}.split.button.tiny{padding-right:3.75rem}.split.button.tiny span{width:2.25rem}.split.button.tiny span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button.small{padding-right:4.375rem}.split.button.small span{width:2.625rem}.split.button.small span:after{border-top-style:solid;border-width:0.4375rem;margin-left:-0.375rem;top:48%}.split.button.large{padding-right:5.5rem}.split.button.large span{width:3.4375rem}.split.button.large span:after{border-top-style:solid;border-width:0.3125rem;margin-left:-0.375rem;top:48%}.split.button.expand{padding-left:2rem}.split.button.secondary span:after{border-color:#333 transparent transparent transparent}.split.button.radius span{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.split.button.round span{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.split.button.no-pip span:before{border-style:none}.split.button.no-pip span:after{border-style:none}.split.button.no-pip span>i{display:block;left:50%;margin-left:-0.28889em;margin-top:-0.48889em;position:absolute;top:50%}.reveal-modal-bg{background:#000;background:rgba(0,0,0,0.45);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1004;left:0}.reveal-modal{border-radius:3px;display:none;position:absolute;top:0;visibility:hidden;width:100%;z-index:1005;left:0;background-color:#fff;padding:1.875rem;border:solid 1px #666;box-shadow:0 0 10px rgba(0,0,0,0.4)}@media only screen and (max-width: 40em){.reveal-modal{min-height:100vh}}.reveal-modal .column,.reveal-modal .columns{min-width:0}.reveal-modal>:first-child{margin-top:0}.reveal-modal>:last-child{margin-bottom:0}@media only screen and (min-width: 40.0625em){.reveal-modal{left:0;margin:0 auto;max-width:62.5rem;right:0;width:80%}}@media only screen and (min-width: 40.0625em){.reveal-modal{top:6.25rem}}.reveal-modal.radius{border-radius:3px}.reveal-modal.round{border-radius:1000px}.reveal-modal.collapse{padding:0}@media only screen and (min-width: 40.0625em){.reveal-modal.tiny{left:0;margin:0 auto;max-width:62.5rem;right:0;width:30%}}@media only screen and (min-width: 40.0625em){.reveal-modal.small{left:0;margin:0 auto;max-width:62.5rem;right:0;width:40%}}@media only screen and (min-width: 40.0625em){.reveal-modal.medium{left:0;margin:0 auto;max-width:62.5rem;right:0;width:60%}}@media only screen and (min-width: 40.0625em){.reveal-modal.large{left:0;margin:0 auto;max-width:62.5rem;right:0;width:70%}}@media only screen and (min-width: 40.0625em){.reveal-modal.xlarge{left:0;margin:0 auto;max-width:62.5rem;right:0;width:95%}}.reveal-modal.full{height:100vh;height:100%;left:0;margin-left:0 !important;max-width:none !important;min-height:100vh;top:0}@media only screen and (min-width: 40.0625em){.reveal-modal.full{left:0;margin:0 auto;max-width:62.5rem;right:0;width:100%}}.reveal-modal.toback{z-index:1003}.reveal-modal .close-reveal-modal{color:#aaa;cursor:pointer;font-size:2.5rem;font-weight:bold;line-height:1;position:absolute;top:0.625rem;right:1.375rem}.has-tip{border-bottom:dotted 1px #ccc;color:#333;cursor:help;font-weight:bold}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px #003f54;color:#008CBA}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{background:#333;color:#fff;display:none;font-size:0.875rem;font-weight:normal;line-height:1.3;max-width:300px;padding:0.75rem;position:absolute;width:100%;z-index:1006;left:50%}.tooltip>.nub{border-color:transparent transparent #333 transparent;border:solid 5px;display:block;height:0;pointer-events:none;position:absolute;top:-10px;width:0;left:5px}.tooltip>.nub.rtl{left:auto;right:5px}.tooltip.radius{border-radius:3px}.tooltip.round{border-radius:1000px}.tooltip.round>.nub{left:2rem}.tooltip.opened{border-bottom:dotted 1px #003f54 !important;color:#008CBA !important}.tap-to-close{color:#777;display:block;font-size:0.625rem;font-weight:normal}@media only screen and (min-width: 40.0625em){.tooltip>.nub{border-color:transparent transparent #333 transparent;top:-10px}.tooltip.tip-top>.nub{border-color:#333 transparent transparent transparent;bottom:-10px;top:auto}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:transparent transparent transparent #333;left:auto;margin-top:-5px;right:-10px;top:50%}.tooltip.tip-right>.nub{border-color:transparent #333 transparent transparent;left:-10px;margin-top:-5px;right:auto;top:50%}}.clearing-thumbs,[data-clearing]{list-style:none;margin-left:0;margin-bottom:0}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;height:100%;position:fixed;top:0;width:100%;z-index:998;left:0}.clearing-blackout .clearing-close{display:block}.clearing-container{height:100%;margin:0;overflow:hidden;position:relative;z-index:998}.clearing-touch-label{color:#aaa;font-size:.6em;left:50%;position:absolute;top:50%}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;-webkit-transform:translateY(-50%) translateX(-50%);-moz-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);-o-transform:translateY(-50%) translateX(-50%);transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{background:#333;bottom:0;color:#ccc;font-size:0.875em;line-height:1.3;margin-bottom:0;padding:10px 30px 20px;position:absolute;text-align:center;width:100%;left:0}.clearing-close{color:#ccc;display:none;font-size:30px;line-height:1;padding-left:20px;padding-top:10px;z-index:999}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{height:100%;position:absolute;top:0;width:40px}.clearing-main-prev>span,.clearing-main-next>span{border:solid 12px;display:block;height:0;position:absolute;top:50%;width:0}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{clear:none;cursor:pointer;display:block;float:left;margin-right:0;min-height:inherit;opacity:.4;overflow:hidden;padding:0;position:relative;width:120px}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:.8}.clearing-assembled .clearing-container .visible-img{background:#333;height:85%;overflow:hidden}.clearing-close{padding-left:0;padding-top:0;position:absolute;top:10px;right:20px}}.progress{background-color:#F6F6F6;border:1px solid #fff;height:1.5625rem;margin-bottom:0.625rem;padding:0.125rem}.progress .meter{background:#008CBA;display:block;height:100%}.progress.secondary .meter{background:#e7e7e7;display:block;height:100%}.progress.success .meter{background:#43AC6A;display:block;height:100%}.progress.alert .meter{background:#f04124;display:block;height:100%}.progress.radius{border-radius:3px}.progress.radius .meter{border-radius:2px}.progress.round{border-radius:1000px}.progress.round .meter{border-radius:999px}.sub-nav{display:block;margin:-0.25rem 0 1.125rem;overflow:hidden;padding-top:0.25rem;width:auto}.sub-nav dt{text-transform:uppercase}.sub-nav dt,.sub-nav dd,.sub-nav li{color:#999;float:left;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.875rem;font-weight:normal;margin-left:1rem;margin-bottom:0}.sub-nav dt a,.sub-nav dd a,.sub-nav li a{color:#999;padding:0.1875rem 1rem;text-decoration:none}.sub-nav dt a:hover,.sub-nav dd a:hover,.sub-nav li a:hover{color:#737373}.sub-nav dt.active a,.sub-nav dd.active a,.sub-nav li.active a{border-radius:3px;background:#008CBA;color:#fff;cursor:default;font-weight:normal;padding:0.1875rem 1rem}.sub-nav dt.active a:hover,.sub-nav dd.active a:hover,.sub-nav li.active a:hover{background:#0078a0}.joyride-list{display:none}.joyride-tip-guide{background:#333;color:#fff;display:none;font-family:inherit;font-weight:normal;position:absolute;top:0;width:95%;z-index:101;left:2.5%}.lt-ie9 .joyride-tip-guide{margin-left:-400px;max-width:800px;left:50%}.joyride-content-wrapper{padding:1.125rem 1.25rem 1.5rem;width:100%}.joyride-content-wrapper .button{margin-bottom:0 !important}.joyride-content-wrapper .joyride-prev-tip{margin-right:10px}.joyride-tip-guide .joyride-nub{border:10px solid #333;display:block;height:0;position:absolute;width:0;left:22px}.joyride-tip-guide .joyride-nub.top{border-color:#333;border-top-color:transparent !important;border-top-style:solid;border-left-color:transparent !important;border-right-color:transparent !important;top:-20px}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-bottom-style:solid;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{right:-20px}.joyride-tip-guide .joyride-nub.left{left:-20px}.joyride-tip-guide h1,.joyride-tip-guide h2,.joyride-tip-guide h3,.joyride-tip-guide h4,.joyride-tip-guide h5,.joyride-tip-guide h6{color:#fff;font-weight:bold;line-height:1.25;margin:0}.joyride-tip-guide p{font-size:0.875rem;line-height:1.3;margin:0 0 1.125rem 0}.joyride-timer-indicator-wrap{border:solid 1px #555;bottom:1rem;height:3px;position:absolute;width:50px;right:1.0625rem}.joyride-timer-indicator{background:#666;display:block;height:inherit;width:0}.joyride-close-tip{color:#777 !important;font-size:24px;font-weight:normal;line-height:.5 !important;position:absolute;text-decoration:none;top:10px;right:12px}.joyride-close-tip:hover,.joyride-close-tip:focus{color:#eee !important}.joyride-modal-bg{background:rgba(0,0,0,0.5);cursor:pointer;display:none;height:100%;position:fixed;top:0;width:100%;z-index:100;left:0}.joyride-expose-wrapper{background-color:#fff;border-radius:3px;box-shadow:0 0 15px #fff;position:absolute;z-index:102}.joyride-expose-cover{background:transparent;border-radius:3px;left:0;position:absolute;top:0;z-index:9999}@media only screen and (min-width: 40.0625em){.joyride-tip-guide{width:300px;left:inherit}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{border-color:#333 !important;border-right-color:transparent !important;border-bottom-color:transparent !important;border-top-color:transparent !important;left:auto;right:-20px;top:22px}.joyride-tip-guide .joyride-nub.left{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-top-color:transparent !important;left:-20px;right:auto;top:22px}}.label{display:inline-block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:1;margin-bottom:auto;position:relative;text-align:center;text-decoration:none;white-space:nowrap;padding:0.25rem 0.5rem 0.25rem;font-size:0.6875rem;background-color:#008CBA;color:#fff}.label.radius{border-radius:3px}.label.round{border-radius:1000px}.label.alert{background-color:#f04124;color:#fff}.label.warning{background-color:#f08a24;color:#fff}.label.success{background-color:#43AC6A;color:#fff}.label.secondary{background-color:#e7e7e7;color:#333}.label.info{background-color:#a0d3e8;color:#333}.off-canvas-wrap{-webkit-backface-visibility:hidden;position:relative;width:100%;overflow:hidden}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left{min-height:100%;-webkit-overflow-scrolling:touch}.inner-wrap{position:relative;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.inner-wrap:before,.inner-wrap:after{content:" ";display:table}.inner-wrap:after{clear:both}.tab-bar{-webkit-backface-visibility:hidden;background:#333;color:#fff;height:2.8125rem;line-height:2.8125rem;position:relative}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4,.tab-bar h5,.tab-bar h6{color:#fff;font-weight:bold;line-height:2.8125rem;margin:0}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4{font-size:1.125rem}.left-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-right:solid 1px #1a1a1a;left:0}.right-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-left:solid 1px #1a1a1a;right:0}.tab-bar-section{height:2.8125rem;padding:0 0.625rem;position:absolute;text-align:center;top:0}.tab-bar-section.left{text-align:left}.tab-bar-section.right{text-align:right}.tab-bar-section.left{left:0;right:2.8125rem}.tab-bar-section.right{left:2.8125rem;right:0}.tab-bar-section.middle{left:2.8125rem;right:2.8125rem}.tab-bar .menu-icon{color:#fff;display:block;height:2.8125rem;padding:0;position:relative;text-indent:2.1875rem;transform:translate3d(0, 0, 0);width:2.8125rem}.tab-bar .menu-icon span::after{content:"";display:block;height:0;position:absolute;top:50%;margin-top:-0.5rem;left:0.90625rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:1rem}.tab-bar .menu-icon span:hover:after{box-shadow:0 0 0 1px #b3b3b3,0 7px 0 1px #b3b3b3,0 14px 0 1px #b3b3b3}.left-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.left-off-canvas-menu *{-webkit-backface-visibility:hidden}.right-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0}.right-off-canvas-menu *{-webkit-backface-visibility:hidden}ul.off-canvas-list{list-style-type:none;margin:0;padding:0}ul.off-canvas-list li label{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;display:block;font-size:0.75rem;font-weight:bold;margin:0;padding:0.3rem 0.9375rem;text-transform:uppercase}ul.off-canvas-list li a{border-bottom:1px solid #262626;color:rgba(255,255,255,0.7);display:block;padding:0.66667rem;transition:background 300ms ease}ul.off-canvas-list li a:hover{background:#242424}ul.off-canvas-list li a:active{background:#242424}.move-right>.inner-wrap{-webkit-transform:translate3d(15.625rem, 0, 0);-moz-transform:translate3d(15.625rem, 0, 0);-ms-transform:translate(15.625rem, 0);-ms-transform:translate3d(15.625rem, 0, 0);-o-transform:translate3d(15.625rem, 0, 0);transform:translate3d(15.625rem, 0, 0)}.move-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.move-left>.inner-wrap{-webkit-transform:translate3d(-15.625rem, 0, 0);-moz-transform:translate3d(-15.625rem, 0, 0);-ms-transform:translate(-15.625rem, 0);-ms-transform:translate3d(-15.625rem, 0, 0);-o-transform:translate3d(-15.625rem, 0, 0);transform:translate3d(-15.625rem, 0, 0)}.move-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap .left-off-canvas-menu,.offcanvas-overlap .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-left .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-right .left-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.no-csstransforms .left-off-canvas-menu{left:-15.625rem}.no-csstransforms .right-off-canvas-menu{right:-15.625rem}.no-csstransforms .move-left>.inner-wrap{right:15.625rem}.no-csstransforms .move-right>.inner-wrap{left:15.625rem}.left-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;z-index:1002;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.left-submenu *{-webkit-backface-visibility:hidden}.left-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.left-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.left-submenu .back>a:before{content:"\AB";margin-right:.5rem;display:inline}.left-submenu.move-right,.left-submenu.offcanvas-overlap-right,.left-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.right-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;z-index:1002;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.right-submenu *{-webkit-backface-visibility:hidden}.right-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.right-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.right-submenu .back>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-submenu.move-left,.right-submenu.offcanvas-overlap-left,.right-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.left-off-canvas-menu ul.off-canvas-list li.has-submenu>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-off-canvas-menu ul.off-canvas-list li.has-submenu>a:before{content:"\AB";margin-right:.5rem;display:inline}.f-dropdown{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:2px;max-width:200px}.f-dropdown.open{display:block}.f-dropdown>*:first-child{margin-top:0}.f-dropdown>*:last-child{margin-bottom:0}.f-dropdown:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent transparent #fff transparent;border-bottom-style:solid;position:absolute;top:-12px;left:10px;z-index:89}.f-dropdown:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent transparent #ccc transparent;border-bottom-style:solid;position:absolute;top:-14px;left:9px;z-index:88}.f-dropdown.right:before{left:auto;right:10px}.f-dropdown.right:after{left:auto;right:9px}.f-dropdown.drop-right{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:0;margin-left:2px;max-width:200px}.f-dropdown.drop-right.open{display:block}.f-dropdown.drop-right>*:first-child{margin-top:0}.f-dropdown.drop-right>*:last-child{margin-bottom:0}.f-dropdown.drop-right:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent #fff transparent transparent;border-right-style:solid;position:absolute;top:10px;left:-12px;z-index:89}.f-dropdown.drop-right:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent #ccc transparent transparent;border-right-style:solid;position:absolute;top:9px;left:-14px;z-index:88}.f-dropdown.drop-left{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-top:0;margin-left:-2px;max-width:200px}.f-dropdown.drop-left.open{display:block}.f-dropdown.drop-left>*:first-child{margin-top:0}.f-dropdown.drop-left>*:last-child{margin-bottom:0}.f-dropdown.drop-left:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent #fff;border-left-style:solid;position:absolute;top:10px;right:-12px;left:auto;z-index:89}.f-dropdown.drop-left:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:transparent transparent transparent #ccc;border-left-style:solid;position:absolute;top:9px;right:-14px;left:auto;z-index:88}.f-dropdown.drop-top{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;width:100%;z-index:89;margin-left:0;margin-top:-2px;max-width:200px}.f-dropdown.drop-top.open{display:block}.f-dropdown.drop-top>*:first-child{margin-top:0}.f-dropdown.drop-top>*:last-child{margin-bottom:0}.f-dropdown.drop-top:before{border:inset 6px;content:"";display:block;height:0;width:0;border-color:#fff transparent transparent transparent;border-top-style:solid;bottom:-12px;position:absolute;top:auto;left:10px;right:auto;z-index:89}.f-dropdown.drop-top:after{border:inset 7px;content:"";display:block;height:0;width:0;border-color:#ccc transparent transparent transparent;border-top-style:solid;bottom:-14px;position:absolute;top:auto;left:9px;right:auto;z-index:88}.f-dropdown li{cursor:pointer;font-size:0.875rem;line-height:1.125rem;margin:0}.f-dropdown li:hover,.f-dropdown li:focus{background:#eee}.f-dropdown li.radius{border-radius:3px}.f-dropdown li a{display:block;padding:0.5rem;color:#555}.f-dropdown.content{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ccc;font-size:0.875rem;height:auto;max-height:none;padding:1.25rem;width:100%;z-index:89;max-width:200px}.f-dropdown.content.open{display:block}.f-dropdown.content>*:first-child{margin-top:0}.f-dropdown.content>*:last-child{margin-bottom:0}.f-dropdown.tiny{max-width:200px}.f-dropdown.small{max-width:300px}.f-dropdown.medium{max-width:500px}.f-dropdown.large{max-width:800px}.f-dropdown.mega{width:100% !important;max-width:100% !important}.f-dropdown.mega.open{left:0 !important}table{background:#fff;border:solid 1px #ddd;margin-bottom:1.25rem;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#F5F5F5}table thead tr th,table thead tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tfoot{background:#F5F5F5}table tfoot tr th,table tfoot tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tr th,table tr td{color:#222;font-size:0.875rem;padding:0.5625rem 0.625rem;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.range-slider{border:1px solid #ddd;margin:1.25rem 0;position:relative;-ms-touch-action:none;touch-action:none;display:block;height:1rem;width:100%;background:#FAFAFA}.range-slider.vertical-range{border:1px solid #ddd;margin:1.25rem 0;position:relative;-ms-touch-action:none;touch-action:none;display:inline-block;height:12.5rem;width:1rem}.range-slider.vertical-range .range-slider-handle{bottom:-10.5rem;margin-left:-0.5rem;margin-top:0;position:absolute}.range-slider.vertical-range .range-slider-active-segment{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top-left-radius:initial;bottom:0;height:auto;width:0.875rem}.range-slider.radius{background:#FAFAFA;border-radius:3px}.range-slider.radius .range-slider-handle{background:#008CBA;border-radius:3px}.range-slider.radius .range-slider-handle:hover{background:#007ba4}.range-slider.round{background:#FAFAFA;border-radius:1000px}.range-slider.round .range-slider-handle{background:#008CBA;border-radius:1000px}.range-slider.round .range-slider-handle:hover{background:#007ba4}.range-slider.disabled,.range-slider[disabled]{background:#FAFAFA;cursor:not-allowed;opacity:0.7}.range-slider.disabled .range-slider-handle,.range-slider[disabled] .range-slider-handle{background:#008CBA;cursor:default;opacity:0.7}.range-slider.disabled .range-slider-handle:hover,.range-slider[disabled] .range-slider-handle:hover{background:#007ba4}.range-slider-active-segment{background:#e5e5e5;border-bottom-left-radius:inherit;border-top-left-radius:inherit;display:inline-block;height:0.875rem;position:absolute}.range-slider-handle{border:1px solid none;cursor:pointer;display:inline-block;height:1.375rem;position:absolute;top:-0.3125rem;width:2rem;z-index:1;-ms-touch-action:manipulation;touch-action:manipulation;background:#008CBA}.range-slider-handle:hover{background:#007ba4}[class*="block-grid-"]{display:block;padding:0;margin:0 -0.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;float:left;height:auto;padding:0 0.625rem 1.25rem}@media only screen{.small-block-grid-1>li{list-style:none;width:100%}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{list-style:none;width:50%}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{list-style:none;width:33.33333%}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{list-style:none;width:25%}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{list-style:none;width:20%}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{list-style:none;width:16.66667%}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{list-style:none;width:14.28571%}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{list-style:none;width:12.5%}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{list-style:none;width:11.11111%}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{list-style:none;width:10%}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{list-style:none;width:9.09091%}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{list-style:none;width:8.33333%}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{list-style:none;width:100%}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{list-style:none;width:50%}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{list-style:none;width:33.33333%}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{list-style:none;width:25%}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{list-style:none;width:20%}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{list-style:none;width:16.66667%}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{list-style:none;width:14.28571%}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{list-style:none;width:12.5%}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{list-style:none;width:11.11111%}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{list-style:none;width:10%}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{list-style:none;width:9.09091%}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{list-style:none;width:8.33333%}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{list-style:none;width:100%}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{list-style:none;width:50%}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{list-style:none;width:33.33333%}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{list-style:none;width:25%}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{list-style:none;width:20%}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{list-style:none;width:16.66667%}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{list-style:none;width:14.28571%}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{list-style:none;width:12.5%}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{list-style:none;width:11.11111%}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{list-style:none;width:10%}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{list-style:none;width:9.09091%}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{list-style:none;width:8.33333%}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}.flex-video{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:67.5%;padding-top:1.5625rem;position:relative}.flex-video.widescreen{padding-bottom:56.34%}.flex-video.vimeo{padding-top:0}.flex-video iframe,.flex-video object,.flex-video embed,.flex-video video{height:100%;position:absolute;top:0;width:100%;left:0}.keystroke,kbd{background-color:#ededed;border-color:#ddd;color:#222;border-style:solid;border-width:1px;font-family:"Consolas","Menlo","Courier",monospace;font-size:inherit;margin:0;padding:0.125rem 0.25rem 0;border-radius:3px}.switch{border:none;margin-bottom:1.5rem;outline:0;padding:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{background:#ddd;color:transparent;cursor:pointer;display:block;margin-bottom:1rem;position:relative;text-indent:100%;width:4rem;height:2rem;transition:left 0.15s ease-out}.switch input{left:10px;opacity:0;padding:0;position:absolute;top:9px}.switch input+label{margin-left:0;margin-right:0}.switch label:after{background:#fff;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;width:1.5rem;-webkit-transition:left 0.15s ease-out;-moz-transition:left 0.15s ease-out;-o-transition:translate3d(0, 0, 0);transition:left 0.15s ease-out;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.switch input:checked+label{background:#008CBA}.switch input:checked+label:after{left:2.25rem}.switch label{height:2rem;width:4rem}.switch label:after{height:1.5rem;width:1.5rem}.switch input:checked+label:after{left:2.25rem}.switch label{color:transparent;background:#ddd}.switch label:after{background:#fff}.switch input:checked+label{background:#008CBA}.switch.large label{height:2.5rem;width:5rem}.switch.large label:after{height:2rem;width:2rem}.switch.large input:checked+label:after{left:2.75rem}.switch.small label{height:1.75rem;width:3.5rem}.switch.small label:after{height:1.25rem;width:1.25rem}.switch.small input:checked+label:after{left:2rem}.switch.tiny label{height:1.5rem;width:3rem}.switch.tiny label:after{height:1rem;width:1rem}.switch.tiny input:checked+label:after{left:1.75rem}.switch.radius label{border-radius:4px}.switch.radius label:after{border-radius:3px}.switch.round{border-radius:1000px}.switch.round label{border-radius:2rem}.switch.round label:after{border-radius:2rem}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.show-for-sr{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus:focus,.show-on-focus:active{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.print-only{display:none !important}@media print{*{background:transparent !important;box-shadow:none !important;color:#000 !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}@media not print{.show-for-print{display:none !important}}
diff --git a/webroot/css/home.css b/webroot/css/home.css
new file mode 100644
index 0000000..6e2312f
--- /dev/null
+++ b/webroot/css/home.css
@@ -0,0 +1,240 @@
+@font-face {
+ font-family: 'cakefont';
+ src: url('../font/cakedingbats-webfont.eot');
+ src: url('../font/cakedingbats-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../font/cakedingbats-webfont.woff2') format('woff2'),
+ url('../font/cakedingbats-webfont.woff') format('woff'),
+ url('../font/cakedingbats-webfont.ttf') format('truetype'),
+ url('../font/cakedingbats-webfont.svg#cake_dingbatsregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+.home {
+ font-family: 'Roboto', sans-serif;
+ font-size: 14px;
+ line-height: 27px;
+ color: #404041;
+}
+
+a {
+ color: #0071BC;
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -ms-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+
+a:hover, a:active {
+ color: #d33d44;
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -ms-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+
+ul, ol, dl, p {
+ font-size: 0.85rem;
+}
+
+p {
+ line-height: 2;
+}
+
+header {
+ height: auto;
+ line-height: 1em;
+ padding: 0;
+ box-shadow: none;
+}
+
+header.row {
+ margin-bottom: 30px;
+}
+
+header .header-image {
+ text-align: center;
+ padding: 64px 0;
+}
+
+header .header-title {
+ padding: 0;
+ display: block;
+ background: #404041;
+ text-align: center;
+}
+
+header .header-title h1 {
+ font-family: 'Raleway', sans-serif;
+ margin: 0;
+ font-style: italic;
+ font-size: 18px;
+ font-weight: 500;
+ padding: 18px 30px;
+ color: #DEDED5;
+}
+
+header h1 {
+ color: #fff;
+}
+
+h3, h4 {
+ font-family: 'Roboto', sans-serif;
+ font-size: 27px;
+ line-height: 30px;
+ font-weight: 300;
+ -webkit-font-smoothing: antialiased;
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+.more {
+ color: #ffffff;
+ background-color: #d33d44;
+ padding: 15px;
+ margin-top: 10px;
+}
+
+.row {
+ max-width: 1000px;
+}
+
+.alert {
+ background-color: #fff9e1;
+ font-size: 12px;
+ text-align: center;
+ display: block;
+ padding: 12px;
+ border-bottom: 2px solid #ffcf06;
+}
+
+.alert {
+ background-color: #fff9e1;
+ font-size: 12px;
+ display: block;
+ padding: 12px;
+ border-bottom: 2px solid #ffcf06;
+ margin-bottom: 30px;
+ color: #404041;
+}
+
+.alert p {
+ margin: 0;
+ font-size: 12px;
+ line-height: 1.4;
+}
+
+.alert p:before {
+ color: #ffcf06;
+ content: "\0055";
+ font-family: 'cakefont', sans-serif;
+ font-size: 21px;
+ margin-left: -0.8em;
+ width: 2.3em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ padding: 0 10px 0 15px;
+ vertical-align: -2px;
+}
+
+.alert ul {
+ margin: 0;
+ font-size: 12px;
+}
+
+.alert.url-rewriting {
+ background-color: #F0F0F0;
+ border-color: #cccccc;
+ display: none;
+}
+
+.text-center {
+ text-align: center;
+}
+
+ul {
+ list-style-type: none;
+ margin: 0 0 30px 0;
+}
+
+li {
+ padding-left: 1.8em;
+}
+
+ul li ul, ul li ul li {
+ margin: 0;
+ padding: 0;
+}
+
+.bullet:before {
+ font-family: 'cakefont', sans-serif;
+ font-size: 18px;
+ display: inline-block;
+ margin-left: -1.3em;
+ width: 1.2em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ vertical-align: -1px;
+}
+
+.success:before {
+ color: #88c671;
+ content: "\0056";
+}
+
+.problem:before {
+ color: #d33d44;
+ content: "\0057";
+}
+
+.cutlery:before {
+ color: #404041;
+ content: "\0059";
+}
+
+.book:before {
+ color: #404041;
+ content: "\0042";
+ width: 1.7em;
+}
+
+hr {
+ border-bottom: 1px solid #e7e7e7;
+ border-top: 0;
+ margin-bottom: 35px;
+ margin-left: 30px;
+ margin-right: 30px;
+}
+
+
+.icon {
+ color: #404041;
+ font-style: normal;
+ font-family: 'cakefont', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.icon.support {
+ font-size: 60px;
+}
+.icon.docs {
+ font-size: 57px;
+}
+.icon.training {
+ font-size: 39px;
+}
+
+@media (min-width: 768px) {
+ .columns {
+ padding-left: 30px;
+ padding-right: 30px;
+ }
+}
+
+@media (min-width: 992px) {
+ header.row {
+ max-width: 940px;
+ }
+}
diff --git a/webroot/css/style.css b/webroot/css/style.css
new file mode 100644
index 0000000..40c1d2a
--- /dev/null
+++ b/webroot/css/style.css
@@ -0,0 +1,524 @@
+.disabled a,
+a.disabled {
+ pointer-events: none;
+}
+
+a:hover {
+ color: #15848F;
+}
+
+a {
+ color: #1798A5;
+}
+
+.side-nav li a:not(.button) {
+ color: #15848F;
+}
+
+.side-nav li a:not(.button):hover {
+ color: #15848F;
+}
+
+header {
+ background-color: #D33C44;
+ color: #ffffff;
+ font-size: 30px;
+ height: 84px;
+ line-height: 64px;
+ padding: 16px 0px;
+ box-shadow: 0px 1px rgba(0, 0, 0, 0.24);
+}
+
+header .header-title {
+ padding-left:80px
+}
+
+legend {
+ color:#15848F;
+}
+
+.row {
+ max-width: 80rem;
+}
+
+.actions.columns {
+ margin-top:1rem;
+ border-left: 5px solid #15848F;
+ padding-left: 15px;
+ padding: 32px 20px;
+}
+
+.actions.columns h3 {
+ color:#15848F;
+}
+
+.related table {
+ border: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+.index table thead {
+ height: 3.5rem;
+}
+
+.header-help {
+ float: right;
+ margin-right:2rem;
+ margin-top: -80px;
+ font-size:16px;
+}
+
+.header-help span {
+ font-weight: normal;
+ text-align: center;
+ text-decoration: none;
+ line-height: 1;
+ white-space: nowrap;
+ display: inline-block;
+ padding: 0.25rem 0.5rem 0.375rem;
+ font-size: 0.8rem;
+ background-color: #0097a7;
+ color: #FFF;
+ border-radius: 1000px;
+}
+
+.header-help a {
+ color: #fff;
+}
+
+ul.pagination li a {
+ color: rgba(0, 0 ,0 , 0.54);
+}
+
+ul.pagination li.active a {
+ background-color: #DCE47E;
+ color: #FFF;
+ font-weight: bold;
+ cursor: default;
+}
+ul.pagination .disabled:hover a {
+ background: none;
+}
+
+.paginator {
+ text-align: center;
+}
+
+.paginator ul.pagination li {
+ float: none;
+ display: inline-block;
+}
+
+.paginator p {
+ text-align: right;
+ color: rgba(0, 0 ,0 , 0.54);
+}
+
+.asc:after {
+ content: " \2193";
+}
+.desc:after {
+ content: " \2191";
+}
+
+.form .error-message {
+ display: block;
+ padding: 0.375rem 0.5625rem 0.5625rem;
+ margin-top: -1px;
+ margin-bottom: 1rem;
+ font-size: 0.75rem;
+ font-weight: normal;
+ font-style: italic;
+ color: rgba(0, 0, 0, 0.54);
+}
+
+.required > label {
+ font-weight: bold;
+}
+.required > label:after {
+ content: ' *';
+ color: #C3232D;
+}
+
+select[multiple] {
+ min-height:150px;
+ background: none;
+}
+input[type=checkbox],
+input[type=radio] {
+ margin-right: 0.5em;
+}
+
+.date select,
+.time select,
+.datetime select {
+ display: inline;
+ width: auto;
+ margin-right: 10px;
+}
+
+.error label,
+.error label.error {
+ color: #C3232D;
+}
+
+.view h2 {
+ color: #6F6F6F;
+}
+
+.view .columns.strings {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+}
+
+.view .numbers {
+ background-color: #B7E3EC;
+ color: #FFF;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right: 0.7rem;
+}
+
+.view .columns.dates {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+ background-color:#DCE47E;
+ color: #fff;
+}
+
+.view .columns.booleans {
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-right:0.7rem;
+ background-color: #8D6E65;
+ color: #fff;
+}
+
+.view .strings p {
+ border-bottom: 1px solid #eee;
+}
+.view .numbers .subheader, .view .dates .subheader {
+ color:#747474;
+}
+.view .booleans .subheader {
+ color: #E9E9E9
+}
+
+.view .texts .columns {
+ margin-top:1.2rem;
+ border-bottom: 1px solid #eee;
+}
+
+/** Notices and Errors **/
+.cake-error,
+.cake-debug,
+.notice,
+p.error,
+p.notice {
+ display: block;
+ clear: both;
+ background-repeat: repeat-x;
+ margin-bottom: 18px;
+ padding: 7px 14px;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+}
+
+.cake-debug,
+.notice,
+p.notice {
+ color: #000000;
+ background: #ffcc00;
+}
+
+.cake-error,
+p.error {
+ color: #fff;
+ background: #C3232D;
+}
+
+pre {
+ background: none repeat scroll 0% 0% #FFF;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin: 15px 0px;
+ color: rgba(0, 0 ,0 , 0.74);
+ padding:5px;
+}
+
+.cake-error .cake-stack-trace {
+ margin-top:10px;
+}
+
+.cake-stack-trace code {
+ background: inherit;
+ border:0;
+}
+
+.cake-code-dump .code-highlight {
+ display: block;
+ background-color: #FFC600;
+}
+
+.cake-error a,
+.cake-error a:hover {
+ color:#fff;
+ text-decoration: underline;
+}
+
+.checks {
+ padding:30px;
+ color: #626262;
+ background-color: #B7E3EC;
+ border-radius: 3px;
+ box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.24);
+ margin-bottom: 2em;
+}
+
+.checks h4 {
+ margin-bottom: 1.5rem;
+}
+
+.checks hr {
+ border: 0;
+ height: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3);
+}
+
+.checks .success,
+.checks .problem {
+ margin-left: 10px;
+}
+.checks .success:before,
+.checks .problem:before {
+ line-height: 0px;
+ font-size: 28px;
+ height: 12px;
+ width: 12px;
+ border-radius: 15px;
+ text-align: center;
+ vertical-align: middle;
+ display: inline-block;
+ position: relative;
+ left: -11px;
+}
+
+.checks .success:before {
+ content: "✓";
+ color: green;
+ margin-right: 9px;
+}
+
+.checks .problem:before {
+ content: "✘";
+ color: red;
+ margin-right: 9px;
+}
+
+.top-bar.expanded .title-area {
+ background: #01545b;
+}
+
+.top-bar.expanded, .top-bar,.top-bar-section ul li,.top-bar-section li:not(.has-form) a:not(.button) {
+ background: #116d76;
+}
+
+.top-bar-section li:not(.has-form) a:not(.button):hover {
+ background-color: #308e97;
+ background: #308e97;
+}
+
+.side-nav li.heading {
+ color: #1798A5;
+ font-size: 0.875rem;
+ font-weight: bold;
+ text-transform: uppercase;
+ padding: 0.4375rem 0.875rem;
+}
+
+#actions-sidebar {
+ background: #fafafa;
+}
+
+.index table {
+ margin-top: 0rem;
+ border: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+table {
+ background: #fff;
+ margin-bottom: 1.25rem;
+ border: none;
+ table-layout: fixed;
+ width: 100%;
+}
+
+table thead {
+ background: none;
+}
+
+table tr {
+ border-bottom: 1px solid #ebebec;
+}
+
+table thead tr {
+ border-bottom: 1px solid #1798A5;
+}
+
+table tr th {
+ padding: 0.5625rem 0.625rem;
+ font-size: 0.875rem;
+ color: #1798A5;
+ text-align: left;
+ border-bottom: 2px solid #1798A5;
+}
+
+table tr:nth-of-type(even) {
+ background: none;
+}
+
+fieldset {
+ border: none;
+ padding: 1.25rem;
+ margin: 1.125rem 0;
+}
+
+fieldset legend {
+ border-bottom: 2px solid #1798A5;
+ width: 100%;
+ line-height: 2rem;
+}
+
+.form button[type="submit"] {
+ float: right;
+ text-transform: uppercase;
+ box-shadow: none;
+}
+
+.form button:hover, .form button:focus {
+ background: #BE840B;
+ box-shadow: none;
+}
+
+button {
+ background: #966600;
+}
+
+div.message {
+ text-align: center;
+ cursor: pointer;
+ display: block;
+ font-weight: normal;
+ padding: 0 1.5rem 0 1.5rem;
+ transition: height 300ms ease-out 0s;
+ background-color: #a0d3e8;
+ color: #626262;
+ top: 15px;
+ right: 15px;
+ z-index: 999;
+ overflow: hidden;
+ height: 50px;
+ line-height: 2.5em;
+}
+
+div.message:before {
+ line-height: 0px;
+ font-size: 20px;
+ height: 12px;
+ width: 12px;
+ border-radius: 15px;
+ text-align: center;
+ vertical-align: middle;
+ display: inline-block;
+ position: relative;
+ left: -11px;
+ background-color: #FFF;
+ padding: 12px 14px 12px 10px;
+ content: "i";
+ color: #a0d3e8;
+}
+
+div.message.error {
+ background-color: #C3232D;
+ color: #FFF;
+}
+
+div.message.error:before {
+ padding: 11px 16px 14px 7px;
+ color: #C3232D;
+ content: "x";
+}
+div.message.hidden {
+ height: 0;
+}
+
+
+.vertical-table th {
+ padding: 0.5625rem 0.625rem;
+ font-size: 0.875rem;
+ color: #1798A5;
+ border: none;
+ text-align: left;
+}
+
+.vertical-table {
+ vertical-align: middle;
+}
+
+.vertical-table td {
+ text-align: right;
+}
+
+.content {
+ padding: 2rem;
+}
+
+/* Use 'one true layout' methods to get equal height columns */
+.container {
+ overflow: hidden;
+ min-height: 92%; /* full height almost always */
+}
+
+/* Force equal height by overflowing */
+.content,
+#actions-sidebar {
+ margin-bottom: -99999px;
+ padding-bottom: 99999px;
+}
+@media(max-width: 640px) {
+ #actions-sidebar {
+ padding-bottom: 2rem;
+ margin-bottom: 0;
+ }
+}
+
+.content h3 {
+ color: #be140b;
+ padding-bottom: 0.5rem;
+ margin-bottom: 20px;
+}
+
+.content h4 {
+ color: #be140b;
+ padding-bottom: 0.5rem;
+ margin-bottom: 20px;
+ border-bottom: 2px solid #be140b;
+}
+
+.content .related h4 {
+ color: #4d8f97;
+ padding-bottom: 0.5rem;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ border-bottom: 0px;
+}
+
+table td {
+ vertical-align: top;
+ word-break: break-all;
+}
diff --git a/demo/css/style.css b/webroot/css/stylelr.css
similarity index 52%
rename from demo/css/style.css
rename to webroot/css/stylelr.css
index 74f1203..43c4785 100644
--- a/demo/css/style.css
+++ b/webroot/css/stylelr.css
@@ -1,22 +1,14 @@
body {
margin: 0;
background-color: #f9f9f9;
- color: #384049;
font-family: "-apple-system", "system-ui", "Helvetica Neue", "Helvetica", "Arial", "sans-serif";
font-size: 15px;
}
table {
- min-width: 200px;
- margin-left: auto;
- margin-right: auto;
font-size: 15px;
}
-td {
- text-align: left;
-}
-
input {
width: 170px;
height: 22px;
@@ -24,7 +16,7 @@ input {
}
button {
- background-color: #35A8FF;
+ background-color: #2299DD;
color: white;
border: none;
text-align: center;
@@ -39,22 +31,6 @@ hr {
width: 55%;
}
-.table-style td, .table-style th {
- border: 1px solid #dddddd;
- text-align: left;
- padding: 4px;
-}
-
-.table-style tr:nth-child(even) {
- background-color: #dddddd;
-}
-
-.navbar-ul {
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-
.section-menu {
position: fixed;
background-color: white;
@@ -64,7 +40,6 @@ hr {
border-right-width: 1px;
border-right-color: #EEEEEE;
text-align: center;
- overflow: auto;
}
.section-menu img {
@@ -72,57 +47,66 @@ hr {
margin: 10px 10px 0px 10px;
}
+.section-main {
+ width: 70vw;
+ min-width: 250px;
+ margin-left: 250px;
+ text-align: center;
+}
+
+.section-minimal {
+ padding: 100px 5vh 5vh 5vh;
+}
+
+.section-ls {
+ padding: 5vh;
+}
+
+.button-group {
+ margin-top: 20px;
+}
+
.button-group a {
- float: left;
background-color: white;
color: #384049;
border-top: 1px solid #D3D3D3;
border-bottom: 1px solid #D3D3D3;
padding: 10px 24px;
- margin-top: 5px;
cursor: pointer;
text-decoration: none;
width: 77px;
- font-size: 13px;
- white-space: nowrap;
}
.button-group a:hover {
background-color: #D3D3D3;
}
-.section-main {
- padding: 5vh;
- width: 70vw;
- min-width: 250px;
- margin-left: 250px;
- text-align: center;
-}
-
-.right-elem {
- display: none;
+.table-style td, .table-style th {
+ border: 1px solid #dddddd;
+ text-align: left;
+ padding: 8px;
}
-.visible {
- display: block;
+.table-style tr:nth-child(even) {
+ background-color: #dddddd;
}
-.container {
+.container-small {
background-color: #eee;
+ height: 120px;
width: 400px;
- padding: 20px;
- margin: auto;
+ padding: 30px 20px 0 20px;
}
-.customobj-container {
+/* no height */
+.container {
background-color: #eee;
- width: 600px;
- padding: 20px;
- margin: auto;
+ width: 400px;
+ padding: 30px 20px 30px 20px;
}
.vertical-menu {
- margin-top: 44px;
+ margin-top: 46px;
width: 100%;
border: 0px solid lightgray;
}
@@ -145,17 +129,9 @@ hr {
font-style: italic;
}
-.error-message {
- color: red;
-}
-
-.success-message {
- color: green;
-}
-
#customobj-container {
background-color: #eee;
- height: 650px;
+ height: 600px;
width: 400px;
padding: 30px 20px 0 20px;
}
@@ -166,42 +142,36 @@ hr {
display: inline-block;
width: 43px;
height: 40px;
- background-image:url("../icons/icon-sprite-32.png");
+ background-image:url("../img/icon-sprite-32.png");
border-radius: 5px;
- /*default*/
background-position: 0px 0px;
background-color: lightgray;
}
-.lr-ls-icon-Twitter {
+.lr-ls-icon-twitter {
background-position: 0px 9.6%;
- background-color: #35A8FF;
+ background-color: #55acee;
}
-.lr-ls-icon-Facebook {
- background-position: 0px 2.45%;
+.lr-ls-icon-facebook {
+ background-position: 0px 2.4%;
background-color: #3b5998;
}
-.lr-ls-icon-LinkedIn {
+.lr-ls-icon-linkedin {
background-position: 0px 7.2%;
background-color: #007bb6;
}
-.lr-ls-icon-Google {
+.lr-ls-icon-google {
background-position: 0px 4.8%;
background-color: #dd4b39;
}
-.lr-ls-icon-Instagram {
- background-position: 0px 28.65%;
+.lr-ls-icon-instagram {
+ background-position: 0px 28.6%;
background-color: #406e94;
}
-
-.lr-ls-icon-Vkontakte {
- background-position: 0px 73.9%;
- background-color: #5B88BD
-}
.lr-image-frame {
display: inline-block;
width: 150px;
@@ -214,4 +184,84 @@ hr {
.lr-image-frame img{
width: 100%;
}
+.lr-heading {
+ font-size: 20px;
+ line-height: 30px;
+ font-size: 1.25rem;
+ line-height: 1.875rem;
+}
+.lr-profile-info {
+ font-size: 14px;
+ line-height: 25px;
+ font-size: 0.875rem;
+ line-height: 1.5625rem;
+}
+
+/*==============================================================*/
+.overlay {
+ text-align: center;
+ position: fixed;
+ top: 0;
+ bottom: 60%;
+ left: 0;
+ right: 0;
+ height: 100%;
+ position: fixed;
+ width: 100%;
+ top: 0;
+ z-index: 99999;
+ background: rgb(127, 127, 127); /* The Fallback */
+ background: none no-repeat scroll 0 0 rgba(127, 127, 127, 0.6);
+}
+
+.overlay:before {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+ margin-right: -0.25em; /* Adjusts for spacing */
+}
+
+.lr_loading_screen {
+ background: rgba(0,0,0,.5);
+ height: 100vh;
+ position: relative;
+ z-index: 10000;
+}
+
+.lr_loading_screen_center {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ width: 500px;
+ margin-left: -250px;
+ margin-top: -26px;
+}
+.lr_loading_screen_spinner {
+ height: 52px;
+ width: 52px;
+ margin: 0 auto;
+ display: block;
+ background-image: url(../img/loading.png);
+ animation: lr_loading_screen_animation_spinning .8s linear infinite;
+ background-size: 52px 52px;
+ background-repeat: no-repeat;
+}
+.lr_loading_phrase {
+ color: #fff;
+}
+.lr_loading_phrase, .lr_loading_screen_spinner {
+ backface-visibility: hidden;
+ perspective: 1000;
+}
+@-moz-keyframes lr_loading_screen_animation_spinning
+{0%{transform:rotate(0)}100%{transform:rotate(360deg)}
+}
+@-webkit-keyframes lr_loading_screen_animation_spinning
+{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
+
+@-o-keyframes lr_loading_screen_animation_spinning
+{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
+@keyframes lr_loading_screen_animation_spinning
+{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
\ No newline at end of file
diff --git a/webroot/favicon.ico b/webroot/favicon.ico
new file mode 100644
index 0000000..49a060f
Binary files /dev/null and b/webroot/favicon.ico differ
diff --git a/webroot/font/cakedingbats-webfont.eot b/webroot/font/cakedingbats-webfont.eot
new file mode 100644
index 0000000..e8605d9
Binary files /dev/null and b/webroot/font/cakedingbats-webfont.eot differ
diff --git a/webroot/font/cakedingbats-webfont.svg b/webroot/font/cakedingbats-webfont.svg
new file mode 100644
index 0000000..d1e0c98
--- /dev/null
+++ b/webroot/font/cakedingbats-webfont.svg
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webroot/font/cakedingbats-webfont.ttf b/webroot/font/cakedingbats-webfont.ttf
new file mode 100644
index 0000000..13d5445
Binary files /dev/null and b/webroot/font/cakedingbats-webfont.ttf differ
diff --git a/webroot/font/cakedingbats-webfont.woff b/webroot/font/cakedingbats-webfont.woff
new file mode 100644
index 0000000..073baab
Binary files /dev/null and b/webroot/font/cakedingbats-webfont.woff differ
diff --git a/webroot/font/cakedingbats-webfont.woff2 b/webroot/font/cakedingbats-webfont.woff2
new file mode 100644
index 0000000..6e71eaf
Binary files /dev/null and b/webroot/font/cakedingbats-webfont.woff2 differ
diff --git a/webroot/img/cake-logo.png b/webroot/img/cake-logo.png
new file mode 100644
index 0000000..41939ef
Binary files /dev/null and b/webroot/img/cake-logo.png differ
diff --git a/webroot/img/cake.icon.png b/webroot/img/cake.icon.png
new file mode 100644
index 0000000..394fa42
Binary files /dev/null and b/webroot/img/cake.icon.png differ
diff --git a/webroot/img/cake.logo.svg b/webroot/img/cake.logo.svg
new file mode 100644
index 0000000..e73abb5
--- /dev/null
+++ b/webroot/img/cake.logo.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webroot/img/cake.power.gif b/webroot/img/cake.power.gif
new file mode 100644
index 0000000..8f8d570
Binary files /dev/null and b/webroot/img/cake.power.gif differ
diff --git a/demo/icons/icon-sprite-32.png b/webroot/img/icon-sprite-32.png
similarity index 100%
rename from demo/icons/icon-sprite-32.png
rename to webroot/img/icon-sprite-32.png
diff --git a/webroot/img/line.png b/webroot/img/line.png
new file mode 100644
index 0000000..8ca3334
Binary files /dev/null and b/webroot/img/line.png differ
diff --git a/webroot/img/line.svg b/webroot/img/line.svg
new file mode 100644
index 0000000..e28d0c0
--- /dev/null
+++ b/webroot/img/line.svg
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webroot/img/loading.png b/webroot/img/loading.png
new file mode 100644
index 0000000..84333e4
Binary files /dev/null and b/webroot/img/loading.png differ
diff --git a/webroot/img/login.jpg b/webroot/img/login.jpg
new file mode 100644
index 0000000..6a34f00
Binary files /dev/null and b/webroot/img/login.jpg differ
diff --git a/demo/lr-logo.png b/webroot/img/lr-logo.png
similarity index 100%
rename from demo/lr-logo.png
rename to webroot/img/lr-logo.png
diff --git a/webroot/img/lr_provider_sprite.png b/webroot/img/lr_provider_sprite.png
new file mode 100644
index 0000000..5bd53bb
Binary files /dev/null and b/webroot/img/lr_provider_sprite.png differ
diff --git a/webroot/img/mapping/Pinterest.png b/webroot/img/mapping/Pinterest.png
new file mode 100644
index 0000000..cb16e8a
Binary files /dev/null and b/webroot/img/mapping/Pinterest.png differ
diff --git a/webroot/img/mapping/RAAS.png b/webroot/img/mapping/RAAS.png
new file mode 100644
index 0000000..ab17045
Binary files /dev/null and b/webroot/img/mapping/RAAS.png differ
diff --git a/webroot/img/mapping/amazon.png b/webroot/img/mapping/amazon.png
new file mode 100644
index 0000000..7f8717d
Binary files /dev/null and b/webroot/img/mapping/amazon.png differ
diff --git a/webroot/img/mapping/aol.png b/webroot/img/mapping/aol.png
new file mode 100644
index 0000000..1146402
Binary files /dev/null and b/webroot/img/mapping/aol.png differ
diff --git a/webroot/img/mapping/classmates.png b/webroot/img/mapping/classmates.png
new file mode 100644
index 0000000..f4cebbd
Binary files /dev/null and b/webroot/img/mapping/classmates.png differ
diff --git a/webroot/img/mapping/facebook.png b/webroot/img/mapping/facebook.png
new file mode 100644
index 0000000..78102aa
Binary files /dev/null and b/webroot/img/mapping/facebook.png differ
diff --git a/webroot/img/mapping/foursquare.png b/webroot/img/mapping/foursquare.png
new file mode 100644
index 0000000..c9d9bb0
Binary files /dev/null and b/webroot/img/mapping/foursquare.png differ
diff --git a/webroot/img/mapping/github.png b/webroot/img/mapping/github.png
new file mode 100644
index 0000000..88bcb70
Binary files /dev/null and b/webroot/img/mapping/github.png differ
diff --git a/webroot/img/mapping/google.png b/webroot/img/mapping/google.png
new file mode 100644
index 0000000..aa0d31a
Binary files /dev/null and b/webroot/img/mapping/google.png differ
diff --git a/webroot/img/mapping/hyves.png b/webroot/img/mapping/hyves.png
new file mode 100644
index 0000000..4a01efd
Binary files /dev/null and b/webroot/img/mapping/hyves.png differ
diff --git a/webroot/img/mapping/kaixin.png b/webroot/img/mapping/kaixin.png
new file mode 100644
index 0000000..fcfc320
Binary files /dev/null and b/webroot/img/mapping/kaixin.png differ
diff --git a/webroot/img/mapping/line.png b/webroot/img/mapping/line.png
new file mode 100644
index 0000000..d10eb82
Binary files /dev/null and b/webroot/img/mapping/line.png differ
diff --git a/webroot/img/mapping/linkedin.png b/webroot/img/mapping/linkedin.png
new file mode 100644
index 0000000..e8b0806
Binary files /dev/null and b/webroot/img/mapping/linkedin.png differ
diff --git a/webroot/img/mapping/live.png b/webroot/img/mapping/live.png
new file mode 100644
index 0000000..1c532f2
Binary files /dev/null and b/webroot/img/mapping/live.png differ
diff --git a/webroot/img/mapping/livejournal.png b/webroot/img/mapping/livejournal.png
new file mode 100644
index 0000000..e37a9d5
Binary files /dev/null and b/webroot/img/mapping/livejournal.png differ
diff --git a/webroot/img/mapping/mixi.png b/webroot/img/mapping/mixi.png
new file mode 100644
index 0000000..86e293c
Binary files /dev/null and b/webroot/img/mapping/mixi.png differ
diff --git a/webroot/img/mapping/myopenid.png b/webroot/img/mapping/myopenid.png
new file mode 100644
index 0000000..70878bc
Binary files /dev/null and b/webroot/img/mapping/myopenid.png differ
diff --git a/webroot/img/mapping/myspace.png b/webroot/img/mapping/myspace.png
new file mode 100644
index 0000000..acf9719
Binary files /dev/null and b/webroot/img/mapping/myspace.png differ
diff --git a/webroot/img/mapping/odnoklassniki.png b/webroot/img/mapping/odnoklassniki.png
new file mode 100644
index 0000000..2a7f3d9
Binary files /dev/null and b/webroot/img/mapping/odnoklassniki.png differ
diff --git a/webroot/img/mapping/openid.png b/webroot/img/mapping/openid.png
new file mode 100644
index 0000000..ece969a
Binary files /dev/null and b/webroot/img/mapping/openid.png differ
diff --git a/webroot/img/mapping/orange.png b/webroot/img/mapping/orange.png
new file mode 100644
index 0000000..bb3622a
Binary files /dev/null and b/webroot/img/mapping/orange.png differ
diff --git a/webroot/img/mapping/paypal.png b/webroot/img/mapping/paypal.png
new file mode 100644
index 0000000..5a66e15
Binary files /dev/null and b/webroot/img/mapping/paypal.png differ
diff --git a/webroot/img/mapping/persona.png b/webroot/img/mapping/persona.png
new file mode 100644
index 0000000..6af96d5
Binary files /dev/null and b/webroot/img/mapping/persona.png differ
diff --git a/webroot/img/mapping/qq.png b/webroot/img/mapping/qq.png
new file mode 100644
index 0000000..4103fc8
Binary files /dev/null and b/webroot/img/mapping/qq.png differ
diff --git a/webroot/img/mapping/renren.png b/webroot/img/mapping/renren.png
new file mode 100644
index 0000000..108f6c1
Binary files /dev/null and b/webroot/img/mapping/renren.png differ
diff --git a/webroot/img/mapping/salesforce.png b/webroot/img/mapping/salesforce.png
new file mode 100644
index 0000000..d33c10f
Binary files /dev/null and b/webroot/img/mapping/salesforce.png differ
diff --git a/webroot/img/mapping/stackexchange.png b/webroot/img/mapping/stackexchange.png
new file mode 100644
index 0000000..df2a059
Binary files /dev/null and b/webroot/img/mapping/stackexchange.png differ
diff --git a/webroot/img/mapping/steamcommunity.png b/webroot/img/mapping/steamcommunity.png
new file mode 100644
index 0000000..371094b
Binary files /dev/null and b/webroot/img/mapping/steamcommunity.png differ
diff --git a/webroot/img/mapping/twitter.png b/webroot/img/mapping/twitter.png
new file mode 100644
index 0000000..6960e98
Binary files /dev/null and b/webroot/img/mapping/twitter.png differ
diff --git a/webroot/img/mapping/verisign.png b/webroot/img/mapping/verisign.png
new file mode 100644
index 0000000..5c55529
Binary files /dev/null and b/webroot/img/mapping/verisign.png differ
diff --git a/webroot/img/mapping/virgilio.png b/webroot/img/mapping/virgilio.png
new file mode 100644
index 0000000..84c569b
Binary files /dev/null and b/webroot/img/mapping/virgilio.png differ
diff --git a/webroot/img/mapping/vkontakte.png b/webroot/img/mapping/vkontakte.png
new file mode 100644
index 0000000..cf7caa5
Binary files /dev/null and b/webroot/img/mapping/vkontakte.png differ
diff --git a/webroot/img/mapping/wordpres.png b/webroot/img/mapping/wordpres.png
new file mode 100644
index 0000000..a36751f
Binary files /dev/null and b/webroot/img/mapping/wordpres.png differ
diff --git a/webroot/img/mapping/wordpress.png b/webroot/img/mapping/wordpress.png
new file mode 100644
index 0000000..e027b1c
Binary files /dev/null and b/webroot/img/mapping/wordpress.png differ
diff --git a/webroot/img/mapping/yahoo.png b/webroot/img/mapping/yahoo.png
new file mode 100644
index 0000000..a4581ac
Binary files /dev/null and b/webroot/img/mapping/yahoo.png differ
diff --git a/webroot/img/pinterest.png b/webroot/img/pinterest.png
new file mode 100644
index 0000000..d3036d2
Binary files /dev/null and b/webroot/img/pinterest.png differ
diff --git a/demo/user-blank.png b/webroot/img/user-blank.png
similarity index 100%
rename from demo/user-blank.png
rename to webroot/img/user-blank.png
diff --git a/webroot/index.php b/webroot/index.php
new file mode 100644
index 0000000..6bc06dc
--- /dev/null
+++ b/webroot/index.php
@@ -0,0 +1,40 @@
+emit($server->run());
diff --git a/demo/js/LoginRadiusLoginScreen.1.0.0.js b/webroot/js/LoginRadiusLoginScreen.1.0.0.js
similarity index 95%
rename from demo/js/LoginRadiusLoginScreen.1.0.0.js
rename to webroot/js/LoginRadiusLoginScreen.1.0.0.js
index 45113f1..ac238dc 100644
--- a/demo/js/LoginRadiusLoginScreen.1.0.0.js
+++ b/webroot/js/LoginRadiusLoginScreen.1.0.0.js
@@ -160,7 +160,7 @@
' line-height: 4rem;'+
' color: #424242;'+
' }'+
- ' #lr-ls-sectiondivider,#lr-ls-sectiondividerL {'+
+ ' #lr-ls-sectiondivider {'+
' margin-top: 3.2rem;'+
' display: block;'+
' margin-left: auto;'+
@@ -329,13 +329,12 @@
' background-color: #F5F5F5;'+
' }'+
' select {'+
- ' margin-top: 4px;'+
- ' width: 91vw;'+
' height: 5rem;'+
- ' background-color:' + ((options.input && options.input.background) ? options.input.background : ' #F5F5F5') + ';' +
+ ' background-color: #F5F5F6;'+
' font-size: 5vw;'+
' font-weight: 300;'+
' padding: 8px;'+
+ ' margin-left: 20px;'+
' }'+
' textarea,'+
' input[type="password"],'+
@@ -347,7 +346,7 @@
' border-style: hidden;'+
' font-size: 5vw;'+
' font-weight: 300;'+
- ' line-height: 100%;'+
+ ' line-height: 10rem;'+
' padding: 8px;'+
' -webkit-box-sizing: border-box;'+
' box-sizing: border-box;'+
@@ -437,15 +436,6 @@
' line-height: 2rem;'+
' margin-top: 1rem;'+
' }'+
- ' #loginradius-showQRcode-ManualEntryCode {'+
- ' font-size: 4vw;'+
- ' }'+
- ' #loginradius-button-resendotp {'+
- ' font-size: 4vw;'+
- ' }'+
- ' #loginradius-button-changenumber {'+
- ' font-size: 4vw;'+
- ' }'+
' @-webkit-keyframes slide-up {'+
' 0% {'+
' opacity: 0;'+
@@ -635,10 +625,7 @@
' line-height: 19px;'+
' color: #424242;'+
' }'+
- ' .lrForgotpw {'+
- ' padding-left: 16px;'+
- ' }'+
- ' #lr-ls-sectiondivider, #lr-ls-sectiondividerL {'+
+ ' #lr-ls-sectiondivider {'+
' padding-top: 7px;'+
' margin-top: 16px;'+
' display: block;'+
@@ -665,7 +652,7 @@
' width: 3.5rem;'+
' border-radius: 4px;'+
' overflow: hidden;'+
- ' margin-top: 4px;'+
+ ' margin-top: 8px;'+
' position: relative;'+
' border: 1px solid rgba(0, 0, 0, 0.1);'+
' text-align: left;'+
@@ -699,7 +686,7 @@
' width: 100%;'+
' border-radius: 4px;'+
' overflow: hidden;'+
- ' margin-top: 4px;'+
+ ' margin-top: 8px;'+
' position: relative;'+
' border: 1px solid rgba(0, 0, 0, 0.1);'+
' text-align: left;'+
@@ -788,7 +775,7 @@
' margin-bottom: 2.67vh;'+
' }'+
' #login-container .loginradius--form-element-content, #registration-container .loginradius--form-element-content, #forgotpassword-container .loginradius--form-element-content, #resetpassword-container .loginradius--form-element-content {'+
- ' //padding-left: 16px;'+
+ ' padding-left: 16px;'+
' }'+
((options.singlepagestyle)? "" :
(
@@ -806,13 +793,11 @@
' #forgotpassword-container {'+
' width: 329px;'+
' z-index: 0;'+
- ' margin-left: auto;'+
- ' margin-right: auto;'+
' }'+
' #forgotpassword-container {'+
' margin-top: 16px;'+
' }'+
- ' #resetpassword-container #loginradius-submit-reset-password {'+
+ ' #loginradius-submit-reset-password {'+
' width:45% !important;'+
' }'+
' input .invalid {'+
@@ -820,14 +805,13 @@
' background-color: #F5F5F5;'+
' }'+
' select {'+
- ' margin-top: 4px !important;'+
' height: 32px;'+
- ' background-color:' + ((options.input && options.input.background) ? options.input.background : ' #F5F5F5') + ';' +
+ ' background-color: #F5F5F5;'+
' font-size: 15px;'+
' font-weight: 300;'+
' line-height: 16px;'+
' box-sizing: border-box;'+
- ' width: 326px;'+
+ ' margin-left: 20px;'+
' }'+
' textarea,'+
' input[type="password"],'+
@@ -852,8 +836,6 @@
' line-height: 16px;'+
' }'+
' input[type="submit"] {'+
- ' margin-left: auto;'+
- ' margin-right: auto;'+
' margin-top: 2.1vh;'+
' color: #FFFFFF;'+
' font-size: 14px;'+
@@ -1055,7 +1037,7 @@
' margin-left: auto;'+
'}'+
''+
- '#lr-ls-sectiondivider:after, #lr-ls-sectiondividerL:after {'+
+ '#lr-ls-sectiondivider:after {'+
' content: '+((options.content && options.content.socialandloginDivider) ? ('"'+options.content.socialandloginDivider+'"') : '"OR"') + ';'+
'}'+
''+
@@ -1094,10 +1076,6 @@
' background-color: #cb2128;'+
'}'+
''+
- '.lr-sl-icon:before {'+
- ' background-position: 0px -0.4%;'+
- '}'+
- ''+
'.lr-sl-icon-facebook:before {'+
' background-position: 0 0;'+
'}'+
@@ -1127,7 +1105,7 @@
'}'+
''+
'.lr-sl-icon-aol:before {'+
- ' background-position: 0px 16.4%;'+
+ ' background-position: 0px 16.3%;'+
'}'+
''+
'.lr-sl-icon-disqus:before {'+
@@ -1147,7 +1125,7 @@
'}'+
''+
'.lr-sl-icon-instagram:before {'+
- ' background-position: 0px 28.45%;'+
+ ' background-position: 0px 28.35%;'+
'}'+
''+
'.lr-sl-icon-kaixin:before {'+
@@ -1159,7 +1137,7 @@
'}'+
''+
'.lr-sl-icon-livejournal:before {'+
- ' background-position: 0px 35.55%;'+
+ ' background-position: 0px 35.5%;'+
'}'+
''+
'.lr-sl-icon-mixi:before {'+
@@ -1191,7 +1169,7 @@
'}'+
''+
'.lr-sl-icon-qq:before {'+
- ' background-position: 0px 54.75%;'+
+ ' background-position: 0px 54.7%;'+
'}'+
''+
'.lr-sl-icon-renren:before {'+
@@ -1211,7 +1189,7 @@
'}'+
''+
'.lr-sl-icon-steamcommunity:before {'+
- ' background-position: 0px 66.755%;'+
+ ' background-position: 0px 66.7%;'+
'}'+
''+
'.lr-sl-icon-verisign:before {'+
@@ -1231,7 +1209,7 @@
'}'+
''+
'.lr-sl-icon-mailru:before {'+
- ' background-position: 0px 78.66%;'+
+ ' background-position: 0px 78.6%;'+
'}'+
''+
'.lr-sl-icon-xing:before {'+
@@ -1452,8 +1430,9 @@
' ' +
'
' +
- '
' +
+ '
' +
'
' +
'
'+
((options.content && options.content.tabLabels) ? options.content.tabLabels[2] : "Forgot Password?")+
@@ -1501,7 +1480,7 @@
' '+
' ';
}
- //
+
function renderJS(cb, options, lrCallingObj) {
function lrlserroraction(errors) {
window.scrollTo(0, 0);
@@ -1553,26 +1532,23 @@
'loginradiuscustom_tmpl1');
var sl_options = {};
sl_options.onSuccess = function(response) {
- localStorage.removeItem("LrEmailStatus");
- if(response.access_token){
- redirect(response);
+ if(response.access_token){
+ getProfile(response.access_token, response.Profile.Uid);
}
cb(response, "socialLogin");
};
sl_options.onError = function(errors) {
- localStorage.setItem("LrEmailStatus", 'unverified');
lrlserroraction(errors);
cb(errors, "socialLogin");
};
sl_options.container = "sociallogin-container";
var login_options = {};
login_options.onSuccess = function(response) {
- localStorage.removeItem("LrEmailStatus");
document.getElementById("lr-ls-status-area").style.display = "none";
cb(response, "login");
//safely redirect
if(response.access_token){
- redirect(response);
+ getProfile(response.access_token, response.Profile.Uid);
}
};
login_options.onError = function(errors) {
@@ -1582,7 +1558,6 @@
login_options.container = "login-container";
var registration_options = {}
registration_options.onSuccess = function(response) {
- localStorage.removeItem("LrEmailStatus");
lrlssuccessaction(response);
document.getElementById("lr-ls-divisionsuccess").innerHTML = ((options.content && options.content.signupandForgotPwrequest) ? options.content.signupandForgotPwrequest : "Please check your email!");
if(response.Data){
@@ -1596,7 +1571,7 @@
cb(response, "registration");
if(response.access_token){
document.getElementById("lr-ls-divisionsuccess").innerHTML = ((options.content && options.content.emailVerifiedMessage) ? options.content.emailVerifiedMessage : "You have successfully registered, you now may log in with this email");
- redirect(response);
+ getProfile(response.access_token, response.Profile.Uid);
}
};
registration_options.onError = function(errors) {
@@ -1610,11 +1585,6 @@
forgotpassword_options.onSuccess = function(response) {
lrlssuccessaction(response);
document.getElementById("lr-ls-divisionsuccess").innerHTML = ((options.content && options.content.signupandForgotPwrequest) ? options.content.signupandForgotPwrequest : "Please check your email!");
- if(response.Data){
- if(response.Data.AccountSid && response.Data.Sid) {
- document.getElementById("lr-ls-divisionsuccess").innerHTML = ((options.content && options.content.signupandForgotPwrequestPhone) ? options.content.signupandForgotPwrequestPhone : "Please check your phone!");
- }
- }
if(document.getElementsByName("loginradius-forgotpassword")[0]){
document.getElementsByName("loginradius-forgotpassword")[0].reset();
}
@@ -1635,12 +1605,10 @@
resetpassword_options.container = "resetpassword-container";
resetpassword_options.onSuccess = function(response) {
lrlssuccessaction(response);
- if(response.Data == null){
- setTimeout(function() {
- window.location.href = ((options.redirecturl && options.redirecturl.afterreset) ? options.redirecturl.afterreset :
- window.location.origin);
- }, 2000);
- }
+ setTimeout(function() {
+ window.location.href = ((options.redirecturl && options.redirecturl.afterreset) ? options.redirecturl.afterreset :
+ window.location.origin);
+ }, 2000);
cb(response, "resetPassword");
};
resetpassword_options.onError = function(errors) {
@@ -1656,7 +1624,7 @@
if (document.getElementsByClassName("loginradius-otpsignin")[0])
{
document.getElementsByClassName("loginradius-otpsignin")[0].style.display = "none";
- document.getElementById("loginradius-otpsignin-send-an-otp-to-sign-in").style.display = "none";
+ //document.getElementById("loginradius-otpsignin-send-an-otp-to-sign-in").style.display = "none"; //diabled because causing error in login screen
}
if(document.getElementById('lr-forgotpw-btn')){
var passwordNode = document.getElementsByClassName('content-loginradius-password')[0];
@@ -1716,10 +1684,10 @@
verifyemail_options.onSuccess = function(response) {
document.getElementById("lr-ls-divisionsuccess").innerHTML = ((options.content && options.content.emailVerifiedMessage) ? options.content.emailVerifiedMessage : "You have successfully registered, you now may log in with this email");
lrlssuccessaction(response);
- localStorage.setItem("LrEmailStatus", "verified");
+ console.log(response);
cb(response, "verifyEmail");
if(response.access_token){
- redirect(response);
+ getProfile(response.access_token, response.Profile.Uid);
}
};
verifyemail_options.onError = function(errors) {
@@ -1752,10 +1720,11 @@
function registrationSchema(regSchema, userProfile) {
if(userProfile){
- document.getElementById("registration-container").style.display = "none";
- document.getElementById("interfacecontainerdiv").style.display = "none";
+ document.getElementById("login-container").style.display = "none";
+ document.getElementById("interfacecontainerdivL").style.display = "none";
document.getElementById("lr-ls-sectiondivider").style.display = "none";
- }
+ document.getElementById("lr-forgotpw-btn").style.display = "none";
+ }
}
lrCallingObj.$hooks.register('startProcess', function() {
document.getElementById("loader").style.display = "block";
@@ -1763,10 +1732,6 @@
lrCallingObj.$hooks.register('endProcess', function() {
document.getElementById("loader").style.display = "none";
});
- lrCallingObj.$hooks.register('socialLoginFormRender',function(){
- //on social login form render
- document.getElementById("tab2").checked = true;
- });
if (!options.language){
lrCallingObj.$hooks.call('setButtonsName', {
login: "LOG IN",
diff --git a/webroot/js/account.js b/webroot/js/account.js
new file mode 100644
index 0000000..5dd5e97
--- /dev/null
+++ b/webroot/js/account.js
@@ -0,0 +1,70 @@
+var stringVariable = window.location.href;
+domainName = stringVariable.substring(0, stringVariable.lastIndexOf('/'));
+$(function () {
+ getProfileByUid();
+ handleUpdateAccount();
+});
+
+function getProfileByUid() {
+ var uid = localStorage.getItem("LRUserID");
+ $.ajax({
+ url: "profile",
+ type: 'POST',
+ dataType: "json",
+ data: $.param({
+ uid: uid,
+ action: "getProfileByUid",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function (response) {
+ if (response.status == "success") {
+ if (typeof (response.data.FirstName) != "undefined" && response.data.FirstName !== null) {
+ $("#user-updateaccount-firstname").val(response.data.FirstName);
+ localStorage.setItem('UserName', response.data.FullName);
+ }
+ if (typeof (response.data.LastName) != "undefined" && response.data.LastName !== null) {
+ $("#user-updateaccount-lastname").val(response.data.LastName);
+ localStorage.setItem('UserName', response.data.FullName);
+ }
+ if (typeof (response.data.About) != "undefined" && response.data.About !== null) {
+ $("#user-updateaccount-about").val(response.data.About);
+ }
+ }
+ }
+ });
+}
+
+function handleUpdateAccount() {
+ $('#btn-user-updateaccount').on('click', function () {
+ $("#user-updateaccount-errorMsg").text("");
+ $("#user-updateaccount-successMsg").text("");
+
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "profile",
+ dataType: "json",
+ data: $.param({
+ token: localStorage.getItem("LRTokenKey"),
+ firstname: $("#user-updateaccount-firstname").val(),
+ lastname: $("#user-updateaccount-lastname").val(),
+ about: $("#user-updateaccount-about").val(),
+ action: "updateAccount",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function (res) {
+ $("#lr-loading").hide();
+ if (res.status == 'error') {
+ $("#user-updateaccount-errorMsg").text(res.message);
+ } else if (res.status == 'success') {
+ $("#user-updateaccount-successMsg").text(res.message);
+ getProfileByUid();
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#user-updateaccount-errorMsg").text(xhr.responseText);
+ }
+ });
+ });
+}
\ No newline at end of file
diff --git a/webroot/js/accountlinking.js b/webroot/js/accountlinking.js
new file mode 100644
index 0000000..cbe43ae
--- /dev/null
+++ b/webroot/js/accountlinking.js
@@ -0,0 +1,38 @@
+$(function() {
+ var la_options = {};
+ la_options.container = "interfacecontainerdiv";
+ la_options.templateName = 'loginradiuscustom_tmpl_link';
+ la_options.onSuccess = function(response) {
+ if (response.IsPosted == true) {
+ $("#accountlinking-message").attr('style', 'color:green');
+ $("#accountlinking-message").text("Account linked successfully");
+ window.setTimeout(function () {
+ window.location.reload();
+ }, 3000);
+ }
+ };
+ la_options.onError = function(errors) {
+ $("#accountlinking-message").attr('style', 'color:red');
+ $("#accountlinking-message").text(errors[0].Description);
+ };
+
+ var unlink_options = {};
+ unlink_options.onSuccess = function(response) {
+ if (response.IsDeleted == true) {
+ $("#accountlinking-message").attr('style', 'color:green');
+ $("#accountlinking-message").text("Account unlinked successfully");
+ window.setTimeout(function () {
+ window.location.reload();
+ }, 3000);
+ }
+ };
+ unlink_options.onError = function(errors) {
+ $("#accountlinking-message").attr('style', 'color:red');
+ $("#accountlinking-message").text(errors[0].Description);
+ };
+
+ LRObject.util.ready(function() {
+ LRObject.init("linkAccount", la_options);
+ LRObject.init("unLinkAccount", unlink_options);
+ });
+});
\ No newline at end of file
diff --git a/webroot/js/emailverification.js b/webroot/js/emailverification.js
new file mode 100644
index 0000000..8aed573
--- /dev/null
+++ b/webroot/js/emailverification.js
@@ -0,0 +1,78 @@
+var stringVariable = window.location.href;
+domainName = stringVariable.substring(0, stringVariable.lastIndexOf('/'));
+$(function() {
+ if (getUrlParameter("vtype") == "oneclicksignin") {
+ $("#lr-loading").show();
+ $("#emailverification-message").text("");
+ $.ajax({
+ type: "POST",
+ url: "login",
+ data: $.param({
+ token: getUrlParameter("vtoken"),
+ action: "pwLessLinkVerify",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ dataType: "json",
+ success: function(res) {
+ $("#lr-loading").hide();
+ if (res.status == 'success') {
+ getProfile(res.data.access_token, res.data.Profile.Uid);
+
+ } else if(res.status == 'error'){
+ $("#emailverification-message").attr('style', 'color:red');
+ $("#emailverification-message").text(res.message);
+ }
+ },
+ error: function(xhr, status, error) {
+ $("#lr-loading").hide();
+ console.log(xhr.responseText);
+ $("#emailverification-message").attr('style', 'color:red');
+ $("#emailverification-message").text("Pwless Login failed");
+ }
+ });
+ } else if (getUrlParameter("vtype") == "emailverification") {
+ $("#lr-loading").show();
+ $("#emailverification-message").text("");
+ $.ajax({
+ url:"login",
+ type: 'POST',
+ dataType: "json",
+ data: $.param({
+ vtoken: getUrlParameter("vtoken"),
+ action: "emailVerify",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function(res) {
+ $("#lr-loading").hide();
+ if (res.status == 'success') {
+ $("#emailverification-message").attr('style', 'color:green');
+ $("#emailverification-message").text(res.message);
+ } else if (res.status == 'error') {
+ $("#emailverification-message").attr('style', 'color:red');
+ $("#emailverification-message").text(res.message);
+ }
+ },
+ error: function(xhr, status, error) {
+ $("#lr-loading").hide();
+ console.log(xhr.responseText);
+ $("#emailverification-message").attr('style', 'color:red');
+ $("#emailverification-message").text("Email verification failed");
+ }
+ });
+ }
+});
+
+function getUrlParameter(sParam) {
+ var sPageURL = decodeURIComponent(window.location.search.substring(1)),
+ sURLVariables = sPageURL.split('&'),
+ sParameterName,
+ i;
+
+ for (i = 0; i < sURLVariables.length; i++) {
+ sParameterName = sURLVariables[i].split('=');
+
+ if (sParameterName[0] === sParam) {
+ return sParameterName[1] === undefined ? true : sParameterName[1];
+ }
+ }
+}
\ No newline at end of file
diff --git a/webroot/js/index.js b/webroot/js/index.js
new file mode 100644
index 0000000..fe2c907
--- /dev/null
+++ b/webroot/js/index.js
@@ -0,0 +1,376 @@
+var stringVariable = window.location.href;
+domainName = stringVariable.substring(0, stringVariable.lastIndexOf('/'));
+$(function () {
+ var accesstoken = localStorage.getItem("LRTokenKey");
+ var lruid= localStorage.getItem("LRUserID");
+ if (accesstoken != "" && accesstoken != null && lruid != "" && lruid != null) {
+ window.location.href = "profileview";
+ }
+ handleLogin();
+ handleMFALogin();
+ handlePwLessLogin();
+ handleSignup();
+ handleForgotPassword();
+ handleResetPassword();
+
+ var vtype = getUrlParameter("vtype");
+ if (vtype == 'reset') {
+ jQuery('.lrforgotpassword').hide();
+ jQuery('.lrrestpassword').show();
+ }
+ $("#lr-loading").click(function () {
+ $("#lr-loading").hide();
+ });
+});
+
+function getProfile(access_token, profile_uid) {
+ localStorage.setItem('LRTokenKey', access_token);
+ localStorage.setItem('LRUserID', profile_uid);
+ $.ajax({
+ type: "POST",
+ url: "profile",
+ dataType: "json",
+ data: $.param({
+ token: access_token,
+ action: "getProfile",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function (response) {
+
+ if (response.status == "success") {
+ localStorage.setItem('EmailId', response.data.Email[0].Value);
+ if (typeof (response.data.FullName) != "undefined" && response.data.FullName !== null) {
+ localStorage.setItem('UserName', response.data.FullName);
+ }
+ localStorage.setItem('ImageUrl', response.data.ImageUrl);
+ localStorage.setItem('LastLoginTime', response.data.LastLoginDate);
+ window.location.href = "profileview";
+ } else {
+ $("#minimal-login-errorMsg").text(response.message);
+ }
+ }
+ });
+}
+
+function handleLogin() {
+ $('#btn-minimal-login').on('click', function () {
+ $("#minimal-login-errorMsg").text("");
+ if ($('#minimal-login-email').val().trim() == '') {
+ $("#minimal-login-errorMsg").text("The Email Id field is required.");
+ return;
+ } else if ($('#minimal-login-password').val().trim() == '') {
+ $("#minimal-login-errorMsg").text("The Password field is required.");
+ return;
+ }
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "login",
+ dataType: "json",
+ data: $.param({
+ email: $("#minimal-login-email").val(),
+ password: $("#minimal-login-password").val(),
+ action: "loginByEmail",
+ _csrfToken: $('[name="_csrfToken"]').val(),
+ }),
+
+ success: function (response) {
+ $("#lr-loading").hide();
+
+ if (response.status == 'error') {
+
+ $("#minimal-login-errorMsg").text(response.message);
+ } else if (response.status == 'success') {
+ console.log(response);
+ $("#minimal-login-email").val("");
+ $("#minimal-login-password").val("");
+ getProfile(response.data.access_token, response.data.Profile.Uid);
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ console.log("Login err::", xhr.responseText);
+ $("#minimal-login-errorMsg").text("an error occurred");
+ }
+ });
+ });
+}
+
+function handlePwLessLogin() {
+ $('#btn-minimal-pwless').on('click', function () {
+ $("#minimal-pwless-successMsg").text("");
+ $("#minimal-pwless-errorMsg").text("");
+ if ($('#minimal-pwless-email').val().trim() == '') {
+ $("#minimal-pwless-errorMsg").text("The Email Id field is required.");
+ return;
+ }
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "login",
+ data: $.param({
+ email: $("#minimal-pwless-email").val(),
+ verificationurl: domainName,
+ action: "pwLessLogin",
+ _csrfToken: $('[name="_csrfToken"]').val()
+
+ }),
+ dataType: "json",
+ success: function (response) {
+ $("#lr-loading").hide();
+ if (response.status == 'error') {
+ $("#minimal-pwless-errorMsg").text(response.message);
+ } else if (response.status == 'success') {
+ $("#minimal-pwless-email").val("");
+ $("#minimal-pwless-successMsg").text(response.message);
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#minimal-pwless-errorMsg").text(xhr.responseText);
+ }
+ });
+ });
+}
+
+function handleMFALogin() {
+ $('#btn-minimal-mfalogin-next').on('click', function () {
+ $("#minimal-mfalogin-successMsg").text("");
+ $("#minimal-mfalogin-errorMsg").text("");
+ if ($('#minimal-mfalogin-email').val().trim() == '') {
+ $("#minimal-mfalogin-errorMsg").text("The Email Id field is required.");
+ return;
+ } else if ($('#minimal-mfalogin-password').val().trim() == '') {
+ $("#minimal-mfalogin-errorMsg").text("The Password field is required.");
+ return;
+ }
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "login",
+ data: $.param({
+ email: $("#minimal-mfalogin-email").val(),
+ password: $("#minimal-mfalogin-password").val(),
+ action: "mfaLogin",
+ _csrfToken: $('[name="_csrfToken"]').val()
+
+ }),
+ dataType: "json",
+ success: function (res) {
+ $("#lr-loading").hide();
+ if (res.status == 'error') {
+ $("#minimal-mfalogin-errorMsg").text(res.message);
+ } else if(res.status == 'success'){
+ $("#minimal-mfalogin-email").val("");
+ $("#minimal-mfalogin-password").val("");
+ if (typeof (res.data.SecondFactorAuthentication) != "undefined" && res.data.SecondFactorAuthentication!= null) {
+
+ var secondFactorAuthenticationToken = res.data.SecondFactorAuthentication.SecondFactorAuthenticationToken;
+
+ var qrHtml = '';
+ var qrCode = res.data.SecondFactorAuthentication.QRCode;
+ if (!res.data.SecondFactorAuthentication.IsGoogleAuthenticatorVerified) {
+ qrHtml = '
';
+ } else {
+ qrHtml = '';
+ }
+ $('#minimal-mfalogin-login').html(qrHtml + "Google Auth Code:
Login ");
+
+ $('#btn-minimal-mfalogin-login').on('click', function () {
+ if ($('#minimal-mfalogin-googlecode').val().trim() == '') {
+ $("#minimal-mfalogin-errorMsg").text("Google code required.");
+ return;
+ }
+ validateGoogleCode(secondFactorAuthenticationToken);
+ });
+ } else {
+ $("#minimal-mfalogin-email").val("");
+ $("#minimal-mfalogin-password").val("");
+ getProfile(res.data.access_token, res.data.Profile.Uid);
+ }
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#minimal-mfalogin-errorMsg").text(xhr.responseText);
+ }
+ });
+ });
+}
+
+function validateGoogleCode(token) {
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "login",
+ data: $.param({
+ secondFactorAuthenticationToken: token,
+ googleAuthCode: $("#minimal-mfalogin-googlecode").val(),
+ action: "mfaValidate",
+ _csrfToken: $('[name="_csrfToken"]').val()
+
+ }),
+ dataType: "json",
+ success: function (res) {
+ $("#lr-loading").hide();
+ $("#minimal-mfalogin-errorMsg").text("");
+ if (res.status == 'success') {
+ getProfile(res.data.access_token, res.data.Profile.Uid);
+ } else if (res.status == 'error') {
+ $("#minimal-mfalogin-errorMsg").text(res.message);
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#minimal-mfalogin-errorMsg").text(xhr.responseText);
+ }
+ });
+}
+
+function handleSignup() {
+ $('#btn-minimal-signup').on('click', function () {
+ $("#minimal-signup-successMsg").text("");
+ $("#minimal-signup-errorMsg").text("");
+ if ($('#minimal-signup-email').val().trim() == '') {
+ $("#minimal-signup-errorMsg").text("The Email Id field is required.");
+ return;
+ } else if ($('#minimal-signup-password').val().trim() == '') {
+ $("#minimal-signup-errorMsg").text("The Password field is required.");
+ return;
+ } else if ($('#minimal-signup-password').val().trim().length < '6') {
+ $("#minimal-signup-errorMsg").text("The Password field must be at least 6 characters in length.");
+ return;
+ } else if ($("#minimal-signup-password").val() != $("#minimal-signup-confirmpassword").val()) {
+ $("#minimal-signup-errorMsg").text("Passwords do not match.");
+ return;
+ }
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "registration",
+ dataType: "json",
+ data: $.param({
+ email: $("#minimal-signup-email").val(),
+ password: $("#minimal-signup-password").val(),
+ verificationurl: domainName,
+ action: "registration",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function (res) {
+ $("#lr-loading").hide();
+ if (res.status == 'registered') {
+ $("#minimal-signup-successMsg").text(res.message);
+ $("#minimal-signup-email").val('');
+ $("#minimal-signup-password").val('');
+ $("#minimal-signup-confirmpassword").val('');
+ } else if (res.status == 'success') {
+ $("#minimal-signup-email").val('');
+ $("#minimal-signup-password").val('');
+ $("#minimal-signup-confirmpassword").val('');
+ getProfile(res.result.Data.access_token, res.result.Data.Profile.Uid);
+ } else if (res.status == 'error') {
+ $("#minimal-signup-errorMsg").text(res.message);
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#minimal-signup-errorMsg").text(xhr.responseText);
+ }
+ });
+ });
+}
+
+function handleForgotPassword() {
+ $('#btn-minimal-forgotpassword').on('click', function () {
+ $("#minimal-forgotpassword-successMsg").text("");
+ $("#minimal-forgotpassword-errorMsg").text("");
+ if ($('#minimal-forgotpassword-email').val().trim() == '') {
+ $("#minimal-forgotpassword-errorMsg").text("The Email Id field is required.");
+ return;
+ }
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url:"forgotpassword",
+ dataType: "json",
+ data: $.param({
+ email: $("#minimal-forgotpassword-email").val(),
+ resetPasswordUrl: domainName + "/forgot",
+ action: "forgotPassword",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function (response) {
+ $("#lr-loading").hide();
+ if (response.status == 'success') {
+ $("#minimal-forgotpassword-email").val("");
+ $("#minimal-forgotpassword-successMsg").text(response.message);
+ } else if (response.status == 'error') {
+ $("#minimal-forgotpassword-errorMsg").text(response.message);
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#minimal-forgotpassword-errorMsg").text(xhr.responseText);
+ }
+ });
+ });
+}
+
+function handleResetPassword() {
+ $('#btn-minimal-resetpassword').on('click', function () {
+ $("#minimal-resetpassword-successMsg").text("");
+ $("#minimal-resetpassword-errorMsg").text("");
+ if ($('#minimal-resetpassword-password').val().trim() == '') {
+ $("#minimal-resetpassword-errorMsg").text("The Password field is required.");
+ return;
+ }else if ($('#minimal-resetpassword-password').val().trim().length < '6') {
+ $("#minimal-resetpassword-errorMsg").text("The Password field must be at least 6 characters in length.");
+ return;
+ }
+ else if ($('#minimal-resetpassword-password').val() != $('#minimal-resetpassword-confirmpassword').val()) {
+ $("#minimal-resetpassword-errorMsg").text("Passwords do not match.");
+ return;
+ }
+ $("#lr-loading").show();
+ $.ajax({
+ type: "POST",
+ url: "resetpassword",
+ dataType: "json",
+ data: $.param({
+ resettoken: getUrlParameter("vtoken"),
+ password: $("#minimal-resetpassword-password").val(),
+ action: "resetPassword",
+ _csrfToken: $('[name="_csrfToken"]').val()
+ }),
+ success: function (response) {
+ $("#lr-loading").hide();
+ if (response.status == 'success') {
+ $("#minimal-resetpassword-password").val("");
+ $("#minimal-resetpassword-confirmpassword").val("");
+ $("#minimal-resetpassword-successMsg").text(response.message);
+ } else if (response.status == 'error') {
+ $("#minimal-resetpassword-errorMsg").text(response.message);
+ }
+ },
+ error: function (xhr, status, error) {
+ $("#lr-loading").hide();
+ $("#minimal-resetpassword-errorMsg").text(xhr.responseText);
+ }
+ });
+ });
+}
+
+function getUrlParameter(sParam) {
+ var sPageURL = decodeURIComponent(window.location.search.substring(1)),
+ sURLVariables = sPageURL.split('&'),
+ sParameterName,
+ i;
+
+ for (i = 0; i < sURLVariables.length; i++) {
+ sParameterName = sURLVariables[i].split('=');
+
+ if (sParameterName[0] === sParam) {
+ return sParameterName[1] === undefined ? true : sParameterName[1];
+ }
+ }
+}
\ No newline at end of file
diff --git a/webroot/js/jquery.min.js b/webroot/js/jquery.min.js
new file mode 100644
index 0000000..6334d0d
--- /dev/null
+++ b/webroot/js/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d
").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;ba ",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;jq&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;ai){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML=" ";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="
",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML=" ",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="
",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j ",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="
",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML=" ",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/ ]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""," "],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X","
"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>$2>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1>$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/