Browse Source

初始化提交

youngqj 6 years ago
commit
20bdc3360d
100 changed files with 21442 additions and 0 deletions
  1. 33 0
      .env.example
  2. 5 0
      .gitattributes
  3. 12 0
      .gitignore
  4. 40 0
      app/Console/Kernel.php
  5. 65 0
      app/Exceptions/Handler.php
  6. 152 0
      app/Http/Controllers/Admin/AdminController.php
  7. 131 0
      app/Http/Controllers/Admin/ShopController.php
  8. 678 0
      app/Http/Controllers/Admin/SupplyController.php
  9. 32 0
      app/Http/Controllers/Auth/ForgotPasswordController.php
  10. 39 0
      app/Http/Controllers/Auth/LoginController.php
  11. 71 0
      app/Http/Controllers/Auth/RegisterController.php
  12. 39 0
      app/Http/Controllers/Auth/ResetPasswordController.php
  13. 13 0
      app/Http/Controllers/Controller.php
  14. 60 0
      app/Http/Kernel.php
  15. 17 0
      app/Http/Middleware/EncryptCookies.php
  16. 26 0
      app/Http/Middleware/RedirectIfAuthenticated.php
  17. 18 0
      app/Http/Middleware/TrimStrings.php
  18. 17 0
      app/Http/Middleware/VerifyCsrfToken.php
  19. 359 0
      app/Lib/Pagination.php
  20. 130 0
      app/Lib/Utils.php
  21. 72 0
      app/Lib/Weidian/Api.php
  22. 15 0
      app/Lib/Weidian/api/ApiBase.php
  23. 70 0
      app/Lib/Weidian/api/CPSClientApi.php
  24. 89 0
      app/Lib/Weidian/api/OAuthClientApi.php
  25. 99 0
      app/Lib/Weidian/api/OrderClientApi.php
  26. 368 0
      app/Lib/Weidian/api/ProductClientApi.php
  27. 41 0
      app/Lib/Weidian/api/SimpleApiClient.php
  28. 24 0
      app/Lib/Weidian/demo/cps_demo.php
  29. 47 0
      app/Lib/Weidian/demo/oauth_demo.php
  30. 59 0
      app/Lib/Weidian/demo/order_api_demo.php
  31. 306 0
      app/Lib/Weidian/demo/product_api_demo.php
  32. 19 0
      app/Lib/Weidian/demo/simple_api_test.php
  33. 25 0
      app/Lib/Weidian/includes/AutoLoader.php
  34. 19 0
      app/Lib/Weidian/includes/Defines.php
  35. 56 0
      app/Lib/Weidian/includes/HttpResponse.php
  36. 26 0
      app/Lib/Weidian/includes/Logger.php
  37. 275 0
      app/Lib/Weidian/includes/NetUtils.php
  38. 8 0
      app/Lib/Weidian/includes/OAuthException.php
  39. 79 0
      app/Lib/Weidian/includes/WebStart.php
  40. 182 0
      app/Lib/Youzan/YZApiProtocol.php
  41. 118 0
      app/Lib/Youzan/YZHttpClient.php
  42. 40 0
      app/Lib/Youzan/YZOauthClient.php
  43. 98 0
      app/Lib/Youzan/YZSignClient.php
  44. 57 0
      app/Lib/Youzan/YZTokenClient.php
  45. 86 0
      app/Lib/Youzan/YouzanApi.php
  46. 21 0
      app/Model/admin/AdminUser.php
  47. 12 0
      app/Model/admin/GoodModel.php
  48. 11 0
      app/Model/admin/SettingModel.php
  49. 12 0
      app/Model/admin/ShopModel.php
  50. 13 0
      app/Model/admin/SupplyModel.php
  51. 28 0
      app/Providers/AppServiceProvider.php
  52. 30 0
      app/Providers/AuthServiceProvider.php
  53. 21 0
      app/Providers/BroadcastServiceProvider.php
  54. 32 0
      app/Providers/EventServiceProvider.php
  55. 73 0
      app/Providers/RouteServiceProvider.php
  56. 29 0
      app/User.php
  57. 51 0
      artisan
  58. 55 0
      bootstrap/app.php
  59. 17 0
      bootstrap/autoload.php
  60. 2 0
      bootstrap/cache/.gitignore
  61. 53 0
      composer.json
  62. 3576 0
      composer.lock
  63. 231 0
      config/app.php
  64. 104 0
      config/auth.php
  65. 58 0
      config/broadcasting.php
  66. 91 0
      config/cache.php
  67. 109 0
      config/database.php
  68. 68 0
      config/filesystems.php
  69. 123 0
      config/mail.php
  70. 85 0
      config/queue.php
  71. 38 0
      config/services.php
  72. 179 0
      config/session.php
  73. 33 0
      config/view.php
  74. 1 0
      database/.gitignore
  75. 24 0
      database/factories/ModelFactory.php
  76. 35 0
      database/migrations/2014_10_12_000000_create_users_table.php
  77. 32 0
      database/migrations/2014_10_12_100000_create_password_resets_table.php
  78. 34 0
      database/migrations/2017_04_29_170410_create-admin_user-table.php
  79. 32 0
      database/migrations/2017_05_02_194853_create_cache_table.php
  80. 16 0
      database/seeds/DatabaseSeeder.php
  81. 21 0
      package.json
  82. 31 0
      phpunit.xml
  83. 20 0
      public/.htaccess
  84. 9 0
      public/assets/js/libs/Chart.min.js
  85. 5 0
      public/assets/js/libs/bootstrap.min.js
  86. 1 0
      public/assets/js/libs/jquery.min.js
  87. 1 0
      public/assets/js/libs/pace.min.js
  88. 0 0
      public/assets/js/libs/tether.min.js
  89. 2199 0
      public/css/font-awesome.css
  90. 2 0
      public/css/font-awesome.css.map
  91. 3 0
      public/css/font-awesome.min.css
  92. 778 0
      public/css/simple-line-icons.css
  93. 8813 0
      public/css/style.css
  94. 0 0
      public/favicon.ico
  95. BIN
      public/fonts/FontAwesome.otf
  96. BIN
      public/fonts/Simple-Line-Icons.eot
  97. 15 0
      public/fonts/Simple-Line-Icons.svg
  98. BIN
      public/fonts/Simple-Line-Icons.ttf
  99. BIN
      public/fonts/Simple-Line-Icons.woff
  100. BIN
      public/fonts/Simple-Line-Icons.woff2

+ 33 - 0
.env.example

@@ -0,0 +1,33 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_LOG_LEVEL=debug
+APP_URL=http://localhost
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=homestead
+DB_USERNAME=homestead
+DB_PASSWORD=secret
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+SESSION_DRIVER=file
+QUEUE_DRIVER=sync
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=

+ 5 - 0
.gitattributes

@@ -0,0 +1,5 @@
+* text=auto
+*.css linguist-vendored
+*.scss linguist-vendored
+*.js linguist-vendored
+CHANGELOG.md export-ignore

+ 12 - 0
.gitignore

@@ -0,0 +1,12 @@
+/node_modules
+/public/hot
+/public/storage
+/storage/*.key
+/vendor
+/.idea
+/.vagrant
+Homestead.json
+Homestead.yaml
+npm-debug.log
+.env
+.DS_Store

+ 40 - 0
app/Console/Kernel.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * The Artisan commands provided by your application.
+     *
+     * @var array
+     */
+    protected $commands = [
+        //
+    ];
+
+    /**
+     * Define the application's command schedule.
+     *
+     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
+     * @return void
+     */
+    protected function schedule(Schedule $schedule)
+    {
+        // $schedule->command('inspire')
+        //          ->hourly();
+    }
+
+    /**
+     * Register the Closure based commands for the application.
+     *
+     * @return void
+     */
+    protected function commands()
+    {
+        require base_path('routes/console.php');
+    }
+}

+ 65 - 0
app/Exceptions/Handler.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Exceptions;
+
+use Exception;
+use Illuminate\Auth\AuthenticationException;
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+
+class Handler extends ExceptionHandler
+{
+    /**
+     * A list of the exception types that should not be reported.
+     *
+     * @var array
+     */
+    protected $dontReport = [
+        \Illuminate\Auth\AuthenticationException::class,
+        \Illuminate\Auth\Access\AuthorizationException::class,
+        \Symfony\Component\HttpKernel\Exception\HttpException::class,
+        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
+        \Illuminate\Session\TokenMismatchException::class,
+        \Illuminate\Validation\ValidationException::class,
+    ];
+
+    /**
+     * Report or log an exception.
+     *
+     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
+     *
+     * @param  \Exception  $exception
+     * @return void
+     */
+    public function report(Exception $exception)
+    {
+        parent::report($exception);
+    }
+
+    /**
+     * Render an exception into an HTTP response.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Exception  $exception
+     * @return \Illuminate\Http\Response
+     */
+    public function render($request, Exception $exception)
+    {
+        return parent::render($request, $exception);
+    }
+
+    /**
+     * Convert an authentication exception into an unauthenticated response.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Illuminate\Auth\AuthenticationException  $exception
+     * @return \Illuminate\Http\Response
+     */
+    protected function unauthenticated($request, AuthenticationException $exception)
+    {
+        if ($request->expectsJson()) {
+            return response()->json(['error' => 'Unauthenticated.'], 401);
+        }
+
+        return redirect()->guest(route('login'));
+    }
+}

+ 152 - 0
app/Http/Controllers/Admin/AdminController.php

@@ -0,0 +1,152 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Model\admin\AdminUser;
+use App\Model\admin\SettingModel;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Input;
+
+use Illuminate\Support\Facades\Redirect;
+use \View;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Validator;
+
+class AdminController extends Controller
+{
+
+    protected function validator(array $data)
+    {
+        return Validator::make($data, [
+            'username' => 'required|string|max:255',
+            'password' => 'required|string|min:6|confirmed',
+        ]);
+    }
+
+    //登录页面
+    public function loginAction(Request $request ){
+
+       if($request->isMethod('post')){
+
+            if (Auth::attempt(['username'=>Input::get("username"),'password'=>Input::get("password")],false)){
+                return Redirect::to("admin-dashboard")->with("message","登录成功");
+
+            }else{
+                return Redirect::to("admin-login")->with("message","用户名密码不正确")->withInput();
+            }
+        }
+        if (Auth::check()){ //已经登录
+            return Redirect::to("admin-dashboard");
+        }
+
+        return View::make("admin.login");
+    }
+
+    public  function logoutAction(){
+        Auth::logout();
+        return Redirect::to("admin-login")->with("messge","退出成功!");
+    }
+
+    public function dashboardAction(){
+       if ( !Auth::check()){
+          return Redirect::to("admin-login");
+       }
+        return View::make("admin.dashboard",['username'=>Auth::user()->nickname]);
+    }
+
+    public  function managerAction(){
+        $admin = AdminUser::get();
+        //dd($admin);
+        return View::make("admin.manager",['list'=>$admin]);
+    }
+
+    public function  addAction(Request $request){
+
+        if($request->isMethod('post')){
+
+            $validate  = \Validator::make($request->input(),[
+                'username'=>"required",
+                'password'=>"required"
+            ],[
+                'required'=>":attribute必填项不能为空",
+            ],[
+                'username'=>'用户名',
+                'password'=>'密码'
+            ]);
+
+            if($validate->fails()){
+                return \redirect()->back()->withErrors($validate)->withInput();
+            }
+
+            $admin = new AdminUser();
+            $admin->username = Input::get('username');
+            $admin->password = \Hash::make(Input::get('password'));
+            $admin->nickname = Input::get('nickname')?:Input::get("username");
+            $admin->logtime = time();
+            if($admin->save()){
+                return Redirect::to('admin-list')->with('message','操作成功!');
+            }else{
+                return \redirect()->back()->with('message','添加失败!');
+            }
+
+        }
+        return View::make('admin.managerform');
+    }
+
+    public  function updateAction(Request $request,$id){
+        $admin = AdminUser::find($id);
+
+        if($request->isMethod('post')){
+
+            $validate  = \Validator::make($request->input(),[
+                'username'=>"required",
+
+            ],[
+                'required'=>":attribute必填项不能为空",
+            ],[
+                'username'=>'用户名',
+
+            ]);
+
+            if($validate->fails()){
+                return \redirect()->back()->withErrors($validate)->withInput();
+            }
+
+            $admin->username = Input::get('username');
+            $password = \Hash::make(Input::get('password'));
+            $admin->password = empty($password)  ?$admin->password :$password;
+            $admin->nickname = Input::get('nickname')?:Input::get("username");
+            $admin->logtime = time();
+            if($admin->save()){
+                return Redirect::to('admin-list')->with('message','操作成功!');
+            }else{
+                return \redirect()->back()->with('message','添加失败!');
+            }
+        }
+
+        return View::make("admin.managerform",['infos'=>$admin]);
+    }
+
+    public  function  settingsAction(Request $request){
+        if($request->isMethod('post')){
+            $data = [];
+            foreach ($request->input('settings') as $key=>$value){
+                $data[] = ['skey'=>$key,'svalue'=>$value];
+            }
+            DB::table('settings')->truncate();
+           if( DB::table('settings')->insert($data)){
+                return Redirect::refresh()->with('message','操作成功');
+           }else{
+               return \redirect()->back()->with('message','添加失败');
+           }
+        }
+       $list =  [];
+        foreach (   DB::table('settings')->get() as $item ){
+
+            $list[$item->skey] = $item->svalue;
+        }
+        return View::make("admin.settingsform",['settings'=>$list]);
+    }
+}

+ 131 - 0
app/Http/Controllers/Admin/ShopController.php

@@ -0,0 +1,131 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Lib\Youzan\YouzanApi;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Input;
+use \View;
+use \DB;
+
+class ShopController extends Controller
+{
+
+    public  function indexAction(){
+
+        $list = DB::table('shop')->where('type',Input::get('type',1))->get();
+
+        return View::make('admin.shopList',['list'=>$list]);
+    }
+
+    public function addAction(Request $request){
+        if($request->isMethod('post')){
+
+            $validate  = \Validator::make($request->input(),[
+                'shopname'=>"required",
+                'app_id'=>"required",
+                'app_secret'=>"required"
+            ],[
+                'required'=>":attribute必填项不能为空",
+            ],[
+                'shopname'=>'用户名',
+                'app_id'=>'AppId',
+                'app_secret'=>'secret'
+            ]);
+
+            if($validate->fails()){
+                return \redirect()->back()->withErrors($validate)->withInput();
+            }
+            $res = DB::table('shop')->insert([
+                'shopname'=>Input::get('shopname'),
+                'app_id'=>Input::get('app_id'),
+                'app_secret'=>Input::get('app_secret'),
+                'type' => Input::get('type'),
+                'savePic' => Input::get('savePic'),
+                'delivery_template_id' => Input::get('delivery_template_id')
+                ]);
+
+            if($res){
+                return \Redirect::route('shop',['type'=>Input::get('type')]);
+            }
+            else{
+                return \Redirect::to('shop')->with('messag','添加失败');
+            }
+
+        }
+        return View::make('admin.shopform_add');
+    }
+
+    public  function updateAction(Request $request,$id){
+        $id = intval($id);
+        $data = DB::table('shop')->where('id',$id)->first();
+
+        if($request->isMethod('post')){
+            $validate  = \Validator::make($request->input(),[
+                'shopname'=>"required",
+                'app_id'=>"required",
+                'app_secret'=>"required"
+            ],[
+                'required'=>":attribute必填项不能为空",
+            ],[
+                'shopname'=>'用户名',
+                'app_id'=>'AppId',
+                'app_secret'=>'secret'
+            ]);
+
+            if($validate->fails()){
+                return \redirect()->back()->withErrors($validate)->withInput();
+            }
+
+            $res = DB::table('shop')->where('id',$id)->update(
+                [
+                    'shopname'=>Input::get('shopname'),
+                    'app_id'=>Input::get('app_id'),
+                    'app_secret'=>Input::get('app_secret'),
+                    'delivery_template_id' => Input::get('delivery_template_id'),
+                    'savePic' => Input::get('savePic'),
+                    'type' => Input::get('type')
+                ]
+            );
+
+            if($res){
+                return \Redirect::route('shop',['type'=>Input::get('type')]);
+            }
+            else{
+                return \Redirect::to('shop')->with('messag','添加失败');
+            }
+
+
+
+        }
+        $data = !$data ? []:$data;
+
+        return View::make('admin.shopform',['infos'=>$data]);
+    }
+
+    /**
+     * 同步店铺分类
+     */
+    public  function syncCategoryAction(){
+        $type = Input::get('type');
+        $shop = \DB::table('shop')->find(Input::get('shop'));
+        if($type == 1 && $shop){
+            $yzApi = YouzanApi::getInstance($shop->app_id, $shop->app_secret);
+        }
+
+    }
+
+    public  function  demo(){
+        $appId = '58fb8f0606bdb5ef45'; //请填入你有赞店铺后台-营销-有赞API的AppId
+        $appSecret = '1342d112176385ebeb5eaf2f98431ee9';//请填入你有赞店铺后台-营销-有赞API的AppSecret
+        $client = new \YZSignClient($appId, $appSecret);
+        //$method = 'youzan.shop.get';//要调用的api名称
+        $method = 'youzan.logistics.template.get';//要调用的api名称
+        $methodVersion = '3.0.0';//要调用的api版本号
+
+        $params = ['template_id'=>398698];
+
+       dd( $client->post($method,$methodVersion,$params));
+    }
+}

+ 678 - 0
app/Http/Controllers/Admin/SupplyController.php

@@ -0,0 +1,678 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use app\Lib\Pagination;
+use app\Lib\Utils;
+use App\Lib\Weidian\weidianApi;
+use App\Lib\Youzan\YouzanApi;
+use App\Model\admin\GoodModel;
+use App\Model\admin\SupplyModel;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Input;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Validation\Rules\In;
+use \View;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Redirect;
+use GuzzleHttp;
+use Cache;
+
+class SupplyController extends Controller
+{
+
+    public function __construct()
+    {
+        if (!Auth::check()) {
+            return Redirect::to("admin-login");
+        }
+    }
+
+    public function addAction(Request $request)
+    {
+        if ($request->isMethod('post')) {
+            $validate = \Validator::make($request->input(), [
+                'supplyname' => "required",
+                'supplykey' => "required",
+                'merchant_id' => "required",
+                'apihost' => "required",
+            ], [
+                'required' => ":attribute必填项不能为空",
+            ], [
+                'supplyname' => '供应商名',
+                'supplykey' => '密钥',
+                'merchant_id' => '商户ID',
+                'apihost' => '接口主机',
+            ]);
+
+            if ($validate->fails()) {
+                return \redirect()->back()->withErrors($validate)->withInput();
+            }
+
+            $supply = new SupplyModel();
+            $supply->supplyname = Input::get('supplyname');
+            $supply->supplykey = Input::get('supplykey');
+            $supply->merchant_id = Input::get('merchant_id');
+            $supply->apihost = Input::get('apihost');
+            $supply->createtime = time();
+            if ($supply->save()) {
+                return Redirect::to('supply-list')->with('message', '操作成功!');
+            } else {
+                return \redirect()->back()->with('message', '添加失败!');
+            }
+        }
+
+        return View::make("admin.supplyform")->with('message', '添加成功!');
+    }
+
+    public function listAction()
+    {
+        $supply = SupplyModel::paginate(20);
+        return View::make("admin.supply", ['list' => $supply]);
+    }
+
+    public function updateAction(Request $request, $id)
+    {
+        $supply = SupplyModel::find($id);
+        if ($request->isMethod('post')) {
+            $supply->supplyname = Input::get('supplyname');
+            $supply->supplykey = Input::get('supplykey');
+            $supply->merchant_id = Input::get('merchant_id');
+            $supply->apihost = Input::get('apihost');
+            if ($supply->save()) {
+                return Redirect::to('supply-list')->with('message', '操作成功!');
+            } else {
+                return \redirect()->back()->with('message', '添加失败!');
+            }
+        }
+
+        return View::make("admin.supplyform", ['supply' => $supply]);
+    }
+
+    /*
+     * 获取渠道列表以及对应的分类
+     * */
+    public function sourceAction()
+    {
+
+        $supplies = SupplyModel::all();
+        foreach ($supplies as $s) {
+            if ($s->type == 1) {
+                $data = ['opcode' => 'get_category_list', 'merchant_id' => $s->merchant_id]; //获取类别
+                ksort($data);
+                $string = Utils::createLinkstring($data);
+                $data['sign'] = md5($string . $s->supplykey);
+                $data['sign_type'] = 'MD5';
+                $s->apihost = Utils::endWith($s->apihost, '/') ? $s->apihost : $s->apihost . "/";
+
+                $url = $s->apihost . 'api/service/business';
+                $res = Utils::curlRequest($url, json_encode($data));
+                $list = json_decode($res);
+                Cache::put("goods_cat_cid" . $s->id, serialize($s));
+            }
+
+        }
+
+        if (!isset($list->category_list)) {
+            return isset($list->ret_msg) ?: dd($list);
+        }
+        $category_list = json_decode($list->category_list);
+        return View::make("admin.supplies", ['supplies' => $supplies, 'list' => $category_list]);
+    }
+
+    public function goodsViewsAction(Request $request)
+    {
+
+        $settings = \DB::table('settings')->get();
+        $settingArray = array();
+        if ($settings) {
+            foreach ($settings as $v) {
+                $settingArray[$v->skey] = $v->svalue;
+            }
+        }
+        $success = $fail = 0 ;
+        $message = "";
+        if ($request->isMethod('post')) {
+
+            $shops = \DB::table('shop')->find(Input::get('shop'));
+            if ($shops) {
+
+                foreach (Input::get('skuid') as $key) {
+                    $stock = Input::get('sku_stock_num_show')[$key];
+                    $isImport = \DB::table('goods')->where(['shopid' => $shops->id, 'sku_id' => $key])->first(); //是否已经导入过
+                    $imgs = $skus = array();
+
+                    $price = Input::get('sku_price')[$key] / 100;
+                    if (Input::get('addprice') == 'add_price') {
+                        $price = $skus[0]['price'] = ceil($price + $settingArray['cf_price']);
+
+                    } elseif (Input::get('addprice') == 'cf_price') {
+                        $skus[0]['price'] = $price = ceil($price * $settingArray['cf_price']);
+                    }
+
+                    $good = new GoodModel();
+                    $good->shopid = $shops->id;
+                    $good->type = $shops->type;
+
+                    $good->sku_id = $key;//Input::get('skuid')[$key];
+                    $good->sku_name = Input::get('sku_name')[$key];
+                    $good->sku_stock_num_show = $stock;
+                    $good->sku_price = $price;
+                    $good->brand_name = Input::get('brand_name')[$key];
+
+                    $good->country_name = Input::get('country_name')[$key];
+                    $good->sku_weight = Input::get('sku_weight')[$key];
+                    $good->sku_weight_unit = Input::get('sku_weight_unit')[$key];
+                    $good->trade_id = Input::get('trade_id')[$key];
+
+                    $good->country_logo = Input::get('country_logo')[$key];
+                    $good->sku_detail = Input::get('sku_detail')[$key];
+                    $good->country_map = Input::get('country_map')[$key];
+                    $good->model_type = Input::get('model_type')[$key];
+                    $good->gstatus = 0;
+
+
+                    if (isset(Input::get('quality_start_date')[$key]) && !empty(Input::get('quality_start_date')[$key])) {
+                        $good->quality_start_date = Input::get('quality_start_date')[$key];
+                        $good->quality_end_date = Input::get('quality_end_date')[$key];
+                    }
+
+                    if (Input::get('trade_id')[$key] == 2) {
+                        $trade = ' 直邮商品';
+                    } elseif (Input::get('trade_id')[$key] == 1) {
+                        $trade = '保税商品';
+                    } elseif (Input::get('trade_id')[$key] == 3) {
+                        $trade = '完税商品';
+                    } else {
+                        $trade = '售后商品';
+                    }
+
+                    $item_comment = Input::get('sku_name')[$key] . "\n品牌:" . Input::get('brand_name')[$key] . "\n产地:" . Input::get('country_name')[$key] . "\n重量:"
+                        . Input::get('sku_weight')[$key] . Input::get('sku_weight_unit')[$key] . "\n贸易类型:" . $trade;
+
+                    if (!empty(Input::get('quality_start_date')[$key])) {
+                        $item_comment .= "\n保质期:" . Input::get('quality_start_date')[$key] . ' - ' . Input::get('quality_end_date')[$key];
+                    }
+
+                    if ($shops->type == 1) {  //处理有赞
+                        $yzApi = YouzanApi::getInstance($shops->app_id, $shops->app_secret);
+                        //更新商品库存信息。
+                        if ($isImport && Input::get('updateStock')) {
+                            $getParams = ['num_iid' => $isImport->item_id];
+                            $productInfo = $yzApi->getProduct($getParams);
+                            if ($productInfo['code'] == 200 && isset($productInfo['response'])) { //商品存在
+                                $skusInfo = $productInfo['response']['item']['skus'];
+
+                                $skuParams = [
+                                    'num_iid' => $skusInfo[0]['num_iid'],
+                                    'sku_id' =>  $skusInfo[0]['sku_id'],
+                                    'quantity' => $stock,
+                                    'price' => $price,
+                                    'outer_id' => $key,
+                                ];
+                                $result = $yzApi->updateSkuInfos($skuParams);
+                                if ($result['code'] == 200 && isset($result['response'])) {
+                                    \DB::table('goods')->where(['shopid' => $shops->id, 'item_id' => $isImport->item_id])
+                                        ->update(['sku_stock_num_show' => $stock, 'gstatus' => 1, 'sku_price' => $price]);
+                                    $success++;
+                                } else {
+                                    $fail++;
+                                }
+
+                            }
+                            continue;
+
+                        }
+
+                        $params = [
+                            'title' => Input::get('sku_name')[$key],
+                            'price' => $price,
+                            'post_fee' => '0',
+                            'outer_id' => $key,
+
+                            'quantity' => Input::get('sku_stock_num_show')[$key],
+                            'delivery_template_id' => $shops->delivery_template_id ? $shops->delivery_template_id : $settingArray['yz_template'],
+                            'is_display' => 0
+                        ];
+
+                        $skus_with_json = [];
+                        $skus_with_json[0]['sku_property'] = ['贸易类型' => $trade];
+                        $skus_with_json[0]['sku_price'] = $price;
+                        $skus_with_json[0]['sku_quantity'] = Input::get('sku_stock_num_show')[$key];
+                        $skus_with_json[0]['sku_outer_id'] = $key;
+
+                        $params['skus_with_json'] = json_encode($skus_with_json);
+
+                        if (!is_dir(storage_path() . '/product')) {
+                            mkdir(storage_path() . '/product');
+                        }
+                        if (!is_dir(storage_path('product/') . $key)) {
+                            mkdir(storage_path('product/') . $key);
+                        }
+                        $file = Utils::downloadImage(Input::get('sku_pic')[$key], md5(Input::get('sku_pic')[$key]), storage_path('product/' . $key));
+                        if (!$file) throw new Exception('没有商品主图');
+                        $files = [
+                            [
+                                'url' => $file['saveDir'] . '/' . $file['fileName'],
+                                'field' => 'images[]',
+                            ],
+
+                        ];
+                        $pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";
+                        preg_match_all($pattern, Input::get('sku_detail')[$key], $match);
+                        $params['desc'] = '<p>' . str_replace("\n", "<br/>", $item_comment) . "</p>";
+                        foreach ($match[1] as $img) {
+                            if ($shops->savePic) {
+                                $file = Utils::downloadImage($img, md5(Input::get('sku_pic')[$key]), storage_path('product/' . $key));
+                                if (!$file) continue;
+                                $files[] = ['url' => $file['saveDir'] . '/' . $file['fileName'], 'field' => 'images[]'];
+
+                            } else {
+                                $params['desc'] .= '<img src="' . $img . '"  />';
+                            }
+                        }
+                        $params['desc'] .= '</p>';
+
+                        $result = $yzApi->addProduct($params, $files);
+                        if ($result['code'] == 200 && isset($result['response'])) {
+                            $good->item_id = $result['response']['item']['num_iid'];
+                            $good->sku_pic = $result['response']['item']['pic_url'];
+                            $good->save();
+                            $success++;
+                        } else {
+                            $fail++;
+                        }
+
+                    } else if ($shops->type == 2) { //处理微店
+                        $accessToken = weidianApi::get_accesstoken($shops->app_id, $shops->app_secret);
+                        \DB::table('shop')->where('id', $shops->id)->update(['access_token' => $accessToken]);
+                        $wdProductApi = new \ProductClientApi($accessToken);
+
+                        if ($isImport && Input::get('updateStock')) {
+
+                            $result = $wdProductApi->getProduct($isImport->item_id)->getDataAsObject();
+                            if ($result->status->status_code == 0) { //检索商品成功!
+                                $items = $result->result->skus;
+                                $skus_update_items = [];
+                                foreach ($items as $item) {
+                                    $skus_update_items [] = ['item_id' => $isImport->item_id, 'item_sku_id' => $item->id, 'stock' => $stock];
+                                }
+                                $res = $wdProductApi->updateStock($skus_update_items);
+                                if ($res) {
+                                    $success++;
+                                } else {
+                                    $fail++;
+                                }
+                                continue;
+                            }
+
+                        }
+
+                        $imgUlr = $wdProductApi->uploadProductImage("@" . Input::get('sku_pic')[$key])->data;
+                        $imgUlr = json_decode($imgUlr);
+                        $skus[0]['img'] = $imgUlr->result;
+                        $saveImage = $imgUlr->result;
+                        $imgs[] = $imgUlr->result;
+
+
+                        $pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";
+                        preg_match_all($pattern, Input::get('sku_detail')[$key], $match);
+
+                        foreach ($match[1] as $img) {
+                            $imgUlr = $wdProductApi->uploadProductImage("@" . $img)->data;
+                            $imgUlr = json_decode($imgUlr);
+                            $imgs[] = $imgUlr->result;
+                        }
+
+                        if (Input::get('addprice') == 'add_price') {
+                            $price = $skus[0]['price'] = ceil($price + $settingArray['cf_price']);
+
+                        } elseif (Input::get('addprice') == 'cf_price') {
+                            $skus[0]['price'] = $price = ceil($price * $settingArray['cf_price']);
+                        }
+                        $skus[0]['title'] = Input::get('sku_name')[$key];
+                        $skus[0]['stock'] = Input::get('sku_stock_num_show')[$key];
+
+
+                        $skus[0]['sku_merchant_code'] = $key;
+                        $merchant_code = $key;
+
+
+                        $item_name = trim(Input::get('sku_name')[$key]);
+                        $free_delivery = 1; //是否包邮
+                        $remote_free_delivery = 0;
+                        if (Input::get('model_type') == 2 || Input::get('model_type') == 1) {
+                            $free_delivery = 0; //包邮
+                            if (Input::get('model_type') == 2) { //部分包邮
+                                $remote_free_delivery = 0;
+                            } else {
+                                $remote_free_delivery = 1; //偏远地区是否包邮:1包邮,0不包邮只有在free_delivery为1时候有效,当free_delivery为0时无论传入何值都不包邮
+                            }
+                        }
+
+                        //添加商品
+                        $response = $wdProductApi->addProduct($item_name, $price, [], $stock, $item_comment, $merchant_code, $imgs, $free_delivery, 2, $skus, $remote_free_delivery);
+                        if (!$response->getDataAsObject()) {
+                            Log::info("导入 " . $key . " 失败");
+
+                            $fail++;
+                            continue;
+                        }
+
+                        $add_item_id = $response->getDataAsObject()->result->item_id;
+                        $good->item_id = $add_item_id;
+                        $good->sku_pic = $saveImage;
+                        $good->save();
+                        $success++;
+
+
+                    }
+                }
+                $message = $success . '条操作成功,' . $fail . '条操作失败';
+            } else {
+
+                $message = '选择的店铺不存在!';
+            }
+
+            \redirect()->refresh();
+        }
+
+        $supply = SupplyModel::where('id', Input::get('sid'))->first();
+        if ($supply) {
+            $page = intval(Input::get('page')) ?: 1;
+            $limit = intval(Input::get('limit')) ?: 10;
+            $data = ['opcode' => 'get_goods_list', 'merchant_id' => $supply->merchant_id,
+                'category_id' => Input::get('cid'), 'page_size' => $limit, 'page_index' => $page - 1]; //获取产品列表gi
+            ksort($data);
+            $string = Utils::createLinkstring($data);
+
+            $data['sign'] = md5($string . $supply->supplykey);
+            $data['sign_type'] = 'MD5';
+            $supply->apihost = Utils::endWith($supply->apihost, '/') ? $supply->apihost : $supply->apihost . "/";
+
+            $url = $supply->apihost . 'api/service/business';
+            $res = Utils::curlRequest($url, json_encode($data));
+            $list = json_decode($res);
+            if (Input::get('debug') == 1 || !$list) dd($list);
+
+            $total = intval($list->total);
+            $markup = "";
+            if ($total > $limit) {
+
+                $url = route("goodsview", ['sid' => Input::get('sid'), 'cid' => Input::get('cid'), 'cat_name' => Input::get('cat_name')]);
+                $params = array(
+                    'total_rows' => intval($total), #(必须)
+                    'method' => 'html', #(必须)
+                    'parameter' => $url . "&page=@",//url()->current()."?" , //'xxx.com/20-0-0-0-40-?.html',  #(必须)
+                    'now_page' => $page,  #(必须)
+                    'list_rows' => $limit, #(可选) 默认为15
+                );
+                $pagination = new Pagination($params);
+                $markup = $pagination->show(2);
+            }
+
+            $shops = \DB::table('shop')->get();
+            return View::make('admin.goodsList', ['list' => $list, 'shops' => $shops, 'supply' => $supply,
+                'markup' => $markup, 'settings' => $settingArray,'message'=>$message, 'cat' => urldecode(Input::get('cat_name'))]);
+        }
+
+
+    }
+
+    public function storeGoodsAction(Request $request)
+    {
+        $settings = \DB::table('settings')->get();
+        $settingArray = array();
+        if ($settings) {
+            foreach ($settings as $v) {
+                $settingArray[$v->skey] = $v->svalue;
+            }
+        }
+
+        $shops = \DB::table('shop')->find(Input::get('shop'));
+        if ($shops) {
+            $success = $fail = 0;
+            foreach (Input::get('skuid') as $key) {
+                $stock = Input::get('sku_stock_num_show')[$key];
+                $isImport = \DB::table('goods')->where(['shopid' => $shops->id, 'sku_id' => $key])->first(); //是否已经导入过
+                $imgs = $skus = array();
+
+                $price = Input::get('sku_price')[$key] / 100;
+                if (Input::get('addprice') == 'add_price') {
+                    $price = $skus[0]['price'] = ceil($price + $settingArray['cf_price']);
+
+                } elseif (Input::get('addprice') == 'cf_price') {
+                    $skus[0]['price'] = $price = ceil($price * $settingArray['cf_price']);
+                }
+
+                $good = new GoodModel();
+                $good->shopid = $shops->id;
+                $good->type = $shops->type;
+
+                $good->sku_id = $key;//Input::get('skuid')[$key];
+                $good->sku_name = Input::get('sku_name')[$key];
+                $good->sku_stock_num_show = $stock;
+                $good->sku_price = $price;
+                $good->brand_name = Input::get('brand_name')[$key];
+
+                $good->country_name = Input::get('country_name')[$key];
+                $good->sku_weight = Input::get('sku_weight')[$key];
+                $good->sku_weight_unit = Input::get('sku_weight_unit')[$key];
+                $good->trade_id = Input::get('trade_id')[$key];
+
+                $good->country_logo = Input::get('country_logo')[$key];
+                $good->sku_detail = Input::get('sku_detail')[$key];
+                $good->country_map = Input::get('country_map')[$key];
+                $good->model_type = Input::get('model_type')[$key];
+                $good->gstatus = 0;
+
+                $quality_start_date = Input::get('quality_start_date');
+                if (isset($quality_start_date) && !empty($quality_start_date)) {
+                    $good->quality_start_date = Input::get('quality_start_date')[$key];
+                    $good->quality_end_date = Input::get('quality_end_date')[$key];
+                }
+
+                if (Input::get('trade_id')[$key] == 2) {
+                    $trade = ' 直邮商品';
+                } elseif (Input::get('trade_id')[$key] == 1) {
+                    $trade = '保税商品';
+                } elseif (Input::get('trade_id')[$key] == 3) {
+                    $trade = '完税商品';
+                } else {
+                    $trade = '售后商品';
+                }
+
+                $item_comment = Input::get('sku_name')[$key] . "\n品牌:" . Input::get('brand_name')[$key] . "\n产地:" . Input::get('country_name')[$key] . "\n重量:"
+                    . Input::get('sku_weight')[$key] . Input::get('sku_weight_unit')[$key] . "\n贸易类型:" . $trade;
+
+                if (!empty(Input::get('quality_start_date')[$key])) {
+                    $item_comment .= "\n保质期:" . Input::get('quality_start_date')[$key] . ' - ' . Input::get('quality_end_date')[$key];
+                }
+
+                if ($shops->type == 1) {  //处理有赞
+                    $yzApi = YouzanApi::getInstance($shops->app_id, $shops->app_secret);
+                    //更新商品库存信息。
+                    if ($isImport && Input::get('updateStock')) {
+                        $getParams = ['num_iid' => $isImport->item_id];
+                        $productInfo = $yzApi->getProduct($getParams);
+                        if ($productInfo['code'] == 200 && isset($productInfo['response'])) { //商品存在
+                            $skusInfo = $productInfo['response']['item']['skus'];
+                            $skuParams = [
+                                'num_iid' => $skusInfo[0]->item_id,
+                                'sku_id' => $skusInfo[0]->sku_id,
+                                'quantity' => $stock,
+                                'price' => $price,
+                                'outer_id' => $key,
+                            ];
+                            $result = $yzApi->updateSkuInfos($skuParams);
+                            if ($result['code'] == 200 && isset($result['response'])) {
+                                \DB::table('goods')->where(['shopid' => $shops->id, 'item_id' => $isImport->item_id])
+                                    ->update(['sku_stock_num_show' => $stock, 'gstatus' => 1, 'sku_price' => $price]);
+                                $success++;
+                            } else {
+                                $fail++;
+                            }
+
+                        }
+                        continue;
+
+                    }
+
+                    $params = [
+                        'title' => Input::get('sku_name')[$key],
+                        'price' => $price,
+                        'post_fee' => '0',
+                        'outer_id' => $key,
+
+                        'quantity' => Input::get('sku_stock_num_show')[$key],
+                        'delivery_template_id' => $shops->delivery_template_id ? $shops->delivery_template_id : $settingArray['yz_template'],
+                        'is_display' => 0
+                    ];
+
+                    $skus_with_json = [];
+                    $skus_with_json[0]['sku_property'] = ['贸易类型' => $trade];
+                    $skus_with_json[0]['sku_price'] = $price;
+                    $skus_with_json[0]['sku_quantity'] = Input::get('sku_stock_num_show')[$key];
+                    $skus_with_json[0]['sku_outer_id'] = $key;
+
+                    $params['skus_with_json'] = json_encode($skus_with_json);
+
+                    if (!is_dir(storage_path() . '/product')) {
+                        mkdir(storage_path() . '/product');
+                    }
+                    if (!is_dir(storage_path('product/') . $key)) {
+                        mkdir(storage_path('product/') . $key);
+                    }
+                    $file = Utils::downloadImage(Input::get('sku_pic')[$key], md5(Input::get('sku_pic')[$key]), storage_path('product/' . $key));
+                    if (!$file) throw new Exception('没有商品主图');
+                    $files = [
+                        [
+                            'url' => $file['saveDir'] . '/' . $file['fileName'],
+                            'field' => 'images[]',
+                        ],
+
+                    ];
+                    $pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";
+                    preg_match_all($pattern, Input::get('sku_detail')[$key], $match);
+                    $params['desc'] = '<p>' . str_replace("\n", "<br/>", $item_comment) . "</p>";
+                    foreach ($match[1] as $img) {
+                        if ($shops->savePic) {
+                            $file = Utils::downloadImage($img, md5(Input::get('sku_pic')[$key]), storage_path('product/' . $key));
+                            if (!$file) continue;
+                            $files[] = ['url' => $file['saveDir'] . '/' . $file['fileName'], 'field' => 'images[]'];
+
+                        } else {
+                            $params['desc'] .= '<img src="' . $img . '"  />';
+                        }
+                    }
+                    $params['desc'] .= '</p>';
+
+                    $result = $yzApi->addProduct($params, $files);
+                    if ($result['code'] == 200 && isset($result['response'])) {
+                        $good->item_id = $result['response']['item']['num_iid'];
+                        $good->sku_pic = $result['response']['item']['pic_url'];
+                        $good->save();
+                        $success++;
+                    } else {
+                        $fail++;
+                    }
+
+                } else if ($shops->type == 2) { //处理微店
+                    $accessToken = weidianApi::get_accesstoken($shops->app_id, $shops->app_secret);
+                    \DB::table('shop')->where('id', $shops->id)->update(['access_token' => $accessToken]);
+                    $wdProductApi = new \ProductClientApi($accessToken);
+
+                    if ($isImport && Input::get('updateStock')) {
+
+                        $result = $wdProductApi->getProduct($isImport->item_id)->getDataAsObject();
+                        if ($result->status->status_code == 0) { //检索商品成功!
+                            $items = $result->result->skus;
+                            $skus_update_items = [];
+                            foreach ($items as $item) {
+                                $skus_update_items [] = ['item_id' => $isImport->item_id, 'item_sku_id' => $item->id, 'stock' => $stock];
+                            }
+                            $res = $wdProductApi->updateStock($skus_update_items);
+                            if ($res) {
+                                $success++;
+                            } else {
+                                $fail++;
+                            }
+                            continue;
+                        }
+
+                    }
+
+                    $imgUlr = $wdProductApi->uploadProductImage("@" . Input::get('sku_pic')[$key])->data;
+                    $imgUlr = json_decode($imgUlr);
+                    $skus[0]['img'] = $imgUlr->result;
+                    $saveImage = $imgUlr->result;
+                    $imgs[] = $imgUlr->result;
+
+
+                    $pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";
+                    preg_match_all($pattern, Input::get('sku_detail')[$key], $match);
+
+                    foreach ($match[1] as $img) {
+                        $imgUlr = $wdProductApi->uploadProductImage("@" . $img)->data;
+                        $imgUlr = json_decode($imgUlr);
+                        $imgs[] = $imgUlr->result;
+                    }
+
+                    if (Input::get('addprice') == 'add_price') {
+                        $price = $skus[0]['price'] = ceil($price + $settingArray['cf_price']);
+
+                    } elseif (Input::get('addprice') == 'cf_price') {
+                        $skus[0]['price'] = $price = ceil($price * $settingArray['cf_price']);
+                    }
+                    $skus[0]['title'] = Input::get('sku_name')[$key];
+                    $skus[0]['stock'] = Input::get('sku_stock_num_show')[$key];
+
+
+                    $skus[0]['sku_merchant_code'] = $key;
+                    $merchant_code = $key;
+
+
+                    $item_name = trim(Input::get('sku_name')[$key]);
+                    $free_delivery = 1; //是否包邮
+                    $remote_free_delivery = 0;
+                    if (Input::get('model_type') == 2 || Input::get('model_type') == 1) {
+                        $free_delivery = 0; //包邮
+                        if (Input::get('model_type') == 2) { //部分包邮
+                            $remote_free_delivery = 0;
+                        } else {
+                            $remote_free_delivery = 1; //偏远地区是否包邮:1包邮,0不包邮只有在free_delivery为1时候有效,当free_delivery为0时无论传入何值都不包邮
+                        }
+                    }
+
+                    //添加商品
+                    $response = $wdProductApi->addProduct($item_name, $price, [], $stock, $item_comment, $merchant_code, $imgs, $free_delivery, 2, $skus, $remote_free_delivery);
+                    if (!$response->getDataAsObject()) {
+                        Log::info("导入 " . $key . " 失败");
+
+                        $fail++;
+                        continue;
+                    }
+
+                    $add_item_id = $response->getDataAsObject()->result->item_id;
+                    $good->item_id = $add_item_id;
+                    $good->sku_pic = $saveImage;
+                    $good->save();
+                    $success++;
+
+
+                }
+            }
+            $request->session()->flash('message', $success . '条操作成功,' . $fail . '条操作失败');
+            $request->session()->flash('do', 1);
+        } else {
+
+            $request->session()->flash('message', '选择的店铺不存在!');
+        }
+
+        Redirect::back();
+
+    }
+
+
+}

+ 32 - 0
app/Http/Controllers/Auth/ForgotPasswordController.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
+
+class ForgotPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password reset emails and
+    | includes a trait which assists in sending these notifications from
+    | your application to your users. Feel free to explore this trait.
+    |
+    */
+
+    use SendsPasswordResetEmails;
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+}

+ 39 - 0
app/Http/Controllers/Auth/LoginController.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\AuthenticatesUsers;
+
+class LoginController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Login Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller handles authenticating users for the application and
+    | redirecting them to your home screen. The controller uses a trait
+    | to conveniently provide its functionality to your applications.
+    |
+    */
+
+    use AuthenticatesUsers;
+
+    /**
+     * Where to redirect users after login.
+     *
+     * @var string
+     */
+    protected $redirectTo = '/home';
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest')->except('logout');
+    }
+}

+ 71 - 0
app/Http/Controllers/Auth/RegisterController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\User;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Foundation\Auth\RegistersUsers;
+
+class RegisterController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Register Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller handles the registration of new users as well as their
+    | validation and creation. By default this controller uses a trait to
+    | provide this functionality without requiring any additional code.
+    |
+    */
+
+    use RegistersUsers;
+
+    /**
+     * Where to redirect users after registration.
+     *
+     * @var string
+     */
+    protected $redirectTo = '/home';
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+
+    /**
+     * Get a validator for an incoming registration request.
+     *
+     * @param  array  $data
+     * @return \Illuminate\Contracts\Validation\Validator
+     */
+    protected function validator(array $data)
+    {
+        return Validator::make($data, [
+            'name' => 'required|string|max:255',
+            'email' => 'required|string|email|max:255|unique:users',
+            'password' => 'required|string|min:6|confirmed',
+        ]);
+    }
+
+    /**
+     * Create a new user instance after a valid registration.
+     *
+     * @param  array  $data
+     * @return User
+     */
+    protected function create(array $data)
+    {
+        return User::create([
+            'name' => $data['name'],
+            'email' => $data['email'],
+            'password' => bcrypt($data['password']),
+        ]);
+    }
+}

+ 39 - 0
app/Http/Controllers/Auth/ResetPasswordController.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\ResetsPasswords;
+
+class ResetPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password reset requests
+    | and uses a simple trait to include this behavior. You're free to
+    | explore this trait and override any methods you wish to tweak.
+    |
+    */
+
+    use ResetsPasswords;
+
+    /**
+     * Where to redirect users after resetting their password.
+     *
+     * @var string
+     */
+    protected $redirectTo = '/home';
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+}

+ 13 - 0
app/Http/Controllers/Controller.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+}

+ 60 - 0
app/Http/Kernel.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace App\Http;
+
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
+
+class Kernel extends HttpKernel
+{
+    /**
+     * The application's global HTTP middleware stack.
+     *
+     * These middleware are run during every request to your application.
+     *
+     * @var array
+     */
+    protected $middleware = [
+        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
+        \App\Http\Middleware\TrimStrings::class,
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+    ];
+
+    /**
+     * The application's route middleware groups.
+     *
+     * @var array
+     */
+    protected $middlewareGroups = [
+        'web' => [
+            \App\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            // \Illuminate\Session\Middleware\AuthenticateSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \App\Http\Middleware\VerifyCsrfToken::class,
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+
+        'api' => [
+            'throttle:60,1',
+            'bindings',
+        ],
+    ];
+
+    /**
+     * The application's route middleware.
+     *
+     * These middleware may be assigned to groups or used individually.
+     *
+     * @var array
+     */
+    protected $routeMiddleware = [
+        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+    ];
+}

+ 17 - 0
app/Http/Middleware/EncryptCookies.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;
+
+class EncryptCookies extends BaseEncrypter
+{
+    /**
+     * The names of the cookies that should not be encrypted.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 26 - 0
app/Http/Middleware/RedirectIfAuthenticated.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+
+class RedirectIfAuthenticated
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @param  string|null  $guard
+     * @return mixed
+     */
+    public function handle($request, Closure $next, $guard = null)
+    {
+        if (Auth::guard($guard)->check()) {
+            return redirect('/home');
+        }
+
+        return $next($request);
+    }
+}

+ 18 - 0
app/Http/Middleware/TrimStrings.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\TrimStrings as BaseTrimmer;
+
+class TrimStrings extends BaseTrimmer
+{
+    /**
+     * The names of the attributes that should not be trimmed.
+     *
+     * @var array
+     */
+    protected $except = [
+        'password',
+        'password_confirmation',
+    ];
+}

+ 17 - 0
app/Http/Middleware/VerifyCsrfToken.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
+
+class VerifyCsrfToken extends BaseVerifier
+{
+    /**
+     * The URIs that should be excluded from CSRF verification.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 359 - 0
app/Lib/Pagination.php

@@ -0,0 +1,359 @@
+<?php
+/**
+ * 第三方分页类.
+ * User: yqj
+ * Date: 2017/5/3
+ * Time: 17:00
+ */
+/**
+ * Pagination
+ *
+ * Supplies an API for setting pagination details, and renders the resulting
+ * pagination markup (html) through the included render.inc.php file.
+ *
+ * @note    The SEO methods (canonical/rel) were written following Google's
+ *          suggested patterns. Namely, the canoical url excludes any
+ *          peripheral parameters that don't relate to the pagination
+ *          series. Whereas the prev/next rel link tags include any params
+ *          found in the request.
+ * @author  Oliver Nassar <onassar@gmail.com>
+ * @todo    add setter parameter type and range checks w/ exceptions
+ * @example
+ * <code>
+ *     // source inclusion
+ *     require_once APP . '/vendors/PHP-Pagination/Pagination.class.php';
+ *
+ *     // determine page (based on <_GET>)
+ *     $page = isset($_GET['page']) ? ((int) $_GET['page']) : 1;
+ *
+ *     // instantiate with page and records as constructor parameters
+ *     $pagination = (new Pagination($page, 200));
+ *     $markup = $pagination->parse();
+ * </code>
+ * @example
+ * <code>
+ *     // source inclusion
+ *     require_once APP . '/vendors/PHP-Pagination/Pagination.class.php';
+ *
+ *     // determine page (based on <_GET>)
+ *     $page = isset($_GET['page']) ? ((int) $_GET['page']) : 1;
+ *
+ *     // instantiate; set current page; set number of records
+ *     $pagination = (new Pagination());
+ *     $pagination->setCurrent($page);
+ *     $pagination->setTotal(200);
+ *
+ *     // grab rendered/parsed pagination markup
+ *     $markup = $pagination->parse();
+ * </code>
+ */
+namespace app\Lib;
+
+
+class Pagination
+{
+    public     $first_row;        //起始行数
+
+    public     $list_rows;        //列表每页显示行数
+
+    protected  $total_pages;      //总页数
+
+    protected  $total_rows;       //总行数
+
+    protected  $now_page;         //当前页数
+
+    protected  $method  = 'defalut'; //处理情况 Ajax分页 Html分页(静态化时) 普通get方式
+
+    protected  $parameter = '';
+
+    protected  $page_name;        //分页参数的名称
+
+    protected  $ajax_func_name;
+
+    public     $plus = 3;         //分页偏移量
+
+    protected  $url;
+
+
+    /**
+     * 构造函数
+     * @param unknown_type $data
+     */
+    public function __construct($data = array())
+    {
+        $this->total_rows = $data['total_rows'];
+
+        $this->parameter         = !empty($data['parameter']) ? $data['parameter'] : '';
+        $this->list_rows         = !empty($data['list_rows']) && $data['list_rows'] <= 100 ? $data['list_rows'] : 15;
+        $this->total_pages       = ceil($this->total_rows / $this->list_rows);
+        $this->page_name         = !empty($data['page_name']) ? $data['page_name'] : 'p';
+        $this->ajax_func_name    = !empty($data['ajax_func_name']) ? $data['ajax_func_name'] : '';
+
+        $this->method           = !empty($data['method']) ? $data['method'] : '';
+
+
+        /* 当前页面 */
+        if(!empty($data['now_page']))
+        {
+            $this->now_page = intval($data['now_page']);
+        }else{
+            $this->now_page   = !empty($_GET[$this->page_name]) ? intval($_GET[$this->page_name]):1;
+        }
+        $this->now_page   = $this->now_page <= 0 ? 1 : $this->now_page;
+
+
+        if(!empty($this->total_pages) && $this->now_page > $this->total_pages)
+        {
+            $this->now_page = $this->total_pages;
+        }
+        $this->first_row = $this->list_rows * ($this->now_page - 1);
+    }
+
+    /**
+     * 得到当前连接
+     * @param $page
+     * @param $text
+     * @return string
+     */
+    protected function _get_link($page,$text)
+    {
+        switch ($this->method) {
+            case 'ajax':
+                $parameter = '';
+                if($this->parameter)
+                {
+                    $parameter = ','.$this->parameter;
+                }
+                return '<a onclick="' . $this->ajax_func_name . '(\'' . $page . '\''.$parameter.')" href="javascript:void(0)">' . $text . '</a>' . "\n";
+                break;
+
+            case 'html':
+                $url = str_replace('@', $page,$this->parameter);
+                return '<li class="page-item"><a href="' .$url . '">' . $text . '</a>' . "</li>";
+                break;
+
+            default:
+                return '<a href="' . $this->_get_url($page) . '">' . $text . '</a>' . "\n";
+                break;
+        }
+    }
+
+
+    /**
+     * 设置当前页面链接
+     */
+    protected function _set_url()
+    {
+        $url  =  $_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')?'':"?").$this->parameter;
+        $parse = parse_url($url);
+        if(isset($parse['query'])) {
+            parse_str($parse['query'],$params);
+            unset($params[$this->page_name]);
+            $url   =  $parse['path'].'?'.http_build_query($params);
+        }
+        if(!empty($params))
+        {
+            $url .= '&';
+        }
+        $this->url = $url;
+    }
+
+    /**
+     * 得到$page的url
+     * @param $page 页面
+     * @return string
+     */
+    protected function _get_url($page)
+    {
+        if($this->url === NULL)
+        {
+            $this->_set_url();
+        }
+        //  $lable = strpos('&', $this->url) === FALSE ? '' : '&';
+        return $this->url . $this->page_name . '=' . $page;
+    }
+
+
+    /**
+     * 得到第一页
+     * @return string
+     */
+    public function first_page($name = '第一页')
+    {
+        if($this->now_page > 5)
+        {
+            return $this->_get_link('1', $name);
+        }
+        return '';
+    }
+
+    /**
+     * 最后一页
+     * @param $name
+     * @return string
+     */
+    public function last_page($name = '最后一页')
+    {
+        if($this->now_page < $this->total_pages - 5)
+        {
+            return $this->_get_link($this->total_pages, $name);
+        }
+        return '';
+    }
+
+    /**
+     * 上一页
+     * @return string
+     */
+    public function up_page($name = '上一页')
+    {
+        if($this->now_page != 1)
+        {
+            return $this->_get_link($this->now_page - 1, $name);
+        }
+        return '';
+    }
+
+    /**
+     * 下一页
+     * @return string
+     */
+    public function down_page($name = '下一页')
+    {
+        if($this->now_page < $this->total_pages)
+        {
+            return $this->_get_link($this->now_page + 1, $name);
+        }
+        return '';
+    }
+
+    /**
+     * 分页样式输出
+     * @param $param
+     * @return string
+     */
+    public function show($param = 1)
+    {
+        if($this->total_rows < 1)
+        {
+            return '';
+        }
+
+        $className = 'show_' . $param;
+
+        $classNames = get_class_methods($this);
+
+        if(in_array($className, $classNames))
+        {
+            return $this->$className();
+        }
+        return '';
+    }
+
+    protected function show_2()
+    {
+        if($this->total_pages != 1)
+        {
+            $return = '';
+            $return .= $this->up_page('<');
+            for($i = 1;$i<=$this->total_pages;$i++)
+            {
+                if($i == $this->now_page)
+                {
+                    $return .= "<li class='page-item active'><a class='page-link'>$i</a></li>";
+                }
+                else
+                {
+                    if($this->now_page-$i>=4 && $i != 1)
+                    {
+                        $return .="<span class='pageMore'>...</span>\n";
+                        $i = $this->now_page-3;
+                    }
+                    else
+                    {
+                        if($i >= $this->now_page+5 && $i != $this->total_pages)
+                        {
+                            $return .="<span>...</span>\n";
+                            $i = $this->total_pages;
+                        }
+                        $return .= $this->_get_link($i, $i) . "\n";
+                    }
+                }
+            }
+            $return .= $this->down_page('>');
+            return $return;
+        }
+    }
+
+    protected function show_1()
+    {
+        $plus = $this->plus;
+        if( $plus + $this->now_page > $this->total_pages)
+        {
+            $begin = $this->total_pages - $plus * 2;
+        }else{
+            $begin = $this->now_page - $plus;
+        }
+
+        $begin = ($begin >= 1) ? $begin : 1;
+        $return = '';
+        $return .= $this->first_page();
+        $return .= $this->up_page();
+        for ($i = $begin; $i <= $begin + $plus * 2;$i++)
+        {
+            if($i>$this->total_pages)
+            {
+                break;
+            }
+            if($i == $this->now_page)
+            {
+                $return .= "<li class='page-item active'><a class='page-link'>$i</a></li>";
+            }
+            else
+            {
+                $return .= $this->_get_link($i, $i) . "\n";
+            }
+        }
+        $return .= $this->down_page();
+        $return .= $this->last_page();
+        return $return;
+    }
+
+    protected function show_3()
+    {
+        $plus = $this->plus;
+        if( $plus + $this->now_page > $this->total_pages)
+        {
+            $begin = $this->total_pages - $plus * 2;
+        }else{
+            $begin = $this->now_page - $plus;
+        }
+        $begin = ($begin >= 1) ? $begin : 1;
+        $return = '总计 ' .$this->total_rows. ' 个记录分为 ' .$this->total_pages. ' 页, 当前第 ' . $this->now_page . ' 页 ';
+        $return .= ',每页 ';
+        $return .= '<input type="text" value="'.$this->list_rows.'" id="pageSize" size="3"> ';
+        $return .= $this->first_page()."\n";
+        $return .= $this->up_page()."\n";
+        $return .= $this->down_page()."\n";
+        $return .= $this->last_page()."\n";
+        $return .= '<select onchange="'.$this->ajax_func_name.'(this.value)" id="gotoPage">';
+
+        for ($i = $begin;$i<=$begin+10;$i++)
+        {
+            if($i>$this->total_pages)
+            {
+                break;
+            }
+            if($i == $this->now_page)
+            {
+                $return .= '<option selected="true" value="'.$i.'">'.$i.'</option>';
+            }
+            else
+            {
+                $return .= '<option value="' .$i. '">' .$i. '</option>';
+            }
+        }
+        $return .= '</select>';
+        return $return;
+    }
+}

+ 130 - 0
app/Lib/Utils.php

@@ -0,0 +1,130 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: yqj
+ * Date: 2017/5/2
+ * Time: 00:19
+ */
+
+namespace app\Lib;
+
+
+class Utils
+{
+    /**
+     * 发送请求
+     */
+    public static function curlRequest($url, $data)
+    {
+        $headers = ["Content-type: application/json;charset='utf-8'"];
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_HEADER, 0);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+        $respon = curl_exec($ch);
+        return $respon;
+    }
+
+    /**
+     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+     */
+    public static function createLinkstring($para)
+    {
+        $arg = "";
+        while (list ($key, $val) = each($para)) {
+            $arg .= $key . "=" . $val . "&";
+        }
+        //去掉最后一个&字符
+        $arg = substr($arg, 0, count($arg) - 2);
+
+        //如果存在转义字符,那么去掉转义
+        if (get_magic_quotes_gpc()) {
+            $arg = stripslashes($arg);
+        }
+
+        // dd($arg);
+        return str_replace(" ", "", $arg);
+        //return $arg.replace(" ","");
+    }
+
+    /**
+     * 下载远程图片到本地
+     *
+     * @param string $url 远程文件地址
+     * @param string $filename 保存后的文件名(为空时则为随机生成的文件名,否则为原文件名)
+     * @param array $fileType 允许的文件类型
+     * @param string $dirName 文件保存的路径(路径其余部分根据时间系统自动生成)
+     * @param int $type 远程获取文件的方式
+     * @return array 返回文件名、文件的保存路径
+     */
+    public static function downloadImage($url, $fileName = '', $dirName, $fileType = array('jpg', 'gif', 'png'), $type = 1)
+    {
+        if ($url == '') {
+            return false;
+        }
+
+        // 获取文件原文件名
+        $defaultFileName = basename($url);
+
+        // 获取文件类型
+        $suffix = substr(strrchr($url, '.'), 1);
+        if (!in_array($suffix, $fileType)) {
+            return false;
+        }
+
+        // 设置保存后的文件名
+        $fileName = $fileName == '' ? time() . rand(0, 9) . '.' . $suffix : $defaultFileName;
+
+        // 获取远程文件资源
+        if ($type) {
+            $ch = curl_init();
+            $timeout = 30;
+            curl_setopt($ch, CURLOPT_URL, $url);
+            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
+            $file = curl_exec($ch);
+            curl_close($ch);
+        } else {
+            ob_start();
+            readfile($url);
+            $file = ob_get_contents();
+            ob_end_clean();
+        }
+
+        // 设置文件保存路径
+        //$dirName = $dirName . '/' . date('Y', time()) . '/' . date('m', time()) . '/' . date('d', time());
+        $dirName = $dirName . '/' . date('Ym', time());
+        if (!file_exists($dirName)) {
+            mkdir($dirName, 0777, true);
+        }
+
+        if(!file_exists($dirName . '/' . $fileName)){
+            // 保存文件
+            $res = fopen($dirName . '/' . $fileName, 'a');
+            fwrite($res, $file);
+            fclose($res);
+        }
+
+        return array(
+            'fileName' => $fileName,
+            'saveDir' => $dirName
+        );
+    }
+
+
+    public static function startWith($str, $needle)
+    {
+        return strpos($str, $needle) === 0;
+    }
+
+    public static function endWith($haystack, $needle)
+    {
+        $length = strlen($needle);
+        if ($length == 0) return true;
+        return (substr($haystack, -$length) === $needle);
+    }
+}

+ 72 - 0
app/Lib/Weidian/Api.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Lib\Weidian;
+
+class weidianApi
+{
+    public  static  $access_token;
+    const  WEIDIAN_HOST = 'https://api.vdian.com';
+    const WEIDIAN_TOKEN_URL = self::WEIDIAN_HOST."/token?grant_type=client_credential";
+
+    public static function get_accesstoken($app_key, $secret)
+    {
+        $key = "token_" . $app_key;
+        $token = \Cache::get($key);
+
+       if(empty($token)) {
+            $url = self::WEIDIAN_TOKEN_URL . "&appkey={$app_key}&secret={$secret}";
+
+            $res = json_decode(self::ihttp_get($url), true);
+            if($res['status']['status_code'] == 0) {
+                $token = $res['result']['access_token'];
+                \Cache::add($key,$token,intval($res['result']['expire_in'] )/60);
+            }
+        }
+
+        self::$access_token = $token;
+        return $token;
+    }
+
+    public static function get_categories($token )
+    {
+
+        $param = json_encode(['showNoCate' => 0]);
+        $public = json_encode([
+            'method'        => 'weidian.cate.get.list',
+            'access_token'  => $token,
+            'version'       => '1.0'
+        ]);
+        $url = self::WEIDIAN_HOST."/api?param={$param}&public={$public}";
+        return json_decode(self::ihttp_get($url));
+    }
+
+    public static function create_goods($data, $token)
+    {
+        $param = json_encode($data);
+        $public = json_encode([
+            'method'        => 'vdian.item.add',
+            'access_token'  => $token,
+            'version'       => '1.0',
+            'format'        => 'json',
+        ]);
+        $url = self::WEIDIAN_HOST."/api?param={$param}&public={$public}";
+       // $url = addcslashes($url);
+      var_dump($url);
+        var_dump(file_get_contents($url));
+        var_dump(self::ihttp_get($url));
+        return json_decode(self::ihttp_get($url));
+    }
+
+    public static function ihttp_get($url)
+    {
+        $headers = ["Content-type: application/json;charset='utf-8'"];
+        $ch=curl_init();
+        curl_setopt($ch, CURLOPT_URL,$url );
+        curl_setopt($ch, CURLOPT_HEADER, 0);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+        $respon = curl_exec($ch);
+        return $respon;
+    }
+}

+ 15 - 0
app/Lib/Weidian/api/ApiBase.php

@@ -0,0 +1,15 @@
+<?php
+class ApiBase {
+	protected $access_token;
+	public function __construct($access_token) {
+		$this->access_token = $access_token;
+	}
+	public final function buildPublicParameter($method, $version = "1.0", $format = "json") {
+		return 'public=' . urlencode ( self::buildPublicValue ( $method, $version, $format ) );
+	}
+	public function buildPublicValue($method, $version = "1.0", $format = "json") {
+		return '{"method":"' . $method . '","access_token":"' . $this->access_token . '","version":"' . $version . '","format":"' . $format . '","lang":"php"}';
+	}
+}
+
+?>

+ 70 - 0
app/Lib/Weidian/api/CPSClientApi.php

@@ -0,0 +1,70 @@
+<?php
+/**
+ * CPS API
+ */
+class CPSClientApi extends ApiBase {
+	public function __construct($access_token) {
+		parent::__construct ( $access_token );
+	}
+	/**
+	 * 搜索CPS商品
+	 * http://wiki.open.weidian.com/index.php?title=%E6%90%9C%E7%B4%A2CPS%E5%95%86%E5%93%81
+	 *
+	 * @param unknown $keyword        	
+	 * @param number $page_size        	
+	 * @param number $page        	
+	 * @param string $min_price        	
+	 * @param string $max_price        	
+	 * @param string $min_cps_rate        	
+	 * @param string $man_cps_rate        	
+	 * @return HttpResponse
+	 */
+	public function searchCPSProduct($keyword, $page_size = 20, $page = 1, $min_price = null, $max_price = null, $min_cps_rate = null) {
+		$param = array (
+				"keyword" => $keyword,
+				"page_size" => $page_size,
+				"page" => $page 
+		);
+		if (! empty ( $min_price )) {
+			$param ["min_price"] = $min_cps_rate;
+		}
+		if (! empty ( $max_price )) {
+			$param ["max_price"] = $max_price;
+		}
+		if (! empty ( $min_cps_rate )) {
+			$param ["min_cps_rate"] = $min_cps_rate;
+		}
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => json_encode($param),
+				"public" => parent::buildPublicValue ( "vdian.cps.item.search" ) 
+		) );
+	}
+	/**
+	 * 获取CPS商品
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96CPS%E5%95%86%E5%93%81
+	 *
+	 * @param unknown $itemid        	
+	 * @return HttpResponse
+	 */
+	public function getCPSProduct($itemid) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $itemid . '"}',
+				"public" => parent::buildPublicValue ( "vdian.cps.item.get" ) 
+		) );
+	}
+	/**
+	 * 获取商品公开信息
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96%E5%95%86%E5%93%81%E5%85%AC%E5%BC%80%E4%BF%A1%E6%81%AF
+	 *
+	 * @param unknown $itemid        	
+	 * @return HttpResponse
+	 */
+	public function getProductPublicInfo($itemid) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $itemid . '"}',
+				"public" => parent::buildPublicValue ( "vdian.item.getpublic" ) 
+		) );
+	}
+}
+
+?>

+ 89 - 0
app/Lib/Weidian/api/OAuthClientApi.php

@@ -0,0 +1,89 @@
+<?php
+/**
+ * 微店OAuth API
+ */
+class OAuthClientApi extends ApiBase {
+	public function __construct() {
+	}
+	/**
+	 * 获取自用型AccessToken
+	 *
+	 * @ignore
+	 *
+	 *
+	 *
+	 *
+	 *
+	 *
+	 * @return HttpResponse
+	 */
+	public function getSelfoneAccessToken() {
+		global $oneself_appkey;
+		global $oneself_secret;
+		// 取自用型AccessToken链接
+		$url = API_HOST . 'token';
+		$parameters = array (
+				"grant_type" => "client_credential",
+				"appkey" => $oneself_appkey,
+				"secret" => $oneself_secret 
+		);
+		return NetUtils::getInstance ()->request ( $url, 'GET', $parameters );
+	}
+	
+	/**
+	 * 上传图片
+	 *
+	 * @ignore
+	 *
+	 *
+	 *
+	 *
+	 *
+	 *
+	 * @param unknown $img_path        	
+	 * @return HttpResponse
+	 */
+	public function uploadImage($access_token, $img_path) {
+		$url = API_HOST . 'media/upload';
+		return NetUtils::getInstance ()->uploadFile ( $url, array (
+				"access_token" => $access_token,
+				"media" => $img_path 
+		) );
+	}
+	/**
+	 * 使用Code换取AccessToken
+	 *
+	 * @param unknown $code        	
+	 * @return HttpResponse
+	 */
+	public function getAccessToken($code) {
+		$url = API_HOST . "oauth2/access_token";
+		global $appkey;
+		global $secret;
+		return NetUtils::getInstance ()->request ( $url, 'POST', array (
+				"grant_type" => "authorization_code",
+				"appkey" => $appkey,
+				"secret" => $secret,
+				"code" => $code 
+		) );
+	}
+	
+	/**
+	 *
+	 * @ignore 刷新access_token
+	 * @param unknown $refresh_token        	
+	 * @throws Exception
+	 * @return HttpResponse
+	 */
+	function refreshToken($refresh_token) {
+		$url = constant ( 'API_HOST' ) . "oauth2/refresh_token";
+		global $appkey;
+		return NetUtils::getInstance ()->post ( $url, array (
+				"grant_type" => "refresh_token",
+				"appkey" => $appkey,
+				"refresh_token" => $refresh_token 
+		) );
+	}
+}
+
+?>

+ 99 - 0
app/Lib/Weidian/api/OrderClientApi.php

@@ -0,0 +1,99 @@
+<?php
+class OrderClientApi extends ApiBase {
+	public function __construct($access_token) {
+		parent::__construct ( $access_token );
+	}
+	/**
+	 * 获取订单列表
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96%E8%AE%A2%E5%8D%95%E5%88%97%E8%A1%A8
+	 *
+	 * @param unknown $order_type        	
+	 * @param unknown $page_num        	
+	 * @param unknown $add_start        	
+	 * @param unknown $add_end        	
+	 * @return HttpResponse
+	 */
+	public function getOrderList($order_type, $page_num, $add_start, $add_end) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"page_num":' . $page_num . ',"order_type":"' . $order_type . '","add_start":"' . $add_start . '","add_end":"' . $add_end . '"}',
+				"public" => parent::buildPublicValue ( "vdian.order.list.get" ) 
+		) );
+	}
+	/**
+	 * 获取订单详情
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85
+	 *
+	 * @return HttpResponse
+	 */
+	public function getOrderDetails($order_id) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"order_id":"' . $order_id . '"}',
+				"public" => parent::buildPublicValue ( "vdian.order.get" ) 
+		) );
+	}
+	/**
+	 * 订单发货
+	 * http://wiki.open.weidian.com/index.php?title=%E8%AE%A2%E5%8D%95%E5%8F%91%E8%B4%A7
+	 *
+	 * @param unknown $order_id        	
+	 * @param unknown $express_type        	
+	 * @param unknown $express_no        	
+	 * @param string $express_custom  
+	 * @return HttpResponse      	
+	 */
+	public function orderDeliver($order_id, $express_type, $express_no, $express_custom = "", $express_custom = "") {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"order_id":"' . $order_id . '","express_type":"' . $express_type . '","express_no":"' . $express_no . '","express_custom":"' . $express_custom . '"}',
+				"public" => parent::buildPublicValue ( "vdian.order.deliver" ) 
+		) );
+	}
+	/**
+	 * 修改物流信息
+	 * http://wiki.open.weidian.com/index.php?title=%E4%BF%AE%E6%94%B9%E7%89%A9%E6%B5%81%E4%BF%A1%E6%81%AF
+	 *
+	 * @param unknown $order_id        	
+	 * @param unknown $express_type        	
+	 * @param unknown $express_no        	
+	 * @param string $express_note        	
+	 * @param string $express_custom       
+	 * @return HttpResponse 	
+	 */
+	public function modifyExpress($order_id, $express_type, $express_no, $express_note = "", $express_custom = "") {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"order_id":"' . $order_id . '","express_type":"' . $express_type . '","express_no":"' . $express_no . '","express_note":"' . $express_note . '","express_custom":"' . $express_custom . '"}',
+				"public" => parent::buildPublicValue ( "vdian.order.express.modify" ) 
+		) );
+	}
+	/**
+	 * 修改订单价格
+	 * http://wiki.open.weidian.com/index.php?title=%E4%BF%AE%E6%94%B9%E8%AE%A2%E5%8D%95%E4%BB%B7%E6%A0%BC
+	 *
+	 * @param unknown $order_id        	
+	 * @param unknown $total_items_price        	
+	 * @param unknown $express_price  
+	 * @return HttpResponse      	
+	 */
+	public function modifyOrderPrice($order_id, $total_items_price, $express_price) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"order_id":"' . $order_id . '","total_items_price":"' . $total_items_price . '","express_price":"' . $express_price . '"}',
+				"public" => parent::buildPublicValue ( "vdian.order.modify" ) 
+		) );
+	}
+	
+	/**
+	 * 订单退款
+	 * http://wiki.open.weidian.com/index.php?title=%E8%AE%A2%E5%8D%95%E9%80%80%E6%AC%BE
+	 *
+	 * @param unknown $order_id        	
+	 * @param unknown $is_accept     
+	 * @return HttpResponse   	
+	 */
+	public function orderRefundAccept($order_id, $is_accept) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"order_id":"' . $order_id . '","is_accept":"' . $is_accept . '"}',
+				"public" => parent::buildPublicValue ( "vdian.order.refund.accept" ) 
+		) );
+	}
+}
+
+?>

+ 368 - 0
app/Lib/Weidian/api/ProductClientApi.php

@@ -0,0 +1,368 @@
+<?php
+
+define ( 'API_HOST', 'https://api.vdian.com/' );
+
+/* 微店API */
+define ( 'WD_API', API_HOST . 'api' );
+/* DEBUG模式 */
+define ( 'DEBUG', FALSE );
+/* 在线模式-不会输出额外信息 */
+define ( 'ON_LINE', FALSE );
+/**
+ * 微店商品API
+ */
+class ProductClientApi extends ApiBase {
+
+	public function __construct($access_token) {
+		parent::__construct ( $access_token );
+	}
+	
+	/**
+	 * 获取单个商品
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96%E5%8D%95%E4%B8%AA%E5%95%86%E5%93%81
+	 * @return HttpResponse
+	 */
+	public function getProduct($item_id, $version = "1.0") {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $item_id . '"}',
+				"public" => parent::buildPublicValue('vdian.item.get', $version ) 
+		) );
+	}
+	/**
+	 * 获取全店商品
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96%E5%8D%95%E4%B8%AA%E5%95%86%E5%93%81
+	 *
+	 * @param number $page_num        	
+	 * @param number $page_size        	
+	 * @param number $orderby        	
+	 * @param string $version        	
+	 * @return HttpResponse
+	 */
+	public function getShopProduct($page_num = 1, $page_size = 10, $orderby = 1, $version = "1.0") {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"page_num":' . $page_num . ',"page_size":' . $page_size . ',"orderby":' . $orderby . '}',
+				"public" => parent::buildPublicValue ( 'vdian.item.list.get' ) 
+		) );
+	}
+	
+	/**
+	 * 创建微店商品
+	 * http://wiki.open.weidian.com/index.php?title=%E5%88%9B%E5%BB%BA%E5%BE%AE%E5%BA%97%E5%95%86%E5%93%81
+	 *
+	 * @param array $imgs        	
+	 * @param string $stock        	
+	 * @param string $price        	
+	 * @param string $item_name        	
+	 * @param string $fx_fee_rate        	
+	 * @param array $skus        	
+	 * @param string $merchant_code        
+	 * @return HttpResponse	
+	 */
+	public function createProduct(array $imgs, $stock, $price, $item_name, $fx_fee_rate, array $skus, $merchant_code,array $bigImgs) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"imgs":' . json_encode ( $imgs ) . ',
+				"stock":"' . $stock . '","price":"' . $price . '",
+				"item_name":"' . $item_name . '",
+				"fx_fee_rate":"' . $fx_fee_rate . '",
+				"skus":' . json_encode ( $skus ) . ',
+				"bigImgs:"' .json_encode ( $bigImgs ) . ',
+				"merchant_code":"' . $merchant_code . '"}',
+				"public" => parent::buildPublicValue ( 'vdian.item.add' )
+		) );
+	}
+
+    /**
+     * 发布商品 采用1.2版本接口
+     * @param $item_name
+     * @param $price
+     * @param $titles
+     * @param $stock
+     * @param $item_comment
+     * @param $merchant_code
+     * @param $bigImgs
+     * @param int $free_delivery
+     * @param int $status
+     * @param array $skus
+     * @param int $remote_free_delivery
+     * @return HttpResponse
+     * @author youngqj@126.com
+     */
+	public function addProduct($item_name,$price,$titles,$stock,$item_comment,$merchant_code,$bigImgs,$free_delivery=1,$status=2,$skus = array(),$remote_free_delivery= 0 ){
+        return NetUtils::getInstance ()->post ( WD_API, array (
+            "param" => '{
+                "bigImgs":' . json_encode ( $bigImgs ) . ',
+               "item_comment":'.json_encode($item_comment).',
+               "item_name":"'.$item_name.'",
+				"stock":"' . $stock . '",
+				"price":"' . $price . '",
+			 
+				"free_delivery":'.$free_delivery.',
+				"remote_free_delivery":"' . $remote_free_delivery . '",
+				"status":'.$status.',
+				"sku":' . json_encode ( $skus ) . ',
+				"titles":' . json_encode ( $titles ) . ',
+				"merchant_code":"' . $merchant_code . '"}',
+            "public" => parent::buildPublicValue ( 'vdian.item.add','1.2' )
+        ) );
+    }
+
+    /**
+     * 更新商品库存
+     * @param $items
+     * @return bool
+     * @author youngqj@126.com
+     */
+    public function  updateStock($items,$type="set"){
+        $result = NetUtils::getInstance ()->post ( WD_API, array (
+            "param" => '{"type":"'.$type.'","items":' . json_encode ( $items ) . '}',
+            "public" => parent::buildPublicValue ( 'vdian.item.stock.update' )
+        ) )->getDataAsObject ();
+        if ($result->status->status_code == 0) {
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+	/**
+	 * 删除单个商品
+	 *
+	 * @param string $itemid        	
+	 * @return true成功,false失败
+	 */
+	public function deleteProduct($itemid) {
+		$response = NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $itemid . '"}',
+				"public" => parent::buildPublicValue ( 'vdian.item.delete' ) 
+		) );
+		$res = $response->getDataAsObject ();
+		if ($res->status->status_code == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * 上传商品图片
+	 * http://wiki.open.weidian.com/index.php?title=%E9%80%9A%E7%94%A8API
+	 *
+	 * @ignore
+	 * @param unknown $img_path    
+	 * @return HttpResponse    	
+	 */
+	public function uploadProductImage($img_path) {
+		$url = API_HOST . 'media/upload';
+		$parameters = array (
+				"access_token" => $this->access_token,
+				"media" => $img_path 
+		);
+		$response = NetUtils::getInstance ()->uploadFile ( $url, $parameters );
+		return $response;
+	}
+	/**
+	 * 添加商品图片
+	 * http://wiki.open.weidian.com/index.php?title=%E6%B7%BB%E5%8A%A0%E5%95%86%E5%93%81%E5%9B%BE%E7%89%87
+	 *
+	 * @param string $itemid        	
+	 * @param array $imgs        	
+	 * @return true成功,false失败
+	 */
+	public function addProductImage($itemid, array $imgs) {
+		$result = NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $itemid . '","imgs":' . json_encode ( $imgs ) . '}',
+				"public" => parent::buildPublicValue ( 'vdian.item.image.add' ) 
+		) )->getDataAsObject ();
+		if ($result->status->status_code == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	/**
+	 * 删除商品图片
+	 * http://wiki.open.weidian.com/index.php?title=%E5%88%A0%E9%99%A4%E5%95%86%E5%93%81%E5%9B%BE%E7%89%87
+	 *
+	 * @param string $itemid        	
+	 * @param array $delete_imgs        	
+	 * @return true成功,false失败
+	 */
+	public function deleteProductImage($itemid, array $delete_imgs) {
+		$result = NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $itemid . '","delete_imgs":' . json_encode ( $delete_imgs ) . '}',
+				"public" => parent::buildPublicValue ( 'vdian.item.image.delete' ) 
+		) )->getDataAsObject ();
+		if ($result->status->status_code == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	/**
+	 * 更新商品信息
+	 * http://wiki.open.weidian.com/index.php?title=%E6%9B%B4%E6%96%B0%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF
+	 *
+	 * @param string $itemid        	
+	 * @param string $stock        	
+	 * @param string $price        	
+	 * @param string $item_name        	
+	 * @param string $fx_fee_rate        	
+	 * @param array $skus        	
+	 * @param string $merchant_code        	
+	 * @return HttpResponse
+	 */
+	public function updateProductInfo($itemid, $stock, $price, $item_name, $fx_fee_rate, array $skus, $merchant_code = "") {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"stock":"' . $stock . '","price":"' . $price . '","item_name":"' . $item_name . '","fx_fee_rate":"' . $fx_fee_rate . '","itemid":"' . $itemid . '","skus":' . json_encode ( $skus ) . ',"merchant_code":"' . $merchant_code . '"}',
+				"public" => parent::buildPublicValue ( 'vdian.item.update' ) 
+		) );
+	}
+	/**
+	 * 添加商品型号
+	 * http://wiki.open.weidian.com/index.php?title=%E6%B7%BB%E5%8A%A0%E5%95%86%E5%93%81%E5%9E%8B%E5%8F%B7
+	 *
+	 * @param string $itemid        	
+	 * @param array $skus        	
+	 * @return HttpResponse
+	 */
+	public function addProductSKU($itemid, array $skus) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"skus":' . json_encode ( $skus ) . ',"itemid":"' . $itemid . '"}',
+				"public" => parent::buildPublicValue ( 'vdian.item.sku.add' ) 
+		) );
+	}
+	
+	/**
+	 * 更新商品型号
+	 * http://wiki.open.weidian.com/index.php?title=%E6%9B%B4%E6%96%B0%E5%95%86%E5%93%81%E5%9E%8B%E5%8F%B7
+	 *
+	 * @param string $itemid        	
+	 * @param array $skus        	
+	 * @return HttpResponse
+	 */
+	public function updateProductSKU($itemid, array $skus) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"skus":' . json_encode ( $skus ) . ',"itemid":"' . $itemid . '"}',
+				"public" => parent::buildPublicValue ( 'vdian.item.sku.update' ) 
+		) );
+	}
+	/**
+	 * 删除商品型号
+	 * http://wiki.open.weidian.com/index.php?title=%E5%88%A0%E9%99%A4%E5%95%86%E5%93%81%E5%9E%8B%E5%8F%B7
+	 *
+	 * @param string $itemid        	
+	 * @param array<string> $skus        	
+	 * @return HttpResponse
+	 */
+	public function deleteProductSKU($itemid, array $skus) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"skus":' . json_encode ( $skus ) . ',"itemid":"' . $itemid . '"}',
+				"public" => parent::buildPublicValue ( 'vdian.item.sku.delete' ) 
+		) );
+	}
+	/**
+	 * 获取商品分类
+	 * http://wiki.open.weidian.com/index.php?title=%E8%8E%B7%E5%8F%96%E5%95%86%E5%93%81%E5%88%86%E7%B1%BB
+	 *
+	 * @return HttpResponse
+	 */
+	public function getProductCate() {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => "{}",
+				"public" => parent::buildPublicValue ( 'vdian.shop.cate.get' ) 
+		) );
+	}
+	/**
+	 * 新增商品分类
+	 * http://wiki.open.weidian.com/index.php?title=%E6%96%B0%E5%A2%9E%E5%95%86%E5%93%81%E5%88%86%E7%B1%BB
+	 * @return HttpResponse
+	 */
+	public function addProductCate(array $cates) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"cates":' . json_encode ( $cates ) . '}',
+				"public" => parent::buildPublicValue ( 'vdian.shop.cate.add' ) 
+		) );
+	}
+	/**
+	 * 编辑商品分类
+	 * http://wiki.open.weidian.com/index.php?title=%E7%BC%96%E8%BE%91%E5%95%86%E5%93%81%E5%88%86%E7%B1%BB
+	 *
+	 * @param array $cates        	
+	 * @return HttpResponse
+	 */
+	public function editProductCate(array $cates) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"cates":' . json_encode ( $cates ) . '}',
+				"public" => parent::buildPublicValue ( 'vdian.shop.cate.update' ) 
+		) );
+	}
+	/**
+	 * 删除商品分类
+	 * http://wiki.open.weidian.com/index.php?title=%E5%88%A0%E9%99%A4%E5%95%86%E5%93%81%E5%88%86%E7%B1%BB
+	 *
+	 * @param unknown $cate_id    
+	 * @return true or false    	
+	 */
+	public function deleteProductCate($cate_id) {
+		$response = NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"cate_id":' . $cate_id . '}',
+				"public" => parent::buildPublicValue ( 'vdian.shop.cate.delete' ) 
+		) );
+		if ($response->getDataAsObject ()->status->status_code == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	/**
+	 * 设置商品的分类
+	 * http://wiki.open.weidian.com/index.php?title=%E8%AE%BE%E7%BD%AE%E5%95%86%E5%93%81%E7%9A%84%E5%88%86%E7%B1%BB
+	 *
+	 * @param unknown $itemids        	
+	 * @param unknown $cate_ids        	
+	 * @return HttpResponse
+	 */
+	public function setProductCate($itemids, $cate_ids) {
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"item_ids":' . json_encode ( $itemids ) . ',"cate_ids":' . json_encode ( $cate_ids ) . '}',
+				"public" => parent::buildPublicValue ( 'vdian.item.cate.set' ) 
+		) );
+	}
+	/**
+	 * 取消商品的分类
+	 * http://wiki.open.weidian.com/index.php?title=%E5%8F%96%E6%B6%88%E5%95%86%E5%93%81%E7%9A%84%E5%88%86%E7%B1%BB
+	 *
+	 * @param unknown $itemid        	
+	 * @param unknown $cate_ids   
+	 * @return true or false     	
+	 */
+	public function cancelProductCate($itemid, $cate_ids) {
+		$response = NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":"' . $itemid . '","cate_ids":' . json_encode ( $cate_ids ) . '}',
+				"public" => parent::buildPublicValue ( 'vdian.item.cate.cancel' ) 
+		) );
+		if ($response->getDataAsObject ()->status->status_code == 0) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	/**
+	 * 商品上下架
+	 * http://wiki.open.weidian.com/index.php?title=%E5%95%86%E5%93%81%E4%B8%8A%E4%B8%8B%E6%9E%B6
+	 *
+	 * @param unknown $itemid        	
+	 * @param unknown $opt     
+	 * @return true or false   	
+	 */
+	public function productOnSale($itemid, $opt) {
+		$response = NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => '{"itemid":' . $itemid . ',"opt":' . $opt . '}',
+				"public" => parent::buildPublicValue ( 'weidian.item.onSale' ) 
+		) );
+		$result = $response->getDataAsObject ();
+		return $result->status->status_code == 0;
+	}
+}
+
+?>

+ 41 - 0
app/Lib/Weidian/api/SimpleApiClient.php

@@ -0,0 +1,41 @@
+<?php
+class SimpleApiClient extends ApiBase {
+	public function __construct() {
+	}
+	/**
+	 * HTTP post request
+	 * @param unknown $public
+	 * @param unknown $param
+	 * @return HttpResponse
+	 */
+	public function post($public, $param) {
+		if (is_array ( $public ) || is_object ( $public )) {
+			$public = json_encode ( $public );
+		}
+		if (is_array ( $param ) || is_object ( $param )) {
+			$param = json_encode ( $param );
+		}
+		return NetUtils::getInstance ()->post ( WD_API, array (
+				"param" => $param,
+				"public" => $public 
+		) );
+	}
+	/**
+	 * HTTP get request
+	 * @param unknown $public
+	 * @param unknown $param
+	 * @return HttpResponse
+	 */
+	public function get($public, $param) {
+		if (is_array ( $public ) || is_object ( $public )) {
+			$public = json_encode ( $public );
+		}
+		if (is_array ( $param ) || is_object ( $param )) {
+			$param = json_encode ( $param );
+		}
+		$url = WD_API . "?public=" . urlencode ( $public ) . "&param=" . urlencode ( $param );
+		return NetUtils::getInstance ()->get ( $url );
+	}
+}
+
+?>

+ 24 - 0
app/Lib/Weidian/demo/cps_demo.php

@@ -0,0 +1,24 @@
+<?php
+require_once '../includes/WebStart.php';
+/**
+ * CPS 接口DEMO
+ */
+$cpsApi = new CPSClientApi ( getAccessToken () );
+// 搜索CPS商品
+Logger::info ( "搜索CPS商品" );
+{
+	$keyword = "iphone";
+	echo $cpsApi->searchCPSProduct ( $keyword )->data;
+}
+
+// 搜索CPS商品
+Logger::info ( '搜索CPS商品' );
+{
+	echo $cpsApi->getCPSProduct ( "1210995961" )->data;
+}
+
+// 获取商品公开信息
+Logger::info ( "获取商品公开信息" );
+{
+	echo $cpsApi->getProductPublicInfo ( "1210995961" )->data;
+}

+ 47 - 0
app/Lib/Weidian/demo/oauth_demo.php

@@ -0,0 +1,47 @@
+<?php
+require_once '../includes/WebStart.php';
+
+$oauthClient = new OAuthClientApi ();
+/**
+ * 上传图片
+ */
+Logger::info ( "上传图片" );
+{
+	$img_path = "@http://wd.geilicdn.com/vshop258231218-1441636631918-67905-s3.jpg?w=1080&h=0";
+	try {
+		echo $oauthClient->uploadImage ( getAccessToken (), $img_path )->data;
+	} catch ( Exception $e ) {
+		var_dump ( $e );
+	}
+}
+/**
+ * 获取自用型AccessToken
+ */
+Logger::info ( "获取自用型AccessToken" );
+{
+	echo $oauthClient->getSelfoneAccessToken ()->data;
+}
+
+/**
+ * 刷新access_token
+ */
+Logger::info ( "刷新access_token" );
+
+{
+	$response = $oauthClient->refreshToken ( getRefreshToken () );
+	echo $response->data;
+	if ($response->getDataAsObject()->status->status_code == 0) {
+		updateAuthorizationData ( $response->data );
+	}
+}
+
+/**
+ * 使用Code换取AccessToken
+ */
+Logger::info ( "使用Code换取AccessToken" );
+{
+	// code需要改为有效的Code
+	$code = "";
+	echo $oauthClient->getAccessToken ( $code )->data;
+}
+

+ 59 - 0
app/Lib/Weidian/demo/order_api_demo.php

@@ -0,0 +1,59 @@
+<?php
+require_once '../includes/WebStart.php';
+
+$orderApi = new OrderClientApi ( getAccessToken () );
+
+// 获取订单列表
+Logger::info ( "获取订单列表" );
+
+{
+	$order_type = "unpay";
+	$page_num = 1;
+	$add_start = "2015-01-01 00:00:00";
+	$add_end = "2015-11-01 00:00:00";
+	
+	$response = $orderApi->getOrderList ( $order_type, $page_num, $add_start, $add_end );
+	echo $response->data;
+}
+// 获取订单详情
+Logger::info ( "获取订单详情" );
+{
+	$order_id = "1319997370";
+	$response = $orderApi->getOrderDetails ( $order_id );
+	echo $response->data;
+}
+// 订单发货
+Logger::info ( "订单发货" );
+{
+	$order_id = "1320279806";
+	$express_type = 1;
+	$express_no = "1234566788";
+	$response = $orderApi->orderDeliver ( $order_id, $express_type, $express_no );
+	echo $response->data;
+}
+// 修改物流信息
+Logger::info ( "修改物流信息" );
+{
+	$order_id = "1320279806";
+	$express_type = "1";
+	$express_no = "234234"; // 快递单号
+	$response = $orderApi->modifyExpress ( $order_id, $express_type, $express_no );
+	echo $response->data;
+}
+// 修改订单价格
+Logger::info ( "修改订单价格" );
+{
+	$order_id = "1320081850";
+	$total_items_price = 100;
+	$express_price = 100;
+	$response = $orderApi->modifyOrderPrice ( $order_id, $total_items_price, $express_price );
+	echo $response->data;
+}
+// 订单退款
+Logger::info ( "订单退款" );
+{
+	$order_id = "1320279806";
+	$is_accept = 1;
+	$response = $orderApi->orderRefundAccept ( $order_id, $is_accept );
+	echo $response->data;
+}

+ 306 - 0
app/Lib/Weidian/demo/product_api_demo.php

@@ -0,0 +1,306 @@
+<?php
+require_once '../includes/WebStart.php';
+
+$wdProductApi = new ProductClientApi ( getAccessToken () );
+/* 获取商品信息 */
+{
+	Logger::info ( "获取商品信息" );
+	echo $wdProductApi->getProduct ( '1497233640' )->data;
+}
+/* 获取全店商品 */
+{
+	Logger::info ( "获取全店商品" );
+	echo $wdProductApi->getShopProduct ()->data;
+}
+
+/* 创建和参数商品 */
+{
+	/* 创建微店商品 */
+	Logger::info ( "创建微店商品" );
+	{
+		$imgs = array (
+				"http://wd.geilicdn.com/vshop258231218-1441636631918-67905-s3.jpg?w=1080&h=0&a1",
+				"http://wd.geilicdn.com/vshop258231218-1441636631918-67905-s3.jpg?w=1080&h=0&b1" 
+		);
+		$skus = array ();
+		$item_name = "【全国包邮】 欧洲站秋季新款范冰冰明星款西装领双排扣风衣系带中长款大衣";
+		$merchant_code = "90";
+		$fx_fee_rate = "1";
+		$response = $wdProductApi->createProduct ( $imgs, 1, 1000, $item_name, "1", $skus, $merchant_code );
+		$add_item_id = $response->getDataAsObject ()->result->itemid;
+		echo "添加商品ID:", $add_item_id;
+	}
+	
+	/* 删除单个商品 */
+	Logger::info ( "删除单个商品" );
+	{
+		if ($wdProductApi->deleteProduct ( $add_item_id )) {
+			echo "成功删除商品ID:", $add_item_id;
+		} else {
+			echo "删除商品ID:", $add_item_id, "失败";
+		}
+	}
+}
+
+/**
+ * 上传商品图片-图片可以是远程HTTP协议图片或本地图片
+ */
+Logger::info ( "上传商品图片" );
+{
+	echo $wdProductApi->uploadProductImage ( "@http://wd.geilicdn.com/vshop258231218-1441636631918-67905-s3.jpg?w=1080&h=0&b1" )->data;
+}
+
+/* 添加/删除商品图片 */
+{
+	/**
+	 * 添加商品图片 *
+	 */
+	Logger::info ( "添加商品图片" );
+	{
+		$imgs = array (
+				"http://wd.geilicdn.com/vshop160022024-5229318469591444541776-207791.jpg?w=1080&h=0" 
+		);
+		if ($wdProductApi->addProductImage ( '1586640507', $imgs )) {
+			echo "成功添加图片";
+		} else {
+			echo "添加图片失败";
+		}
+	}
+	/**
+	 * 删除商品图片 *
+	 */
+	Logger::info ( "删除商品图片" );
+	
+	{
+		$imgs = array (
+				"http://wd.geilicdn.com/vshop160022024-5229318469591444541776-207791.jpg?w=1080&h=0" 
+		);
+		if ($wdProductApi->deleteProductImage ( "1586640507", $imgs )) {
+			echo "成功删除图片";
+		} else {
+			echo "删除图片失败";
+		}
+	}
+}
+
+/**
+ * 更新商品信息 *
+ */
+Logger::info ( "更新商品信息" );
+{
+	$itemid = "1586640507";
+	$stock = 1;
+	$price = 999;
+	$skus = array ();
+	$item_name = "【全国包邮】 欧洲站秋季新款西装领双排扣风衣系带中长款大衣";
+	$merchant_code = "90";
+	$fx_fee_rate = "1";
+	$response = $wdProductApi->updateProductInfo ( $itemid, $stock, $price, $item_name, $fx_fee_rate, $skus, $merchant_code );
+	echo $response->data;
+}
+
+/**
+ * 添加商品SKU
+ */
+Logger::info ( "添加商品SKU" );
+{
+	$itemid = "1586640507";
+	$obj1 = array (
+			"title" => "102",
+			"sku_merchant_code" => "101",
+			"price" => "888",
+			"stock" => "5" 
+	);
+	$obj2 = array (
+			"title" => "105",
+			"sku_merchant_code" => "104",
+			"price" => "988",
+			"stock" => "1" 
+	);
+	$obj3 = array (
+			"title" => "108",
+			"sku_merchant_code" => "107",
+			"price" => "788",
+			"stock" => "1" 
+	);
+	$skus = array (
+			$obj1,
+			$obj2,
+			$obj3 
+	);
+	$response = $wdProductApi->addProductSKU ( $itemid, $skus );
+	echo $response->data;
+}
+
+/**
+ * 更新商品型号 *
+ */
+Logger::info ( "更新商品型号" );
+
+{
+	$itemid = "1586640507";
+	$obj1 = array (
+			"id" => "4122716344",
+			"title" => "102-红",
+			"sku_merchant_code" => "101",
+			"price" => "888",
+			"stock" => "5" 
+	);
+	$obj2 = array (
+			"id" => "4122716352",
+			"title" => "105-黄",
+			"sku_merchant_code" => "104",
+			"price" => "988",
+			"stock" => "1" 
+	);
+	$obj3 = array (
+			"id" => "4122713908",
+			"title" => "108-蓝",
+			"sku_merchant_code" => "107",
+			"price" => "788",
+			"stock" => "1" 
+	);
+	$skus = array (
+			$obj1,
+			$obj2,
+			$obj3 
+	);
+	$response = $wdProductApi->updateProductSKU ( $itemid, $skus );
+	echo $response->data;
+}
+
+/**
+ * 删除商品型号*
+ */
+Logger::info ( "删除商品型号" );
+
+{
+	$itemid = "1586640507";
+	$skus = array (
+			"4122713908" 
+	);
+	$response = $wdProductApi->deleteProductSKU ( $itemid, $skus );
+	echo $response->data;
+}
+
+/**
+ * 获取商品分类 *
+ */
+Logger::info ( "获取商品分类" );
+
+{
+	$response = $wdProductApi->getProductCate ();
+	echo $response->data;
+}
+
+/**
+ * 新增商品分类
+ */
+
+Logger::info ( "新增商品分类" );
+{
+	$cates1 = array (
+			"cate_name" => "秋裤",
+			"sort_num" => 1 
+	);
+	$cates2 = array (
+			"cate_name" => "秋衣",
+			"sort_num" => 2 
+	);
+	$response = $wdProductApi->addProductCate ( array (
+			$cates1,
+			$cates2 
+	) );
+	echo $response->data;
+}
+/**
+ * 编辑商品分类
+ */
+Logger::info ( "编辑商品分类" );
+
+{
+	$cates1 = array (
+			"cate_id" => "57493230",
+			"cate_name" => "上衣1",
+			"sort_num" => 1 
+	);
+	$cates2 = array (
+			"cate_id" => "57493231",
+			"cate_name" => "裤子1",
+			"sort_num" => 2 
+	);
+	$cates = array (
+			$cates1,
+			$cates2 
+	);
+	$response = $wdProductApi->editProductCate ( $cates );
+	echo $response->data;
+}
+
+/**
+ * 删除商品分类
+ */
+Logger::info ( "删除商品分类" );
+{
+	if ($wdProductApi->deleteProductCate ( '57493231' )) {
+		echo "成功删除分类";
+	} else {
+		echo "删除分类失败";
+	}
+}
+
+/**
+ * 设置商品的分类
+ */
+Logger::info ( "设置商品的分类" );
+
+{
+	$cate_ids = array (
+			"57568292" 
+	);
+	$itemids = array (
+			"1586640507" 
+	);
+	IF ($wdProductApi->setProductCate ( $itemids, $cate_ids )) {
+		echo "成功设置商品分类";
+	} else {
+		echo "设置商品分类失败";
+	}
+}
+
+/**
+ * 取消商品的分类
+ */
+Logger::info ( "取消商品的分类" );
+{
+	$cate_ids = array (
+			"57568292" 
+	);
+	$itemid = "1586640507";
+	if ($wdProductApi->cancelProductCate ( $itemid, $cate_ids )) {
+		echo "成功取消分类";
+	} else {
+		echo "取消分类失败";
+	}
+}
+
+/**
+ * 商品上下架
+ */
+Logger::info ( "商品上下架" );
+{
+	$itemid = "1586640507";
+	$opt = 2; // 1表示商品上架,2表示商品下架
+	if ($wdProductApi->productOnSale ( $itemid, $opt )) {
+		echo "成功下架商品";
+	} else {
+		echo "下架商品失败";
+	}
+	$opt = 1;
+	if ($wdProductApi->productOnSale ( $itemid, $opt )) {
+		echo "成功上架商品";
+	} else {
+		echo "上架商品失败";
+	}
+}
+

+ 19 - 0
app/Lib/Weidian/demo/simple_api_test.php

@@ -0,0 +1,19 @@
+<?php
+require_once '../includes/WebStart.php';
+
+$api = new SimpleApiClient ();
+$baseApi = new ApiBase ( getAccessToken () );
+$public = $baseApi->buildPublicValue ( "vdian.cps.item.get" );
+$param = '{"itemid":"1210995961"}';
+/**
+ * GET REQUEST
+ */
+Logger::info("http get request");
+echo $api->get ( $public, $param )->data;
+
+/**
+ * POST REQUEST
+ */
+Logger::info("http post request");
+echo $api->post ( $public, $param )->data;
+

+ 25 - 0
app/Lib/Weidian/includes/AutoLoader.php

@@ -0,0 +1,25 @@
+<?php
+
+class AutoLoader {
+	private static $autoloadPathArray = array (
+			"",
+			"includes/",
+			"api/",
+			"token_share_example/" 
+	);
+	public static function autoload($className) {
+		foreach ( self::$autoloadPathArray as $path ) {
+			$file = CURR_PATH . DIRECTORY_SEPARATOR . $path . $className . ".php";
+			$file = str_replace ( '\\', DIRECTORY_SEPARATOR, $file );
+			if (is_file ( $file )) {
+				include_once $file;
+				break;
+			}
+		}
+	}
+	public static function addAutoloadPath($path) {
+		array_push ( self::$autoloadPathArray, $path );
+	}
+}
+spl_autoload_register ( "AutoLoader::autoLoad" );
+?>

+ 19 - 0
app/Lib/Weidian/includes/Defines.php

@@ -0,0 +1,19 @@
+<?php
+/* 服务型APP Key */
+$appkey = "";
+/* 服务性secret */
+$secret = "";
+/* 自用型AppKey */
+$oneself_appkey = "";
+/* 自用型Secret */
+$oneself_secret = "";
+
+define ( 'API_HOST', 'https://api.vdian.com/' );
+
+/* 微店API */
+define ( 'WD_API', API_HOST . 'api' );
+
+/* DEBUG模式 */
+define ( 'DEBUG', FALSE );
+/* 在线模式-不会输出额外信息 */
+define ( 'ON_LINE', FALSE );

+ 56 - 0
app/Lib/Weidian/includes/HttpResponse.php

@@ -0,0 +1,56 @@
+<?php
+// require_once 'includes/WebStart.php';
+class HttpResponse {
+	public $http_code;
+	public $data;
+	public $http_info = array ();
+	public $url;
+	public $headers;
+	public $method;
+	public $postfields;
+	public function __construct($url, $headers, $method = 'GET', $postfields = null) {
+		$this->url = $url;
+		$this->headers = $headers;
+		$this->method = $method;
+		if (! empty ( $postfields )) {
+			$this->postfields = $postfields;
+		}
+	}
+	public function getData() {
+		if (DEBUG) {
+			Logger::debug ( "url:" . $this->url );
+			Logger::debug ( "data:" . $this->data );
+		}
+		return $this->data;
+	}
+	public function toString() {
+		$str = "url:" . ($this->url) . "<br/>";
+		$str .= "data:" . ($this->data) . "<br/>";
+		$str .= "http_code:" . $this->http_code . "<br/>";
+		$str .= "method:" . $this->method . "<br/>";
+		return $str;
+	}
+	/**
+	 * 获取返回数据转化成Object
+	 *
+	 * @param boolean $throw
+	 *        	是否抛出异常
+	 * @throws Exception
+	 * @return unknown
+	 */
+	public function getDataAsObject($throw = false) {
+		if (DEBUG) {
+			Logger::debug ( "url:" . $this->url );
+			Logger::debug ( "data:" . $this->data );
+		}
+		$obj = json_decode ( $this->data );
+		if ($throw) {
+			if ($obj->status->status_code != 0) {
+				throw new Exception ( '请求url:' . $this->url . ' errCode:' . $data->status->status_code . ' errMsg:' . $data->status->status_reason );
+			}
+		}
+		return $obj;
+	}
+}
+
+?>

+ 26 - 0
app/Lib/Weidian/includes/Logger.php

@@ -0,0 +1,26 @@
+<?php
+class Logger {
+	public static function info($msg) {
+		IF (! ON_LINE) {
+			echo "<br/>";
+			echo '【INFO】', $msg;
+			echo "<br/>";
+		}
+	}
+	public static function debug($msg) {
+		if (DEBUG) {
+			echo "<br/>";
+			echo "【DEBUG】", $msg;
+			echo "<br/>";
+		}
+	}
+	public static function error($msg) {
+		IF (!ON_LINE) {
+			echo "<br/>";
+			echo "【ERROR】", $msg;
+			echo "<br/>";
+		}
+	}
+}
+
+?>

+ 275 - 0
app/Lib/Weidian/includes/NetUtils.php

@@ -0,0 +1,275 @@
+<?php
+// require_once 'includes/WebStart.php';
+class NetUtils {
+	/**
+	 * Set up the API root URL.
+	 *
+	 * @ignore
+	 *
+	 *
+	 *
+	 *
+	 */
+	public $host = "https://api.vdian.com/";
+	/**
+	 * Set timeout default.
+	 *
+	 * @ignore
+	 *
+	 *
+	 *
+	 *
+	 */
+	public $timeout = 30;
+	/**
+	 * Set connect timeout.
+	 *
+	 * @ignore
+	 */
+	public $connecttimeout = 30;
+	/**
+	 * Verify SSL Cert.
+	 *
+	 * @ignore
+	 */
+	public $ssl_verifypeer = FALSE;
+	/**
+	 * Respons format.
+	 * @ignore
+	 */
+	public $format = 'json';
+	/**
+	 * Decode returned json data.
+	 * @ignore
+	 */
+	public $decode_json = TRUE;
+	/**
+	 * Contains the last HTTP headers returned.
+	 * @ignore
+	 */
+	public $http_info;
+	/**
+	 * Set the useragnet.
+	 * @ignore
+	 */
+	private $useragent = 'weidian OAuth2 PHP SDK v1.0';
+	
+	/**
+	 * boundary of multipart
+	 * @ignore
+	 */
+	public static $boundary = '';
+	public static function getInstance() {
+		return new NetUtils ();
+	}
+	/**
+	 * HTTP GET 请求
+	 *
+	 * @param unknown $url        	
+	 * @return HttpResponse
+	 */
+	public function get($url) {
+		if (strrpos ( $url, 'http://' ) !== 0 && strrpos ( $url, 'https://' ) !== 0) {
+			$url = "{$this->host}{$url}.{$this->format}";
+		}
+		return $this->http ( $url, 'GET' );
+	}
+	/**
+	 * POST request
+	 *
+	 * @param string $url        	
+	 * @param array $parameters        	
+	 * @return HttpResponse
+	 */
+	public function post($url, array $parameters) {
+		if (strrpos ( $url, 'http://' ) !== 0 && strrpos ( $url, 'https://' ) !== 0) {
+			$url = "{$this->host}{$url}.{$this->format}";
+		}
+		$body = null;
+		if (DEBUG) {
+			Logger::debug ( "URL->" . $url );
+			if (is_array ( $parameters )) {
+				while ( list ( $key, $val ) = each ( $parameters ) ) {
+					Logger::debug ( $key . "=" . $val );
+				}
+			}
+		}
+		$body = http_build_query ( $parameters );
+		return $this->http ( $url, 'POST', $body );
+	}
+	/**
+	 * 发送HTTP请求
+	 *
+	 * @param string $url        	
+	 * @param string $method        	
+	 * @param unknown $parameters        	
+	 * @param bool $multi        	
+	 * @return HttpResponse
+	 */
+	public function request($url, $method, $parameters, $multi = false) {
+		if (strrpos ( $url, 'http://' ) !== 0 && strrpos ( $url, 'https://' ) !== 0) {
+			// 支持相对路径
+			$url = "{$this->host}{$url}.{$this->format}";
+		}
+		
+		switch ($method) {
+			case 'GET' :
+				$url = $url . '?' . http_build_query ( $parameters );
+				return $this->http ( $url, 'GET' );
+			default :
+				$headers = array ();
+				if (! $multi && (is_array ( $parameters ) || is_object ( $parameters ))) {
+					$body = http_build_query ( $parameters );
+				} else {
+					$body = self::build_http_query_multi ( $parameters );
+					$headers [] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
+				}
+				return $this->http ( $url, $method, $body, $headers );
+		}
+	}
+	/**
+	 * 上传文件
+	 *
+	 * @param unknown $url        	
+	 * @param unknown $parameters        	
+	 * @return Ambigous <string, mixed>
+	 */
+	public function uploadFile($url, $parameters) {
+		$headers = array ();
+		$body = self::build_http_query_multi ( $parameters );
+		$headers [] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
+		return self::http ( $url, 'POST', $body, $headers );
+	}
+	/**
+	 * Make an HTTP request
+	 *
+	 * @return string API results
+	 * @ignore
+	 *
+	 *
+	 *
+	 *
+	 */
+	private function http($url, $method, $postfields = NULL, $headers = array()) {
+		$response = new HttpResponse ( $url, $headers, $method, $postfields );
+		$ci = curl_init ();
+		/* Curl settings */
+		curl_setopt ( $ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 );
+		curl_setopt ( $ci, CURLOPT_USERAGENT, $this->useragent );
+		curl_setopt ( $ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout );
+		curl_setopt ( $ci, CURLOPT_TIMEOUT, $this->timeout );
+		curl_setopt ( $ci, CURLOPT_RETURNTRANSFER, TRUE );
+		curl_setopt ( $ci, CURLOPT_ENCODING, "UTF-8" );
+		curl_setopt ( $ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer );
+		curl_setopt ( $ci, CURLOPT_SSL_VERIFYHOST, "2" );
+		curl_setopt ( $ci, CURLOPT_HEADERFUNCTION, array (
+				$this,
+				'getHeader' 
+		) );
+		curl_setopt ( $ci, CURLOPT_HEADER, FALSE );
+		
+		switch ($method) {
+			case 'POST' :
+				curl_setopt ( $ci, CURLOPT_POST, TRUE );
+				if (! empty ( $postfields )) {
+					curl_setopt ( $ci, CURLOPT_POSTFIELDS, $postfields );
+					$this->postdata = $postfields;
+				}
+				break;
+			case 'DELETE' :
+				curl_setopt ( $ci, CURLOPT_CUSTOMREQUEST, 'DELETE' );
+				if (! empty ( $postfields )) {
+					$url = "{$url}?{$postfields}";
+				}
+		}
+		$headers [] = "API-RemoteIP: " . $_SERVER ['REMOTE_ADDR'];
+		curl_setopt ( $ci, CURLOPT_URL, $url );
+		curl_setopt ( $ci, CURLOPT_HTTPHEADER, $headers );
+		curl_setopt ( $ci, CURLINFO_HEADER_OUT, TRUE );
+		
+		$response->data = curl_exec ( $ci );
+		$response->http_code = curl_getinfo ( $ci, CURLINFO_HTTP_CODE );
+		$response->http_info = array_merge ( $response->http_info, curl_getinfo ( $ci ) );
+		$response->url = $url;
+		if (DEBUG) {
+			Logger::debug ( "headers:" );
+			print_r ( $headers );
+			Logger::debug ( "requestInfo:" );
+			print_r ( curl_getinfo ( $ci ) );
+			Logger::debug ( "body:" );
+			print_r ( $postfields );
+		}
+		Logger::debug ( "返回:" . $response->data );
+		curl_close ( $ci );
+		return $response;
+	}
+	
+	/**
+	 *
+	 * @ignore
+	 *
+	 *
+	 *
+	 */
+	private function build_http_query_multi($params) {
+		if (! $params)
+			return '';
+		
+		uksort ( $params, 'strcmp' );
+		
+		$pairs = array ();
+		
+		self::$boundary = $boundary = uniqid ( '===============' );
+		$MPboundary = '--' . $boundary;
+		$endMPboundary = $MPboundary . '--';
+		$multipartbody = '';
+		
+		foreach ( $params as $parameter => $value ) {
+			
+			if (in_array ( $parameter, array (
+					'media' 
+			) ) && $value {0} == '@') {
+				$url = ltrim ( $value, '@' );
+				$content = file_get_contents ( $url );
+				$array = explode ( '?', basename ( $url ) );
+				$filename = $array [0];
+				
+				$multipartbody .= $MPboundary . "\r\n";
+				$multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"' . "\r\n";
+				$multipartbody .= "Content-Type: image/unknown\r\n\r\n";
+				$multipartbody .= $content . "\r\n";
+			} else {
+				$multipartbody .= $MPboundary . "\r\n";
+				$multipartbody .= 'content-disposition: form-data; name="' . $parameter . "\"\r\n\r\n";
+				$multipartbody .= $value . "\r\n";
+			}
+		}
+		
+		$multipartbody .= $endMPboundary;
+		return $multipartbody;
+	}
+	
+	/**
+	 * Get the header info to store.
+	 *
+	 * @return int
+	 * @ignore
+	 *
+	 *
+	 *
+	 *
+	 *
+	 *
+	 */
+	function getHeader($ch, $header) {
+		$i = strpos ( $header, ':' );
+		if (! empty ( $i )) {
+			$key = str_replace ( '-', '_', strtolower ( substr ( $header, 0, $i ) ) );
+			$value = trim ( substr ( $header, $i + 2 ) );
+			$this->http_header [$key] = $value;
+		}
+		return strlen ( $header );
+	}
+}
+;
+?>

+ 8 - 0
app/Lib/Weidian/includes/OAuthException.php

@@ -0,0 +1,8 @@
+<?php
+/**
+ * @ignore
+ */
+class OAuthException extends Exception {
+}
+
+?>

+ 79 - 0
app/Lib/Weidian/includes/WebStart.php

@@ -0,0 +1,79 @@
+<?php
+ini_set("display_errors", 1);
+error_reporting(E_ALL);
+define("CURR_PATH", dirname(dirname(__FILE__)));
+require_once CURR_PATH . '/includes/Defines.php';
+require_once CURR_PATH . '/includes/AutoLoader.php';
+
+ini_set ( 'date.timezone', 'Asia/Shanghai' );
+/**
+ * 获取全局AccessToken
+ *
+ * @return string
+ */
+function getAccessToken() {
+	/**
+	 * 这里演示只有一条固定全局AccessToken,在实际使用中,可能会根据不同的授权用户,
+	 * 获取各自的AccessToken,此时需要自行扩展实现多用户的全局共享AccessToken
+	 */
+	return RedisCacheApi::getAccessToken ();
+}
+
+/**
+ * 更新全局授权数据
+ *
+ * @param unknown $data        	
+ * @return resource boolean
+ */
+function updateAuthorizationData($data) {
+	return RedisCacheApi::updateAuthToken ( $data );
+}
+
+/**
+ * 获取RefreshToken
+ *
+ * @return string
+ */
+function getRefreshToken() {
+	/**
+	 * 这里演示只有一条固定全局RefreshToken,在实际使用中,可能会根据不同的授权用户,
+	 * 获取各自的AccessToken,此时需用户自行实现扩展。
+	 */
+	return RedisCacheApi::getRefreshToken ();
+}
+
+/**
+ * 获取当前请求URL
+ */
+function getCurrentURL() {
+	if ($_SERVER ['SERVER_PORT'] == '80') {
+		return 'http://' . $_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI'];
+	} else {
+		return 'http://' . $_SERVER ['HTTP_HOST'] . ":" . $_SERVER ['SERVER_PORT'] . $_SERVER ['REQUEST_URI'];
+	}
+}
+/**
+ * 获取当前host URL
+ */
+function getCurrentHost() {
+	$index = strpos ( $_SERVER ['REQUEST_URI'], "/", 1 );
+	$server_path = substr ( $_SERVER ['REQUEST_URI'], 0, $index );
+	if ($_SERVER ['SERVER_PORT'] == '80') {
+		return 'http://' . $_SERVER ['HTTP_HOST'] . $server_path;
+	} else {
+		return 'http://' . $_SERVER ['HTTP_HOST'] . ":" . $_SERVER ['SERVER_PORT'] . $server_path;
+	}
+}
+/**
+ * 获取授权回调URL
+ * #注意:获取到的域名是当前访问的URL地址,需要确保和开放平台设置的域名相同。
+ *
+ * @return string
+ */
+function getOAuthRedirectURL() {
+	// $host = getCurrentHost ();
+	// TODO 授权回调HOST->需要和微店设置的保持一致
+	$host = "http://www.abc.com/weidian_sdk_php";
+	return $host . "/authorize_callback.php";
+}
+

+ 182 - 0
app/Lib/Youzan/YZApiProtocol.php

@@ -0,0 +1,182 @@
+<?php
+class YZApiProtocol {
+    const APP_ID_KEY = 'app_id';
+    const METHOD_KEY = 'method';
+    const TIMESTAMP_KEY = 'timestamp';
+    const FORMAT_KEY = 'format';
+    const VERSION_KEY = 'v';
+    const SIGN_KEY = 'sign';
+    const SIGN_METHOD_KEY = 'sign_method';
+    const TOKEN_KEY = 'access_token';
+    const ALLOWED_DEVIATE_SECONDS = 600;
+
+    const ERR_SYSTEM = -1;
+    const ERR_INVALID_APP_ID = 40001;
+    const ERR_INVALID_APP = 40002;
+    const ERR_INVALID_TIMESTAMP = 40003;
+    const ERR_EMPTY_SIGNATURE = 40004;
+    const ERR_INVALID_SIGNATURE = 40005;
+    const ERR_INVALID_METHOD_NAME = 40006;
+    const ERR_INVALID_METHOD = 40007;
+    const ERR_INVALID_TEAM = 40008;
+    const ERR_PARAMETER = 41000;
+    const ERR_LOGIC = 50000;
+
+    public static function sign($appSecret, $params, $method = 'md5') {
+        if (!is_array($params)) $params = array();
+
+        ksort($params);
+        $text = '';
+        foreach ($params as $k => $v) {
+            $text .= $k . $v;
+        }
+
+        return self::hash($method, $appSecret . $text . $appSecret);
+    }
+
+    private static function hash($method, $text) {
+        switch ($method) {
+            case 'md5':
+            default:
+                $signature = md5($text);
+                break;
+        }
+        return $signature;
+    }
+
+    public static function allowedSignMethods() {
+        return array('md5');
+    }
+
+    public static function allowedFormat() {
+        return array('json');
+    }
+
+    public static function doc() {
+        return array(
+            'params' => array(
+                self::APP_ID_KEY => array(
+                    'type' => 'String',
+                    'required' => true,
+                    'desc' => 'App ID',
+                ),
+                self::METHOD_KEY => array(
+                    'type' => 'String',
+                    'required' => true,
+                    'desc' => 'API接口名称',
+                ),
+                self::TIMESTAMP_KEY => array(
+                    'type' => 'String',
+                    'required' => true,
+                    'desc' => '时间戳,格式为yyyy-mm-dd HH:mm:ss,例如:2013-05-06 13:52:03。服务端允许客户端请求时间误差为' . intval(self::ALLOWED_DEVIATE_SECONDS / 60) . '分钟。',
+                ),
+                self::FORMAT_KEY => array(
+                    'type' => 'String',
+                    'required' => false,
+                    'desc' => '可选,指定响应格式。默认json,目前支持格式为json',
+                ),
+                self::VERSION_KEY => array(
+                    'type' => 'String',
+                    'required' => true,
+                    'desc' => 'API协议版本,可选值:1.0',
+                ),
+                self::SIGN_KEY => array(
+                    'type' => 'String',
+                    'required' => true,
+                    'desc' => '对 API 输入参数进行 md5 加密获得,详细参考签名章节',
+                ),
+                self::SIGN_METHOD_KEY => array(
+                    'type' => 'String',
+                    'required' => false,
+                    'desc' => '可选,参数的加密方法选择。默认为md5,可选值是:md5',
+                ),
+                self::TOKEN_KEY => array(
+                    'type' => 'String',
+                    'required' => true,
+                    'desc' => '商户通过Oauth2.0授权给开发者的AccessToken',
+                ),
+            ),
+
+        );
+    }
+
+    public static function errors() {
+        return array(
+            'response' => array (
+                'code' => array (
+                    'type' => 'Number',
+                    'desc' => '错误编号',
+                    'example' => 40002,
+                    'required' => true,
+                ),
+                'msg' => array (
+                    'type' => 'String',
+                    'desc' => '错误信息',
+                    'example' => 'invalid app',
+                    'required' => true,
+                ),
+                'params' => array (
+                    'type' => 'List',
+                    'desc' => '请求参数列表',
+                    'example' => array(
+                        'app_id' => 'ac9aaepv37d2a5guc',
+                        'method' => 'kdt.trades.sold.get',
+                        'timestamp' => '2014-01-20 20:38:42',
+                        'format' => 'json',
+                        'sign_method' => 'md5',
+                        'v' => '1.0',
+                        'sign' => 'wi93n31d034a9207ert7d3971e3vno10',
+                    ),
+                    'required' => true,
+                ),
+            ),
+            'errors' => array(
+                self::ERR_SYSTEM => array(
+                    'desc' => '系统错误',
+                    'suggest' => '',
+                ),
+                self::ERR_INVALID_APP_ID => array(
+                    'desc' => '未指定 AppId',
+                    'suggest' => '请求时传入 AppId',
+                ),
+                self::ERR_INVALID_APP => array(
+                    'desc' => '无效的App',
+                    'suggest' => '申请有效的 AppId',
+                ),
+                self::ERR_INVALID_TIMESTAMP => array(
+                    'desc' => '无效的时间参数',
+                    'suggest' => '以当前时间重新发起请求;如果系统时间和服务器时间误差超过10分钟,请调整系统时间',
+                ),
+                self::ERR_EMPTY_SIGNATURE => array(
+                    'desc' => '请求没有签名',
+                    'suggest' => '请使用协议规范对请求中的参数进行签名',
+                ),
+                self::ERR_INVALID_SIGNATURE => array(
+                    'desc' => '签名校验失败',
+                    'suggest' => '检查 AppId 和 AppSecret 是否正确;如果是自行开发的协议分装,请检查代码',
+                ),
+                self::ERR_INVALID_METHOD_NAME => array(
+                    'desc' => '未指定请求的 Api 方法',
+                    'suggest' => '指定 Api 方法',
+                ),
+                self::ERR_INVALID_METHOD => array(
+                    'desc' => '请求非法的方法',
+                    'suggest' => '检查请求的方法的值',
+                ),
+                self::ERR_INVALID_TEAM => array(
+                    'desc' => '校验团队信息失败',
+                    'suggest' => '检查团队是否有效、是否绑定微信',
+                ),
+                self::ERR_PARAMETER => array(
+                    'desc' => '请求方法的参数错误',
+                    'suggest' => '',
+                ),
+                self::ERR_LOGIC => array(
+                    'desc' => '请求方法时业务逻辑发生错误',
+                    'suggest' => '',
+                ),
+            ),
+        );
+    }
+}
+

+ 118 - 0
app/Lib/Youzan/YZHttpClient.php

@@ -0,0 +1,118 @@
+<?php
+
+class YZHttpClient{
+    private static $boundary = '';
+
+    public static function get($url, $params)
+    {
+        $url = $url . '?' . http_build_query($params);
+        return self::http($url, 'GET');
+    }
+
+    public static function post($url, $params, $files = array())
+    {
+        $headers = array();
+        if (!$files) {
+            $body = http_build_query($params);
+        } else {
+            $body = self::build_http_query_multi($params, $files);
+            $headers[] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
+        }
+        return self::http($url, 'POST', $body, $headers);
+    }
+    /**
+     * Make an HTTP request
+     *
+     * @return string API results
+     * @ignore
+     */
+    private static function http($url, $method, $postfields = NULL, $headers = array())
+    {
+
+        $ci = curl_init();
+        /* Curl settings */
+        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
+        curl_setopt($ci, CURLOPT_USERAGENT, 'KdtApiSdk Client v0.1');
+        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
+        curl_setopt($ci, CURLOPT_TIMEOUT, 30);
+        curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+        curl_setopt($ci, CURLOPT_ENCODING, "");
+        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, false);
+        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2);
+        curl_setopt($ci, CURLOPT_HEADER, FALSE);
+        curl_setopt($ci, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+
+        switch ($method) {
+            case 'POST':
+                curl_setopt($ci, CURLOPT_POST, TRUE);
+                if (!empty($postfields)) {
+                    curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+                }
+                break;
+        }
+
+        curl_setopt($ci, CURLOPT_URL, $url);
+        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE);
+
+        $response = curl_exec($ci);
+
+        if($response == false){
+            dd( curl_error($ci));
+        }
+
+        $httpCode = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+        $httpInfo = curl_getinfo($ci);
+
+        curl_close($ci);
+        return $response;
+    }
+
+    private static function build_http_query_multi($params, $files)
+    {
+        if (!$params) return '';
+
+        $pairs = array();
+
+        self::$boundary = $boundary = uniqid('------------------');
+        $MPboundary = '--' . $boundary;
+        $endMPboundary = $MPboundary . '--';
+        $multipartbody = '';
+
+        foreach ($params as $key => $value) {
+            $multipartbody .= $MPboundary . "\r\n";
+            $multipartbody .= 'content-disposition: form-data; name="' . $key . "\"\r\n\r\n";
+            $multipartbody .= $value . "\r\n";
+        }
+        foreach ($files as $key => $value) {
+            if (!$value) {
+                continue;
+            }
+
+            if (is_array($value)) {
+                $url = $value['url'];
+                if (isset($value['name'])) {
+                    $filename = $value['name'];
+                } else {
+                    $parts = explode('?', basename($value['url']));
+                    $filename = $parts[0];
+                }
+                $field = isset($value['field']) ? $value['field'] : $key;
+            } else {
+                $url = $value;
+                $parts = explode('?', basename($url));
+                $filename = $parts[0];
+                $field = $key;
+            }
+            $content = file_get_contents($url);
+
+            $multipartbody .= $MPboundary . "\r\n";
+            $multipartbody .= 'Content-Disposition: form-data; name="' . $field . '"; filename="' . $filename . '"' . "\r\n";
+            $multipartbody .= "Content-Type: image/unknown\r\n\r\n";
+            $multipartbody .= $content . "\r\n";
+        }
+
+        $multipartbody .= $endMPboundary;
+        return $multipartbody;
+    }
+}

+ 40 - 0
app/Lib/Youzan/YZOauthClient.php

@@ -0,0 +1,40 @@
+<?php
+require_once __DIR__ . '/YZHttpClient.php';
+
+class YZOauthClient{
+
+    private static $oauthUrl = 'https://open.youzan.com/oauth/token';
+
+    public function __construct($client_id, $client_secret, $access_token = NULL, $refresh_token = NULL) {
+        $this->client_id = $client_id;
+        $this->client_secret = $client_secret;
+        $this->access_token = $access_token;
+        $this->refresh_token = $refresh_token;
+    }
+
+    /**
+     * 获取access_token
+     */
+    public function getToken( $type, $keys ) {
+        $params = array();
+        $params['client_id'] = $this->client_id;
+        $params['client_secret'] = $this->client_secret;
+        if ( $type === 'token' ) {
+            $params['grant_type'] = 'refresh_token';
+            $params['refresh_token'] = $keys['refresh_token'];
+        } elseif ( $type === 'code' ) {
+            $params['grant_type'] = 'authorization_code';
+            $params['code'] = $keys['code'];
+            $params['redirect_uri'] = $keys['redirect_uri'];
+        }
+        return $this->parseResponse(
+            YZHttpClient::post(self::$oauthUrl, $params)
+        );
+    }
+
+    private function parseResponse($responseData) {
+        $data = json_decode($responseData, true);
+        if (null === $data) throw new Exception('response invalid, data: ' . $responseData);
+        return $data;
+    }
+}

+ 98 - 0
app/Lib/Youzan/YZSignClient.php

@@ -0,0 +1,98 @@
+<?php
+require_once __DIR__ . '/YZApiProtocol.php';
+require_once __DIR__ . '/YZHttpClient.php';
+
+class YZSignClient
+{
+    const VERSION = '1.0';
+
+    private static $signUrl = 'https://open.youzan.com/api/entry/';
+    private $appId;
+    private $appSecret;
+    private $format = 'json';
+    private $signMethod = 'md5';
+
+    public function __construct($appId, $appSecret)
+    {
+        if ('' == $appId || '' == $appSecret) throw new Exception('appId 和 appSecret 不能为空');
+
+        $this->appId = $appId;
+        $this->appSecret = $appSecret;
+    }
+
+    public function get($method, $methodVersion, $params = array())
+    {
+        return $this->parseResponse(
+            YZHttpClient::get($this->url($method, $methodVersion), $this->buildRequestParams($method, $params))
+        );
+    }
+
+    public function post($method, $methodVersion, $params = array(), $files = array())
+    {
+        return $this->parseResponse(
+            YZHttpClient::post($this->url($method, $methodVersion), $this->buildRequestParams($method, $params), $files)
+        );
+    }
+
+    public function url($method, $methodVersion)
+    {
+        $method_array = explode(".", $method);
+        $method = '/' . $methodVersion . '/' . $method_array[count($method_array) - 1];
+        array_pop($method_array);
+        $method = implode(".", $method_array) . $method;
+        $url = self::$signUrl . $method;
+
+        return $url;
+    }
+
+    public function setFormat($format)
+    {
+        if (!in_array($format, YZApiProtocol::allowedFormat()))
+            throw new Exception('设置的数据格式错误');
+
+        $this->format = $format;
+
+        return $this;
+    }
+
+    public function setSignMethod($method)
+    {
+        if (!in_array($method, YZApiProtocol::allowedSignMethods()))
+            throw new Exception('设置的签名方法错误');
+
+        $this->signMethod = $method;
+
+        return $this;
+    }
+
+    private function parseResponse($responseData)
+    {
+        $data = json_decode($responseData, true);
+        if (null === $data) throw new Exception('response invalid, data: ' . $responseData);
+        return $data;
+    }
+
+    private function buildRequestParams($method, $apiParams)
+    {
+        if (!is_array($apiParams)) $apiParams = array();
+        $pairs = $this->getCommonParams($method);
+        foreach ($apiParams as $k => $v) {
+            if (isset($pairs[$k])) throw new Exception('参数名冲突' );
+            $pairs[$k] = $v;
+        }
+        $pairs[YZApiProtocol::SIGN_KEY] = YZApiProtocol::sign($this->appSecret, $pairs, $this->signMethod);
+        return $pairs;
+    }
+
+    private function getCommonParams($method)
+    {
+        $params = array();
+        $params[YZApiProtocol::APP_ID_KEY] = $this->appId;
+        $params[YZApiProtocol::METHOD_KEY] = $method;
+        $params[YZApiProtocol::TIMESTAMP_KEY] = date('Y-m-d H:i:s');
+        $params[YZApiProtocol::FORMAT_KEY] = $this->format;
+        $params[YZApiProtocol::SIGN_METHOD_KEY] = $this->signMethod;
+        $params[YZApiProtocol::VERSION_KEY] = self::VERSION;
+        return $params;
+    }
+}

+ 57 - 0
app/Lib/Youzan/YZTokenClient.php

@@ -0,0 +1,57 @@
+<?php
+require_once __DIR__ . '/YZApiProtocol.php';
+require_once __DIR__ . '/YZHttpClient.php';
+
+class YZTokenClient {
+    private static $tokenUrl = 'https://open.youzan.com/api/oauthentry/';
+
+    public function __construct($accesstoken) {
+        if ('' == $accesstoken) throw new Exception('accesstoken不能为空');
+        $this->accesstoken = $accesstoken;
+    }
+
+    public function get($method, $methodVersion, $params = array()) {
+        return $this->parseResponse(
+            YZHttpClient::get($this->url($method,$methodVersion), $this->buildRequestParams($method, $params))
+        );
+    }
+
+    public function post($method, $methodVersion, $params = array(), $files = array()) {
+        return $this->parseResponse(
+            YZHttpClient::post($this->url($method,$methodVersion), $this->buildRequestParams($method, $params), $files)
+        );
+    }
+
+    public function url($method, $methodVersion){
+        $method_array=explode(".", $method);
+        $method='/'.$methodVersion.'/'.$method_array[count($method_array)-1];
+        array_pop($method_array);
+        $method=implode(".", $method_array).$method;
+        $url=self::$tokenUrl.$method;
+        return $url;
+    }
+
+    private function parseResponse($responseData) {
+        $data = json_decode($responseData, true);
+        if (null === $data) throw new Exception('response invalid, data: ' . $responseData);
+        return $data;
+    }
+
+    private function buildRequestParams($method, $apiParams) {
+        if (!is_array($apiParams)) $apiParams = array();
+        $pairs = $this->getCommonParams($this->accesstoken, $method);
+        foreach ($apiParams as $k => $v) {
+            if (isset($pairs[$k])) throw new Exception('参数名冲突');
+            $pairs[$k] = $v;
+        }
+
+        return $pairs;
+    }
+
+    private function getCommonParams($accessToken, $method) {
+        $params = array();
+        $params[YZApiProtocol::TOKEN_KEY] = $accessToken;
+        $params[YZApiProtocol::METHOD_KEY] = $method;
+        return $params;
+    }
+}

+ 86 - 0
app/Lib/Youzan/YouzanApi.php

@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Created by 浙江小趣信息技术有限公司.
+ * User: yqj
+ * Date: 2017/5/16
+ * Time: 11:03
+ */
+namespace App\Lib\Youzan;
+class YouzanApi
+{
+
+    private  $client ;
+    private static $_instance = null;
+    private  function  __construct($app_id,$app_secret)
+    {
+        $this->client = new \YZSignClient($app_id,$app_secret);
+    }
+
+    /**
+     * @param $params
+     * @param array $files
+     * @param string $methodVersion
+     * @return array
+     */
+    public function addProduct($params,$files=[],$methodVersion='1.0.0'){
+
+        return $this->getHttp('kdt.item.add', $params, $files,$methodVersion);
+    }
+
+    /**
+     * @param $params
+     * @param array $files
+     * @param string $methodVersion
+     * @return array
+     */
+    public function  updateProduct($params,$files=[],$methodVersion='1.0.0'){
+        return $this->getHttp('kdt.item.update', $params, $files,$methodVersion);
+
+    }
+
+    /**
+     * 更新商品Sku 信息
+     */
+    public  function updateSkuInfos($params,$methodVersion='1.0.0'){
+        return $this->getHttp('kdt.item.sku.update',$params,[],$methodVersion);
+
+    }
+
+    public function  getProduct($params,$files=[],$methodVersion='1.0.0'){
+        return $this->getHttp('kdt.item.get', $params, $files,$methodVersion);
+    }
+
+    public  function getCategory(){
+
+    }
+
+    /**
+     * @param $method
+     * @param $params
+     * @param array $files
+     * @param string $methodVersion
+     * @return array
+     */
+    private  function getHttp($method,$params,$files=[],$methodVersion='1.0.0'){
+        $result = $this->client->post($method, $methodVersion, $params, $files);
+        if(isset($result['error_response'])){
+            return ['code'=>$result['error_response']['code'],'msg'=>$result['error_response']['msg']] ;
+        }
+        return ['code'=>200,'msg'=>"操作成功!",'response'=>$result['response']];
+    }
+
+    /**
+     * @param $app_id
+     * @param $app_secret
+     * @return YouzanApi|null
+     */
+    public static function getInstance($app_id,$app_secret)
+    {
+        if (is_null ( self::$_instance ) || isset ( self::$_instance ))
+        {
+            self::$_instance = new self ($app_id,$app_secret);
+        }
+        return self::$_instance;
+    }
+}

+ 21 - 0
app/Model/admin/AdminUser.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Model\admin;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Notifications\Notifiable;
+use Illuminate\Foundation\Auth\User as Authenticatable;
+//后台登录认证类
+class AdminUser extends Authenticatable
+{
+    public  $timestamps = false;
+    protected $table = "admin_user";
+
+    protected $hidden = array('password');
+    public static $rules = [
+        'username' => 'required|alpha_num|min:2',
+        'password'=>'required|alpha_num|between:6,12|confirmed',
+    ];
+
+
+}

+ 12 - 0
app/Model/admin/GoodModel.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Model\admin;
+
+use Illuminate\Database\Eloquent\Model;
+
+class GoodModel extends Model
+{
+    //public  $timestamps = false;
+    protected $table = "goods";
+    //protected $fillable = ['name'];
+}

+ 11 - 0
app/Model/admin/SettingModel.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Model\admin;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SettingModel extends Model
+{
+    public  $timestamps = false;
+    protected $table = "settings";
+}

+ 12 - 0
app/Model/admin/ShopModel.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Model\admin;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ShopModel extends Model
+{
+
+    public  $timestamps = false;
+    protected $table = "shop";
+}

+ 13 - 0
app/Model/admin/SupplyModel.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model\admin;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SupplyModel extends Model
+{
+    public  $timestamps = false;
+    protected $table = "supply";
+    //protected  $fillable = ['supplyname','supplykey','merchant_id','apihost'];
+
+}

+ 28 - 0
app/Providers/AppServiceProvider.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\ServiceProvider;
+
+class AppServiceProvider extends ServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+    }
+
+    /**
+     * Register any application services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        //
+    }
+}

+ 30 - 0
app/Providers/AuthServiceProvider.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
+
+class AuthServiceProvider extends ServiceProvider
+{
+    /**
+     * The policy mappings for the application.
+     *
+     * @var array
+     */
+    protected $policies = [
+        'App\Model' => 'App\Policies\ModelPolicy',
+    ];
+
+    /**
+     * Register any authentication / authorization services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->registerPolicies();
+
+        //
+    }
+}

+ 21 - 0
app/Providers/BroadcastServiceProvider.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Support\Facades\Broadcast;
+
+class BroadcastServiceProvider extends ServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        Broadcast::routes();
+
+        require base_path('routes/channels.php');
+    }
+}

+ 32 - 0
app/Providers/EventServiceProvider.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Event;
+use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
+
+class EventServiceProvider extends ServiceProvider
+{
+    /**
+     * The event listener mappings for the application.
+     *
+     * @var array
+     */
+    protected $listen = [
+        'App\Events\Event' => [
+            'App\Listeners\EventListener',
+        ],
+    ];
+
+    /**
+     * Register any events for your application.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        parent::boot();
+
+        //
+    }
+}

+ 73 - 0
app/Providers/RouteServiceProvider.php

@@ -0,0 +1,73 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Route;
+use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
+
+class RouteServiceProvider extends ServiceProvider
+{
+    /**
+     * This namespace is applied to your controller routes.
+     *
+     * In addition, it is set as the URL generator's root namespace.
+     *
+     * @var string
+     */
+    protected $namespace = 'App\Http\Controllers';
+
+    /**
+     * Define your route model bindings, pattern filters, etc.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+
+        parent::boot();
+    }
+
+    /**
+     * Define the routes for the application.
+     *
+     * @return void
+     */
+    public function map()
+    {
+        $this->mapApiRoutes();
+
+        $this->mapWebRoutes();
+
+        //
+    }
+
+    /**
+     * Define the "web" routes for the application.
+     *
+     * These routes all receive session state, CSRF protection, etc.
+     *
+     * @return void
+     */
+    protected function mapWebRoutes()
+    {
+        Route::middleware('web')
+             ->namespace($this->namespace)
+             ->group(base_path('routes/web.php'));
+    }
+
+    /**
+     * Define the "api" routes for the application.
+     *
+     * These routes are typically stateless.
+     *
+     * @return void
+     */
+    protected function mapApiRoutes()
+    {
+        Route::prefix('api')
+             ->middleware('api')
+             ->namespace($this->namespace)
+             ->group(base_path('routes/api.php'));
+    }
+}

+ 29 - 0
app/User.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App;
+
+use Illuminate\Notifications\Notifiable;
+use Illuminate\Foundation\Auth\User as Authenticatable;
+
+class User extends Authenticatable
+{
+    use Notifiable;
+
+    /**
+     * The attributes that are mass assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'name', 'email', 'password',
+    ];
+
+    /**
+     * The attributes that should be hidden for arrays.
+     *
+     * @var array
+     */
+    protected $hidden = [
+        'password', 'remember_token',
+    ];
+}

+ 51 - 0
artisan

@@ -0,0 +1,51 @@
+#!/usr/bin/env php
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Register The Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so that we do not have to worry about the
+| loading of any our classes "manually". Feels great to relax.
+|
+*/
+
+require __DIR__.'/bootstrap/autoload.php';
+
+$app = require_once __DIR__.'/bootstrap/app.php';
+
+/*
+|--------------------------------------------------------------------------
+| Run The Artisan Application
+|--------------------------------------------------------------------------
+|
+| When we run the console application, the current CLI command will be
+| executed in this console and the response sent back to a terminal
+| or another output device for the developers. Here goes nothing!
+|
+*/
+
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
+
+$status = $kernel->handle(
+    $input = new Symfony\Component\Console\Input\ArgvInput,
+    new Symfony\Component\Console\Output\ConsoleOutput
+);
+
+/*
+|--------------------------------------------------------------------------
+| Shutdown The Application
+|--------------------------------------------------------------------------
+|
+| Once Artisan has finished running, we will fire off the shutdown events
+| so that any final work may be done by the application before we shut
+| down the process. This is the last thing to happen to the request.
+|
+*/
+
+$kernel->terminate($input, $status);
+
+exit($status);

+ 55 - 0
bootstrap/app.php

@@ -0,0 +1,55 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Create The Application
+|--------------------------------------------------------------------------
+|
+| The first thing we will do is create a new Laravel application instance
+| which serves as the "glue" for all the components of Laravel, and is
+| the IoC container for the system binding all of the various parts.
+|
+*/
+
+$app = new Illuminate\Foundation\Application(
+    realpath(__DIR__.'/../')
+);
+
+/*
+|--------------------------------------------------------------------------
+| Bind Important Interfaces
+|--------------------------------------------------------------------------
+|
+| Next, we need to bind some important interfaces into the container so
+| we will be able to resolve them when needed. The kernels serve the
+| incoming requests to this application from both the web and CLI.
+|
+*/
+
+$app->singleton(
+    Illuminate\Contracts\Http\Kernel::class,
+    App\Http\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Console\Kernel::class,
+    App\Console\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Debug\ExceptionHandler::class,
+    App\Exceptions\Handler::class
+);
+
+/*
+|--------------------------------------------------------------------------
+| Return The Application
+|--------------------------------------------------------------------------
+|
+| This script returns the application instance. The instance is given to
+| the calling script so we can separate the building of the instances
+| from the actual running of the application and sending responses.
+|
+*/
+
+return $app;

+ 17 - 0
bootstrap/autoload.php

@@ -0,0 +1,17 @@
+<?php
+
+define('LARAVEL_START', microtime(true));
+
+/*
+|--------------------------------------------------------------------------
+| Register The Composer Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so we do not have to manually load any of
+| our application's PHP classes. It just feels great to relax.
+|
+*/
+
+require __DIR__.'/../vendor/autoload.php';

+ 2 - 0
bootstrap/cache/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 53 - 0
composer.json

@@ -0,0 +1,53 @@
+{
+    "name": "laravel/laravel",
+    "description": "The Laravel Framework.",
+    "keywords": ["framework", "laravel"],
+    "license": "MIT",
+    "type": "project",
+    "require": {
+        "php": ">=5.6.4",
+        "guzzlehttp/guzzle": "^6.2",
+        "laravel/framework": "5.4.*",
+        "laravel/tinker": "~1.0"
+    },
+    "require-dev": {
+        "fzaninotto/faker": "~1.4",
+        "mockery/mockery": "0.9.*",
+        "phpunit/phpunit": "~5.7"
+    },
+    "autoload": {
+        "classmap": [
+            "database",
+            "app/Lib"
+        ],
+        "psr-4": {
+            "App\\": "app/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\": "tests/"
+        }
+    },
+    "scripts": {
+        "post-root-package-install": [
+            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ],
+        "post-create-project-cmd": [
+            "php artisan key:generate"
+        ],
+        "post-install-cmd": [
+            "Illuminate\\Foundation\\ComposerScripts::postInstall",
+            "php artisan optimize"
+        ],
+        "post-update-cmd": [
+            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
+            "php artisan optimize"
+        ]
+    },
+    "config": {
+        "preferred-install": "dist",
+        "sort-packages": true,
+        "optimize-autoloader": true
+    }
+}

+ 3576 - 0
composer.lock

@@ -0,0 +1,3576 @@
+{
+    "_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#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "911c2a1d7686512c88aba6d6da667259",
+    "packages": [
+        {
+            "name": "dnoegel/php-xdg-base-dir",
+            "version": "0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+                "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/dnoegel/php-xdg-base-dir/265b8593498b997dc2d31e75b89f053b5cc9621a.zip",
+                "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "@stable"
+            },
+            "type": "project",
+            "autoload": {
+                "psr-4": {
+                    "XdgBaseDir\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "implementation of xdg base directory specification for php",
+            "time": "2014-10-24T07:27:01+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "v1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/inflector.git",
+                "reference": "90b2128806bfde671b6952ab8bea493942c1fdae"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/doctrine/inflector/90b2128806bfde671b6952ab8bea493942c1fdae.zip",
+                "reference": "90b2128806bfde671b6952ab8bea493942c1fdae",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\Common\\Inflector\\": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Common String Manipulations with regard to casing and singular/plural rules.",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "inflection",
+                "pluralize",
+                "singularize",
+                "string"
+            ],
+            "time": "2015-11-06T14:35:42+00:00"
+        },
+        {
+            "name": "erusev/parsedown",
+            "version": "1.6.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/erusev/parsedown.git",
+                "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/erusev/parsedown/1bf24f7334fe16c88bf9d467863309ceaf285b01.zip",
+                "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Parsedown": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Emanuil Rusev",
+                    "email": "hello@erusev.com",
+                    "homepage": "http://erusev.com"
+                }
+            ],
+            "description": "Parser for Markdown.",
+            "homepage": "http://parsedown.org",
+            "keywords": [
+                "markdown",
+                "parser"
+            ],
+            "time": "2017-03-29T16:04:15+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "6.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/guzzle/guzzle/8d6c6cc55186db87b7dc5009827429ba4e9dc006.zip",
+                "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/promises": "^1.0",
+                "guzzlehttp/psr7": "^1.4",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "^4.0",
+                "psr/log": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.2-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "time": "2017-02-28T22:50:30+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "v1.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/guzzle/promises/a59da6cf61d80060647ff4d3eb2c03a2bc694646.zip",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "time": "2016-12-20T10:07:11+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/guzzle/psr7/f5b8a8512e2b58b0071a7280e39f14f72e05d87c.zip",
+                "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "time": "2017-03-20T17:10:46+00:00"
+        },
+        {
+            "name": "jakub-onderka/php-console-color",
+            "version": "0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
+                "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/JakubOnderka/PHP-Console-Color/e0b393dacf7703fc36a4efc3df1435485197e6c1.zip",
+                "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "jakub-onderka/php-code-style": "1.0",
+                "jakub-onderka/php-parallel-lint": "0.*",
+                "jakub-onderka/php-var-dump-check": "0.*",
+                "phpunit/phpunit": "3.7.*",
+                "squizlabs/php_codesniffer": "1.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "JakubOnderka\\PhpConsoleColor": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "jakub.onderka@gmail.com",
+                    "homepage": "http://www.acci.cz"
+                }
+            ],
+            "time": "2014-04-08T15:00:19+00:00"
+        },
+        {
+            "name": "jakub-onderka/php-console-highlighter",
+            "version": "v0.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
+                "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/JakubOnderka/PHP-Console-Highlighter/7daa75df45242c8d5b75a22c00a201e7954e4fb5.zip",
+                "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5",
+                "shasum": ""
+            },
+            "require": {
+                "jakub-onderka/php-console-color": "~0.1",
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "jakub-onderka/php-code-style": "~1.0",
+                "jakub-onderka/php-parallel-lint": "~0.5",
+                "jakub-onderka/php-var-dump-check": "~0.1",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~1.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "JakubOnderka\\PhpConsoleHighlighter": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "acci@acci.cz",
+                    "homepage": "http://www.acci.cz/"
+                }
+            ],
+            "time": "2015-04-20T18:58:01+00:00"
+        },
+        {
+            "name": "laravel/framework",
+            "version": "v5.4.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/framework.git",
+                "reference": "2ed668f96d1a6ca42f50d5c87ee9ceecfc0a6eee"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/laravel/framework/2ed668f96d1a6ca42f50d5c87ee9ceecfc0a6eee.zip",
+                "reference": "2ed668f96d1a6ca42f50d5c87ee9ceecfc0a6eee",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/inflector": "~1.0",
+                "erusev/parsedown": "~1.6",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "league/flysystem": "~1.0",
+                "monolog/monolog": "~1.11",
+                "mtdowling/cron-expression": "~1.0",
+                "nesbot/carbon": "~1.20",
+                "paragonie/random_compat": "~1.4|~2.0",
+                "php": ">=5.6.4",
+                "ramsey/uuid": "~3.0",
+                "swiftmailer/swiftmailer": "~5.4",
+                "symfony/console": "~3.2",
+                "symfony/debug": "~3.2",
+                "symfony/finder": "~3.2",
+                "symfony/http-foundation": "~3.2",
+                "symfony/http-kernel": "~3.2",
+                "symfony/process": "~3.2",
+                "symfony/routing": "~3.2",
+                "symfony/var-dumper": "~3.2",
+                "tijsverkoyen/css-to-inline-styles": "~2.2",
+                "vlucas/phpdotenv": "~2.2"
+            },
+            "replace": {
+                "illuminate/auth": "self.version",
+                "illuminate/broadcasting": "self.version",
+                "illuminate/bus": "self.version",
+                "illuminate/cache": "self.version",
+                "illuminate/config": "self.version",
+                "illuminate/console": "self.version",
+                "illuminate/container": "self.version",
+                "illuminate/contracts": "self.version",
+                "illuminate/cookie": "self.version",
+                "illuminate/database": "self.version",
+                "illuminate/encryption": "self.version",
+                "illuminate/events": "self.version",
+                "illuminate/exception": "self.version",
+                "illuminate/filesystem": "self.version",
+                "illuminate/hashing": "self.version",
+                "illuminate/http": "self.version",
+                "illuminate/log": "self.version",
+                "illuminate/mail": "self.version",
+                "illuminate/notifications": "self.version",
+                "illuminate/pagination": "self.version",
+                "illuminate/pipeline": "self.version",
+                "illuminate/queue": "self.version",
+                "illuminate/redis": "self.version",
+                "illuminate/routing": "self.version",
+                "illuminate/session": "self.version",
+                "illuminate/support": "self.version",
+                "illuminate/translation": "self.version",
+                "illuminate/validation": "self.version",
+                "illuminate/view": "self.version",
+                "tightenco/collect": "self.version"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "~3.0",
+                "doctrine/dbal": "~2.5",
+                "mockery/mockery": "~0.9.4",
+                "pda/pheanstalk": "~3.0",
+                "phpunit/phpunit": "~5.7",
+                "predis/predis": "~1.0",
+                "symfony/css-selector": "~3.2",
+                "symfony/dom-crawler": "~3.2"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
+                "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).",
+                "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
+                "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).",
+                "laravel/tinker": "Required to use the tinker console command (~1.0).",
+                "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
+                "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
+                "nexmo/client": "Required to use the Nexmo transport (~1.0).",
+                "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
+                "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
+                "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
+                "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.2).",
+                "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.2).",
+                "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Illuminate/Foundation/helpers.php",
+                    "src/Illuminate/Support/helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\": "src/Illuminate/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Laravel Framework.",
+            "homepage": "https://laravel.com",
+            "keywords": [
+                "framework",
+                "laravel"
+            ],
+            "time": "2017-04-28T15:40:01+00:00"
+        },
+        {
+            "name": "laravel/tinker",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/tinker.git",
+                "reference": "3d5b675b55b24ccbf86395964042dbe061d5a965"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/laravel/tinker/3d5b675b55b24ccbf86395964042dbe061d5a965.zip",
+                "reference": "3d5b675b55b24ccbf86395964042dbe061d5a965",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/console": "~5.1",
+                "illuminate/contracts": "~5.1",
+                "illuminate/support": "~5.1",
+                "php": ">=5.5.9",
+                "psy/psysh": "0.7.*|0.8.*",
+                "symfony/var-dumper": "~3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0|~5.0"
+            },
+            "suggest": {
+                "illuminate/database": "The Illuminate Database package (~5.1)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\Tinker\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "Powerful REPL for the Laravel framework.",
+            "keywords": [
+                "REPL",
+                "Tinker",
+                "laravel",
+                "psysh"
+            ],
+            "time": "2016-12-30T18:13:17+00:00"
+        },
+        {
+            "name": "league/flysystem",
+            "version": "1.0.40",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem.git",
+                "reference": "3828f0b24e2c1918bb362d57a53205d6dc8fde61"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/thephpleague/flysystem/3828f0b24e2c1918bb362d57a53205d6dc8fde61.zip",
+                "reference": "3828f0b24e2c1918bb362d57a53205d6dc8fde61",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "conflict": {
+                "league/flysystem-sftp": "<1.0.6"
+            },
+            "require-dev": {
+                "ext-fileinfo": "*",
+                "mockery/mockery": "~0.9",
+                "phpspec/phpspec": "^2.2",
+                "phpunit/phpunit": "~4.8"
+            },
+            "suggest": {
+                "ext-fileinfo": "Required for MimeType",
+                "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+                "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+                "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+                "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+                "league/flysystem-copy": "Allows you to use Copy.com storage",
+                "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+                "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+                "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+                "league/flysystem-webdav": "Allows you to use WebDAV storage",
+                "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+                "spatie/flysystem-dropbox": "Allows you to use Dropbox storage"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Frank de Jonge",
+                    "email": "info@frenky.net"
+                }
+            ],
+            "description": "Filesystem abstraction: Many filesystems, one API.",
+            "keywords": [
+                "Cloud Files",
+                "WebDAV",
+                "abstraction",
+                "aws",
+                "cloud",
+                "copy.com",
+                "dropbox",
+                "file systems",
+                "files",
+                "filesystem",
+                "filesystems",
+                "ftp",
+                "rackspace",
+                "remote",
+                "s3",
+                "sftp",
+                "storage"
+            ],
+            "time": "2017-04-28T10:15:08+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "1.22.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/Seldaek/monolog/1e044bc4b34e91743943479f1be7a1d5eb93add0.zip",
+                "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/log": "~1.0"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "graylog2/gelf-php": "~1.0",
+                "jakub-onderka/php-parallel-lint": "0.9",
+                "php-amqplib/php-amqplib": "~2.4",
+                "php-console/php-console": "^3.1.3",
+                "phpunit/phpunit": "~4.5",
+                "phpunit/phpunit-mock-objects": "2.3.0",
+                "ruflin/elastica": ">=0.90 <3.0",
+                "sentry/sentry": "^0.13",
+                "swiftmailer/swiftmailer": "~5.3"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-mongo": "Allow sending log messages to a MongoDB server",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "php-console/php-console": "Allow sending log messages to Google Chrome",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+                "sentry/sentry": "Allow sending log messages to a Sentry server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "http://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "time": "2017-03-13T07:08:03+00:00"
+        },
+        {
+            "name": "mtdowling/cron-expression",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mtdowling/cron-expression.git",
+                "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/mtdowling/cron-expression/9504fa9ea681b586028adaaa0877db4aecf32bad.zip",
+                "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0|~5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Cron\\": "src/Cron/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+            "keywords": [
+                "cron",
+                "schedule"
+            ],
+            "time": "2017-01-23T04:29:33+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "1.22.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/briannesbitt/Carbon/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc.zip",
+                "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "symfony/translation": "~2.6 || ~3.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~2",
+                "phpunit/phpunit": "~4.0 || ~5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.23-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\": "src/Carbon/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "brian@nesbot.com",
+                    "homepage": "http://nesbot.com"
+                }
+            ],
+            "description": "A simple API extension for DateTime.",
+            "homepage": "http://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "time": "2017-01-16T07:55:07+00:00"
+        },
+        {
+            "name": "nikic/php-parser",
+            "version": "v3.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/nikic/PHP-Parser/2b9e2f71b722f7c53918ab0c25f7646c2013f17d.zip",
+                "reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0|~5.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-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"
+            ],
+            "time": "2017-03-05T18:23:57+00:00"
+        },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v2.0.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/paragonie/random_compat/634bae8e911eefa89c1abfbf1b66da679ac8f54d.zip",
+                "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "lib/random.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "pseudorandom",
+                "random"
+            ],
+            "time": "2017-03-13T16:27:32+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://files.phpcomposer.com/files/php-fig/http-message/f6561bf28d520154e4b0ec72be95418abe6d9363.zip",
+                "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"
+            ],
+            "time": "2016-08-06T14:39:51+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/php-fig/log/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d.zip",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2016-10-10T12:19:37+00:00"
+        },
+        {
+            "name": "psy/psysh",
+            "version": "v0.8.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/bobthecow/psysh.git",
+                "reference": "1dd4bbbc64d71e7ec075ffe82b42d9e096dc8d5e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/bobthecow/psysh/1dd4bbbc64d71e7ec075ffe82b42d9e096dc8d5e.zip",
+                "reference": "1dd4bbbc64d71e7ec075ffe82b42d9e096dc8d5e",
+                "shasum": ""
+            },
+            "require": {
+                "dnoegel/php-xdg-base-dir": "0.1",
+                "jakub-onderka/php-console-highlighter": "0.3.*",
+                "nikic/php-parser": "~1.3|~2.0|~3.0",
+                "php": ">=5.3.9",
+                "symfony/console": "~2.3.10|^2.4.2|~3.0",
+                "symfony/var-dumper": "~2.7|~3.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~1.11",
+                "hoa/console": "~3.16|~1.14",
+                "phpunit/phpunit": "~4.4|~5.0",
+                "symfony/finder": "~2.1|~3.0"
+            },
+            "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.",
+                "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+            },
+            "bin": [
+                "bin/psysh"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-develop": "0.9.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Psy/functions.php"
+                ],
+                "psr-4": {
+                    "Psy\\": "src/Psy/"
+                }
+            },
+            "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"
+            ],
+            "time": "2017-03-19T21:40:44+00:00"
+        },
+        {
+            "name": "ramsey/uuid",
+            "version": "3.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/uuid.git",
+                "reference": "4ae32dd9ab8860a4bbd750ad269cba7f06f7934e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/ramsey/uuid/4ae32dd9ab8860a4bbd750ad269cba7f06f7934e.zip",
+                "reference": "4ae32dd9ab8860a4bbd750ad269cba7f06f7934e",
+                "shasum": ""
+            },
+            "require": {
+                "paragonie/random_compat": "^1.0|^2.0",
+                "php": "^5.4 || ^7.0"
+            },
+            "replace": {
+                "rhumsaa/uuid": "self.version"
+            },
+            "require-dev": {
+                "apigen/apigen": "^4.1",
+                "codeception/aspect-mock": "^1.0 | ^2.0",
+                "doctrine/annotations": "~1.2.0",
+                "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1",
+                "ircmaxell/random-lib": "^1.1",
+                "jakub-onderka/php-parallel-lint": "^0.9.0",
+                "mockery/mockery": "^0.9.4",
+                "moontoast/math": "^1.1",
+                "php-mock/php-mock-phpunit": "^0.3|^1.1",
+                "phpunit/phpunit": "^4.7|>=5.0 <5.4",
+                "satooshi/php-coveralls": "^0.6.1",
+                "squizlabs/php_codesniffer": "^2.3"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
+                "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
+                "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+                "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).",
+                "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid",
+                "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Ramsey\\Uuid\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marijn Huizendveld",
+                    "email": "marijn.huizendveld@gmail.com"
+                },
+                {
+                    "name": "Thibaud Fabre",
+                    "email": "thibaud@aztech.io"
+                },
+                {
+                    "name": "Ben Ramsey",
+                    "email": "ben@benramsey.com",
+                    "homepage": "https://benramsey.com"
+                }
+            ],
+            "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).",
+            "homepage": "https://github.com/ramsey/uuid",
+            "keywords": [
+                "guid",
+                "identifier",
+                "uuid"
+            ],
+            "time": "2017-03-26T20:37:53+00:00"
+        },
+        {
+            "name": "swiftmailer/swiftmailer",
+            "version": "v5.4.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/swiftmailer/swiftmailer.git",
+                "reference": "56db4ed32a6d5c9824c3ecc1d2e538f663f47eb4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/swiftmailer/swiftmailer/56db4ed32a6d5c9824c3ecc1d2e538f663f47eb4.zip",
+                "reference": "56db4ed32a6d5c9824c3ecc1d2e538f663f47eb4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "mockery/mockery": "~0.9.1",
+                "symfony/phpunit-bridge": "~3.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "lib/swift_required.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Chris Corbyn"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Swiftmailer, free feature-rich PHP mailer",
+            "homepage": "http://swiftmailer.org",
+            "keywords": [
+                "email",
+                "mail",
+                "mailer"
+            ],
+            "time": "2017-04-20T17:32:18+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "c30243cc51f726812be3551316b109a2f5deaf8d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/console/c30243cc51f726812be3551316b109a2f5deaf8d.zip",
+                "reference": "c30243cc51f726812be3551316b109a2f5deaf8d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/debug": "~2.8|~3.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/filesystem": "~2.8|~3.0",
+                "symfony/process": "~2.8|~3.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/filesystem": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "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": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-04-04T14:33:42+00:00"
+        },
+        {
+            "name": "symfony/css-selector",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/css-selector.git",
+                "reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/css-selector/a48f13dc83c168f1253a5d2a5a4fb46c36244c4c.zip",
+                "reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\CssSelector\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jean-François Simon",
+                    "email": "jeanfrancois.simon@sensiolabs.com"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony CssSelector Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-02-21T09:12:04+00:00"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "56f613406446a4a0a031475cfd0a01751de22659"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/debug/56f613406446a4a0a031475cfd0a01751de22659.zip",
+                "reference": "56f613406446a4a0a031475cfd0a01751de22659",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/class-loader": "~2.8|~3.0",
+                "symfony/http-kernel": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "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": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-03-28T21:38:24+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "154bb1ef7b0e42ccc792bd53edbce18ed73440ca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/event-dispatcher/154bb1ef7b0e42ccc792bd53edbce18ed73440ca.zip",
+                "reference": "154bb1ef7b0e42ccc792bd53edbce18ed73440ca",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/dependency-injection": "~2.8|~3.0",
+                "symfony/expression-language": "~2.8|~3.0",
+                "symfony/stopwatch": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "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": "Symfony EventDispatcher Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-04-04T07:26:27+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "b20900ce5ea164cd9314af52725b0bb5a758217a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/finder/b20900ce5ea164cd9314af52725b0bb5a758217a.zip",
+                "reference": "b20900ce5ea164cd9314af52725b0bb5a758217a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "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": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-03-20T09:32:19+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "cb0b6418f588952c9290b3df4ca650f1b7ab570a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/http-foundation/cb0b6418f588952c9290b3df4ca650f1b7ab570a.zip",
+                "reference": "cb0b6418f588952c9290b3df4ca650f1b7ab570a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.1"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "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": "Symfony HttpFoundation Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-04-04T15:30:56+00:00"
+        },
+        {
+            "name": "symfony/http-kernel",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-kernel.git",
+                "reference": "8285ab5faf1306b1a5ebcf287fe91c231a6de88e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/http-kernel/8285ab5faf1306b1a5ebcf287fe91c231a6de88e.zip",
+                "reference": "8285ab5faf1306b1a5ebcf287fe91c231a6de88e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "psr/log": "~1.0",
+                "symfony/debug": "~2.8|~3.0",
+                "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/http-foundation": "~2.8.13|~3.1.6|~3.2"
+            },
+            "conflict": {
+                "symfony/config": "<2.8"
+            },
+            "require-dev": {
+                "symfony/browser-kit": "~2.8|~3.0",
+                "symfony/class-loader": "~2.8|~3.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/console": "~2.8|~3.0",
+                "symfony/css-selector": "~2.8|~3.0",
+                "symfony/dependency-injection": "~2.8|~3.0",
+                "symfony/dom-crawler": "~2.8|~3.0",
+                "symfony/expression-language": "~2.8|~3.0",
+                "symfony/finder": "~2.8|~3.0",
+                "symfony/process": "~2.8|~3.0",
+                "symfony/routing": "~2.8|~3.0",
+                "symfony/stopwatch": "~2.8|~3.0",
+                "symfony/templating": "~2.8|~3.0",
+                "symfony/translation": "~2.8|~3.0",
+                "symfony/var-dumper": "~3.2"
+            },
+            "suggest": {
+                "symfony/browser-kit": "",
+                "symfony/class-loader": "",
+                "symfony/config": "",
+                "symfony/console": "",
+                "symfony/dependency-injection": "",
+                "symfony/finder": "",
+                "symfony/var-dumper": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpKernel\\": ""
+                },
+                "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": "Symfony HttpKernel Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-04-05T12:52:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/polyfill-mbstring/e79d363049d1c2128f133a2667e4f4190904f7f4.zip",
+                "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.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": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2016-11-14T01:06:16+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "57fdaa55827ae14d617550ebe71a820f0a5e2282"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/process/57fdaa55827ae14d617550ebe71a820f0a5e2282.zip",
+                "reference": "57fdaa55827ae14d617550ebe71a820f0a5e2282",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "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": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-03-27T18:07:02+00:00"
+        },
+        {
+            "name": "symfony/routing",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/routing.git",
+                "reference": "d6605f9a5767bc5bc4895e1c762ba93964608aee"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/routing/d6605f9a5767bc5bc4895e1c762ba93964608aee.zip",
+                "reference": "d6605f9a5767bc5bc4895e1c762ba93964608aee",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "conflict": {
+                "symfony/config": "<2.8"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "doctrine/common": "~2.2",
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/expression-language": "~2.8|~3.0",
+                "symfony/http-foundation": "~2.8|~3.0",
+                "symfony/yaml": "~2.8|~3.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation loader",
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/dependency-injection": "For loading routes from a service",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/http-foundation": "For using a Symfony Request object",
+                "symfony/yaml": "For using the YAML loader"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Routing\\": ""
+                },
+                "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": "Symfony Routing Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "time": "2017-03-02T15:58:09+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "c740eee70783d2af4d3d6b70d5146f209e6b4d13"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/translation/c740eee70783d2af4d3d6b70d5146f209e6b4d13.zip",
+                "reference": "c740eee70783d2af4d3d6b70d5146f209e6b4d13",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/config": "<2.8"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/intl": "^2.8.18|^3.2.5",
+                "symfony/yaml": "~2.8|~3.0"
+            },
+            "suggest": {
+                "psr/log": "To use logging capability in translator",
+                "symfony/config": "",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "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": "Symfony Translation Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-03-21T21:44:32+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "81dce20f69a8b40427e1f4e6462178df87cafc03"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/var-dumper/81dce20f69a8b40427e1f4e6462178df87cafc03.zip",
+                "reference": "81dce20f69a8b40427e1f4e6462178df87cafc03",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+            },
+            "require-dev": {
+                "twig/twig": "~1.20|~2.0"
+            },
+            "suggest": {
+                "ext-symfony_debug": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "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": "Symfony mechanism for exploring and dumping PHP variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "time": "2017-03-12T16:07:05+00:00"
+        },
+        {
+            "name": "tijsverkoyen/css-to-inline-styles",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+                "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/tijsverkoyen/CssToInlineStyles/ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b.zip",
+                "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5 || ^7",
+                "symfony/css-selector": "^2.7|~3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.8|5.1.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "TijsVerkoyen\\CssToInlineStyles\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Tijs Verkoyen",
+                    "email": "css_to_inline_styles@verkoyen.eu",
+                    "role": "Developer"
+                }
+            ],
+            "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+            "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+            "time": "2016-09-20T12:50:39+00:00"
+        },
+        {
+            "name": "vlucas/phpdotenv",
+            "version": "v2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vlucas/phpdotenv.git",
+                "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/vlucas/phpdotenv/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c.zip",
+                "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8 || ^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Dotenv\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause-Attribution"
+            ],
+            "authors": [
+                {
+                    "name": "Vance Lucas",
+                    "email": "vance@vancelucas.com",
+                    "homepage": "http://www.vancelucas.com"
+                }
+            ],
+            "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+            "keywords": [
+                "dotenv",
+                "env",
+                "environment"
+            ],
+            "time": "2016-09-01T10:05:43+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/doctrine/instantiator/8e884e78f9f0eb1329e445619e04456e64d8051d.zip",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3,<8.0-DEV"
+            },
+            "require-dev": {
+                "athletic/athletic": "~0.1.8",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "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": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://github.com/doctrine/instantiator",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "time": "2015-06-14T21:17:01+00:00"
+        },
+        {
+            "name": "fzaninotto/faker",
+            "version": "v1.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/fzaninotto/Faker.git",
+                "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/fzaninotto/Faker/44f9a286a04b80c76a4e5fb7aad8bb539b920123.zip",
+                "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3|^7.0"
+            },
+            "require-dev": {
+                "ext-intl": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~1.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": []
+            },
+            "autoload": {
+                "psr-4": {
+                    "Faker\\": "src/Faker/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "François Zaninotto"
+                }
+            ],
+            "description": "Faker is a PHP library that generates fake data for you.",
+            "keywords": [
+                "data",
+                "faker",
+                "fixtures"
+            ],
+            "time": "2016-04-29T12:21:54+00:00"
+        },
+        {
+            "name": "hamcrest/hamcrest-php",
+            "version": "v1.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hamcrest/hamcrest-php.git",
+                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/hamcrest/hamcrest-php/b37020aa976fa52d3de9aa904aa2522dc518f79c.zip",
+                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "replace": {
+                "cordoval/hamcrest-php": "*",
+                "davedevelopment/hamcrest-php": "*",
+                "kodova/hamcrest-php": "*"
+            },
+            "require-dev": {
+                "phpunit/php-file-iterator": "1.3.3",
+                "satooshi/php-coveralls": "dev-master"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "hamcrest"
+                ],
+                "files": [
+                    "hamcrest/Hamcrest.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD"
+            ],
+            "description": "This is the PHP port of Hamcrest Matchers",
+            "keywords": [
+                "test"
+            ],
+            "time": "2015-05-11T14:41:42+00:00"
+        },
+        {
+            "name": "mockery/mockery",
+            "version": "0.9.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mockery/mockery.git",
+                "reference": "6fdb61243844dc924071d3404bb23994ea0b6856"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/mockery/mockery/6fdb61243844dc924071d3404bb23994ea0b6856.zip",
+                "reference": "6fdb61243844dc924071d3404bb23994ea0b6856",
+                "shasum": ""
+            },
+            "require": {
+                "hamcrest/hamcrest-php": "~1.1",
+                "lib-pcre": ">=7.0",
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.9.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Mockery": "library/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Pádraic Brady",
+                    "email": "padraic.brady@gmail.com",
+                    "homepage": "http://blog.astrumfutura.com"
+                },
+                {
+                    "name": "Dave Marshall",
+                    "email": "dave.marshall@atstsolutions.co.uk",
+                    "homepage": "http://davedevelopment.co.uk"
+                }
+            ],
+            "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
+            "homepage": "http://github.com/padraic/mockery",
+            "keywords": [
+                "BDD",
+                "TDD",
+                "library",
+                "mock",
+                "mock objects",
+                "mockery",
+                "stub",
+                "test",
+                "test double",
+                "testing"
+            ],
+            "time": "2017-02-28T12:52:32+00:00"
+        },
+        {
+            "name": "myclabs/deep-copy",
+            "version": "1.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/myclabs/DeepCopy/8e6e04167378abf1ddb4d3522d8755c5fd90d102.zip",
+                "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "doctrine/collections": "1.*",
+                "phpunit/phpunit": "~4.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Create deep copies (clones) of your objects",
+            "homepage": "https://github.com/myclabs/DeepCopy",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "time": "2017-04-12T18:52:22+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-common",
+            "version": "1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+                "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/phpDocumentor/ReflectionCommon/144c307535e82c8fdcaacbcfc1d6d8eeb896687c.zip",
+                "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.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"
+            ],
+            "time": "2015-12-27T11:43:31+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "3.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/phpDocumentor/ReflectionDocBlock/8331b5efe816ae05461b7ca1e721c01b46bafb3e.zip",
+                "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5",
+                "phpdocumentor/reflection-common": "^1.0@dev",
+                "phpdocumentor/type-resolver": "^0.2.0",
+                "webmozart/assert": "^1.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^0.9.4",
+                "phpunit/phpunit": "^4.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+            "time": "2016-09-30T07:12:33+00:00"
+        },
+        {
+            "name": "phpdocumentor/type-resolver",
+            "version": "0.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/TypeResolver.git",
+                "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/phpDocumentor/TypeResolver/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb.zip",
+                "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5",
+                "phpdocumentor/reflection-common": "^1.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^0.9.4",
+                "phpunit/phpunit": "^5.2||^4.8.24"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.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"
+                }
+            ],
+            "time": "2016-11-25T06:54:22+00:00"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "v1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/phpspec/prophecy/93d39f1f7f9326d746203c7c056f300f7f126073.zip",
+                "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.3|^7.0",
+                "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+                "sebastian/comparator": "^1.1|^2.0",
+                "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^2.5|^3.2",
+                "phpunit/phpunit": "^4.8 || ^5.6.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.6.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Prophecy\\": "src/"
+                }
+            },
+            "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"
+            ],
+            "time": "2017-03-02T20:05:34+00:00"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "4.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-code-coverage/ef7b2f56815df854e66ceaee8ebe9393ae36a40d.zip",
+                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-xmlwriter": "*",
+                "php": "^5.6 || ^7.0",
+                "phpunit/php-file-iterator": "^1.3",
+                "phpunit/php-text-template": "^1.2",
+                "phpunit/php-token-stream": "^1.4.2 || ^2.0",
+                "sebastian/code-unit-reverse-lookup": "^1.0",
+                "sebastian/environment": "^1.3.2 || ^2.0",
+                "sebastian/version": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "ext-xdebug": "^2.1.4",
+                "phpunit/phpunit": "^5.7"
+            },
+            "suggest": {
+                "ext-xdebug": "^2.5.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0.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": "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"
+            ],
+            "time": "2017-04-02T07:44:40+00:00"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-file-iterator/3cc8f69b3028d0f96a9078e6295d86e9bf019be5.zip",
+                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+                "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"
+            ],
+            "time": "2016-10-03T07:40:28+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://files.phpcomposer.com/files/sebastianbergmann/php-text-template/31f8b717e51d9a2afca6c9f046f5d69fc27c8686.zip",
+                "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"
+            ],
+            "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://files.phpcomposer.com/files/sebastianbergmann/php-timer/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f.zip",
+                "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"
+            ],
+            "time": "2017-02-26T11:10:40+00:00"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "1.4.11",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-token-stream/e03f8f67534427a787e21a385a67ec3ca6978ea7.zip",
+                "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-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"
+            ],
+            "time": "2017-02-27T10:12:30+00:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "5.7.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/phpunit/69c4f49ff376af2692bad9cebd883d17ebaa98a1.zip",
+                "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "myclabs/deep-copy": "~1.3",
+                "php": "^5.6 || ^7.0",
+                "phpspec/prophecy": "^1.6.2",
+                "phpunit/php-code-coverage": "^4.0.4",
+                "phpunit/php-file-iterator": "~1.4",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": "^1.0.6",
+                "phpunit/phpunit-mock-objects": "^3.2",
+                "sebastian/comparator": "^1.2.4",
+                "sebastian/diff": "~1.2",
+                "sebastian/environment": "^1.3.4 || ^2.0",
+                "sebastian/exporter": "~2.0",
+                "sebastian/global-state": "^1.1",
+                "sebastian/object-enumerator": "~2.0",
+                "sebastian/resource-operations": "~1.0",
+                "sebastian/version": "~1.0.3|~2.0",
+                "symfony/yaml": "~2.1|~3.0"
+            },
+            "conflict": {
+                "phpdocumentor/reflection-docblock": "3.0.2"
+            },
+            "require-dev": {
+                "ext-pdo": "*"
+            },
+            "suggest": {
+                "ext-xdebug": "*",
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.7.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"
+            ],
+            "time": "2017-04-03T02:22:27+00:00"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "3.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/phpunit-mock-objects/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24.zip",
+                "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.6 || ^7.0",
+                "phpunit/php-text-template": "^1.2",
+                "sebastian/exporter": "^1.2 || ^2.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.4"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2.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": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "time": "2016-12-08T20:27:08+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/code-unit-reverse-lookup/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18.zip",
+                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7 || ^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": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "time": "2017-03-04T06:30:41+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "1.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/comparator/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be.zip",
+                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.2",
+                "sebastian/exporter": "~1.2 || ~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.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": "http://www.github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "time": "2017-01-29T09:50:25+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/diff/13edfd8706462032c2f52b4b862974dd46b71c9e.zip",
+                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-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"
+            ],
+            "time": "2015-12-08T07:14:41+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/environment/5795ffe5dc5b02460c3e34222fee8cbe245d8fac.zip",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "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"
+            ],
+            "time": "2016-11-26T07:53:53+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/exporter/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4.zip",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/recursion-context": "~2.0"
+            },
+            "require-dev": {
+                "ext-mbstring": "*",
+                "phpunit/phpunit": "~4.4"
+            },
+            "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": "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"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "time": "2016-11-19T08:54:04+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/global-state/bc37d50fea7d017d3d340f230811c9f1d7280af4.zip",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "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": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2015-10-12T03:26:01+00:00"
+        },
+        {
+            "name": "sebastian/object-enumerator",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/object-enumerator/1311872ac850040a79c3c058bea3e22d0f09cbb7.zip",
+                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6",
+                "sebastian/recursion-context": "~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~5"
+            },
+            "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"
+                }
+            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "time": "2017-02-18T15:18:39+00:00"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/sebastianbergmann/recursion-context/2c3ba150cbec723aa057506e73a8d33bdb286c9a.zip",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "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": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "time": "2016-11-19T07:33:16+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://files.phpcomposer.com/files/sebastianbergmann/resource-operations/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52.zip",
+                "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",
+            "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://files.phpcomposer.com/files/sebastianbergmann/version/99732be0ddb3361e16ad77b68ba41efc8e979019.zip",
+                "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",
+            "time": "2016-10-03T07:35:21+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/symfony/yaml/62b4cdb99d52cb1ff253c465eb1532a80cebb621.zip",
+                "reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "require-dev": {
+                "symfony/console": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/console": "For validating YAML files using the lint command"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "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": "Symfony Yaml Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-03-20T09:45:15+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozart/assert.git",
+                "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://files.phpcomposer.com/files/webmozart/assert/2db61e59ff05fe5126d152bd0655c9ea113e550f.zip",
+                "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.6",
+                "sebastian/version": "^1.0.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-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"
+            ],
+            "time": "2016-11-23T20:04:58+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.6.4"
+    },
+    "platform-dev": []
+}

+ 231 - 0
config/app.php

@@ -0,0 +1,231 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Name
+    |--------------------------------------------------------------------------
+    |
+    | This value is the name of your application. This value is used when the
+    | framework needs to place the application's name in a notification or
+    | any other location as required by the application or its packages.
+    */
+
+    'name' => env('APP_NAME', 'Laravel'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Environment
+    |--------------------------------------------------------------------------
+    |
+    | This value determines the "environment" your application is currently
+    | running in. This may determine how you prefer to configure various
+    | services your application utilizes. Set this in your ".env" file.
+    |
+    */
+
+    'env' => env('APP_ENV', 'production'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Debug Mode
+    |--------------------------------------------------------------------------
+    |
+    | When your application is in debug mode, detailed error messages with
+    | stack traces will be shown on every error that occurs within your
+    | application. If disabled, a simple generic error page is shown.
+    |
+    */
+
+    'debug' => env('APP_DEBUG', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application URL
+    |--------------------------------------------------------------------------
+    |
+    | This URL is used by the console to properly generate URLs when using
+    | the Artisan command line tool. You should set this to the root of
+    | your application so that it is used when running Artisan tasks.
+    |
+    */
+
+    'url' => env('APP_URL', 'http://localhost'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Timezone
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default timezone for your application, which
+    | will be used by the PHP date and date-time functions. We have gone
+    | ahead and set this to a sensible default for you out of the box.
+    |
+    */
+
+    'timezone' => 'Asia/Shanghai',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Locale Configuration
+    |--------------------------------------------------------------------------
+    |
+    | The application locale determines the default locale that will be used
+    | by the translation service provider. You are free to set this value
+    | to any of the locales which will be supported by the application.
+    |
+    */
+
+    'locale' => 'en',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Fallback Locale
+    |--------------------------------------------------------------------------
+    |
+    | The fallback locale determines the locale to use when the current one
+    | is not available. You may change the value to correspond to any of
+    | the language folders that are provided through your application.
+    |
+    */
+
+    'fallback_locale' => 'en',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Encryption Key
+    |--------------------------------------------------------------------------
+    |
+    | This key is used by the Illuminate encrypter service and should be set
+    | to a random, 32 character string, otherwise these encrypted strings
+    | will not be safe. Please do this before deploying an application!
+    |
+    */
+
+    'key' => env('APP_KEY'),
+
+    'cipher' => 'AES-256-CBC',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Logging Configuration
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the log settings for your application. Out of
+    | the box, Laravel uses the Monolog PHP logging library. This gives
+    | you a variety of powerful log handlers / formatters to utilize.
+    |
+    | Available Settings: "single", "daily", "syslog", "errorlog"
+    |
+    */
+
+    'log' => env('APP_LOG', 'single'),
+
+    'log_level' => env('APP_LOG_LEVEL', 'debug'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Autoloaded Service Providers
+    |--------------------------------------------------------------------------
+    |
+    | The service providers listed here will be automatically loaded on the
+    | request to your application. Feel free to add your own services to
+    | this array to grant expanded functionality to your applications.
+    |
+    */
+
+    'providers' => [
+
+        /*
+         * Laravel Framework Service Providers...
+         */
+        Illuminate\Auth\AuthServiceProvider::class,
+        Illuminate\Broadcasting\BroadcastServiceProvider::class,
+        Illuminate\Bus\BusServiceProvider::class,
+        Illuminate\Cache\CacheServiceProvider::class,
+        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
+        Illuminate\Cookie\CookieServiceProvider::class,
+        Illuminate\Database\DatabaseServiceProvider::class,
+        Illuminate\Encryption\EncryptionServiceProvider::class,
+        Illuminate\Filesystem\FilesystemServiceProvider::class,
+        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
+        Illuminate\Hashing\HashServiceProvider::class,
+        Illuminate\Mail\MailServiceProvider::class,
+        Illuminate\Notifications\NotificationServiceProvider::class,
+        Illuminate\Pagination\PaginationServiceProvider::class,
+        Illuminate\Pipeline\PipelineServiceProvider::class,
+        Illuminate\Queue\QueueServiceProvider::class,
+        Illuminate\Redis\RedisServiceProvider::class,
+        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
+        Illuminate\Session\SessionServiceProvider::class,
+        Illuminate\Translation\TranslationServiceProvider::class,
+        Illuminate\Validation\ValidationServiceProvider::class,
+        Illuminate\View\ViewServiceProvider::class,
+
+        /*
+         * Package Service Providers...
+         */
+        Laravel\Tinker\TinkerServiceProvider::class,
+
+        /*
+         * Application Service Providers...
+         */
+        App\Providers\AppServiceProvider::class,
+        App\Providers\AuthServiceProvider::class,
+        // App\Providers\BroadcastServiceProvider::class,
+        App\Providers\EventServiceProvider::class,
+        App\Providers\RouteServiceProvider::class,
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Class Aliases
+    |--------------------------------------------------------------------------
+    |
+    | This array of class aliases will be registered when this application
+    | is started. However, feel free to register as many as you wish as
+    | the aliases are "lazy" loaded so they don't hinder performance.
+    |
+    */
+
+    'aliases' => [
+
+        'App' => Illuminate\Support\Facades\App::class,
+        'Artisan' => Illuminate\Support\Facades\Artisan::class,
+        'Auth' => Illuminate\Support\Facades\Auth::class,
+        'Blade' => Illuminate\Support\Facades\Blade::class,
+        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
+        'Bus' => Illuminate\Support\Facades\Bus::class,
+        'Cache' => Illuminate\Support\Facades\Cache::class,
+        'Config' => Illuminate\Support\Facades\Config::class,
+        'Cookie' => Illuminate\Support\Facades\Cookie::class,
+        'Crypt' => Illuminate\Support\Facades\Crypt::class,
+        'DB' => Illuminate\Support\Facades\DB::class,
+        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
+        'Event' => Illuminate\Support\Facades\Event::class,
+        'File' => Illuminate\Support\Facades\File::class,
+        'Gate' => Illuminate\Support\Facades\Gate::class,
+        'Hash' => Illuminate\Support\Facades\Hash::class,
+        'Lang' => Illuminate\Support\Facades\Lang::class,
+        'Log' => Illuminate\Support\Facades\Log::class,
+        'Mail' => Illuminate\Support\Facades\Mail::class,
+        'Notification' => Illuminate\Support\Facades\Notification::class,
+        'Password' => Illuminate\Support\Facades\Password::class,
+        'Queue' => Illuminate\Support\Facades\Queue::class,
+        'Redirect' => Illuminate\Support\Facades\Redirect::class,
+        'Redis' => Illuminate\Support\Facades\Redis::class,
+        'Request' => Illuminate\Support\Facades\Request::class,
+        'Response' => Illuminate\Support\Facades\Response::class,
+        'Route' => Illuminate\Support\Facades\Route::class,
+        'Schema' => Illuminate\Support\Facades\Schema::class,
+        'Session' => Illuminate\Support\Facades\Session::class,
+        'Storage' => Illuminate\Support\Facades\Storage::class,
+        'URL' => Illuminate\Support\Facades\URL::class,
+        'Validator' => Illuminate\Support\Facades\Validator::class,
+        'View' => Illuminate\Support\Facades\View::class,
+
+    ],
+
+];

+ 104 - 0
config/auth.php

@@ -0,0 +1,104 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Defaults
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default authentication "guard" and password
+    | reset options for your application. You may change these defaults
+    | as required, but they're a perfect start for most applications.
+    |
+    */
+
+    'defaults' => [
+        'guard' => 'web',
+        'passwords' => 'users',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Guards
+    |--------------------------------------------------------------------------
+    |
+    | Next, you may define every authentication guard for your application.
+    | Of course, a great default configuration has been defined for you
+    | here which uses session storage and the Eloquent user provider.
+    |
+    | All authentication drivers have a user provider. This defines how the
+    | users are actually retrieved out of your database or other storage
+    | mechanisms used by this application to persist your user's data.
+    |
+    | Supported: "session", "token"
+    |
+    */
+
+    'guards' => [
+        'web' => [
+            'driver' => 'session',
+            'provider' => 'users',
+        ],
+
+        'api' => [
+            'driver' => 'token',
+            'provider' => 'users',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | User Providers
+    |--------------------------------------------------------------------------
+    |
+    | All authentication drivers have a user provider. This defines how the
+    | users are actually retrieved out of your database or other storage
+    | mechanisms used by this application to persist your user's data.
+    |
+    | If you have multiple user tables or models you may configure multiple
+    | sources which represent each model / table. These sources may then
+    | be assigned to any extra authentication guards you have defined.
+    |
+    | Supported: "database", "eloquent"
+    |
+    */
+
+    'providers' => [
+        'users' => [
+            'driver' => 'eloquent',
+           // 'model' => App\User::class,
+            'model' => App\Model\admin\AdminUser::class,
+            'table' =>'admin_user',
+        ],
+
+        // 'users' => [
+        //     'driver' => 'database',
+        //     'table' => 'users',
+        // ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Resetting Passwords
+    |--------------------------------------------------------------------------
+    |
+    | You may specify multiple password reset configurations if you have more
+    | than one user table or model in the application and you want to have
+    | separate password reset settings based on the specific user types.
+    |
+    | The expire time is the number of minutes that the reset token should be
+    | considered valid. This security feature keeps tokens short-lived so
+    | they have less time to be guessed. You may change this as needed.
+    |
+    */
+
+    'passwords' => [
+        'users' => [
+            'provider' => 'users',
+            'table' => 'password_resets',
+            'expire' => 60,
+        ],
+    ],
+
+];

+ 58 - 0
config/broadcasting.php

@@ -0,0 +1,58 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Broadcaster
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default broadcaster that will be used by the
+    | framework when an event needs to be broadcast. You may set this to
+    | any of the connections defined in the "connections" array below.
+    |
+    | Supported: "pusher", "redis", "log", "null"
+    |
+    */
+
+    'default' => env('BROADCAST_DRIVER', 'null'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Broadcast Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define all of the broadcast connections that will be used
+    | to broadcast events to other systems or over websockets. Samples of
+    | each available type of connection are provided inside this array.
+    |
+    */
+
+    'connections' => [
+
+        'pusher' => [
+            'driver' => 'pusher',
+            'key' => env('PUSHER_APP_KEY'),
+            'secret' => env('PUSHER_APP_SECRET'),
+            'app_id' => env('PUSHER_APP_ID'),
+            'options' => [
+                //
+            ],
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+        ],
+
+        'log' => [
+            'driver' => 'log',
+        ],
+
+        'null' => [
+            'driver' => 'null',
+        ],
+
+    ],
+
+];

+ 91 - 0
config/cache.php

@@ -0,0 +1,91 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Cache Store
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default cache connection that gets used while
+    | using this caching library. This connection is used when another is
+    | not explicitly specified when executing a given caching function.
+    |
+    | Supported: "apc", "array", "database", "file", "memcached", "redis"
+    |
+    */
+
+    'default' => env('CACHE_DRIVER', 'file'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cache Stores
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define all of the cache "stores" for your application as
+    | well as their drivers. You may even define multiple stores for the
+    | same cache driver to group types of items stored in your caches.
+    |
+    */
+
+    'stores' => [
+
+        'apc' => [
+            'driver' => 'apc',
+        ],
+
+        'array' => [
+            'driver' => 'array',
+        ],
+
+        'database' => [
+            'driver' => 'database',
+            'table' => 'cache',
+            'connection' => null,
+        ],
+
+        'file' => [
+            'driver' => 'file',
+            'path' => storage_path('framework/cache/data'),
+        ],
+
+        'memcached' => [
+            'driver' => 'memcached',
+            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
+            'sasl' => [
+                env('MEMCACHED_USERNAME'),
+                env('MEMCACHED_PASSWORD'),
+            ],
+            'options' => [
+                // Memcached::OPT_CONNECT_TIMEOUT  => 2000,
+            ],
+            'servers' => [
+                [
+                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
+                    'port' => env('MEMCACHED_PORT', 11211),
+                    'weight' => 100,
+                ],
+            ],
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cache Key Prefix
+    |--------------------------------------------------------------------------
+    |
+    | When utilizing a RAM based store such as APC or Memcached, there might
+    | be other applications utilizing the same cache. So, we'll specify a
+    | value to get prefixed to all our keys so we can avoid collisions.
+    |
+    */
+
+    'prefix' => 'xq_',
+
+];

+ 109 - 0
config/database.php

@@ -0,0 +1,109 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Database Connection Name
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify which of the database connections below you wish
+    | to use as your default connection for all database work. Of course
+    | you may use many connections at once using the Database library.
+    |
+    */
+
+    'default' => env('DB_CONNECTION', 'mysql'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Database Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here are each of the database connections setup for your application.
+    | Of course, examples of configuring each database platform that is
+    | supported by Laravel is shown below to make development simple.
+    |
+    |
+    | All database work in Laravel is done through the PHP PDO facilities
+    | so make sure you have the driver for your particular database of
+    | choice installed on your machine before you begin development.
+    |
+    */
+
+    'connections' => [
+
+        'sqlite' => [
+            'driver' => 'sqlite',
+            'database' => env('DB_DATABASE', database_path('database.sqlite')),
+            'prefix' => '',
+        ],
+
+        'mysql' => [
+            'driver' => 'mysql',
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '3306'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'unix_socket' => env('DB_SOCKET', ''),
+            'charset' => 'utf8mb4',
+            'collation' => 'utf8mb4_unicode_ci',
+            'prefix' => 'xq_',
+            'strict' => true,
+            'engine' => null,
+        ],
+
+        'pgsql' => [
+            'driver' => 'pgsql',
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '5432'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'charset' => 'utf8',
+            'prefix' => '',
+            'schema' => 'public',
+            'sslmode' => 'prefer',
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Migration Repository Table
+    |--------------------------------------------------------------------------
+    |
+    | This table keeps track of all the migrations that have already run for
+    | your application. Using this information, we can determine which of
+    | the migrations on disk haven't actually been run in the database.
+    |
+    */
+
+    'migrations' => 'migrations',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Redis Databases
+    |--------------------------------------------------------------------------
+    |
+    | Redis is an open source, fast, and advanced key-value store that also
+    | provides a richer set of commands than a typical key-value systems
+    | such as APC or Memcached. Laravel makes it easy to dig right in.
+    |
+    */
+
+    'redis' => [
+
+        'client' => 'predis',
+
+        'default' => [
+            'host' => env('REDIS_HOST', '127.0.0.1'),
+            'password' => env('REDIS_PASSWORD', null),
+            'port' => env('REDIS_PORT', 6379),
+            'database' => 0,
+        ],
+
+    ],
+
+];

+ 68 - 0
config/filesystems.php

@@ -0,0 +1,68 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Filesystem Disk
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default filesystem disk that should be used
+    | by the framework. The "local" disk, as well as a variety of cloud
+    | based disks are available to your application. Just store away!
+    |
+    */
+
+    'default' => env('FILESYSTEM_DRIVER', 'local'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Cloud Filesystem Disk
+    |--------------------------------------------------------------------------
+    |
+    | Many applications store files both locally and in the cloud. For this
+    | reason, you may specify a default "cloud" driver here. This driver
+    | will be bound as the Cloud disk implementation in the container.
+    |
+    */
+
+    'cloud' => env('FILESYSTEM_CLOUD', 's3'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Filesystem Disks
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure as many filesystem "disks" as you wish, and you
+    | may even configure multiple disks of the same driver. Defaults have
+    | been setup for each driver as an example of the required options.
+    |
+    | Supported Drivers: "local", "ftp", "s3", "rackspace"
+    |
+    */
+
+    'disks' => [
+
+        'local' => [
+            'driver' => 'local',
+            'root' => storage_path('app'),
+        ],
+
+        'public' => [
+            'driver' => 'local',
+            'root' => storage_path('app/public'),
+            'url' => env('APP_URL').'/storage',
+            'visibility' => 'public',
+        ],
+
+        's3' => [
+            'driver' => 's3',
+            'key' => env('AWS_KEY'),
+            'secret' => env('AWS_SECRET'),
+            'region' => env('AWS_REGION'),
+            'bucket' => env('AWS_BUCKET'),
+        ],
+
+    ],
+
+];

+ 123 - 0
config/mail.php

@@ -0,0 +1,123 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Mail Driver
+    |--------------------------------------------------------------------------
+    |
+    | Laravel supports both SMTP and PHP's "mail" function as drivers for the
+    | sending of e-mail. You may specify which one you're using throughout
+    | your application here. By default, Laravel is setup for SMTP mail.
+    |
+    | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses",
+    |            "sparkpost", "log", "array"
+    |
+    */
+
+    'driver' => env('MAIL_DRIVER', 'smtp'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | SMTP Host Address
+    |--------------------------------------------------------------------------
+    |
+    | Here you may provide the host address of the SMTP server used by your
+    | applications. A default option is provided that is compatible with
+    | the Mailgun mail service which will provide reliable deliveries.
+    |
+    */
+
+    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | SMTP Host Port
+    |--------------------------------------------------------------------------
+    |
+    | This is the SMTP port used by your application to deliver e-mails to
+    | users of the application. Like the host we have set this value to
+    | stay compatible with the Mailgun e-mail application by default.
+    |
+    */
+
+    'port' => env('MAIL_PORT', 587),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Global "From" Address
+    |--------------------------------------------------------------------------
+    |
+    | You may wish for all e-mails sent by your application to be sent from
+    | the same address. Here, you may specify a name and address that is
+    | used globally for all e-mails that are sent by your application.
+    |
+    */
+
+    'from' => [
+        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
+        'name' => env('MAIL_FROM_NAME', 'Example'),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | E-Mail Encryption Protocol
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the encryption protocol that should be used when
+    | the application send e-mail messages. A sensible default using the
+    | transport layer security protocol should provide great security.
+    |
+    */
+
+    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | SMTP Server Username
+    |--------------------------------------------------------------------------
+    |
+    | If your SMTP server requires a username for authentication, you should
+    | set it here. This will get used to authenticate with your server on
+    | connection. You may also set the "password" value below this one.
+    |
+    */
+
+    'username' => env('MAIL_USERNAME'),
+
+    'password' => env('MAIL_PASSWORD'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Sendmail System Path
+    |--------------------------------------------------------------------------
+    |
+    | When using the "sendmail" driver to send e-mails, we will need to know
+    | the path to where Sendmail lives on this server. A default path has
+    | been provided here, which will work well on most of your systems.
+    |
+    */
+
+    'sendmail' => '/usr/sbin/sendmail -bs',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Markdown Mail Settings
+    |--------------------------------------------------------------------------
+    |
+    | If you are using Markdown based email rendering, you may configure your
+    | theme and component paths here, allowing you to customize the design
+    | of the emails. Or, you may simply stick with the Laravel defaults!
+    |
+    */
+
+    'markdown' => [
+        'theme' => 'default',
+
+        'paths' => [
+            resource_path('views/vendor/mail'),
+        ],
+    ],
+
+];

+ 85 - 0
config/queue.php

@@ -0,0 +1,85 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Queue Driver
+    |--------------------------------------------------------------------------
+    |
+    | Laravel's queue API supports an assortment of back-ends via a single
+    | API, giving you convenient access to each back-end using the same
+    | syntax for each one. Here you may set the default queue driver.
+    |
+    | Supported: "sync", "database", "beanstalkd", "sqs", "redis", "null"
+    |
+    */
+
+    'default' => env('QUEUE_DRIVER', 'sync'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Queue Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the connection information for each server that
+    | is used by your application. A default configuration has been added
+    | for each back-end shipped with Laravel. You are free to add more.
+    |
+    */
+
+    'connections' => [
+
+        'sync' => [
+            'driver' => 'sync',
+        ],
+
+        'database' => [
+            'driver' => 'database',
+            'table' => 'jobs',
+            'queue' => 'default',
+            'retry_after' => 90,
+        ],
+
+        'beanstalkd' => [
+            'driver' => 'beanstalkd',
+            'host' => 'localhost',
+            'queue' => 'default',
+            'retry_after' => 90,
+        ],
+
+        'sqs' => [
+            'driver' => 'sqs',
+            'key' => 'your-public-key',
+            'secret' => 'your-secret-key',
+            'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
+            'queue' => 'your-queue-name',
+            'region' => 'us-east-1',
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+            'queue' => 'default',
+            'retry_after' => 90,
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Failed Queue Jobs
+    |--------------------------------------------------------------------------
+    |
+    | These options configure the behavior of failed queue job logging so you
+    | can control which database and table are used to store the jobs that
+    | have failed. You may change them to any database / table you wish.
+    |
+    */
+
+    'failed' => [
+        'database' => env('DB_CONNECTION', 'mysql'),
+        'table' => 'failed_jobs',
+    ],
+
+];

+ 38 - 0
config/services.php

@@ -0,0 +1,38 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Third Party Services
+    |--------------------------------------------------------------------------
+    |
+    | This file is for storing the credentials for third party services such
+    | as Stripe, Mailgun, SparkPost and others. This file provides a sane
+    | default location for this type of information, allowing packages
+    | to have a conventional place to find your various credentials.
+    |
+    */
+
+    'mailgun' => [
+        'domain' => env('MAILGUN_DOMAIN'),
+        'secret' => env('MAILGUN_SECRET'),
+    ],
+
+    'ses' => [
+        'key' => env('SES_KEY'),
+        'secret' => env('SES_SECRET'),
+        'region' => 'us-east-1',
+    ],
+
+    'sparkpost' => [
+        'secret' => env('SPARKPOST_SECRET'),
+    ],
+
+    'stripe' => [
+        'model' => App\User::class,
+        'key' => env('STRIPE_KEY'),
+        'secret' => env('STRIPE_SECRET'),
+    ],
+
+];

+ 179 - 0
config/session.php

@@ -0,0 +1,179 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Session Driver
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default session "driver" that will be used on
+    | requests. By default, we will use the lightweight native driver but
+    | you may specify any of the other wonderful drivers provided here.
+    |
+    | Supported: "file", "cookie", "database", "apc",
+    |            "memcached", "redis", "array"
+    |
+    */
+
+    'driver' => env('SESSION_DRIVER', 'file'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Lifetime
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the number of minutes that you wish the session
+    | to be allowed to remain idle before it expires. If you want them
+    | to immediately expire on the browser closing, set that option.
+    |
+    */
+
+    'lifetime' => 120,
+
+    'expire_on_close' => false,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Encryption
+    |--------------------------------------------------------------------------
+    |
+    | This option allows you to easily specify that all of your session data
+    | should be encrypted before it is stored. All encryption will be run
+    | automatically by Laravel and you can use the Session like normal.
+    |
+    */
+
+    'encrypt' => false,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session File Location
+    |--------------------------------------------------------------------------
+    |
+    | When using the native session driver, we need a location where session
+    | files may be stored. A default has been set for you but a different
+    | location may be specified. This is only needed for file sessions.
+    |
+    */
+
+    'files' => storage_path('framework/sessions'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Database Connection
+    |--------------------------------------------------------------------------
+    |
+    | When using the "database" or "redis" session drivers, you may specify a
+    | connection that should be used to manage these sessions. This should
+    | correspond to a connection in your database configuration options.
+    |
+    */
+
+    'connection' => null,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Database Table
+    |--------------------------------------------------------------------------
+    |
+    | When using the "database" session driver, you may specify the table we
+    | should use to manage the sessions. Of course, a sensible default is
+    | provided for you; however, you are free to change this as needed.
+    |
+    */
+
+    'table' => 'sessions',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cache Store
+    |--------------------------------------------------------------------------
+    |
+    | When using the "apc" or "memcached" session drivers, you may specify a
+    | cache store that should be used for these sessions. This value must
+    | correspond with one of the application's configured cache stores.
+    |
+    */
+
+    'store' => null,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Sweeping Lottery
+    |--------------------------------------------------------------------------
+    |
+    | Some session drivers must manually sweep their storage location to get
+    | rid of old sessions from storage. Here are the chances that it will
+    | happen on a given request. By default, the odds are 2 out of 100.
+    |
+    */
+
+    'lottery' => [2, 100],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Name
+    |--------------------------------------------------------------------------
+    |
+    | Here you may change the name of the cookie used to identify a session
+    | instance by ID. The name specified here will get used every time a
+    | new session cookie is created by the framework for every driver.
+    |
+    */
+
+    'cookie' => 'laravel_session',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Path
+    |--------------------------------------------------------------------------
+    |
+    | The session cookie path determines the path for which the cookie will
+    | be regarded as available. Typically, this will be the root path of
+    | your application but you are free to change this when necessary.
+    |
+    */
+
+    'path' => '/',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Domain
+    |--------------------------------------------------------------------------
+    |
+    | Here you may change the domain of the cookie used to identify a session
+    | in your application. This will determine which domains the cookie is
+    | available to in your application. A sensible default has been set.
+    |
+    */
+
+    'domain' => env('SESSION_DOMAIN', null),
+
+    /*
+    |--------------------------------------------------------------------------
+    | HTTPS Only Cookies
+    |--------------------------------------------------------------------------
+    |
+    | By setting this option to true, session cookies will only be sent back
+    | to the server if the browser has a HTTPS connection. This will keep
+    | the cookie from being sent to you if it can not be done securely.
+    |
+    */
+
+    'secure' => env('SESSION_SECURE_COOKIE', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | HTTP Access Only
+    |--------------------------------------------------------------------------
+    |
+    | Setting this value to true will prevent JavaScript from accessing the
+    | value of the cookie and the cookie will only be accessible through
+    | the HTTP protocol. You are free to modify this option if needed.
+    |
+    */
+
+    'http_only' => true,
+
+];

+ 33 - 0
config/view.php

@@ -0,0 +1,33 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | View Storage Paths
+    |--------------------------------------------------------------------------
+    |
+    | Most templating systems load templates from disk. Here you may specify
+    | an array of paths that should be checked for your views. Of course
+    | the usual Laravel view path has already been registered for you.
+    |
+    */
+
+    'paths' => [
+        resource_path('views'),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Compiled View Path
+    |--------------------------------------------------------------------------
+    |
+    | This option determines where all the compiled Blade templates will be
+    | stored for your application. Typically, this is within the storage
+    | directory. However, as usual, you are free to change this value.
+    |
+    */
+
+    'compiled' => realpath(storage_path('framework/views')),
+
+];

+ 1 - 0
database/.gitignore

@@ -0,0 +1 @@
+*.sqlite

+ 24 - 0
database/factories/ModelFactory.php

@@ -0,0 +1,24 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Model Factories
+|--------------------------------------------------------------------------
+|
+| Here you may define all of your model factories. Model factories give
+| you a convenient way to create models for testing and seeding your
+| database. Just tell the factory how a default model should look.
+|
+*/
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+$factory->define(App\User::class, function (Faker\Generator $faker) {
+    static $password;
+
+    return [
+        'name' => $faker->name,
+        'email' => $faker->unique()->safeEmail,
+        'password' => $password ?: $password = bcrypt('secret'),
+        'remember_token' => str_random(10),
+    ];
+});

+ 35 - 0
database/migrations/2014_10_12_000000_create_users_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateUsersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('users', function (Blueprint $table) {
+            $table->increments('id');
+            $table->string('name');
+            $table->string('email',120)->unique();
+            $table->string('password');
+            $table->rememberToken();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('users');
+    }
+}

+ 32 - 0
database/migrations/2014_10_12_100000_create_password_resets_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreatePasswordResetsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('password_resets', function (Blueprint $table) {
+            $table->string('email')->index();
+            $table->string('token');
+            $table->timestamp('created_at')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('password_resets');
+    }
+}

+ 34 - 0
database/migrations/2017_04_29_170410_create-admin_user-table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateAdminUserTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table("admin_user",function (Blueprint $table){
+            $table->increments('id');
+            $table->string("username",32)->unique();
+            $table->string("password",128);
+            $table->integer("logtime");
+        });
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 32 - 0
database/migrations/2017_05_02_194853_create_cache_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateCacheTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('cache', function (Blueprint $table) {
+            $table->string('key')->unique();
+            $table->text('value');
+            $table->integer('expiration');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('cache');
+    }
+}

+ 16 - 0
database/seeds/DatabaseSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class DatabaseSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        // $this->call(UsersTableSeeder::class);
+    }
+}

+ 21 - 0
package.json

@@ -0,0 +1,21 @@
+{
+  "private": true,
+  "scripts": {
+    "dev": "npm run development",
+    "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+    "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+    "watch-poll": "npm run watch -- --watch-poll",
+    "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+    "prod": "npm run production",
+    "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+  },
+  "devDependencies": {
+    "axios": "^0.15.3",
+    "bootstrap-sass": "^3.3.7",
+    "cross-env": "^3.2.3",
+    "jquery": "^3.1.1",
+    "laravel-mix": "0.*",
+    "lodash": "^4.17.4",
+    "vue": "^2.1.10"
+  }
+}

+ 31 - 0
phpunit.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         bootstrap="bootstrap/autoload.php"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false">
+    <testsuites>
+        <testsuite name="Feature Tests">
+            <directory suffix="Test.php">./tests/Feature</directory>
+        </testsuite>
+
+        <testsuite name="Unit Tests">
+            <directory suffix="Test.php">./tests/Unit</directory>
+        </testsuite>
+    </testsuites>
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">./app</directory>
+        </whitelist>
+    </filter>
+    <php>
+        <env name="APP_ENV" value="testing"/>
+        <env name="CACHE_DRIVER" value="array"/>
+        <env name="SESSION_DRIVER" value="array"/>
+        <env name="QUEUE_DRIVER" value="sync"/>
+    </php>
+</phpunit>

+ 20 - 0
public/.htaccess

@@ -0,0 +1,20 @@
+<IfModule mod_rewrite.c>
+    <IfModule mod_negotiation.c>
+        Options -MultiViews
+    </IfModule>
+
+    RewriteEngine On
+
+    # Redirect Trailing Slashes If Not A Folder...
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteRule ^(.*)/$ /$1 [L,R=301]
+
+    # Handle Front Controller...
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule ^ index.php [L]
+
+    # Handle Authorization Header
+    RewriteCond %{HTTP:Authorization} .
+    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+</IfModule>

File diff suppressed because it is too large
+ 9 - 0
public/assets/js/libs/Chart.min.js


File diff suppressed because it is too large
+ 5 - 0
public/assets/js/libs/bootstrap.min.js


File diff suppressed because it is too large
+ 1 - 0
public/assets/js/libs/jquery.min.js


File diff suppressed because it is too large
+ 1 - 0
public/assets/js/libs/pace.min.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/js/libs/tether.min.js


+ 2199 - 0
public/css/font-awesome.css

@@ -0,0 +1,2199 @@
+/*!
+ *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('../fonts/fontawesome-webfont.eot?v=4.6.3');
+  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+.fa {
+  display: inline-block;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.33333333em;
+  line-height: 0.75em;
+  vertical-align: -15%;
+}
+.fa-2x {
+  font-size: 2em;
+}
+.fa-3x {
+  font-size: 3em;
+}
+.fa-4x {
+  font-size: 4em;
+}
+.fa-5x {
+  font-size: 5em;
+}
+.fa-fw {
+  width: 1.28571429em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.14285714em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.14285714em;
+  width: 2.14285714em;
+  top: 0.14285714em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.85714286em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.fa-pull-left {
+  float: left;
+}
+.fa-pull-right {
+  float: right;
+}
+.fa.fa-pull-left {
+  margin-right: .3em;
+}
+.fa.fa-pull-right {
+  margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+  animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+  animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+  -webkit-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  filter: none;
+}
+.fa-stack {
+  position: relative;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  text-align: center;
+}
+.fa-stack-1x {
+  line-height: inherit;
+}
+.fa-stack-2x {
+  font-size: 2em;
+}
+.fa-inverse {
+  color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-glass:before {
+  content: "\f000";
+}
+.fa-music:before {
+  content: "\f001";
+}
+.fa-search:before {
+  content: "\f002";
+}
+.fa-envelope-o:before {
+  content: "\f003";
+}
+.fa-heart:before {
+  content: "\f004";
+}
+.fa-star:before {
+  content: "\f005";
+}
+.fa-star-o:before {
+  content: "\f006";
+}
+.fa-user:before {
+  content: "\f007";
+}
+.fa-film:before {
+  content: "\f008";
+}
+.fa-th-large:before {
+  content: "\f009";
+}
+.fa-th:before {
+  content: "\f00a";
+}
+.fa-th-list:before {
+  content: "\f00b";
+}
+.fa-check:before {
+  content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+  content: "\f00d";
+}
+.fa-search-plus:before {
+  content: "\f00e";
+}
+.fa-search-minus:before {
+  content: "\f010";
+}
+.fa-power-off:before {
+  content: "\f011";
+}
+.fa-signal:before {
+  content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+  content: "\f013";
+}
+.fa-trash-o:before {
+  content: "\f014";
+}
+.fa-home:before {
+  content: "\f015";
+}
+.fa-file-o:before {
+  content: "\f016";
+}
+.fa-clock-o:before {
+  content: "\f017";
+}
+.fa-road:before {
+  content: "\f018";
+}
+.fa-download:before {
+  content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+  content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+  content: "\f01b";
+}
+.fa-inbox:before {
+  content: "\f01c";
+}
+.fa-play-circle-o:before {
+  content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+  content: "\f01e";
+}
+.fa-refresh:before {
+  content: "\f021";
+}
+.fa-list-alt:before {
+  content: "\f022";
+}
+.fa-lock:before {
+  content: "\f023";
+}
+.fa-flag:before {
+  content: "\f024";
+}
+.fa-headphones:before {
+  content: "\f025";
+}
+.fa-volume-off:before {
+  content: "\f026";
+}
+.fa-volume-down:before {
+  content: "\f027";
+}
+.fa-volume-up:before {
+  content: "\f028";
+}
+.fa-qrcode:before {
+  content: "\f029";
+}
+.fa-barcode:before {
+  content: "\f02a";
+}
+.fa-tag:before {
+  content: "\f02b";
+}
+.fa-tags:before {
+  content: "\f02c";
+}
+.fa-book:before {
+  content: "\f02d";
+}
+.fa-bookmark:before {
+  content: "\f02e";
+}
+.fa-print:before {
+  content: "\f02f";
+}
+.fa-camera:before {
+  content: "\f030";
+}
+.fa-font:before {
+  content: "\f031";
+}
+.fa-bold:before {
+  content: "\f032";
+}
+.fa-italic:before {
+  content: "\f033";
+}
+.fa-text-height:before {
+  content: "\f034";
+}
+.fa-text-width:before {
+  content: "\f035";
+}
+.fa-align-left:before {
+  content: "\f036";
+}
+.fa-align-center:before {
+  content: "\f037";
+}
+.fa-align-right:before {
+  content: "\f038";
+}
+.fa-align-justify:before {
+  content: "\f039";
+}
+.fa-list:before {
+  content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+  content: "\f03b";
+}
+.fa-indent:before {
+  content: "\f03c";
+}
+.fa-video-camera:before {
+  content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+  content: "\f03e";
+}
+.fa-pencil:before {
+  content: "\f040";
+}
+.fa-map-marker:before {
+  content: "\f041";
+}
+.fa-adjust:before {
+  content: "\f042";
+}
+.fa-tint:before {
+  content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+  content: "\f044";
+}
+.fa-share-square-o:before {
+  content: "\f045";
+}
+.fa-check-square-o:before {
+  content: "\f046";
+}
+.fa-arrows:before {
+  content: "\f047";
+}
+.fa-step-backward:before {
+  content: "\f048";
+}
+.fa-fast-backward:before {
+  content: "\f049";
+}
+.fa-backward:before {
+  content: "\f04a";
+}
+.fa-play:before {
+  content: "\f04b";
+}
+.fa-pause:before {
+  content: "\f04c";
+}
+.fa-stop:before {
+  content: "\f04d";
+}
+.fa-forward:before {
+  content: "\f04e";
+}
+.fa-fast-forward:before {
+  content: "\f050";
+}
+.fa-step-forward:before {
+  content: "\f051";
+}
+.fa-eject:before {
+  content: "\f052";
+}
+.fa-chevron-left:before {
+  content: "\f053";
+}
+.fa-chevron-right:before {
+  content: "\f054";
+}
+.fa-plus-circle:before {
+  content: "\f055";
+}
+.fa-minus-circle:before {
+  content: "\f056";
+}
+.fa-times-circle:before {
+  content: "\f057";
+}
+.fa-check-circle:before {
+  content: "\f058";
+}
+.fa-question-circle:before {
+  content: "\f059";
+}
+.fa-info-circle:before {
+  content: "\f05a";
+}
+.fa-crosshairs:before {
+  content: "\f05b";
+}
+.fa-times-circle-o:before {
+  content: "\f05c";
+}
+.fa-check-circle-o:before {
+  content: "\f05d";
+}
+.fa-ban:before {
+  content: "\f05e";
+}
+.fa-arrow-left:before {
+  content: "\f060";
+}
+.fa-arrow-right:before {
+  content: "\f061";
+}
+.fa-arrow-up:before {
+  content: "\f062";
+}
+.fa-arrow-down:before {
+  content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+  content: "\f064";
+}
+.fa-expand:before {
+  content: "\f065";
+}
+.fa-compress:before {
+  content: "\f066";
+}
+.fa-plus:before {
+  content: "\f067";
+}
+.fa-minus:before {
+  content: "\f068";
+}
+.fa-asterisk:before {
+  content: "\f069";
+}
+.fa-exclamation-circle:before {
+  content: "\f06a";
+}
+.fa-gift:before {
+  content: "\f06b";
+}
+.fa-leaf:before {
+  content: "\f06c";
+}
+.fa-fire:before {
+  content: "\f06d";
+}
+.fa-eye:before {
+  content: "\f06e";
+}
+.fa-eye-slash:before {
+  content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+  content: "\f071";
+}
+.fa-plane:before {
+  content: "\f072";
+}
+.fa-calendar:before {
+  content: "\f073";
+}
+.fa-random:before {
+  content: "\f074";
+}
+.fa-comment:before {
+  content: "\f075";
+}
+.fa-magnet:before {
+  content: "\f076";
+}
+.fa-chevron-up:before {
+  content: "\f077";
+}
+.fa-chevron-down:before {
+  content: "\f078";
+}
+.fa-retweet:before {
+  content: "\f079";
+}
+.fa-shopping-cart:before {
+  content: "\f07a";
+}
+.fa-folder:before {
+  content: "\f07b";
+}
+.fa-folder-open:before {
+  content: "\f07c";
+}
+.fa-arrows-v:before {
+  content: "\f07d";
+}
+.fa-arrows-h:before {
+  content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+  content: "\f080";
+}
+.fa-twitter-square:before {
+  content: "\f081";
+}
+.fa-facebook-square:before {
+  content: "\f082";
+}
+.fa-camera-retro:before {
+  content: "\f083";
+}
+.fa-key:before {
+  content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+  content: "\f085";
+}
+.fa-comments:before {
+  content: "\f086";
+}
+.fa-thumbs-o-up:before {
+  content: "\f087";
+}
+.fa-thumbs-o-down:before {
+  content: "\f088";
+}
+.fa-star-half:before {
+  content: "\f089";
+}
+.fa-heart-o:before {
+  content: "\f08a";
+}
+.fa-sign-out:before {
+  content: "\f08b";
+}
+.fa-linkedin-square:before {
+  content: "\f08c";
+}
+.fa-thumb-tack:before {
+  content: "\f08d";
+}
+.fa-external-link:before {
+  content: "\f08e";
+}
+.fa-sign-in:before {
+  content: "\f090";
+}
+.fa-trophy:before {
+  content: "\f091";
+}
+.fa-github-square:before {
+  content: "\f092";
+}
+.fa-upload:before {
+  content: "\f093";
+}
+.fa-lemon-o:before {
+  content: "\f094";
+}
+.fa-phone:before {
+  content: "\f095";
+}
+.fa-square-o:before {
+  content: "\f096";
+}
+.fa-bookmark-o:before {
+  content: "\f097";
+}
+.fa-phone-square:before {
+  content: "\f098";
+}
+.fa-twitter:before {
+  content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.fa-feed:before,
+.fa-rss:before {
+  content: "\f09e";
+}
+.fa-hdd-o:before {
+  content: "\f0a0";
+}
+.fa-bullhorn:before {
+  content: "\f0a1";
+}
+.fa-bell:before {
+  content: "\f0f3";
+}
+.fa-certificate:before {
+  content: "\f0a3";
+}
+.fa-hand-o-right:before {
+  content: "\f0a4";
+}
+.fa-hand-o-left:before {
+  content: "\f0a5";
+}
+.fa-hand-o-up:before {
+  content: "\f0a6";
+}
+.fa-hand-o-down:before {
+  content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+  content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+  content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+  content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+  content: "\f0ab";
+}
+.fa-globe:before {
+  content: "\f0ac";
+}
+.fa-wrench:before {
+  content: "\f0ad";
+}
+.fa-tasks:before {
+  content: "\f0ae";
+}
+.fa-filter:before {
+  content: "\f0b0";
+}
+.fa-briefcase:before {
+  content: "\f0b1";
+}
+.fa-arrows-alt:before {
+  content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+  content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+  content: "\f0c1";
+}
+.fa-cloud:before {
+  content: "\f0c2";
+}
+.fa-flask:before {
+  content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+  content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+  content: "\f0c5";
+}
+.fa-paperclip:before {
+  content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+  content: "\f0c7";
+}
+.fa-square:before {
+  content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+  content: "\f0c9";
+}
+.fa-list-ul:before {
+  content: "\f0ca";
+}
+.fa-list-ol:before {
+  content: "\f0cb";
+}
+.fa-strikethrough:before {
+  content: "\f0cc";
+}
+.fa-underline:before {
+  content: "\f0cd";
+}
+.fa-table:before {
+  content: "\f0ce";
+}
+.fa-magic:before {
+  content: "\f0d0";
+}
+.fa-truck:before {
+  content: "\f0d1";
+}
+.fa-pinterest:before {
+  content: "\f0d2";
+}
+.fa-pinterest-square:before {
+  content: "\f0d3";
+}
+.fa-google-plus-square:before {
+  content: "\f0d4";
+}
+.fa-google-plus:before {
+  content: "\f0d5";
+}
+.fa-money:before {
+  content: "\f0d6";
+}
+.fa-caret-down:before {
+  content: "\f0d7";
+}
+.fa-caret-up:before {
+  content: "\f0d8";
+}
+.fa-caret-left:before {
+  content: "\f0d9";
+}
+.fa-caret-right:before {
+  content: "\f0da";
+}
+.fa-columns:before {
+  content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+  content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+  content: "\f0de";
+}
+.fa-envelope:before {
+  content: "\f0e0";
+}
+.fa-linkedin:before {
+  content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+  content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+  content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+  content: "\f0e4";
+}
+.fa-comment-o:before {
+  content: "\f0e5";
+}
+.fa-comments-o:before {
+  content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+  content: "\f0e7";
+}
+.fa-sitemap:before {
+  content: "\f0e8";
+}
+.fa-umbrella:before {
+  content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+  content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+  content: "\f0eb";
+}
+.fa-exchange:before {
+  content: "\f0ec";
+}
+.fa-cloud-download:before {
+  content: "\f0ed";
+}
+.fa-cloud-upload:before {
+  content: "\f0ee";
+}
+.fa-user-md:before {
+  content: "\f0f0";
+}
+.fa-stethoscope:before {
+  content: "\f0f1";
+}
+.fa-suitcase:before {
+  content: "\f0f2";
+}
+.fa-bell-o:before {
+  content: "\f0a2";
+}
+.fa-coffee:before {
+  content: "\f0f4";
+}
+.fa-cutlery:before {
+  content: "\f0f5";
+}
+.fa-file-text-o:before {
+  content: "\f0f6";
+}
+.fa-building-o:before {
+  content: "\f0f7";
+}
+.fa-hospital-o:before {
+  content: "\f0f8";
+}
+.fa-ambulance:before {
+  content: "\f0f9";
+}
+.fa-medkit:before {
+  content: "\f0fa";
+}
+.fa-fighter-jet:before {
+  content: "\f0fb";
+}
+.fa-beer:before {
+  content: "\f0fc";
+}
+.fa-h-square:before {
+  content: "\f0fd";
+}
+.fa-plus-square:before {
+  content: "\f0fe";
+}
+.fa-angle-double-left:before {
+  content: "\f100";
+}
+.fa-angle-double-right:before {
+  content: "\f101";
+}
+.fa-angle-double-up:before {
+  content: "\f102";
+}
+.fa-angle-double-down:before {
+  content: "\f103";
+}
+.fa-angle-left:before {
+  content: "\f104";
+}
+.fa-angle-right:before {
+  content: "\f105";
+}
+.fa-angle-up:before {
+  content: "\f106";
+}
+.fa-angle-down:before {
+  content: "\f107";
+}
+.fa-desktop:before {
+  content: "\f108";
+}
+.fa-laptop:before {
+  content: "\f109";
+}
+.fa-tablet:before {
+  content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+  content: "\f10b";
+}
+.fa-circle-o:before {
+  content: "\f10c";
+}
+.fa-quote-left:before {
+  content: "\f10d";
+}
+.fa-quote-right:before {
+  content: "\f10e";
+}
+.fa-spinner:before {
+  content: "\f110";
+}
+.fa-circle:before {
+  content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+  content: "\f112";
+}
+.fa-github-alt:before {
+  content: "\f113";
+}
+.fa-folder-o:before {
+  content: "\f114";
+}
+.fa-folder-open-o:before {
+  content: "\f115";
+}
+.fa-smile-o:before {
+  content: "\f118";
+}
+.fa-frown-o:before {
+  content: "\f119";
+}
+.fa-meh-o:before {
+  content: "\f11a";
+}
+.fa-gamepad:before {
+  content: "\f11b";
+}
+.fa-keyboard-o:before {
+  content: "\f11c";
+}
+.fa-flag-o:before {
+  content: "\f11d";
+}
+.fa-flag-checkered:before {
+  content: "\f11e";
+}
+.fa-terminal:before {
+  content: "\f120";
+}
+.fa-code:before {
+  content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+  content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+  content: "\f123";
+}
+.fa-location-arrow:before {
+  content: "\f124";
+}
+.fa-crop:before {
+  content: "\f125";
+}
+.fa-code-fork:before {
+  content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+  content: "\f127";
+}
+.fa-question:before {
+  content: "\f128";
+}
+.fa-info:before {
+  content: "\f129";
+}
+.fa-exclamation:before {
+  content: "\f12a";
+}
+.fa-superscript:before {
+  content: "\f12b";
+}
+.fa-subscript:before {
+  content: "\f12c";
+}
+.fa-eraser:before {
+  content: "\f12d";
+}
+.fa-puzzle-piece:before {
+  content: "\f12e";
+}
+.fa-microphone:before {
+  content: "\f130";
+}
+.fa-microphone-slash:before {
+  content: "\f131";
+}
+.fa-shield:before {
+  content: "\f132";
+}
+.fa-calendar-o:before {
+  content: "\f133";
+}
+.fa-fire-extinguisher:before {
+  content: "\f134";
+}
+.fa-rocket:before {
+  content: "\f135";
+}
+.fa-maxcdn:before {
+  content: "\f136";
+}
+.fa-chevron-circle-left:before {
+  content: "\f137";
+}
+.fa-chevron-circle-right:before {
+  content: "\f138";
+}
+.fa-chevron-circle-up:before {
+  content: "\f139";
+}
+.fa-chevron-circle-down:before {
+  content: "\f13a";
+}
+.fa-html5:before {
+  content: "\f13b";
+}
+.fa-css3:before {
+  content: "\f13c";
+}
+.fa-anchor:before {
+  content: "\f13d";
+}
+.fa-unlock-alt:before {
+  content: "\f13e";
+}
+.fa-bullseye:before {
+  content: "\f140";
+}
+.fa-ellipsis-h:before {
+  content: "\f141";
+}
+.fa-ellipsis-v:before {
+  content: "\f142";
+}
+.fa-rss-square:before {
+  content: "\f143";
+}
+.fa-play-circle:before {
+  content: "\f144";
+}
+.fa-ticket:before {
+  content: "\f145";
+}
+.fa-minus-square:before {
+  content: "\f146";
+}
+.fa-minus-square-o:before {
+  content: "\f147";
+}
+.fa-level-up:before {
+  content: "\f148";
+}
+.fa-level-down:before {
+  content: "\f149";
+}
+.fa-check-square:before {
+  content: "\f14a";
+}
+.fa-pencil-square:before {
+  content: "\f14b";
+}
+.fa-external-link-square:before {
+  content: "\f14c";
+}
+.fa-share-square:before {
+  content: "\f14d";
+}
+.fa-compass:before {
+  content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+  content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+  content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+  content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+  content: "\f153";
+}
+.fa-gbp:before {
+  content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+  content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+  content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+  content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+  content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+  content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+  content: "\f15a";
+}
+.fa-file:before {
+  content: "\f15b";
+}
+.fa-file-text:before {
+  content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+  content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+  content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+  content: "\f160";
+}
+.fa-sort-amount-desc:before {
+  content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+  content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+  content: "\f163";
+}
+.fa-thumbs-up:before {
+  content: "\f164";
+}
+.fa-thumbs-down:before {
+  content: "\f165";
+}
+.fa-youtube-square:before {
+  content: "\f166";
+}
+.fa-youtube:before {
+  content: "\f167";
+}
+.fa-xing:before {
+  content: "\f168";
+}
+.fa-xing-square:before {
+  content: "\f169";
+}
+.fa-youtube-play:before {
+  content: "\f16a";
+}
+.fa-dropbox:before {
+  content: "\f16b";
+}
+.fa-stack-overflow:before {
+  content: "\f16c";
+}
+.fa-instagram:before {
+  content: "\f16d";
+}
+.fa-flickr:before {
+  content: "\f16e";
+}
+.fa-adn:before {
+  content: "\f170";
+}
+.fa-bitbucket:before {
+  content: "\f171";
+}
+.fa-bitbucket-square:before {
+  content: "\f172";
+}
+.fa-tumblr:before {
+  content: "\f173";
+}
+.fa-tumblr-square:before {
+  content: "\f174";
+}
+.fa-long-arrow-down:before {
+  content: "\f175";
+}
+.fa-long-arrow-up:before {
+  content: "\f176";
+}
+.fa-long-arrow-left:before {
+  content: "\f177";
+}
+.fa-long-arrow-right:before {
+  content: "\f178";
+}
+.fa-apple:before {
+  content: "\f179";
+}
+.fa-windows:before {
+  content: "\f17a";
+}
+.fa-android:before {
+  content: "\f17b";
+}
+.fa-linux:before {
+  content: "\f17c";
+}
+.fa-dribbble:before {
+  content: "\f17d";
+}
+.fa-skype:before {
+  content: "\f17e";
+}
+.fa-foursquare:before {
+  content: "\f180";
+}
+.fa-trello:before {
+  content: "\f181";
+}
+.fa-female:before {
+  content: "\f182";
+}
+.fa-male:before {
+  content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+  content: "\f184";
+}
+.fa-sun-o:before {
+  content: "\f185";
+}
+.fa-moon-o:before {
+  content: "\f186";
+}
+.fa-archive:before {
+  content: "\f187";
+}
+.fa-bug:before {
+  content: "\f188";
+}
+.fa-vk:before {
+  content: "\f189";
+}
+.fa-weibo:before {
+  content: "\f18a";
+}
+.fa-renren:before {
+  content: "\f18b";
+}
+.fa-pagelines:before {
+  content: "\f18c";
+}
+.fa-stack-exchange:before {
+  content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+  content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+  content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+  content: "\f191";
+}
+.fa-dot-circle-o:before {
+  content: "\f192";
+}
+.fa-wheelchair:before {
+  content: "\f193";
+}
+.fa-vimeo-square:before {
+  content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+  content: "\f195";
+}
+.fa-plus-square-o:before {
+  content: "\f196";
+}
+.fa-space-shuttle:before {
+  content: "\f197";
+}
+.fa-slack:before {
+  content: "\f198";
+}
+.fa-envelope-square:before {
+  content: "\f199";
+}
+.fa-wordpress:before {
+  content: "\f19a";
+}
+.fa-openid:before {
+  content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+  content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+  content: "\f19d";
+}
+.fa-yahoo:before {
+  content: "\f19e";
+}
+.fa-google:before {
+  content: "\f1a0";
+}
+.fa-reddit:before {
+  content: "\f1a1";
+}
+.fa-reddit-square:before {
+  content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+  content: "\f1a3";
+}
+.fa-stumbleupon:before {
+  content: "\f1a4";
+}
+.fa-delicious:before {
+  content: "\f1a5";
+}
+.fa-digg:before {
+  content: "\f1a6";
+}
+.fa-pied-piper-pp:before {
+  content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+  content: "\f1a8";
+}
+.fa-drupal:before {
+  content: "\f1a9";
+}
+.fa-joomla:before {
+  content: "\f1aa";
+}
+.fa-language:before {
+  content: "\f1ab";
+}
+.fa-fax:before {
+  content: "\f1ac";
+}
+.fa-building:before {
+  content: "\f1ad";
+}
+.fa-child:before {
+  content: "\f1ae";
+}
+.fa-paw:before {
+  content: "\f1b0";
+}
+.fa-spoon:before {
+  content: "\f1b1";
+}
+.fa-cube:before {
+  content: "\f1b2";
+}
+.fa-cubes:before {
+  content: "\f1b3";
+}
+.fa-behance:before {
+  content: "\f1b4";
+}
+.fa-behance-square:before {
+  content: "\f1b5";
+}
+.fa-steam:before {
+  content: "\f1b6";
+}
+.fa-steam-square:before {
+  content: "\f1b7";
+}
+.fa-recycle:before {
+  content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+  content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+  content: "\f1ba";
+}
+.fa-tree:before {
+  content: "\f1bb";
+}
+.fa-spotify:before {
+  content: "\f1bc";
+}
+.fa-deviantart:before {
+  content: "\f1bd";
+}
+.fa-soundcloud:before {
+  content: "\f1be";
+}
+.fa-database:before {
+  content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+  content: "\f1c1";
+}
+.fa-file-word-o:before {
+  content: "\f1c2";
+}
+.fa-file-excel-o:before {
+  content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+  content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+  content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+  content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+  content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+  content: "\f1c8";
+}
+.fa-file-code-o:before {
+  content: "\f1c9";
+}
+.fa-vine:before {
+  content: "\f1ca";
+}
+.fa-codepen:before {
+  content: "\f1cb";
+}
+.fa-jsfiddle:before {
+  content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+  content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+  content: "\f1ce";
+}
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+  content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+  content: "\f1d1";
+}
+.fa-git-square:before {
+  content: "\f1d2";
+}
+.fa-git:before {
+  content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+  content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+  content: "\f1d5";
+}
+.fa-qq:before {
+  content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+  content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+  content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+  content: "\f1d9";
+}
+.fa-history:before {
+  content: "\f1da";
+}
+.fa-circle-thin:before {
+  content: "\f1db";
+}
+.fa-header:before {
+  content: "\f1dc";
+}
+.fa-paragraph:before {
+  content: "\f1dd";
+}
+.fa-sliders:before {
+  content: "\f1de";
+}
+.fa-share-alt:before {
+  content: "\f1e0";
+}
+.fa-share-alt-square:before {
+  content: "\f1e1";
+}
+.fa-bomb:before {
+  content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+  content: "\f1e3";
+}
+.fa-tty:before {
+  content: "\f1e4";
+}
+.fa-binoculars:before {
+  content: "\f1e5";
+}
+.fa-plug:before {
+  content: "\f1e6";
+}
+.fa-slideshare:before {
+  content: "\f1e7";
+}
+.fa-twitch:before {
+  content: "\f1e8";
+}
+.fa-yelp:before {
+  content: "\f1e9";
+}
+.fa-newspaper-o:before {
+  content: "\f1ea";
+}
+.fa-wifi:before {
+  content: "\f1eb";
+}
+.fa-calculator:before {
+  content: "\f1ec";
+}
+.fa-paypal:before {
+  content: "\f1ed";
+}
+.fa-google-wallet:before {
+  content: "\f1ee";
+}
+.fa-cc-visa:before {
+  content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+  content: "\f1f1";
+}
+.fa-cc-discover:before {
+  content: "\f1f2";
+}
+.fa-cc-amex:before {
+  content: "\f1f3";
+}
+.fa-cc-paypal:before {
+  content: "\f1f4";
+}
+.fa-cc-stripe:before {
+  content: "\f1f5";
+}
+.fa-bell-slash:before {
+  content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+  content: "\f1f7";
+}
+.fa-trash:before {
+  content: "\f1f8";
+}
+.fa-copyright:before {
+  content: "\f1f9";
+}
+.fa-at:before {
+  content: "\f1fa";
+}
+.fa-eyedropper:before {
+  content: "\f1fb";
+}
+.fa-paint-brush:before {
+  content: "\f1fc";
+}
+.fa-birthday-cake:before {
+  content: "\f1fd";
+}
+.fa-area-chart:before {
+  content: "\f1fe";
+}
+.fa-pie-chart:before {
+  content: "\f200";
+}
+.fa-line-chart:before {
+  content: "\f201";
+}
+.fa-lastfm:before {
+  content: "\f202";
+}
+.fa-lastfm-square:before {
+  content: "\f203";
+}
+.fa-toggle-off:before {
+  content: "\f204";
+}
+.fa-toggle-on:before {
+  content: "\f205";
+}
+.fa-bicycle:before {
+  content: "\f206";
+}
+.fa-bus:before {
+  content: "\f207";
+}
+.fa-ioxhost:before {
+  content: "\f208";
+}
+.fa-angellist:before {
+  content: "\f209";
+}
+.fa-cc:before {
+  content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+  content: "\f20b";
+}
+.fa-meanpath:before {
+  content: "\f20c";
+}
+.fa-buysellads:before {
+  content: "\f20d";
+}
+.fa-connectdevelop:before {
+  content: "\f20e";
+}
+.fa-dashcube:before {
+  content: "\f210";
+}
+.fa-forumbee:before {
+  content: "\f211";
+}
+.fa-leanpub:before {
+  content: "\f212";
+}
+.fa-sellsy:before {
+  content: "\f213";
+}
+.fa-shirtsinbulk:before {
+  content: "\f214";
+}
+.fa-simplybuilt:before {
+  content: "\f215";
+}
+.fa-skyatlas:before {
+  content: "\f216";
+}
+.fa-cart-plus:before {
+  content: "\f217";
+}
+.fa-cart-arrow-down:before {
+  content: "\f218";
+}
+.fa-diamond:before {
+  content: "\f219";
+}
+.fa-ship:before {
+  content: "\f21a";
+}
+.fa-user-secret:before {
+  content: "\f21b";
+}
+.fa-motorcycle:before {
+  content: "\f21c";
+}
+.fa-street-view:before {
+  content: "\f21d";
+}
+.fa-heartbeat:before {
+  content: "\f21e";
+}
+.fa-venus:before {
+  content: "\f221";
+}
+.fa-mars:before {
+  content: "\f222";
+}
+.fa-mercury:before {
+  content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+  content: "\f224";
+}
+.fa-transgender-alt:before {
+  content: "\f225";
+}
+.fa-venus-double:before {
+  content: "\f226";
+}
+.fa-mars-double:before {
+  content: "\f227";
+}
+.fa-venus-mars:before {
+  content: "\f228";
+}
+.fa-mars-stroke:before {
+  content: "\f229";
+}
+.fa-mars-stroke-v:before {
+  content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+  content: "\f22b";
+}
+.fa-neuter:before {
+  content: "\f22c";
+}
+.fa-genderless:before {
+  content: "\f22d";
+}
+.fa-facebook-official:before {
+  content: "\f230";
+}
+.fa-pinterest-p:before {
+  content: "\f231";
+}
+.fa-whatsapp:before {
+  content: "\f232";
+}
+.fa-server:before {
+  content: "\f233";
+}
+.fa-user-plus:before {
+  content: "\f234";
+}
+.fa-user-times:before {
+  content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+  content: "\f236";
+}
+.fa-viacoin:before {
+  content: "\f237";
+}
+.fa-train:before {
+  content: "\f238";
+}
+.fa-subway:before {
+  content: "\f239";
+}
+.fa-medium:before {
+  content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+  content: "\f23b";
+}
+.fa-optin-monster:before {
+  content: "\f23c";
+}
+.fa-opencart:before {
+  content: "\f23d";
+}
+.fa-expeditedssl:before {
+  content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery-full:before {
+  content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+  content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+  content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+  content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+  content: "\f244";
+}
+.fa-mouse-pointer:before {
+  content: "\f245";
+}
+.fa-i-cursor:before {
+  content: "\f246";
+}
+.fa-object-group:before {
+  content: "\f247";
+}
+.fa-object-ungroup:before {
+  content: "\f248";
+}
+.fa-sticky-note:before {
+  content: "\f249";
+}
+.fa-sticky-note-o:before {
+  content: "\f24a";
+}
+.fa-cc-jcb:before {
+  content: "\f24b";
+}
+.fa-cc-diners-club:before {
+  content: "\f24c";
+}
+.fa-clone:before {
+  content: "\f24d";
+}
+.fa-balance-scale:before {
+  content: "\f24e";
+}
+.fa-hourglass-o:before {
+  content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+  content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+  content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+  content: "\f253";
+}
+.fa-hourglass:before {
+  content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+  content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+  content: "\f256";
+}
+.fa-hand-scissors-o:before {
+  content: "\f257";
+}
+.fa-hand-lizard-o:before {
+  content: "\f258";
+}
+.fa-hand-spock-o:before {
+  content: "\f259";
+}
+.fa-hand-pointer-o:before {
+  content: "\f25a";
+}
+.fa-hand-peace-o:before {
+  content: "\f25b";
+}
+.fa-trademark:before {
+  content: "\f25c";
+}
+.fa-registered:before {
+  content: "\f25d";
+}
+.fa-creative-commons:before {
+  content: "\f25e";
+}
+.fa-gg:before {
+  content: "\f260";
+}
+.fa-gg-circle:before {
+  content: "\f261";
+}
+.fa-tripadvisor:before {
+  content: "\f262";
+}
+.fa-odnoklassniki:before {
+  content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+  content: "\f264";
+}
+.fa-get-pocket:before {
+  content: "\f265";
+}
+.fa-wikipedia-w:before {
+  content: "\f266";
+}
+.fa-safari:before {
+  content: "\f267";
+}
+.fa-chrome:before {
+  content: "\f268";
+}
+.fa-firefox:before {
+  content: "\f269";
+}
+.fa-opera:before {
+  content: "\f26a";
+}
+.fa-internet-explorer:before {
+  content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+  content: "\f26c";
+}
+.fa-contao:before {
+  content: "\f26d";
+}
+.fa-500px:before {
+  content: "\f26e";
+}
+.fa-amazon:before {
+  content: "\f270";
+}
+.fa-calendar-plus-o:before {
+  content: "\f271";
+}
+.fa-calendar-minus-o:before {
+  content: "\f272";
+}
+.fa-calendar-times-o:before {
+  content: "\f273";
+}
+.fa-calendar-check-o:before {
+  content: "\f274";
+}
+.fa-industry:before {
+  content: "\f275";
+}
+.fa-map-pin:before {
+  content: "\f276";
+}
+.fa-map-signs:before {
+  content: "\f277";
+}
+.fa-map-o:before {
+  content: "\f278";
+}
+.fa-map:before {
+  content: "\f279";
+}
+.fa-commenting:before {
+  content: "\f27a";
+}
+.fa-commenting-o:before {
+  content: "\f27b";
+}
+.fa-houzz:before {
+  content: "\f27c";
+}
+.fa-vimeo:before {
+  content: "\f27d";
+}
+.fa-black-tie:before {
+  content: "\f27e";
+}
+.fa-fonticons:before {
+  content: "\f280";
+}
+.fa-reddit-alien:before {
+  content: "\f281";
+}
+.fa-edge:before {
+  content: "\f282";
+}
+.fa-credit-card-alt:before {
+  content: "\f283";
+}
+.fa-codiepie:before {
+  content: "\f284";
+}
+.fa-modx:before {
+  content: "\f285";
+}
+.fa-fort-awesome:before {
+  content: "\f286";
+}
+.fa-usb:before {
+  content: "\f287";
+}
+.fa-product-hunt:before {
+  content: "\f288";
+}
+.fa-mixcloud:before {
+  content: "\f289";
+}
+.fa-scribd:before {
+  content: "\f28a";
+}
+.fa-pause-circle:before {
+  content: "\f28b";
+}
+.fa-pause-circle-o:before {
+  content: "\f28c";
+}
+.fa-stop-circle:before {
+  content: "\f28d";
+}
+.fa-stop-circle-o:before {
+  content: "\f28e";
+}
+.fa-shopping-bag:before {
+  content: "\f290";
+}
+.fa-shopping-basket:before {
+  content: "\f291";
+}
+.fa-hashtag:before {
+  content: "\f292";
+}
+.fa-bluetooth:before {
+  content: "\f293";
+}
+.fa-bluetooth-b:before {
+  content: "\f294";
+}
+.fa-percent:before {
+  content: "\f295";
+}
+.fa-gitlab:before {
+  content: "\f296";
+}
+.fa-wpbeginner:before {
+  content: "\f297";
+}
+.fa-wpforms:before {
+  content: "\f298";
+}
+.fa-envira:before {
+  content: "\f299";
+}
+.fa-universal-access:before {
+  content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+  content: "\f29b";
+}
+.fa-question-circle-o:before {
+  content: "\f29c";
+}
+.fa-blind:before {
+  content: "\f29d";
+}
+.fa-audio-description:before {
+  content: "\f29e";
+}
+.fa-volume-control-phone:before {
+  content: "\f2a0";
+}
+.fa-braille:before {
+  content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+  content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+  content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+  content: "\f2a4";
+}
+.fa-glide:before {
+  content: "\f2a5";
+}
+.fa-glide-g:before {
+  content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+  content: "\f2a7";
+}
+.fa-low-vision:before {
+  content: "\f2a8";
+}
+.fa-viadeo:before {
+  content: "\f2a9";
+}
+.fa-viadeo-square:before {
+  content: "\f2aa";
+}
+.fa-snapchat:before {
+  content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+  content: "\f2ac";
+}
+.fa-snapchat-square:before {
+  content: "\f2ad";
+}
+.fa-pied-piper:before {
+  content: "\f2ae";
+}
+.fa-first-order:before {
+  content: "\f2b0";
+}
+.fa-yoast:before {
+  content: "\f2b1";
+}
+.fa-themeisle:before {
+  content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+  content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+  content: "\f2b4";
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}

File diff suppressed because it is too large
+ 2 - 0
public/css/font-awesome.css.map


File diff suppressed because it is too large
+ 3 - 0
public/css/font-awesome.min.css


+ 778 - 0
public/css/simple-line-icons.css

@@ -0,0 +1,778 @@
+@font-face {
+  font-family: 'simple-line-icons';
+  src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0');
+  src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0#iefix') format('embedded-opentype'), url('../fonts/Simple-Line-Icons.woff2?v=2.4.0') format('woff2'), url('../fonts/Simple-Line-Icons.ttf?v=2.4.0') format('truetype'), url('../fonts/Simple-Line-Icons.woff?v=2.4.0') format('woff'), url('../fonts/Simple-Line-Icons.svg?v=2.4.0#simple-line-icons') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+/*
+ Use the following CSS code if you want to have a class per icon.
+ Instead of a list of all class selectors, you can use the generic [class*="icon-"] selector, but it's slower:
+*/
+.icon-user,
+.icon-people,
+.icon-user-female,
+.icon-user-follow,
+.icon-user-following,
+.icon-user-unfollow,
+.icon-login,
+.icon-logout,
+.icon-emotsmile,
+.icon-phone,
+.icon-call-end,
+.icon-call-in,
+.icon-call-out,
+.icon-map,
+.icon-location-pin,
+.icon-direction,
+.icon-directions,
+.icon-compass,
+.icon-layers,
+.icon-menu,
+.icon-list,
+.icon-options-vertical,
+.icon-options,
+.icon-arrow-down,
+.icon-arrow-left,
+.icon-arrow-right,
+.icon-arrow-up,
+.icon-arrow-up-circle,
+.icon-arrow-left-circle,
+.icon-arrow-right-circle,
+.icon-arrow-down-circle,
+.icon-check,
+.icon-clock,
+.icon-plus,
+.icon-minus,
+.icon-close,
+.icon-event,
+.icon-exclamation,
+.icon-organization,
+.icon-trophy,
+.icon-screen-smartphone,
+.icon-screen-desktop,
+.icon-plane,
+.icon-notebook,
+.icon-mustache,
+.icon-mouse,
+.icon-magnet,
+.icon-energy,
+.icon-disc,
+.icon-cursor,
+.icon-cursor-move,
+.icon-crop,
+.icon-chemistry,
+.icon-speedometer,
+.icon-shield,
+.icon-screen-tablet,
+.icon-magic-wand,
+.icon-hourglass,
+.icon-graduation,
+.icon-ghost,
+.icon-game-controller,
+.icon-fire,
+.icon-eyeglass,
+.icon-envelope-open,
+.icon-envelope-letter,
+.icon-bell,
+.icon-badge,
+.icon-anchor,
+.icon-wallet,
+.icon-vector,
+.icon-speech,
+.icon-puzzle,
+.icon-printer,
+.icon-present,
+.icon-playlist,
+.icon-pin,
+.icon-picture,
+.icon-handbag,
+.icon-globe-alt,
+.icon-globe,
+.icon-folder-alt,
+.icon-folder,
+.icon-film,
+.icon-feed,
+.icon-drop,
+.icon-drawer,
+.icon-docs,
+.icon-doc,
+.icon-diamond,
+.icon-cup,
+.icon-calculator,
+.icon-bubbles,
+.icon-briefcase,
+.icon-book-open,
+.icon-basket-loaded,
+.icon-basket,
+.icon-bag,
+.icon-action-undo,
+.icon-action-redo,
+.icon-wrench,
+.icon-umbrella,
+.icon-trash,
+.icon-tag,
+.icon-support,
+.icon-frame,
+.icon-size-fullscreen,
+.icon-size-actual,
+.icon-shuffle,
+.icon-share-alt,
+.icon-share,
+.icon-rocket,
+.icon-question,
+.icon-pie-chart,
+.icon-pencil,
+.icon-note,
+.icon-loop,
+.icon-home,
+.icon-grid,
+.icon-graph,
+.icon-microphone,
+.icon-music-tone-alt,
+.icon-music-tone,
+.icon-earphones-alt,
+.icon-earphones,
+.icon-equalizer,
+.icon-like,
+.icon-dislike,
+.icon-control-start,
+.icon-control-rewind,
+.icon-control-play,
+.icon-control-pause,
+.icon-control-forward,
+.icon-control-end,
+.icon-volume-1,
+.icon-volume-2,
+.icon-volume-off,
+.icon-calendar,
+.icon-bulb,
+.icon-chart,
+.icon-ban,
+.icon-bubble,
+.icon-camrecorder,
+.icon-camera,
+.icon-cloud-download,
+.icon-cloud-upload,
+.icon-envelope,
+.icon-eye,
+.icon-flag,
+.icon-heart,
+.icon-info,
+.icon-key,
+.icon-link,
+.icon-lock,
+.icon-lock-open,
+.icon-magnifier,
+.icon-magnifier-add,
+.icon-magnifier-remove,
+.icon-paper-clip,
+.icon-paper-plane,
+.icon-power,
+.icon-refresh,
+.icon-reload,
+.icon-settings,
+.icon-star,
+.icon-symbol-female,
+.icon-symbol-male,
+.icon-target,
+.icon-credit-card,
+.icon-paypal,
+.icon-social-tumblr,
+.icon-social-twitter,
+.icon-social-facebook,
+.icon-social-instagram,
+.icon-social-linkedin,
+.icon-social-pinterest,
+.icon-social-github,
+.icon-social-google,
+.icon-social-reddit,
+.icon-social-skype,
+.icon-social-dribbble,
+.icon-social-behance,
+.icon-social-foursqare,
+.icon-social-soundcloud,
+.icon-social-spotify,
+.icon-social-stumbleupon,
+.icon-social-youtube,
+.icon-social-dropbox,
+.icon-social-vkontakte,
+.icon-social-steam {
+  font-family: 'simple-line-icons';
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.icon-user:before {
+  content: "\e005";
+}
+.icon-people:before {
+  content: "\e001";
+}
+.icon-user-female:before {
+  content: "\e000";
+}
+.icon-user-follow:before {
+  content: "\e002";
+}
+.icon-user-following:before {
+  content: "\e003";
+}
+.icon-user-unfollow:before {
+  content: "\e004";
+}
+.icon-login:before {
+  content: "\e066";
+}
+.icon-logout:before {
+  content: "\e065";
+}
+.icon-emotsmile:before {
+  content: "\e021";
+}
+.icon-phone:before {
+  content: "\e600";
+}
+.icon-call-end:before {
+  content: "\e048";
+}
+.icon-call-in:before {
+  content: "\e047";
+}
+.icon-call-out:before {
+  content: "\e046";
+}
+.icon-map:before {
+  content: "\e033";
+}
+.icon-location-pin:before {
+  content: "\e096";
+}
+.icon-direction:before {
+  content: "\e042";
+}
+.icon-directions:before {
+  content: "\e041";
+}
+.icon-compass:before {
+  content: "\e045";
+}
+.icon-layers:before {
+  content: "\e034";
+}
+.icon-menu:before {
+  content: "\e601";
+}
+.icon-list:before {
+  content: "\e067";
+}
+.icon-options-vertical:before {
+  content: "\e602";
+}
+.icon-options:before {
+  content: "\e603";
+}
+.icon-arrow-down:before {
+  content: "\e604";
+}
+.icon-arrow-left:before {
+  content: "\e605";
+}
+.icon-arrow-right:before {
+  content: "\e606";
+}
+.icon-arrow-up:before {
+  content: "\e607";
+}
+.icon-arrow-up-circle:before {
+  content: "\e078";
+}
+.icon-arrow-left-circle:before {
+  content: "\e07a";
+}
+.icon-arrow-right-circle:before {
+  content: "\e079";
+}
+.icon-arrow-down-circle:before {
+  content: "\e07b";
+}
+.icon-check:before {
+  content: "\e080";
+}
+.icon-clock:before {
+  content: "\e081";
+}
+.icon-plus:before {
+  content: "\e095";
+}
+.icon-minus:before {
+  content: "\e615";
+}
+.icon-close:before {
+  content: "\e082";
+}
+.icon-event:before {
+  content: "\e619";
+}
+.icon-exclamation:before {
+  content: "\e617";
+}
+.icon-organization:before {
+  content: "\e616";
+}
+.icon-trophy:before {
+  content: "\e006";
+}
+.icon-screen-smartphone:before {
+  content: "\e010";
+}
+.icon-screen-desktop:before {
+  content: "\e011";
+}
+.icon-plane:before {
+  content: "\e012";
+}
+.icon-notebook:before {
+  content: "\e013";
+}
+.icon-mustache:before {
+  content: "\e014";
+}
+.icon-mouse:before {
+  content: "\e015";
+}
+.icon-magnet:before {
+  content: "\e016";
+}
+.icon-energy:before {
+  content: "\e020";
+}
+.icon-disc:before {
+  content: "\e022";
+}
+.icon-cursor:before {
+  content: "\e06e";
+}
+.icon-cursor-move:before {
+  content: "\e023";
+}
+.icon-crop:before {
+  content: "\e024";
+}
+.icon-chemistry:before {
+  content: "\e026";
+}
+.icon-speedometer:before {
+  content: "\e007";
+}
+.icon-shield:before {
+  content: "\e00e";
+}
+.icon-screen-tablet:before {
+  content: "\e00f";
+}
+.icon-magic-wand:before {
+  content: "\e017";
+}
+.icon-hourglass:before {
+  content: "\e018";
+}
+.icon-graduation:before {
+  content: "\e019";
+}
+.icon-ghost:before {
+  content: "\e01a";
+}
+.icon-game-controller:before {
+  content: "\e01b";
+}
+.icon-fire:before {
+  content: "\e01c";
+}
+.icon-eyeglass:before {
+  content: "\e01d";
+}
+.icon-envelope-open:before {
+  content: "\e01e";
+}
+.icon-envelope-letter:before {
+  content: "\e01f";
+}
+.icon-bell:before {
+  content: "\e027";
+}
+.icon-badge:before {
+  content: "\e028";
+}
+.icon-anchor:before {
+  content: "\e029";
+}
+.icon-wallet:before {
+  content: "\e02a";
+}
+.icon-vector:before {
+  content: "\e02b";
+}
+.icon-speech:before {
+  content: "\e02c";
+}
+.icon-puzzle:before {
+  content: "\e02d";
+}
+.icon-printer:before {
+  content: "\e02e";
+}
+.icon-present:before {
+  content: "\e02f";
+}
+.icon-playlist:before {
+  content: "\e030";
+}
+.icon-pin:before {
+  content: "\e031";
+}
+.icon-picture:before {
+  content: "\e032";
+}
+.icon-handbag:before {
+  content: "\e035";
+}
+.icon-globe-alt:before {
+  content: "\e036";
+}
+.icon-globe:before {
+  content: "\e037";
+}
+.icon-folder-alt:before {
+  content: "\e039";
+}
+.icon-folder:before {
+  content: "\e089";
+}
+.icon-film:before {
+  content: "\e03a";
+}
+.icon-feed:before {
+  content: "\e03b";
+}
+.icon-drop:before {
+  content: "\e03e";
+}
+.icon-drawer:before {
+  content: "\e03f";
+}
+.icon-docs:before {
+  content: "\e040";
+}
+.icon-doc:before {
+  content: "\e085";
+}
+.icon-diamond:before {
+  content: "\e043";
+}
+.icon-cup:before {
+  content: "\e044";
+}
+.icon-calculator:before {
+  content: "\e049";
+}
+.icon-bubbles:before {
+  content: "\e04a";
+}
+.icon-briefcase:before {
+  content: "\e04b";
+}
+.icon-book-open:before {
+  content: "\e04c";
+}
+.icon-basket-loaded:before {
+  content: "\e04d";
+}
+.icon-basket:before {
+  content: "\e04e";
+}
+.icon-bag:before {
+  content: "\e04f";
+}
+.icon-action-undo:before {
+  content: "\e050";
+}
+.icon-action-redo:before {
+  content: "\e051";
+}
+.icon-wrench:before {
+  content: "\e052";
+}
+.icon-umbrella:before {
+  content: "\e053";
+}
+.icon-trash:before {
+  content: "\e054";
+}
+.icon-tag:before {
+  content: "\e055";
+}
+.icon-support:before {
+  content: "\e056";
+}
+.icon-frame:before {
+  content: "\e038";
+}
+.icon-size-fullscreen:before {
+  content: "\e057";
+}
+.icon-size-actual:before {
+  content: "\e058";
+}
+.icon-shuffle:before {
+  content: "\e059";
+}
+.icon-share-alt:before {
+  content: "\e05a";
+}
+.icon-share:before {
+  content: "\e05b";
+}
+.icon-rocket:before {
+  content: "\e05c";
+}
+.icon-question:before {
+  content: "\e05d";
+}
+.icon-pie-chart:before {
+  content: "\e05e";
+}
+.icon-pencil:before {
+  content: "\e05f";
+}
+.icon-note:before {
+  content: "\e060";
+}
+.icon-loop:before {
+  content: "\e064";
+}
+.icon-home:before {
+  content: "\e069";
+}
+.icon-grid:before {
+  content: "\e06a";
+}
+.icon-graph:before {
+  content: "\e06b";
+}
+.icon-microphone:before {
+  content: "\e063";
+}
+.icon-music-tone-alt:before {
+  content: "\e061";
+}
+.icon-music-tone:before {
+  content: "\e062";
+}
+.icon-earphones-alt:before {
+  content: "\e03c";
+}
+.icon-earphones:before {
+  content: "\e03d";
+}
+.icon-equalizer:before {
+  content: "\e06c";
+}
+.icon-like:before {
+  content: "\e068";
+}
+.icon-dislike:before {
+  content: "\e06d";
+}
+.icon-control-start:before {
+  content: "\e06f";
+}
+.icon-control-rewind:before {
+  content: "\e070";
+}
+.icon-control-play:before {
+  content: "\e071";
+}
+.icon-control-pause:before {
+  content: "\e072";
+}
+.icon-control-forward:before {
+  content: "\e073";
+}
+.icon-control-end:before {
+  content: "\e074";
+}
+.icon-volume-1:before {
+  content: "\e09f";
+}
+.icon-volume-2:before {
+  content: "\e0a0";
+}
+.icon-volume-off:before {
+  content: "\e0a1";
+}
+.icon-calendar:before {
+  content: "\e075";
+}
+.icon-bulb:before {
+  content: "\e076";
+}
+.icon-chart:before {
+  content: "\e077";
+}
+.icon-ban:before {
+  content: "\e07c";
+}
+.icon-bubble:before {
+  content: "\e07d";
+}
+.icon-camrecorder:before {
+  content: "\e07e";
+}
+.icon-camera:before {
+  content: "\e07f";
+}
+.icon-cloud-download:before {
+  content: "\e083";
+}
+.icon-cloud-upload:before {
+  content: "\e084";
+}
+.icon-envelope:before {
+  content: "\e086";
+}
+.icon-eye:before {
+  content: "\e087";
+}
+.icon-flag:before {
+  content: "\e088";
+}
+.icon-heart:before {
+  content: "\e08a";
+}
+.icon-info:before {
+  content: "\e08b";
+}
+.icon-key:before {
+  content: "\e08c";
+}
+.icon-link:before {
+  content: "\e08d";
+}
+.icon-lock:before {
+  content: "\e08e";
+}
+.icon-lock-open:before {
+  content: "\e08f";
+}
+.icon-magnifier:before {
+  content: "\e090";
+}
+.icon-magnifier-add:before {
+  content: "\e091";
+}
+.icon-magnifier-remove:before {
+  content: "\e092";
+}
+.icon-paper-clip:before {
+  content: "\e093";
+}
+.icon-paper-plane:before {
+  content: "\e094";
+}
+.icon-power:before {
+  content: "\e097";
+}
+.icon-refresh:before {
+  content: "\e098";
+}
+.icon-reload:before {
+  content: "\e099";
+}
+.icon-settings:before {
+  content: "\e09a";
+}
+.icon-star:before {
+  content: "\e09b";
+}
+.icon-symbol-female:before {
+  content: "\e09c";
+}
+.icon-symbol-male:before {
+  content: "\e09d";
+}
+.icon-target:before {
+  content: "\e09e";
+}
+.icon-credit-card:before {
+  content: "\e025";
+}
+.icon-paypal:before {
+  content: "\e608";
+}
+.icon-social-tumblr:before {
+  content: "\e00a";
+}
+.icon-social-twitter:before {
+  content: "\e009";
+}
+.icon-social-facebook:before {
+  content: "\e00b";
+}
+.icon-social-instagram:before {
+  content: "\e609";
+}
+.icon-social-linkedin:before {
+  content: "\e60a";
+}
+.icon-social-pinterest:before {
+  content: "\e60b";
+}
+.icon-social-github:before {
+  content: "\e60c";
+}
+.icon-social-google:before {
+  content: "\e60d";
+}
+.icon-social-reddit:before {
+  content: "\e60e";
+}
+.icon-social-skype:before {
+  content: "\e60f";
+}
+.icon-social-dribbble:before {
+  content: "\e00d";
+}
+.icon-social-behance:before {
+  content: "\e610";
+}
+.icon-social-foursqare:before {
+  content: "\e611";
+}
+.icon-social-soundcloud:before {
+  content: "\e612";
+}
+.icon-social-spotify:before {
+  content: "\e613";
+}
+.icon-social-stumbleupon:before {
+  content: "\e614";
+}
+.icon-social-youtube:before {
+  content: "\e008";
+}
+.icon-social-dropbox:before {
+  content: "\e00c";
+}
+.icon-social-vkontakte:before {
+  content: "\e618";
+}
+.icon-social-steam:before {
+  content: "\e620";
+}

+ 8813 - 0
public/css/style.css

@@ -0,0 +1,8813 @@
+
+/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%; }
+
+body {
+  margin: 0; }
+
+article,
+aside,
+footer,
+header,
+nav,
+section {
+  display: block; }
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0; }
+
+figcaption,
+figure,
+main {
+  display: block; }
+
+figure {
+  margin: 1em 40px; }
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible; }
+
+pre {
+  font-family: monospace, monospace;
+  font-size: 1em; }
+
+a {
+  background-color: transparent;
+  -webkit-text-decoration-skip: objects; }
+
+a:active,
+a:hover {
+  outline-width: 0; }
+
+abbr[title] {
+  border-bottom: none;
+  text-decoration: underline;
+  text-decoration: underline dotted; }
+
+b,
+strong {
+  font-weight: inherit; }
+
+b,
+strong {
+  font-weight: bolder; }
+
+code,
+kbd,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em; }
+
+dfn {
+  font-style: italic; }
+
+mark {
+  background-color: #ff0;
+  color: #000; }
+
+small {
+  font-size: 80%; }
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline; }
+
+sub {
+  bottom: -0.25em; }
+
+sup {
+  top: -0.5em; }
+
+audio,
+video {
+  display: inline-block; }
+
+audio:not([controls]) {
+  display: none;
+  height: 0; }
+
+img {
+  border-style: none; }
+
+svg:not(:root) {
+  overflow: hidden; }
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  font-family: sans-serif;
+  font-size: 100%;
+  line-height: 1.15;
+  margin: 0; }
+
+button,
+input {
+  overflow: visible; }
+
+button,
+select {
+  text-transform: none; }
+
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button; }
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  border-style: none;
+  padding: 0; }
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+  outline: 1px dotted ButtonText; }
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em; }
+
+legend {
+  box-sizing: border-box;
+  color: inherit;
+  display: table;
+  max-width: 100%;
+  padding: 0;
+  white-space: normal; }
+
+progress {
+  display: inline-block;
+  vertical-align: baseline; }
+
+textarea {
+  overflow: auto; }
+
+[type="checkbox"],
+[type="radio"] {
+  box-sizing: border-box;
+  padding: 0; }
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto; }
+
+[type="search"] {
+  -webkit-appearance: textfield;
+  outline-offset: -2px; }
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none; }
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button;
+  font: inherit; }
+
+details,
+menu {
+  display: block; }
+
+summary {
+  display: list-item; }
+
+canvas {
+  display: inline-block; }
+
+template {
+  display: none; }
+
+[hidden] {
+  display: none; }
+.copyrights{
+	text-indent:-9999px;
+	height:0;
+	line-height:0;
+	font-size:0;
+	overflow:hidden;
+}
+@media print {
+  *,
+  *::before,
+  *::after,
+  p::first-letter,
+  div::first-letter,
+  blockquote::first-letter,
+  li::first-letter,
+  p::first-line,
+  div::first-line,
+  blockquote::first-line,
+  li::first-line {
+    text-shadow: none !important;
+    box-shadow: none !important; }
+  a,
+  a:visited {
+    text-decoration: underline; }
+  abbr[title]::after {
+    content: " (" attr(title) ")"; }
+  pre {
+    white-space: pre-wrap !important; }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid; }
+  thead {
+    display: table-header-group; }
+  tr,
+  img {
+    page-break-inside: avoid; }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3; }
+  h2,
+  h3 {
+    page-break-after: avoid; }
+  .navbar {
+    display: none; }
+  .badge {
+    border: 1px solid #000; }
+  .table {
+    border-collapse: collapse !important; }
+    .table td,
+    .table th {
+      background-color: #fff !important; }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important; } }
+
+html {
+  box-sizing: border-box; }
+
+*,
+*::before,
+*::after {
+  box-sizing: inherit; }
+
+@-ms-viewport {
+  width: device-width; }
+
+html {
+  -ms-overflow-style: scrollbar;
+  -webkit-tap-highlight-color: transparent; }
+
+body {
+  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+  font-size: 0.875rem;
+  font-weight: normal;
+  line-height: 1.5;
+  color: #263238;
+  background-color: #e4e5e6; }
+
+[tabindex="-1"]:focus {
+  outline: none !important; }
+
+h1, h2, h3, h4, h5, h6 {
+  margin-top: 0;
+  margin-bottom: .5rem; }
+
+p {
+  margin-top: 0;
+  margin-bottom: 1rem; }
+
+abbr[title],
+abbr[data-original-title] {
+  cursor: help; }
+
+address {
+  margin-bottom: 1rem;
+  font-style: normal;
+  line-height: inherit; }
+
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1rem; }
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0; }
+
+dt {
+  font-weight: bold; }
+
+dd {
+  margin-bottom: .5rem;
+  margin-left: 0; }
+
+blockquote {
+  margin: 0 0 1rem; }
+
+a {
+  color: #20a8d8;
+  text-decoration: none; }
+  a:focus, a:hover {
+    color: #167495;
+    text-decoration: underline; }
+
+a:not([href]):not([tabindex]) {
+  color: inherit;
+  text-decoration: none; }
+  a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
+    color: inherit;
+    text-decoration: none; }
+  a:not([href]):not([tabindex]):focus {
+    outline: 0; }
+
+pre {
+  margin-top: 0;
+  margin-bottom: 1rem;
+  overflow: auto; }
+
+figure {
+  margin: 0 0 1rem; }
+
+img {
+  vertical-align: middle; }
+
+[role="button"] {
+  cursor: pointer; }
+
+a,
+area,
+button,
+[role="button"],
+input,
+label,
+select,
+summary,
+textarea {
+  touch-action: manipulation; }
+
+table {
+  border-collapse: collapse;
+  background-color: transparent; }
+
+caption {
+  padding-top: 0.75rem;
+  padding-bottom: 0.75rem;
+  color: #b0bec5;
+  text-align: left;
+  caption-side: bottom; }
+
+th {
+  text-align: left; }
+
+label {
+  display: inline-block;
+  margin-bottom: .5rem; }
+
+button:focus {
+  outline: 1px dotted;
+  outline: 5px auto -webkit-focus-ring-color; }
+
+input,
+button,
+select,
+textarea {
+  line-height: inherit; }
+
+input[type="radio"]:disabled,
+input[type="checkbox"]:disabled {
+  cursor: not-allowed; }
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  -webkit-appearance: listbox; }
+
+textarea {
+  resize: vertical; }
+
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0; }
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: .5rem;
+  font-size: 1.5rem;
+  line-height: inherit; }
+
+input[type="search"] {
+  -webkit-appearance: none; }
+
+output {
+  display: inline-block; }
+
+[hidden] {
+  display: none !important; }
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+  margin-bottom: 0.5rem;
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit; }
+
+h1, .h1 {
+  font-size: 2.5rem; }
+
+h2, .h2 {
+  font-size: 2rem; }
+
+h3, .h3 {
+  font-size: 1.75rem; }
+
+h4, .h4 {
+  font-size: 1.5rem; }
+
+h5, .h5 {
+  font-size: 1.25rem; }
+
+h6, .h6 {
+  font-size: 1rem; }
+
+.lead {
+  font-size: 1.25rem;
+  font-weight: 300; }
+
+.display-1 {
+  font-size: 6rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+.display-2 {
+  font-size: 5.5rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+.display-3 {
+  font-size: 4.5rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+.display-4 {
+  font-size: 3.5rem;
+  font-weight: 300;
+  line-height: 1.1; }
+
+hr {
+  margin-top: 1rem;
+  margin-bottom: 1rem;
+  border: 0;
+  border-top: 1px solid rgba(0, 0, 0, 0.1); }
+
+small,
+.small {
+  font-size: 80%;
+  font-weight: normal; }
+
+mark,
+.mark {
+  padding: 0.2em;
+  background-color: #fcf8e3; }
+
+.list-unstyled {
+  padding-left: 0;
+  list-style: none; }
+
+.list-inline {
+  padding-left: 0;
+  list-style: none; }
+
+.list-inline-item {
+  display: inline-block; }
+  .list-inline-item:not(:last-child) {
+    margin-right: 5px; }
+
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase; }
+
+.blockquote {
+  padding: 0.5rem 1rem;
+  margin-bottom: 1rem;
+  font-size: 1.09375rem;
+  border-left: 0.25rem solid #cfd8dc; }
+
+.blockquote-footer {
+  display: block;
+  font-size: 80%;
+  color: #b0bec5; }
+  .blockquote-footer::before {
+    content: "\2014 \00A0"; }
+
+.blockquote-reverse {
+  padding-right: 1rem;
+  padding-left: 0;
+  text-align: right;
+  border-right: 0.25rem solid #cfd8dc;
+  border-left: 0; }
+
+.blockquote-reverse .blockquote-footer::before {
+  content: ""; }
+
+.blockquote-reverse .blockquote-footer::after {
+  content: "\00A0 \2014"; }
+
+.img-fluid {
+  max-width: 100%;
+  height: auto; }
+
+.img-thumbnail {
+  padding: 0.25rem;
+  background-color: #e4e5e6;
+  border: 1px solid #ddd;
+  transition: all 0.2s ease-in-out;
+  max-width: 100%;
+  height: auto; }
+
+.figure {
+  display: inline-block; }
+
+.figure-img {
+  margin-bottom: 0.5rem;
+  line-height: 1; }
+
+.figure-caption {
+  font-size: 90%;
+  color: #b0bec5; }
+
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
+
+code {
+  padding: 0.2rem 0.4rem;
+  font-size: 90%;
+  color: #bd4147;
+  background-color: #eceff1; }
+  a > code {
+    padding: 0;
+    color: inherit;
+    background-color: inherit; }
+
+kbd {
+  padding: 0.2rem 0.4rem;
+  font-size: 90%;
+  color: #fff;
+  background-color: #263238; }
+  kbd kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: bold; }
+
+pre {
+  display: block;
+  margin-top: 0;
+  margin-bottom: 1rem;
+  font-size: 90%;
+  color: #263238; }
+  pre code {
+    padding: 0;
+    font-size: inherit;
+    color: inherit;
+    background-color: transparent;
+    border-radius: 0; }
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll; }
+
+.container {
+  position: relative;
+  margin-left: auto;
+  margin-right: auto;
+  padding-right: 15px;
+  padding-left: 15px; }
+  @media (min-width: 576px) {
+    .container {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 768px) {
+    .container {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 992px) {
+    .container {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 1200px) {
+    .container {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 576px) {
+    .container {
+      width: 540px;
+      max-width: 100%; } }
+  @media (min-width: 768px) {
+    .container {
+      width: 720px;
+      max-width: 100%; } }
+  @media (min-width: 992px) {
+    .container {
+      width: 960px;
+      max-width: 100%; } }
+  @media (min-width: 1200px) {
+    .container {
+      width: 1140px;
+      max-width: 100%; } }
+
+.container-fluid {
+  position: relative;
+  margin-left: auto;
+  margin-right: auto;
+  padding-right: 15px;
+  padding-left: 15px; }
+  @media (min-width: 576px) {
+    .container-fluid {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 768px) {
+    .container-fluid {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 992px) {
+    .container-fluid {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 1200px) {
+    .container-fluid {
+      padding-right: 15px;
+      padding-left: 15px; } }
+
+.row {
+  display: flex;
+  flex-wrap: wrap;
+  margin-right: -15px;
+  margin-left: -15px; }
+  @media (min-width: 576px) {
+    .row {
+      margin-right: -15px;
+      margin-left: -15px; } }
+  @media (min-width: 768px) {
+    .row {
+      margin-right: -15px;
+      margin-left: -15px; } }
+  @media (min-width: 992px) {
+    .row {
+      margin-right: -15px;
+      margin-left: -15px; } }
+  @media (min-width: 1200px) {
+    .row {
+      margin-right: -15px;
+      margin-left: -15px; } }
+
+.no-gutters {
+  margin-right: 0;
+  margin-left: 0; }
+  .no-gutters > .col,
+  .no-gutters > [class*="col-"] {
+    padding-right: 0;
+    padding-left: 0; }
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+  position: relative;
+  width: 100%;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px; }
+  @media (min-width: 576px) {
+    .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 768px) {
+    .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 992px) {
+    .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+      padding-right: 15px;
+      padding-left: 15px; } }
+  @media (min-width: 1200px) {
+    .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+      padding-right: 15px;
+      padding-left: 15px; } }
+
+.col {
+  flex-basis: 0;
+  flex-grow: 1;
+  max-width: 100%; }
+
+.col-auto {
+  flex: 0 0 auto;
+  width: auto; }
+
+.col-1 {
+  flex: 0 0 8.33333%;
+  max-width: 8.33333%; }
+
+.col-2 {
+  flex: 0 0 16.66667%;
+  max-width: 16.66667%; }
+
+.col-3 {
+  flex: 0 0 25%;
+  max-width: 25%; }
+
+.col-4 {
+  flex: 0 0 33.33333%;
+  max-width: 33.33333%; }
+
+.col-5 {
+  flex: 0 0 41.66667%;
+  max-width: 41.66667%; }
+
+.col-6 {
+  flex: 0 0 50%;
+  max-width: 50%; }
+
+.col-7 {
+  flex: 0 0 58.33333%;
+  max-width: 58.33333%; }
+
+.col-8 {
+  flex: 0 0 66.66667%;
+  max-width: 66.66667%; }
+
+.col-9 {
+  flex: 0 0 75%;
+  max-width: 75%; }
+
+.col-10 {
+  flex: 0 0 83.33333%;
+  max-width: 83.33333%; }
+
+.col-11 {
+  flex: 0 0 91.66667%;
+  max-width: 91.66667%; }
+
+.col-12 {
+  flex: 0 0 100%;
+  max-width: 100%; }
+
+.pull-0 {
+  right: auto; }
+
+.pull-1 {
+  right: 8.33333%; }
+
+.pull-2 {
+  right: 16.66667%; }
+
+.pull-3 {
+  right: 25%; }
+
+.pull-4 {
+  right: 33.33333%; }
+
+.pull-5 {
+  right: 41.66667%; }
+
+.pull-6 {
+  right: 50%; }
+
+.pull-7 {
+  right: 58.33333%; }
+
+.pull-8 {
+  right: 66.66667%; }
+
+.pull-9 {
+  right: 75%; }
+
+.pull-10 {
+  right: 83.33333%; }
+
+.pull-11 {
+  right: 91.66667%; }
+
+.pull-12 {
+  right: 100%; }
+
+.push-0 {
+  left: auto; }
+
+.push-1 {
+  left: 8.33333%; }
+
+.push-2 {
+  left: 16.66667%; }
+
+.push-3 {
+  left: 25%; }
+
+.push-4 {
+  left: 33.33333%; }
+
+.push-5 {
+  left: 41.66667%; }
+
+.push-6 {
+  left: 50%; }
+
+.push-7 {
+  left: 58.33333%; }
+
+.push-8 {
+  left: 66.66667%; }
+
+.push-9 {
+  left: 75%; }
+
+.push-10 {
+  left: 83.33333%; }
+
+.push-11 {
+  left: 91.66667%; }
+
+.push-12 {
+  left: 100%; }
+
+.offset-1 {
+  margin-left: 8.33333%; }
+
+.offset-2 {
+  margin-left: 16.66667%; }
+
+.offset-3 {
+  margin-left: 25%; }
+
+.offset-4 {
+  margin-left: 33.33333%; }
+
+.offset-5 {
+  margin-left: 41.66667%; }
+
+.offset-6 {
+  margin-left: 50%; }
+
+.offset-7 {
+  margin-left: 58.33333%; }
+
+.offset-8 {
+  margin-left: 66.66667%; }
+
+.offset-9 {
+  margin-left: 75%; }
+
+.offset-10 {
+  margin-left: 83.33333%; }
+
+.offset-11 {
+  margin-left: 91.66667%; }
+
+@media (min-width: 576px) {
+  .col-sm {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-sm-auto {
+    flex: 0 0 auto;
+    width: auto; }
+  .col-sm-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-sm-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-sm-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-sm-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-sm-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-sm-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-sm-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-sm-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-sm-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-sm-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-sm-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-sm-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .pull-sm-0 {
+    right: auto; }
+  .pull-sm-1 {
+    right: 8.33333%; }
+  .pull-sm-2 {
+    right: 16.66667%; }
+  .pull-sm-3 {
+    right: 25%; }
+  .pull-sm-4 {
+    right: 33.33333%; }
+  .pull-sm-5 {
+    right: 41.66667%; }
+  .pull-sm-6 {
+    right: 50%; }
+  .pull-sm-7 {
+    right: 58.33333%; }
+  .pull-sm-8 {
+    right: 66.66667%; }
+  .pull-sm-9 {
+    right: 75%; }
+  .pull-sm-10 {
+    right: 83.33333%; }
+  .pull-sm-11 {
+    right: 91.66667%; }
+  .pull-sm-12 {
+    right: 100%; }
+  .push-sm-0 {
+    left: auto; }
+  .push-sm-1 {
+    left: 8.33333%; }
+  .push-sm-2 {
+    left: 16.66667%; }
+  .push-sm-3 {
+    left: 25%; }
+  .push-sm-4 {
+    left: 33.33333%; }
+  .push-sm-5 {
+    left: 41.66667%; }
+  .push-sm-6 {
+    left: 50%; }
+  .push-sm-7 {
+    left: 58.33333%; }
+  .push-sm-8 {
+    left: 66.66667%; }
+  .push-sm-9 {
+    left: 75%; }
+  .push-sm-10 {
+    left: 83.33333%; }
+  .push-sm-11 {
+    left: 91.66667%; }
+  .push-sm-12 {
+    left: 100%; }
+  .offset-sm-0 {
+    margin-left: 0%; }
+  .offset-sm-1 {
+    margin-left: 8.33333%; }
+  .offset-sm-2 {
+    margin-left: 16.66667%; }
+  .offset-sm-3 {
+    margin-left: 25%; }
+  .offset-sm-4 {
+    margin-left: 33.33333%; }
+  .offset-sm-5 {
+    margin-left: 41.66667%; }
+  .offset-sm-6 {
+    margin-left: 50%; }
+  .offset-sm-7 {
+    margin-left: 58.33333%; }
+  .offset-sm-8 {
+    margin-left: 66.66667%; }
+  .offset-sm-9 {
+    margin-left: 75%; }
+  .offset-sm-10 {
+    margin-left: 83.33333%; }
+  .offset-sm-11 {
+    margin-left: 91.66667%; } }
+
+@media (min-width: 768px) {
+  .col-md {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-md-auto {
+    flex: 0 0 auto;
+    width: auto; }
+  .col-md-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-md-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-md-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-md-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-md-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-md-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-md-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-md-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-md-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-md-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-md-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-md-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .pull-md-0 {
+    right: auto; }
+  .pull-md-1 {
+    right: 8.33333%; }
+  .pull-md-2 {
+    right: 16.66667%; }
+  .pull-md-3 {
+    right: 25%; }
+  .pull-md-4 {
+    right: 33.33333%; }
+  .pull-md-5 {
+    right: 41.66667%; }
+  .pull-md-6 {
+    right: 50%; }
+  .pull-md-7 {
+    right: 58.33333%; }
+  .pull-md-8 {
+    right: 66.66667%; }
+  .pull-md-9 {
+    right: 75%; }
+  .pull-md-10 {
+    right: 83.33333%; }
+  .pull-md-11 {
+    right: 91.66667%; }
+  .pull-md-12 {
+    right: 100%; }
+  .push-md-0 {
+    left: auto; }
+  .push-md-1 {
+    left: 8.33333%; }
+  .push-md-2 {
+    left: 16.66667%; }
+  .push-md-3 {
+    left: 25%; }
+  .push-md-4 {
+    left: 33.33333%; }
+  .push-md-5 {
+    left: 41.66667%; }
+  .push-md-6 {
+    left: 50%; }
+  .push-md-7 {
+    left: 58.33333%; }
+  .push-md-8 {
+    left: 66.66667%; }
+  .push-md-9 {
+    left: 75%; }
+  .push-md-10 {
+    left: 83.33333%; }
+  .push-md-11 {
+    left: 91.66667%; }
+  .push-md-12 {
+    left: 100%; }
+  .offset-md-0 {
+    margin-left: 0%; }
+  .offset-md-1 {
+    margin-left: 8.33333%; }
+  .offset-md-2 {
+    margin-left: 16.66667%; }
+  .offset-md-3 {
+    margin-left: 25%; }
+  .offset-md-4 {
+    margin-left: 33.33333%; }
+  .offset-md-5 {
+    margin-left: 41.66667%; }
+  .offset-md-6 {
+    margin-left: 50%; }
+  .offset-md-7 {
+    margin-left: 58.33333%; }
+  .offset-md-8 {
+    margin-left: 66.66667%; }
+  .offset-md-9 {
+    margin-left: 75%; }
+  .offset-md-10 {
+    margin-left: 83.33333%; }
+  .offset-md-11 {
+    margin-left: 91.66667%; } }
+
+@media (min-width: 992px) {
+  .col-lg {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-lg-auto {
+    flex: 0 0 auto;
+    width: auto; }
+  .col-lg-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-lg-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-lg-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-lg-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-lg-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-lg-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-lg-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-lg-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-lg-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-lg-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-lg-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-lg-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .pull-lg-0 {
+    right: auto; }
+  .pull-lg-1 {
+    right: 8.33333%; }
+  .pull-lg-2 {
+    right: 16.66667%; }
+  .pull-lg-3 {
+    right: 25%; }
+  .pull-lg-4 {
+    right: 33.33333%; }
+  .pull-lg-5 {
+    right: 41.66667%; }
+  .pull-lg-6 {
+    right: 50%; }
+  .pull-lg-7 {
+    right: 58.33333%; }
+  .pull-lg-8 {
+    right: 66.66667%; }
+  .pull-lg-9 {
+    right: 75%; }
+  .pull-lg-10 {
+    right: 83.33333%; }
+  .pull-lg-11 {
+    right: 91.66667%; }
+  .pull-lg-12 {
+    right: 100%; }
+  .push-lg-0 {
+    left: auto; }
+  .push-lg-1 {
+    left: 8.33333%; }
+  .push-lg-2 {
+    left: 16.66667%; }
+  .push-lg-3 {
+    left: 25%; }
+  .push-lg-4 {
+    left: 33.33333%; }
+  .push-lg-5 {
+    left: 41.66667%; }
+  .push-lg-6 {
+    left: 50%; }
+  .push-lg-7 {
+    left: 58.33333%; }
+  .push-lg-8 {
+    left: 66.66667%; }
+  .push-lg-9 {
+    left: 75%; }
+  .push-lg-10 {
+    left: 83.33333%; }
+  .push-lg-11 {
+    left: 91.66667%; }
+  .push-lg-12 {
+    left: 100%; }
+  .offset-lg-0 {
+    margin-left: 0%; }
+  .offset-lg-1 {
+    margin-left: 8.33333%; }
+  .offset-lg-2 {
+    margin-left: 16.66667%; }
+  .offset-lg-3 {
+    margin-left: 25%; }
+  .offset-lg-4 {
+    margin-left: 33.33333%; }
+  .offset-lg-5 {
+    margin-left: 41.66667%; }
+  .offset-lg-6 {
+    margin-left: 50%; }
+  .offset-lg-7 {
+    margin-left: 58.33333%; }
+  .offset-lg-8 {
+    margin-left: 66.66667%; }
+  .offset-lg-9 {
+    margin-left: 75%; }
+  .offset-lg-10 {
+    margin-left: 83.33333%; }
+  .offset-lg-11 {
+    margin-left: 91.66667%; } }
+
+@media (min-width: 1200px) {
+  .col-xl {
+    flex-basis: 0;
+    flex-grow: 1;
+    max-width: 100%; }
+  .col-xl-auto {
+    flex: 0 0 auto;
+    width: auto; }
+  .col-xl-1 {
+    flex: 0 0 8.33333%;
+    max-width: 8.33333%; }
+  .col-xl-2 {
+    flex: 0 0 16.66667%;
+    max-width: 16.66667%; }
+  .col-xl-3 {
+    flex: 0 0 25%;
+    max-width: 25%; }
+  .col-xl-4 {
+    flex: 0 0 33.33333%;
+    max-width: 33.33333%; }
+  .col-xl-5 {
+    flex: 0 0 41.66667%;
+    max-width: 41.66667%; }
+  .col-xl-6 {
+    flex: 0 0 50%;
+    max-width: 50%; }
+  .col-xl-7 {
+    flex: 0 0 58.33333%;
+    max-width: 58.33333%; }
+  .col-xl-8 {
+    flex: 0 0 66.66667%;
+    max-width: 66.66667%; }
+  .col-xl-9 {
+    flex: 0 0 75%;
+    max-width: 75%; }
+  .col-xl-10 {
+    flex: 0 0 83.33333%;
+    max-width: 83.33333%; }
+  .col-xl-11 {
+    flex: 0 0 91.66667%;
+    max-width: 91.66667%; }
+  .col-xl-12 {
+    flex: 0 0 100%;
+    max-width: 100%; }
+  .pull-xl-0 {
+    right: auto; }
+  .pull-xl-1 {
+    right: 8.33333%; }
+  .pull-xl-2 {
+    right: 16.66667%; }
+  .pull-xl-3 {
+    right: 25%; }
+  .pull-xl-4 {
+    right: 33.33333%; }
+  .pull-xl-5 {
+    right: 41.66667%; }
+  .pull-xl-6 {
+    right: 50%; }
+  .pull-xl-7 {
+    right: 58.33333%; }
+  .pull-xl-8 {
+    right: 66.66667%; }
+  .pull-xl-9 {
+    right: 75%; }
+  .pull-xl-10 {
+    right: 83.33333%; }
+  .pull-xl-11 {
+    right: 91.66667%; }
+  .pull-xl-12 {
+    right: 100%; }
+  .push-xl-0 {
+    left: auto; }
+  .push-xl-1 {
+    left: 8.33333%; }
+  .push-xl-2 {
+    left: 16.66667%; }
+  .push-xl-3 {
+    left: 25%; }
+  .push-xl-4 {
+    left: 33.33333%; }
+  .push-xl-5 {
+    left: 41.66667%; }
+  .push-xl-6 {
+    left: 50%; }
+  .push-xl-7 {
+    left: 58.33333%; }
+  .push-xl-8 {
+    left: 66.66667%; }
+  .push-xl-9 {
+    left: 75%; }
+  .push-xl-10 {
+    left: 83.33333%; }
+  .push-xl-11 {
+    left: 91.66667%; }
+  .push-xl-12 {
+    left: 100%; }
+  .offset-xl-0 {
+    margin-left: 0%; }
+  .offset-xl-1 {
+    margin-left: 8.33333%; }
+  .offset-xl-2 {
+    margin-left: 16.66667%; }
+  .offset-xl-3 {
+    margin-left: 25%; }
+  .offset-xl-4 {
+    margin-left: 33.33333%; }
+  .offset-xl-5 {
+    margin-left: 41.66667%; }
+  .offset-xl-6 {
+    margin-left: 50%; }
+  .offset-xl-7 {
+    margin-left: 58.33333%; }
+  .offset-xl-8 {
+    margin-left: 66.66667%; }
+  .offset-xl-9 {
+    margin-left: 75%; }
+  .offset-xl-10 {
+    margin-left: 83.33333%; }
+  .offset-xl-11 {
+    margin-left: 91.66667%; } }
+
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 1rem; }
+  .table th,
+  .table td {
+    padding: 0.75rem;
+    vertical-align: top;
+    border-top: 1px solid #cfd8dc; }
+  .table thead th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #cfd8dc; }
+  .table tbody + tbody {
+    border-top: 2px solid #cfd8dc; }
+  .table .table {
+    background-color: #e4e5e6; }
+
+.table-sm th,
+.table-sm td {
+  padding: 0.3rem; }
+
+.table-bordered {
+  border: 1px solid #cfd8dc; }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #cfd8dc; }
+  .table-bordered thead th,
+  .table-bordered thead td {
+    border-bottom-width: 2px; }
+
+.table-striped tbody tr:nth-of-type(odd) {
+  background-color: #eceff1; }
+
+.table-hover tbody tr:hover {
+  background-color: #eceff1; }
+
+.table-active,
+.table-active > th,
+.table-active > td {
+  background-color: #eceff1; }
+
+.table-hover .table-active:hover {
+  background-color: #dde3e6; }
+  .table-hover .table-active:hover > td,
+  .table-hover .table-active:hover > th {
+    background-color: #dde3e6; }
+
+.table-success,
+.table-success > th,
+.table-success > td {
+  background-color: #dff0d8; }
+
+.table-hover .table-success:hover {
+  background-color: #d0e9c6; }
+  .table-hover .table-success:hover > td,
+  .table-hover .table-success:hover > th {
+    background-color: #d0e9c6; }
+
+.table-info,
+.table-info > th,
+.table-info > td {
+  background-color: #d9edf7; }
+
+.table-hover .table-info:hover {
+  background-color: #c4e3f3; }
+  .table-hover .table-info:hover > td,
+  .table-hover .table-info:hover > th {
+    background-color: #c4e3f3; }
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
+  background-color: #fcf8e3; }
+
+.table-hover .table-warning:hover {
+  background-color: #faf2cc; }
+  .table-hover .table-warning:hover > td,
+  .table-hover .table-warning:hover > th {
+    background-color: #faf2cc; }
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
+  background-color: #f2dede; }
+
+.table-hover .table-danger:hover {
+  background-color: #ebcccc; }
+  .table-hover .table-danger:hover > td,
+  .table-hover .table-danger:hover > th {
+    background-color: #ebcccc; }
+
+.thead-inverse th {
+  color: #e4e5e6;
+  background-color: #263238; }
+
+.thead-default th {
+  color: #607d8b;
+  background-color: #cfd8dc; }
+
+.table-inverse {
+  color: #e4e5e6;
+  background-color: #263238; }
+  .table-inverse th,
+  .table-inverse td,
+  .table-inverse thead th {
+    border-color: #e4e5e6; }
+  .table-inverse.table-bordered {
+    border: 0; }
+
+.table-responsive {
+  display: block;
+  width: 100%;
+  overflow-x: auto;
+  -ms-overflow-style: -ms-autohiding-scrollbar; }
+  .table-responsive.table-bordered {
+    border: 0; }
+
+.table-outline {
+  border: 1px solid #cfd8dc; }
+  .table-outline td {
+    vertical-align: middle; }
+
+.table-align-middle td {
+  vertical-align: middle; }
+
+.table-clear td {
+  border: 0; }
+
+.form-control {
+  display: block;
+  width: 100%;
+  padding: 0.5rem 0.75rem;
+  font-size: 0.875rem;
+  line-height: 1.25;
+  color: #607d8b;
+  background-color: #fff;
+  background-image: none;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 0;
+  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
+  .form-control::-ms-expand {
+    background-color: transparent;
+    border: 0; }
+  .form-control:focus {
+    color: #607d8b;
+    background-color: #fff;
+    border-color: #8ad4ee;
+    outline: none; }
+  .form-control::placeholder {
+    color: #b0bec5;
+    opacity: 1; }
+  .form-control:disabled, .form-control[readonly] {
+    background-color: #cfd8dc;
+    opacity: 1; }
+  .form-control:disabled {
+    cursor: not-allowed; }
+
+select.form-control:not([size]):not([multiple]) {
+  height: calc(2.09375rem + 2px); }
+
+select.form-control:focus::-ms-value {
+  color: #607d8b;
+  background-color: #fff; }
+
+.form-control-file,
+.form-control-range {
+  display: block; }
+
+.col-form-label {
+  padding-top: calc(0.5rem - 1px * 2);
+  padding-bottom: calc(0.5rem - 1px * 2);
+  margin-bottom: 0; }
+
+.col-form-label-lg {
+  padding-top: calc(0.75rem - 1px * 2);
+  padding-bottom: calc(0.75rem - 1px * 2);
+  font-size: 1.25rem; }
+
+.col-form-label-sm {
+  padding-top: calc(0.25rem - 1px * 2);
+  padding-bottom: calc(0.25rem - 1px * 2);
+  font-size: 0.875rem; }
+
+.col-form-legend {
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  margin-bottom: 0;
+  font-size: 0.875rem; }
+
+.form-control-static {
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  margin-bottom: 0;
+  line-height: 1.25;
+  border: solid transparent;
+  border-width: 1px 0; }
+  .form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,
+  .input-group-sm > .form-control-static.input-group-addon,
+  .input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,
+  .input-group-lg > .form-control-static.input-group-addon,
+  .input-group-lg > .input-group-btn > .form-control-static.btn {
+    padding-right: 0;
+    padding-left: 0; }
+
+.form-control-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem; }
+
+select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),
+.input-group-sm > select.input-group-addon:not([size]):not([multiple]),
+.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {
+  height: 1.8125rem; }
+
+.form-control-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  padding: 0.75rem 1.5rem;
+  font-size: 1.25rem; }
+
+select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
+.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
+.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
+  height: 3.16667rem; }
+
+.form-group {
+  margin-bottom: 1rem; }
+
+.form-text {
+  display: block;
+  margin-top: 0.25rem; }
+
+.form-check {
+  position: relative;
+  display: block;
+  margin-bottom: 0.5rem; }
+  .form-check.disabled .form-check-label {
+    color: #b0bec5;
+    cursor: not-allowed; }
+
+.form-check-label {
+  padding-left: 1.25rem;
+  margin-bottom: 0;
+  cursor: pointer; }
+
+.form-check-input {
+  position: absolute;
+  margin-top: 0.25rem;
+  margin-left: -1.25rem; }
+  .form-check-input:only-child {
+    position: static; }
+
+.form-check-inline {
+  display: inline-block; }
+  .form-check-inline .form-check-label {
+    vertical-align: middle; }
+  .form-check-inline + .form-check-inline {
+    margin-left: 0.75rem; }
+
+.form-control-feedback {
+  margin-top: 0.25rem; }
+
+.form-control-success,
+.form-control-warning,
+.form-control-danger {
+  padding-right: 2.25rem;
+  background-repeat: no-repeat;
+  background-position: center right 0.52344rem;
+  background-size: 1.04688rem 1.04688rem; }
+
+.has-success .form-control-feedback,
+.has-success .form-control-label,
+.has-success .col-form-label,
+.has-success .form-check-label,
+.has-success .custom-control {
+  color: #4dbd74; }
+
+.has-success .form-control {
+  border-color: #4dbd74; }
+
+.has-success .input-group-addon {
+  color: #4dbd74;
+  border-color: #4dbd74;
+  background-color: #e2f4e8; }
+
+.has-success .form-control-success {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%234dbd74' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"); }
+
+.has-warning .form-control-feedback,
+.has-warning .form-control-label,
+.has-warning .col-form-label,
+.has-warning .form-check-label,
+.has-warning .custom-control {
+  color: #f8cb00; }
+
+.has-warning .form-control {
+  border-color: #f8cb00; }
+
+.has-warning .input-group-addon {
+  color: #f8cb00;
+  border-color: #f8cb00;
+  background-color: #fff4c5; }
+
+.has-warning .form-control-warning {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f8cb00' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E"); }
+
+.has-danger .form-control-feedback,
+.has-danger .form-control-label,
+.has-danger .col-form-label,
+.has-danger .form-check-label,
+.has-danger .custom-control {
+  color: #f86c6b; }
+
+.has-danger .form-control {
+  border-color: #f86c6b; }
+
+.has-danger .input-group-addon {
+  color: #f86c6b;
+  border-color: #f86c6b;
+  background-color: white; }
+
+.has-danger .form-control-danger {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23f86c6b' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E"); }
+
+.form-inline {
+  display: flex;
+  flex-flow: row wrap;
+  align-items: center; }
+  .form-inline .form-check {
+    width: 100%; }
+  @media (min-width: 576px) {
+    .form-inline label {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin-bottom: 0; }
+    .form-inline .form-group {
+      display: flex;
+      flex: 0 0 auto;
+      flex-flow: row wrap;
+      align-items: center;
+      margin-bottom: 0; }
+    .form-inline .form-control {
+      display: inline-block;
+      width: auto;
+      vertical-align: middle; }
+    .form-inline .form-control-static {
+      display: inline-block; }
+    .form-inline .input-group {
+      width: auto; }
+    .form-inline .form-control-label {
+      margin-bottom: 0;
+      vertical-align: middle; }
+    .form-inline .form-check {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      width: auto;
+      margin-top: 0;
+      margin-bottom: 0; }
+    .form-inline .form-check-label {
+      padding-left: 0; }
+    .form-inline .form-check-input {
+      position: relative;
+      margin-top: 0;
+      margin-right: 0.25rem;
+      margin-left: 0; }
+    .form-inline .custom-control {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      padding-left: 0; }
+    .form-inline .custom-control-indicator {
+      position: static;
+      display: inline-block;
+      margin-right: 0.25rem;
+      vertical-align: text-bottom; }
+    .form-inline .has-feedback .form-control-feedback {
+      top: 0; } }
+
+.btn {
+  display: inline-block;
+  font-weight: normal;
+  line-height: 1.25;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  user-select: none;
+  border: 1px solid transparent;
+  padding: 0.5rem 1rem;
+  font-size: 0.875rem;
+  transition: all 0.2s ease-in-out; }
+  .btn:focus, .btn:hover {
+    text-decoration: none; }
+  .btn:focus, .btn.focus {
+    outline: 0;
+    box-shadow: 0 0 0 2px rgba(32, 168, 216, 0.25); }
+  .btn.disabled, .btn:disabled {
+    cursor: not-allowed;
+    opacity: .65; }
+  .btn:active, .btn.active {
+    background-image: none; }
+
+a.btn.disabled,
+fieldset[disabled] a.btn {
+  pointer-events: none; }
+
+.btn-primary {
+  color: #fff;
+  background-color: #20a8d8;
+  border-color: #20a8d8; }
+  .btn-primary:hover {
+    color: #fff;
+    background-color: #1985ac;
+    border-color: #187fa3; }
+  .btn-primary:focus, .btn-primary.focus {
+    box-shadow: 0 0 0 2px rgba(32, 168, 216, 0.5); }
+  .btn-primary.disabled, .btn-primary:disabled {
+    background-color: #20a8d8;
+    border-color: #20a8d8; }
+  .btn-primary:active, .btn-primary.active,
+  .show > .btn-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #1985ac;
+    background-image: none;
+    border-color: #187fa3; }
+
+.btn-secondary {
+  color: #263238;
+  background-color: #fff;
+  border-color: #b0bec5; }
+  .btn-secondary:hover {
+    color: #263238;
+    background-color: #e6e6e6;
+    border-color: #8da1ab; }
+  .btn-secondary:focus, .btn-secondary.focus {
+    box-shadow: 0 0 0 2px rgba(176, 190, 197, 0.5); }
+  .btn-secondary.disabled, .btn-secondary:disabled {
+    background-color: #fff;
+    border-color: #b0bec5; }
+  .btn-secondary:active, .btn-secondary.active,
+  .show > .btn-secondary.dropdown-toggle {
+    color: #263238;
+    background-color: #e6e6e6;
+    background-image: none;
+    border-color: #8da1ab; }
+
+.btn-info {
+  color: #fff;
+  background-color: #63c2de;
+  border-color: #63c2de; }
+  .btn-info:hover {
+    color: #fff;
+    background-color: #39b2d5;
+    border-color: #30aed3; }
+  .btn-info:focus, .btn-info.focus {
+    box-shadow: 0 0 0 2px rgba(99, 194, 222, 0.5); }
+  .btn-info.disabled, .btn-info:disabled {
+    background-color: #63c2de;
+    border-color: #63c2de; }
+  .btn-info:active, .btn-info.active,
+  .show > .btn-info.dropdown-toggle {
+    color: #fff;
+    background-color: #39b2d5;
+    background-image: none;
+    border-color: #30aed3; }
+
+.btn-success {
+  color: #fff;
+  background-color: #4dbd74;
+  border-color: #4dbd74; }
+  .btn-success:hover {
+    color: #fff;
+    background-color: #3a9d5d;
+    border-color: #379558; }
+  .btn-success:focus, .btn-success.focus {
+    box-shadow: 0 0 0 2px rgba(77, 189, 116, 0.5); }
+  .btn-success.disabled, .btn-success:disabled {
+    background-color: #4dbd74;
+    border-color: #4dbd74; }
+  .btn-success:active, .btn-success.active,
+  .show > .btn-success.dropdown-toggle {
+    color: #fff;
+    background-color: #3a9d5d;
+    background-image: none;
+    border-color: #379558; }
+
+.btn-warning {
+  color: #fff;
+  background-color: #f8cb00;
+  border-color: #f8cb00; }
+  .btn-warning:hover {
+    color: #fff;
+    background-color: #c5a100;
+    border-color: #bb9900; }
+  .btn-warning:focus, .btn-warning.focus {
+    box-shadow: 0 0 0 2px rgba(248, 203, 0, 0.5); }
+  .btn-warning.disabled, .btn-warning:disabled {
+    background-color: #f8cb00;
+    border-color: #f8cb00; }
+  .btn-warning:active, .btn-warning.active,
+  .show > .btn-warning.dropdown-toggle {
+    color: #fff;
+    background-color: #c5a100;
+    background-image: none;
+    border-color: #bb9900; }
+
+.btn-danger {
+  color: #fff;
+  background-color: #f86c6b;
+  border-color: #f86c6b; }
+  .btn-danger:hover {
+    color: #fff;
+    background-color: #f63c3a;
+    border-color: #f53231; }
+  .btn-danger:focus, .btn-danger.focus {
+    box-shadow: 0 0 0 2px rgba(248, 108, 107, 0.5); }
+  .btn-danger.disabled, .btn-danger:disabled {
+    background-color: #f86c6b;
+    border-color: #f86c6b; }
+  .btn-danger:active, .btn-danger.active,
+  .show > .btn-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #f63c3a;
+    background-image: none;
+    border-color: #f53231; }
+
+.btn-outline-primary {
+  color: #20a8d8;
+  background-image: none;
+  background-color: transparent;
+  border-color: #20a8d8; }
+  .btn-outline-primary:hover {
+    color: #fff;
+    background-color: #20a8d8;
+    border-color: #20a8d8; }
+  .btn-outline-primary:focus, .btn-outline-primary.focus {
+    box-shadow: 0 0 0 2px rgba(32, 168, 216, 0.5); }
+  .btn-outline-primary.disabled, .btn-outline-primary:disabled {
+    color: #20a8d8;
+    background-color: transparent; }
+  .btn-outline-primary:active, .btn-outline-primary.active,
+  .show > .btn-outline-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #20a8d8;
+    border-color: #20a8d8; }
+
+.btn-outline-secondary {
+  color: #b0bec5;
+  background-image: none;
+  background-color: transparent;
+  border-color: #b0bec5; }
+  .btn-outline-secondary:hover {
+    color: #fff;
+    background-color: #b0bec5;
+    border-color: #b0bec5; }
+  .btn-outline-secondary:focus, .btn-outline-secondary.focus {
+    box-shadow: 0 0 0 2px rgba(176, 190, 197, 0.5); }
+  .btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+    color: #b0bec5;
+    background-color: transparent; }
+  .btn-outline-secondary:active, .btn-outline-secondary.active,
+  .show > .btn-outline-secondary.dropdown-toggle {
+    color: #fff;
+    background-color: #b0bec5;
+    border-color: #b0bec5; }
+
+.btn-outline-info {
+  color: #63c2de;
+  background-image: none;
+  background-color: transparent;
+  border-color: #63c2de; }
+  .btn-outline-info:hover {
+    color: #fff;
+    background-color: #63c2de;
+    border-color: #63c2de; }
+  .btn-outline-info:focus, .btn-outline-info.focus {
+    box-shadow: 0 0 0 2px rgba(99, 194, 222, 0.5); }
+  .btn-outline-info.disabled, .btn-outline-info:disabled {
+    color: #63c2de;
+    background-color: transparent; }
+  .btn-outline-info:active, .btn-outline-info.active,
+  .show > .btn-outline-info.dropdown-toggle {
+    color: #fff;
+    background-color: #63c2de;
+    border-color: #63c2de; }
+
+.btn-outline-success {
+  color: #4dbd74;
+  background-image: none;
+  background-color: transparent;
+  border-color: #4dbd74; }
+  .btn-outline-success:hover {
+    color: #fff;
+    background-color: #4dbd74;
+    border-color: #4dbd74; }
+  .btn-outline-success:focus, .btn-outline-success.focus {
+    box-shadow: 0 0 0 2px rgba(77, 189, 116, 0.5); }
+  .btn-outline-success.disabled, .btn-outline-success:disabled {
+    color: #4dbd74;
+    background-color: transparent; }
+  .btn-outline-success:active, .btn-outline-success.active,
+  .show > .btn-outline-success.dropdown-toggle {
+    color: #fff;
+    background-color: #4dbd74;
+    border-color: #4dbd74; }
+
+.btn-outline-warning {
+  color: #f8cb00;
+  background-image: none;
+  background-color: transparent;
+  border-color: #f8cb00; }
+  .btn-outline-warning:hover {
+    color: #fff;
+    background-color: #f8cb00;
+    border-color: #f8cb00; }
+  .btn-outline-warning:focus, .btn-outline-warning.focus {
+    box-shadow: 0 0 0 2px rgba(248, 203, 0, 0.5); }
+  .btn-outline-warning.disabled, .btn-outline-warning:disabled {
+    color: #f8cb00;
+    background-color: transparent; }
+  .btn-outline-warning:active, .btn-outline-warning.active,
+  .show > .btn-outline-warning.dropdown-toggle {
+    color: #fff;
+    background-color: #f8cb00;
+    border-color: #f8cb00; }
+
+.btn-outline-danger {
+  color: #f86c6b;
+  background-image: none;
+  background-color: transparent;
+  border-color: #f86c6b; }
+  .btn-outline-danger:hover {
+    color: #fff;
+    background-color: #f86c6b;
+    border-color: #f86c6b; }
+  .btn-outline-danger:focus, .btn-outline-danger.focus {
+    box-shadow: 0 0 0 2px rgba(248, 108, 107, 0.5); }
+  .btn-outline-danger.disabled, .btn-outline-danger:disabled {
+    color: #f86c6b;
+    background-color: transparent; }
+  .btn-outline-danger:active, .btn-outline-danger.active,
+  .show > .btn-outline-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #f86c6b;
+    border-color: #f86c6b; }
+
+.btn-link {
+  font-weight: normal;
+  color: #20a8d8;
+  border-radius: 0; }
+  .btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {
+    background-color: transparent; }
+  .btn-link, .btn-link:focus, .btn-link:active {
+    border-color: transparent; }
+  .btn-link:hover {
+    border-color: transparent; }
+  .btn-link:focus, .btn-link:hover {
+    color: #167495;
+    text-decoration: underline;
+    background-color: transparent; }
+  .btn-link:disabled {
+    color: #b0bec5; }
+    .btn-link:disabled:focus, .btn-link:disabled:hover {
+      text-decoration: none; }
+
+.btn-lg, .btn-group-lg > .btn {
+  padding: 0.75rem 1.5rem;
+  font-size: 1.25rem; }
+
+.btn-sm, .btn-group-sm > .btn {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem; }
+
+.btn-block {
+  display: block;
+  width: 100%; }
+
+.btn-block + .btn-block {
+  margin-top: 0.5rem; }
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%; }
+
+.btn .badge {
+  position: absolute;
+  top: 2px;
+  right: 6px;
+  font-size: 9px; }
+
+.fade {
+  opacity: 0;
+  transition: opacity 0.15s linear; }
+  .fade.show {
+    opacity: 1; }
+
+.collapse {
+  display: none; }
+  .collapse.show {
+    display: block; }
+
+tr.collapse.show {
+  display: table-row; }
+
+tbody.collapse.show {
+  display: table-row-group; }
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  transition: height 0.35s ease; }
+
+.dropup,
+.dropdown {
+  position: relative; }
+
+.dropdown-toggle::after {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 0.3em;
+  vertical-align: middle;
+  content: "";
+  border-top: 0.3em solid;
+  border-right: 0.3em solid transparent;
+  border-left: 0.3em solid transparent; }
+
+.dropdown-toggle:focus {
+  outline: 0; }
+
+.dropup .dropdown-toggle::after {
+  border-top: 0;
+  border-bottom: 0.3em solid; }
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 10rem;
+  padding: 0 0;
+  margin: 0.125rem 0 0;
+  font-size: 0.875rem;
+  color: #263238;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid #cfd8dc; }
+
+.dropdown-divider {
+  height: 1px;
+  margin: 0.5rem 0;
+  overflow: hidden;
+  background-color: #eceff1; }
+
+.dropdown-item {
+  display: block;
+  width: 100%;
+  padding: 3px 1.5rem;
+  clear: both;
+  font-weight: normal;
+  color: #263238;
+  text-align: inherit;
+  white-space: nowrap;
+  background: none;
+  border: 0; }
+  .dropdown-item:focus, .dropdown-item:hover {
+    color: #1c2429;
+    text-decoration: none;
+    background-color: #eceff1; }
+  .dropdown-item.active, .dropdown-item:active {
+    color: #fff;
+    text-decoration: none;
+    background-color: #20a8d8; }
+  .dropdown-item.disabled, .dropdown-item:disabled {
+    color: #b0bec5;
+    cursor: not-allowed;
+    background-color: transparent; }
+
+.show > .dropdown-menu {
+  display: block; }
+
+.show > a {
+  outline: 0; }
+
+.dropdown-menu-right {
+  right: 0;
+  left: auto; }
+
+.dropdown-menu-left {
+  right: auto;
+  left: 0; }
+
+.dropdown-header {
+  display: block;
+  padding: 0 1.5rem;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  color: #b0bec5;
+  white-space: nowrap; }
+
+.dropdown-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 990; }
+
+.dropup .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 0.125rem; }
+
+.dropdown-item {
+  position: relative;
+  padding: 10px 20px;
+  border-bottom: 1px solid #cfd8dc; }
+  .dropdown-item:last-child {
+    border-bottom: 0; }
+  .dropdown-item i {
+    display: inline-block;
+    width: 20px;
+    margin-right: 10px;
+    margin-left: -10px;
+    color: #cfd8dc;
+    text-align: center; }
+  .dropdown-item .badge {
+    position: absolute;
+    right: 10px;
+    margin-top: 2px; }
+
+.dropdown-header {
+  padding: 8px 20px;
+  background: #eceff1;
+  border-bottom: 1px solid #cfd8dc; }
+  .dropdown-header .btn {
+    margin-top: -7px;
+    color: #b0bec5; }
+    .dropdown-header .btn:hover {
+      color: #263238; }
+    .dropdown-header .btn.pull-right {
+      margin-right: -20px; }
+
+.dropdown-menu-lg {
+  width: 250px; }
+
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-flex;
+  vertical-align: middle; }
+  .btn-group > .btn,
+  .btn-group-vertical > .btn {
+    position: relative;
+    flex: 0 1 auto; }
+    .btn-group > .btn:hover,
+    .btn-group-vertical > .btn:hover {
+      z-index: 2; }
+    .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+    .btn-group-vertical > .btn:focus,
+    .btn-group-vertical > .btn:active,
+    .btn-group-vertical > .btn.active {
+      z-index: 2; }
+  .btn-group .btn + .btn,
+  .btn-group .btn + .btn-group,
+  .btn-group .btn-group + .btn,
+  .btn-group .btn-group + .btn-group,
+  .btn-group-vertical .btn + .btn,
+  .btn-group-vertical .btn + .btn-group,
+  .btn-group-vertical .btn-group + .btn,
+  .btn-group-vertical .btn-group + .btn-group {
+    margin-left: -1px; }
+
+.btn-toolbar {
+  display: flex;
+  justify-content: flex-start; }
+  .btn-toolbar .input-group {
+    width: auto; }
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0; }
+
+.btn-group > .btn:first-child {
+  margin-left: 0; }
+
+.btn-group > .btn-group {
+  float: left; }
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0; }
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0; }
+
+.btn + .dropdown-toggle-split {
+  padding-right: 0.75rem;
+  padding-left: 0.75rem; }
+  .btn + .dropdown-toggle-split::after {
+    margin-left: 0; }
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+  padding-right: 0.375rem;
+  padding-left: 0.375rem; }
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+  padding-right: 1.125rem;
+  padding-left: 1.125rem; }
+
+.btn-group-vertical {
+  display: inline-flex;
+  flex-direction: column;
+  align-items: flex-start;
+  justify-content: center; }
+  .btn-group-vertical .btn,
+  .btn-group-vertical .btn-group {
+    width: 100%; }
+  .btn-group-vertical > .btn + .btn,
+  .btn-group-vertical > .btn + .btn-group,
+  .btn-group-vertical > .btn-group + .btn,
+  .btn-group-vertical > .btn-group + .btn-group {
+    margin-top: -1px;
+    margin-left: 0; }
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0; }
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0; }
+
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none; }
+
+.input-group {
+  position: relative;
+  display: flex;
+  width: 100%; }
+  .input-group .form-control {
+    position: relative;
+    z-index: 2;
+    flex: 1 1 auto;
+    width: 1%;
+    margin-bottom: 0; }
+    .input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {
+      z-index: 3; }
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: flex;
+  flex-direction: column;
+  justify-content: center; }
+
+.input-group-addon,
+.input-group-btn {
+  white-space: nowrap;
+  vertical-align: middle; }
+
+.input-group-addon {
+  padding: 0.5rem 0.75rem;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  font-weight: normal;
+  line-height: 1.25;
+  color: #607d8b;
+  text-align: center;
+  background-color: #cfd8dc;
+  border: 1px solid rgba(0, 0, 0, 0.15); }
+  .input-group-addon.form-control-sm,
+  .input-group-sm > .input-group-addon,
+  .input-group-sm > .input-group-btn > .input-group-addon.btn {
+    padding: 0.25rem 0.5rem;
+    font-size: 0.875rem; }
+  .input-group-addon.form-control-lg,
+  .input-group-lg > .input-group-addon,
+  .input-group-lg > .input-group-btn > .input-group-addon.btn {
+    padding: 0.75rem 1.5rem;
+    font-size: 1.25rem; }
+  .input-group-addon input[type="radio"],
+  .input-group-addon input[type="checkbox"] {
+    margin-top: 0; }
+
+.input-group-addon:not(:last-child) {
+  border-right: 0; }
+
+.form-control + .input-group-addon:not(:first-child) {
+  border-left: 0; }
+
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap; }
+  .input-group-btn > .btn {
+    position: relative;
+    flex: 1; }
+    .input-group-btn > .btn + .btn {
+      margin-left: -1px; }
+    .input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {
+      z-index: 3; }
+  .input-group-btn:not(:last-child) > .btn,
+  .input-group-btn:not(:last-child) > .btn-group {
+    margin-right: -1px; }
+  .input-group-btn:not(:first-child) > .btn,
+  .input-group-btn:not(:first-child) > .btn-group {
+    z-index: 2;
+    margin-left: -1px; }
+    .input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,
+    .input-group-btn:not(:first-child) > .btn-group:focus,
+    .input-group-btn:not(:first-child) > .btn-group:active,
+    .input-group-btn:not(:first-child) > .btn-group:hover {
+      z-index: 3; }
+
+.input-group-addon,
+.input-group-btn {
+  min-width: 40px;
+  white-space: nowrap;
+  vertical-align: middle; }
+
+.nav {
+  display: flex;
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none; }
+
+.nav-link, .navbar .dropdown-toggle {
+  display: block;
+  padding: 0.5em 1em; }
+  .nav-link:focus, .navbar .dropdown-toggle:focus, .nav-link:hover, .navbar .dropdown-toggle:hover {
+    text-decoration: none; }
+  .nav-link.disabled, .navbar .disabled.dropdown-toggle {
+    color: #b0bec5;
+    cursor: not-allowed; }
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd; }
+  .nav-tabs .nav-item {
+    margin-bottom: -1px; }
+  .nav-tabs .nav-link, .nav-tabs .navbar .dropdown-toggle, .navbar .nav-tabs .dropdown-toggle {
+    border: 1px solid transparent; }
+    .nav-tabs .nav-link:focus, .nav-tabs .navbar .dropdown-toggle:focus, .navbar .nav-tabs .dropdown-toggle:focus, .nav-tabs .nav-link:hover, .nav-tabs .navbar .dropdown-toggle:hover, .navbar .nav-tabs .dropdown-toggle:hover {
+      border-color: #cfd8dc #cfd8dc #ddd; }
+    .nav-tabs .nav-link.disabled, .nav-tabs .navbar .disabled.dropdown-toggle, .navbar .nav-tabs .disabled.dropdown-toggle {
+      color: #b0bec5;
+      background-color: transparent;
+      border-color: transparent; }
+  .nav-tabs .nav-link.active, .nav-tabs .navbar .active.dropdown-toggle, .navbar .nav-tabs .active.dropdown-toggle,
+  .nav-tabs .nav-item.show .nav-link,
+  .nav-tabs .nav-item.show .navbar .dropdown-toggle, .navbar
+  .nav-tabs .nav-item.show .dropdown-toggle {
+    color: #607d8b;
+    background-color: #e4e5e6;
+    border-color: #ddd #ddd #e4e5e6; }
+  .nav-tabs .dropdown-menu {
+    margin-top: -1px; }
+
+.nav-pills .nav-link.active, .nav-pills .navbar .active.dropdown-toggle, .navbar .nav-pills .active.dropdown-toggle,
+.nav-pills .nav-item.show .nav-link,
+.nav-pills .nav-item.show .navbar .dropdown-toggle, .navbar
+.nav-pills .nav-item.show .dropdown-toggle {
+  color: #fff;
+  cursor: default;
+  background-color: #20a8d8; }
+
+.nav-fill .nav-item {
+  flex: 1 1 auto;
+  text-align: center; }
+
+.nav-justified .nav-item {
+  flex: 1 1 100%;
+  text-align: center; }
+
+.tab-content > .tab-pane {
+  display: none; }
+
+.tab-content > .active {
+  display: block; }
+
+.nav-tabs .nav-link, .nav-tabs .navbar .dropdown-toggle, .navbar .nav-tabs .dropdown-toggle {
+  color: #607d8b; }
+  .nav-tabs .nav-link.active, .nav-tabs .navbar .active.dropdown-toggle, .navbar .nav-tabs .active.dropdown-toggle {
+    color: #263238;
+    background: #fff;
+    border-color: #cfd8dc;
+    border-bottom-color: #fff; }
+    .nav-tabs .nav-link.active:focus, .nav-tabs .navbar .active.dropdown-toggle:focus, .navbar .nav-tabs .active.dropdown-toggle:focus {
+      background: #fff;
+      border-color: #cfd8dc;
+      border-bottom-color: #fff; }
+
+.tab-content {
+  margin-top: -1px;
+  background: #fff;
+  border: 1px solid #cfd8dc; }
+  .tab-content .tab-pane {
+    padding: 1rem 1rem; }
+
+.card-block .tab-content {
+  margin-top: 0;
+  border: 0; }
+
+.navbar {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  padding: 0.5rem 1rem; }
+
+.navbar-brand {
+  display: inline-block;
+  padding-top: .25rem;
+  padding-bottom: .25rem;
+  margin-right: 1rem;
+  font-size: 1.25rem;
+  line-height: inherit;
+  white-space: nowrap; }
+  .navbar-brand:focus, .navbar-brand:hover {
+    text-decoration: none; }
+
+.navbar-nav {
+  display: flex;
+  flex-direction: column;
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none; }
+  .navbar-nav .nav-link, .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-nav .dropdown-toggle {
+    padding-right: 0;
+    padding-left: 0; }
+
+.navbar-text {
+  display: inline-block;
+  padding-top: .425rem;
+  padding-bottom: .425rem; }
+
+.navbar-toggler {
+  align-self: flex-start;
+  padding: 0.25rem 0.75rem;
+  font-size: 1.25rem;
+  line-height: 1;
+  background: transparent;
+  border: 1px solid transparent; }
+  .navbar-toggler:focus, .navbar-toggler:hover {
+    text-decoration: none; }
+
+.navbar-toggler-icon {
+  display: inline-block;
+  width: 1.5em;
+  height: 1.5em;
+  vertical-align: middle;
+  content: "";
+  background: no-repeat center center;
+  background-size: 100% 100%; }
+
+.navbar-toggler-left {
+  position: absolute;
+  left: 1rem; }
+
+.navbar-toggler-right {
+  position: absolute;
+  right: 1rem; }
+
+@media (max-width: 575px) {
+  .navbar-toggleable .navbar-nav .dropdown-menu {
+    position: static;
+    float: none; }
+  .navbar-toggleable > .container {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 576px) {
+  .navbar-toggleable {
+    flex-direction: row;
+    flex-wrap: nowrap;
+    align-items: center; }
+    .navbar-toggleable .navbar-nav {
+      flex-direction: row; }
+      .navbar-toggleable .navbar-nav .nav-link, .navbar-toggleable .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-toggleable .navbar-nav .dropdown-toggle {
+        padding-right: .5rem;
+        padding-left: .5rem; }
+    .navbar-toggleable > .container {
+      display: flex;
+      flex-wrap: nowrap;
+      align-items: center; }
+    .navbar-toggleable .navbar-collapse {
+      display: flex !important;
+      width: 100%; }
+    .navbar-toggleable .navbar-toggler {
+      display: none; } }
+
+@media (max-width: 767px) {
+  .navbar-toggleable-sm .navbar-nav .dropdown-menu {
+    position: static;
+    float: none; }
+  .navbar-toggleable-sm > .container {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 768px) {
+  .navbar-toggleable-sm {
+    flex-direction: row;
+    flex-wrap: nowrap;
+    align-items: center; }
+    .navbar-toggleable-sm .navbar-nav {
+      flex-direction: row; }
+      .navbar-toggleable-sm .navbar-nav .nav-link, .navbar-toggleable-sm .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-toggleable-sm .navbar-nav .dropdown-toggle {
+        padding-right: .5rem;
+        padding-left: .5rem; }
+    .navbar-toggleable-sm > .container {
+      display: flex;
+      flex-wrap: nowrap;
+      align-items: center; }
+    .navbar-toggleable-sm .navbar-collapse {
+      display: flex !important;
+      width: 100%; }
+    .navbar-toggleable-sm .navbar-toggler {
+      display: none; } }
+
+@media (max-width: 991px) {
+  .navbar-toggleable-md .navbar-nav .dropdown-menu {
+    position: static;
+    float: none; }
+  .navbar-toggleable-md > .container {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 992px) {
+  .navbar-toggleable-md {
+    flex-direction: row;
+    flex-wrap: nowrap;
+    align-items: center; }
+    .navbar-toggleable-md .navbar-nav {
+      flex-direction: row; }
+      .navbar-toggleable-md .navbar-nav .nav-link, .navbar-toggleable-md .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-toggleable-md .navbar-nav .dropdown-toggle {
+        padding-right: .5rem;
+        padding-left: .5rem; }
+    .navbar-toggleable-md > .container {
+      display: flex;
+      flex-wrap: nowrap;
+      align-items: center; }
+    .navbar-toggleable-md .navbar-collapse {
+      display: flex !important;
+      width: 100%; }
+    .navbar-toggleable-md .navbar-toggler {
+      display: none; } }
+
+@media (max-width: 1199px) {
+  .navbar-toggleable-lg .navbar-nav .dropdown-menu {
+    position: static;
+    float: none; }
+  .navbar-toggleable-lg > .container {
+    padding-right: 0;
+    padding-left: 0; } }
+
+@media (min-width: 1200px) {
+  .navbar-toggleable-lg {
+    flex-direction: row;
+    flex-wrap: nowrap;
+    align-items: center; }
+    .navbar-toggleable-lg .navbar-nav {
+      flex-direction: row; }
+      .navbar-toggleable-lg .navbar-nav .nav-link, .navbar-toggleable-lg .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-toggleable-lg .navbar-nav .dropdown-toggle {
+        padding-right: .5rem;
+        padding-left: .5rem; }
+    .navbar-toggleable-lg > .container {
+      display: flex;
+      flex-wrap: nowrap;
+      align-items: center; }
+    .navbar-toggleable-lg .navbar-collapse {
+      display: flex !important;
+      width: 100%; }
+    .navbar-toggleable-lg .navbar-toggler {
+      display: none; } }
+
+.navbar-toggleable-xl {
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center; }
+  .navbar-toggleable-xl .navbar-nav .dropdown-menu {
+    position: static;
+    float: none; }
+  .navbar-toggleable-xl > .container {
+    padding-right: 0;
+    padding-left: 0; }
+  .navbar-toggleable-xl .navbar-nav {
+    flex-direction: row; }
+    .navbar-toggleable-xl .navbar-nav .nav-link, .navbar-toggleable-xl .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-toggleable-xl .navbar-nav .dropdown-toggle {
+      padding-right: .5rem;
+      padding-left: .5rem; }
+  .navbar-toggleable-xl > .container {
+    display: flex;
+    flex-wrap: nowrap;
+    align-items: center; }
+  .navbar-toggleable-xl .navbar-collapse {
+    display: flex !important;
+    width: 100%; }
+  .navbar-toggleable-xl .navbar-toggler {
+    display: none; }
+
+.navbar-light .navbar-brand,
+.navbar-light .navbar-toggler {
+  color: rgba(0, 0, 0, 0.9); }
+  .navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover,
+  .navbar-light .navbar-toggler:focus,
+  .navbar-light .navbar-toggler:hover {
+    color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-nav .nav-link, .navbar-light .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-light .navbar-nav .dropdown-toggle {
+  color: rgba(0, 0, 0, 0.5); }
+  .navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .navbar .dropdown-toggle:focus, .navbar .navbar-light .navbar-nav .dropdown-toggle:focus, .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .navbar .dropdown-toggle:hover, .navbar .navbar-light .navbar-nav .dropdown-toggle:hover {
+    color: rgba(0, 0, 0, 0.7); }
+  .navbar-light .navbar-nav .nav-link.disabled, .navbar-light .navbar-nav .navbar .disabled.dropdown-toggle, .navbar .navbar-light .navbar-nav .disabled.dropdown-toggle {
+    color: rgba(0, 0, 0, 0.3); }
+
+.navbar-light .navbar-nav .open > .nav-link, .navbar-light .navbar-nav .navbar .open > .dropdown-toggle, .navbar .navbar-light .navbar-nav .open > .dropdown-toggle,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .navbar .active > .dropdown-toggle, .navbar
+.navbar-light .navbar-nav .active > .dropdown-toggle,
+.navbar-light .navbar-nav .nav-link.open,
+.navbar-light .navbar-nav .navbar .open.dropdown-toggle, .navbar
+.navbar-light .navbar-nav .open.dropdown-toggle,
+.navbar-light .navbar-nav .nav-link.active,
+.navbar-light .navbar-nav .navbar .active.dropdown-toggle, .navbar
+.navbar-light .navbar-nav .active.dropdown-toggle {
+  color: rgba(0, 0, 0, 0.9); }
+
+.navbar-light .navbar-toggler {
+  border-color: rgba(0, 0, 0, 0.1); }
+
+.navbar-light .navbar-toggler-icon {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); }
+
+.navbar-light .navbar-text {
+  color: rgba(0, 0, 0, 0.5); }
+
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-toggler {
+  color: white; }
+  .navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover,
+  .navbar-inverse .navbar-toggler:focus,
+  .navbar-inverse .navbar-toggler:hover {
+    color: white; }
+
+.navbar-inverse .navbar-nav .nav-link, .navbar-inverse .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-inverse .navbar-nav .dropdown-toggle {
+  color: rgba(255, 255, 255, 0.5); }
+  .navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .navbar .dropdown-toggle:focus, .navbar .navbar-inverse .navbar-nav .dropdown-toggle:focus, .navbar-inverse .navbar-nav .nav-link:hover, .navbar-inverse .navbar-nav .navbar .dropdown-toggle:hover, .navbar .navbar-inverse .navbar-nav .dropdown-toggle:hover {
+    color: rgba(255, 255, 255, 0.75); }
+  .navbar-inverse .navbar-nav .nav-link.disabled, .navbar-inverse .navbar-nav .navbar .disabled.dropdown-toggle, .navbar .navbar-inverse .navbar-nav .disabled.dropdown-toggle {
+    color: rgba(255, 255, 255, 0.25); }
+
+.navbar-inverse .navbar-nav .open > .nav-link, .navbar-inverse .navbar-nav .navbar .open > .dropdown-toggle, .navbar .navbar-inverse .navbar-nav .open > .dropdown-toggle,
+.navbar-inverse .navbar-nav .active > .nav-link,
+.navbar-inverse .navbar-nav .navbar .active > .dropdown-toggle, .navbar
+.navbar-inverse .navbar-nav .active > .dropdown-toggle,
+.navbar-inverse .navbar-nav .nav-link.open,
+.navbar-inverse .navbar-nav .navbar .open.dropdown-toggle, .navbar
+.navbar-inverse .navbar-nav .open.dropdown-toggle,
+.navbar-inverse .navbar-nav .nav-link.active,
+.navbar-inverse .navbar-nav .navbar .active.dropdown-toggle, .navbar
+.navbar-inverse .navbar-nav .active.dropdown-toggle {
+  color: white; }
+
+.navbar-inverse .navbar-toggler {
+  border-color: rgba(255, 255, 255, 0.1); }
+
+.navbar-inverse .navbar-toggler-icon {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); }
+
+.navbar-inverse .navbar-text {
+  color: rgba(255, 255, 255, 0.5); }
+
+header.navbar {
+  position: relative;
+  flex-direction: row;
+  height: 55px;
+  padding: 0;
+  background-color: #fff;
+  border-bottom: 1px solid #cfd8dc; }
+  header.navbar .navbar-brand {
+    display: inline-block;
+    width: 155px;
+    height: 55px;
+    padding: 0.5rem 1rem;
+    margin-right: 0;
+    background-color: #fff;
+    background-image: url("../img/logo.png");
+    background-repeat: no-repeat;
+    background-position: center center;
+    background-size: 70px auto;
+    border-bottom: 1px solid #cfd8dc; }
+  header.navbar .navbar-nav {
+    flex-direction: row;
+    align-items: center; }
+  header.navbar .nav-item {
+    position: relative;
+    min-width: 50px;
+    margin: 0 !important;
+    text-align: center; }
+    header.navbar .nav-item .nav-link, header.navbar .nav-item .dropdown-toggle {
+      padding-top: 0;
+      padding-bottom: 0; }
+      header.navbar .nav-item .nav-link .badge, header.navbar .nav-item .dropdown-toggle .badge {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        margin-top: -16px;
+        margin-left: 0; }
+      header.navbar .nav-item .nav-link > .img-avatar, header.navbar .nav-item .dropdown-toggle > .img-avatar {
+        height: 35px;
+        margin: 0 10px; }
+  header.navbar .dropdown-menu {
+    padding-bottom: 0;
+    line-height: 1.5; }
+  header.navbar .dropdown-item {
+    min-width: 180px; }
+
+.navbar-brand {
+  color: rgba(0, 0, 0, 0.8); }
+  .navbar-brand:focus, .navbar-brand:hover {
+    color: rgba(0, 0, 0, 0.8); }
+
+.navbar-nav .nav-link, .navbar-nav .navbar .dropdown-toggle, .navbar .navbar-nav .dropdown-toggle {
+  color: rgba(0, 0, 0, 0.3); }
+  .navbar-nav .nav-link:focus, .navbar-nav .navbar .dropdown-toggle:focus, .navbar .navbar-nav .dropdown-toggle:focus, .navbar-nav .nav-link:hover, .navbar-nav .navbar .dropdown-toggle:hover, .navbar .navbar-nav .dropdown-toggle:hover {
+    color: rgba(0, 0, 0, 0.6); }
+
+.navbar-nav .open > .nav-link, .navbar-nav .navbar .open > .dropdown-toggle, .navbar .navbar-nav .open > .dropdown-toggle, .navbar-nav .open > .nav-link:focus, .navbar-nav .navbar .open > .dropdown-toggle:focus, .navbar .navbar-nav .open > .dropdown-toggle:focus, .navbar-nav .open > .nav-link:hover, .navbar-nav .navbar .open > .dropdown-toggle:hover, .navbar .navbar-nav .open > .dropdown-toggle:hover,
+.navbar-nav .active > .nav-link,
+.navbar-nav .navbar .active > .dropdown-toggle, .navbar
+.navbar-nav .active > .dropdown-toggle,
+.navbar-nav .active > .nav-link:focus,
+.navbar-nav .navbar .active > .dropdown-toggle:focus, .navbar
+.navbar-nav .active > .dropdown-toggle:focus,
+.navbar-nav .active > .nav-link:hover,
+.navbar-nav .navbar .active > .dropdown-toggle:hover, .navbar
+.navbar-nav .active > .dropdown-toggle:hover,
+.navbar-nav .nav-link.open,
+.navbar-nav .navbar .open.dropdown-toggle, .navbar
+.navbar-nav .open.dropdown-toggle,
+.navbar-nav .nav-link.open:focus,
+.navbar-nav .navbar .open.dropdown-toggle:focus, .navbar
+.navbar-nav .open.dropdown-toggle:focus,
+.navbar-nav .nav-link.open:hover,
+.navbar-nav .navbar .open.dropdown-toggle:hover, .navbar
+.navbar-nav .open.dropdown-toggle:hover,
+.navbar-nav .nav-link.active,
+.navbar-nav .navbar .active.dropdown-toggle, .navbar
+.navbar-nav .active.dropdown-toggle,
+.navbar-nav .nav-link.active:focus,
+.navbar-nav .navbar .active.dropdown-toggle:focus, .navbar
+.navbar-nav .active.dropdown-toggle:focus,
+.navbar-nav .nav-link.active:hover,
+.navbar-nav .navbar .active.dropdown-toggle:hover, .navbar
+.navbar-nav .active.dropdown-toggle:hover {
+  color: rgba(0, 0, 0, 0.8); }
+
+.navbar-divider {
+  background-color: rgba(0, 0, 0, 0.075); }
+
+.card {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  background-color: #fff;
+  border: 1px solid #cfd8dc; }
+
+.card-block {
+  flex: 1 1 auto;
+  padding: 1.25rem; }
+
+.card-title {
+  margin-bottom: 0.75rem; }
+
+.card-subtitle {
+  margin-top: -0.375rem;
+  margin-bottom: 0; }
+
+.card-text:last-child {
+  margin-bottom: 0; }
+
+.card-link:hover {
+  text-decoration: none; }
+
+.card-link + .card-link {
+  margin-left: 1.25rem; }
+
+.card-header {
+  padding: 0.75rem 1.25rem;
+  margin-bottom: 0;
+  background-color: #eceff1;
+  border-bottom: 1px solid #cfd8dc; }
+
+.card-footer {
+  padding: 0.75rem 1.25rem;
+  background-color: #eceff1;
+  border-top: 1px solid #cfd8dc; }
+
+.card-header-tabs {
+  margin-right: -0.625rem;
+  margin-bottom: -0.75rem;
+  margin-left: -0.625rem;
+  border-bottom: 0; }
+
+.card-header-pills {
+  margin-right: -0.625rem;
+  margin-left: -0.625rem; }
+
+.card-primary {
+  background-color: #20a8d8;
+  border-color: #20a8d8; }
+  .card-primary .card-header,
+  .card-primary .card-footer {
+    background-color: transparent; }
+
+.card-success {
+  background-color: #4dbd74;
+  border-color: #4dbd74; }
+  .card-success .card-header,
+  .card-success .card-footer {
+    background-color: transparent; }
+
+.card-info {
+  background-color: #63c2de;
+  border-color: #63c2de; }
+  .card-info .card-header,
+  .card-info .card-footer {
+    background-color: transparent; }
+
+.card-warning {
+  background-color: #f8cb00;
+  border-color: #f8cb00; }
+  .card-warning .card-header,
+  .card-warning .card-footer {
+    background-color: transparent; }
+
+.card-danger {
+  background-color: #f86c6b;
+  border-color: #f86c6b; }
+  .card-danger .card-header,
+  .card-danger .card-footer {
+    background-color: transparent; }
+
+.card-outline-primary {
+  background-color: transparent;
+  border-color: #20a8d8; }
+
+.card-outline-secondary {
+  background-color: transparent;
+  border-color: #b0bec5; }
+
+.card-outline-info {
+  background-color: transparent;
+  border-color: #63c2de; }
+
+.card-outline-success {
+  background-color: transparent;
+  border-color: #4dbd74; }
+
+.card-outline-warning {
+  background-color: transparent;
+  border-color: #f8cb00; }
+
+.card-outline-danger {
+  background-color: transparent;
+  border-color: #f86c6b; }
+
+.card-inverse {
+  color: rgba(255, 255, 255, 0.65); }
+  .card-inverse .card-header,
+  .card-inverse .card-footer {
+    background-color: transparent;
+    border-color: rgba(255, 255, 255, 0.2); }
+  .card-inverse .card-header,
+  .card-inverse .card-footer,
+  .card-inverse .card-title,
+  .card-inverse .card-blockquote {
+    color: #fff; }
+  .card-inverse .card-link,
+  .card-inverse .card-text,
+  .card-inverse .card-subtitle,
+  .card-inverse .card-blockquote .blockquote-footer {
+    color: rgba(255, 255, 255, 0.65); }
+  .card-inverse .card-link:focus, .card-inverse .card-link:hover {
+    color: #fff; }
+
+.card-blockquote {
+  padding: 0;
+  margin-bottom: 0;
+  border-left: 0; }
+
+.card-img-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1.25rem; }
+
+@media (min-width: 576px) {
+  .card-deck {
+    display: flex;
+    flex-flow: row wrap; }
+    .card-deck .card {
+      display: flex;
+      flex: 1 0 0;
+      flex-direction: column; }
+      .card-deck .card:not(:first-child) {
+        margin-left: 15px; }
+      .card-deck .card:not(:last-child) {
+        margin-right: 15px; } }
+
+@media (min-width: 576px) {
+  .card-group {
+    display: flex;
+    flex-flow: row wrap; }
+    .card-group .card {
+      flex: 1 0 0; }
+      .card-group .card + .card {
+        margin-left: 0;
+        border-left: 0; } }
+
+@media (min-width: 576px) {
+  .card-columns {
+    column-count: 3;
+    column-gap: 1.25rem; }
+    .card-columns .card {
+      display: inline-block;
+      width: 100%;
+      margin-bottom: 0.75rem; } }
+
+.card {
+  margin-bottom: 1.5rem; }
+
+.card-header i.icon-bg {
+  display: inline-block;
+  padding: 0.75rem 1.25rem !important;
+  margin-top: -0.75rem;
+  margin-right: 1.25rem;
+  margin-bottom: -0.75rem;
+  margin-left: -1.25rem;
+  line-height: inherit;
+  color: #263238;
+  vertical-align: bottom;
+  background: transparent;
+  border-right: 1px solid #cfd8dc; }
+
+.card-header ul.nav.nav-tabs {
+  margin-top: -0.75rem;
+  margin-bottom: -0.75rem;
+  border-bottom: 0; }
+  .card-header ul.nav.nav-tabs li.nav-item {
+    border-top: 0; }
+    .card-header ul.nav.nav-tabs li.nav-item a.nav-link, .card-header ul.nav.nav-tabs li.nav-item .navbar a.dropdown-toggle, .navbar .card-header ul.nav.nav-tabs li.nav-item a.dropdown-toggle {
+      padding: 0.75rem 0.625rem;
+      color: #b0bec5;
+      border-top: 0; }
+      .card-header ul.nav.nav-tabs li.nav-item a.nav-link.active, .card-header ul.nav.nav-tabs li.nav-item .navbar a.active.dropdown-toggle, .navbar .card-header ul.nav.nav-tabs li.nav-item a.active.dropdown-toggle {
+        color: #263238;
+        background: #fff; }
+
+.card-header.card-header-inverse {
+  color: #fff; }
+
+.card-header.card-header-primary {
+  margin: -1px -1px 0;
+  background: #20a8d8;
+  border-bottom: 1px solid #20a8d8; }
+
+.card-header.card-header-secondary {
+  margin: -1px -1px 0;
+  background: #cfd8dc;
+  border-bottom: 1px solid #cfd8dc; }
+
+.card-header.card-header-success {
+  margin: -1px -1px 0;
+  background: #4dbd74;
+  border-bottom: 1px solid #4dbd74; }
+
+.card-header.card-header-info {
+  margin: -1px -1px 0;
+  background: #63c2de;
+  border-bottom: 1px solid #63c2de; }
+
+.card-header.card-header-warning {
+  margin: -1px -1px 0;
+  background: #f8cb00;
+  border-bottom: 1px solid #f8cb00; }
+
+.card-header.card-header-danger {
+  margin: -1px -1px 0;
+  background: #f86c6b;
+  border-bottom: 1px solid #f86c6b; }
+
+.card-header .btn {
+  margin-top: -0.5rem; }
+
+.card-header .btn-sm, .card-header .btn-group-sm > .btn {
+  margin-top: -0.25rem; }
+
+.card-header .btn-lg, .card-header .btn-group-lg > .btn {
+  margin-top: -0.75rem; }
+
+.card-footer ul {
+  display: table;
+  width: 100%;
+  padding: 0;
+  margin: 0;
+  table-layout: fixed; }
+  .card-footer ul li {
+    display: table-cell;
+    padding: 0 1.25rem;
+    text-align: center; }
+    .card-footer ul li progress {
+      margin-top: 0.75rem;
+      margin-bottom: 0; }
+
+.card-primary {
+  background-color: #20a8d8; }
+  .card-primary .card-header {
+    border-color: #1d97c2; }
+  .card-primary .card-header, .card-primary .card-footer {
+    background-color: #1d97c2; }
+
+.card-secondary {
+  background-color: #cfd8dc; }
+  .card-secondary .card-header {
+    border-color: #c0ccd1; }
+  .card-secondary .card-header, .card-secondary .card-footer {
+    background-color: #c0ccd1; }
+
+.card-success {
+  background-color: #4dbd74; }
+  .card-success .card-header {
+    border-color: #41af67; }
+  .card-success .card-header, .card-success .card-footer {
+    background-color: #41af67; }
+
+.card-info {
+  background-color: #63c2de; }
+  .card-info .card-header {
+    border-color: #4ebada; }
+  .card-info .card-header, .card-info .card-footer {
+    background-color: #4ebada; }
+
+.card-warning {
+  background-color: #f8cb00; }
+  .card-warning .card-header {
+    border-color: #dfb600; }
+  .card-warning .card-header, .card-warning .card-footer {
+    background-color: #dfb600; }
+
+.card-danger {
+  background-color: #f86c6b; }
+  .card-danger .card-header {
+    border-color: #f75453; }
+  .card-danger .card-header, .card-danger .card-footer {
+    background-color: #f75453; }
+
+.card-inverse {
+  color: #fff; }
+  .card-inverse .text-muted {
+    color: rgba(255, 255, 255, 0.6) !important; }
+
+[class*="card-outline-"] .card-block {
+  background: #fff !important; }
+
+[class*="card-outline-"].card-outline-top {
+  border-top-width: 2px;
+  border-right-color: #cfd8dc;
+  border-bottom-color: #cfd8dc;
+  border-left-color: #cfd8dc; }
+
+.card-accent-primary {
+  border-top-width: 2px;
+  border-top-color: #20a8d8; }
+
+.card-accent-secondary {
+  border-top-width: 2px;
+  border-top-color: #b0bec5; }
+
+.card-accent-info {
+  border-top-width: 2px;
+  border-top-color: #63c2de; }
+
+.card-accent-success {
+  border-top-width: 2px;
+  border-top-color: #4dbd74; }
+
+.card-accent-warning {
+  border-top-width: 2px;
+  border-top-color: #f8cb00; }
+
+.card-accent-danger {
+  border-top-width: 2px;
+  border-top-color: #f86c6b; }
+
+.card-header > i {
+  margin-right: 0.5rem; }
+
+.card-header .card-actions {
+  position: absolute;
+  top: 0;
+  right: 0; }
+  .card-header .card-actions a, .card-header .card-actions button {
+    display: block;
+    float: left;
+    width: 50px;
+    padding: 0.75rem 0;
+    margin: 0 !important;
+    color: #263238;
+    text-align: center;
+    background: transparent;
+    border: 0;
+    border-left: 1px solid #cfd8dc;
+    box-shadow: 0; }
+    .card-header .card-actions a:hover, .card-header .card-actions button:hover {
+      text-decoration: none; }
+    .card-header .card-actions a [class^="icon-"], .card-header .card-actions a [class*=" icon-"], .card-header .card-actions button [class^="icon-"], .card-header .card-actions button [class*=" icon-"] {
+      display: inline-block;
+      vertical-align: middle; }
+    .card-header .card-actions a i, .card-header .card-actions button i {
+      display: inline-block;
+      transition: .4s; }
+    .card-header .card-actions a i.r180, .card-header .card-actions button i.r180 {
+      -webkit-transform: rotate(180deg);
+      transform: rotate(180deg); }
+  .card-header .card-actions .input-group {
+    width: 230px;
+    margin: 6px; }
+    .card-header .card-actions .input-group .input-group-addon {
+      background: #fff; }
+    .card-header .card-actions .input-group input {
+      border-left: 0; }
+
+.card-full {
+  margin-top: -1rem;
+  margin-right: -15px;
+  margin-left: -15px;
+  border: 0;
+  border-bottom: 1px solid #cfd8dc; }
+
+@media (min-width: 576px) {
+  .card-columns.cols-2 {
+    -moz-column-count: 2;
+    -webkit-column-count: 2;
+    column-count: 2; } }
+
+.card.drag, .card .drag {
+  cursor: move; }
+
+.card-placeholder {
+  background: rgba(0, 0, 0, 0.025);
+  border: 1px dashed #b0bec5; }
+
+.breadcrumb {
+  padding: 0.75rem 1rem;
+  margin-bottom: 1rem;
+  list-style: none;
+  background-color: #fff; }
+  .breadcrumb::after {
+    display: block;
+    content: "";
+    clear: both; }
+
+.breadcrumb-item {
+  float: left; }
+  .breadcrumb-item + .breadcrumb-item::before {
+    display: inline-block;
+    padding-right: 0.5rem;
+    padding-left: 0.5rem;
+    color: #b0bec5;
+    content: "/"; }
+  .breadcrumb-item + .breadcrumb-item:hover::before {
+    text-decoration: underline; }
+  .breadcrumb-item + .breadcrumb-item:hover::before {
+    text-decoration: none; }
+  .breadcrumb-item.active {
+    color: #b0bec5; }
+
+.breadcrumb {
+  position: relative;
+  margin-bottom: 1.5rem;
+  border-bottom: 1px solid #cfd8dc; }
+
+.pagination {
+  display: flex;
+  padding-left: 0;
+  list-style: none; }
+
+.page-item:first-child .page-link, .pagination-datatables li:first-child .page-link, .pagination li:first-child .page-link, .page-item:first-child .pagination-datatables li a, .pagination-datatables li .page-item:first-child a, .pagination-datatables li:first-child a, .page-item:first-child .pagination li a, .pagination li .page-item:first-child a, .pagination li:first-child a {
+  margin-left: 0; }
+
+.page-item.active .page-link, .pagination-datatables li.active .page-link, .pagination li.active .page-link, .page-item.active .pagination-datatables li a, .pagination-datatables li .page-item.active a, .pagination-datatables li.active a, .page-item.active .pagination li a, .pagination li .page-item.active a, .pagination li.active a {
+  z-index: 2;
+  color: #fff;
+  background-color: #20a8d8;
+  border-color: #20a8d8; }
+
+.page-item.disabled .page-link, .pagination-datatables li.disabled .page-link, .pagination li.disabled .page-link, .page-item.disabled .pagination-datatables li a, .pagination-datatables li .page-item.disabled a, .pagination-datatables li.disabled a, .page-item.disabled .pagination li a, .pagination li .page-item.disabled a, .pagination li.disabled a {
+  color: #b0bec5;
+  pointer-events: none;
+  cursor: not-allowed;
+  background-color: #fff;
+  border-color: #ddd; }
+
+.page-link, .pagination-datatables li a, .pagination li a {
+  position: relative;
+  display: block;
+  padding: 0.5rem 0.75rem;
+  margin-left: -1px;
+  line-height: 1.25;
+  color: #20a8d8;
+  background-color: #fff;
+  border: 1px solid #ddd; }
+  .page-link:focus, .pagination-datatables li a:focus, .pagination li a:focus, .page-link:hover, .pagination-datatables li a:hover, .pagination li a:hover {
+    color: #167495;
+    text-decoration: none;
+    background-color: #cfd8dc;
+    border-color: #ddd; }
+
+.pagination-lg .page-link, .pagination-lg .pagination-datatables li a, .pagination-datatables li .pagination-lg a, .pagination-lg .pagination li a, .pagination li .pagination-lg a {
+  padding: 0.75rem 1.5rem;
+  font-size: 1.25rem; }
+
+.pagination-sm .page-link, .pagination-sm .pagination-datatables li a, .pagination-datatables li .pagination-sm a, .pagination-sm .pagination li a, .pagination li .pagination-sm a {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem; }
+
+.badge {
+  display: inline-block;
+  padding: 0.25em 0.4em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline; }
+  .badge:empty {
+    display: none; }
+
+.btn .badge {
+  position: relative;
+  top: -1px; }
+
+a.badge:focus, a.badge:hover {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer; }
+
+.badge-pill {
+  padding-right: 0.6em;
+  padding-left: 0.6em; }
+
+.badge-default {
+  background-color: #b0bec5; }
+  .badge-default[href]:focus, .badge-default[href]:hover {
+    background-color: #93a6af; }
+
+.badge-primary {
+  background-color: #20a8d8; }
+  .badge-primary[href]:focus, .badge-primary[href]:hover {
+    background-color: #1985ac; }
+
+.badge-success {
+  background-color: #4dbd74; }
+  .badge-success[href]:focus, .badge-success[href]:hover {
+    background-color: #3a9d5d; }
+
+.badge-info {
+  background-color: #63c2de; }
+  .badge-info[href]:focus, .badge-info[href]:hover {
+    background-color: #39b2d5; }
+
+.badge-warning {
+  background-color: #f8cb00; }
+  .badge-warning[href]:focus, .badge-warning[href]:hover {
+    background-color: #c5a100; }
+
+.badge-danger {
+  background-color: #f86c6b; }
+  .badge-danger[href]:focus, .badge-danger[href]:hover {
+    background-color: #f63c3a; }
+
+.badge-pill {
+  border-radius: 10rem; }
+
+.alert {
+  padding: 0.75rem 1.25rem;
+  margin-bottom: 1rem;
+  border: 1px solid transparent; }
+
+.alert-heading {
+  color: inherit; }
+
+.alert-link {
+  font-weight: bold; }
+
+.alert-dismissible .close {
+  position: relative;
+  top: -0.75rem;
+  right: -1.25rem;
+  padding: 0.75rem 1.25rem;
+  color: inherit; }
+
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d0e9c6;
+  color: #3c763d; }
+  .alert-success hr {
+    border-top-color: #c1e2b3; }
+  .alert-success .alert-link {
+    color: #2b542c; }
+
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bcdff1;
+  color: #31708f; }
+  .alert-info hr {
+    border-top-color: #a6d5ec; }
+  .alert-info .alert-link {
+    color: #245269; }
+
+.alert-warning {
+  background-color: #fcf8e3;
+  border-color: #faf2cc;
+  color: #8a6d3b; }
+  .alert-warning hr {
+    border-top-color: #f7ecb5; }
+  .alert-warning .alert-link {
+    color: #66512c; }
+
+.alert-danger {
+  background-color: #f2dede;
+  border-color: #ebcccc;
+  color: #a94442; }
+  .alert-danger hr {
+    border-top-color: #e4b9b9; }
+  .alert-danger .alert-link {
+    color: #843534; }
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 1rem 0; }
+  to {
+    background-position: 0 0; } }
+
+.progress {
+  display: flex;
+  overflow: hidden;
+  font-size: 0.75rem;
+  line-height: 1rem;
+  text-align: center;
+  background-color: #eceff1; }
+
+.progress-bar {
+  height: 1rem;
+  color: #fff;
+  background-color: #20a8d8; }
+
+.progress-bar-striped {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-size: 1rem 1rem; }
+
+.progress-bar-animated {
+  animation: progress-bar-stripes 1s linear infinite; }
+
+.progress-xs {
+  height: 4px; }
+
+.progress-sm {
+  height: 8px; }
+
+.progress-white {
+  background-color: rgba(255, 255, 255, 0.2) !important; }
+  .progress-white .progress-bar {
+    background-color: #fff; }
+
+.media {
+  display: flex;
+  align-items: flex-start; }
+
+.media-body {
+  flex: 1; }
+
+.list-group {
+  display: flex;
+  flex-direction: column;
+  padding-left: 0;
+  margin-bottom: 0; }
+
+.list-group-item-action {
+  width: 100%;
+  color: #607d8b;
+  text-align: inherit; }
+  .list-group-item-action .list-group-item-heading {
+    color: #263238; }
+  .list-group-item-action:focus, .list-group-item-action:hover {
+    color: #607d8b;
+    text-decoration: none;
+    background-color: #eceff1; }
+  .list-group-item-action:active {
+    color: #263238;
+    background-color: #cfd8dc; }
+
+.list-group-item {
+  position: relative;
+  display: flex;
+  flex-flow: row wrap;
+  align-items: center;
+  padding: 0.75rem 1.25rem;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid rgba(0, 0, 0, 0.125); }
+  .list-group-item:last-child {
+    margin-bottom: 0; }
+  .list-group-item:focus, .list-group-item:hover {
+    text-decoration: none; }
+  .list-group-item.disabled, .list-group-item:disabled {
+    color: #b0bec5;
+    cursor: not-allowed;
+    background-color: #fff; }
+    .list-group-item.disabled .list-group-item-heading, .list-group-item:disabled .list-group-item-heading {
+      color: inherit; }
+    .list-group-item.disabled .list-group-item-text, .list-group-item:disabled .list-group-item-text {
+      color: #b0bec5; }
+  .list-group-item.active {
+    z-index: 2;
+    color: #fff;
+    background-color: #20a8d8;
+    border-color: #20a8d8; }
+    .list-group-item.active .list-group-item-heading,
+    .list-group-item.active .list-group-item-heading > small,
+    .list-group-item.active .list-group-item-heading > .small {
+      color: inherit; }
+    .list-group-item.active .list-group-item-text {
+      color: #f9fdfe; }
+
+.list-group-flush .list-group-item {
+  border-right: 0;
+  border-left: 0;
+  border-radius: 0; }
+
+.list-group-flush:first-child .list-group-item:first-child {
+  border-top: 0; }
+
+.list-group-flush:last-child .list-group-item:last-child {
+  border-bottom: 0; }
+
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8; }
+
+a.list-group-item-success,
+button.list-group-item-success {
+  color: #3c763d; }
+  a.list-group-item-success .list-group-item-heading,
+  button.list-group-item-success .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-success:focus, a.list-group-item-success:hover,
+  button.list-group-item-success:focus,
+  button.list-group-item-success:hover {
+    color: #3c763d;
+    background-color: #d0e9c6; }
+  a.list-group-item-success.active,
+  button.list-group-item-success.active {
+    color: #fff;
+    background-color: #3c763d;
+    border-color: #3c763d; }
+
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7; }
+
+a.list-group-item-info,
+button.list-group-item-info {
+  color: #31708f; }
+  a.list-group-item-info .list-group-item-heading,
+  button.list-group-item-info .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-info:focus, a.list-group-item-info:hover,
+  button.list-group-item-info:focus,
+  button.list-group-item-info:hover {
+    color: #31708f;
+    background-color: #c4e3f3; }
+  a.list-group-item-info.active,
+  button.list-group-item-info.active {
+    color: #fff;
+    background-color: #31708f;
+    border-color: #31708f; }
+
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3; }
+
+a.list-group-item-warning,
+button.list-group-item-warning {
+  color: #8a6d3b; }
+  a.list-group-item-warning .list-group-item-heading,
+  button.list-group-item-warning .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-warning:focus, a.list-group-item-warning:hover,
+  button.list-group-item-warning:focus,
+  button.list-group-item-warning:hover {
+    color: #8a6d3b;
+    background-color: #faf2cc; }
+  a.list-group-item-warning.active,
+  button.list-group-item-warning.active {
+    color: #fff;
+    background-color: #8a6d3b;
+    border-color: #8a6d3b; }
+
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede; }
+
+a.list-group-item-danger,
+button.list-group-item-danger {
+  color: #a94442; }
+  a.list-group-item-danger .list-group-item-heading,
+  button.list-group-item-danger .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-danger:focus, a.list-group-item-danger:hover,
+  button.list-group-item-danger:focus,
+  button.list-group-item-danger:hover {
+    color: #a94442;
+    background-color: #ebcccc; }
+  a.list-group-item-danger.active,
+  button.list-group-item-danger.active {
+    color: #fff;
+    background-color: #a94442;
+    border-color: #a94442; }
+
+.embed-responsive {
+  position: relative;
+  display: block;
+  width: 100%;
+  padding: 0;
+  overflow: hidden; }
+  .embed-responsive::before {
+    display: block;
+    content: ""; }
+  .embed-responsive .embed-responsive-item,
+  .embed-responsive iframe,
+  .embed-responsive embed,
+  .embed-responsive object,
+  .embed-responsive video {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    border: 0; }
+
+.embed-responsive-21by9::before {
+  padding-top: 42.85714%; }
+
+.embed-responsive-16by9::before {
+  padding-top: 56.25%; }
+
+.embed-responsive-4by3::before {
+  padding-top: 75%; }
+
+.embed-responsive-1by1::before {
+  padding-top: 100%; }
+
+.close {
+  float: right;
+  font-size: 1.3125rem;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  opacity: .5; }
+  .close:focus, .close:hover {
+    color: #000;
+    text-decoration: none;
+    cursor: pointer;
+    opacity: .75; }
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none; }
+
+.modal-open {
+  overflow: hidden; }
+
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  outline: 0; }
+  .modal.fade .modal-dialog {
+    transition: transform 0.3s ease-out;
+    transform: translate(0, -25%); }
+  .modal.show .modal-dialog {
+    transform: translate(0, 0); }
+
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto; }
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px; }
+
+.modal-content {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  outline: 0; }
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000; }
+  .modal-backdrop.fade {
+    opacity: 0; }
+  .modal-backdrop.show {
+    opacity: 0.5; }
+
+.modal-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 15px;
+  border-bottom: 1px solid #cfd8dc; }
+
+.modal-title {
+  margin-bottom: 0;
+  line-height: 1.5; }
+
+.modal-body {
+  position: relative;
+  flex: 1 1 auto;
+  padding: 15px; }
+
+.modal-footer {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  padding: 15px;
+  border-top: 1px solid #cfd8dc; }
+  .modal-footer > :not(:first-child) {
+    margin-left: .25rem; }
+  .modal-footer > :not(:last-child) {
+    margin-right: .25rem; }
+
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll; }
+
+@media (min-width: 576px) {
+  .modal-dialog {
+    max-width: 500px;
+    margin: 30px auto; }
+  .modal-sm {
+    max-width: 300px; } }
+
+@media (min-width: 992px) {
+  .modal-lg {
+    max-width: 800px; } }
+
+.modal-primary .modal-content {
+  border-color: #20a8d8; }
+
+.modal-primary .modal-header {
+  color: #fff;
+  background-color: #20a8d8; }
+
+.modal-secondary .modal-content {
+  border-color: #cfd8dc; }
+
+.modal-secondary .modal-header {
+  color: #fff;
+  background-color: #cfd8dc; }
+
+.modal-success .modal-content {
+  border-color: #4dbd74; }
+
+.modal-success .modal-header {
+  color: #fff;
+  background-color: #4dbd74; }
+
+.modal-info .modal-content {
+  border-color: #63c2de; }
+
+.modal-info .modal-header {
+  color: #fff;
+  background-color: #63c2de; }
+
+.modal-warning .modal-content {
+  border-color: #f8cb00; }
+
+.modal-warning .modal-header {
+  color: #fff;
+  background-color: #f8cb00; }
+
+.modal-danger .modal-content {
+  border-color: #f86c6b; }
+
+.modal-danger .modal-header {
+  color: #fff;
+  background-color: #f86c6b; }
+
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  font-size: 0.875rem;
+  word-wrap: break-word;
+  opacity: 0; }
+  .tooltip.show {
+    opacity: 0.9; }
+  .tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {
+    padding: 5px 0;
+    margin-top: -3px; }
+    .tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {
+      bottom: 0;
+      left: 50%;
+      margin-left: -5px;
+      content: "";
+      border-width: 5px 5px 0;
+      border-top-color: #000; }
+  .tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {
+    padding: 0 5px;
+    margin-left: 3px; }
+    .tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {
+      top: 50%;
+      left: 0;
+      margin-top: -5px;
+      content: "";
+      border-width: 5px 5px 5px 0;
+      border-right-color: #000; }
+  .tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {
+    padding: 5px 0;
+    margin-top: 3px; }
+    .tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {
+      top: 0;
+      left: 50%;
+      margin-left: -5px;
+      content: "";
+      border-width: 0 5px 5px;
+      border-bottom-color: #000; }
+  .tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {
+    padding: 0 5px;
+    margin-left: -3px; }
+    .tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {
+      top: 50%;
+      right: 0;
+      margin-top: -5px;
+      content: "";
+      border-width: 5px 0 5px 5px;
+      border-left-color: #000; }
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #fff;
+  text-align: center;
+  background-color: #000; }
+  .tooltip-inner::before {
+    position: absolute;
+    width: 0;
+    height: 0;
+    border-color: transparent;
+    border-style: solid; }
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: block;
+  max-width: 276px;
+  padding: 1px;
+  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  font-size: 0.875rem;
+  word-wrap: break-word;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.2); }
+  .popover.popover-top, .popover.bs-tether-element-attached-bottom {
+    margin-top: -10px; }
+    .popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {
+      left: 50%;
+      border-bottom-width: 0; }
+    .popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {
+      bottom: -11px;
+      margin-left: -11px;
+      border-top-color: rgba(0, 0, 0, 0.25); }
+    .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {
+      bottom: -10px;
+      margin-left: -10px;
+      border-top-color: #fff; }
+  .popover.popover-right, .popover.bs-tether-element-attached-left {
+    margin-left: 10px; }
+    .popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {
+      top: 50%;
+      border-left-width: 0; }
+    .popover.popover-right::before, .popover.bs-tether-element-attached-left::before {
+      left: -11px;
+      margin-top: -11px;
+      border-right-color: rgba(0, 0, 0, 0.25); }
+    .popover.popover-right::after, .popover.bs-tether-element-attached-left::after {
+      left: -10px;
+      margin-top: -10px;
+      border-right-color: #fff; }
+  .popover.popover-bottom, .popover.bs-tether-element-attached-top {
+    margin-top: 10px; }
+    .popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {
+      left: 50%;
+      border-top-width: 0; }
+    .popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {
+      top: -11px;
+      margin-left: -11px;
+      border-bottom-color: rgba(0, 0, 0, 0.25); }
+    .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {
+      top: -10px;
+      margin-left: -10px;
+      border-bottom-color: #f7f7f7; }
+    .popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {
+      position: absolute;
+      top: 0;
+      left: 50%;
+      display: block;
+      width: 20px;
+      margin-left: -10px;
+      content: "";
+      border-bottom: 1px solid #f7f7f7; }
+  .popover.popover-left, .popover.bs-tether-element-attached-right {
+    margin-left: -10px; }
+    .popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {
+      top: 50%;
+      border-right-width: 0; }
+    .popover.popover-left::before, .popover.bs-tether-element-attached-right::before {
+      right: -11px;
+      margin-top: -11px;
+      border-left-color: rgba(0, 0, 0, 0.25); }
+    .popover.popover-left::after, .popover.bs-tether-element-attached-right::after {
+      right: -10px;
+      margin-top: -10px;
+      border-left-color: #fff; }
+
+.popover-title {
+  padding: 8px 14px;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb; }
+  .popover-title:empty {
+    display: none; }
+
+.popover-content {
+  padding: 9px 14px; }
+
+.popover::before,
+.popover::after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid; }
+
+.popover::before {
+  content: "";
+  border-width: 11px; }
+
+.popover::after {
+  content: "";
+  border-width: 10px; }
+
+.carousel {
+  position: relative; }
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden; }
+
+.carousel-item {
+  position: relative;
+  display: none;
+  width: 100%; }
+  @media (-webkit-transform-3d) {
+    .carousel-item {
+      transition: transform 0.6s ease-in-out;
+      backface-visibility: hidden;
+      perspective: 1000px; } }
+  @supports (transform: translate3d(0, 0, 0)) {
+    .carousel-item {
+      transition: transform 0.6s ease-in-out;
+      backface-visibility: hidden;
+      perspective: 1000px; } }
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+  display: flex; }
+
+.carousel-item-next,
+.carousel-item-prev {
+  position: absolute;
+  top: 0; }
+
+@media (-webkit-transform-3d) {
+  .carousel-item-next.carousel-item-left,
+  .carousel-item-prev.carousel-item-right {
+    transform: translate3d(0, 0, 0); }
+  .carousel-item-next,
+  .active.carousel-item-right {
+    transform: translate3d(100%, 0, 0); }
+  .carousel-item-prev,
+  .active.carousel-item-left {
+    transform: translate3d(-100%, 0, 0); } }
+
+@supports (transform: translate3d(0, 0, 0)) {
+  .carousel-item-next.carousel-item-left,
+  .carousel-item-prev.carousel-item-right {
+    transform: translate3d(0, 0, 0); }
+  .carousel-item-next,
+  .active.carousel-item-right {
+    transform: translate3d(100%, 0, 0); }
+  .carousel-item-prev,
+  .active.carousel-item-left {
+    transform: translate3d(-100%, 0, 0); } }
+
+.carousel-control-prev,
+.carousel-control-next {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 15%;
+  color: #fff;
+  text-align: center;
+  opacity: 0.5; }
+  .carousel-control-prev:focus, .carousel-control-prev:hover,
+  .carousel-control-next:focus,
+  .carousel-control-next:hover {
+    color: #fff;
+    text-decoration: none;
+    outline: 0;
+    opacity: .9; }
+
+.carousel-control-prev {
+  left: 0; }
+
+.carousel-control-next {
+  right: 0; }
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  background: transparent no-repeat center center;
+  background-size: 100% 100%; }
+
+.carousel-control-prev-icon {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); }
+
+.carousel-control-next-icon {
+  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); }
+
+.carousel-indicators {
+  position: absolute;
+  right: 0;
+  bottom: 10px;
+  left: 0;
+  z-index: 15;
+  display: flex;
+  justify-content: center;
+  padding-left: 0;
+  margin-right: 15%;
+  margin-left: 15%;
+  list-style: none; }
+  .carousel-indicators li {
+    position: relative;
+    flex: 1 0 auto;
+    max-width: 30px;
+    height: 3px;
+    margin-right: 3px;
+    margin-left: 3px;
+    text-indent: -999px;
+    cursor: pointer;
+    background-color: rgba(255, 255, 255, 0.5); }
+    .carousel-indicators li::before {
+      position: absolute;
+      top: -10px;
+      left: 0;
+      display: inline-block;
+      width: 100%;
+      height: 10px;
+      content: ""; }
+    .carousel-indicators li::after {
+      position: absolute;
+      bottom: -10px;
+      left: 0;
+      display: inline-block;
+      width: 100%;
+      height: 10px;
+      content: ""; }
+  .carousel-indicators .active {
+    background-color: #fff; }
+
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center; }
+
+.align-baseline {
+  vertical-align: baseline !important; }
+
+.align-top {
+  vertical-align: top !important; }
+
+.align-middle {
+  vertical-align: middle !important; }
+
+.align-bottom {
+  vertical-align: bottom !important; }
+
+.align-text-bottom {
+  vertical-align: text-bottom !important; }
+
+.align-text-top {
+  vertical-align: text-top !important; }
+
+.bg-faded {
+  background-color: #dcdddf; }
+
+.bg-primary {
+  color: #fff !important;
+  background-color: #20a8d8 !important; }
+
+a.bg-primary:focus, a.bg-primary:hover {
+  background-color: #1985ac; }
+
+.bg-success {
+  color: #fff !important;
+  background-color: #4dbd74 !important; }
+
+a.bg-success:focus, a.bg-success:hover {
+  background-color: #3a9d5d; }
+
+.bg-info {
+  color: #fff !important;
+  background-color: #63c2de !important; }
+
+a.bg-info:focus, a.bg-info:hover {
+  background-color: #39b2d5; }
+
+.bg-warning {
+  color: #fff !important;
+  background-color: #f8cb00 !important; }
+
+a.bg-warning:focus, a.bg-warning:hover {
+  background-color: #c5a100; }
+
+.bg-danger {
+  color: #fff !important;
+  background-color: #f86c6b !important; }
+
+a.bg-danger:focus, a.bg-danger:hover {
+  background-color: #f63c3a; }
+
+.bg-inverse {
+  color: #fff !important;
+  background-color: #263238 !important; }
+
+a.bg-inverse:focus, a.bg-inverse:hover {
+  background-color: #11171a; }
+
+.border-0 {
+  border: 0 !important; }
+
+.border-top-0 {
+  border-top: 0 !important; }
+
+.border-right-0 {
+  border-right: 0 !important; }
+
+.border-bottom-0 {
+  border-bottom: 0 !important; }
+
+.border-left-0 {
+  border-left: 0 !important; }
+
+.rounded-circle {
+  border-radius: 50%; }
+
+.rounded-0 {
+  border-radius: 0; }
+
+.clearfix::after {
+  display: block;
+  content: "";
+  clear: both; }
+
+.d-none {
+  display: none !important; }
+
+.d-inline {
+  display: inline !important; }
+
+.d-inline-block {
+  display: inline-block !important; }
+
+.d-block {
+  display: block !important; }
+
+.d-table {
+  display: table !important; }
+
+.d-table-cell {
+  display: table-cell !important; }
+
+.d-flex {
+  display: flex !important; }
+
+.d-inline-flex {
+  display: inline-flex !important; }
+
+@media (min-width: 576px) {
+  .d-sm-none {
+    display: none !important; }
+  .d-sm-inline {
+    display: inline !important; }
+  .d-sm-inline-block {
+    display: inline-block !important; }
+  .d-sm-block {
+    display: block !important; }
+  .d-sm-table {
+    display: table !important; }
+  .d-sm-table-cell {
+    display: table-cell !important; }
+  .d-sm-flex {
+    display: flex !important; }
+  .d-sm-inline-flex {
+    display: inline-flex !important; } }
+
+@media (min-width: 768px) {
+  .d-md-none {
+    display: none !important; }
+  .d-md-inline {
+    display: inline !important; }
+  .d-md-inline-block {
+    display: inline-block !important; }
+  .d-md-block {
+    display: block !important; }
+  .d-md-table {
+    display: table !important; }
+  .d-md-table-cell {
+    display: table-cell !important; }
+  .d-md-flex {
+    display: flex !important; }
+  .d-md-inline-flex {
+    display: inline-flex !important; } }
+
+@media (min-width: 992px) {
+  .d-lg-none {
+    display: none !important; }
+  .d-lg-inline {
+    display: inline !important; }
+  .d-lg-inline-block {
+    display: inline-block !important; }
+  .d-lg-block {
+    display: block !important; }
+  .d-lg-table {
+    display: table !important; }
+  .d-lg-table-cell {
+    display: table-cell !important; }
+  .d-lg-flex {
+    display: flex !important; }
+  .d-lg-inline-flex {
+    display: inline-flex !important; } }
+
+@media (min-width: 1200px) {
+  .d-xl-none {
+    display: none !important; }
+  .d-xl-inline {
+    display: inline !important; }
+  .d-xl-inline-block {
+    display: inline-block !important; }
+  .d-xl-block {
+    display: block !important; }
+  .d-xl-table {
+    display: table !important; }
+  .d-xl-table-cell {
+    display: table-cell !important; }
+  .d-xl-flex {
+    display: flex !important; }
+  .d-xl-inline-flex {
+    display: inline-flex !important; } }
+
+.flex-first {
+  order: -1; }
+
+.flex-last {
+  order: 1; }
+
+.flex-unordered {
+  order: 0; }
+
+.flex-row {
+  flex-direction: row !important; }
+
+.flex-column {
+  flex-direction: column !important; }
+
+.flex-row-reverse {
+  flex-direction: row-reverse !important; }
+
+.flex-column-reverse {
+  flex-direction: column-reverse !important; }
+
+.flex-wrap {
+  flex-wrap: wrap !important; }
+
+.flex-nowrap {
+  flex-wrap: nowrap !important; }
+
+.flex-wrap-reverse {
+  flex-wrap: wrap-reverse !important; }
+
+.justify-content-start {
+  justify-content: flex-start !important; }
+
+.justify-content-end {
+  justify-content: flex-end !important; }
+
+.justify-content-center {
+  justify-content: center !important; }
+
+.justify-content-between {
+  justify-content: space-between !important; }
+
+.justify-content-around {
+  justify-content: space-around !important; }
+
+.align-items-start {
+  align-items: flex-start !important; }
+
+.align-items-end {
+  align-items: flex-end !important; }
+
+.align-items-center {
+  align-items: center !important; }
+
+.align-items-baseline {
+  align-items: baseline !important; }
+
+.align-items-stretch {
+  align-items: stretch !important; }
+
+.align-content-start {
+  align-content: flex-start !important; }
+
+.align-content-end {
+  align-content: flex-end !important; }
+
+.align-content-center {
+  align-content: center !important; }
+
+.align-content-between {
+  align-content: space-between !important; }
+
+.align-content-around {
+  align-content: space-around !important; }
+
+.align-content-stretch {
+  align-content: stretch !important; }
+
+.align-self-auto {
+  align-self: auto !important; }
+
+.align-self-start {
+  align-self: flex-start !important; }
+
+.align-self-end {
+  align-self: flex-end !important; }
+
+.align-self-center {
+  align-self: center !important; }
+
+.align-self-baseline {
+  align-self: baseline !important; }
+
+.align-self-stretch {
+  align-self: stretch !important; }
+
+@media (min-width: 576px) {
+  .flex-sm-first {
+    order: -1; }
+  .flex-sm-last {
+    order: 1; }
+  .flex-sm-unordered {
+    order: 0; }
+  .flex-sm-row {
+    flex-direction: row !important; }
+  .flex-sm-column {
+    flex-direction: column !important; }
+  .flex-sm-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-sm-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-sm-wrap {
+    flex-wrap: wrap !important; }
+  .flex-sm-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-sm-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .justify-content-sm-start {
+    justify-content: flex-start !important; }
+  .justify-content-sm-end {
+    justify-content: flex-end !important; }
+  .justify-content-sm-center {
+    justify-content: center !important; }
+  .justify-content-sm-between {
+    justify-content: space-between !important; }
+  .justify-content-sm-around {
+    justify-content: space-around !important; }
+  .align-items-sm-start {
+    align-items: flex-start !important; }
+  .align-items-sm-end {
+    align-items: flex-end !important; }
+  .align-items-sm-center {
+    align-items: center !important; }
+  .align-items-sm-baseline {
+    align-items: baseline !important; }
+  .align-items-sm-stretch {
+    align-items: stretch !important; }
+  .align-content-sm-start {
+    align-content: flex-start !important; }
+  .align-content-sm-end {
+    align-content: flex-end !important; }
+  .align-content-sm-center {
+    align-content: center !important; }
+  .align-content-sm-between {
+    align-content: space-between !important; }
+  .align-content-sm-around {
+    align-content: space-around !important; }
+  .align-content-sm-stretch {
+    align-content: stretch !important; }
+  .align-self-sm-auto {
+    align-self: auto !important; }
+  .align-self-sm-start {
+    align-self: flex-start !important; }
+  .align-self-sm-end {
+    align-self: flex-end !important; }
+  .align-self-sm-center {
+    align-self: center !important; }
+  .align-self-sm-baseline {
+    align-self: baseline !important; }
+  .align-self-sm-stretch {
+    align-self: stretch !important; } }
+
+@media (min-width: 768px) {
+  .flex-md-first {
+    order: -1; }
+  .flex-md-last {
+    order: 1; }
+  .flex-md-unordered {
+    order: 0; }
+  .flex-md-row {
+    flex-direction: row !important; }
+  .flex-md-column {
+    flex-direction: column !important; }
+  .flex-md-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-md-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-md-wrap {
+    flex-wrap: wrap !important; }
+  .flex-md-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-md-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .justify-content-md-start {
+    justify-content: flex-start !important; }
+  .justify-content-md-end {
+    justify-content: flex-end !important; }
+  .justify-content-md-center {
+    justify-content: center !important; }
+  .justify-content-md-between {
+    justify-content: space-between !important; }
+  .justify-content-md-around {
+    justify-content: space-around !important; }
+  .align-items-md-start {
+    align-items: flex-start !important; }
+  .align-items-md-end {
+    align-items: flex-end !important; }
+  .align-items-md-center {
+    align-items: center !important; }
+  .align-items-md-baseline {
+    align-items: baseline !important; }
+  .align-items-md-stretch {
+    align-items: stretch !important; }
+  .align-content-md-start {
+    align-content: flex-start !important; }
+  .align-content-md-end {
+    align-content: flex-end !important; }
+  .align-content-md-center {
+    align-content: center !important; }
+  .align-content-md-between {
+    align-content: space-between !important; }
+  .align-content-md-around {
+    align-content: space-around !important; }
+  .align-content-md-stretch {
+    align-content: stretch !important; }
+  .align-self-md-auto {
+    align-self: auto !important; }
+  .align-self-md-start {
+    align-self: flex-start !important; }
+  .align-self-md-end {
+    align-self: flex-end !important; }
+  .align-self-md-center {
+    align-self: center !important; }
+  .align-self-md-baseline {
+    align-self: baseline !important; }
+  .align-self-md-stretch {
+    align-self: stretch !important; } }
+
+@media (min-width: 992px) {
+  .flex-lg-first {
+    order: -1; }
+  .flex-lg-last {
+    order: 1; }
+  .flex-lg-unordered {
+    order: 0; }
+  .flex-lg-row {
+    flex-direction: row !important; }
+  .flex-lg-column {
+    flex-direction: column !important; }
+  .flex-lg-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-lg-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-lg-wrap {
+    flex-wrap: wrap !important; }
+  .flex-lg-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-lg-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .justify-content-lg-start {
+    justify-content: flex-start !important; }
+  .justify-content-lg-end {
+    justify-content: flex-end !important; }
+  .justify-content-lg-center {
+    justify-content: center !important; }
+  .justify-content-lg-between {
+    justify-content: space-between !important; }
+  .justify-content-lg-around {
+    justify-content: space-around !important; }
+  .align-items-lg-start {
+    align-items: flex-start !important; }
+  .align-items-lg-end {
+    align-items: flex-end !important; }
+  .align-items-lg-center {
+    align-items: center !important; }
+  .align-items-lg-baseline {
+    align-items: baseline !important; }
+  .align-items-lg-stretch {
+    align-items: stretch !important; }
+  .align-content-lg-start {
+    align-content: flex-start !important; }
+  .align-content-lg-end {
+    align-content: flex-end !important; }
+  .align-content-lg-center {
+    align-content: center !important; }
+  .align-content-lg-between {
+    align-content: space-between !important; }
+  .align-content-lg-around {
+    align-content: space-around !important; }
+  .align-content-lg-stretch {
+    align-content: stretch !important; }
+  .align-self-lg-auto {
+    align-self: auto !important; }
+  .align-self-lg-start {
+    align-self: flex-start !important; }
+  .align-self-lg-end {
+    align-self: flex-end !important; }
+  .align-self-lg-center {
+    align-self: center !important; }
+  .align-self-lg-baseline {
+    align-self: baseline !important; }
+  .align-self-lg-stretch {
+    align-self: stretch !important; } }
+
+@media (min-width: 1200px) {
+  .flex-xl-first {
+    order: -1; }
+  .flex-xl-last {
+    order: 1; }
+  .flex-xl-unordered {
+    order: 0; }
+  .flex-xl-row {
+    flex-direction: row !important; }
+  .flex-xl-column {
+    flex-direction: column !important; }
+  .flex-xl-row-reverse {
+    flex-direction: row-reverse !important; }
+  .flex-xl-column-reverse {
+    flex-direction: column-reverse !important; }
+  .flex-xl-wrap {
+    flex-wrap: wrap !important; }
+  .flex-xl-nowrap {
+    flex-wrap: nowrap !important; }
+  .flex-xl-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+  .justify-content-xl-start {
+    justify-content: flex-start !important; }
+  .justify-content-xl-end {
+    justify-content: flex-end !important; }
+  .justify-content-xl-center {
+    justify-content: center !important; }
+  .justify-content-xl-between {
+    justify-content: space-between !important; }
+  .justify-content-xl-around {
+    justify-content: space-around !important; }
+  .align-items-xl-start {
+    align-items: flex-start !important; }
+  .align-items-xl-end {
+    align-items: flex-end !important; }
+  .align-items-xl-center {
+    align-items: center !important; }
+  .align-items-xl-baseline {
+    align-items: baseline !important; }
+  .align-items-xl-stretch {
+    align-items: stretch !important; }
+  .align-content-xl-start {
+    align-content: flex-start !important; }
+  .align-content-xl-end {
+    align-content: flex-end !important; }
+  .align-content-xl-center {
+    align-content: center !important; }
+  .align-content-xl-between {
+    align-content: space-between !important; }
+  .align-content-xl-around {
+    align-content: space-around !important; }
+  .align-content-xl-stretch {
+    align-content: stretch !important; }
+  .align-self-xl-auto {
+    align-self: auto !important; }
+  .align-self-xl-start {
+    align-self: flex-start !important; }
+  .align-self-xl-end {
+    align-self: flex-end !important; }
+  .align-self-xl-center {
+    align-self: center !important; }
+  .align-self-xl-baseline {
+    align-self: baseline !important; }
+  .align-self-xl-stretch {
+    align-self: stretch !important; } }
+
+.float-left {
+  float: left !important; }
+
+.float-right {
+  float: right !important; }
+
+.float-none {
+  float: none !important; }
+
+@media (min-width: 576px) {
+  .float-sm-left {
+    float: left !important; }
+  .float-sm-right {
+    float: right !important; }
+  .float-sm-none {
+    float: none !important; } }
+
+@media (min-width: 768px) {
+  .float-md-left {
+    float: left !important; }
+  .float-md-right {
+    float: right !important; }
+  .float-md-none {
+    float: none !important; } }
+
+@media (min-width: 992px) {
+  .float-lg-left {
+    float: left !important; }
+  .float-lg-right {
+    float: right !important; }
+  .float-lg-none {
+    float: none !important; } }
+
+@media (min-width: 1200px) {
+  .float-xl-left {
+    float: left !important; }
+  .float-xl-right {
+    float: right !important; }
+  .float-xl-none {
+    float: none !important; } }
+
+.fixed-top {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1030; }
+
+.fixed-bottom {
+  position: fixed;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1030; }
+
+.sticky-top {
+  position: sticky;
+  top: 0;
+  z-index: 1030; }
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto; }
+
+.w-25 {
+  width: 25% !important; }
+
+.w-50 {
+  width: 50% !important; }
+
+.w-75 {
+  width: 75% !important; }
+
+.w-100 {
+  width: 100% !important; }
+
+.h-25 {
+  height: 25% !important; }
+
+.h-50 {
+  height: 50% !important; }
+
+.h-75 {
+  height: 75% !important; }
+
+.h-100 {
+  height: 100% !important; }
+
+.mw-100 {
+  max-width: 100% !important; }
+
+.mh-100 {
+  max-height: 100% !important; }
+
+.m-q {
+  margin: 0.25rem 0.25rem !important; }
+
+.mt-q {
+  margin-top: 0.25rem !important; }
+
+.mr-q {
+  margin-right: 0.25rem !important; }
+
+.mb-q {
+  margin-bottom: 0.25rem !important; }
+
+.ml-q {
+  margin-left: 0.25rem !important; }
+
+.mx-q {
+  margin-right: 0.25rem !important;
+  margin-left: 0.25rem !important; }
+
+.my-q {
+  margin-top: 0.25rem !important;
+  margin-bottom: 0.25rem !important; }
+
+.m-h {
+  margin: 0.5rem 0.5rem !important; }
+
+.mt-h {
+  margin-top: 0.5rem !important; }
+
+.mr-h {
+  margin-right: 0.5rem !important; }
+
+.mb-h {
+  margin-bottom: 0.5rem !important; }
+
+.ml-h {
+  margin-left: 0.5rem !important; }
+
+.mx-h {
+  margin-right: 0.5rem !important;
+  margin-left: 0.5rem !important; }
+
+.my-h {
+  margin-top: 0.5rem !important;
+  margin-bottom: 0.5rem !important; }
+
+.m-0 {
+  margin: 0 0 !important; }
+
+.mt-0 {
+  margin-top: 0 !important; }
+
+.mr-0 {
+  margin-right: 0 !important; }
+
+.mb-0 {
+  margin-bottom: 0 !important; }
+
+.ml-0 {
+  margin-left: 0 !important; }
+
+.mx-0 {
+  margin-right: 0 !important;
+  margin-left: 0 !important; }
+
+.my-0 {
+  margin-top: 0 !important;
+  margin-bottom: 0 !important; }
+
+.m-1 {
+  margin: 1rem 1rem !important; }
+
+.mt-1 {
+  margin-top: 1rem !important; }
+
+.mr-1 {
+  margin-right: 1rem !important; }
+
+.mb-1 {
+  margin-bottom: 1rem !important; }
+
+.ml-1 {
+  margin-left: 1rem !important; }
+
+.mx-1 {
+  margin-right: 1rem !important;
+  margin-left: 1rem !important; }
+
+.my-1 {
+  margin-top: 1rem !important;
+  margin-bottom: 1rem !important; }
+
+.m-2 {
+  margin: 1.5rem 1.5rem !important; }
+
+.mt-2 {
+  margin-top: 1.5rem !important; }
+
+.mr-2 {
+  margin-right: 1.5rem !important; }
+
+.mb-2 {
+  margin-bottom: 1.5rem !important; }
+
+.ml-2 {
+  margin-left: 1.5rem !important; }
+
+.mx-2 {
+  margin-right: 1.5rem !important;
+  margin-left: 1.5rem !important; }
+
+.my-2 {
+  margin-top: 1.5rem !important;
+  margin-bottom: 1.5rem !important; }
+
+.m-3 {
+  margin: 3rem 3rem !important; }
+
+.mt-3 {
+  margin-top: 3rem !important; }
+
+.mr-3 {
+  margin-right: 3rem !important; }
+
+.mb-3 {
+  margin-bottom: 3rem !important; }
+
+.ml-3 {
+  margin-left: 3rem !important; }
+
+.mx-3 {
+  margin-right: 3rem !important;
+  margin-left: 3rem !important; }
+
+.my-3 {
+  margin-top: 3rem !important;
+  margin-bottom: 3rem !important; }
+
+.p-q {
+  padding: 0.25rem 0.25rem !important; }
+
+.pt-q {
+  padding-top: 0.25rem !important; }
+
+.pr-q {
+  padding-right: 0.25rem !important; }
+
+.pb-q {
+  padding-bottom: 0.25rem !important; }
+
+.pl-q {
+  padding-left: 0.25rem !important; }
+
+.px-q {
+  padding-right: 0.25rem !important;
+  padding-left: 0.25rem !important; }
+
+.py-q {
+  padding-top: 0.25rem !important;
+  padding-bottom: 0.25rem !important; }
+
+.p-h {
+  padding: 0.5rem 0.5rem !important; }
+
+.pt-h {
+  padding-top: 0.5rem !important; }
+
+.pr-h {
+  padding-right: 0.5rem !important; }
+
+.pb-h {
+  padding-bottom: 0.5rem !important; }
+
+.pl-h {
+  padding-left: 0.5rem !important; }
+
+.px-h {
+  padding-right: 0.5rem !important;
+  padding-left: 0.5rem !important; }
+
+.py-h {
+  padding-top: 0.5rem !important;
+  padding-bottom: 0.5rem !important; }
+
+.p-0 {
+  padding: 0 0 !important; }
+
+.pt-0 {
+  padding-top: 0 !important; }
+
+.pr-0 {
+  padding-right: 0 !important; }
+
+.pb-0 {
+  padding-bottom: 0 !important; }
+
+.pl-0 {
+  padding-left: 0 !important; }
+
+.px-0 {
+  padding-right: 0 !important;
+  padding-left: 0 !important; }
+
+.py-0 {
+  padding-top: 0 !important;
+  padding-bottom: 0 !important; }
+
+.p-1 {
+  padding: 1rem 1rem !important; }
+
+.pt-1 {
+  padding-top: 1rem !important; }
+
+.pr-1 {
+  padding-right: 1rem !important; }
+
+.pb-1 {
+  padding-bottom: 1rem !important; }
+
+.pl-1 {
+  padding-left: 1rem !important; }
+
+.px-1 {
+  padding-right: 1rem !important;
+  padding-left: 1rem !important; }
+
+.py-1 {
+  padding-top: 1rem !important;
+  padding-bottom: 1rem !important; }
+
+.p-2 {
+  padding: 1.5rem 1.5rem !important; }
+
+.pt-2 {
+  padding-top: 1.5rem !important; }
+
+.pr-2 {
+  padding-right: 1.5rem !important; }
+
+.pb-2 {
+  padding-bottom: 1.5rem !important; }
+
+.pl-2 {
+  padding-left: 1.5rem !important; }
+
+.px-2 {
+  padding-right: 1.5rem !important;
+  padding-left: 1.5rem !important; }
+
+.py-2 {
+  padding-top: 1.5rem !important;
+  padding-bottom: 1.5rem !important; }
+
+.p-3 {
+  padding: 3rem 3rem !important; }
+
+.pt-3 {
+  padding-top: 3rem !important; }
+
+.pr-3 {
+  padding-right: 3rem !important; }
+
+.pb-3 {
+  padding-bottom: 3rem !important; }
+
+.pl-3 {
+  padding-left: 3rem !important; }
+
+.px-3 {
+  padding-right: 3rem !important;
+  padding-left: 3rem !important; }
+
+.py-3 {
+  padding-top: 3rem !important;
+  padding-bottom: 3rem !important; }
+
+.m-auto {
+  margin: auto !important; }
+
+.mt-auto {
+  margin-top: auto !important; }
+
+.mr-auto {
+  margin-right: auto !important; }
+
+.mb-auto {
+  margin-bottom: auto !important; }
+
+.ml-auto {
+  margin-left: auto !important; }
+
+.mx-auto {
+  margin-right: auto !important;
+  margin-left: auto !important; }
+
+.my-auto {
+  margin-top: auto !important;
+  margin-bottom: auto !important; }
+
+@media (min-width: 576px) {
+  .m-sm-q {
+    margin: 0.25rem 0.25rem !important; }
+  .mt-sm-q {
+    margin-top: 0.25rem !important; }
+  .mr-sm-q {
+    margin-right: 0.25rem !important; }
+  .mb-sm-q {
+    margin-bottom: 0.25rem !important; }
+  .ml-sm-q {
+    margin-left: 0.25rem !important; }
+  .mx-sm-q {
+    margin-right: 0.25rem !important;
+    margin-left: 0.25rem !important; }
+  .my-sm-q {
+    margin-top: 0.25rem !important;
+    margin-bottom: 0.25rem !important; }
+  .m-sm-h {
+    margin: 0.5rem 0.5rem !important; }
+  .mt-sm-h {
+    margin-top: 0.5rem !important; }
+  .mr-sm-h {
+    margin-right: 0.5rem !important; }
+  .mb-sm-h {
+    margin-bottom: 0.5rem !important; }
+  .ml-sm-h {
+    margin-left: 0.5rem !important; }
+  .mx-sm-h {
+    margin-right: 0.5rem !important;
+    margin-left: 0.5rem !important; }
+  .my-sm-h {
+    margin-top: 0.5rem !important;
+    margin-bottom: 0.5rem !important; }
+  .m-sm-0 {
+    margin: 0 0 !important; }
+  .mt-sm-0 {
+    margin-top: 0 !important; }
+  .mr-sm-0 {
+    margin-right: 0 !important; }
+  .mb-sm-0 {
+    margin-bottom: 0 !important; }
+  .ml-sm-0 {
+    margin-left: 0 !important; }
+  .mx-sm-0 {
+    margin-right: 0 !important;
+    margin-left: 0 !important; }
+  .my-sm-0 {
+    margin-top: 0 !important;
+    margin-bottom: 0 !important; }
+  .m-sm-1 {
+    margin: 1rem 1rem !important; }
+  .mt-sm-1 {
+    margin-top: 1rem !important; }
+  .mr-sm-1 {
+    margin-right: 1rem !important; }
+  .mb-sm-1 {
+    margin-bottom: 1rem !important; }
+  .ml-sm-1 {
+    margin-left: 1rem !important; }
+  .mx-sm-1 {
+    margin-right: 1rem !important;
+    margin-left: 1rem !important; }
+  .my-sm-1 {
+    margin-top: 1rem !important;
+    margin-bottom: 1rem !important; }
+  .m-sm-2 {
+    margin: 1.5rem 1.5rem !important; }
+  .mt-sm-2 {
+    margin-top: 1.5rem !important; }
+  .mr-sm-2 {
+    margin-right: 1.5rem !important; }
+  .mb-sm-2 {
+    margin-bottom: 1.5rem !important; }
+  .ml-sm-2 {
+    margin-left: 1.5rem !important; }
+  .mx-sm-2 {
+    margin-right: 1.5rem !important;
+    margin-left: 1.5rem !important; }
+  .my-sm-2 {
+    margin-top: 1.5rem !important;
+    margin-bottom: 1.5rem !important; }
+  .m-sm-3 {
+    margin: 3rem 3rem !important; }
+  .mt-sm-3 {
+    margin-top: 3rem !important; }
+  .mr-sm-3 {
+    margin-right: 3rem !important; }
+  .mb-sm-3 {
+    margin-bottom: 3rem !important; }
+  .ml-sm-3 {
+    margin-left: 3rem !important; }
+  .mx-sm-3 {
+    margin-right: 3rem !important;
+    margin-left: 3rem !important; }
+  .my-sm-3 {
+    margin-top: 3rem !important;
+    margin-bottom: 3rem !important; }
+  .p-sm-q {
+    padding: 0.25rem 0.25rem !important; }
+  .pt-sm-q {
+    padding-top: 0.25rem !important; }
+  .pr-sm-q {
+    padding-right: 0.25rem !important; }
+  .pb-sm-q {
+    padding-bottom: 0.25rem !important; }
+  .pl-sm-q {
+    padding-left: 0.25rem !important; }
+  .px-sm-q {
+    padding-right: 0.25rem !important;
+    padding-left: 0.25rem !important; }
+  .py-sm-q {
+    padding-top: 0.25rem !important;
+    padding-bottom: 0.25rem !important; }
+  .p-sm-h {
+    padding: 0.5rem 0.5rem !important; }
+  .pt-sm-h {
+    padding-top: 0.5rem !important; }
+  .pr-sm-h {
+    padding-right: 0.5rem !important; }
+  .pb-sm-h {
+    padding-bottom: 0.5rem !important; }
+  .pl-sm-h {
+    padding-left: 0.5rem !important; }
+  .px-sm-h {
+    padding-right: 0.5rem !important;
+    padding-left: 0.5rem !important; }
+  .py-sm-h {
+    padding-top: 0.5rem !important;
+    padding-bottom: 0.5rem !important; }
+  .p-sm-0 {
+    padding: 0 0 !important; }
+  .pt-sm-0 {
+    padding-top: 0 !important; }
+  .pr-sm-0 {
+    padding-right: 0 !important; }
+  .pb-sm-0 {
+    padding-bottom: 0 !important; }
+  .pl-sm-0 {
+    padding-left: 0 !important; }
+  .px-sm-0 {
+    padding-right: 0 !important;
+    padding-left: 0 !important; }
+  .py-sm-0 {
+    padding-top: 0 !important;
+    padding-bottom: 0 !important; }
+  .p-sm-1 {
+    padding: 1rem 1rem !important; }
+  .pt-sm-1 {
+    padding-top: 1rem !important; }
+  .pr-sm-1 {
+    padding-right: 1rem !important; }
+  .pb-sm-1 {
+    padding-bottom: 1rem !important; }
+  .pl-sm-1 {
+    padding-left: 1rem !important; }
+  .px-sm-1 {
+    padding-right: 1rem !important;
+    padding-left: 1rem !important; }
+  .py-sm-1 {
+    padding-top: 1rem !important;
+    padding-bottom: 1rem !important; }
+  .p-sm-2 {
+    padding: 1.5rem 1.5rem !important; }
+  .pt-sm-2 {
+    padding-top: 1.5rem !important; }
+  .pr-sm-2 {
+    padding-right: 1.5rem !important; }
+  .pb-sm-2 {
+    padding-bottom: 1.5rem !important; }
+  .pl-sm-2 {
+    padding-left: 1.5rem !important; }
+  .px-sm-2 {
+    padding-right: 1.5rem !important;
+    padding-left: 1.5rem !important; }
+  .py-sm-2 {
+    padding-top: 1.5rem !important;
+    padding-bottom: 1.5rem !important; }
+  .p-sm-3 {
+    padding: 3rem 3rem !important; }
+  .pt-sm-3 {
+    padding-top: 3rem !important; }
+  .pr-sm-3 {
+    padding-right: 3rem !important; }
+  .pb-sm-3 {
+    padding-bottom: 3rem !important; }
+  .pl-sm-3 {
+    padding-left: 3rem !important; }
+  .px-sm-3 {
+    padding-right: 3rem !important;
+    padding-left: 3rem !important; }
+  .py-sm-3 {
+    padding-top: 3rem !important;
+    padding-bottom: 3rem !important; }
+  .m-sm-auto {
+    margin: auto !important; }
+  .mt-sm-auto {
+    margin-top: auto !important; }
+  .mr-sm-auto {
+    margin-right: auto !important; }
+  .mb-sm-auto {
+    margin-bottom: auto !important; }
+  .ml-sm-auto {
+    margin-left: auto !important; }
+  .mx-sm-auto {
+    margin-right: auto !important;
+    margin-left: auto !important; }
+  .my-sm-auto {
+    margin-top: auto !important;
+    margin-bottom: auto !important; } }
+
+@media (min-width: 768px) {
+  .m-md-q {
+    margin: 0.25rem 0.25rem !important; }
+  .mt-md-q {
+    margin-top: 0.25rem !important; }
+  .mr-md-q {
+    margin-right: 0.25rem !important; }
+  .mb-md-q {
+    margin-bottom: 0.25rem !important; }
+  .ml-md-q {
+    margin-left: 0.25rem !important; }
+  .mx-md-q {
+    margin-right: 0.25rem !important;
+    margin-left: 0.25rem !important; }
+  .my-md-q {
+    margin-top: 0.25rem !important;
+    margin-bottom: 0.25rem !important; }
+  .m-md-h {
+    margin: 0.5rem 0.5rem !important; }
+  .mt-md-h {
+    margin-top: 0.5rem !important; }
+  .mr-md-h {
+    margin-right: 0.5rem !important; }
+  .mb-md-h {
+    margin-bottom: 0.5rem !important; }
+  .ml-md-h {
+    margin-left: 0.5rem !important; }
+  .mx-md-h {
+    margin-right: 0.5rem !important;
+    margin-left: 0.5rem !important; }
+  .my-md-h {
+    margin-top: 0.5rem !important;
+    margin-bottom: 0.5rem !important; }
+  .m-md-0 {
+    margin: 0 0 !important; }
+  .mt-md-0 {
+    margin-top: 0 !important; }
+  .mr-md-0 {
+    margin-right: 0 !important; }
+  .mb-md-0 {
+    margin-bottom: 0 !important; }
+  .ml-md-0 {
+    margin-left: 0 !important; }
+  .mx-md-0 {
+    margin-right: 0 !important;
+    margin-left: 0 !important; }
+  .my-md-0 {
+    margin-top: 0 !important;
+    margin-bottom: 0 !important; }
+  .m-md-1 {
+    margin: 1rem 1rem !important; }
+  .mt-md-1 {
+    margin-top: 1rem !important; }
+  .mr-md-1 {
+    margin-right: 1rem !important; }
+  .mb-md-1 {
+    margin-bottom: 1rem !important; }
+  .ml-md-1 {
+    margin-left: 1rem !important; }
+  .mx-md-1 {
+    margin-right: 1rem !important;
+    margin-left: 1rem !important; }
+  .my-md-1 {
+    margin-top: 1rem !important;
+    margin-bottom: 1rem !important; }
+  .m-md-2 {
+    margin: 1.5rem 1.5rem !important; }
+  .mt-md-2 {
+    margin-top: 1.5rem !important; }
+  .mr-md-2 {
+    margin-right: 1.5rem !important; }
+  .mb-md-2 {
+    margin-bottom: 1.5rem !important; }
+  .ml-md-2 {
+    margin-left: 1.5rem !important; }
+  .mx-md-2 {
+    margin-right: 1.5rem !important;
+    margin-left: 1.5rem !important; }
+  .my-md-2 {
+    margin-top: 1.5rem !important;
+    margin-bottom: 1.5rem !important; }
+  .m-md-3 {
+    margin: 3rem 3rem !important; }
+  .mt-md-3 {
+    margin-top: 3rem !important; }
+  .mr-md-3 {
+    margin-right: 3rem !important; }
+  .mb-md-3 {
+    margin-bottom: 3rem !important; }
+  .ml-md-3 {
+    margin-left: 3rem !important; }
+  .mx-md-3 {
+    margin-right: 3rem !important;
+    margin-left: 3rem !important; }
+  .my-md-3 {
+    margin-top: 3rem !important;
+    margin-bottom: 3rem !important; }
+  .p-md-q {
+    padding: 0.25rem 0.25rem !important; }
+  .pt-md-q {
+    padding-top: 0.25rem !important; }
+  .pr-md-q {
+    padding-right: 0.25rem !important; }
+  .pb-md-q {
+    padding-bottom: 0.25rem !important; }
+  .pl-md-q {
+    padding-left: 0.25rem !important; }
+  .px-md-q {
+    padding-right: 0.25rem !important;
+    padding-left: 0.25rem !important; }
+  .py-md-q {
+    padding-top: 0.25rem !important;
+    padding-bottom: 0.25rem !important; }
+  .p-md-h {
+    padding: 0.5rem 0.5rem !important; }
+  .pt-md-h {
+    padding-top: 0.5rem !important; }
+  .pr-md-h {
+    padding-right: 0.5rem !important; }
+  .pb-md-h {
+    padding-bottom: 0.5rem !important; }
+  .pl-md-h {
+    padding-left: 0.5rem !important; }
+  .px-md-h {
+    padding-right: 0.5rem !important;
+    padding-left: 0.5rem !important; }
+  .py-md-h {
+    padding-top: 0.5rem !important;
+    padding-bottom: 0.5rem !important; }
+  .p-md-0 {
+    padding: 0 0 !important; }
+  .pt-md-0 {
+    padding-top: 0 !important; }
+  .pr-md-0 {
+    padding-right: 0 !important; }
+  .pb-md-0 {
+    padding-bottom: 0 !important; }
+  .pl-md-0 {
+    padding-left: 0 !important; }
+  .px-md-0 {
+    padding-right: 0 !important;
+    padding-left: 0 !important; }
+  .py-md-0 {
+    padding-top: 0 !important;
+    padding-bottom: 0 !important; }
+  .p-md-1 {
+    padding: 1rem 1rem !important; }
+  .pt-md-1 {
+    padding-top: 1rem !important; }
+  .pr-md-1 {
+    padding-right: 1rem !important; }
+  .pb-md-1 {
+    padding-bottom: 1rem !important; }
+  .pl-md-1 {
+    padding-left: 1rem !important; }
+  .px-md-1 {
+    padding-right: 1rem !important;
+    padding-left: 1rem !important; }
+  .py-md-1 {
+    padding-top: 1rem !important;
+    padding-bottom: 1rem !important; }
+  .p-md-2 {
+    padding: 1.5rem 1.5rem !important; }
+  .pt-md-2 {
+    padding-top: 1.5rem !important; }
+  .pr-md-2 {
+    padding-right: 1.5rem !important; }
+  .pb-md-2 {
+    padding-bottom: 1.5rem !important; }
+  .pl-md-2 {
+    padding-left: 1.5rem !important; }
+  .px-md-2 {
+    padding-right: 1.5rem !important;
+    padding-left: 1.5rem !important; }
+  .py-md-2 {
+    padding-top: 1.5rem !important;
+    padding-bottom: 1.5rem !important; }
+  .p-md-3 {
+    padding: 3rem 3rem !important; }
+  .pt-md-3 {
+    padding-top: 3rem !important; }
+  .pr-md-3 {
+    padding-right: 3rem !important; }
+  .pb-md-3 {
+    padding-bottom: 3rem !important; }
+  .pl-md-3 {
+    padding-left: 3rem !important; }
+  .px-md-3 {
+    padding-right: 3rem !important;
+    padding-left: 3rem !important; }
+  .py-md-3 {
+    padding-top: 3rem !important;
+    padding-bottom: 3rem !important; }
+  .m-md-auto {
+    margin: auto !important; }
+  .mt-md-auto {
+    margin-top: auto !important; }
+  .mr-md-auto {
+    margin-right: auto !important; }
+  .mb-md-auto {
+    margin-bottom: auto !important; }
+  .ml-md-auto {
+    margin-left: auto !important; }
+  .mx-md-auto {
+    margin-right: auto !important;
+    margin-left: auto !important; }
+  .my-md-auto {
+    margin-top: auto !important;
+    margin-bottom: auto !important; } }
+
+@media (min-width: 992px) {
+  .m-lg-q {
+    margin: 0.25rem 0.25rem !important; }
+  .mt-lg-q {
+    margin-top: 0.25rem !important; }
+  .mr-lg-q {
+    margin-right: 0.25rem !important; }
+  .mb-lg-q {
+    margin-bottom: 0.25rem !important; }
+  .ml-lg-q {
+    margin-left: 0.25rem !important; }
+  .mx-lg-q {
+    margin-right: 0.25rem !important;
+    margin-left: 0.25rem !important; }
+  .my-lg-q {
+    margin-top: 0.25rem !important;
+    margin-bottom: 0.25rem !important; }
+  .m-lg-h {
+    margin: 0.5rem 0.5rem !important; }
+  .mt-lg-h {
+    margin-top: 0.5rem !important; }
+  .mr-lg-h {
+    margin-right: 0.5rem !important; }
+  .mb-lg-h {
+    margin-bottom: 0.5rem !important; }
+  .ml-lg-h {
+    margin-left: 0.5rem !important; }
+  .mx-lg-h {
+    margin-right: 0.5rem !important;
+    margin-left: 0.5rem !important; }
+  .my-lg-h {
+    margin-top: 0.5rem !important;
+    margin-bottom: 0.5rem !important; }
+  .m-lg-0 {
+    margin: 0 0 !important; }
+  .mt-lg-0 {
+    margin-top: 0 !important; }
+  .mr-lg-0 {
+    margin-right: 0 !important; }
+  .mb-lg-0 {
+    margin-bottom: 0 !important; }
+  .ml-lg-0 {
+    margin-left: 0 !important; }
+  .mx-lg-0 {
+    margin-right: 0 !important;
+    margin-left: 0 !important; }
+  .my-lg-0 {
+    margin-top: 0 !important;
+    margin-bottom: 0 !important; }
+  .m-lg-1 {
+    margin: 1rem 1rem !important; }
+  .mt-lg-1 {
+    margin-top: 1rem !important; }
+  .mr-lg-1 {
+    margin-right: 1rem !important; }
+  .mb-lg-1 {
+    margin-bottom: 1rem !important; }
+  .ml-lg-1 {
+    margin-left: 1rem !important; }
+  .mx-lg-1 {
+    margin-right: 1rem !important;
+    margin-left: 1rem !important; }
+  .my-lg-1 {
+    margin-top: 1rem !important;
+    margin-bottom: 1rem !important; }
+  .m-lg-2 {
+    margin: 1.5rem 1.5rem !important; }
+  .mt-lg-2 {
+    margin-top: 1.5rem !important; }
+  .mr-lg-2 {
+    margin-right: 1.5rem !important; }
+  .mb-lg-2 {
+    margin-bottom: 1.5rem !important; }
+  .ml-lg-2 {
+    margin-left: 1.5rem !important; }
+  .mx-lg-2 {
+    margin-right: 1.5rem !important;
+    margin-left: 1.5rem !important; }
+  .my-lg-2 {
+    margin-top: 1.5rem !important;
+    margin-bottom: 1.5rem !important; }
+  .m-lg-3 {
+    margin: 3rem 3rem !important; }
+  .mt-lg-3 {
+    margin-top: 3rem !important; }
+  .mr-lg-3 {
+    margin-right: 3rem !important; }
+  .mb-lg-3 {
+    margin-bottom: 3rem !important; }
+  .ml-lg-3 {
+    margin-left: 3rem !important; }
+  .mx-lg-3 {
+    margin-right: 3rem !important;
+    margin-left: 3rem !important; }
+  .my-lg-3 {
+    margin-top: 3rem !important;
+    margin-bottom: 3rem !important; }
+  .p-lg-q {
+    padding: 0.25rem 0.25rem !important; }
+  .pt-lg-q {
+    padding-top: 0.25rem !important; }
+  .pr-lg-q {
+    padding-right: 0.25rem !important; }
+  .pb-lg-q {
+    padding-bottom: 0.25rem !important; }
+  .pl-lg-q {
+    padding-left: 0.25rem !important; }
+  .px-lg-q {
+    padding-right: 0.25rem !important;
+    padding-left: 0.25rem !important; }
+  .py-lg-q {
+    padding-top: 0.25rem !important;
+    padding-bottom: 0.25rem !important; }
+  .p-lg-h {
+    padding: 0.5rem 0.5rem !important; }
+  .pt-lg-h {
+    padding-top: 0.5rem !important; }
+  .pr-lg-h {
+    padding-right: 0.5rem !important; }
+  .pb-lg-h {
+    padding-bottom: 0.5rem !important; }
+  .pl-lg-h {
+    padding-left: 0.5rem !important; }
+  .px-lg-h {
+    padding-right: 0.5rem !important;
+    padding-left: 0.5rem !important; }
+  .py-lg-h {
+    padding-top: 0.5rem !important;
+    padding-bottom: 0.5rem !important; }
+  .p-lg-0 {
+    padding: 0 0 !important; }
+  .pt-lg-0 {
+    padding-top: 0 !important; }
+  .pr-lg-0 {
+    padding-right: 0 !important; }
+  .pb-lg-0 {
+    padding-bottom: 0 !important; }
+  .pl-lg-0 {
+    padding-left: 0 !important; }
+  .px-lg-0 {
+    padding-right: 0 !important;
+    padding-left: 0 !important; }
+  .py-lg-0 {
+    padding-top: 0 !important;
+    padding-bottom: 0 !important; }
+  .p-lg-1 {
+    padding: 1rem 1rem !important; }
+  .pt-lg-1 {
+    padding-top: 1rem !important; }
+  .pr-lg-1 {
+    padding-right: 1rem !important; }
+  .pb-lg-1 {
+    padding-bottom: 1rem !important; }
+  .pl-lg-1 {
+    padding-left: 1rem !important; }
+  .px-lg-1 {
+    padding-right: 1rem !important;
+    padding-left: 1rem !important; }
+  .py-lg-1 {
+    padding-top: 1rem !important;
+    padding-bottom: 1rem !important; }
+  .p-lg-2 {
+    padding: 1.5rem 1.5rem !important; }
+  .pt-lg-2 {
+    padding-top: 1.5rem !important; }
+  .pr-lg-2 {
+    padding-right: 1.5rem !important; }
+  .pb-lg-2 {
+    padding-bottom: 1.5rem !important; }
+  .pl-lg-2 {
+    padding-left: 1.5rem !important; }
+  .px-lg-2 {
+    padding-right: 1.5rem !important;
+    padding-left: 1.5rem !important; }
+  .py-lg-2 {
+    padding-top: 1.5rem !important;
+    padding-bottom: 1.5rem !important; }
+  .p-lg-3 {
+    padding: 3rem 3rem !important; }
+  .pt-lg-3 {
+    padding-top: 3rem !important; }
+  .pr-lg-3 {
+    padding-right: 3rem !important; }
+  .pb-lg-3 {
+    padding-bottom: 3rem !important; }
+  .pl-lg-3 {
+    padding-left: 3rem !important; }
+  .px-lg-3 {
+    padding-right: 3rem !important;
+    padding-left: 3rem !important; }
+  .py-lg-3 {
+    padding-top: 3rem !important;
+    padding-bottom: 3rem !important; }
+  .m-lg-auto {
+    margin: auto !important; }
+  .mt-lg-auto {
+    margin-top: auto !important; }
+  .mr-lg-auto {
+    margin-right: auto !important; }
+  .mb-lg-auto {
+    margin-bottom: auto !important; }
+  .ml-lg-auto {
+    margin-left: auto !important; }
+  .mx-lg-auto {
+    margin-right: auto !important;
+    margin-left: auto !important; }
+  .my-lg-auto {
+    margin-top: auto !important;
+    margin-bottom: auto !important; } }
+
+@media (min-width: 1200px) {
+  .m-xl-q {
+    margin: 0.25rem 0.25rem !important; }
+  .mt-xl-q {
+    margin-top: 0.25rem !important; }
+  .mr-xl-q {
+    margin-right: 0.25rem !important; }
+  .mb-xl-q {
+    margin-bottom: 0.25rem !important; }
+  .ml-xl-q {
+    margin-left: 0.25rem !important; }
+  .mx-xl-q {
+    margin-right: 0.25rem !important;
+    margin-left: 0.25rem !important; }
+  .my-xl-q {
+    margin-top: 0.25rem !important;
+    margin-bottom: 0.25rem !important; }
+  .m-xl-h {
+    margin: 0.5rem 0.5rem !important; }
+  .mt-xl-h {
+    margin-top: 0.5rem !important; }
+  .mr-xl-h {
+    margin-right: 0.5rem !important; }
+  .mb-xl-h {
+    margin-bottom: 0.5rem !important; }
+  .ml-xl-h {
+    margin-left: 0.5rem !important; }
+  .mx-xl-h {
+    margin-right: 0.5rem !important;
+    margin-left: 0.5rem !important; }
+  .my-xl-h {
+    margin-top: 0.5rem !important;
+    margin-bottom: 0.5rem !important; }
+  .m-xl-0 {
+    margin: 0 0 !important; }
+  .mt-xl-0 {
+    margin-top: 0 !important; }
+  .mr-xl-0 {
+    margin-right: 0 !important; }
+  .mb-xl-0 {
+    margin-bottom: 0 !important; }
+  .ml-xl-0 {
+    margin-left: 0 !important; }
+  .mx-xl-0 {
+    margin-right: 0 !important;
+    margin-left: 0 !important; }
+  .my-xl-0 {
+    margin-top: 0 !important;
+    margin-bottom: 0 !important; }
+  .m-xl-1 {
+    margin: 1rem 1rem !important; }
+  .mt-xl-1 {
+    margin-top: 1rem !important; }
+  .mr-xl-1 {
+    margin-right: 1rem !important; }
+  .mb-xl-1 {
+    margin-bottom: 1rem !important; }
+  .ml-xl-1 {
+    margin-left: 1rem !important; }
+  .mx-xl-1 {
+    margin-right: 1rem !important;
+    margin-left: 1rem !important; }
+  .my-xl-1 {
+    margin-top: 1rem !important;
+    margin-bottom: 1rem !important; }
+  .m-xl-2 {
+    margin: 1.5rem 1.5rem !important; }
+  .mt-xl-2 {
+    margin-top: 1.5rem !important; }
+  .mr-xl-2 {
+    margin-right: 1.5rem !important; }
+  .mb-xl-2 {
+    margin-bottom: 1.5rem !important; }
+  .ml-xl-2 {
+    margin-left: 1.5rem !important; }
+  .mx-xl-2 {
+    margin-right: 1.5rem !important;
+    margin-left: 1.5rem !important; }
+  .my-xl-2 {
+    margin-top: 1.5rem !important;
+    margin-bottom: 1.5rem !important; }
+  .m-xl-3 {
+    margin: 3rem 3rem !important; }
+  .mt-xl-3 {
+    margin-top: 3rem !important; }
+  .mr-xl-3 {
+    margin-right: 3rem !important; }
+  .mb-xl-3 {
+    margin-bottom: 3rem !important; }
+  .ml-xl-3 {
+    margin-left: 3rem !important; }
+  .mx-xl-3 {
+    margin-right: 3rem !important;
+    margin-left: 3rem !important; }
+  .my-xl-3 {
+    margin-top: 3rem !important;
+    margin-bottom: 3rem !important; }
+  .p-xl-q {
+    padding: 0.25rem 0.25rem !important; }
+  .pt-xl-q {
+    padding-top: 0.25rem !important; }
+  .pr-xl-q {
+    padding-right: 0.25rem !important; }
+  .pb-xl-q {
+    padding-bottom: 0.25rem !important; }
+  .pl-xl-q {
+    padding-left: 0.25rem !important; }
+  .px-xl-q {
+    padding-right: 0.25rem !important;
+    padding-left: 0.25rem !important; }
+  .py-xl-q {
+    padding-top: 0.25rem !important;
+    padding-bottom: 0.25rem !important; }
+  .p-xl-h {
+    padding: 0.5rem 0.5rem !important; }
+  .pt-xl-h {
+    padding-top: 0.5rem !important; }
+  .pr-xl-h {
+    padding-right: 0.5rem !important; }
+  .pb-xl-h {
+    padding-bottom: 0.5rem !important; }
+  .pl-xl-h {
+    padding-left: 0.5rem !important; }
+  .px-xl-h {
+    padding-right: 0.5rem !important;
+    padding-left: 0.5rem !important; }
+  .py-xl-h {
+    padding-top: 0.5rem !important;
+    padding-bottom: 0.5rem !important; }
+  .p-xl-0 {
+    padding: 0 0 !important; }
+  .pt-xl-0 {
+    padding-top: 0 !important; }
+  .pr-xl-0 {
+    padding-right: 0 !important; }
+  .pb-xl-0 {
+    padding-bottom: 0 !important; }
+  .pl-xl-0 {
+    padding-left: 0 !important; }
+  .px-xl-0 {
+    padding-right: 0 !important;
+    padding-left: 0 !important; }
+  .py-xl-0 {
+    padding-top: 0 !important;
+    padding-bottom: 0 !important; }
+  .p-xl-1 {
+    padding: 1rem 1rem !important; }
+  .pt-xl-1 {
+    padding-top: 1rem !important; }
+  .pr-xl-1 {
+    padding-right: 1rem !important; }
+  .pb-xl-1 {
+    padding-bottom: 1rem !important; }
+  .pl-xl-1 {
+    padding-left: 1rem !important; }
+  .px-xl-1 {
+    padding-right: 1rem !important;
+    padding-left: 1rem !important; }
+  .py-xl-1 {
+    padding-top: 1rem !important;
+    padding-bottom: 1rem !important; }
+  .p-xl-2 {
+    padding: 1.5rem 1.5rem !important; }
+  .pt-xl-2 {
+    padding-top: 1.5rem !important; }
+  .pr-xl-2 {
+    padding-right: 1.5rem !important; }
+  .pb-xl-2 {
+    padding-bottom: 1.5rem !important; }
+  .pl-xl-2 {
+    padding-left: 1.5rem !important; }
+  .px-xl-2 {
+    padding-right: 1.5rem !important;
+    padding-left: 1.5rem !important; }
+  .py-xl-2 {
+    padding-top: 1.5rem !important;
+    padding-bottom: 1.5rem !important; }
+  .p-xl-3 {
+    padding: 3rem 3rem !important; }
+  .pt-xl-3 {
+    padding-top: 3rem !important; }
+  .pr-xl-3 {
+    padding-right: 3rem !important; }
+  .pb-xl-3 {
+    padding-bottom: 3rem !important; }
+  .pl-xl-3 {
+    padding-left: 3rem !important; }
+  .px-xl-3 {
+    padding-right: 3rem !important;
+    padding-left: 3rem !important; }
+  .py-xl-3 {
+    padding-top: 3rem !important;
+    padding-bottom: 3rem !important; }
+  .m-xl-auto {
+    margin: auto !important; }
+  .mt-xl-auto {
+    margin-top: auto !important; }
+  .mr-xl-auto {
+    margin-right: auto !important; }
+  .mb-xl-auto {
+    margin-bottom: auto !important; }
+  .ml-xl-auto {
+    margin-left: auto !important; }
+  .mx-xl-auto {
+    margin-right: auto !important;
+    margin-left: auto !important; }
+  .my-xl-auto {
+    margin-top: auto !important;
+    margin-bottom: auto !important; } }
+
+.text-justify {
+  text-align: justify !important; }
+
+.text-nowrap {
+  white-space: nowrap !important; }
+
+.text-truncate {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap; }
+
+.text-left {
+  text-align: left !important; }
+
+.text-right {
+  text-align: right !important; }
+
+.text-center {
+  text-align: center !important; }
+
+@media (min-width: 576px) {
+  .text-sm-left {
+    text-align: left !important; }
+  .text-sm-right {
+    text-align: right !important; }
+  .text-sm-center {
+    text-align: center !important; } }
+
+@media (min-width: 768px) {
+  .text-md-left {
+    text-align: left !important; }
+  .text-md-right {
+    text-align: right !important; }
+  .text-md-center {
+    text-align: center !important; } }
+
+@media (min-width: 992px) {
+  .text-lg-left {
+    text-align: left !important; }
+  .text-lg-right {
+    text-align: right !important; }
+  .text-lg-center {
+    text-align: center !important; } }
+
+@media (min-width: 1200px) {
+  .text-xl-left {
+    text-align: left !important; }
+  .text-xl-right {
+    text-align: right !important; }
+  .text-xl-center {
+    text-align: center !important; } }
+
+.text-lowercase {
+  text-transform: lowercase !important; }
+
+.text-uppercase {
+  text-transform: uppercase !important; }
+
+.text-capitalize {
+  text-transform: capitalize !important; }
+
+.font-weight-normal {
+  font-weight: normal; }
+
+.font-weight-bold {
+  font-weight: bold; }
+
+.font-italic {
+  font-style: italic; }
+
+.text-white {
+  color: #fff !important; }
+
+.text-muted {
+  color: #b0bec5 !important; }
+
+a.text-muted:focus, a.text-muted:hover {
+  color: #93a6af !important; }
+
+.text-primary {
+  color: #20a8d8 !important; }
+
+a.text-primary:focus, a.text-primary:hover {
+  color: #1985ac !important; }
+
+.text-success {
+  color: #4dbd74 !important; }
+
+a.text-success:focus, a.text-success:hover {
+  color: #3a9d5d !important; }
+
+.text-info {
+  color: #63c2de !important; }
+
+a.text-info:focus, a.text-info:hover {
+  color: #39b2d5 !important; }
+
+.text-warning {
+  color: #f8cb00 !important; }
+
+a.text-warning:focus, a.text-warning:hover {
+  color: #c5a100 !important; }
+
+.text-danger {
+  color: #f86c6b !important; }
+
+a.text-danger:focus, a.text-danger:hover {
+  color: #f63c3a !important; }
+
+.text-gray-dark {
+  color: #263238 !important; }
+
+a.text-gray-dark:focus, a.text-gray-dark:hover {
+  color: #11171a !important; }
+
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0; }
+
+.invisible {
+  visibility: hidden !important; }
+
+.hidden-xs-up {
+  display: none !important; }
+
+@media (max-width: 575px) {
+  .hidden-xs-down {
+    display: none !important; } }
+
+@media (min-width: 576px) {
+  .hidden-sm-up {
+    display: none !important; } }
+
+@media (max-width: 767px) {
+  .hidden-sm-down {
+    display: none !important; } }
+
+@media (min-width: 768px) {
+  .hidden-md-up {
+    display: none !important; } }
+
+@media (max-width: 991px) {
+  .hidden-md-down {
+    display: none !important; } }
+
+@media (min-width: 992px) {
+  .hidden-lg-up {
+    display: none !important; } }
+
+@media (max-width: 1199px) {
+  .hidden-lg-down {
+    display: none !important; } }
+
+@media (min-width: 1200px) {
+  .hidden-xl-up {
+    display: none !important; } }
+
+.hidden-xl-down {
+  display: none !important; }
+
+.visible-print-block {
+  display: none !important; }
+  @media print {
+    .visible-print-block {
+      display: block !important; } }
+
+.visible-print-inline {
+  display: none !important; }
+  @media print {
+    .visible-print-inline {
+      display: inline !important; } }
+
+.visible-print-inline-block {
+  display: none !important; }
+  @media print {
+    .visible-print-inline-block {
+      display: inline-block !important; } }
+
+@media print {
+  .hidden-print {
+    display: none !important; } }
+
+.chart-legend,
+.bar-legend,
+.line-legend,
+.pie-legend,
+.radar-legend,
+.polararea-legend,
+.doughnut-legend {
+  list-style-type: none;
+  margin-top: 5px;
+  text-align: center;
+  -webkit-padding-start: 0;
+  -moz-padding-start: 0;
+  padding-left: 0; }
+
+.chart-legend li,
+.bar-legend li,
+.line-legend li,
+.pie-legend li,
+.radar-legend li,
+.polararea-legend li,
+.doughnut-legend li {
+  display: inline-block;
+  white-space: nowrap;
+  position: relative;
+  margin-bottom: 4px;
+  padding: 2px 8px 2px 28px;
+  font-size: smaller;
+  cursor: default; }
+
+.chart-legend li span,
+.bar-legend li span,
+.line-legend li span,
+.pie-legend li span,
+.radar-legend li span,
+.polararea-legend li span,
+.doughnut-legend li span {
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 20px;
+  height: 20px; }
+
+body {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased; }
+
+.font-xs {
+  font-size: .75rem !important; }
+
+.font-sm {
+  font-size: .85rem !important; }
+
+.font-lg {
+  font-size: 1rem !important; }
+
+.font-xl {
+  font-size: 1.25rem !important; }
+
+.font-2xl {
+  font-size: 1.5rem !important; }
+
+.font-3xl {
+  font-size: 1.75rem !important; }
+
+.font-4xl {
+  font-size: 2rem !important; }
+
+.font-5xl {
+  font-size: 2.5rem !important; }
+
+.animated {
+  -webkit-animation-duration: 1s;
+  animation-duration: 1s;
+  -webkit-animation-fill-mode: both;
+  animation-fill-mode: both; }
+
+.animated.infinite {
+  -webkit-animation-iteration-count: infinite;
+  animation-iteration-count: infinite; }
+
+.animated.hinge {
+  -webkit-animation-duration: 2s;
+  animation-duration: 2s; }
+
+@-webkit-keyframes fadeIn {
+  from {
+    opacity: 0; }
+  to {
+    opacity: 1; } }
+
+@keyframes fadeIn {
+  from {
+    opacity: 0; }
+  to {
+    opacity: 1; } }
+
+.fadeIn {
+  -webkit-animation-name: fadeIn;
+  animation-name: fadeIn; }
+
+.row.row-equal {
+  padding-right: 7.5px;
+  padding-left: 7.5px;
+  margin-right: -15px;
+  margin-left: -15px; }
+  .row.row-equal [class*="col-"] {
+    padding-right: 7.5px;
+    padding-left: 7.5px; }
+
+.main .container-fluid {
+  padding: 0 30px; }
+
+@media all and (-ms-high-contrast: none) {
+  html {
+    display: flex;
+    flex-direction: column; } }
+
+.app,
+app-dashboard,
+app-root {
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh; }
+
+.app-header {
+  flex: 0 0 55px; }
+
+.app-footer {
+  flex: 0 0 50px; }
+
+.app-body {
+  display: flex;
+  flex-grow: 1;
+  flex-direction: row;
+  overflow-x: hidden; }
+  .app-body .main {
+    flex: 1; }
+  .app-body .sidebar {
+    flex: 0 0 200px;
+    order: -1; }
+  .app-body .aside-menu {
+    flex: 0 0 250px; }
+
+.header-fixed .app-header {
+  position: fixed;
+  z-index: 1000;
+  width: 100%; }
+
+.header-fixed .app-body {
+  margin-top: 55px; }
+
+.sidebar-hidden .sidebar {
+  margin-left: -200px; }
+
+.sidebar-fixed .sidebar {
+  position: fixed;
+  height: 100%; }
+  .sidebar-fixed .sidebar .sidebar-nav {
+    height: calc(100vh - 55px); }
+
+.sidebar-fixed .main, .sidebar-fixed .app-footer {
+  margin-left: 200px; }
+
+.sidebar-fixed.sidebar-hidden .main, .sidebar-fixed.sidebar-hidden .app-footer {
+  margin-left: 0; }
+
+.sidebar-off-canvas .sidebar {
+  position: fixed;
+  z-index: 999;
+  height: 100%; }
+  .sidebar-off-canvas .sidebar .sidebar-nav {
+    height: calc(100vh - 55px); }
+
+.sidebar-compact .sidebar {
+  flex: 0 0 50px; }
+
+.sidebar-compact.sidebar-hidden .sidebar {
+  margin-left: -50px; }
+
+.sidebar-compact.sidebar-fixed .main, .sidebar-compact.sidebar-fixed .app-footer {
+  margin-left: 50px; }
+
+.sidebar-compact.sidebar-fixed.sidebar-hidden .main, .sidebar-compact.sidebar-fixed.sidebar-hidden .app-footer {
+  margin-left: 0; }
+
+.aside-menu-hidden .aside-menu {
+  margin-right: -250px; }
+
+.aside-menu-fixed .aside-menu {
+  position: fixed;
+  right: 0;
+  height: 100%; }
+  .aside-menu-fixed .aside-menu .tab-content {
+    height: calc(100vh - 2.375rem - 55px); }
+
+.aside-menu-fixed .main, .aside-menu-fixed .app-footer {
+  margin-right: 250px; }
+
+.aside-menu-fixed.aside-menu-hidden .main, .aside-menu-fixed.aside-menu-hidden .app-footer {
+  margin-right: 0; }
+
+.aside-menu-off-canvas .aside-menu {
+  position: fixed;
+  right: 0;
+  z-index: 999;
+  height: 100%; }
+  .aside-menu-off-canvas .aside-menu .tab-content {
+    height: calc(100vh - 2.375rem - 55px); }
+
+.footer-fixed .app-footer {
+  position: fixed;
+  bottom: 0;
+  z-index: 1000;
+  width: 100%; }
+
+.footer-fixed .app-body {
+  margin-bottom: 50px; }
+
+.app-header,
+.app-footer,
+.sidebar,
+.main,
+.aside-menu {
+  transition-duration: 0.25s, 0.25s;
+  transition-property: margin-left, margin-right; }
+
+@media (max-width: 991px) {
+  .app-header {
+    position: fixed !important;
+    z-index: 1000;
+    width: 100%; }
+    .app-header .navbar-toggler {
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 70px;
+      height: inherit; }
+    .app-header .navbar-toggler {
+      color: rgba(0, 0, 0, 0.3); }
+    .app-header .navbar-brand {
+      width: 100% !important;
+      margin: 0 auto !important; }
+    .app-header .navbar-nav {
+      position: absolute;
+      top: 0;
+      right: 15px;
+      height: inherit; }
+  .app-body {
+    margin-top: 55px; }
+  .sidebar {
+    position: fixed;
+    width: 220px;
+    height: 100%;
+    margin-left: -220px; }
+    .sidebar .sidebar-nav,
+    .sidebar .nav {
+      width: 220px !important; }
+  .main, .app-footer {
+    margin-left: 0 !important; }
+  .aside-menu {
+    margin-right: -250px; }
+  .sidebar-mobile-show .sidebar {
+    width: 220px;
+    margin-left: 0; }
+    .sidebar-mobile-show .sidebar .sidebar-nav {
+      height: calc(100vh - 55px); }
+  .sidebar-mobile-show .main {
+    margin-right: -220px !important;
+    margin-left: 220px !important; } }
+
+.sidebar {
+  padding: 0;
+  color: #fff;
+  background: #263238; }
+  .sidebar .sidebar-close {
+    position: absolute;
+    right: 0;
+    display: none;
+    padding: 0 1rem;
+    font-size: 24px;
+    font-weight: 800;
+    line-height: 55px;
+    color: #fff;
+    background: 0;
+    border: 0;
+    opacity: .8; }
+    .sidebar .sidebar-close:hover {
+      opacity: 1; }
+  .sidebar .sidebar-nav {
+    position: relative;
+    overflow-x: hidden;
+    overflow-y: auto;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    width: 200px; }
+    .sidebar .sidebar-nav::-webkit-scrollbar {
+      position: absolute;
+      width: 10px;
+      margin-left: -10px;
+      -webkit-appearance: none; }
+    .sidebar .sidebar-nav::-webkit-scrollbar-track {
+      background-color: #304047;
+      border-right: 1px solid #1c2429;
+      border-left: 1px solid #1c2429; }
+    .sidebar .sidebar-nav::-webkit-scrollbar-thumb {
+      height: 50px;
+      background-color: #11171a;
+      background-clip: content-box;
+      border-color: transparent;
+      border-style: solid;
+      border-width: 1px 2px; }
+  .sidebar .nav {
+    width: 200px;
+    flex-direction: column !important; }
+    .sidebar .nav .nav-title {
+      padding: 0.75rem 1rem;
+      font-size: 11px;
+      font-weight: 600;
+      color: #cfd8dc;
+      text-transform: uppercase; }
+    .sidebar .nav .divider {
+      height: 10px; }
+    .sidebar .nav .nav-item {
+      position: relative;
+      margin: 0;
+      transition: background .3s ease-in-out; }
+      .sidebar .nav .nav-item ul {
+        max-height: 0;
+        padding: 0;
+        margin: 0;
+        overflow-y: hidden;
+        transition: max-height .3s ease-in-out; }
+        .sidebar .nav .nav-item ul li {
+          padding: 0;
+          list-style: none; }
+      .sidebar .nav .nav-item .nav-link, .sidebar .nav .nav-item .navbar .dropdown-toggle, .navbar .sidebar .nav .nav-item .dropdown-toggle {
+        display: block;
+        padding: 0.75rem 1rem;
+        color: #fff;
+        text-decoration: none;
+        background: transparent; }
+        .sidebar .nav .nav-item .nav-link:hover, .sidebar .nav .nav-item .navbar .dropdown-toggle:hover, .navbar .sidebar .nav .nav-item .dropdown-toggle:hover {
+          color: #fff !important;
+          background: #20a8d8 !important; }
+          .sidebar .nav .nav-item .nav-link:hover i, .sidebar .nav .nav-item .navbar .dropdown-toggle:hover i, .navbar .sidebar .nav .nav-item .dropdown-toggle:hover i {
+            color: #fff !important; }
+        .sidebar .nav .nav-item .nav-link.active, .sidebar .nav .nav-item .navbar .active.dropdown-toggle, .navbar .sidebar .nav .nav-item .active.dropdown-toggle {
+          color: #fff;
+          background: #304047; }
+          .sidebar .nav .nav-item .nav-link.active i, .sidebar .nav .nav-item .navbar .active.dropdown-toggle i, .navbar .sidebar .nav .nav-item .active.dropdown-toggle i {
+            color: #20a8d8; }
+        .sidebar .nav .nav-item .nav-link [class^="icon-"], .sidebar .nav .nav-item .navbar .dropdown-toggle [class^="icon-"], .navbar .sidebar .nav .nav-item .dropdown-toggle [class^="icon-"], .sidebar .nav .nav-item .nav-link [class*=" icon-"], .sidebar .nav .nav-item .navbar .dropdown-toggle [class*=" icon-"], .navbar .sidebar .nav .nav-item .dropdown-toggle [class*=" icon-"] {
+          display: inline-block;
+          margin-top: -4px;
+          vertical-align: middle; }
+        .sidebar .nav .nav-item .nav-link i, .sidebar .nav .nav-item .navbar .dropdown-toggle i, .navbar .sidebar .nav .nav-item .dropdown-toggle i {
+          width: 20px;
+          margin: 0 0.5rem 0 0;
+          font-size: 14px;
+          color: #b0bec5;
+          text-align: center; }
+        .sidebar .nav .nav-item .nav-link .badge, .sidebar .nav .nav-item .navbar .dropdown-toggle .badge, .navbar .sidebar .nav .nav-item .dropdown-toggle .badge {
+          float: right;
+          margin-top: 2px; }
+        .sidebar .nav .nav-item .nav-link.nav-dropdown-toggle::before, .sidebar .nav .nav-item .navbar .nav-dropdown-toggle.dropdown-toggle::before, .navbar .sidebar .nav .nav-item .nav-dropdown-toggle.dropdown-toggle::before {
+          position: absolute;
+          top: 0.96875rem;
+          right: 1rem;
+          display: block;
+          width: 0.875rem;
+          height: 0.875rem;
+          padding: 0;
+          font-size: 0.875rem;
+          line-height: 0.65625rem;
+          text-align: center;
+          content: "\2039";
+          transition: .3s; }
+      .sidebar .nav .nav-item.nav-dropdown.open {
+        background: rgba(0, 0, 0, 0.2); }
+        .sidebar .nav .nav-item.nav-dropdown.open > ul, .sidebar .nav .nav-item.nav-dropdown.open > ol {
+          max-height: 1000px; }
+        .sidebar .nav .nav-item.nav-dropdown.open a.nav-link, .sidebar .nav .nav-item.nav-dropdown.open .navbar a.dropdown-toggle, .navbar .sidebar .nav .nav-item.nav-dropdown.open a.dropdown-toggle {
+          color: #fff;
+          border-left: 0 !important; }
+        .sidebar .nav .nav-item.nav-dropdown.open > .nav-link.nav-dropdown-toggle::before, .sidebar .nav .navbar .nav-item.nav-dropdown.open > .nav-dropdown-toggle.dropdown-toggle::before, .navbar .sidebar .nav .nav-item.nav-dropdown.open > .nav-dropdown-toggle.dropdown-toggle::before {
+          -webkit-transform: rotate(-90deg);
+          transform: rotate(-90deg); }
+        .sidebar .nav .nav-item.nav-dropdown.open .nav-dropdown.open {
+          border-left: 0; }
+      .sidebar .nav .nav-item.nav-dropdown.nt {
+        transition: 0s !important; }
+        .sidebar .nav .nav-item.nav-dropdown.nt > ul, .sidebar .nav .nav-item.nav-dropdown.nt > ol {
+          transition: 0s !important; }
+        .sidebar .nav .nav-item.nav-dropdown.nt a.nav-link.nav-dropdown-toggle::before, .sidebar .nav .nav-item.nav-dropdown.nt .navbar a.nav-dropdown-toggle.dropdown-toggle::before, .navbar .sidebar .nav .nav-item.nav-dropdown.nt a.nav-dropdown-toggle.dropdown-toggle::before {
+          transition: 0s !important; }
+      .sidebar .nav .nav-item a.nav-label {
+        display: block;
+        padding: 0.09375rem 1rem;
+        color: #cfd8dc; }
+        .sidebar .nav .nav-item a.nav-label:hover {
+          color: #fff;
+          text-decoration: none; }
+        .sidebar .nav .nav-item a.nav-label i {
+          width: 20px;
+          margin: -3px 0.5rem 0 0;
+          font-size: 10px;
+          color: #b0bec5;
+          text-align: center;
+          vertical-align: middle; }
+      .sidebar .nav .nav-item .progress {
+        background-color: #455b66 !important; }
+
+@media (min-width: 576px) {
+  body.sidebar-compact .hidden-cn {
+    display: none; }
+  body.sidebar-compact .sidebar {
+    z-index: 999;
+    width: 50px; }
+    body.sidebar-compact .sidebar .sidebar-nav {
+      overflow: visible; }
+    body.sidebar-compact .sidebar ul.nav li.nav-title, body.sidebar-compact .sidebar ul.nav li.divider {
+      display: none; }
+    body.sidebar-compact .sidebar ul.nav li.nav-item {
+      width: 50px;
+      overflow: hidden;
+      border-left: 0 !important; }
+      body.sidebar-compact .sidebar ul.nav li.nav-item ul {
+        background: #263238; }
+      body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-link, body.sidebar-compact .sidebar ul.nav li.nav-item .navbar a.dropdown-toggle, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item a.dropdown-toggle {
+        position: relative;
+        padding: 0 15px 0 0;
+        margin: 0;
+        line-height: 50px;
+        white-space: nowrap;
+        border-left: 0 !important; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-link.nav-dropdown-toggle::before, body.sidebar-compact .sidebar ul.nav li.nav-item .navbar a.nav-dropdown-toggle.dropdown-toggle::before, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-dropdown-toggle.dropdown-toggle::before {
+          display: none; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-link i, body.sidebar-compact .sidebar ul.nav li.nav-item .navbar a.dropdown-toggle i, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item a.dropdown-toggle i {
+          display: block;
+          float: left;
+          width: 50px;
+          height: 50px;
+          padding: 0;
+          margin: 0 !important;
+          font-size: 18px;
+          line-height: 50px; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-link .badge, body.sidebar-compact .sidebar ul.nav li.nav-item .navbar a.dropdown-toggle .badge, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item a.dropdown-toggle .badge {
+          position: absolute;
+          top: 14px;
+          right: 15px;
+          display: none; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-link:hover, body.sidebar-compact .sidebar ul.nav li.nav-item .navbar a.dropdown-toggle:hover, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item a.dropdown-toggle:hover {
+          width: 200px; }
+          body.sidebar-compact .sidebar ul.nav li.nav-item a.nav-link:hover .badge, body.sidebar-compact .sidebar ul.nav li.nav-item .navbar a.dropdown-toggle:hover .badge, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item a.dropdown-toggle:hover .badge {
+            display: inline; }
+      body.sidebar-compact .sidebar ul.nav li.nav-item ul {
+        position: absolute;
+        top: 50px;
+        left: 50px; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item ul li {
+          position: relative;
+          padding: 0; }
+          body.sidebar-compact .sidebar ul.nav li.nav-item ul li a.nav-link, body.sidebar-compact .sidebar ul.nav li.nav-item ul li .navbar a.dropdown-toggle, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item ul li a.dropdown-toggle {
+            width: 150px; }
+          body.sidebar-compact .sidebar ul.nav li.nav-item ul li ul, body.sidebar-compact .sidebar ul.nav li.nav-item ul li ol {
+            position: absolute;
+            top: 0;
+            left: 100%; }
+      body.sidebar-compact .sidebar ul.nav li.nav-item.nav-dropdown.open {
+        background: #304047; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item.nav-dropdown.open > a.nav-link i, body.sidebar-compact .sidebar ul.nav .navbar li.nav-item.nav-dropdown.open > a.dropdown-toggle i, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item.nav-dropdown.open > a.dropdown-toggle i {
+          color: #20a8d8; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item.nav-dropdown.open > ul, body.sidebar-compact .sidebar ul.nav li.nav-item.nav-dropdown.open > ol {
+          display: none; }
+      body.sidebar-compact .sidebar ul.nav li.nav-item:hover {
+        width: 250px;
+        overflow: visible;
+        background: #20a8d8;
+        transition: 0s; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item:hover > a.nav-link, body.sidebar-compact .sidebar ul.nav .navbar li.nav-item:hover > a.dropdown-toggle, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item:hover > a.dropdown-toggle {
+          width: 250px; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ul, body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ol {
+          display: inline;
+          max-height: 10000px;
+          transition: 0s; }
+          body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ul li, body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ol li {
+            width: 200px; }
+            body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ul li a.nav-link, body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ul li .navbar a.dropdown-toggle, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ul li a.dropdown-toggle, body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ol li a.nav-link, body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ol li .navbar a.dropdown-toggle, .navbar body.sidebar-compact .sidebar ul.nav li.nav-item:hover > ol li a.dropdown-toggle {
+              width: 200px; }
+        body.sidebar-compact .sidebar ul.nav li.nav-item:hover.nav-dropdown.open > ul, body.sidebar-compact .sidebar ul.nav li.nav-item:hover.nav-dropdown.open > ol {
+          display: inline; } }
+
+nav.top-nav {
+  position: absolute;
+  top: 55px;
+  left: 0;
+  z-index: 999;
+  display: inline !important;
+  width: 100%;
+  height: 40px;
+  background: #fff;
+  border-bottom: 1px solid #cfd8dc; }
+  nav.top-nav ul.nav {
+    white-space: nowrap; }
+    nav.top-nav ul.nav li.nav-item {
+      position: relative;
+      display: inline-block;
+      margin: 0; }
+      nav.top-nav ul.nav li.nav-item ul {
+        display: none;
+        padding: 0;
+        margin: 0;
+        white-space: normal;
+        background: #fff;
+        border: 1px solid #cfd8dc; }
+        nav.top-nav ul.nav li.nav-item ul li {
+          padding: 0;
+          list-style: none; }
+      nav.top-nav ul.nav li.nav-item a.nav-link, nav.top-nav ul.nav li.nav-item .navbar a.dropdown-toggle, .navbar nav.top-nav ul.nav li.nav-item a.dropdown-toggle {
+        display: block;
+        padding: 0 15px;
+        font-size: 12px;
+        font-weight: 400;
+        line-height: 40px;
+        color: #263238;
+        text-decoration: none;
+        text-transform: uppercase; }
+        nav.top-nav ul.nav li.nav-item a.nav-link i, nav.top-nav ul.nav li.nav-item .navbar a.dropdown-toggle i, .navbar nav.top-nav ul.nav li.nav-item a.dropdown-toggle i {
+          display: block;
+          float: left;
+          width: 20px;
+          margin: 0 10px 0 0;
+          font-size: 14px;
+          line-height: 39px;
+          text-align: center; }
+        nav.top-nav ul.nav li.nav-item a.nav-link .tag, nav.top-nav ul.nav li.nav-item .navbar a.dropdown-toggle .tag, .navbar nav.top-nav ul.nav li.nav-item a.dropdown-toggle .tag {
+          float: right;
+          margin-top: 13px;
+          margin-left: 10px; }
+        nav.top-nav ul.nav li.nav-item a.nav-link:hover, nav.top-nav ul.nav li.nav-item .navbar a.dropdown-toggle:hover, .navbar nav.top-nav ul.nav li.nav-item a.dropdown-toggle:hover {
+          color: #fff;
+          background: #20a8d8; }
+        nav.top-nav ul.nav li.nav-item a.nav-link.active, nav.top-nav ul.nav li.nav-item .navbar a.active.dropdown-toggle, .navbar nav.top-nav ul.nav li.nav-item a.active.dropdown-toggle {
+          color: #fff;
+          background: #20a8d8; }
+      nav.top-nav ul.nav li.nav-item ul {
+        position: absolute;
+        top: 39px;
+        left: 0; }
+        nav.top-nav ul.nav li.nav-item ul li {
+          position: relative;
+          padding: 0; }
+          nav.top-nav ul.nav li.nav-item ul li a.nav-link, nav.top-nav ul.nav li.nav-item ul li .navbar a.dropdown-toggle, .navbar nav.top-nav ul.nav li.nav-item ul li a.dropdown-toggle {
+            min-width: 200px; }
+          nav.top-nav ul.nav li.nav-item ul li ul {
+            position: absolute;
+            top: 0;
+            left: 100%; }
+      nav.top-nav ul.nav li.nav-item.nav-more ul {
+        right: 0;
+        left: auto; }
+        nav.top-nav ul.nav li.nav-item.nav-more ul li ul {
+          right: 100%;
+          left: auto; }
+      nav.top-nav ul.nav li.nav-item:hover > ul {
+        display: inline; }
+
+.aside-menu {
+  z-index: 999;
+  width: 250px;
+  color: #263238;
+  background: #fff;
+  border-left: 1px solid #cfd8dc; }
+  .aside-menu .nav-tabs {
+    border-color: #cfd8dc; }
+    .aside-menu .nav-tabs .nav-link, .aside-menu .nav-tabs .navbar .dropdown-toggle, .navbar .aside-menu .nav-tabs .dropdown-toggle {
+      padding: 0.75rem 1rem;
+      color: #263238;
+      border-top: 0; }
+      .aside-menu .nav-tabs .nav-link.active, .aside-menu .nav-tabs .navbar .active.dropdown-toggle, .navbar .aside-menu .nav-tabs .active.dropdown-toggle {
+        color: #20a8d8;
+        border-right-color: #cfd8dc;
+        border-left-color: #cfd8dc; }
+    .aside-menu .nav-tabs .nav-item:first-child .nav-link, .aside-menu .nav-tabs .nav-item:first-child .navbar .dropdown-toggle, .navbar .aside-menu .nav-tabs .nav-item:first-child .dropdown-toggle {
+      border-left: 0; }
+  .aside-menu .tab-content {
+    position: relative;
+    overflow-x: hidden;
+    overflow-y: auto;
+    border: 0;
+    border-top: 1px solid #cfd8dc;
+    -ms-overflow-style: -ms-autohiding-scrollbar; }
+    .aside-menu .tab-content::-webkit-scrollbar {
+      width: 10px;
+      margin-left: -10px;
+      -webkit-appearance: none; }
+    .aside-menu .tab-content::-webkit-scrollbar-track {
+      background-color: white;
+      border-right: 1px solid #f2f2f2;
+      border-left: 1px solid #f2f2f2; }
+    .aside-menu .tab-content::-webkit-scrollbar-thumb {
+      height: 50px;
+      background-color: #e6e6e6;
+      background-clip: content-box;
+      border-color: transparent;
+      border-style: solid;
+      border-width: 1px 2px; }
+    .aside-menu .tab-content .tab-pane {
+      padding: 0; }
+
+#loading-bar,
+#loading-bar-spinner {
+  -webkit-pointer-events: none;
+  pointer-events: none;
+  -moz-transition: 350ms linear all;
+  -o-transition: 350ms linear all;
+  -webkit-transition: 350ms linear all;
+  transition: 350ms linear all; }
+
+#loading-bar.ng-enter,
+#loading-bar.ng-leave.ng-leave-active,
+#loading-bar-spinner.ng-enter,
+#loading-bar-spinner.ng-leave.ng-leave-active {
+  opacity: 0; }
+
+#loading-bar.ng-enter.ng-enter-active,
+#loading-bar.ng-leave,
+#loading-bar-spinner.ng-enter.ng-enter-active,
+#loading-bar-spinner.ng-leave {
+  opacity: 1; }
+
+#loading-bar .bar {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 20002;
+  width: 100%;
+  height: 2px;
+  background: #20a8d8;
+  border-top-right-radius: 1px;
+  border-bottom-right-radius: 1px;
+  -moz-transition: width 350ms;
+  -o-transition: width 350ms;
+  -webkit-transition: width 350ms;
+  transition: width 350ms; }
+
+#loading-bar .peg {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 70px;
+  height: 2px;
+  -moz-border-radius: 100%;
+  -webkit-border-radius: 100%;
+  border-radius: 100%;
+  -moz-box-shadow: #29d 1px 0 6px 1px;
+  -ms-box-shadow: #29d 1px 0 6px 1px;
+  -webkit-box-shadow: #29d 1px 0 6px 1px;
+  box-shadow: #29d 1px 0 6px 1px;
+  opacity: .45; }
+
+#loading-bar-spinner {
+  position: fixed;
+  top: 10px;
+  left: 10px;
+  z-index: 10002;
+  display: block; }
+
+#loading-bar-spinner .spinner-icon {
+  width: 14px;
+  height: 14px;
+  border: solid 2px transparent;
+  border-top-color: #29d;
+  border-left-color: #29d;
+  border-radius: 50%;
+  -moz-animation: loading-bar-spinner 400ms linear infinite;
+  -ms-animation: loading-bar-spinner 400ms linear infinite;
+  -o-animation: loading-bar-spinner 400ms linear infinite;
+  -webkit-animation: loading-bar-spinner 400ms linear infinite;
+  animation: loading-bar-spinner 400ms linear infinite; }
+
+@-webkit-keyframes loading-bar-spinner {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg); } }
+
+@-moz-keyframes loading-bar-spinner {
+  0% {
+    -moz-transform: rotate(0deg);
+    transform: rotate(0deg); }
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg); } }
+
+@-o-keyframes loading-bar-spinner {
+  0% {
+    -o-transform: rotate(0deg);
+    transform: rotate(0deg); }
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg); } }
+
+@-ms-keyframes loading-bar-spinner {
+  0% {
+    -ms-transform: rotate(0deg);
+    transform: rotate(0deg); }
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg); } }
+
+@keyframes loading-bar-spinner {
+  0% {
+    transform: rotate(0deg);
+    transform: rotate(0deg); }
+  100% {
+    transform: rotate(360deg);
+    transform: rotate(360deg); } }
+
+.pace {
+  -webkit-pointer-events: none;
+  pointer-events: none;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  user-select: none; }
+
+.pace-inactive {
+  display: none; }
+
+.pace .pace-progress {
+  position: fixed;
+  top: 0;
+  right: 100%;
+  z-index: 2000;
+  width: 100%;
+  height: 2px;
+  background: #20a8d8; }
+
+.social-box {
+  min-height: 160px;
+  margin-bottom: 1.5rem;
+  text-align: center;
+  background: #fff;
+  border: 1px solid #cfd8dc; }
+  .social-box i {
+    display: block;
+    margin: -1px -1px 0;
+    font-size: 40px;
+    line-height: 90px;
+    background: #cfd8dc; }
+  .social-box .chart-wrapper {
+    height: 90px;
+    margin: -90px 0 0; }
+    .social-box .chart-wrapper canvas {
+      width: 100% !important;
+      height: 90px !important; }
+  .social-box ul {
+    padding: 10px 0;
+    list-style: none; }
+    .social-box ul li {
+      display: block;
+      float: left;
+      width: 50%; }
+      .social-box ul li:first-child {
+        border-right: 1px solid #cfd8dc; }
+      .social-box ul li strong {
+        display: block;
+        font-size: 20px; }
+      .social-box ul li span {
+        font-size: 10px;
+        font-weight: 500;
+        color: #cfd8dc;
+        text-transform: uppercase; }
+  .social-box.facebook i {
+    color: #fff;
+    background: #3b5998; }
+  .social-box.twitter i {
+    color: #fff;
+    background: #00aced; }
+  .social-box.linkedin i {
+    color: #fff;
+    background: #4875b4; }
+  .social-box.google-plus i {
+    color: #fff;
+    background: #bb4b39; }
+
+.horizontal-bars {
+  padding: 0;
+  margin: 0;
+  list-style: none; }
+  .horizontal-bars li {
+    position: relative;
+    height: 40px;
+    line-height: 40px;
+    vertical-align: middle; }
+    .horizontal-bars li .title {
+      width: 100px;
+      font-size: 12px;
+      font-weight: 600;
+      color: #b0bec5;
+      vertical-align: middle; }
+    .horizontal-bars li .bars {
+      position: absolute;
+      top: 15px;
+      width: 100%;
+      padding-left: 100px; }
+      .horizontal-bars li .bars .progress:first-child {
+        margin-bottom: 2px; }
+    .horizontal-bars li.legend {
+      text-align: center; }
+      .horizontal-bars li.legend .badge {
+        display: inline-block;
+        width: 8px;
+        height: 8px;
+        padding: 0; }
+    .horizontal-bars li.divider {
+      height: 40px; }
+      .horizontal-bars li.divider i {
+        margin: 0 !important; }
+  .horizontal-bars.type-2 li {
+    overflow: hidden; }
+    .horizontal-bars.type-2 li i {
+      display: inline-block;
+      margin-right: 1rem;
+      margin-left: 5px;
+      font-size: 18px;
+      line-height: 40px; }
+    .horizontal-bars.type-2 li .title {
+      display: inline-block;
+      width: auto;
+      margin-top: -9px;
+      font-size: 0.875rem;
+      font-weight: normal;
+      line-height: 40px;
+      color: #263238; }
+    .horizontal-bars.type-2 li .value {
+      float: right;
+      font-weight: 600; }
+    .horizontal-bars.type-2 li .bars {
+      position: absolute;
+      top: auto;
+      bottom: 0;
+      padding: 0; }
+
+ul.icons-list {
+  padding: 0;
+  margin: 0;
+  list-style: none; }
+  ul.icons-list li {
+    position: relative;
+    height: 40px;
+    vertical-align: middle; }
+    ul.icons-list li i {
+      display: block;
+      float: left;
+      width: 35px !important;
+      height: 35px !important;
+      margin: 2px;
+      line-height: 35px !important;
+      text-align: center; }
+    ul.icons-list li .desc {
+      height: 40px;
+      margin-left: 50px;
+      border-bottom: 1px solid #cfd8dc; }
+      ul.icons-list li .desc .title {
+        padding: 2px 0 0;
+        margin: 0; }
+      ul.icons-list li .desc small {
+        display: block;
+        margin-top: -4px;
+        color: #b0bec5; }
+    ul.icons-list li .value {
+      position: absolute;
+      top: 2px;
+      right: 45px;
+      text-align: right; }
+      ul.icons-list li .value strong {
+        display: block;
+        margin-top: -3px; }
+    ul.icons-list li .actions {
+      position: absolute;
+      top: -4px;
+      right: 10px;
+      width: 40px;
+      height: 40px;
+      line-height: 40px;
+      text-align: center; }
+      ul.icons-list li .actions i {
+        float: none;
+        width: auto;
+        height: auto;
+        padding: 0;
+        margin: 0;
+        line-height: normal; }
+    ul.icons-list li.divider {
+      height: 40px; }
+      ul.icons-list li.divider i {
+        width: auto;
+        height: auto;
+        margin: 2px 0 0;
+        font-size: 18px; }
+
+.app-footer {
+  min-height: 50px;
+  padding: 0 1rem;
+  line-height: 50px;
+  color: #263238;
+  background: #eceff1;
+  border-top: 1px solid #cfd8dc; }
+
+.btn-transparent {
+  color: #fff;
+  background-color: transparent;
+  border-color: transparent; }
+  .btn-transparent:hover {
+    color: #fff;
+    background-color: transparent;
+    border-color: transparent; }
+  .btn-transparent:focus, .btn-transparent.focus {
+    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.5); }
+  .btn-transparent.disabled, .btn-transparent:disabled {
+    background-color: transparent;
+    border-color: transparent; }
+  .btn-transparent:active, .btn-transparent.active,
+  .show > .btn-transparent.dropdown-toggle {
+    color: #fff;
+    background-color: transparent;
+    background-image: none;
+    border-color: transparent; }
+
+.btn [class^="icon-"], .btn [class*=" icon-"] {
+  display: inline-block;
+  margin-top: -2px;
+  vertical-align: middle; }
+
+.btn-facebook,
+.btn-twitter,
+.btn-linkedin,
+.btn-flickr,
+.btn-tumblr,
+.btn-xing,
+.btn-github,
+.btn-html5,
+.btn-openid,
+.btn-stack-overflow,
+.btn-youtube,
+.btn-css3,
+.btn-dribbble,
+.btn-google-plus,
+.btn-instagram,
+.btn-pinterest,
+.btn-vk,
+.btn-yahoo,
+.btn-behance,
+.btn-dropbox,
+.btn-reddit,
+.btn-spotify,
+.btn-vine,
+.btn-foursquare,
+.btn-vimeo {
+  position: relative;
+  overflow: hidden;
+  color: #fff !important;
+  text-align: center;
+  padding: 0.5rem 1rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  border: 0; }
+  .btn-facebook::before,
+  .btn-twitter::before,
+  .btn-linkedin::before,
+  .btn-flickr::before,
+  .btn-tumblr::before,
+  .btn-xing::before,
+  .btn-github::before,
+  .btn-html5::before,
+  .btn-openid::before,
+  .btn-stack-overflow::before,
+  .btn-youtube::before,
+  .btn-css3::before,
+  .btn-dribbble::before,
+  .btn-google-plus::before,
+  .btn-instagram::before,
+  .btn-pinterest::before,
+  .btn-vk::before,
+  .btn-yahoo::before,
+  .btn-behance::before,
+  .btn-dropbox::before,
+  .btn-reddit::before,
+  .btn-spotify::before,
+  .btn-vine::before,
+  .btn-foursquare::before,
+  .btn-vimeo::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    display: block;
+    font-family: 'FontAwesome';
+    font-style: normal;
+    font-weight: normal;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased; }
+  .btn-facebook:hover,
+  .btn-twitter:hover,
+  .btn-linkedin:hover,
+  .btn-flickr:hover,
+  .btn-tumblr:hover,
+  .btn-xing:hover,
+  .btn-github:hover,
+  .btn-html5:hover,
+  .btn-openid:hover,
+  .btn-stack-overflow:hover,
+  .btn-youtube:hover,
+  .btn-css3:hover,
+  .btn-dribbble:hover,
+  .btn-google-plus:hover,
+  .btn-instagram:hover,
+  .btn-pinterest:hover,
+  .btn-vk:hover,
+  .btn-yahoo:hover,
+  .btn-behance:hover,
+  .btn-dropbox:hover,
+  .btn-reddit:hover,
+  .btn-spotify:hover,
+  .btn-vine:hover,
+  .btn-foursquare:hover,
+  .btn-vimeo:hover {
+    color: #fff; }
+  .btn-facebook.icon span,
+  .btn-twitter.icon span,
+  .btn-linkedin.icon span,
+  .btn-flickr.icon span,
+  .btn-tumblr.icon span,
+  .btn-xing.icon span,
+  .btn-github.icon span,
+  .btn-html5.icon span,
+  .btn-openid.icon span,
+  .btn-stack-overflow.icon span,
+  .btn-youtube.icon span,
+  .btn-css3.icon span,
+  .btn-dribbble.icon span,
+  .btn-google-plus.icon span,
+  .btn-instagram.icon span,
+  .btn-pinterest.icon span,
+  .btn-vk.icon span,
+  .btn-yahoo.icon span,
+  .btn-behance.icon span,
+  .btn-dropbox.icon span,
+  .btn-reddit.icon span,
+  .btn-spotify.icon span,
+  .btn-vine.icon span,
+  .btn-foursquare.icon span,
+  .btn-vimeo.icon span {
+    display: none; }
+  .btn-facebook.text::before,
+  .btn-twitter.text::before,
+  .btn-linkedin.text::before,
+  .btn-flickr.text::before,
+  .btn-tumblr.text::before,
+  .btn-xing.text::before,
+  .btn-github.text::before,
+  .btn-html5.text::before,
+  .btn-openid.text::before,
+  .btn-stack-overflow.text::before,
+  .btn-youtube.text::before,
+  .btn-css3.text::before,
+  .btn-dribbble.text::before,
+  .btn-google-plus.text::before,
+  .btn-instagram.text::before,
+  .btn-pinterest.text::before,
+  .btn-vk.text::before,
+  .btn-yahoo.text::before,
+  .btn-behance.text::before,
+  .btn-dropbox.text::before,
+  .btn-reddit.text::before,
+  .btn-spotify.text::before,
+  .btn-vine.text::before,
+  .btn-foursquare.text::before,
+  .btn-vimeo.text::before {
+    display: none; }
+  .btn-facebook.text span,
+  .btn-twitter.text span,
+  .btn-linkedin.text span,
+  .btn-flickr.text span,
+  .btn-tumblr.text span,
+  .btn-xing.text span,
+  .btn-github.text span,
+  .btn-html5.text span,
+  .btn-openid.text span,
+  .btn-stack-overflow.text span,
+  .btn-youtube.text span,
+  .btn-css3.text span,
+  .btn-dribbble.text span,
+  .btn-google-plus.text span,
+  .btn-instagram.text span,
+  .btn-pinterest.text span,
+  .btn-vk.text span,
+  .btn-yahoo.text span,
+  .btn-behance.text span,
+  .btn-dropbox.text span,
+  .btn-reddit.text span,
+  .btn-spotify.text span,
+  .btn-vine.text span,
+  .btn-foursquare.text span,
+  .btn-vimeo.text span {
+    margin-left: 0 !important; }
+  .btn-facebook::before,
+  .btn-twitter::before,
+  .btn-linkedin::before,
+  .btn-flickr::before,
+  .btn-tumblr::before,
+  .btn-xing::before,
+  .btn-github::before,
+  .btn-html5::before,
+  .btn-openid::before,
+  .btn-stack-overflow::before,
+  .btn-youtube::before,
+  .btn-css3::before,
+  .btn-dribbble::before,
+  .btn-google-plus::before,
+  .btn-instagram::before,
+  .btn-pinterest::before,
+  .btn-vk::before,
+  .btn-yahoo::before,
+  .btn-behance::before,
+  .btn-dropbox::before,
+  .btn-reddit::before,
+  .btn-spotify::before,
+  .btn-vine::before,
+  .btn-foursquare::before,
+  .btn-vimeo::before {
+    width: 2.3125rem;
+    height: 2.3125rem;
+    padding: 0.5rem 0;
+    font-size: 0.875rem;
+    line-height: 1.5; }
+  .btn-facebook span,
+  .btn-twitter span,
+  .btn-linkedin span,
+  .btn-flickr span,
+  .btn-tumblr span,
+  .btn-xing span,
+  .btn-github span,
+  .btn-html5 span,
+  .btn-openid span,
+  .btn-stack-overflow span,
+  .btn-youtube span,
+  .btn-css3 span,
+  .btn-dribbble span,
+  .btn-google-plus span,
+  .btn-instagram span,
+  .btn-pinterest span,
+  .btn-vk span,
+  .btn-yahoo span,
+  .btn-behance span,
+  .btn-dropbox span,
+  .btn-reddit span,
+  .btn-spotify span,
+  .btn-vine span,
+  .btn-foursquare span,
+  .btn-vimeo span {
+    margin-left: 2.3125rem; }
+  .btn-facebook.icon,
+  .btn-twitter.icon,
+  .btn-linkedin.icon,
+  .btn-flickr.icon,
+  .btn-tumblr.icon,
+  .btn-xing.icon,
+  .btn-github.icon,
+  .btn-html5.icon,
+  .btn-openid.icon,
+  .btn-stack-overflow.icon,
+  .btn-youtube.icon,
+  .btn-css3.icon,
+  .btn-dribbble.icon,
+  .btn-google-plus.icon,
+  .btn-instagram.icon,
+  .btn-pinterest.icon,
+  .btn-vk.icon,
+  .btn-yahoo.icon,
+  .btn-behance.icon,
+  .btn-dropbox.icon,
+  .btn-reddit.icon,
+  .btn-spotify.icon,
+  .btn-vine.icon,
+  .btn-foursquare.icon,
+  .btn-vimeo.icon {
+    width: 2.3125rem;
+    height: 2.3125rem; }
+  .btn-facebook.btn-lg, .btn-group-lg > .btn-facebook.btn,
+  .btn-twitter.btn-lg,
+  .btn-group-lg > .btn-twitter.btn,
+  .btn-linkedin.btn-lg,
+  .btn-group-lg > .btn-linkedin.btn,
+  .btn-flickr.btn-lg,
+  .btn-group-lg > .btn-flickr.btn,
+  .btn-tumblr.btn-lg,
+  .btn-group-lg > .btn-tumblr.btn,
+  .btn-xing.btn-lg,
+  .btn-group-lg > .btn-xing.btn,
+  .btn-github.btn-lg,
+  .btn-group-lg > .btn-github.btn,
+  .btn-html5.btn-lg,
+  .btn-group-lg > .btn-html5.btn,
+  .btn-openid.btn-lg,
+  .btn-group-lg > .btn-openid.btn,
+  .btn-stack-overflow.btn-lg,
+  .btn-group-lg > .btn-stack-overflow.btn,
+  .btn-youtube.btn-lg,
+  .btn-group-lg > .btn-youtube.btn,
+  .btn-css3.btn-lg,
+  .btn-group-lg > .btn-css3.btn,
+  .btn-dribbble.btn-lg,
+  .btn-group-lg > .btn-dribbble.btn,
+  .btn-google-plus.btn-lg,
+  .btn-group-lg > .btn-google-plus.btn,
+  .btn-instagram.btn-lg,
+  .btn-group-lg > .btn-instagram.btn,
+  .btn-pinterest.btn-lg,
+  .btn-group-lg > .btn-pinterest.btn,
+  .btn-vk.btn-lg,
+  .btn-group-lg > .btn-vk.btn,
+  .btn-yahoo.btn-lg,
+  .btn-group-lg > .btn-yahoo.btn,
+  .btn-behance.btn-lg,
+  .btn-group-lg > .btn-behance.btn,
+  .btn-dropbox.btn-lg,
+  .btn-group-lg > .btn-dropbox.btn,
+  .btn-reddit.btn-lg,
+  .btn-group-lg > .btn-reddit.btn,
+  .btn-spotify.btn-lg,
+  .btn-group-lg > .btn-spotify.btn,
+  .btn-vine.btn-lg,
+  .btn-group-lg > .btn-vine.btn,
+  .btn-foursquare.btn-lg,
+  .btn-group-lg > .btn-foursquare.btn,
+  .btn-vimeo.btn-lg,
+  .btn-group-lg > .btn-vimeo.btn {
+    padding: 0.75rem 1.5rem;
+    font-size: 1.25rem;
+    line-height: 1.33333;
+    border: 0; }
+    .btn-facebook.btn-lg::before, .btn-group-lg > .btn-facebook.btn::before,
+    .btn-twitter.btn-lg::before,
+    .btn-group-lg > .btn-twitter.btn::before,
+    .btn-linkedin.btn-lg::before,
+    .btn-group-lg > .btn-linkedin.btn::before,
+    .btn-flickr.btn-lg::before,
+    .btn-group-lg > .btn-flickr.btn::before,
+    .btn-tumblr.btn-lg::before,
+    .btn-group-lg > .btn-tumblr.btn::before,
+    .btn-xing.btn-lg::before,
+    .btn-group-lg > .btn-xing.btn::before,
+    .btn-github.btn-lg::before,
+    .btn-group-lg > .btn-github.btn::before,
+    .btn-html5.btn-lg::before,
+    .btn-group-lg > .btn-html5.btn::before,
+    .btn-openid.btn-lg::before,
+    .btn-group-lg > .btn-openid.btn::before,
+    .btn-stack-overflow.btn-lg::before,
+    .btn-group-lg > .btn-stack-overflow.btn::before,
+    .btn-youtube.btn-lg::before,
+    .btn-group-lg > .btn-youtube.btn::before,
+    .btn-css3.btn-lg::before,
+    .btn-group-lg > .btn-css3.btn::before,
+    .btn-dribbble.btn-lg::before,
+    .btn-group-lg > .btn-dribbble.btn::before,
+    .btn-google-plus.btn-lg::before,
+    .btn-group-lg > .btn-google-plus.btn::before,
+    .btn-instagram.btn-lg::before,
+    .btn-group-lg > .btn-instagram.btn::before,
+    .btn-pinterest.btn-lg::before,
+    .btn-group-lg > .btn-pinterest.btn::before,
+    .btn-vk.btn-lg::before,
+    .btn-group-lg > .btn-vk.btn::before,
+    .btn-yahoo.btn-lg::before,
+    .btn-group-lg > .btn-yahoo.btn::before,
+    .btn-behance.btn-lg::before,
+    .btn-group-lg > .btn-behance.btn::before,
+    .btn-dropbox.btn-lg::before,
+    .btn-group-lg > .btn-dropbox.btn::before,
+    .btn-reddit.btn-lg::before,
+    .btn-group-lg > .btn-reddit.btn::before,
+    .btn-spotify.btn-lg::before,
+    .btn-group-lg > .btn-spotify.btn::before,
+    .btn-vine.btn-lg::before,
+    .btn-group-lg > .btn-vine.btn::before,
+    .btn-foursquare.btn-lg::before,
+    .btn-group-lg > .btn-foursquare.btn::before,
+    .btn-vimeo.btn-lg::before,
+    .btn-group-lg > .btn-vimeo.btn::before {
+      width: 3.16667rem;
+      height: 3.16667rem;
+      padding: 0.75rem 0;
+      font-size: 1.25rem;
+      line-height: 1.33333; }
+    .btn-facebook.btn-lg span, .btn-group-lg > .btn-facebook.btn span,
+    .btn-twitter.btn-lg span, .btn-group-lg > .btn-twitter.btn span,
+    .btn-linkedin.btn-lg span, .btn-group-lg > .btn-linkedin.btn span,
+    .btn-flickr.btn-lg span, .btn-group-lg > .btn-flickr.btn span,
+    .btn-tumblr.btn-lg span, .btn-group-lg > .btn-tumblr.btn span,
+    .btn-xing.btn-lg span, .btn-group-lg > .btn-xing.btn span,
+    .btn-github.btn-lg span, .btn-group-lg > .btn-github.btn span,
+    .btn-html5.btn-lg span, .btn-group-lg > .btn-html5.btn span,
+    .btn-openid.btn-lg span, .btn-group-lg > .btn-openid.btn span,
+    .btn-stack-overflow.btn-lg span, .btn-group-lg > .btn-stack-overflow.btn span,
+    .btn-youtube.btn-lg span, .btn-group-lg > .btn-youtube.btn span,
+    .btn-css3.btn-lg span, .btn-group-lg > .btn-css3.btn span,
+    .btn-dribbble.btn-lg span, .btn-group-lg > .btn-dribbble.btn span,
+    .btn-google-plus.btn-lg span, .btn-group-lg > .btn-google-plus.btn span,
+    .btn-instagram.btn-lg span, .btn-group-lg > .btn-instagram.btn span,
+    .btn-pinterest.btn-lg span, .btn-group-lg > .btn-pinterest.btn span,
+    .btn-vk.btn-lg span, .btn-group-lg > .btn-vk.btn span,
+    .btn-yahoo.btn-lg span, .btn-group-lg > .btn-yahoo.btn span,
+    .btn-behance.btn-lg span, .btn-group-lg > .btn-behance.btn span,
+    .btn-dropbox.btn-lg span, .btn-group-lg > .btn-dropbox.btn span,
+    .btn-reddit.btn-lg span, .btn-group-lg > .btn-reddit.btn span,
+    .btn-spotify.btn-lg span, .btn-group-lg > .btn-spotify.btn span,
+    .btn-vine.btn-lg span, .btn-group-lg > .btn-vine.btn span,
+    .btn-foursquare.btn-lg span, .btn-group-lg > .btn-foursquare.btn span,
+    .btn-vimeo.btn-lg span, .btn-group-lg > .btn-vimeo.btn span {
+      margin-left: 3.16667rem; }
+    .btn-facebook.btn-lg.icon, .btn-group-lg > .btn-facebook.icon.btn,
+    .btn-twitter.btn-lg.icon,
+    .btn-group-lg > .btn-twitter.icon.btn,
+    .btn-linkedin.btn-lg.icon,
+    .btn-group-lg > .btn-linkedin.icon.btn,
+    .btn-flickr.btn-lg.icon,
+    .btn-group-lg > .btn-flickr.icon.btn,
+    .btn-tumblr.btn-lg.icon,
+    .btn-group-lg > .btn-tumblr.icon.btn,
+    .btn-xing.btn-lg.icon,
+    .btn-group-lg > .btn-xing.icon.btn,
+    .btn-github.btn-lg.icon,
+    .btn-group-lg > .btn-github.icon.btn,
+    .btn-html5.btn-lg.icon,
+    .btn-group-lg > .btn-html5.icon.btn,
+    .btn-openid.btn-lg.icon,
+    .btn-group-lg > .btn-openid.icon.btn,
+    .btn-stack-overflow.btn-lg.icon,
+    .btn-group-lg > .btn-stack-overflow.icon.btn,
+    .btn-youtube.btn-lg.icon,
+    .btn-group-lg > .btn-youtube.icon.btn,
+    .btn-css3.btn-lg.icon,
+    .btn-group-lg > .btn-css3.icon.btn,
+    .btn-dribbble.btn-lg.icon,
+    .btn-group-lg > .btn-dribbble.icon.btn,
+    .btn-google-plus.btn-lg.icon,
+    .btn-group-lg > .btn-google-plus.icon.btn,
+    .btn-instagram.btn-lg.icon,
+    .btn-group-lg > .btn-instagram.icon.btn,
+    .btn-pinterest.btn-lg.icon,
+    .btn-group-lg > .btn-pinterest.icon.btn,
+    .btn-vk.btn-lg.icon,
+    .btn-group-lg > .btn-vk.icon.btn,
+    .btn-yahoo.btn-lg.icon,
+    .btn-group-lg > .btn-yahoo.icon.btn,
+    .btn-behance.btn-lg.icon,
+    .btn-group-lg > .btn-behance.icon.btn,
+    .btn-dropbox.btn-lg.icon,
+    .btn-group-lg > .btn-dropbox.icon.btn,
+    .btn-reddit.btn-lg.icon,
+    .btn-group-lg > .btn-reddit.icon.btn,
+    .btn-spotify.btn-lg.icon,
+    .btn-group-lg > .btn-spotify.icon.btn,
+    .btn-vine.btn-lg.icon,
+    .btn-group-lg > .btn-vine.icon.btn,
+    .btn-foursquare.btn-lg.icon,
+    .btn-group-lg > .btn-foursquare.icon.btn,
+    .btn-vimeo.btn-lg.icon,
+    .btn-group-lg > .btn-vimeo.icon.btn {
+      width: 3.16667rem;
+      height: 3.16667rem; }
+  .btn-facebook.btn-sm, .btn-group-sm > .btn-facebook.btn,
+  .btn-twitter.btn-sm,
+  .btn-group-sm > .btn-twitter.btn,
+  .btn-linkedin.btn-sm,
+  .btn-group-sm > .btn-linkedin.btn,
+  .btn-flickr.btn-sm,
+  .btn-group-sm > .btn-flickr.btn,
+  .btn-tumblr.btn-sm,
+  .btn-group-sm > .btn-tumblr.btn,
+  .btn-xing.btn-sm,
+  .btn-group-sm > .btn-xing.btn,
+  .btn-github.btn-sm,
+  .btn-group-sm > .btn-github.btn,
+  .btn-html5.btn-sm,
+  .btn-group-sm > .btn-html5.btn,
+  .btn-openid.btn-sm,
+  .btn-group-sm > .btn-openid.btn,
+  .btn-stack-overflow.btn-sm,
+  .btn-group-sm > .btn-stack-overflow.btn,
+  .btn-youtube.btn-sm,
+  .btn-group-sm > .btn-youtube.btn,
+  .btn-css3.btn-sm,
+  .btn-group-sm > .btn-css3.btn,
+  .btn-dribbble.btn-sm,
+  .btn-group-sm > .btn-dribbble.btn,
+  .btn-google-plus.btn-sm,
+  .btn-group-sm > .btn-google-plus.btn,
+  .btn-instagram.btn-sm,
+  .btn-group-sm > .btn-instagram.btn,
+  .btn-pinterest.btn-sm,
+  .btn-group-sm > .btn-pinterest.btn,
+  .btn-vk.btn-sm,
+  .btn-group-sm > .btn-vk.btn,
+  .btn-yahoo.btn-sm,
+  .btn-group-sm > .btn-yahoo.btn,
+  .btn-behance.btn-sm,
+  .btn-group-sm > .btn-behance.btn,
+  .btn-dropbox.btn-sm,
+  .btn-group-sm > .btn-dropbox.btn,
+  .btn-reddit.btn-sm,
+  .btn-group-sm > .btn-reddit.btn,
+  .btn-spotify.btn-sm,
+  .btn-group-sm > .btn-spotify.btn,
+  .btn-vine.btn-sm,
+  .btn-group-sm > .btn-vine.btn,
+  .btn-foursquare.btn-sm,
+  .btn-group-sm > .btn-foursquare.btn,
+  .btn-vimeo.btn-sm,
+  .btn-group-sm > .btn-vimeo.btn {
+    padding: 0.25rem 0.5rem;
+    font-size: 0.875rem;
+    line-height: 1.5;
+    border: 0; }
+    .btn-facebook.btn-sm::before, .btn-group-sm > .btn-facebook.btn::before,
+    .btn-twitter.btn-sm::before,
+    .btn-group-sm > .btn-twitter.btn::before,
+    .btn-linkedin.btn-sm::before,
+    .btn-group-sm > .btn-linkedin.btn::before,
+    .btn-flickr.btn-sm::before,
+    .btn-group-sm > .btn-flickr.btn::before,
+    .btn-tumblr.btn-sm::before,
+    .btn-group-sm > .btn-tumblr.btn::before,
+    .btn-xing.btn-sm::before,
+    .btn-group-sm > .btn-xing.btn::before,
+    .btn-github.btn-sm::before,
+    .btn-group-sm > .btn-github.btn::before,
+    .btn-html5.btn-sm::before,
+    .btn-group-sm > .btn-html5.btn::before,
+    .btn-openid.btn-sm::before,
+    .btn-group-sm > .btn-openid.btn::before,
+    .btn-stack-overflow.btn-sm::before,
+    .btn-group-sm > .btn-stack-overflow.btn::before,
+    .btn-youtube.btn-sm::before,
+    .btn-group-sm > .btn-youtube.btn::before,
+    .btn-css3.btn-sm::before,
+    .btn-group-sm > .btn-css3.btn::before,
+    .btn-dribbble.btn-sm::before,
+    .btn-group-sm > .btn-dribbble.btn::before,
+    .btn-google-plus.btn-sm::before,
+    .btn-group-sm > .btn-google-plus.btn::before,
+    .btn-instagram.btn-sm::before,
+    .btn-group-sm > .btn-instagram.btn::before,
+    .btn-pinterest.btn-sm::before,
+    .btn-group-sm > .btn-pinterest.btn::before,
+    .btn-vk.btn-sm::before,
+    .btn-group-sm > .btn-vk.btn::before,
+    .btn-yahoo.btn-sm::before,
+    .btn-group-sm > .btn-yahoo.btn::before,
+    .btn-behance.btn-sm::before,
+    .btn-group-sm > .btn-behance.btn::before,
+    .btn-dropbox.btn-sm::before,
+    .btn-group-sm > .btn-dropbox.btn::before,
+    .btn-reddit.btn-sm::before,
+    .btn-group-sm > .btn-reddit.btn::before,
+    .btn-spotify.btn-sm::before,
+    .btn-group-sm > .btn-spotify.btn::before,
+    .btn-vine.btn-sm::before,
+    .btn-group-sm > .btn-vine.btn::before,
+    .btn-foursquare.btn-sm::before,
+    .btn-group-sm > .btn-foursquare.btn::before,
+    .btn-vimeo.btn-sm::before,
+    .btn-group-sm > .btn-vimeo.btn::before {
+      width: 1.8125rem;
+      height: 1.8125rem;
+      padding: 0.25rem 0;
+      font-size: 0.875rem;
+      line-height: 1.5; }
+    .btn-facebook.btn-sm span, .btn-group-sm > .btn-facebook.btn span,
+    .btn-twitter.btn-sm span, .btn-group-sm > .btn-twitter.btn span,
+    .btn-linkedin.btn-sm span, .btn-group-sm > .btn-linkedin.btn span,
+    .btn-flickr.btn-sm span, .btn-group-sm > .btn-flickr.btn span,
+    .btn-tumblr.btn-sm span, .btn-group-sm > .btn-tumblr.btn span,
+    .btn-xing.btn-sm span, .btn-group-sm > .btn-xing.btn span,
+    .btn-github.btn-sm span, .btn-group-sm > .btn-github.btn span,
+    .btn-html5.btn-sm span, .btn-group-sm > .btn-html5.btn span,
+    .btn-openid.btn-sm span, .btn-group-sm > .btn-openid.btn span,
+    .btn-stack-overflow.btn-sm span, .btn-group-sm > .btn-stack-overflow.btn span,
+    .btn-youtube.btn-sm span, .btn-group-sm > .btn-youtube.btn span,
+    .btn-css3.btn-sm span, .btn-group-sm > .btn-css3.btn span,
+    .btn-dribbble.btn-sm span, .btn-group-sm > .btn-dribbble.btn span,
+    .btn-google-plus.btn-sm span, .btn-group-sm > .btn-google-plus.btn span,
+    .btn-instagram.btn-sm span, .btn-group-sm > .btn-instagram.btn span,
+    .btn-pinterest.btn-sm span, .btn-group-sm > .btn-pinterest.btn span,
+    .btn-vk.btn-sm span, .btn-group-sm > .btn-vk.btn span,
+    .btn-yahoo.btn-sm span, .btn-group-sm > .btn-yahoo.btn span,
+    .btn-behance.btn-sm span, .btn-group-sm > .btn-behance.btn span,
+    .btn-dropbox.btn-sm span, .btn-group-sm > .btn-dropbox.btn span,
+    .btn-reddit.btn-sm span, .btn-group-sm > .btn-reddit.btn span,
+    .btn-spotify.btn-sm span, .btn-group-sm > .btn-spotify.btn span,
+    .btn-vine.btn-sm span, .btn-group-sm > .btn-vine.btn span,
+    .btn-foursquare.btn-sm span, .btn-group-sm > .btn-foursquare.btn span,
+    .btn-vimeo.btn-sm span, .btn-group-sm > .btn-vimeo.btn span {
+      margin-left: 1.8125rem; }
+    .btn-facebook.btn-sm.icon, .btn-group-sm > .btn-facebook.icon.btn,
+    .btn-twitter.btn-sm.icon,
+    .btn-group-sm > .btn-twitter.icon.btn,
+    .btn-linkedin.btn-sm.icon,
+    .btn-group-sm > .btn-linkedin.icon.btn,
+    .btn-flickr.btn-sm.icon,
+    .btn-group-sm > .btn-flickr.icon.btn,
+    .btn-tumblr.btn-sm.icon,
+    .btn-group-sm > .btn-tumblr.icon.btn,
+    .btn-xing.btn-sm.icon,
+    .btn-group-sm > .btn-xing.icon.btn,
+    .btn-github.btn-sm.icon,
+    .btn-group-sm > .btn-github.icon.btn,
+    .btn-html5.btn-sm.icon,
+    .btn-group-sm > .btn-html5.icon.btn,
+    .btn-openid.btn-sm.icon,
+    .btn-group-sm > .btn-openid.icon.btn,
+    .btn-stack-overflow.btn-sm.icon,
+    .btn-group-sm > .btn-stack-overflow.icon.btn,
+    .btn-youtube.btn-sm.icon,
+    .btn-group-sm > .btn-youtube.icon.btn,
+    .btn-css3.btn-sm.icon,
+    .btn-group-sm > .btn-css3.icon.btn,
+    .btn-dribbble.btn-sm.icon,
+    .btn-group-sm > .btn-dribbble.icon.btn,
+    .btn-google-plus.btn-sm.icon,
+    .btn-group-sm > .btn-google-plus.icon.btn,
+    .btn-instagram.btn-sm.icon,
+    .btn-group-sm > .btn-instagram.icon.btn,
+    .btn-pinterest.btn-sm.icon,
+    .btn-group-sm > .btn-pinterest.icon.btn,
+    .btn-vk.btn-sm.icon,
+    .btn-group-sm > .btn-vk.icon.btn,
+    .btn-yahoo.btn-sm.icon,
+    .btn-group-sm > .btn-yahoo.icon.btn,
+    .btn-behance.btn-sm.icon,
+    .btn-group-sm > .btn-behance.icon.btn,
+    .btn-dropbox.btn-sm.icon,
+    .btn-group-sm > .btn-dropbox.icon.btn,
+    .btn-reddit.btn-sm.icon,
+    .btn-group-sm > .btn-reddit.icon.btn,
+    .btn-spotify.btn-sm.icon,
+    .btn-group-sm > .btn-spotify.icon.btn,
+    .btn-vine.btn-sm.icon,
+    .btn-group-sm > .btn-vine.icon.btn,
+    .btn-foursquare.btn-sm.icon,
+    .btn-group-sm > .btn-foursquare.icon.btn,
+    .btn-vimeo.btn-sm.icon,
+    .btn-group-sm > .btn-vimeo.icon.btn {
+      width: 1.8125rem;
+      height: 1.8125rem; }
+
+.btn-facebook {
+  background: #3b5998; }
+  .btn-facebook::before {
+    content: "\f09a";
+    background: #344e86; }
+  .btn-facebook:hover {
+    background: #344e86; }
+    .btn-facebook:hover::before {
+      background: #2d4373; }
+
+.btn-twitter {
+  background: #00aced; }
+  .btn-twitter::before {
+    content: "\f099";
+    background: #0099d4; }
+  .btn-twitter:hover {
+    background: #0099d4; }
+    .btn-twitter:hover::before {
+      background: #0087ba; }
+
+.btn-linkedin {
+  background: #4875b4; }
+  .btn-linkedin::before {
+    content: "\f0e1";
+    background: #4169a2; }
+  .btn-linkedin:hover {
+    background: #4169a2; }
+    .btn-linkedin:hover::before {
+      background: #395d90; }
+
+.btn-flickr {
+  background: #ff0084; }
+  .btn-flickr::before {
+    content: "\f16e";
+    background: #e60077; }
+  .btn-flickr:hover {
+    background: #e60077; }
+    .btn-flickr:hover::before {
+      background: #cc006a; }
+
+.btn-tumblr {
+  background: #32506d; }
+  .btn-tumblr::before {
+    content: "\f173";
+    background: #2a435c; }
+  .btn-tumblr:hover {
+    background: #2a435c; }
+    .btn-tumblr:hover::before {
+      background: #22364a; }
+
+.btn-xing {
+  background: #026466; }
+  .btn-xing::before {
+    content: "\f168";
+    background: #024b4d; }
+  .btn-xing:hover {
+    background: #024b4d; }
+    .btn-xing:hover::before {
+      background: #013334; }
+
+.btn-github {
+  background: #4183c4; }
+  .btn-github::before {
+    content: "\f09b";
+    background: #3876b4; }
+  .btn-github:hover {
+    background: #3876b4; }
+    .btn-github:hover::before {
+      background: #3269a0; }
+
+.btn-html5 {
+  background: #e34f26; }
+  .btn-html5::before {
+    content: "\f13b";
+    background: #d4431b; }
+  .btn-html5:hover {
+    background: #d4431b; }
+    .btn-html5:hover::before {
+      background: #be3c18; }
+
+.btn-openid {
+  background: #f78c40; }
+  .btn-openid::before {
+    content: "\f19b";
+    background: #f67d28; }
+  .btn-openid:hover {
+    background: #f67d28; }
+    .btn-openid:hover::before {
+      background: #f56f0f; }
+
+.btn-stack-overflow {
+  background: #fe7a15; }
+  .btn-stack-overflow::before {
+    content: "\f16c";
+    background: #f86c01; }
+  .btn-stack-overflow:hover {
+    background: #f86c01; }
+    .btn-stack-overflow:hover::before {
+      background: #df6101; }
+
+.btn-css3 {
+  background: #0170ba; }
+  .btn-css3::before {
+    content: "\f13c";
+    background: #0161a1; }
+  .btn-css3:hover {
+    background: #0161a1; }
+    .btn-css3:hover::before {
+      background: #015187; }
+
+.btn-youtube {
+  background: #b00; }
+  .btn-youtube::before {
+    content: "\f167";
+    background: #a20000; }
+  .btn-youtube:hover {
+    background: #a20000; }
+    .btn-youtube:hover::before {
+      background: #880000; }
+
+.btn-dribbble {
+  background: #ea4c89; }
+  .btn-dribbble::before {
+    content: "\f17d";
+    background: #e7357a; }
+  .btn-dribbble:hover {
+    background: #e7357a; }
+    .btn-dribbble:hover::before {
+      background: #e51e6b; }
+
+.btn-google-plus {
+  background: #bb4b39; }
+  .btn-google-plus::before {
+    content: "\f0d5";
+    background: #a74333; }
+  .btn-google-plus:hover {
+    background: #a74333; }
+    .btn-google-plus:hover::before {
+      background: #943b2d; }
+
+.btn-instagram {
+  background: #517fa4; }
+  .btn-instagram::before {
+    content: "\f16d";
+    background: #497293; }
+  .btn-instagram:hover {
+    background: #497293; }
+    .btn-instagram:hover::before {
+      background: #406582; }
+
+.btn-pinterest {
+  background: #cb2027; }
+  .btn-pinterest::before {
+    content: "\f0d2";
+    background: #b51d23; }
+  .btn-pinterest:hover {
+    background: #b51d23; }
+    .btn-pinterest:hover::before {
+      background: #9f191f; }
+
+.btn-vk {
+  background: #45668e; }
+  .btn-vk::before {
+    content: "\f189";
+    background: #3d5a7d; }
+  .btn-vk:hover {
+    background: #3d5a7d; }
+    .btn-vk:hover::before {
+      background: #344d6c; }
+
+.btn-yahoo {
+  background: #400191; }
+  .btn-yahoo::before {
+    content: "\f19e";
+    background: #350178; }
+  .btn-yahoo:hover {
+    background: #350178; }
+    .btn-yahoo:hover::before {
+      background: #2a015e; }
+
+.btn-behance {
+  background: #1769ff; }
+  .btn-behance::before {
+    content: "\f1b4";
+    background: #0059fd; }
+  .btn-behance:hover {
+    background: #0059fd; }
+    .btn-behance:hover::before {
+      background: #0050e3; }
+
+.btn-dropbox {
+  background: #007ee5; }
+  .btn-dropbox::before {
+    content: "\f16b";
+    background: #0070cc; }
+  .btn-dropbox:hover {
+    background: #0070cc; }
+    .btn-dropbox:hover::before {
+      background: #0062b2; }
+
+.btn-reddit {
+  background: #ff4500; }
+  .btn-reddit::before {
+    content: "\f1a1";
+    background: #e63e00; }
+  .btn-reddit:hover {
+    background: #e63e00; }
+    .btn-reddit:hover::before {
+      background: #cc3700; }
+
+.btn-spotify {
+  background: #7ab800; }
+  .btn-spotify::before {
+    content: "\f1bc";
+    background: #699f00; }
+  .btn-spotify:hover {
+    background: #699f00; }
+    .btn-spotify:hover::before {
+      background: #588500; }
+
+.btn-vine {
+  background: #00bf8f; }
+  .btn-vine::before {
+    content: "\f1ca";
+    background: #00a67c; }
+  .btn-vine:hover {
+    background: #00a67c; }
+    .btn-vine:hover::before {
+      background: #008c69; }
+
+.btn-foursquare {
+  background: #1073af; }
+  .btn-foursquare::before {
+    content: "\f180";
+    background: #0e6498; }
+  .btn-foursquare:hover {
+    background: #0e6498; }
+    .btn-foursquare:hover::before {
+      background: #0c5480; }
+
+.btn-vimeo {
+  background: #aad450; }
+  .btn-vimeo::before {
+    content: "\f194";
+    background: #a0cf3c; }
+  .btn-vimeo:hover {
+    background: #a0cf3c; }
+    .btn-vimeo:hover::before {
+      background: #93c130; }
+
+hr.transparent {
+  border-top: 1px solid transparent; }
+
+.breadcrumb-menu {
+  position: absolute;
+  top: 0;
+  right: 1rem; }
+  .breadcrumb-menu::before {
+    display: none; }
+  .breadcrumb-menu .btn {
+    padding-top: 0.75rem;
+    padding-bottom: 0.75rem; }
+  .breadcrumb-menu .btn.btn-secondary {
+    color: #b0bec5;
+    border: 0; }
+    .breadcrumb-menu .btn.btn-secondary:hover, .breadcrumb-menu .btn.btn-secondary.active {
+      color: #263238;
+      background: transparent; }
+  .breadcrumb-menu .open .btn.btn-secondary {
+    color: #263238;
+    background: transparent; }
+  .breadcrumb-menu .dropdown-menu {
+    min-width: 180px;
+    line-height: 1.5; }
+
+.img-avatar {
+  border-radius: 50em; }
+
+.avatar {
+  position: relative;
+  display: inline-block;
+  width: 36px; }
+  .avatar .img-avatar {
+    width: 36px;
+    height: 36px; }
+  .avatar .avatar-status {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    display: block;
+    width: 10px;
+    height: 10px;
+    border: 1px solid #fff;
+    border-radius: 50em; }
+
+.avatar.avatar-xs {
+  position: relative;
+  display: inline-block;
+  width: 20px; }
+  .avatar.avatar-xs .img-avatar {
+    width: 20px;
+    height: 20px; }
+  .avatar.avatar-xs .avatar-status {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    display: block;
+    width: 8px;
+    height: 8px;
+    border: 1px solid #fff;
+    border-radius: 50em; }
+
+.avatar.avatar-sm {
+  position: relative;
+  display: inline-block;
+  width: 24px; }
+  .avatar.avatar-sm .img-avatar {
+    width: 24px;
+    height: 24px; }
+  .avatar.avatar-sm .avatar-status {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    display: block;
+    width: 8px;
+    height: 8px;
+    border: 1px solid #fff;
+    border-radius: 50em; }
+
+.avatar.avatar-lg {
+  position: relative;
+  display: inline-block;
+  width: 72px; }
+  .avatar.avatar-lg .img-avatar {
+    width: 72px;
+    height: 72px; }
+  .avatar.avatar-lg .avatar-status {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    display: block;
+    width: 12px;
+    height: 12px;
+    border: 1px solid #fff;
+    border-radius: 50em; }
+
+.avatars-stack .avatar.avatar-xs {
+  margin-right: -10px; }
+
+.avatars-stack .avatar {
+  margin-right: -15px;
+  transition-duration: 0.25s, 0.25s;
+  transition-property: margin-left, margin-right; }
+  .avatars-stack .avatar:hover {
+    margin-right: 0 !important; }
+
+.callout {
+  position: relative;
+  padding: 0 1rem;
+  margin: 1rem 0;
+  border: 0 solid #cfd8dc;
+  border-left-width: .25rem; }
+  .callout .chart-wrapper {
+    position: absolute;
+    top: 18px;
+    left: 45%;
+    float: right;
+    width: 100px; }
+
+.callout-bordered {
+  border: 1px solid #cfd8dc;
+  border-left-width: .25rem; }
+
+.callout code {
+  border-radius: .25rem; }
+
+.callout h4 {
+  margin-top: 0;
+  margin-bottom: .25rem; }
+
+.callout p:last-child {
+  margin-bottom: 0; }
+
+.callout + .callout {
+  margin-top: -0.25rem; }
+
+.callout-default {
+  border-left-color: #b0bec5; }
+  .callout-default h4 {
+    color: #b0bec5; }
+
+.callout-primary {
+  border-left-color: #20a8d8; }
+  .callout-primary h4 {
+    color: #20a8d8; }
+
+.callout-info {
+  border-left-color: #63c2de; }
+  .callout-info h4 {
+    color: #63c2de; }
+
+.callout-warning {
+  border-left-color: #f8cb00; }
+  .callout-warning h4 {
+    color: #f8cb00; }
+
+.callout-danger {
+  border-left-color: #f86c6b; }
+  .callout-danger h4 {
+    color: #f86c6b; }
+
+.callout-success {
+  border-left-color: #4dbd74; }
+  .callout-success h4 {
+    color: #4dbd74; }
+
+.switch.switch-default {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  width: 40px;
+  height: 24px;
+  background-color: transparent;
+  cursor: pointer; }
+  .switch.switch-default .switch-input {
+    position: absolute;
+    top: 0;
+    left: 0;
+    opacity: 0; }
+  .switch.switch-default .switch-label {
+    position: relative;
+    display: block;
+    height: inherit;
+    font-size: 10px;
+    font-weight: 600;
+    text-transform: uppercase;
+    background-color: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 2px;
+    -moz-transition: .15s ease-out;
+    -o-transition: .15s ease-out;
+    -webkit-transition: .15s ease-out;
+    transition: .15s ease-out;
+    -moz-transition-property: opacity background;
+    -o-transition-property: opacity background;
+    -webkit-transition-property: opacity background;
+    transition-property: opacity background; }
+  .switch.switch-default .switch-input:checked ~ .switch-label::before {
+    opacity: 0; }
+  .switch.switch-default .switch-input:checked ~ .switch-label::after {
+    opacity: 1; }
+  .switch.switch-default .switch-handle {
+    position: absolute;
+    top: 2px;
+    left: 2px;
+    width: 20px;
+    height: 20px;
+    background: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 1px;
+    -moz-transition: left .15s ease-out;
+    -o-transition: left .15s ease-out;
+    -webkit-transition: left .15s ease-out;
+    transition: left .15s ease-out; }
+  .switch.switch-default .switch-input:checked ~ .switch-handle {
+    left: 18px; }
+  .switch.switch-default.switch-lg {
+    width: 48px;
+    height: 28px; }
+    .switch.switch-default.switch-lg .switch-label {
+      font-size: 12px; }
+    .switch.switch-default.switch-lg .switch-handle {
+      width: 24px;
+      height: 24px; }
+    .switch.switch-default.switch-lg .switch-input:checked ~ .switch-handle {
+      left: 22px; }
+  .switch.switch-default.switch-sm {
+    width: 32px;
+    height: 20px; }
+    .switch.switch-default.switch-sm .switch-label {
+      font-size: 8px; }
+    .switch.switch-default.switch-sm .switch-handle {
+      width: 16px;
+      height: 16px; }
+    .switch.switch-default.switch-sm .switch-input:checked ~ .switch-handle {
+      left: 14px; }
+  .switch.switch-default.switch-xs {
+    width: 24px;
+    height: 16px; }
+    .switch.switch-default.switch-xs .switch-label {
+      font-size: 7px; }
+    .switch.switch-default.switch-xs .switch-handle {
+      width: 12px;
+      height: 12px; }
+    .switch.switch-default.switch-xs .switch-input:checked ~ .switch-handle {
+      left: 10px; }
+
+.switch.switch-text {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  width: 48px;
+  height: 24px;
+  background-color: transparent;
+  cursor: pointer; }
+  .switch.switch-text .switch-input {
+    position: absolute;
+    top: 0;
+    left: 0;
+    opacity: 0; }
+  .switch.switch-text .switch-label {
+    position: relative;
+    display: block;
+    height: inherit;
+    font-size: 10px;
+    font-weight: 600;
+    text-transform: uppercase;
+    background-color: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 2px;
+    -moz-transition: .15s ease-out;
+    -o-transition: .15s ease-out;
+    -webkit-transition: .15s ease-out;
+    transition: .15s ease-out;
+    -moz-transition-property: opacity background;
+    -o-transition-property: opacity background;
+    -webkit-transition-property: opacity background;
+    transition-property: opacity background; }
+  .switch.switch-text .switch-label::before,
+  .switch.switch-text .switch-label::after {
+    position: absolute;
+    top: 50%;
+    width: 50%;
+    margin-top: -.5em;
+    line-height: 1;
+    text-align: center;
+    -moz-transition: inherit;
+    -o-transition: inherit;
+    -webkit-transition: inherit;
+    transition: inherit; }
+  .switch.switch-text .switch-label::before {
+    right: 1px;
+    color: #cfd8dc;
+    content: attr(data-off); }
+  .switch.switch-text .switch-label::after {
+    left: 1px;
+    color: #fff;
+    content: attr(data-on);
+    opacity: 0; }
+  .switch.switch-text .switch-input:checked ~ .switch-label::before {
+    opacity: 0; }
+  .switch.switch-text .switch-input:checked ~ .switch-label::after {
+    opacity: 1; }
+  .switch.switch-text .switch-handle {
+    position: absolute;
+    top: 2px;
+    left: 2px;
+    width: 20px;
+    height: 20px;
+    background: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 1px;
+    -moz-transition: left .15s ease-out;
+    -o-transition: left .15s ease-out;
+    -webkit-transition: left .15s ease-out;
+    transition: left .15s ease-out; }
+  .switch.switch-text .switch-input:checked ~ .switch-handle {
+    left: 26px; }
+  .switch.switch-text.switch-lg {
+    width: 56px;
+    height: 28px; }
+    .switch.switch-text.switch-lg .switch-label {
+      font-size: 12px; }
+    .switch.switch-text.switch-lg .switch-handle {
+      width: 24px;
+      height: 24px; }
+    .switch.switch-text.switch-lg .switch-input:checked ~ .switch-handle {
+      left: 30px; }
+  .switch.switch-text.switch-sm {
+    width: 40px;
+    height: 20px; }
+    .switch.switch-text.switch-sm .switch-label {
+      font-size: 8px; }
+    .switch.switch-text.switch-sm .switch-handle {
+      width: 16px;
+      height: 16px; }
+    .switch.switch-text.switch-sm .switch-input:checked ~ .switch-handle {
+      left: 22px; }
+  .switch.switch-text.switch-xs {
+    width: 32px;
+    height: 16px; }
+    .switch.switch-text.switch-xs .switch-label {
+      font-size: 7px; }
+    .switch.switch-text.switch-xs .switch-handle {
+      width: 12px;
+      height: 12px; }
+    .switch.switch-text.switch-xs .switch-input:checked ~ .switch-handle {
+      left: 18px; }
+
+.switch.switch-icon {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  width: 48px;
+  height: 24px;
+  background-color: transparent;
+  cursor: pointer; }
+  .switch.switch-icon .switch-input {
+    position: absolute;
+    top: 0;
+    left: 0;
+    opacity: 0; }
+  .switch.switch-icon .switch-label {
+    position: relative;
+    display: block;
+    height: inherit;
+    font-family: FontAwesome;
+    font-size: 10px;
+    font-weight: 600;
+    text-transform: uppercase;
+    background-color: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 2px;
+    -moz-transition: .15s ease-out;
+    -o-transition: .15s ease-out;
+    -webkit-transition: .15s ease-out;
+    transition: .15s ease-out;
+    -moz-transition-property: opacity background;
+    -o-transition-property: opacity background;
+    -webkit-transition-property: opacity background;
+    transition-property: opacity background; }
+  .switch.switch-icon .switch-label::before,
+  .switch.switch-icon .switch-label::after {
+    position: absolute;
+    top: 50%;
+    width: 50%;
+    margin-top: -.5em;
+    line-height: 1;
+    text-align: center;
+    -moz-transition: inherit;
+    -o-transition: inherit;
+    -webkit-transition: inherit;
+    transition: inherit; }
+  .switch.switch-icon .switch-label::before {
+    right: 1px;
+    color: #cfd8dc;
+    content: attr(data-off); }
+  .switch.switch-icon .switch-label::after {
+    left: 1px;
+    color: #fff;
+    content: attr(data-on);
+    opacity: 0; }
+  .switch.switch-icon .switch-input:checked ~ .switch-label::before {
+    opacity: 0; }
+  .switch.switch-icon .switch-input:checked ~ .switch-label::after {
+    opacity: 1; }
+  .switch.switch-icon .switch-handle {
+    position: absolute;
+    top: 2px;
+    left: 2px;
+    width: 20px;
+    height: 20px;
+    background: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 1px;
+    -moz-transition: left .15s ease-out;
+    -o-transition: left .15s ease-out;
+    -webkit-transition: left .15s ease-out;
+    transition: left .15s ease-out; }
+  .switch.switch-icon .switch-input:checked ~ .switch-handle {
+    left: 26px; }
+  .switch.switch-icon.switch-lg {
+    width: 56px;
+    height: 28px; }
+    .switch.switch-icon.switch-lg .switch-label {
+      font-size: 12px; }
+    .switch.switch-icon.switch-lg .switch-handle {
+      width: 24px;
+      height: 24px; }
+    .switch.switch-icon.switch-lg .switch-input:checked ~ .switch-handle {
+      left: 30px; }
+  .switch.switch-icon.switch-sm {
+    width: 40px;
+    height: 20px; }
+    .switch.switch-icon.switch-sm .switch-label {
+      font-size: 8px; }
+    .switch.switch-icon.switch-sm .switch-handle {
+      width: 16px;
+      height: 16px; }
+    .switch.switch-icon.switch-sm .switch-input:checked ~ .switch-handle {
+      left: 22px; }
+  .switch.switch-icon.switch-xs {
+    width: 32px;
+    height: 16px; }
+    .switch.switch-icon.switch-xs .switch-label {
+      font-size: 7px; }
+    .switch.switch-icon.switch-xs .switch-handle {
+      width: 12px;
+      height: 12px; }
+    .switch.switch-icon.switch-xs .switch-input:checked ~ .switch-handle {
+      left: 18px; }
+
+.switch.switch-3d {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  width: 40px;
+  height: 24px;
+  background-color: transparent;
+  cursor: pointer; }
+  .switch.switch-3d .switch-input {
+    position: absolute;
+    top: 0;
+    left: 0;
+    opacity: 0; }
+  .switch.switch-3d .switch-label {
+    position: relative;
+    display: block;
+    height: inherit;
+    font-size: 10px;
+    font-weight: 600;
+    text-transform: uppercase;
+    background-color: #eceff1;
+    border: 1px solid #cfd8dc;
+    border-radius: 2px;
+    -moz-transition: .15s ease-out;
+    -o-transition: .15s ease-out;
+    -webkit-transition: .15s ease-out;
+    transition: .15s ease-out;
+    -moz-transition-property: opacity background;
+    -o-transition-property: opacity background;
+    -webkit-transition-property: opacity background;
+    transition-property: opacity background; }
+  .switch.switch-3d .switch-input:checked ~ .switch-label::before {
+    opacity: 0; }
+  .switch.switch-3d .switch-input:checked ~ .switch-label::after {
+    opacity: 1; }
+  .switch.switch-3d .switch-handle {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 24px;
+    height: 24px;
+    background: #fff;
+    border: 1px solid #cfd8dc;
+    border-radius: 1px;
+    -moz-transition: left .15s ease-out;
+    -o-transition: left .15s ease-out;
+    -webkit-transition: left .15s ease-out;
+    transition: left .15s ease-out;
+    border: 0;
+    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); }
+  .switch.switch-3d .switch-input:checked ~ .switch-handle {
+    left: 16px; }
+  .switch.switch-3d.switch-lg {
+    width: 48px;
+    height: 28px; }
+    .switch.switch-3d.switch-lg .switch-label {
+      font-size: 12px; }
+    .switch.switch-3d.switch-lg .switch-handle {
+      width: 28px;
+      height: 28px; }
+    .switch.switch-3d.switch-lg .switch-input:checked ~ .switch-handle {
+      left: 20px; }
+  .switch.switch-3d.switch-sm {
+    width: 32px;
+    height: 20px; }
+    .switch.switch-3d.switch-sm .switch-label {
+      font-size: 8px; }
+    .switch.switch-3d.switch-sm .switch-handle {
+      width: 20px;
+      height: 20px; }
+    .switch.switch-3d.switch-sm .switch-input:checked ~ .switch-handle {
+      left: 12px; }
+  .switch.switch-3d.switch-xs {
+    width: 24px;
+    height: 16px; }
+    .switch.switch-3d.switch-xs .switch-label {
+      font-size: 7px; }
+    .switch.switch-3d.switch-xs .switch-handle {
+      width: 16px;
+      height: 16px; }
+    .switch.switch-3d.switch-xs .switch-input:checked ~ .switch-handle {
+      left: 8px; }
+
+.switch-pill .switch-label, .switch.switch-3d .switch-label,
+.switch-pill .switch-handle, .switch.switch-3d .switch-handle {
+  border-radius: 50em !important; }
+
+.switch-pill .switch-label::before, .switch.switch-3d .switch-label::before {
+  right: 2px !important; }
+
+.switch-pill .switch-label::after, .switch.switch-3d .switch-label::after {
+  left: 2px !important; }
+
+.switch-primary > .switch-input:checked ~ .switch-label {
+  background: #20a8d8 !important;
+  border-color: #1985ac; }
+
+.switch-primary > .switch-input:checked ~ .switch-handle {
+  border-color: #1985ac; }
+
+.switch-primary-outline > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #20a8d8; }
+  .switch-primary-outline > .switch-input:checked ~ .switch-label::after {
+    color: #20a8d8; }
+
+.switch-primary-outline > .switch-input:checked ~ .switch-handle {
+  border-color: #20a8d8; }
+
+.switch-primary-outline-alt > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #20a8d8; }
+  .switch-primary-outline-alt > .switch-input:checked ~ .switch-label::after {
+    color: #20a8d8; }
+
+.switch-primary-outline-alt > .switch-input:checked ~ .switch-handle {
+  background: #20a8d8 !important;
+  border-color: #20a8d8; }
+
+.switch-secondary > .switch-input:checked ~ .switch-label {
+  background: #cfd8dc !important;
+  border-color: #b2c0c6; }
+
+.switch-secondary > .switch-input:checked ~ .switch-handle {
+  border-color: #b2c0c6; }
+
+.switch-secondary-outline > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #cfd8dc; }
+  .switch-secondary-outline > .switch-input:checked ~ .switch-label::after {
+    color: #cfd8dc; }
+
+.switch-secondary-outline > .switch-input:checked ~ .switch-handle {
+  border-color: #cfd8dc; }
+
+.switch-secondary-outline-alt > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #cfd8dc; }
+  .switch-secondary-outline-alt > .switch-input:checked ~ .switch-label::after {
+    color: #cfd8dc; }
+
+.switch-secondary-outline-alt > .switch-input:checked ~ .switch-handle {
+  background: #cfd8dc !important;
+  border-color: #cfd8dc; }
+
+.switch-success > .switch-input:checked ~ .switch-label {
+  background: #4dbd74 !important;
+  border-color: #3a9d5d; }
+
+.switch-success > .switch-input:checked ~ .switch-handle {
+  border-color: #3a9d5d; }
+
+.switch-success-outline > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #4dbd74; }
+  .switch-success-outline > .switch-input:checked ~ .switch-label::after {
+    color: #4dbd74; }
+
+.switch-success-outline > .switch-input:checked ~ .switch-handle {
+  border-color: #4dbd74; }
+
+.switch-success-outline-alt > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #4dbd74; }
+  .switch-success-outline-alt > .switch-input:checked ~ .switch-label::after {
+    color: #4dbd74; }
+
+.switch-success-outline-alt > .switch-input:checked ~ .switch-handle {
+  background: #4dbd74 !important;
+  border-color: #4dbd74; }
+
+.switch-info > .switch-input:checked ~ .switch-label {
+  background: #63c2de !important;
+  border-color: #39b2d5; }
+
+.switch-info > .switch-input:checked ~ .switch-handle {
+  border-color: #39b2d5; }
+
+.switch-info-outline > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #63c2de; }
+  .switch-info-outline > .switch-input:checked ~ .switch-label::after {
+    color: #63c2de; }
+
+.switch-info-outline > .switch-input:checked ~ .switch-handle {
+  border-color: #63c2de; }
+
+.switch-info-outline-alt > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #63c2de; }
+  .switch-info-outline-alt > .switch-input:checked ~ .switch-label::after {
+    color: #63c2de; }
+
+.switch-info-outline-alt > .switch-input:checked ~ .switch-handle {
+  background: #63c2de !important;
+  border-color: #63c2de; }
+
+.switch-warning > .switch-input:checked ~ .switch-label {
+  background: #f8cb00 !important;
+  border-color: #c5a100; }
+
+.switch-warning > .switch-input:checked ~ .switch-handle {
+  border-color: #c5a100; }
+
+.switch-warning-outline > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #f8cb00; }
+  .switch-warning-outline > .switch-input:checked ~ .switch-label::after {
+    color: #f8cb00; }
+
+.switch-warning-outline > .switch-input:checked ~ .switch-handle {
+  border-color: #f8cb00; }
+
+.switch-warning-outline-alt > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #f8cb00; }
+  .switch-warning-outline-alt > .switch-input:checked ~ .switch-label::after {
+    color: #f8cb00; }
+
+.switch-warning-outline-alt > .switch-input:checked ~ .switch-handle {
+  background: #f8cb00 !important;
+  border-color: #f8cb00; }
+
+.switch-danger > .switch-input:checked ~ .switch-label {
+  background: #f86c6b !important;
+  border-color: #f63c3a; }
+
+.switch-danger > .switch-input:checked ~ .switch-handle {
+  border-color: #f63c3a; }
+
+.switch-danger-outline > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #f86c6b; }
+  .switch-danger-outline > .switch-input:checked ~ .switch-label::after {
+    color: #f86c6b; }
+
+.switch-danger-outline > .switch-input:checked ~ .switch-handle {
+  border-color: #f86c6b; }
+
+.switch-danger-outline-alt > .switch-input:checked ~ .switch-label {
+  background: #fff !important;
+  border-color: #f86c6b; }
+  .switch-danger-outline-alt > .switch-input:checked ~ .switch-label::after {
+    color: #f86c6b; }
+
+.switch-danger-outline-alt > .switch-input:checked ~ .switch-handle {
+  background: #f86c6b !important;
+  border-color: #f86c6b; }
+
+.chart-wrapper canvas {
+  width: 100% !important; }
+
+base-chart.chart {
+  display: block !important; }
+
+.b-a-0 {
+  border: 0 !important; }
+
+.b-t-0 {
+  border-top: 0 !important; }
+
+.b-r-0 {
+  border-right: 0 !important; }
+
+.b-b-0 {
+  border-bottom: 0 !important; }
+
+.b-l-0 {
+  border-left: 0 !important; }
+
+.b-a-1 {
+  border: 1px solid #cfd8dc !important; }
+
+.b-t-1 {
+  border-top: 1px solid #cfd8dc !important; }
+
+.b-r-1 {
+  border-right: 1px solid #cfd8dc !important; }
+
+.b-b-1 {
+  border-bottom: 1px solid #cfd8dc !important; }
+
+.b-l-1 {
+  border-left: 1px solid #cfd8dc !important; }
+
+.b-a-2 {
+  border: 2px solid #cfd8dc !important; }
+
+.b-t-2 {
+  border-top: 2px solid #cfd8dc !important; }
+
+.b-r-2 {
+  border-right: 2px solid #cfd8dc !important; }
+
+.b-b-2 {
+  border-bottom: 2px solid #cfd8dc !important; }
+
+.b-l-2 {
+  border-left: 2px solid #cfd8dc !important; }
+
+.label-pill {
+  border-radius: 1rem !important; }
+
+.open > .dropdown-menu {
+  display: block; }
+
+.open > a {
+  outline: 0; }
+
+.navbar .dropdown-toggle .img-avatar {
+  height: 35px;
+  margin: 0 10px; }
+
+*[dir="rtl"] {
+  direction: rtl;
+  unicode-bidi: embed; }
+  *[dir="rtl"] ul {
+    -webkit-padding-start: 0; }
+  *[dir="rtl"] table tr th {
+    text-align: right; }
+  *[dir="rtl"] .breadcrumb-item {
+    float: right; }
+  *[dir="rtl"] .breadcrumb-menu {
+    right: auto;
+    left: 1rem; }
+  *[dir="rtl"] .dropdown-item {
+    text-align: right; }
+    *[dir="rtl"] .dropdown-item i {
+      margin-right: -10px;
+      margin-left: 10px; }
+    *[dir="rtl"] .dropdown-item .badge {
+      right: auto;
+      left: 10px; }
+  *[dir="rtl"] .sidebar-hidden .sidebar {
+    margin-right: -200px; }
+  *[dir="rtl"] .sidebar-fixed .main, *[dir="rtl"] .sidebar-fixed .app-footer {
+    margin-right: 200px; }
+  *[dir="rtl"] .sidebar-fixed.sidebar-hidden .main, *[dir="rtl"] .sidebar-fixed.sidebar-hidden .app-footer {
+    margin-right: 0; }
+  *[dir="rtl"] .sidebar-compact .sidebar {
+    flex: 0 0 50px; }
+  *[dir="rtl"] .sidebar-compact.sidebar-hidden .sidebar {
+    margin-left: -50px; }
+  *[dir="rtl"] .sidebar-compact.sidebar-fixed .main, *[dir="rtl"] .sidebar-compact.sidebar-fixed .app-footer {
+    margin-left: 50px; }
+  *[dir="rtl"] .sidebar-compact.sidebar-fixed.sidebar-hidden .main, *[dir="rtl"] .sidebar-compact.sidebar-fixed.sidebar-hidden .app-footer {
+    margin-left: 0; }
+  *[dir="rtl"] .aside-menu-hidden .aside-menu {
+    margin-left: -250px; }
+  *[dir="rtl"] .aside-menu-fixed .aside-menu {
+    right: auto;
+    left: 0; }
+  *[dir="rtl"] .aside-menu-fixed .main, *[dir="rtl"] .aside-menu-fixed .app-footer {
+    margin-left: 250px; }
+  *[dir="rtl"] .aside-menu-fixed.aside-menu-hidden .main, *[dir="rtl"] .aside-menu-fixed.aside-menu-hidden .app-footer {
+    margin-left: 0; }
+  *[dir="rtl"] .aside-menu-off-canvas .aside-menu {
+    position: fixed;
+    right: 0;
+    z-index: 999;
+    height: 100%; }
+    *[dir="rtl"] .aside-menu-off-canvas .aside-menu .tab-content {
+      height: calc(100vh - 2.375rem - 55px); }
+  *[dir="rtl"] .sidebar .sidebar-nav {
+    direction: ltr; }
+    *[dir="rtl"] .sidebar .sidebar-nav * {
+      direction: rtl; }
+    *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .nav-link [class^="icon-"], *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .navbar .dropdown-toggle [class^="icon-"], .navbar *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .dropdown-toggle [class^="icon-"], *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .nav-link [class*=" icon-"], *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .navbar .dropdown-toggle [class*=" icon-"], .navbar *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .dropdown-toggle [class*=" icon-"] {
+      margin-right: -4px; }
+    *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .nav-link .badge, *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .navbar .dropdown-toggle .badge, .navbar *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .dropdown-toggle .badge {
+      float: left;
+      margin-top: 2px; }
+    *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .nav-link.nav-dropdown-toggle::before, *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .navbar .nav-dropdown-toggle.dropdown-toggle::before, .navbar *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item .nav-dropdown-toggle.dropdown-toggle::before {
+      position: absolute;
+      right: auto !important;
+      left: 1rem; }
+    *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item.nav-dropdown.open > .nav-link.nav-dropdown-toggle::before, *[dir="rtl"] .sidebar .sidebar-nav .nav .navbar .nav-item.nav-dropdown.open > .nav-dropdown-toggle.dropdown-toggle::before, .navbar *[dir="rtl"] .sidebar .sidebar-nav .nav .nav-item.nav-dropdown.open > .nav-dropdown-toggle.dropdown-toggle::before {
+      -webkit-transform: rotate(90deg);
+      transform: rotate(90deg); }
+  *[dir="rtl"] .horizontal-bars li .bars {
+    padding-right: 100px;
+    padding-left: 0; }
+    *[dir="rtl"] .horizontal-bars li .bars .progress:first-child {
+      margin-bottom: 2px; }
+  *[dir="rtl"] .horizontal-bars.type-2 li i {
+    margin-right: 5px;
+    margin-left: 1rem; }
+  *[dir="rtl"] .horizontal-bars.type-2 li .value {
+    float: left;
+    font-weight: 600; }
+  *[dir="rtl"] .horizontal-bars.type-2 li .bars {
+    padding: 0; }
+  *[dir="rtl"] .icons-list li {
+    position: relative;
+    height: 40px;
+    vertical-align: middle; }
+    *[dir="rtl"] .icons-list li i {
+      float: right; }
+    *[dir="rtl"] .icons-list li .desc {
+      margin-right: 50px;
+      margin-left: 0; }
+    *[dir="rtl"] .icons-list li .value {
+      right: auto;
+      left: 45px;
+      text-align: left; }
+      *[dir="rtl"] .icons-list li .value strong {
+        display: block;
+        margin-top: -3px; }
+    *[dir="rtl"] .icons-list li .actions {
+      right: auto;
+      left: 10px; }
+  *[dir="rtl"] .callout {
+    border: 0 solid #cfd8dc;
+    border-right-width: .25rem; }
+    *[dir="rtl"] .callout .chart-wrapper {
+      left: 0;
+      float: left; }
+  *[dir="rtl"] .callout-default {
+    border-right-color: #b0bec5; }
+  *[dir="rtl"] .callout-primary {
+    border-right-color: #20a8d8; }
+  *[dir="rtl"] .callout-info {
+    border-right-color: #63c2de; }
+  *[dir="rtl"] .callout-warning {
+    border-right-color: #f8cb00; }
+  *[dir="rtl"] .callout-danger {
+    border-right-color: #f86c6b; }
+  *[dir="rtl"] .callout-success {
+    border-right-color: #4dbd74; }

+ 0 - 0
public/favicon.ico


BIN
public/fonts/FontAwesome.otf


BIN
public/fonts/Simple-Line-Icons.eot


File diff suppressed because it is too large
+ 15 - 0
public/fonts/Simple-Line-Icons.svg


BIN
public/fonts/Simple-Line-Icons.ttf


BIN
public/fonts/Simple-Line-Icons.woff


BIN
public/fonts/Simple-Line-Icons.woff2


Some files were not shown because too many files changed in this diff