commit f24a000718790c55b1dd369640e8414c62f1731f Author: Armie Date: Fri Mar 28 10:59:47 2025 +0800 Initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..92886be Binary files /dev/null and b/.DS_Store differ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6f313c6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 diff --git a/.env b/.env new file mode 100644 index 0000000..6f31806 --- /dev/null +++ b/.env @@ -0,0 +1,93 @@ +\APP_NAME=Unioil +APP_ENV=local +APP_KEY=base64:0gU9IIArwNb9IW4nkiuN72zGhw0YrtIVZnM7WJxxD88= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack + +DB_CONNECTION=mysql +DB_HOST="172.31.28.52" +DB_PORT=3306 +DB_DATABASE="unioilLoyaltyApp" +DB_USERNAME="bindapp" +DB_PASSWORD="hive1234" + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +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= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +#CYWARE="http://13.229.0.154/cgi-bin/uni_app.cgi" +#CYWARE="http://172.31.21.64/cgi-bin/uni_app.cgi" +CYWARE="http://172.31.47.37/cgi-bin/uni_app.cgi" +STRATUSCAST="http://unioil.com/unioilapi/ciapi/index.php" +STRATUSCASTUSERNAME="unioil@dmin123" +STRATUSCASTPASSWORD="!Str@tusc@stUnioil12345" +#RNRPHTESTING="https://testing-api-station-locator.herokuapp.com/api/" +RNRPHTESTING="https://unioilstationlocatorapi.lbteksystems.com/api/" +RNRPH="https://unioilstationlocatorapi.lbteksystems.com/api/" +RNRPHDEV="https://unioilstationlocatorapi.lbteksystems.com/api/" + +# paymaya vault +#PAYMAYA_ENV="https://pg-sandbox.paymaya.com/" +#PAYMAYA_SANDBOX_API_KEY="pk-Z0OSzLvIcOI2UIvDhdTGVVfRSSeiGStnceqwUE7n0Ah:" +#PAYMAYA_SANDBOX_SECRET_KEY="sk-X8qolYjy62kIzEbr0QRK1h4b4KDVHaNcwMYk39jInSl:" + + +PASSPORT_ADMIN_CLIENT_ID=2 +PASSPORT_ADMIN_CLIENT_SECRET=LmAfZ1tQ780pQNhdfhGhLI6slWHI1QQRtsvffiZS + +M360_BROADCAST_URL=https://smsapi.mobile360.ph/v2/api/broadcast +M360_BROADCAST_USERNAME=unioil +M360_BROADCAST_PASSWORD=l42Bvzh5 +M360_BROADCAST_SHORTCODE=UNIOIL +M360_ENV=LOCAL +M360_TEST_MOBILE=09231191959 + +#shared treats +SHAREDTREATSENCRYPTION="https://stg.sharetreats.ph:3044/encrypt/unioil/" +SHAREDTREATSGATEWAY="https://stg.sharetreats.ph:3044/gateway/unioil/" + +#paypal +#PAYPAL_ENV=SANDBOX +#PAYPAL_SANDBOX_URL=https://api.sandbox.paypal.com/v1 +#PAYPAL_LIVE_URL= +#PAYPAL_SANDBOX_CLIENTID=AePYXW1PMq0579oJTG-YgTwwR3KW_mLb0-9QBBQVwDUHviy--Upy3X6s9000CBSJQRhUxtiLL9RZkzDC +#PAYPAL_SANDBOX_SECRET=EC0z4zgVIl4Ztm-vUOBxoXuuPkZ9iXtlGsn32PXwNuUW9FaewCNqEPbfIvZr_ddg3w9cxMqqovq3HBhp +#PAYPAL_LIVE_CLIENTID= +#PAYPAL_LIVE_SECRET= + +#s3 +AWS_ACCESS_KEY_ID=AKIA4H24QCFWUMHBERLW +AWS_SECRET_ACCESS_KEY=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 +AWS_DEFAULT_REGION=ap-southeast-1 +AWS_BUCKET=unioil.mobiletestbucket +AWS_BUCKET_ENV=mobileapp +S3_FORMAT_VERSION=2 + +#front end +FRONT_END_URL="http://mobileinteglb-993304533.ap-southeast-1.elb.amazonaws.com" + +#si_num +SI_NUM_RANDOM=false diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..91fe97b --- /dev/null +++ b/.env.example @@ -0,0 +1,46 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack + +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 +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +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= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + + +#urls +CYWARE="http://13.229.0.154/cgi-bin/uni_app.cgi" +STRATUSCAST="http://unioil.com/unioilapi/ciapi/index.php" +STRATUSCASTUSERNAME="unioil@dmin123" +STRATUSCASTPASSWORD="!Str@tusc@stUnioil12345" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..967315d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto +*.css linguist-vendored +*.scss linguist-vendored +*.js linguist-vendored +CHANGELOG.md export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6421944 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/node_modules +#/public/hot +#/public/storage +# /storage/*.key +/vendor +/.idea +/.vscode +/.vagrant +Homestead.json +Homestead.yaml +npm-debug.log +yarn-error.log + +.phpunit.result.cache diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9ce61a --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# UniOil-API + +This repository contains all the backend code for the Unioil Loyalty Mobile Application. \ No newline at end of file diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000..513c7a8 Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/Abstracts/CustomFormRequest.php b/app/Abstracts/CustomFormRequest.php new file mode 100644 index 0000000..c6ccbd7 --- /dev/null +++ b/app/Abstracts/CustomFormRequest.php @@ -0,0 +1,60 @@ +response( + $this->formatErrors($validator) + )); + } + + /** + * Format the errors from the given Validator instance. + * + * @param \Illuminate\Contracts\Validation\Validator $validator + * @return array + */ + protected function formatErrors(Validator $validator) + { + return $validator->getMessageBag()->toArray(); + } + + /** + * Get the proper failed validation response for the request. + * + * @param array $errors + * @return \Symfony\Component\HttpFoundation\Response + */ + public function response(array $errors) + { + if ($this->expectsJson()) { + return new JsonResponse($errors, 422); + } + + return $this->redirector->to($this->getRedirectUrl()) + ->withInput($this->except($this->dontFlash)) + ->withErrors($errors, $this->errorBag); + } +} \ No newline at end of file diff --git a/app/Admin.php b/app/Admin.php new file mode 100644 index 0000000..abedf5a --- /dev/null +++ b/app/Admin.php @@ -0,0 +1,70 @@ +firstname." ".$this->lastname); + } + + public function setFullNameAttribute($key) + { + return ucwords($this->firstname." ".$this->lastname); + } + + public function setFirstnameAttribute($value) + { + return $this->attributes['firstname'] = ucwords($value); + } + + public function setLastnameAttribute($value) + { + return $this->attributes['lastname'] = ucwords($value); + } + + public function user() + { + return $this->hasOne('App\User','username',"username"); + } +} diff --git a/app/AdminActionLogs.php b/app/AdminActionLogs.php new file mode 100644 index 0000000..3331762 --- /dev/null +++ b/app/AdminActionLogs.php @@ -0,0 +1,52 @@ +hasMany('App\IDNumberType','cardtype_id','cardtype_id'); + } +} diff --git a/app/CodeCity.php b/app/CodeCity.php new file mode 100644 index 0000000..13891e3 --- /dev/null +++ b/app/CodeCity.php @@ -0,0 +1,53 @@ +hasOne('App\CodeProvince','province_id','province_id'); + // } + + public function station() + { + return $this->hasMany('App\Station','city_id','city_id'); + } + + public function scopeUuid($query,$uuid) + { + $query->where('is_active',1); + $query->where('city_uuid',$uuid); + } +} diff --git a/app/CodeCivilStatus.php b/app/CodeCivilStatus.php new file mode 100644 index 0000000..3c3bfc1 --- /dev/null +++ b/app/CodeCivilStatus.php @@ -0,0 +1,43 @@ +where('is_active',1); + $query->where('code',$code); + } + +} diff --git a/app/CodeFuelType.php b/app/CodeFuelType.php new file mode 100644 index 0000000..fdba674 --- /dev/null +++ b/app/CodeFuelType.php @@ -0,0 +1,43 @@ +where('is_active',1); + $query->where('code',$code); + } +} diff --git a/app/CodeGender.php b/app/CodeGender.php new file mode 100644 index 0000000..84bf4e7 --- /dev/null +++ b/app/CodeGender.php @@ -0,0 +1,43 @@ +where('is_active',1); + $query->where('code',$code); + } +} diff --git a/app/CodeProvince.php b/app/CodeProvince.php new file mode 100644 index 0000000..7983008 --- /dev/null +++ b/app/CodeProvince.php @@ -0,0 +1,44 @@ +hasMany('App\CodeCity','province_id','province_id'); + } + +} diff --git a/app/CodeVehicleOwn.php b/app/CodeVehicleOwn.php new file mode 100644 index 0000000..8850ef3 --- /dev/null +++ b/app/CodeVehicleOwn.php @@ -0,0 +1,42 @@ +where('is_active',1); + $query->where('code',$code); + } +} diff --git a/app/Console/Commands/InactiveLoyaltyCard.php b/app/Console/Commands/InactiveLoyaltyCard.php new file mode 100644 index 0000000..cc62987 --- /dev/null +++ b/app/Console/Commands/InactiveLoyaltyCard.php @@ -0,0 +1,66 @@ +subYear(); + $orders = DB::select( + "SELECT * + FROM lcard_action_logs t1 + WHERE t1.created_at = ( + SELECT MAX(t2.created_at) + FROM lcard_action_logs t2 + WHERE t2.created_by = t1.created_by) + and created_at < '".$now."' + and created_by <> 0 + group by created_by"); + echo "-------start-------"; + foreach ($orders as $key => $value){ + $mobile_usage->add_inactive(); + $loyalty_card->setInactive($value->created_by); + $lcardActionLogscard->log($value->created_by,'CRONJOB','INACTIVE'); + print_r($value); + } + echo "-------finish-------"; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..8acf455 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,43 @@ +command('inactive:loyaltycard') + ->daily(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Contracts/AdminActionLogsInterface.php b/app/Contracts/AdminActionLogsInterface.php new file mode 100644 index 0000000..8d01d1a --- /dev/null +++ b/app/Contracts/AdminActionLogsInterface.php @@ -0,0 +1,13 @@ +mobileAnalytics = $mobileAnalytics; + } + + /** + * @return \Illuminate\Support\Collection + */ + public function collection() + { + $request = request(); + + $params = [ + 'page_size' => null, + 'page' => null, + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + + if(ParameterHelper::validateStartEndDate($params)) + { + return $this->format->unprocessableEntity('Start date must not be greater than end date'); + } + + $list = $this->mobileAnalytics->report_mobileUsage($params, true); + + $data = collect([['Date', 'Active', 'Inactive', 'Locked']]); + + if($list->count()) + { + foreach ($list as $key => $value) { + $data->push([ + date('d-M-Y',strtotime($value->date)), + $value->active == 0 ? "0" : $value->active, + $value->inactive == 0 ? "0" : $value->inactive, + $value->locked == 0 ? "0" : $value->locked, + ]); + } + } + + return $data; + } +} diff --git a/app/Exports/ReportRegistrationExport.php b/app/Exports/ReportRegistrationExport.php new file mode 100644 index 0000000..d896ddf --- /dev/null +++ b/app/Exports/ReportRegistrationExport.php @@ -0,0 +1,50 @@ +register = $register; + } + + /** + * @return \Illuminate\Support\Collection + */ + public function collection() + { + $request = request(); + + $params = [ + 'page_size' => null, + 'page' => null, + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + $list = $this->register->report_registration($params, true); + $data = collect([['Date', 'Activated', 'Registered']]); + + if($list->count()) + { + + foreach ($list as $key => $value) { + $data->push([ + date('d-M-Y',strtotime($value->created_at)), + $value->activated == 0 ? "0" : $value->activated, + $value->registered == 0 ? "0" : $value->registered, + ]); + } + } + + return $data; + } +} diff --git a/app/Exports/ReportStationRatingsExport.php b/app/Exports/ReportStationRatingsExport.php new file mode 100644 index 0000000..3c560cb --- /dev/null +++ b/app/Exports/ReportStationRatingsExport.php @@ -0,0 +1,59 @@ +ratings = $ratings; + } + + /** + * @return \Illuminate\Support\Collection + */ + public function collection() + { + $request = request(); + + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => null, + 'page' => null, + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + + if(ParameterHelper::validateStartEndDate($params)) + { + return $this->format->unprocessableEntity('Start date must not be greater than end date'); + } + + $list = $this->ratings->report_stationRatings($params, true); + + $data = collect([['Transaction Date & Time', 'Card Number', 'Sales Invoice', 'Station', 'Ratings']]); + + if($list->count()) + { + foreach ($list as $key => $value) { + $data->push( [ + date('d-M-Y h:i A',strtotime($value->created_at)), + '="' .$value->loyaltyCard->card_number. '"', + $value->payment->trans_num, + $value->station->description, + $value->rate + ]); + } + } + + return $data; + } +} diff --git a/app/Exports/ReportTopUpExport.php b/app/Exports/ReportTopUpExport.php new file mode 100644 index 0000000..1f5cc79 --- /dev/null +++ b/app/Exports/ReportTopUpExport.php @@ -0,0 +1,57 @@ +payments = $payments; + } + + /** + * @return \Illuminate\Support\Collection + */ + public function collection() + { + $request = request(); + + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => null, + 'page' => null, + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + if(ParameterHelper::validateStartEndDate($params)) + { + return $this->format->unprocessableEntity('Start date must not be greater than end date'); + } + + $list = $this->payments->report_topUp($params, true); + + $data = collect([['Date & Time', 'Card Number', 'Amount']]); + + if($list->count()) + { + foreach ($list as $key => $value) { + $data->push( [ + date('d-M-Y h:i A',strtotime($value->paid_at)), + '="' .$value->loyaltyCard->card_number. '"', + $value->amount, + ]); + } + } + + return $data; + } +} diff --git a/app/FuelTracker.php b/app/FuelTracker.php new file mode 100644 index 0000000..d96fa66 --- /dev/null +++ b/app/FuelTracker.php @@ -0,0 +1,37 @@ +username) + ->where('is_active',1) + ->get() + ->first(); + + if($admin) + return $admin; + } + + return null; + + } + + public static function getAdminName($id) + { + $admin = Admin::where('admin_id',$id)->get()->first(); + + if($admin) + return ucwords($admin->firstname." ".$admin->lastname); + else + return null; + } + + public static function get_currentMember() + { + $auth = Auth::user(); + if($auth) + { + $member = LoyaltyCard::with('personalDetails') + ->join('users', 'loyalty_card.card_number' , '=', 'users.username') + ->select('users.name', 'loyalty_card.*') + ->where('loyalty_card.card_number',$auth->username) + ->where('loyalty_card.is_active',1) + ->get() + ->first(); + if($member) + return $member; + } + + return null; + + } + + public static function get_currentUser() + { + $auth = Auth::user(); + if($auth) return $auth; + return null; + } + + public static function get_member_by_lcard($lcard_uuid) + { + $member = LoyaltyCard::with('personalDetails') + ->where('lcard_uuid',$lcard_uuid) + ->where('is_active',1) + ->get() + ->first(); + + if($member){ + return $member; + } + } + +} + +?> diff --git a/app/Helpers/HttpStatusCode.php b/app/Helpers/HttpStatusCode.php new file mode 100644 index 0000000..9712e6a --- /dev/null +++ b/app/Helpers/HttpStatusCode.php @@ -0,0 +1,385 @@ +200, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The request has been fulfilled, resulting in the creation of a new resource + * + * @param string $message + * @param array $content + * @return Response object + */ + public function created($message="CREATED",$content=array(),$withJson = true) + { + $return = [ + 'code'=>201, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The server successfully processed the request and is not returning any data. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function noContent($message="NO CONTENT",$content=array(),$withJson = true) + { + $return = [ + 'code'=>204, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The server successfully processed the request, but is not returning any data. + * Unlike a 204 response, this response requires that the requester reset the document view. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function resetContent($message="RESET CONTENT",$content=array(),$withJson = true) + { + $return = [ + 'code'=>205, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The server is delivering only part of the resource (byte serving) due to a range header sent by the client. + * The range header is used by HTTP clients to enable resuming of interrupted downloads, + * or split a download into multiple simultaneous streams. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function partialContent($message="PARTIAL CONTENT",$content=array(),$withJson = true) + { + $return = [ + 'code'=>206, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The server cannot or will not process the request due to an apparent client error + * (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing) + * + * @param string $message + * @param array $content + * @return Response object + */ + public function badRequest($message="BAD REQUEST",$content=array(),$withJson = true) + { + $return = [ + 'code'=>400, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided. + * The response must include a WWW-Authenticate header field containing a challenge applicable to the requested resource. + * See Basic access authentication and Digest access authentication. + * 401 semantically means "unauthenticated",[34] i.e. the user does not have the necessary credentials. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function unauthorized($message="UNAUTHORIZED",$content=array(),$withJson = true) + { + $return = [ + 'code'=>401, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The request was a valid request, but the server is refusing to respond to it. + * The user might be logged in but does not have the necessary permissions for the resource. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function forbidden($message="FORBIDDEN",$content=array(),$withJson = true) + { + $return = [ + 'code'=>403, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The requested resource could not be found but may be available in the future. + * Subsequent requests by the client are permissible. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function notFound($message="NOT FOUND",$content=array(),$withJson = true) + { + $return = [ + 'code'=>404, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The request is larger than the server is willing or able to process. + * Previously called "Request Entity Too Large". + * + * @param string $message + * @param array $content + * @return Response object + */ + public function payloadToLarge($message="PAYLOAD TO LARGE",$content=array(),$withJson = true) + { + $return = [ + 'code'=>413, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * The request was well-formed but was unable to be followed due to semantic errors + * + * @param string $message + * @param array $content + * @return Response object + */ + public function unprocessableEntity($message="Unprocessable Entity",$content=array(),$withJson = true) + { + $return = [ + 'code'=>422, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * Error found during process + * + * @param string $message + * @param array $content + * @return Response object + */ + public function applicationValidationErrorCode($message="Error found",$content=array(),$withJson = true) + { + $return = [ + 'code'=>400, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * A code of 498 indicates an expired or otherwise invalid token. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function invalidToken($message="INVALID TOKEN",$content=array(),$withJson = true) + { + $return = [ + 'code'=>498, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * A code of 499 indicates that a token is required but was not submitted. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function requiredToken($message="REQUIRED TOKEN",$content=array(),$withJson = true) + { + $return = [ + 'code'=>499, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable. + * + * @param string $message + * @param array $content + * @return Response object + */ + public function internalServerError($message="INTERNAL SERVER ERROR",$content=array(),$withJson = true) + { + $return = [ + 'code'=>500, + 'message'=>$message, + 'data' => $content + ]; + + if($withJson) + return Response::json($return,$return['code']); + else + return $return; + } + + /** + * Mobile Success Response + * + * @param string $message + * @param array $content + * @return Response object + */ + public function mobile_success($message="Success",$content=null, $withJson = true) + { + $return = [ + 'status'=>1, + 'message'=>$message, + 'data' => is_null($content) ? (object)[] : $content + ]; + + if($withJson) + return Response::json($return,200); + else + return $return; + } + + /** + * Mobile Error Response + * + * @param string $message + * @param array $content + * @return Response object + */ + public function mobile_error($message="Error",$content=null, $withJson = true) + { + $return = [ + 'status'=>0, + 'message'=>$message, + 'data' => is_null($content) ? (object)[] : $content + ]; + + if($withJson) + return Response::json($return,200); + else + return $return; + } +} \ No newline at end of file diff --git a/app/Helpers/StringHelper.php b/app/Helpers/StringHelper.php new file mode 100644 index 0000000..677a699 --- /dev/null +++ b/app/Helpers/StringHelper.php @@ -0,0 +1,61 @@ + 0) + { + $SCPool = '!"#$%&()*+,-./:;<=>?@[\]^_`{|}~'; + $temp .= substr(str_shuffle(str_repeat($SCPool, 5)), 0, $specialCharacters); + } + + // return substr(str_shuffle(str_repeat($pool, 5)), 0, $length); + return str_shuffle($temp); + } + + public static function random_num($length = 16) + { + + $pool = '0123456789'; + + return substr(str_shuffle(str_repeat($pool, 5)), 0, $length); + } + + public static function check_time_exceeded($from, $interval, $to = null) + { + + $from = strtotime($interval, strtotime($from)); + $to = ($to == null) ? strtotime(date('Y-m-d H:i:s')) : strotime($to); + + if($from > $to ) + return true; + else + return false; + + } + + public static function check_date_if_between($from, $to, $now = null) + { + if($now == null) + $now = date('Y-m-d H:i:s'); + + $from = strtotime($from); + $to = strtotime($to); + $now = strtotime($now); + + if(($now > $from) && ($now < $to)) + return 'On-Going'; + elseif($now < $from) + return 'Pending'; + else + return 'Done'; + } +} + +?> diff --git a/app/Http/.DS_Store b/app/Http/.DS_Store new file mode 100644 index 0000000..046f29e Binary files /dev/null and b/app/Http/.DS_Store differ diff --git a/app/Http/Controllers/API/AdminController.php b/app/Http/Controllers/API/AdminController.php new file mode 100644 index 0000000..021f7b0 --- /dev/null +++ b/app/Http/Controllers/API/AdminController.php @@ -0,0 +1,336 @@ +admin = $admin; + $this->user = $user; + $this->format = $httpStatusCode; + $this->module = "admin"; + $this->model = "admin"; + $this->password_logs = $password_logs; + $this->admin_logs = $admin_logs; + $this->systemPreference = $systemPreference; + } + + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request), + 'filter' => [ + 'role' => ($request->has('role') ? $request->get('role') : null), + 'status' => ($request->has('status') ? $request->get('status') : null) + ] + ]; + + $list = $this->admin->listing($params); + + + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = AdminResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(AdminFormValidation $request) + { + $id = $this->admin->store($request); + if($id) + { + $this->user->store($request, 1); + $this->admin_logs->log($id,self::MODULE,'STORE'); + + return $this->format->created(); + } + else + { + return $this->format->notFound(); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = $this->admin->getByField(['admin_uuid' => $uuid]); + + if($details->count()) + { + $details = $details[0]; + + // check if there's existing generated password + $last_password_log = $this->password_logs->getLastLog($details['admin_id']); + + if($last_password_log) + { + $hasExceeded = StringHelper::check_time_exceeded($last_password_log['created_dt'], '+15 minutes'); + + if($last_password_log['is_generated'] == 1 && $hasExceeded == true) + { + $details['generated_password'] = $last_password_log['generated_password']; + } + } + + $additionals = $this->format->success("Success",[],false); + $data = (new AdminResource($details))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + return $this->format->notFound(); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(AdminFormValidation $request, $uuid) + { + // get old data + $old_data = $this->admin->getByField(['admin_uuid' => $uuid]); + + if($old_data->count()) + { + if($this->admin->update($request,$uuid)) + { + $this->user->updateAdmin($request, $old_data[0]['username']); + + + if($request->has('password')) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->password_logs->store($old_data[0]['admin_id'],$request->get('password'),$currentUser->admin_id, true); + } + + $this->admin_logs->log($old_data[0]['admin_id'],self::MODULE,'UPDATE'); + return $this->format->success("ADMIN UPDATED"); + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + + return $this->format->notFound(); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $admin_details = $this->admin->getByField(['admin_uuid' => $uuid]); + + if($admin_details->count()) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if($admin_details[0]['admin_id'] != $currentUser->admin_id) + { + $user_details = $this->user->getUsername($admin_details[0]['username']); + $this->admin->delete($uuid); + if($this->user->delete($user_details['id']) ){ + $this->admin_logs->log($admin_details[0]['admin_id'],self::MODULE,'DELETE'); + return $this->format->success("Admin Successfully Deleted"); + } + } + else + return $this->format->badRequest('Cannot delete own account'); + } + else + return $this->format->notFound(); + } + + public function batch_delete(Request $request) + { + $admin_uuid = $request->has('admin_uuid') ? $request->get('admin_uuid') : null; + + if($admin_uuid) + { + $admin_details = $this->admin->getDetailsWhereIn('admin_uuid',$admin_uuid,'user'); + $currentUser = CurrentUserHelper::get_currentAdmin(); + + $id = array(); + + foreach ($admin_details as $key => $value) + { + if($value['admin_id'] != $currentUser->admin_id) + { + $id[] = $value['user']['id']; + $this->admin_logs->log($value['admin_id'],self::MODULE,'DELETE'); + } + else + return $this->format->badRequest('Cannot delete own acount'); + } + + if($this->admin->delete($admin_uuid) && $this->user->delete($id)) + { + return $this->format->success("Admin Successfully Deleted"); + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + else + { + $data['admin_uuid'] = 'admin_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one admin",$data); + } + } + + public function generate_password(Request $request) + { + $admin_uuid = ($request->has('admin_uuid') ? $request->get('admin_uuid') : NULL); + + if($admin_uuid == NULL) + { + $data['password'] = StringHelper::random_string(8,1); + } + else + { + $data['password'] = StringHelper::random_string(8,1); + $admin = $this->admin->getByField(['admin_uuid' => $admin_uuid]); + $logs = $this->password_logs->getByField(['admin_id' => $admin[0]['admin_id']]); + + if(count($logs) > 0) + { + $ctr = 1; + foreach ($logs as $key => $value) { + if($ctr <= 2) + { + if($value['password'] == md5($data['password'])) + $data['password'] = StringHelper::random_string(8,1); + } + } + } + + + + } + + return $this->format->success("Password Generated",$data); + } + + public function myProfile() + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + $admin = $this->admin->show($currentUser->admin_uuid); + + $rpreference = $this->systemPreference->getByField('name', 'logo'); + $admin->logo = $rpreference[0]->value; + + if ($admin){ + return $this->format->success("SUCCESS",$admin); + + }else{ + return $this->format->notFound(); + } + } + + public function changeStatus(Request $request) + { + $admin_uuid = ($request->has('admin_uuid') ? $request->get('admin_uuid') : NULL); + $old_data = $this->admin->getByField(['admin_uuid' => $admin_uuid]); + + if($old_data->count()) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if($old_data[0]['admin_id'] != $currentUser->admin_id) + { + // $newStatus = $old_data[0]['status'] == 0 ? 1 : 0; + $newStatus = StaticContents::admin_status($request->get('status'), true); + + if($this->admin->changeStatus($newStatus,$admin_uuid)) + { + + if($newStatus == 1) + { + $this->user->force_logout($old_data[0]['username']); + } + + $this->admin_logs->log($old_data[0]['admin_id'],self::MODULE,'UPDATE','Changed Status to '.($newStatus == 1 ? "inactive" : "active")); + return $this->format->success("User Account is ".($newStatus == 1 ? "deactivated" : "activated"),["status" => ($newStatus == 1 ? "inactive" : "active")]); + } + } + else + return $this->format->badRequest('Cannot update own acount'); + } + + return $this->format->notFound(); + + } + +} diff --git a/app/Http/Controllers/API/CardTypeController.php b/app/Http/Controllers/API/CardTypeController.php new file mode 100644 index 0000000..16967a5 --- /dev/null +++ b/app/Http/Controllers/API/CardTypeController.php @@ -0,0 +1,263 @@ +cardType = $cardType; + $this->format = $httpStatusCode; + $this->module = "cardType"; + $this->model = "cardType"; + $this->admin_logs = $admin_logs; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + $list = $this->cardType->listing($params); + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = CardTypeResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(CardTypeFormValidation $request) + { + $id = $this->cardType->store($request); + + if($id) + { + $this->admin_logs->log($id,self::MODULE,'STORE'); + + return $this->format->created('Card Type has been added'); + } + else + { + return $this->format->notFound(); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = $this->cardType->getByField(['cardtype_uuid' => $uuid]); + + if($details->count()) + { + $additionals = $this->format->success("Success",[],false); + $data = (new CardTypeResource($details[0]))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + return $this->format->notFound(); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(CardTypeFormValidation $request, $uuid) + { + $old_data = $this->cardType->getByField(['cardtype_uuid' => $uuid]); + + if($old_data->count()) + { + if($this->cardType->update($request,$uuid)) + { + $this->admin_logs->log($old_data[0]['cardtype_id'],self::MODULE,'UPDATE'); + return $this->format->success("Card Type has been updated"); + } + else + { + return $this->format->notFound(); + } + } + + return $this->format->notFound(); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $details = $this->cardType->getByField(['cardtype_uuid' => $uuid]); + if($details->count()) + { + $details = $details[0]; + if($this->cardType->delete($uuid)) + { + $this->admin_logs->log($details['cardtype_id'],self::MODULE,'DELETE'); + return $this->format->success("Card Type Successfully Deleted"); + } + + } + + return $this->format->notFound(); + } + + public function batch_delete(Request $request) + { + $uuid = $request->has('cardtype_uuid') ? $request->get('cardtype_uuid') : null; + + if($uuid) + { + $details = $this->cardType->getDetailsWhereIn('cardtype_uuid',$uuid); + + + $id = array(); + + if($this->cardType->delete($uuid)) + { + foreach ($details as $key => $value) + { + $this->admin_logs->log($value['cardtype_id'],self::MODULE,'DELETE'); + } + + return $this->format->success("Card Type Successfully Deleted"); + + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + else + { + $data['cardtype_uuid'] = 'cardtype_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one item",$data); + } + } + + public function getAllCardType() + { + $data = $this->cardType->getAllCardType(); + if (count($data) < 1){ + return $this->format->mobile_error('please contact us'); + } + + foreach ($data as $key => $value){ + // $data[$key]['image'] = $value['image'] ? str_replace('https', 'http', str_replace('/public/index.php','',secure_url('storage/app/'.$value['image']))) : '' ; + $data[$key]['image'] = $value['image'] ? S3::public_path($value['image']) : '' ; + $data[$key]['bg_image'] = $value['bg_image'] ? S3::public_path($value['bg_image']) : '' ; + $data[$key]['description'] = is_null($value['description']) ? "" : $value['description']; + $data[$key]['terms_and_conditions'] = is_null($value['terms_and_conditions']) ? "" : $value['terms_and_conditions']; + $data[$key]['faqs'] = is_null($value['faqs']) ? "" : $value['faqs']; + + $data[$key]['details'] = [ + [ + "level"=>0, + "title"=>"Description", + "details"=>[[ + "level"=>1, + "details"=>is_null($value['description']) ? "" : $value['description'] + ]] + ], + [ + "level"=>0, + "title"=>"Terms and Conditions", + "details"=>[[ + "level"=>1, + "details"=>is_null($value['terms_and_conditions']) ? "" : $value['terms_and_conditions'] + ]] + ], + [ + "level"=>0, + "title"=>"FAQS", + "details"=>[[ + "level"=>1, + "details"=>is_null($value['faqs']) ? "" : $value['faqs'] + ]] + ], + + + ]; + } + + return $this->format->mobile_success('Sucess',$data); + + } + +} diff --git a/app/Http/Controllers/API/CityAndProvinceController.php b/app/Http/Controllers/API/CityAndProvinceController.php new file mode 100644 index 0000000..c09423a --- /dev/null +++ b/app/Http/Controllers/API/CityAndProvinceController.php @@ -0,0 +1,285 @@ +cityAndProvince = $cityAndProvince; + $this->station = $station; + $this->format = $httpStatusCode; + $this->module = "CitAndProvince"; + $this->model = "CitAndProvince"; + $this->url = $url; + $this->admin = $admin; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(SystemPreferenceFormValidation $request) + { + + + } + /** + * Display the specified resource. + *d + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + + + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } + + public function sync() + { + + $cyware = new StratuscastLibrary(); + $cyware->getCityAndProvince(); + if ($cyware->response['status_code'] == "200") { + foreach ($cyware->response['data'] as $key => $value) { + $province = $this->cityAndProvince->getProvinceByField("code", $value->province_code); + $province_id = 0; + + $data['code'] = $value->province_code; + $data['name'] = $value->province_name; + + if (isset($value->province_code)){ + if (count($province) == 0) { + $province_id = $this->cityAndProvince->storeProvince($data); + } else { + $province_id = $province[0]->province_id; + $data['province_id'] = $province_id; + $this->cityAndProvince->updateProvince($data); + } + } + + $city = $this->cityAndProvince->getCityByField("code", $value->city_code); + $data['code'] = $value->city_code; + $data['name'] = $value->city_name; + + if (isset($value->city_code)){ + if (count($city) == 0) { + $data['province_id'] = $province_id; + $this->cityAndProvince->storeCity($data); + } else { + $data['province_id'] = $province_id; + $data['city_id'] = $city[0]->city_id; + $this->cityAndProvince->updateCity($data); + } + } + + + } + return $this->format->success("Success", []); + + }else{ + return $this->format->success("Something went wrong",[]); + } + + + } + + public function get_all() + { + $province_city = $this->cityAndProvince->getAllRelationship(); + + + $return = []; + $previous_province = ''; + $ctr = 0; + $current_array = []; + + foreach ($province_city as $key => $province) + { + if($previous_province != $province->name) + { + if($ctr != 0) + $return[] = $current_array; + + $current_array = []; + + $current_array['name'] = $province->name; + $current_array['city'][] = [ + 'name' => $province->city_name, + 'city_uuid' => $province->city_uuid, + ]; + } + else + { + $current_array['city'][] = [ + 'name' => $province->city_name, + 'city_uuid' => $province->city_uuid, + ]; + } + $previous_province = $province->name; + $ctr++; + } + + return $this->format->mobile_success('Success',$return); + } + + + + //RNRPH + public function syncCityProvince() + { + + $rnrph = new RNRPHLibrary(); + $rnrph->getAllBranches(); + if (count($rnrph->response['data']) > 0) { + $ids = []; + $st = $this->cityAndProvince->getAllCities(); + foreach ($st as $key => $value) { + array_push($ids,$value->city_id); + } + $this->cityAndProvince->disbale_cities($ids); + foreach ($rnrph->response['data'] as $key => $value) { + // $province = $this->cityAndProvince->getProvinceByField("code", $value->province_code); + // $province_id = 0; + + // $data['code'] = $value->province_code; + // $data['name'] = $value->province_name; + + // if (isset($value->province_code)){ + // if (count($province) == 0) { + // $province_id = $this->cityAndProvince->storeProvince($data); + // } else { + // $province_id = $province[0]->province_id; + // $data['province_id'] = $province_id; + // $this->cityAndProvince->updateProvince($data); + // } + // } + + $city = $this->cityAndProvince->getCityByField("code", $value->city_code); + $data['code'] = $value->city_code; + $data['name'] = $value->city_name; + + if (isset($value->city_code)){ + if (count($city) == 0) { + $this->cityAndProvince->storeCity($data); + } else { + $data['city_id'] = $city[0]->city_id; + $this->cityAndProvince->updateCity($data); + } + } + + + } + return $this->format->success("Success", $rnrph->response['data']); + + }else{ + return $this->format->success("Something went wrong",[]); + } + + + } + + public function get_city_list() + { + $city = $this->cityAndProvince->getAllCities(); + $return = []; + foreach ($city as $key => $value) { + $station = $this->station->get_station_by_city_uuid($value->city_id); + if(count($station) > 0){ + $return[] = $value; + } + } + return $this->format->mobile_success('Success',$return); + + } + +} diff --git a/app/Http/Controllers/API/CodeCivilStatusController.php b/app/Http/Controllers/API/CodeCivilStatusController.php new file mode 100644 index 0000000..f8ba5f5 --- /dev/null +++ b/app/Http/Controllers/API/CodeCivilStatusController.php @@ -0,0 +1,41 @@ +civilStatus = $civilStatus; + $this->format = $httpStatusCode; + } + + public function get_all() + { + $data = $this->civilStatus->getAll(); + $return = []; + + foreach ($data as $key => $value) { + $return[] = [ + 'name' => $value->description, + 'civilstatus_uuid' => $value->civilstatus_uuid + ]; + } + + return $this->format->mobile_success('Success',$return); + } +} diff --git a/app/Http/Controllers/API/CodeFuelTypeController.php b/app/Http/Controllers/API/CodeFuelTypeController.php new file mode 100644 index 0000000..8ffc6ed --- /dev/null +++ b/app/Http/Controllers/API/CodeFuelTypeController.php @@ -0,0 +1,41 @@ +fueltype = $fueltype; + $this->format = $httpStatusCode; + } + + public function get_all() + { + $data = $this->fueltype->getAll(); + $return = []; + + foreach ($data as $key => $value) { + $return[] = [ + 'name' => $value->description, + 'fueltype_uuid' => $value->fueltype_uuid + ]; + } + + return $this->format->mobile_success('Success',$return); + } +} diff --git a/app/Http/Controllers/API/CodeGenderController.php b/app/Http/Controllers/API/CodeGenderController.php new file mode 100644 index 0000000..3a73052 --- /dev/null +++ b/app/Http/Controllers/API/CodeGenderController.php @@ -0,0 +1,42 @@ +gender = $gender; + $this->format = $httpStatusCode; + } + + public function get_all() + { + $data = $this->gender->getAll(); + $return = []; + + foreach ($data as $key => $value) { + $return[] = [ + 'name' => $value->description, + 'gender_uuid' => $value->gender_uuid + ]; + } + + return $this->format->mobile_success('Success',$return); + } +} diff --git a/app/Http/Controllers/API/CodeVehicleOwnController.php b/app/Http/Controllers/API/CodeVehicleOwnController.php new file mode 100644 index 0000000..20b99a1 --- /dev/null +++ b/app/Http/Controllers/API/CodeVehicleOwnController.php @@ -0,0 +1,42 @@ +vehicleOwn = $vehicleOwn; + $this->format = $httpStatusCode; + } + + public function get_all() + { + $data = $this->vehicleOwn->getAll(); + $return = []; + + foreach ($data as $key => $value) { + $return[] = [ + 'name' => $value->description, + 'vo_uuid' => $value->vo_uuid, + ]; + } + + return $this->format->mobile_success('Success',$return); + } +} diff --git a/app/Http/Controllers/API/FuelTrackerController.php b/app/Http/Controllers/API/FuelTrackerController.php new file mode 100644 index 0000000..4901e81 --- /dev/null +++ b/app/Http/Controllers/API/FuelTrackerController.php @@ -0,0 +1,176 @@ +lcard_logs = $lcard_logs; + $this->fuel_tracker = $fuel_tracker; + $this->format = $httpStatusCode; + $this->module = "FuelTracker"; + $this->model = "FuelTracker"; + } + + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $member_details = CurrentUserHelper::get_currentMember(); + + $list = $this->fuel_tracker->listing($member_details->lcard_id); + + if(count($list)){ + $this->lcard_logs->log(0 ,self::MODULE,'VIEW','View Fuel Tracker'); + return $this->format->mobile_success('Success',$list); + + }else{ + return $this->format->mobile_error('Empty'); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + return "create"; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(FuelTrackerFormValidation $request) + { + $member_details = CurrentUserHelper::get_currentMember(); + if($member_details->lcard_id){ + $request->lcard_id = $member_details->lcard_id; + $return = $this->fuel_tracker->store($request) ? $this->fuel_tracker->store($request) : false; + $this->lcard_logs->log($return ,self::MODULE,'STORE','Added Fuel Tracker'); + + return $this->format->mobile_success('Success Added',[]); + } + + return $this->format->mobile_error('Empty'); + } + + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $member_details = CurrentUserHelper::get_currentMember(); + + $details = FuelTracker::where(['fueltracker_uuid' => $uuid,'lcard_id' => $member_details->lcard_id, 'is_active' => 1])->first(); + if ($details){ + $this->lcard_logs->log($details->fueltracker_id ,self::MODULE,'VIEW','View Fuel Tracker'); + return $this->format->mobile_success('Success',$details); + } + return $this->format->mobile_error('Empty'); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + return "edit"; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(FuelTrackerFormValidation $request, $uuid) + { + $member_details = CurrentUserHelper::get_currentMember(); + + if ($uuid == null && empty($uuid)) { + return $this->format->notFound(); + } + + $request->lcard_id = $member_details->lcard_id; + $request->fueltracker_uuid = $uuid; + + $details = $this->fuel_tracker->update($request); + + if ($details){ + $this->lcard_logs->log($details['fueltracker_id'],self::MODULE,'UPDATE','Update Fuel Tracker'); + return $this->format->mobile_success('Success',$details); + } + + return $this->format->mobile_error('Error'); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $member_details = CurrentUserHelper::get_currentMember(); + $details = $this->fuel_tracker->getByFieldAndLcardId('fueltracker_uuid',$uuid,$member_details->lcard_id); + + if (!$details){ + return $this->format->mobile_error('not found'); + } + + if(isset($details['0'])) + { + $details = $details['0']; + $fueltrack_id = $this->fuel_tracker->delete($uuid); + if($fueltrack_id) + { + $this->lcard_logs->log($fueltrack_id,self::MODULE,'DELETE','Delete Fuel Tracker'); + return $this->format->mobile_success('Success',null); + } + } + + return $this->format->mobile_error('not found'); + } + +} diff --git a/app/Http/Controllers/API/IDNumberTypeController.php b/app/Http/Controllers/API/IDNumberTypeController.php new file mode 100644 index 0000000..a8eefb5 --- /dev/null +++ b/app/Http/Controllers/API/IDNumberTypeController.php @@ -0,0 +1,134 @@ +cardType = $cardType; + $this->format = $httpStatusCode; + $this->module = "IDNumberType"; + $this->model = "IDNumberType"; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + public function mobile_show($code) + { + $details = $this->cardType->getByField([ + 'code' => $code, + 'is_active' => 1 + ],['idNumberType']); + + if(count($details) > 0) + { + if(count($details[0]->idNumberType) > 0) + { + $data = []; + + foreach ($details[0]->idNumberType as $key => $value) + { + $data[$value->idnt_uuid] = $value->name; + } + + return $this->format->mobile_success('Success',$data); + } + else + return $this->format->mobile_success('Empty',[]); + } + else + return $this->format->mobile_error('Card Type does not exist'); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/API/InAppNotificationController.php b/app/Http/Controllers/API/InAppNotificationController.php new file mode 100644 index 0000000..ac11517 --- /dev/null +++ b/app/Http/Controllers/API/InAppNotificationController.php @@ -0,0 +1,140 @@ +admin_logs = $admin_logs; + $this->format = $httpStatusCode; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $otp = DB::select('select * from otp_logs order by otplog_id desc limit 1'); + // Get all Notifications from the Notifications Table + $list = InAppNotifications::all(); + if(!count($list)) return $this->format->success("No records found",[]); // Check if notifications are present and return the appropriate response + return response()->json(["code"=>200,"message"=>"SUCCESS","data"=>$otp], 200); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(InAppNotificationFormValidation $request) + { + // Check if admin is the one who is issuing the action. + $currentUser = CurrentUserHelper::get_currentUser(); + $admin = Admin::where('username', $currentUser->username)->first(); + if(!$admin->admin_id) return $this->format->unauthorized(); // Check if it is the admin, otherwise return appropriate response + + $notification = new InAppNotifications(); + $notification->subject = $request->get('subject'); + $notification->description = $request->get('description'); + $notification->trigger_schedule = $request->get('schedule') ? $request->get('schedule') : null; + $notification->expiration_date = $request->get('expiration') or null; + $notification->status = 0; + + if(!$notification->save()) return $this->format->unprocessableEntity('Failed to create a notification.'); + + $id = $notification->id; + $this->admin_logs->log($id,self::MODULE,'STORE'); + return $this->format->created('Notification has been created', ["id"=>$id]); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // Show specific notification + $data = InAppNotifications::where(['id' => $id])->first(); + if(!$data) return $this->format->notFound(); // Check if notifications are present and return the appropriate response + return response()->json(["code"=>200,"message"=>"SUCCESS","data"=>$data], 200); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(InAppNotificationFormValidation $request, $id) + { + // Check if ID is present, otherwise return a not found error. + if(!$id) return $this->format->notFound(); + + // Check if admin is the one who is issuing the action. +// $currentUser = CurrentUserHelper::get_currentUser(); + // $admin = Admin::where('username', $currentUser->username)->first(); + // if(!$admin->admin_id) return $this->format->unauthorized(); // Check if it is the admin, otherwise return appropriate response + + $data = InAppNotifications::where(['id' => $id])->first(); + + if(!$data) return $this->format->notFound(); // Check if notifications are present and return the appropriate response + + $data->subject = $request->get('subject'); + $data->description = $request->get('description'); + $data->status = $request->get('status'); + + if(!$data->save()) return $this->format->unprocessableEntity('Failed to update the notification'); + $id = $data->id; + $this->admin_logs->log($id,self::MODULE,'STORE'); + return $this->format->success('Notification has been updated', ["id"=>$id]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // Check if ID is present, otherwise return a not found error. + if(!$id) return $this->format->notFound(); + + $currentUser = CurrentUserHelper::get_currentUser(); + $admin = Admin::where('username', $currentUser->username)->first(); + if(!$admin->admin_id) return $this->format->unauthorized(); // Check if it is the admin, otherwise return appropriate response + + $data = InAppNotifications::where(['id' => $id])->first(); + + if(!$data) return $this->format->notFound(); // Check if notifications are present and return the appropriate response + + if(!$data->delete()) return $this->format->unprocessableEntity('Failed to delete the notification'); + $id = $data->id; + $this->admin_logs->log($id,self::MODULE,'STORE'); + return $this->format->success('Notification has been deleted'); + } +} diff --git a/app/Http/Controllers/API/LoyaltyCardController.php b/app/Http/Controllers/API/LoyaltyCardController.php new file mode 100644 index 0000000..0e5e2eb --- /dev/null +++ b/app/Http/Controllers/API/LoyaltyCardController.php @@ -0,0 +1,47 @@ +loyaltyCard = $loyaltyCard; + $this->format = $httpStatusCode; + $this->module = "LoyaltyCard"; + $this->model = "LoyaltyCard"; + } + + public function register() + { + if($this->loyaltyCard->store()) + { + return $this->format->created(); + } + else + { + return $this->format->badRequest(); + } + } + + public function test_login() + { + + } +} diff --git a/app/Http/Controllers/API/MemberController.php b/app/Http/Controllers/API/MemberController.php new file mode 100644 index 0000000..c768984 --- /dev/null +++ b/app/Http/Controllers/API/MemberController.php @@ -0,0 +1,484 @@ +loyalty_card = $loyalty_card; + $this->personal_details = $personal_details; + $this->format = $httpStatusCode; + $this->admin_logs = $admin_logs; + $this->user = $user; + $this->lcard_logs = $lcard_logs; + $this->system_preferences = $system_preferences; + $this->otp_attempts = $otp_attempts; + $this->otp_logs = $otp_logs; + $this->mobile_usage = $mobile_usage; + $this->mpin_codes = $mpin_codes; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $params = [ + 'locked' => ($request->has('_locked') ? 1 : 0), + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request), + 'filter' => [ + 'is_validated' => ($request->has('status') ? $request->get('status') : null) + ] + ]; + + $list = $this->loyalty_card->listing($params); + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = LoyaltyCardResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = $this->loyalty_card->show($uuid,['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType']); + + if($details) + { + $additionals = $this->format->success("Success",[],false); + $data = (new LoyaltyCardResource($details))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + return $this->format->notFound(); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * + * This function is accessed from mobile + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(MobileEditProfileFormValidation $request) + { + $member_details = CurrentUserHelper::get_currentMember(); + + + // $city = $request->has('city_uuid') ? CodeCity::uuid($request->city_uuid)->first() : null; + + + $cyware = new CywareLibrary(); + + $cyware->setCardNumber($member_details->card_number); + $cyware->setFirstName($member_details->personalDetails->firstname); + $cyware->setLastName($member_details->personalDetails->lastname); + $cyware->setAddress($request->address); + $cyware->setMobile('63'.$request->mobile); + $cyware->setEmail($request->email); + $cyware->setCivilStatusCode($request->civilstatus_code); + $cyware->setGenderCode($request->gender_code); + $cyware->setFuelType($request->fueltype_code); + $cyware->setVehicleOwn($request->vo_code); + $cyware->setCityCode($request->city); + // if($city) + // { + // $cyware->setCityCode($city->code); + // $request->merge(['city_id' => $city->city_id]); + // } + + $cyware->state_update(); + + if($cyware->response['status_code'] == "200" && $cyware->response['message'] == "success") + { + $this->loyalty_card->update($request, $member_details->lcard_id); + // $this->user->updateMember($request, $member_details->card_number); + $path = $this->personal_details->update($request, $member_details->personalDetails->pd_id); + $this->lcard_logs->log($member_details->lcard_id,'PROFILE','UPDATE'); + + if($path) + { + // $photo_url = str_replace('/public/index.php','',secure_url('storage/app/'.$path)); + // $photo_url = str_replace('https','http',$photo_url); + return $this->format->mobile_success('Profile updated',['photo' => S3::public_path($path)]); + } + else + return $this->format->mobile_success('Profile updated',['photo' => '']); + } + else + { + return $this->format->mobile_error($cyware->response['message']); + } + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + + } + + public function batch_delete(Request $request) + { + $lcard_uuid = $request->has('lcard_uuid') ? $request->get('lcard_uuid') : null; + + if($lcard_uuid) + { + $details_loyaltyCard = $this->loyalty_card->getDetailsWhereIn('lcard_uuid',$lcard_uuid,'personalDetails'); + $pd_uuid = array(); + + foreach ($details_loyaltyCard as $key => $value) + { + $pd_uuid[] = $value['personal_details']['pd_uuid']; + $this->admin_logs->log($value['lcard_id'],self::MODULE,'DELETE'); + } + + if($this->loyalty_card->delete($lcard_uuid) && $this->personal_details->delete($pd_uuid)) + { + return $this->format->success("Member Successfully Deleted"); + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + else + { + $data['lcard_uuid'] = 'lcard_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one user",$data); + } + } + + public function activate_locked($uuid) + { + + $details = $this->loyalty_card->getByField(['lcard_uuid' => $uuid]); + + if($details->count()) + { + $details = $details[0]; + + if($this->loyalty_card->activate_locked($uuid)) + { + $adminLog = $this->admin_logs->log($details['lcard_id'],self::MODULE,'ACTIVATE'); + $data['is_locked'] = false; + return $this->format->success('User has been activated', $data); + } + } + + return $this->format->notFound(); + } + + + // public function direct_update(MobileEditProfileFormValidation $request) + // { + // $status = $this->update($request); + + // if($status == true) + // { + // return $this->format->mobile_success('Profile Details Updated', [ + // 'photo' => + // ]); + // } + // else + // { + // return $this->format->mobile_error($status); + // } + + // } + + + public function confirm_otp(Request $request) + { + $member_details = CurrentUserHelper::get_currentMember(); + // lock after 3 attempts + $numberOfAttempts = 0; + + $attempts = $this->loyalty_card->numberOfOTPAttempts($member_details->lcard_uuid); + + if(!is_null($attempts)) + { + $numberOfAttempts = $attempts->otpAttempts->count(); + } + + if($numberOfAttempts >= 3) + { + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours and you will be logged out of the system.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + else + { + $numberOfAttempts++; + $this->otp_attempts->store($member_details->lcard_id,$request->otp); + $this->lcard_logs->log($member_details->lcard_id,'OTP','ATTEMPT','Member entered otp '.$request->otp); + + // check if correct + + $otpLog = $this->otp_logs->getByField(['lcard_id' => $member_details->lcard_id, 'otp' => $request->otp]); + if(count($otpLog)) + { + $latestOtp = $this->otp_logs->getLastLog($member_details->lcard_id); + + // checks if otp entered is expired and it's the latest otp created + if(!StringHelper::check_time_exceeded($otpLog[0]['created_at'],'+5 minutes') || $latestOtp->otp != $request->otp) + { + if($numberOfAttempts >= 3) + { + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($member_details)); + + $this->user->force_logout($member_details->card_number,2); + } + + return $this->format->mobile_error('The OTP you have entered has already expired. Please select the Resend OTP option',['code' => 3]); + } + else + { + return $this->format->mobile_success('OTP Confirmed'); + } + } + else + { + if($numberOfAttempts >= 3) + { + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($member_details)); + } + + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + } + } + + private function lock_member($member_details) + { + $this->loyalty_card->lockMember($member_details->lcard_id,'02'); + $this->lcard_logs->log($member_details->lcard_id,'OTP','LOCKED','Account is locked due to wrong OTP entered when updating the mobile phone number'); + $this->mobile_usage->add_locked(); + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return [ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]; + } + + public function myProfile() + { + $member_details = CurrentUserHelper::get_currentMember(); + $cyware = new CywareLibrary(); + $details = $this->loyalty_card->show($member_details->lcard_uuid,['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType','codeCity','codeFuelType']); + + if($details) + { + $cyware->setCardNumber($member_details->card_number); + $cyware->state_retrieve(); + $additionals = $this->format->mobile_success("Success",[],false); + $additionals["retrieved"] = $cyware->response["data"]; + $data = (new MobileUserProfileResource($details))->additional($additionals); + //return $data->response()->setStatusCode(200); + + //getmpin + $mpin = $this->mpin_codes->getMpin($additionals["retrieved"]->customer_number); + $dataResult = $this->StateRetrieve($data->response()->setStatusCode(200),$mpin); + + return $dataResult; +// return $this->StateRetrieve($data->response()->setStatusCode(200)); + } + else + return $this->format->notFound(); + + } + + public function validateMember(SecurityFormValidation $request) + { +// $member_details = CurrentUserHelper::get_currentMember(); +// return $this->format->mobile_success($request->card_number,[ + // 'is_valid' => 0 + // ]); + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + if($cyware->response['data']->birthdate != $request->get('birthdate')) + { + return $this->format->mobile_error( 'Incorrect Birthdate'); + } + + if(strtolower($cyware->response['data']->email) != strtolower($request->get('email_address'))) + { + return $this->format->mobile_error( 'Incorrect Email'); + } + return $this->format->mobile_success('Success',[ + 'is_valid' => 1 + ]); + } + else + { + return $this->format->mobile_error($cyware->response['message'], ['card_number' => $cyware->response['message']]); + } + } + + public function StateRetrieve($data,$mpin){ + $newData = $data->getData(); + $mainData = []; + $mainData["lcard_uuid"] = $newData->data->lcard_uuid; + $mainData["card_number"] = $newData->data->card_number; + $mainData["customer_number"] = $newData->retrieved->customer_number; + $mainData["pin"] = $newData->data->pin; + $mainData["birthdate"] = $newData->data->birthdate; + $mainData["mobile"] = $newData->data->mobile; + $mainData["email"] = $newData->data->email; + $mainData["firstname"] = $newData->data->firstname; + $mainData["lastname"] = $newData->data->lastname; + $mainData["photo"] = $newData->data->photo; + $mainData["card_type"] = $newData->data->card_type; + $mainData["card_code"] = $newData->data->card_code; + $mainData["card_image"] = $newData->data->card_image; + $mainData["card_bg_image"] = $newData->data->card_bg_image; + $mainData["card_black_label"] = $newData->data->card_black_label; + $mainData["expiry_date"] = $newData->data->expiry_date; + $mainData["points"] = $newData->data->points; + //DATA THAT MUST GET FROM STATE RETRIEVE + $mainData["middlename"] = $newData->retrieved->middle_initial; + $mainData["city_name"] = $newData->retrieved->address; + $mainData["address"] = $newData->retrieved->address; + $mainData["civilstatus_code"] = $newData->retrieved->civil_status_code; + $mainData["gender_code"] = $newData->retrieved->gender_code; + $mainData["vo_code"] = $newData->retrieved->vehicle_own_code; + $mainData["fueltype_code"] = $newData->retrieved->fuel_type_code; + if($mpin){ + $mainData["mpin"] = $mpin->mpin_code; + } + //$mainData['log'] = "start:".$datestart." ---- end:".$dateend; + $newData->data = $mainData; + return response()->json($newData); + } + +} diff --git a/app/Http/Controllers/API/PaymayaTokensController.php b/app/Http/Controllers/API/PaymayaTokensController.php new file mode 100644 index 0000000..60cc960 --- /dev/null +++ b/app/Http/Controllers/API/PaymayaTokensController.php @@ -0,0 +1,198 @@ +format = $httpStatusCode; + $this->lcard_logs = $lcard_logs; + } + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + try { + $list = PaymayaTokens::all(); + // $this->lcard_logs->log(0,'PAYMAYATOKEN','VIEW','Member view all paymaya tokens'); + return $this->format->mobile_success("Success", $list); + + } catch (\Throwable $th) { + return $this->format->mobile_error('No Paymaya tokens found'); + } + // + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(PaymayaTokenFormValidation $request) + { + try { + $data = PaymayaTokens::where('token',$request->get('token'))->where('is_active','<>',0)->get(); + if(count($data) > 0){ + return $this->format->mobile_error('Token already exist for '.$request->get('card_number')); + } + else + { + $uuid = new UuidHelper; + $paymayatoken = new PaymayaTokens(); + $paymayatoken->card_number = $request->get('card_number'); + $paymayatoken->customer_id = $request->get('customer_id'); + $paymayatoken->token = $request->get('token'); + $paymayatoken->is_active = 1; + $paymayatoken->paymaya_token_uuid = $uuid->generate_uuid1(); + if(!$paymayatoken->save()) return $this->format->mobile_error('Failed to saved token.'); + // $this->lcard_logs->log(0,'PAYMAYATOKEN','STORE','Member store paymaya token'); + return $this->format->mobile_success('Paymaya token has been created', $paymayatoken); + } + + } catch (\Throwable $th) { + return $this->format->mobile_error('Error saving'); + } + } + /** + * Display the specified resource. + * + * @param \App\PaymayaTokens $paymayaTokens + * @return \Illuminate\Http\Response + */ + public function show($card_number) + { + try { + $data = PaymayaTokens::where('card_number',$card_number)->where('is_active','1')->get(); + + if(count($data) > 0){ + + $rnrph = new RNRPHLibrary(); + + // $this->lcard_logs->log(0,'PAYMAYATOKEN','VIEW','Member view paymaya token'); + $tokenData = []; + $cards = []; + + $rnrph->getPaymayaCustomerDetails($data[0]['customer_id']); + $cardsData = $rnrph->response['data']; + foreach($cardsData as $key => $cardDetail){ + $c = get_object_vars($cardDetail); + $c["uuid"] = $data[0]["paymaya_token_uuid"]; + $c["customer_id"] = $data[0]["customer_id"]; + $cards[] = $c; + } + + //SYNC ACCOUNT CARDS + $synced = []; + $todelete = []; + foreach($cards as $key => $paymayacards){ + foreach($data as $key => $savedcards){ + if($paymayacards["cardTokenId"] == $savedcards["token"]){ + $c = $paymayacards; + $c["uuid"] = $savedcards["paymaya_token_uuid"]; + $c["customer_id"] = $savedcards["customer_id"]; + $synced[] = $c; + }else{ + //IF SAVED TOKEN FROM THE DATABASE DOESNT HAVE A MATCH TO PAYMAYA API, DELETE + $todelete[] = $savedcards; + } + } + } + + $res = []; + $res["customer_id"] = $data[0]["customer_id"]; + $res["card_number"] = $data[0]["card_number"]; + $res["is_active"] = $data[0]["is_active"]; + $res["created_at"] = get_object_vars($data[0]["created_at"])["date"]; + $res["updated_at"] = get_object_vars($data[0]["updated_at"])["date"]; + // $res["cards"] = $cards; + // $res["full"] = $data; + // $res["to_delete"] = $todelete; + $res["cards"] = $synced; + + // return $this->format->mobile_success('Success', $res); + return $this->format->mobile_success('Success', $res); + } + else + { + return $this->format->mobile_error('Paymaya token not found', []); + } + } catch (\Throwable $th) { + return $this->format->mobile_error('Error'); + } + + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\PaymayaTokens $paymayaTokens + * @return \Illuminate\Http\Response + */ + public function edit(PaymayaTokens $paymayaTokens) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\PaymayaTokens $paymayaTokens + * @return \Illuminate\Http\Response + */ + public function update(Request $request, PaymayaTokens $paymayaTokens) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \App\PaymayaTokens $paymayaTokens + * @return \Illuminate\Http\Response + */ + public function destroy($paymaya_token_uuid) + { + try { + PaymayaTokens::where('paymaya_token_uuid',$paymaya_token_uuid) + ->update([ + 'is_active' => 0 + ]); + return $this->format->mobile_success('Success'); + } catch (\Throwable $th) { + return $this->format->mobile_error('Error',$th); + + } + // + } +} diff --git a/app/Http/Controllers/API/PaymentController.php b/app/Http/Controllers/API/PaymentController.php new file mode 100644 index 0000000..6f73e7c --- /dev/null +++ b/app/Http/Controllers/API/PaymentController.php @@ -0,0 +1,716 @@ +format = $httpStatusCode; + $this->lcard_logs = $lcard_logs; + $this->payment = $payment; + $this->rating = $rating; + $this->station = $station; + $this->loyalty_card = $loyalty_card; + $this->system_preferences = $system_preferences; + + } + + public function filter_by_value ($array, $index, $value){ + if(is_array($array) && count($array)>0) + { + foreach(array_keys($array) as $key){ + $temp[$key] = $array[$key][$index]; + + if ($temp[$key] == $value){ + $newarray[$key] = $array[$key]; + } + } + } + return $newarray; + } + + public function unique_multidim_array($array, $key) { + $temp_array = array(); + $i = 0; + $key_array = array(); + $res = []; + foreach($array as $val) { + if (!in_array($val[$key], $key_array)) { + $key_array[$i] = $val[$key]; + $temp_array[$i] = $val; + } + $i++; + } + foreach($temp_array as $v) { + $res[] = $v; + } + return $res; + } + + public function transactions(Request $request) + { + $date_start = $request->has('date_start') ? date('Ymd',strtotime($request->date_start)) : date('Ymd'); + $date_end = $request->has('date_end') ? date('Ymd',strtotime($request->date_end)) : date('Ymd'); + $member_details = CurrentUserHelper::get_currentMember(); + + $cyware = new CywareLibrary(); + + $cyware->setCardNumber($member_details->card_number); + $cyware->setStartDate($date_start); + $cyware->setEndDate($date_end); + $cyware->setLcardID($member_details->lcard_id); + $cyware->state_trans(); + $this->lcard_logs->log($member_details->lcard_id,'TRANSACTIONS','VIEW','Member viewed transaction lists'); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + if(isset($cyware->response['data']->total_amount)) + { + // Note : if the result from cyware has only one transaction. The response data is not indexed + + $det = $cyware->response['data']; + $cyware->response['data'] = null; + $cyware->response['data'][0] = $det; + } + + if(count((array)$cyware->response['data'])) + { + $in_app_stations = StaticContents::in_app_stations(); + $data = []; + $ctr = 0; + $total_count = count((array)$cyware->response['data']); + foreach ($cyware->response['data'] as $key => $value) + { + // if(($total_count - 5) <= $ctr) + // { + $is_disabled = true; + $is_feedback_disabled = true; + $rating = 0; + if(!isset($value->receipt_num)) + { + $payment = $this->payment->get_by_trans_num($value->trans_num); + + if(!isset($in_app_stations[$value->store_id])) + { + $rating = isset($payment->ratings) ? $payment->ratings->rate : 0; + $is_disabled = (isset($payment->ratings) && $payment->ratings->rate > 0 )? true : false;; + $is_feedback_disabled = false; + } + } + + $items = []; + if(isset($value->items) && count($value->items) > 0) + { + foreach ($value->items as $k => $i) + { + $items[] = [ + 'item' => $i->item_desc, + 'quantity' => (double)$i->qty, + 'price' => (double)$i->price, + ]; + } + } + + // NOTE : removed for multiple items + // 'item' => isset($value->reward_desc) ? $value->reward_desc : $value->item_desc, + // 'price' => $value->total_amount, + + $data[] = [ + 'station' => $value->store_name, + 'total_amount' => (double)$value->total_amount, + 'earned' => isset($value->reward_code) ? 0 : (double)$value->total_points, + 'redeemed' => isset($value->reward_code) ? (double)$value->total_points : 0, + 'date' => date('d M Y, h:i A',strtotime($value->date.' '.$value->time)), + 'rating' => $rating, + 'is_disabled' => $is_disabled, + 'is_feedback_disabled' => $is_feedback_disabled, + 'trans_num' => isset($value->receipt_num) ? $value->receipt_num : $value->trans_num, + 'items' => $items, + ]; + // } + $ctr++; + } + + $nResults = []; + foreach ($data as $key => $trans) { + $ftr = $this->filter_by_value($data, 'trans_num', $trans['trans_num']); + if(count($ftr) > 1){ + //DUPLICATES FOUND + $trans['total_amount'] = 0; + $trans['redeemed'] = 0; + $trans['earned'] = 0; + $trans['items'] = []; + foreach ($ftr as $duplicates => $tran) { + $trans['redeemed'] += $tran['redeemed']; + $trans['earned'] += $tran['earned']; + $trans['total_amount'] += $tran['total_amount']; + foreach ($tran['items'] as $items => $item) { + $trans['items'][] = $item; + } + } + $nResults[] = $trans; + }else{ + $nResults[] = $trans; + } + } + + $result = $this->unique_multidim_array($nResults, 'trans_num'); + $final = []; + $final['sorted'] = $result; + $final['original'] = $data; + + return $this->format->mobile_success('Success', $result); + } + else + return $this->format->mobile_success('Success'); + } + else + { + if($cyware->response['message'] == null) + return $this->format->mobile_success("No records found",[]); + else + return $this->format->mobile_error($cyware->response['message'],[]); + } + } + + public function single_transaction(Request $request) + { + $date_start = $request->has('date_start') ? date('Ymd',strtotime($request->date_start)) : date('Ymd'); + $date_end = $request->has('date_end') ? date('Ymd',strtotime($request->date_end)) : date('Ymd'); + $member_details = CurrentUserHelper::get_currentMember(); + + $searched = $this->search_transaction(new CywareLibrary(), $member_details->card_number, $request->trans_num, $date_start, $date_end); + $this->lcard_logs->log($member_details->lcard_id,'TRANSACTIONS','VIEW','Member viewed a transaction'); + if ($searched['success']) + { + + $value = $searched['data']; + + $is_disabled = true; + $is_feedback_disabled = true; + $rating = 0; + if(!isset($value->receipt_num)) + { + $payment = isset($value->trans_num) ? $this->payment->get_by_trans_num($value->trans_num) : null; + $in_app_stations = StaticContents::in_app_stations(); + if(!isset($in_app_stations[$value->store_id])) + { + $rating = isset($payment->ratings) ? $payment->ratings->rate : 0; + $is_disabled = (isset($payment->ratings) && $payment->ratings->rate > 0 )? true : false; + $is_feedback_disabled = false; + } + } + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + $items = []; + if(isset($value->items) && count($value->items) > 0) + { + foreach ($value->items as $k => $i) + { + $items[] = [ + 'item' => $i->item_desc, + 'quantity' => (double)$i->qty, + 'price' => (double)$i->price, + ]; + } + } + + + $data = [ + 'station' => $value->store_name, + // 'item' => isset($value->reward_desc) ? $value->reward_desc : $value->item_desc, + 'total_amount' => (double)$value->total_amount, + 'earned' => isset($value->reward_code) ? 0 : (double)$value->total_points, + 'redeemed' => isset($value->reward_code) ? (double)$value->total_points : 0, + 'date' => date('d M Y, h:i A',strtotime($value->date.' '.$value->time)), + // 'quantity' => isset($value->qty) ? (double)$value->qty : 1, + 'rating' => $rating, + 'is_disabled' => $is_disabled, + 'is_feedback_disabled' => $is_feedback_disabled, + 'trans_num' => isset($value->receipt_num) ? $value->receipt_num : $value->trans_num, + 'contact_email' => $customer_service_email[0]['value'], + 'contact_number' => $customer_service_number[0]['value'], + 'items' => $items + ]; + return $this->format->mobile_success('Success',$data); + } + else + return $this->format->mobile_error($searched['message']); + } + + public function rate_transaction(Request $request) + { + $payment = $this->payment->get_by_trans_num($request->trans_num); + $member_details = CurrentUserHelper::get_currentMember(); + + if($payment) + { + if(isset($payment->ratings)) + { + $data = [ + 'lcard_id' => $member_details->lcard_id, + 'station_id' => $payment->station_id, + 'payment_id' => $payment->payment_id, + 'rate' => $request->rate, + ]; + + if($this->rating->update($data,$payment->ratings->rating_id)) + { + $this->lcard_logs->log($member_details->lcard_id,'RATINGS','UPDATE','Member updated a rate on a transaction'); + return $this->format->mobile_success('Success'); + } + else + return $this->format->mobile_error('Something went wrong'); + } + else + { + $data = [ + 'lcard_id' => $member_details->lcard_id, + 'station_id' => $payment->station_id, + 'payment_id' => $payment->payment_id, + 'rate' => $request->rate, + ]; + + if($this->rating->store($data)) + { + $this->lcard_logs->log($member_details->lcard_id,'RATINGS','STORE','Member rated a transaction'); + return $this->format->mobile_success('Success'); + } + else + return $this->format->mobile_error('Something went wrong'); + + } + } + else + { + $date_start = $request->has('date_start') ? date('Ymd',strtotime($request->date_start)) : date('Ymd'); + $date_end = $request->has('date_end') ? date('Ymd',strtotime($request->date_end)) : date('Ymd'); + + $searched = $this->search_transaction(new CywareLibrary(), $member_details->card_number, $request->trans_num, $date_start, $date_end); + + if($searched['success']) + { + $value = $searched['data']; + if($value) + { + $items = []; + if(isset($value->items) && count($value->items) > 0) + { + foreach ($value->items as $k => $i) + { + $items[] = [ + 'item' => $i->item_desc, + 'quantity' => (double)$i->qty, + 'price' => (double)$i->price, + ]; + } + } + + $station = $this->station->getByField('code',$value->store_id); + $store_data = [ + 'station_id' => $station ? $station[0]['station_id'] : 0, + 'trans_num' => isset($value->receipt_num) ? $value->receipt_num : $value->trans_num, + // 'item_name' => isset($value->reward_desc) ? $value->reward_desc : $value->item_desc, + // 'item_code' => isset($value->reward_code) ? $value->reward_code : $value->item_code, + 'total_amount' => $value->total_amount, + 'points' => isset($value->reward_code) ? $value->total_points : 0, + 'entry_type_code' => isset($value->reward_code) ? $value->reward_code : $value->entry_type_code, + 'entry_type_desc' => isset($value->reward_desc) ? $value->reward_desc : $value->entry_type_desc, + // 'receipt_num' => isset($data->receipt_num) ? $data->receipt_num : null, + // 'quantity' => isset($value->qty) ? $value->qty : 1, + 'date' => date('Y-m-d H:i:00',strtotime($value->date.' '.$value->time)), + 'items' => $items + ]; + + $payment_id = $this->payment->store_non_app($store_data,$member_details); + if($payment_id) + { + $data = [ + 'lcard_id' => $member_details->lcard_id, + 'station_id' => $store_data['station_id'], + 'payment_id' => $payment_id, + 'rate' => $request->rate, + ]; + + if($this->rating->store($data)) + { + $this->lcard_logs->log($member_details->lcard_id,'PAYMENTS','STORE','Member added a non-APP transaction through ratings'); + return $this->format->mobile_success('Success'); + } + else + return $this->format->mobile_error('Something went wrong'); + } + } + + return $this->format->mobile_error('Something went wrong'); + } + else + return $this->format->mobile_error($searched['message']); + } + } + + + // paypal transactions + + public function get_paypal_url(MobileTopUpFormValidation $request) + { + // check if already have 5 transactions in 24 hours + // $date_yesterday = date('Y-m-d H:i:s', strtotime('-24 hours')); + // $date_now = date('Y-m-d H:i:s'); + + // $payments = $this->payment->count_between($member_details->lcard_id, $date_yesterday, $date_now); + $payments = $this->count_transaction(new CywareLibrary, $member_details->card_number, date('Y-m-d')); + if($payments < 5) + { + $trans_count = $this->payment->count_trans_month() + 1; + $trans_num = (env('SI_NUM_RANDOM','false') == true ? StringHelper::random_num(2).date('m') : date('ym')).str_pad($trans_count, 4, "0", STR_PAD_LEFT); + + $paypal = new Paypal; + $paypal->set_amount($request->amount); + $paypal->set_invoice_number($trans_num); + + if($paypal->generate_paypal_url()) + { + $this->payment->store([ + 'trans_num' => $trans_num, + // 'item_name' => 'PREPAID LOAD', + // 'item_code' => 'PREPAID', + 'amount' => $request->amount, + 'entry_type_code' => 'APP', + 'entry_type_desc' => 'APP', + 'paypal_id' => $paypal->get_paypal_id(), + 'other' => serialize($paypal->get_response()), + 'items' => [ + [ + 'item' => 'PREPAID LOAD', + 'quantity' => 1, + 'price' => $request->amount + ] + ] + ],$member_details); + + $this->lcard_logs->log($member_details->lcard_id,'PAYMENTS','STORE','Member added a pending payment through Paypal. Transaction Number : '.$trans_num); + + return $this->format->mobile_success('Success',[ + 'redirect_url' => $paypal->get_approval_url(), + 'paypal_id' => $paypal->get_paypal_id(), + 'trans_num' => $trans_num, + ]); + } + else + return $this->format->mobile_error('Paypal Error'); + } + else + return $this->format->mobile_error('You already reached the maximum allowed Top Up transactions per day. Please Top Up again after 24 hours.'); + } + + // Count the total number of transactions for the Payments Table + public function count_total_transactions(){ + $listCount = Payment::with(['loyaltyCard'])->where('payments.created_at', '>=' ,date('Y-m-d').' 00:00:00')->where('payments.created_at', '<=' ,date('Y-m-d').' 23:59:59')->count(); + if($listCount <= 5){ + return $this->format->mobile_success("Success",$listCount,false); + } + return $this->format->unprocessableEntity("You have reached today's top up limit",$listCount); + } + + public function paymaya_execute(PaymayaFormValidation $request){ + // eval(\Psy\sh()); + // return $this->format->success('Yep its working',[ + // 'sample response' => "this is sample response", + // 'sample token' => $request->header('card_number') + // ]); + + $member_details = CurrentUserHelper::get_currentMember(); + $reference_number = $request->post('reference_number') ? $request->post('reference_number') : StringHelper::random_num(6); + $cyware = new CywareLibrary(); + $cyware->setCardNumber($member_details->card_number); + $cyware->setCashier('APP'); + $cyware->setBranch('APP'); + $cyware->setRegisterNum('1'); + $cyware->setSiNum($reference_number); + $cyware->setTotalAmount($request->post('amount')); + $cyware->setPaymentType('CC'); + $cyware->setItemCode('PREPAID'); + + $cyware->state_points(); + + if($cyware->response['message'] == "SI Number already exist"){ + $cyware->setSiNum(StringHelper::random_num(6)); + $cyware->state_points(); + } + + $trans_count = $this->payment->count_trans_month() + 1; + $trans_num = (env('SI_NUM_RANDOM','false') == true ? StringHelper::random_num(2).date('m') : date('ym')).str_pad($trans_count, 4, "0", STR_PAD_LEFT); + + $this->payment->store([ + 'trans_num' => $trans_num, + // 'item_name' => 'PREPAID LOAD', + // 'item_code' => 'PREPAID', + 'amount' => $request->amount, + 'entry_type_code' => 'APP', + 'entry_type_desc' => 'APP', + 'paypal_id' => $reference_number, + // 'other' => serialize($paypal->get_response()), + 'other' => '', + 'items' => [ + [ + 'item' => 'PREPAID LOAD', + 'quantity' => 1, + 'price' => $request->amount + ] + ] + ],$member_details); + + return $this->format->success('Transaction Successful',[ + 'cyware' => $cyware->response, + 'card_number' => $request->header('card_number') + ]); + + // if($cyware->response['status_code'] == "200" && $cyware->response['success'] == "Prepaid load is successfully loaded in your account") + // { + // return $this->format->success('Transaction Successful',[ + // 'message' => "It works", + // 'cyware' => $cyware->response + // ]); + // } + // else return $this->format->unprocessableEntity('Payment is successful. However, we encountered a problem updating your Loyalty Points. Please contact Customer Service for assistance.'); + + } + + private function generateFeeCode(){ + $fee_code = "0001"; + $details = TopUp::orderBy('created_at', 'desc')->first(); + + if($details){ + $fee_code = ltrim($details->fee_code, '0') + 1; + } + + $data = str_pad($fee_code, 4, '0', STR_PAD_LEFT); + return $data; + } + + public function paypal_execute(PaypalExecuteFormValidation $request) + { + $paypal = new Paypal; + $paypal->set_paypal_id($request->paymentId); + $paypal->set_payer_id($request->PayerID); + + if($paypal->paypal_execute()) + { + /* + Note : + invoice_number = trans_num --custom transaction number to be passed to cyware + trans_num = paypal_trans_num --transaction number generated from paypal + */ + $save_db = $this->payment->success_transaction($paypal->get_invoice_number(),[ + 'other' => $paypal->get_response(), + 'firstname' => $paypal->get_payer_firstname(), + 'lastname' => $paypal->get_payer_lastname(), + 'payer_email' => $paypal->get_payer_email(), + 'receiver_email' => $paypal->get_receiver_email(), + 'paypal_trans_num' => $paypal->get_trans_num(), + 'paid_at' => date('Y-m-d H:i:s',strtotime($paypal->get_paid_at())), + ]); + + if($save_db) + { + $db = $this->payment->get_by_trans_num($paypal->get_invoice_number()); + $member_details = $this->loyalty_card->getByField(['lcard_id' => $db->lcard_id]); + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($member_details[0]->card_number); + $cyware->setCashier('APP'); + $cyware->setBranch('APP'); + $cyware->setRegisterNum('1'); + $cyware->setSiNum($paypal->get_invoice_number()); + $cyware->setTotalAmount($db->amount); + $cyware->setPaymentType('CC'); + $cyware->setItemCode('PREPAID'); + + $cyware->state_points(); + + if($cyware->response['status_code'] == "200" && $cyware->response['success'] == "Prepaid load is successfully loaded in your account") + { + + $this->payment->cyware_synced($db->payment_id,(isset($searched['data']->total_points) ? $searched['data']->total_points : 0)); + $this->lcard_logs->log($member_details[0]->lcard_id,'PAYMENTS','UPDATE','Member successfully paid transaction number '.$paypal->get_invoice_number()); + + $searched = $this->search_transaction($cyware,$member_details[0]->card_number,$paypal->get_invoice_number(),date('Ymd'),date('Ymd')); + return $this->format->success('Transaction Successful',[ + 'date' => date('d F y h:i A',strtotime($db->paid_at)), + 'card_number' => $member_details[0]->card_number, + 'invoice' => $paypal->get_invoice_number(), + 'points' => isset($searched['data']->total_points) ? $searched['data']->total_points : $paypal->get_total(), + 'payment_val' => $paypal->get_total(), + 'paypal_fee' => $paypal->get_paypal_fee(), + ]); + } + else return $this->format->unprocessableEntity('Payment is successful. However, we encountered a problem updating your Loyalty Points. Please contact Customer Service for assistance.',['details' => $cyware->response['message']]); + } + else return $this->format->unprocessableEntity('Error on database saving'); + + } + else + { + $this->payment->failed_transaction($request->paymentId, $paypal->get_response()); + return $this->format->unprocessableEntity(($paypal->get_error_message() != null ? $paypal->get_error_message() : 'Your purchase for top-up is not successful. Please try again.')); + } + + } + + public function get_status($trans_num) + { + $details = $this->payment->get_by_trans_num($trans_num); + if($details) + { + if($details->status == 1 && $details->cyware_synced == 1) + return $this->format->mobile_success('Transaction Successful'); + else + return $this->format->mobile_error('Transaction Failed'); + } + else + return $this->format->mobile_error('Transaction Doesn\'t Exist'); + } + + private function search_transaction($cyware, $card_number, $trans_num, $date_start, $date_end) + { + $cyware->setCardNumber($card_number); + $cyware->setStartDate($date_start); + $cyware->setEndDate($date_end); + $cyware->state_trans(); + + $data = []; + + if($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + if(count((array)$cyware->response['data'])) + { + if(isset($cyware->response['data']->total_amount)) + { + // Note : if the result from cyware has only one transaction. The response data is not indexed + if( + (isset($cyware->response['data']->trans_num) && (strcasecmp($cyware->response['data']->trans_num,$trans_num) || $cyware->response['data']->trans_num == $trans_num)/*($cyware->response['data']->trans_num == $trans_num)*/) || + (isset($cyware->response['data']->receipt_num) && strcasecmp($cyware->response['data']->receipt_num,$trans_num)/*($cyware->response['data']->receipt_num == $trans_num)*/) + ) + { + $data = $cyware->response['data']; + } + } + else + { + foreach ($cyware->response['data'] as $key => $value) + { + if( + (isset($value->trans_num) && strcasecmp($value->trans_num,$trans_num) == 0/*($value->trans_num == $trans_num)*/) || + (isset($value->receipt_num) && strcasecmp($value->receipt_num,$trans_num) == 0/*($value->receipt_num == $trans_num)*/) + ) + { + $data = $value; + } + } + } + } + + if($data) + return ['success' => true, 'data' => $data]; + else + return ['success' => false, 'message' => 'Transaction Not Found']; + } + return ['success' => false, 'message' => $cyware->response['message']]; + } + + private function count_transaction($cyware, $card_number, $date) + { + $cyware->setCardNumber($card_number); + $cyware->setStartDate($date); + $cyware->setEndDate($date); + $cyware->state_trans(); + + $count = 0; + + if($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + if(isset($cyware->response['data']) && count((array)$cyware->response['data'])) + { + if(isset($cyware->response['data']->total_amount)) + { + // Note : if the result from cyware has only one transaction. The response data is not indexed + if($cyware->response['data']->date == $date) + $count++; + } + else + { + foreach ($cyware->response['data'] as $key => $value) { + if($value->date == $date) + $count++; + } + } + } + } + + return $count; + } + + public function test() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000003'); + $cyware->setCashier('APP'); + $cyware->setBranch('APP'); + $cyware->setRegisterNum('1'); + $cyware->setSiNum('2015111500001'); + $cyware->setTotalAmount('9999.99'); + $cyware->setPaymentType('CC'); + $cyware->setItemCode('PREPAID'); + + $cyware->state_points(); + + dd($cyware->response); + } + +} diff --git a/app/Http/Controllers/API/PhotoSliderController.php b/app/Http/Controllers/API/PhotoSliderController.php new file mode 100644 index 0000000..eac74a7 --- /dev/null +++ b/app/Http/Controllers/API/PhotoSliderController.php @@ -0,0 +1,265 @@ +photoSlider = $photoSlider; + $this->format = $httpStatusCode; + $this->admin_logs = $admin_logs; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + $list = $this->photoSlider->listing($params); + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = PhotoSliderResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(PhotoSliderFormValidation $request) + { + $id = $this->photoSlider->store($request); + + if($id) + { + $this->admin_logs->log($id,self::MODULE,'STORE'); + + return $this->format->created('Photo Slider has been added'); + } + else + { + return $this->format->notFound(); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = $this->photoSlider->getByField('photoslider_uuid',$uuid); + + if($details->count()) + { + $additionals = $this->format->success("Success",[],false); + $data = (new PhotoSliderResource($details[0]))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + return $this->format->notFound(); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(PhotoSliderFormValidation $request, $uuid) + { + $old_data = $this->photoSlider->getByField('photoslider_uuid',$uuid); + + if($old_data->count()) + { + if($this->photoSlider->update($request,$uuid)) + { + $this->admin_logs->log($old_data[0]['photoslider_id'],self::MODULE,'UPDATE'); + return $this->format->success("Photo Slider has been updated"); + } + else + { + return $this->format->notFound(); + } + } + + return $this->format->notFound(); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $details = $this->photoSlider->getByField('photoslider_uuid',$uuid); + if($details->count()) + { + $details = $details[0]; + if($this->photoSlider->delete($uuid)) + { + $this->admin_logs->log($details['photoslider_id'],self::MODULE,'DELETE'); + return $this->format->success("Photo Slider Successfully Deleted"); + } + + } + + return $this->format->notFound(); + } + + + public function batch_delete(Request $request) + { + $uuid = $request->has('photoslider_uuid') ? $request->get('photoslider_uuid') : null; + + if($uuid) + { + $details = $this->photoSlider->getDetailsWhereIn('photoslider_uuid',$uuid); + + + $id = array(); + + if($this->photoSlider->delete($uuid)) + { + foreach ($details as $key => $value) + { + $this->admin_logs->log($value['photoslider_id'],self::MODULE,'DELETE'); + } + + return $this->format->success("Photo Slider Successfully Deleted"); + + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + else + { + $data['photoslider_uuid'] = 'photoslider_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one item",$data); + } + } + + public function check_count() + { + if($this->photoSlider->count() < 10) + return $this->format->success('User can add'); + else + return $this->format->badRequest('Photo slider cannot be more than 10'); + } + + + public function get_photo_slider(Request $request) + { + + $data = $this->photoSlider->getPhotoSlider(); + $currentUser = CurrentUserHelper::get_member_by_lcard($request->input('lcard_uuid')); + + $return = []; + foreach ($data as $key => $value){ + $return[$key]['photoslider_id'] = $value['photoslider_id']; + $return[$key]['photoslider_uuid'] = $value['photoslider_uuid']; + $return[$key]['title'] = $value['title']; + $return[$key]['description'] = $value['description']; + $return[$key]['image'] = S3::public_path($value['image']); + $return[$key]['date_start'] = $value['date_start']; + $return[$key]['date_end'] = $value['date_end']; + $return[$key]['is_toppromotion'] = $value['is_toppromotion']; + $return[$key]['is_gps'] = $value['is_gps']; + $return[$key]['promo_type'] = $value['promo_type']; + $return[$key]['promotion_id'] = $value['promotion_id']; + + $promotion_uuid = 0; + if ( strtotime(date('Y-m-d H:i:s')) >= strtotime($value['promotion_date_start']) ){ + if(strtotime(date('Y-m-d H:i:s')) <= strtotime($value['promotion_date_end'])){ + $promotion_uuid = $value['promotion_uuid']; + } + } + + $return[$key]['promotion_uuid'] = $promotion_uuid; + $return[$key]['promotion_date_start'] = $value['promotion_date_start']; + $return[$key]['promotion_date_end'] = $value['promotion_date_end']; + $return[$key]['promo_details'] = [ + "title"=> $promotion_uuid=="0" ? "" : $value['promotion_title'], + "description"=>$promotion_uuid=="0" ? "" : $value['promotion_description'], + "image"=>$promotion_uuid=="0" ? "" : S3::public_path($value['promotion_image']), + ]; + $return[$key]['promo_details'] = $value['promo_type'] != 3 ? $return[$key]['promo_details'] : ["title"=> "","description"=>"","image"=>""]; + + + if ($currentUser){ + $now = Carbon::now(); + $birthday = $now->year."-".$currentUser->birthdate->month."-".$currentUser->birthdate->day." 00:00:00"; + + if($value['promo_type'] == "3"){ + if (strtotime($value['promotion_date_start']) <= strtotime($birthday) && strtotime($value['promotion_date_end']) >= strtotime($birthday) ){ + $return[$key]['promo_details'] = [ + "title"=> $promotion_uuid=="0" ? "" : $value['promotion_title'], + "description"=>$promotion_uuid=="0" ? "" : $value['promotion_description'], + "image"=>$promotion_uuid=="0" ? "" : S3::public_path($value['promotion_image']), + ]; + } + } + } + + + } + + if (count($data) == 0 ) { + return $this->format->mobile_success("Data is Empty"); + } + return $this->format->mobile_success('Success',$return); + + } + +} diff --git a/app/Http/Controllers/API/ProductDetailsController.php b/app/Http/Controllers/API/ProductDetailsController.php new file mode 100644 index 0000000..a204e60 --- /dev/null +++ b/app/Http/Controllers/API/ProductDetailsController.php @@ -0,0 +1,385 @@ +product_details = $product_details; + $this->format = $httpStatusCode; + $this->module = "Products"; + $this->model = "Products"; + $this->url = $url; + $this->admin = $admin; + } + + public function getFuelList(){ + $rnrph = new RNRPHLibrary(); + $rnrph->getAllFuels(); + if (count($rnrph->response['data']) > 0) { + return $this->format->success("Success", $rnrph->response['data']); + + }else{ + return $this->format->success("Something went wrong",[]); + } + + } + + + public function sync() + { + $this->product_details->inActiveProductDetails(); + + $cyware = new StratuscastLibrary(); + $cyware->getProducts(); + if ($cyware->response['status_code'] == "200"){ + foreach ($cyware->response['data'] as $key => $value){ + $product_category = $this->product_details->getProductCategoryByField( "type", $value->product_category); + $product_category_id = ''; + + $product_category_data['type'] = $value->product_category; + $product_category_data['description'] = $value->product_category; + + if (count($product_category) == 0){ + $product_category_id = $this->product_details->storeProductCategory( $product_category_data ); + }else{ + $product_category_data['pc_id'] = $product_category[0]->pc_id; + $product_category_id = $product_category_data['pc_id']; + $this->product_details->updateProductCategory( $product_category_data ); + } + +//product_details + + $product_details = $this->product_details->getProductDetailsByField( "name", $value->product_name); + $data['pc_id'] = $product_category_id; + $data['name'] = $value->product_name; + $data['code'] = ''; + $data['image'] = $value->image; + $data['description'] = $value->product_description; + $data['details'] = $value->product_specification; + $data['is_active'] = 1; + + if (count($product_details) == 0){ + $this->product_details->storeProductDetails( $data ); + }else{ + $data['pd_id'] = $product_details[0]->pd_id; + $this->product_details->updateProductDetails( $data ); + } + } + return $this->format->success("Success",[]); + }else{ + return $this->format->badRequest("Something went wrong",[]); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + + } + + /** + * Store a newly created resource in storage. + *storeProductDetails + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(SystemPreferenceFormValidation $request) + { + + + } + /** + * Display the specified resource. + *d + * @param int $id + * products@return \Illuminate\Http\Response + */ + public function show($id) + { + + + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + + public function index() + { + $data = []; + $product_category = $this->product_details->getAllProductCategory( ); + $sort1 = []; + $sort2 = []; + $sort3 = []; + foreach ($product_category as $key => $value){ + $datas["category_name"] = $value->type; + $datas["category_uuid"] = $value->pc_uuid; + $datas["products"] = []; + foreach ($this->product_details->getProductsByCategory($value->pc_id) as $key => $values){ + + + + if ($value['type'] == 'Lubricants'){ + $returnValues['code'] = $values->code ; + $returnValues['name'] = $values->name ; + $returnValues['image'] = $values->image ; + $returnValues['description'] = $values->description ; + $returnValues['details'] = json_decode(json_encode($this->parseLubricant($values->details,$values->description ))) ; + array_push($datas["products"], $returnValues); + }else{ + + + if ($values->name == 'Euro 5 Gasoline 95' || $values->name == 'Euro 5 Gasoline 91' || $values->name == 'Euro 5 Gasoline 97'){ + $returnValues['code'] = $values->code ; + $returnValues['name'] = $values->name ; + $returnValues['image'] = $values->image ; + $returnValues['description'] = $values->description ; + $returnValues['details'] = json_decode(json_encode($this->parseFuel($values->details))) ; + array_push($datas["products"], $returnValues); + } + + if ($values->name != 'Euro5 Gasoline' && $values->name != 'Euro 5 Gasoline 95' && $values->name != 'Euro 5 Gasoline 91' && $values->name != 'Euro 5 Gasoline 97' ){ + $returnValues['code'] = $values->code ; + $returnValues['name'] = $values->name ; + $returnValues['image'] = $values->image ; + $returnValues['description'] = $values->description ; + $returnValues['details'] = json_decode(json_encode($this->parseDetails($values->details))) ; + array_push($datas["products"], $returnValues); + } + } + + + } + // $datas["products"] = []; + + if($datas["category_name"] == 'Lubricants') + $sort1 = $datas; + + if($datas["category_name"] == 'Fuels') + $sort2 = $datas; + + if($datas["category_name"] == 'Asphalt') + $sort3 = $datas; + + // array_push($data, $datas); + } + + array_push($data, $sort1); + array_push($data, $sort2); + array_push($data, $sort3); + + return $this->format->mobile_success('Success',$data); + } + + + + private function removeNBSP($details) + { + +// $details = htmlentities($details, null, 'utf-8'); + $details = str_replace(" ", "", $details); + $details = str_replace("nbsp", "", $details); + $details = str_replace("&amp;", "", $details); + $details = str_replace("&;", "", $details); + $details = str_replace("&", "", $details); + $details = str_replace(" ", " ", $details); + return $details; + + } + + + public function products() + { + $cyware = new StratuscastLibrary(); + $cyware->getProducts(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + private function parseDetails($details) + { + $detailsReturn = []; + $detailsArray = array_filter(explode(" ", $details)); + $title = ''; + $detail = ''; + foreach ($detailsArray as $key => $value){ + if ($key == 0){ + $title = $value; + }else{ + $details = $this->checkDetails($value); + + $detail .= empty($details['next-title']) ? $details." " : $details['details']; + if (!empty($details['next-title'])){ + $detailArray = ["level"=>1, "details"=> $this->removeNBSP(str_replace("#39;","'",str_replace("'","'",$details['details'])) )]; + + $detailarray = ['level'=>0,'title' => $title, 'details' => [$detailArray]]; + array_push($detailsReturn , $detailarray); + $title = $details['next-title']; + $detail = null; + } + } + $arraydetails = []; + $detailArray = ["level"=>1, "details"=>$this->removeNBSP(str_replace("'","'",str_replace("#39;","'",$details)))]; + array_push($arraydetails , ['level'=>0,'title' => "Product description", 'details' => [$detailArray]]); + } + return count($detailsReturn) == 0 ? $arraydetails : $detailsReturn; + } + + private function checkDetails($details) + { + $detailsArray = array_filter(explode(".", $details)); + if (count($detailsArray) == 1){ + return $details; + }else{ + $detailsHolder = ''; + $count = count($detailsArray) - 1; + foreach ($detailsArray as $key => $value) { + if ($count == $key ){ + $detail['details'] = $detailsHolder; + $detail['next-title'] = $value; + return $detail; + }else{ + $detailsHolder .= $value."."; + } + } + } + + return $details; + } + + private function parseLubricant($details, $description) + { + $detailsReturn = []; + $product_description = $this->delimitbyColon("Product description:".$this->get_string_between($details, 'Product description:', "Application:" )); + $application = $this->delimitbyColon("Application:".$this->get_string_between($details, 'Application:', "Benefits:" )); + $benefits = $this->delimitbyColon("Benefits:".$this->get_string_between($details, 'Benefits:', FALSE )); + array_push($detailsReturn , $product_description); + array_push($detailsReturn , $application); + array_push($detailsReturn , $benefits); + + return $detailsReturn; + } + + private function parseFuel($details) + { + $details2 = ["level"=>1, "details"=>$details]; + return [['level'=>0 ,'title'=> "Product description", "details"=> [$this->removeNBSP(str_replace("'","'",str_replace("#39;","'",$details2)))]]]; + } + + + + private function delimitbyColon($details) + { + $details = explode(":", $details); + $details2 = [["level"=>1, "details"=>str_replace(" ",'',$details[1])]]; + return ['level'=>0 ,'title'=> $details[0], "details"=> $details2]; + } + + + private function get_string_between($string, $start, $end){ + $string = ' ' . $string; + $ini = strpos($string, $start); + if ($ini == 0) return ''; + $ini += strlen($start); + $len = strpos($string, $end, $ini) - $ini; + + if ($end == false) { + $len = strlen($string); + } + return substr($string, $ini, $len); + } + + public function get_fuels_from_products() + { + $fuel_category = $this->product_details->getProductCategoryByField('type','Fuels'); + if(count($fuel_category) > 0) + { + $products = $this->product_details->getProductsByCategory($fuel_category[0]->pc_id); + + if(count($products) > 0) + { + $return = []; + foreach ($products as $key => $value) { + if($value['image'] != "") $return[] = $value['name']; + // $return[] = $value['name']; + } + + return $this->format->mobile_success('Success', array_reverse($return)); + } + } + + return $this->format->mobile_success('No Records Found'); + } + + + +} diff --git a/app/Http/Controllers/API/PromotionController.php b/app/Http/Controllers/API/PromotionController.php new file mode 100644 index 0000000..af8c13b --- /dev/null +++ b/app/Http/Controllers/API/PromotionController.php @@ -0,0 +1,676 @@ +promotions = $promotions; + $this->format = $httpStatusCode; + $this->module = "cardType"; + $this->model = "cardType"; + $this->admin_logs = $admin_logs; + $this->station = $station; + $this->loyalty_card = $loyalty_card; + $this->promotionStations = $promotionStations; + $this->system_preferences = $system_preferences; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + // expire top two promotions if date is lapsed + $this->promotions->expire_top_two(); + + $list = $this->promotions->listing($params); + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = PromotionResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(PromotionValidation $request) + { + $id = $this->promotions->store($request); + + if($id) + { + $station_uuids = json_decode($request->get('station_uuid')); + if($station_uuids != null && count($station_uuids)) + { + + $station_details = $this->station->getDetailsWhereIn('station_uuid',$station_uuids); + $station_ids = array(); + foreach ($station_details as $key => $value) { + $station_ids[] = $value['station_id']; + } + + $this->promotionStations->store($id, $station_ids); + } + + + + $this->admin_logs->log($id,self::MODULE,'STORE'); + + return $this->format->created('Promotion has been added'); + } + else + { + return $this->format->notFound(); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = $this->promotions->getByField('promotion_uuid',$uuid,'promotionStations.station'); + + if($details->count()) + { + $additionals = $this->format->success("Success",[],false); + $data = (new PromotionResource($details[0]))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + return $this->format->notFound(); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(PromotionValidation $request, $uuid) + { + $old_data = $this->promotions->getByField('promotion_uuid',$uuid); + + if($old_data->count()) + { + if($this->promotions->update($request,$uuid)) + { + // delete existing stations + $this->promotionStations->delete($old_data[0]['promotion_id']); + + // replace new assigned stations -- regardless if changed or not + $station_uuids = json_decode($request->get('station_uuid')); + if($station_uuids != null && count($station_uuids)) + { + $station_details = $this->station->getDetailsWhereIn('station_uuid',$station_uuids); + $station_ids = array(); + foreach ($station_details as $key => $value) { + $station_ids[] = $value['station_id']; + } + + $this->promotionStations->store($old_data[0]['promotion_id'], $station_ids); + } + + + $this->admin_logs->log($old_data[0]['promotion_id'],self::MODULE,'UPDATE'); + return $this->format->success("Promotion has been updated"); + } + else + { + return $this->format->notFound('Something went wrong'); + } + } + + return $this->format->notFound(); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $details = $this->promotions->getByField('promotion_uuid',$uuid); + if($details->count()) + { + $details = $details[0]; + if($this->promotions->delete($uuid)) + { + $this->admin_logs->log($details['promotion_id'],self::MODULE,'DELETE'); + return $this->format->success("Promotion Successfully Deleted"); + } + + } + + return $this->format->notFound(); + } + + public function promo_types() + { + return $this->format->success('Success',StaticContents::promo_type()); + } + + public function batch_delete(Request $request) + { + $uuid = $request->has('promotion_uuid') ? $request->get('promotion_uuid') : null; + + if($uuid) + { + $details = $this->promotions->getDetailsWhereIn('promotion_uuid',$uuid); + + + $id = array(); + + if($this->promotions->delete($uuid)) + { + foreach ($details as $key => $value) + { + $this->admin_logs->log($value['promotion_id'],self::MODULE,'DELETE'); + } + + return $this->format->success("Promotion Successfully Deleted"); + + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + else + { + $data['promotion_uuid'] = 'promotion_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one item",$data); + } + } + + public function get_promotions(Request $request) + { + $selected_promotion_uuid = $request->has('selected_promotion') ? $request->selected_promotion : null; + $list = $this->promotions->get_promotion($selected_promotion_uuid); + + $data = array(); + + if($list->count()) + { + foreach ($list as $key => $value) { + $data[] = array( + 'promotion_uuid' => $value['promotion_uuid'], + 'title' => $value['title'], + 'date_start' => $value['date_start'], + 'date_end' => $value['date_end'], + ); + } + } + + + return $this->format->success('Success',$data); + } + + public function disable_toptwo() + { + $promotion_uuid = request('promotion_uuid'); + + if($promotion_uuid) + { + $details = $this->promotions->getByField('promotion_uuid',$promotion_uuid); + if($details) + { + if($details[0]['is_toppromotion'] == 1) + return $this->format->success('Enable Add in Top 2 Promos',['is_toppromotion' => 'enable']); + } + + } + + $toptwo = Promotions::where('is_toppromotion',1) + ->where('is_active',1) + ->count(); + if($toptwo >= 2) + { + return $this->format->success('Disable Add in Top 2 Promos',['is_toppromotion' => 'disable']); + } + else + { + return $this->format->success('Enable Add in Top 2 Promos',['is_toppromotion' => 'enable']); + } + } + + + public function mobile_promotions(Request $request) + { + if($request->has('lcard_uuid') && $request->lcard_uuid != '') + { + $member_details = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + } + + + $date_now = date('Y-m-d H:i:s'); + + $general = $this->promotions->get_promo_by_date_type($date_now, StaticContents::promo_type('General',true)); + + if(isset($member_details)) + { + // loyalty exclusive & user specific + + $loyalty_exclusive = $this->promotions->get_promo_by_date_type($date_now, StaticContents::promo_type('Loyalty Exclusive',true)); + + $birthday = date('Y-m-d H:i:s',strtotime($member_details[0]['birthdate'])); + + $user_specific = $this->promotions->get_promo_by_date_birthdate_type($date_now, $birthday,StaticContents::promo_type('User Specific',true)); + + $general = $general->merge($loyalty_exclusive); + $general = $general->merge($user_specific); + } + + + $data = []; + + if(count($general)) + { + $general = $general->sortByDesc('date_end'); + + // check if latest have equal dates + $same_start_dates = []; + foreach ($general as $key => $value) { + $same_start_dates[date('YmdHis',strtotime($value['date_start']))][] = $value; + } + + + + $sorted_data = collect(); + foreach ($same_start_dates as $date => $promos) { + $merge = collect($promos); + $merge = $merge->sortBy('created_at'); + $sorted_data = $sorted_data->merge($merge); + } + + + foreach ($sorted_data as $key => $value) { + $stations = []; + foreach ($value['promotionStations'] as $k => $v) { + $stations[] = [ + 'station_uuid' => $v['station']['station_uuid'], + 'name' => $v['station']['description'], + ]; + } + + $image_url = S3::public_path($value['image']); + + $data[] = [ + 'promotion_uuid' => $value['promotion_uuid'], + 'title' => $value['title'], + 'description' => $value['description'], + 'image' => $image_url, + 'date_start' => $value['date_start'], + 'date_end' => $value['date_end'], + ]; + } + } + + return $this->format->mobile_success('Success',$data); + + } + + + public function mobile_promotions_gps(Request $request) + { + // get stations within the radius + $radius = $this->system_preferences->getByField('name','gps'); + + $station = $this->station->radius($radius[0]['value'], $request->longitude, $request->latitude); + if($station) + { + + if($request->has('lcard_uuid') && $request->lcard_uuid != '') + { + $member_details = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + } + + $station_ids = []; + + foreach ($station as $key => $value) { + $station_ids[] = $value['station_id']; + } + + $date_now = date('Y-m-d H:i:s'); + + $all_branches = collect(); + if(count($station_ids)) + { + $general = $this->promotions->get_promo_by_date_station_gps($station_ids, $date_now, StaticContents::promo_type('General',true)); + } + + $all_branches_general = $this->promotions->get_all_branch_promo($date_now, StaticContents::promo_type('General',true)); + $all_branches = $all_branches->merge($all_branches_general); + + if(isset($member_details) && count($member_details) > 0) + { + // loyalty exclusive & user specific + + $loyalty_exclusive = $this->promotions->get_promo_by_date_station_gps($station_ids,$date_now, StaticContents::promo_type('Loyalty Exclusive',true)); + + $all_branches_loyalty = $this->promotions->get_all_branch_promo($date_now, StaticContents::promo_type('Loyalty Exclusive',true)); + $all_branches = $all_branches->merge($all_branches_loyalty); + + $birthday = date('Y-m-d H:i:s',strtotime($member_details[0]['birthdate'])); + + $user_specific = $this->promotions->get_promo_by_birthdate_station_gps($station_ids,$date_now, $birthday,StaticContents::promo_type('User Specific',true)); + + if(count($station_ids)) + { + // all branches promotions + $all_branches_loyalty_exclusive = $this->promotions->get_all_branch_promo($date_now, StaticContents::promo_type('Loyalty Exclusive',true)); + $all_branches_user_specific = $this->promotions->get_all_branch_promo_by_birthdate($date_now,$birthday, StaticContents::promo_type('User Specific',true)); + + // $general = $general->merge($all_branches_loyalty_exclusive); + // $general = $general->merge($all_branches_user_specific); + $all_branches = $all_branches->merge($all_branches_loyalty_exclusive); + $all_branches = $all_branches->merge($all_branches_user_specific); + } + + $general = $general->merge($loyalty_exclusive); + $general = $general->merge($user_specific); + } + + $data = []; + + /* + SORTING RULE : + 1. nearest station + 2. date start (latest) + 3. if date start is the same creation date (latest) should be first + */ + + if(count($general) || count($all_branches)) + { + // get from nearest station + $nearest = []; + if(count($station_ids)) + { + for ($i=0; $i < count($station_ids); $i++) + { + foreach ($general as $key => $value) + { + foreach ($value['promotionStations'] as $k => $v) + { + if($v['station']['station_id'] == $station_ids[$i]) + $nearest[] = $value; + } + } + + if(count($nearest) > 0) + break; + } + } + + if(count($all_branches)) + { + $nearest = $general->merge($all_branches); + } + + $general = collect($nearest); + $general = $general->sortByDesc('date_start'); + + // check if latest have equal dates + $ctr = 1; + $same_start_dates = []; + foreach ($general as $key => $value) { + if($ctr > 1) + { + if($previous_date_start == $value->date_start) + $same_start_dates[] = $value; + else + break; + } + else + $same_start_dates[] = $value; + + $previous_date_start = $value->date_start; + $ctr++; + } + + $general = collect($same_start_dates); + $general = $general->sortByDesc('created_dt'); + + + foreach ($general as $key => $value) { + $stations = []; + foreach ($value['promotionStations'] as $k => $v) { + $stations[] = [ + 'station_uuid' => $v['station']['station_uuid'], + 'name' => $v['station']['description'], + ]; + } + + $image_url = S3::public_path($value['image']); + + $data[] = [ + 'promotion_uuid' => $value['promotion_uuid'], + 'title' => $value['title'], + 'description' => $value['description'], + 'image' => $image_url, + 'date_start' => $value['date_start'], + 'date_end' => $value['date_end'], + 'station' => $stations, + ]; + + break; // one return only + + } + } + + return $this->format->mobile_success('Success',$data); + } + } + + + public function getTopTwoPromotion(Request $request) + { + if($request->has('lcard_uuid') && $request->lcard_uuid != '') + { + $member_details = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + } + + $date_now = date('Y-m-d'); + + + $general = $this->promotions->getTopTwoPromotion(StaticContents::promo_type('General',true)); + if (isset($member_details)){ + if(count($member_details) == 1) + { + // loyalty exclusive & user specific + $loyalty_exclusive = $this->promotions->getTopTwoPromotion(StaticContents::promo_type('Loyalty Exclusive',true)); + + $birthday = date('Y-m-d H:i:s',strtotime($member_details[0]['birthdate'])); + $birthdate = date('Y').'-'.date('m-d',strtotime($birthday)); + $general = $general->merge($loyalty_exclusive); + if($date_now == $birthdate){ + $user_specific = $this->promotions->getTopTwoPromotion(StaticContents::promo_type('User Specific',true)); + $general = $general->merge($user_specific); + } + + } + } + + + $data = []; + if(count($general)) + { + + $general = collect($general); + $general = $general->sortByDesc('date_start'); + + // check if latest have equal dates + $ctr = 1; + $same_start_dates = []; + foreach ($general as $key => $value) { + // if($ctr > 1) + // { + // if($previous_date_start == $value->date_start) + // $same_start_dates[] = $value; + // else + // break; + // } + // else + // $same_start_dates[] = $value; + + // $previous_date_start = $value->date_start; + // $ctr++; + $same_start_dates[$value->date_start][] = $value; + } + + $sorted_start_dates = collect(); + foreach ($same_start_dates as $key => $value) { + $v = collect($value); + if(count($value) > 1) + { + $v_sort = $v->sortBy('created_at'); + $sorted_start_dates = $sorted_start_dates->merge($v_sort); + } + else + $sorted_start_dates = $sorted_start_dates->merge($v); + } + + + $general = $sorted_start_dates; + + + foreach ($general as $key => $value) { + + $image_url = S3::public_path($value['image']);//S3::public_path($value['image']); + + $data[] = [ + 'promotion_uuid' => $value['promotion_uuid'], + 'title' => $value['title'], + 'description' => $value['description'], + 'image' => $image_url, + 'date_start' => $value['date_start'], + 'date_end' => $value['date_end'], + ]; + } + } + + return $this->format->mobile_success('Success',$data); + + } + + public function mobile_promotions_details($uuid) + { + $details = $this->promotions->getByField('promotion_uuid',$uuid); + + if(count($details) > 0) + { + $image_url = str_replace('/public/index.php','',secure_url('storage/app/'.$details[0]['image'])); + $image_url = str_replace('https','http',$image_url); + + return $this->format->mobile_success('Success',[ + 'image' => $image_url, + 'title' => $details[0]['title'], + 'description' => $details[0]['description'], + ]); + } + else + { + return $this->format->mobile_error('Incorrect promotion_uuid'); + } + } +} diff --git a/app/Http/Controllers/API/ReportsController.php b/app/Http/Controllers/API/ReportsController.php new file mode 100644 index 0000000..c5057ac --- /dev/null +++ b/app/Http/Controllers/API/ReportsController.php @@ -0,0 +1,215 @@ +payments = $payments; + $this->format = $httpStatusCode; + $this->admin_logs = $admin_logs; + $this->ratings = $ratings; + $this->mobileAnalytics = $mobileAnalytics; + $this->registration = $registration; + } + + + /** + * TOP UP REPORT + * + * + */ + + public function top_up(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + if(ParameterHelper::validateStartEndDate($params)) + { + return $this->format->unprocessableEntity('Start date must not be greater than end date'); + } + + + $list = $this->payments->report_topUp($params); + + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = ReportTopUpResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + public function export_top_up() + { + $filename = "reports_top_up" . date("mdY") . ".csv"; + $this->admin_logs->log(0,'REPORT_TOPUP','EXPORT',$filename); + return Excel::download(new ReportTopUpExport($this->payments), $filename); + } + + /** + * STATION RATING REPORT + * + * + */ + + public function station_rating(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + if(ParameterHelper::validateStartEndDate($params)) + { + return $this->format->unprocessableEntity('Start date must not be greater than end date'); + } + + $list = $this->ratings->report_stationRatings($params); + + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = ReportStationRatingsResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + public function export_station_rating() + { + $filename = "reports_station_rating" . date("mdY") . ".csv"; + $this->admin_logs->log(0,'REPORT_STATIONRATINGS','EXPORT',$filename); + return Excel::download(new ReportStationRatingsExport($this->ratings), $filename); + } + + /** + * MOBILE USAGE REPORT + * + * + */ + + public function mobile_usage(Request $request) + { + $params = [ + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + + if(ParameterHelper::validateStartEndDate($params)) + { + return $this->format->unprocessableEntity('Start date must not be greater than end date'); + } + + $list = $this->mobileAnalytics->report_mobileUsage($params); + + + if(count($list)) + { + $additionals = $this->format->success("Success",[],false); + $data = ReportMobileUsageResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->success("No records found",[]); + } + } + + public function export_mobile_usage() + { + $filename = "reports_mobile_usage" . date("mdY") . ".csv"; + $this->admin_logs->log(0,'REPORT_MOBILEUSAGE','EXPORT',$filename); + return Excel::download(new ReportMobileUsageExport($this->mobileAnalytics), $filename); + } + + /** + * REGISTRATION + * + * + */ + + public function registration(Request $request) + { + $params = [ + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'date_start' => ($request->has('date_start') ? $request->get('date_start') : null), + 'date_end' => ($request->has('date_end') ? $request->get('date_end') : null), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + $list = $this->registration->report_registration($params); + + if(count($list)){ + $additionals = $this->format->success("Success",[],false); + $data = RegistrationResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + }else{ + return $this->format->success("No records found",[]); + } + } + + public function export_registration() + { + $filename = "registration" . date("mdY") . ".csv"; + $this->admin_logs->log(0,'REPORT_REGISTRATION','EXPORT',$filename); + return Excel::download(new ReportRegistrationExport($this->registration), $filename); + } + + +} diff --git a/app/Http/Controllers/API/SharedTreatsController.php b/app/Http/Controllers/API/SharedTreatsController.php new file mode 100644 index 0000000..04b9e33 --- /dev/null +++ b/app/Http/Controllers/API/SharedTreatsController.php @@ -0,0 +1,98 @@ +format = $httpStatusCode; + $this->lcard_logs = $lcard_logs; + $this->module = "SharedTreats"; + $this->model = "SharedTreats"; + $this->url_encryption = Config::get('app.sharedtreatsEncryption'); + $this->url_gateway = Config::get('app.sharedtreatsGateway'); + } + + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $return = []; + + $member_details = CurrentUserHelper::get_currentMember(); + + if (empty($member_details->card_number)){ + return $this->format->mobile_error('Something went wrong'); + } + if (empty($member_details->mobile)){ + return $this->format->mobile_error('Something went wrong'); + } + if(!$this->checkMobileNumber($member_details->mobile)){ + return $this->format->mobile_error('Something went wrong'); + } + + $card = $member_details->card_number."/1"; + $data = $this->create_request($card); + $encrypted_uuid = $data->result_value; + + $data = $this->create_request($member_details->mobile); + $encrypted_mobile = $data->result_value; + + $return['site'] = $this->url_gateway.$encrypted_uuid."/".$encrypted_mobile; + + $this->lcard_logs->log("0",'SHAREDTREATS','VIEW'); + + return $this->format->mobile_success('Shared Treats',$return); + } + + public function checkMobileNumber($mobileNumber) + { + if (mb_substr($mobileNumber, 0, 2) == "63"){ + return $mobileNumber; + }elseif(mb_substr($mobileNumber, 0, 2) == "09" ){ + return "63".substr($mobileNumber, -10); + }elseif(mb_substr($mobileNumber, 0, 1) == "9"){ + return "63".substr($mobileNumber, -10); + }else{ + return false; + } + } + + public function create_request($params) + { + $url = $this->url_encryption ; + $this->uri = new Uri($url.$params); + $client = new Client(); + $response = $client->request('GET', $this->uri,[]); + return json_decode($response->getBody()->getContents()) ; + } + + + +} diff --git a/app/Http/Controllers/API/SignUpController.php b/app/Http/Controllers/API/SignUpController.php new file mode 100644 index 0000000..5d80309 --- /dev/null +++ b/app/Http/Controllers/API/SignUpController.php @@ -0,0 +1,457 @@ +loyaltyCard = $loyaltyCard; + $this->cardtype = $cardtype; + $this->personalDetails = $personalDetails; + $this->mobile_usage = $mobile_usage; + $this->user = $user; + $this->lcard_logs = $lcard_logs; + $this->signupAPICalls = $signupAPICalls; + $this->format = $httpStatusCode; + $this->module = "SignUp"; + $this->model = "LoyaltyCardSignUp"; + } + + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function index(Request $request) + // { + // $params = [ + // 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + // 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + // 'page' => ($request->has('page') ? $request->get('page') : 10), + // 'sorting' => ParameterHelper::prepareSortingParameter($request), + // 'status' => ($request->has('status') ? $request->status : NULL), + // ]; + + // if(count($params['status'])) + // { + // foreach ($params['status'] as $key => $value) { + // $params['status'][$key] = StaticContents::loyalty_card_signup_status($value,true); + // } + // } + + // $list = $this->signup->listing($params); + + // // dd($list); + + // if(count($list)) + // { + // $additionals = $this->format->success("Success",[],false); + // $data = LoyaltyCardSignUpCMSResource::collection($list)->additional($additionals); + // return $data->response()->setStatusCode(200); + // } + // else + // { + // return $this->format->success("No records found",[]); + // } + // } + + public function check_id_number(MobileSignupIDNumberValidation $request) + { + $card_details = $this->cardtype->getByField(['cardtype_uuid' => $request->cardtype_uuid]); + + if(count($card_details) > 0) + { + $card_details = $card_details[0]; + if($card_details->id_number == 1) + { + $cyware = new CywareLibrary(); + $cyware->setCardTypeCode($card_details->code); + $cyware->setIDNumber($request->id_number); + $cyware->state_id_entry(); + + if(isset($cyware->response['result'])) + { + + // NOTE : cyware returns sql:success for unused and used id numbers + + if($cyware->response['status_code'] == "200" && $cyware->response['message'] == "success" && $cyware->response['result'] == "Valid ID Number") + { + return $this->format->mobile_success($cyware->response['result'],[]); + } + else + { + return $this->format->mobile_error($cyware->response['result'],[]); + } + } + else + return $this->format->mobile_error($cyware->response['message'],[]); + + } + else + { + return $this->format->mobile_success('Card Type doesn\'t require ID Number'); + } + } + else + { + return $this->format->mobile_error('Card Type doesn\'t exists'); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + + } + + /** + * Store a newly created resource in storage. + * + * Accessed by MOBILE + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + public function store(MobileSignupFormValidation $request) + { + $card_details = $this->cardtype->getByField(['cardtype_uuid' => $request->cardtype_uuid]); + if(count($card_details) > 0) + { + $card_details = $card_details[0]; + $user_id = env("USER_ID_PRE_IDENTIFIER", '').date('Ymd').($this->signupAPICalls->count() + 1); + $signup_api_id = $this->signupAPICalls->log($user_id); + + $cyware = new CywareLibrary(); + $cyware->setCardTypeCode($card_details->code); + $cyware->setIDNumber($request->id_number); + $cyware->setFirstName($request->firstname); + $cyware->setLastName($request->lastname); + $cyware->setBirthday(date('Ymd',strtotime($request->birthdate))); + $mobile = strlen($request->mobile) == 12 ? $request->mobile : '63'.$request->mobile; + $cyware->setMobile($mobile); + $cyware->setEmail($request->email); + $cyware->setUserID($user_id); + $cyware->state_app_entry(); + + if($cyware->response['status_code'] == "200" && $cyware->response['message'] == "success") + { + // save on personal details + $pd_id = $this->personalDetails->store_signup($request); + + // save on loyalty card + $lcard_det = $this->loyaltyCard->store_signup($pd_id,(object)[ + 'card_number' => $cyware->response['card_number'], + 'pin' => $cyware->response['pin'], + 'birthdate' => $request->birthdate, + 'mobile' => $mobile, + 'email' => $request->email, + 'card_id' => $card_details->cardtype_id + ]); + + // log user in + $this->user->store_member((object)[ + 'first_name' => $request->firstname, + 'last_name' => $request->lastname, + 'card_number' => $cyware->response['card_number'], + 'birthdate' => $request->birthdate, + ]); + + $this->mobile_usage->add_active(); + $this->signupAPICalls->success($signup_api_id,$lcard_det['lcard_id']); + + if(Auth::attempt([ 'username' => $cyware->response['card_number'], 'password' => $request->birthdate ])) + { + $getuserDetails = $this->loyaltyCard->show($lcard_det['lcard_uuid'],['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType','codeCity','codeFuelType']); + $data = new MobileUserProfileResource($getuserDetails); + $userDetails = null; + if($data != null){ + $userDetails = $data->toArray($getuserDetails); + + } + + $user = Auth::user(); + $success['is_valid'] = 1; + // $success['lcard_uuid'] = $lcard_det['lcard_uuid']; + // $success['birthdate'] = $request->birthdate; + // $success['mobile'] = $request->mobile; + // $success['card_number'] = $cyware->response['card_number']; + // $success['user_id'] = $user['id']; + + // ---------------------------------------------------------------- new login start + + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $cyware->response['card_number'], + 'password' => $request->birthdate, + 'scope' => '' + ]; + + $request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($request)->getContent(); + $result = json_decode($result); + + $success['token'] = $result->access_token; + $userDetails['customer_number'] = $cyware->response['customer_number']; + $success['userDetails'] = $userDetails; + // ---------------------------------------------------------------- new login end + + $this->lcard_logs->log($lcard_det['lcard_id'],'SIGNUP','LOGIN','Member successfully signs up'); + return $this->format->mobile_success('Success',$success); + } + } + else + return $this->format->mobile_error($cyware->response['message']); + } + else + { + return $this->format->mobile_error('Card Type doesn\'t exists'); + } + } + + // public function store(MobileSignupFormValidation $request) + // { + // $uuid = $this->signup->store($request); + + // return $this->format->mobile_success('Success',[ + // 'lcard_s_uuid' => $uuid, + // ]); + // } + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function upload(Request $request) + // { + // if($this->signup->upload_document($request)) + // return $this->format->mobile_success('Successfully Updated'); + // else + // return $this->format->mobile_errror('Something went wrong'); + // } + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function signupSubmit($uuid) + // { + // // check if there's already a reference number + // $details = $this->signup->getByField([ + // 'lcard_s_uuid' => $uuid + // ]); + + // if($details) + // { + // if($details[0]->ref_no == '') + // { + // // create reference number + // $count = $this->signup->count_between(date('Y-m-d 00:00:00'), date('Y-m-d 23:59:59')); + // $ref_no = 'REF-'.date('Ymd').'-'.str_pad($count, 5, "0", STR_PAD_LEFT); + + + // // send email to Super Admin -- TODO! + + // if($this->signup->assign_ref_no($uuid,$ref_no)) + // return $this->format->mobile_success('Success',['ref_no' => $ref_no]); + // else + // return $this->format->mobile_errror('Something went wrong'); + // } + // else + // return $this->format->mobile_success('Success',['ref_no' => $details[0]->ref_no]); + // } + // else + // return $this->format->mobile_errror('User does not exists'); + // } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function show($uuid) + // { + // $details = $this->signup->getByField(['lcard_s_uuid' => $uuid],['codeCardType','idNumberType']); + + // if($details) + // { + // $additionals = $this->format->success("Success",[],false); + // $data = (new LoyaltyCardSignUpCMSResource($details[0]))->additional($additionals); + // return $data->response()->setStatusCode(200); + // } + // else + // return $this->format->notFound(); + // } + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function review($uuid) + // { + // $details = $this->signup->getByField(['lcard_s_uuid' => $uuid],['codeCardType','idNumberType']); + + // if($details->count()) + // { + // $additionals = $this->format->mobile_success("Success",[],false); + // $data = (new LoyaltyCardSignUpResource($details[0]))->additional($additionals); + // return $data->response()->setStatusCode(200); + // } + // else + // return $this->format->mobile_error('User not found'); + // } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function reject(Request $request) + // { + // // reject application + + // // replace mark ups on SELECTED template + + // // sms and email + // } + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function approve($uuid) + // { + // // submit to cyware + + // // if okay -- approve application + + // // replace mark ups on FIXED approve template + + // // sms and email + + // // return token + // } + + /* + NOTE: THIS FEATURE IS FROM THE INITIAL PLAN FOR CR1 + */ + // public function test() + // { + // $mail = new PHPMailer(true); + + // try { + + // $mail->SMTPDebug = 2; // Enable verbose debug output + // $mail->isSMTP(); // Set mailer to use SMTP + // // $mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers + // $mail->Host = 'smtp.gmail.com'; + // $mail->SMTPAuth = true; // Enable SMTP authentication + // $mail->Username = 'yondutesting@gmail.com'; // SMTP username + // $mail->Password = 'myY0nduP@ssword01'; // SMTP password + // $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted + // $mail->Port = 587; // TCP port to connect to + + // } + + // echo "here"; + // } + +} diff --git a/app/Http/Controllers/API/StationController.php b/app/Http/Controllers/API/StationController.php new file mode 100644 index 0000000..2380a14 --- /dev/null +++ b/app/Http/Controllers/API/StationController.php @@ -0,0 +1,887 @@ +station = $station; + $this->format = $httpStatusCode; + $this->module = "station"; + $this->model = "station"; + $this->admin_logs = $admin_logs; + $this->lcard_logs = $lcard_logs; + $this->station_favorite = $station_favorite; + $this->station_fuel_prices = $station_fuel_prices; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } + + public function get_viewable() + { + $details = $this->station->getByField('is_viewable',1); + + if(count($details) > 0) + { + $parsed = array(); + foreach ($details as $key => $value) + { + if($value['is_active'] == 1) + { + $parsed[] = array( + 'station_uuid' => $value['station_uuid'], + 'code' => $value['code'], + 'description' => $value['description'], + ); + } + } + + return $this->format->success('Success',$parsed); + } + else + { + return $this->format->noContent('No stations saved'); + } + } + + public function nearby(Request $request) + { + $this->lcard_logs->log(0,'STATIONLOCATOR','VIEW','Member views nearby stations'); + $station = $this->station->nearby($request->longitude, $request->latitude); + + if(count($station)) + { + $additionals = $this->format->mobile_success("Success",[],false); + $data = StationLocatorResource::collection($station)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->mobile_success("Empty"); + } + } + + public function favorites() + { + $this->lcard_logs->log(0,'STATIONLOCATOR','VIEW','Member views favorite stations'); + $station = $this->station->favorites(); + + if(count($station)) + { + $additionals = $this->format->mobile_success("Success",[],false); + $data = StationLocatorResource::collection($station)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->mobile_success("Empty",[]); + } + } + + public function search(Request $request) + { + if($request->has('keyword')) + { + $this->lcard_logs->log(0,'STATIONLOCATOR','SEARCH','Member searches for keyword '.$request->search); + $city = $this->station->search_by_keyword($request->keyword); + } + elseif ($request->has('province_uuid')) + { + $this->lcard_logs->log(0,'STATIONLOCATOR','SEARCH','Member searches station via province '); + $city = $this->station->search_by_province($request->province_uuid); + } + else + { + $this->lcard_logs->log(0,'STATIONLOCATOR','SEARCH','Member searches station'); + $city = $this->station->search_all(); + } + + if($city) + { + return $this->format->mobile_success("Success",$city); + // $data = StationSearchResource::collection($city)->additional($additionals); + // return $data->response()->setStatusCode(200); + // return $additionals; + } + else + { + return $this->format->mobile_success("Empty"); + } + } + + public function by_province(Request $request) + { + $this->lcard_logs->log(0,'STATIONLOCATOR','SEARCH','Member searches station via province '); + $city = $this->station->search_by_province($request->province_uuid); + + if($city) + { + $additionals = $this->format->mobile_success("Success",[],false); + $data = StationSearchResource::collection($city)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->mobile_success("Empty"); + } + } + + public function by_city($uuid) + { + $this->lcard_logs->log(0,'STATIONLOCATOR','SEARCH','Member searches station via city'); + $station = $this->station->search_by_city($uuid); + if(count($station)) + { + $additionals = $this->format->mobile_success("Success",[],false); + $data = StationLocatorResource::collection($station)->additional($additionals); + return $data->response()->setStatusCode(200); + } + else + { + return $this->format->mobile_success("Empty",[]); + } + } + + public function fuel_prices($uuid) + { + $station = $this->station->search_by_uuid($uuid); + + if($station) + { + $this->lcard_logs->log($station[0]['sid'],'STATIONLOCATOR','VIEW','Member views station details'); + $stratuscast = new StratuscastLibrary(); + $stratuscast->getFuelPriceBystation($station[0]['code']); + $db_fuel_prices = $this->station_fuel_prices->getByField([ + 'station_id' => $station[0]['sid'], + 'is_active' => 1, + ], + null, + [ + 'field' => 'updated_at', + 'value' => 'asc' + ]); + + $db = []; + $latest_update = date('M d, Y'); + if(count($db_fuel_prices)) + { + foreach ($db_fuel_prices as $k => $v) + { + $db[$v['fuel_code']] = $v; + $latest_update = date('M d, Y',strtotime($v['updated_at'])); + } + } + + $fuel_type = StaticContents::fuelType_code(); + + $fuel_prices = []; + $except_where_in = []; // delete fuel prices that are not returned by stratuscast + if(count($stratuscast->response['data'])) + { + foreach ($stratuscast->response['data'] as $key => $value) { + if($value->price != '') + { + if(isset($db[$value->fuel_code])) + { + if($db[$value->fuel_code]['price'] != $value->price) + $this->station_fuel_prices->update_price($db[$value->fuel_code]['fuel_price_uuid'],$value->price); + } + else + { + $this->station_fuel_prices->store($station[0]['sid'],[ + 'fuel_code' => $value->fuel_code, + 'fuel_name' => isset($fuel_type[$value->fuel_code]) ? $fuel_type[$value->fuel_code] : '', + 'price' => $value->price, + ]); + } + + + $fuel_prices[] = [ + 'fuel_code' => $value->fuel_code, + 'fuel_name' => isset($fuel_type[$value->fuel_code]) ? $fuel_type[$value->fuel_code] : '', + 'price' => $value->price, + ]; + + $except_where_in[] = $value->fuel_code; + } + } + } + + // delete others + $this->station_fuel_prices->delete($station[0]['sid'],$except_where_in); + + return $this->format->mobile_success('Success',[ + 'name' => $station[0]['description'], + 'address' => $station[0]['address'], + 'longitude' => $station[0]['longitude'], + 'latitude' => $station[0]['latitude'], + 'favorite' => $station[0]['favorite'] > 0 ? true : false, + 'contact_numbers' => explode("/", $station[0]['contact_number']), + 'stars' => round($station[0]['average']), + 'fuel_prices' => $fuel_prices, + 'latest_update' => $latest_update + ]); + } + else + return $this->format->mobile_error('Station Not Found'); + } + + public function set_favorite($uuid) + { + $station = $this->station->getByField('station_uuid',$uuid); + + if(count($station)) + { + $member_details = CurrentUserHelper::get_currentMember(); + if($this->station_favorite->store($station[0]['station_id'], $member_details->lcard_id)) + { + $this->lcard_logs->log($station[0]['station_id'],'STATIONLOCATOR','STORE','Member added station to favorites'); + return $this->format->mobile_success('Station added to favorites'); + } + else + return $this->format->mobile_error('Error on save'); + } + else + return $this->format->mobile_error('Station Not Found'); + + + } + + public function delete_favorite($uuid) + { + $station = $this->station->getByField('station_uuid',$uuid); + + if(count($station)) + { + $member_details = CurrentUserHelper::get_currentMember(); + if($this->station_favorite->delete($station[0]['station_id'], $member_details->lcard_id)) + { + $this->lcard_logs->log($station[0]['station_id'],'STATIONLOCATOR','DELETE','Member deleted a station to favorites'); + return $this->format->mobile_success('Station deleted to favorites'); + } + else + return $this->format->mobile_error('Error on delete'); + } + else + return $this->format->mobile_error('Station Not Found'); + } + + + /* + note : execute to sync details from stratuscast + + */ + public function manual_overide() + { + $stratuscast = new StratuscastLibrary(); + $stratuscast->getAllFuelPrice(); + + if(isset($stratuscast->response['data'])) + { + foreach ($stratuscast->response['data'] as $key => $value) { + $searched = $this->station->search_by_code($value->station_code); + + if(count($searched) > 0) + { + $this->station->update_content($value); + } + else + { + if(!$this->station->store($value)) + { + return $this->format->badRequest('Something went wrong'); + } + } + + } + + return $this->format->success('Success'); + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + +//RNRPH Library + + public function get_provinces(){ + try { + $rnrph = new RNRPHLibrary(); + $rnrph->getAllProvinces(); + $return = []; + $previous_province = ''; + $ctr = 0; + $current_array = []; + + foreach ($rnrph->response['data'] as $key => $province) + { + if($previous_province != $province->name) + { + if($ctr != 0) + $return[] = $current_array; + + $current_array = []; + + $current_array['name'] = $province->name; + $current_array['city'][] = [ + 'name' => $province->city_name, + 'city_uuid' => $province->city_uuid, + ]; + } + else + { + $current_array['city'][] = [ + 'name' => $province->city_name, + 'city_uuid' => $province->city_uuid, + ]; + } + $previous_province = $province->name; + $ctr++; + } + + return $this->format->mobile_success('Success',$return); + } catch (Exception $e) { + return $this->format->mobile_error('Something went wrong'); + } + } + + public function get_stations(){ + try { + $rnrph = new RNRPHLibrary(); + $rnrph->getAllStations(); + $details = $rnrph->response['data']; + + if(count($details) > 0) + { + $parsed = array(); + foreach ($details as $key => $value) + { + $parsed[] = array( + 'station_uuid' => $value->station_uuid, + 'code' => $value->code, + 'description' => $value->description, + ); + } + + return $this->format->success('Success',$parsed); + } + else + { + return $this->format->noContent('No stations saved'); + } + } catch (Exception $e) { + return $this->format->mobile_error('Something went wrong'); + } + } + + public function get_cities(){ + try { + $rnrph = new RNRPHLibrary(); + $rnrph->getAllBranches(); + $details = $rnrph->response['data']; + + if(count($details) > 0) + { + + return $this->format->success('Success',$details); + } + else + { + return $this->format->noContent('No stations saved'); + } + } catch (Exception $e) { + return $this->format->mobile_error('Something went wrong'); + } + } + + public function db_get_station_fuel_prices($id) { + try{ + $fuel_prices = []; + $db_fuel_prices = $this->station_fuel_prices->getByField([ + 'station_id' => $id, + 'is_active' => 1, + ], + null, + [ + 'field' => 'updated_at', + 'value' => 'asc' + ]); + $db = []; + $latest_update = date('M d, Y'); + if(count($db_fuel_prices)) + { + foreach ($db_fuel_prices as $k => $v) + { + // $db[$v['fuel_code']] = array( + // 'fuel_code' => $v->fuel_code, + // 'fuel_name' => $v->fuel_name, + // 'price' => $v->price + // ); + $db[] = array( + 'fuel_code' => $v->fuel_code, + 'fuel_name' => $v->fuel_name, + 'price' => $v->price + ); + // $db[] = $v; + $latest_update = date('M d, Y',strtotime($v['updated_at'])); + } + return array( + 'latest_update' => $latest_update, + 'list' => $db + ); + }else{ + return array( + 'latest_update' => "", + 'list' => [] + ); + } + }catch(Exception $e){ + return array( + 'latest_update' => "", + 'list' => [] + ); + } + } + + public function sort_fuels($fuels){ + + } + + public function get_station_fuels(){ + try { + $rnrph = new RNRPHLibrary(); + $rnrph->getAllStations(); + $details = $rnrph->response['data']; + + if(count($details) > 0) + { + $stations = array(); + foreach ($details as $key => $value) + { + + $fuelFromDB = $this->parse_fuels($value->StationFuels); + $stations[] = array( + 'name' => $value->description, + 'address' => $value->address, + 'longitude' => $value->longitude, + 'latitude' => $value->latitude, + // 'favorite' => $value->favorite && $value->favorite > 0 ? true : false, + 'favorite' => false, + 'contact_numbers' => $value->contact_number, + // 'stars' => round($value->rating || 0), + 'stars' => 0, + 'fuel_prices' => $fuelFromDB['list'], + 'latest_update' => $fuelFromDB['latest_update'], + 'full' => $value + ); + + } + return $this->format->success('Success', $stations); + } + else + { + return $this->format->noContent('No stations saved'); + } + } catch (Exception $e) { + return $this->format->mobile_error('Something went wrong'); + } + } + + public function manual_update() + { + $stratuscast = new RNRPHLibrary(); + $stratuscast->getAllStations(); + + if(isset($stratuscast->response['data'])) + { + $ids = []; + $st = $this->station->get_active_stations(); + foreach ($st as $key => $value) { + array_push($ids,$value->station_id); + } + $this->station->disbale_stations($ids); + foreach ($stratuscast->response['data'] as $key => $value) { + $searched = $this->station->search_by_code($value->code); + + if(count($searched) > 0) + { + $this->station->update_stations($value); + } + else + { + if(!$this->station->store($value)) + { + return $this->format->badRequest('Something went wrong'); + } + } + + } + + return $this->format->success('Success'); + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + + public function parse_fuels($fuels) { + try{ + $fuel_prices = []; + $db = []; + $latest_update = date('M d, Y'); + if(count($fuels)) + { + foreach ($fuels as $k => $v) + { + $db[] = array( + 'fuel_code' => $v->Fuel->code, + 'fuel_name' => $v->Fuel->name, + 'price' => $v->price + ); + $latest_update = date('M d, Y',strtotime($v->updatedAt)); + } + return array( + 'latest_update' => $latest_update, + 'list' => $db + ); + }else{ + return array( + 'latest_update' => "", + 'list' => [] + ); + } + }catch(Exception $e){ + return array( + 'latest_update' => "", + 'list' => [] + ); + } + } + + function sortByField($multArray,$sortField,$desc=true){ + $tmpKey=''; + $ResArray=array(); + + $maIndex=array_keys($multArray); + $maSize=count($multArray)-1; + + for($i=0; $i < $maSize ; $i++) { + + $minElement=$i; + $tempMin=$multArray[$maIndex[$i]][$sortField]; + $tmpKey=$maIndex[$i]; + + for($j=$i+1; $j <= $maSize; $j++) + if($multArray[$maIndex[$j]][$sortField] < $tempMin ) { + $minElement=$j; + $tmpKey=$maIndex[$j]; + $tempMin=$multArray[$maIndex[$j]][$sortField]; + + } + $maIndex[$minElement]=$maIndex[$i]; + $maIndex[$i]=$tmpKey; + } + + if($desc) + for($j=0;$j<=$maSize;$j++) + // $ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]]; + $ResArray[] = $multArray[$maIndex[$j]]; + else + for($j=$maSize;$j>=0;$j--) + // $ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]]; + $ResArray[] = $multArray[$maIndex[$j]]; + + return array_reverse($ResArray); + } + + public function get_station_fuel_details($uuid){ + try { + $station = $this->station->search_by_uuid($uuid); + if($station && $station[0]) + { + // $this->lcard_logs->log($station[0]['sid'],'STATIONLOCATOR','VIEW','Member views station details'); + $rnrph = new RNRPHLibrary(); + $rnrph->getStationDetails($station[0]['code']); + + + $details = $rnrph->response['data']; + $db_fuel_prices = $this->station_fuel_prices->getByField([ + 'station_id' => $station[0]['sid'], + 'is_active' => 1, + ], + null, + [ + 'field' => 'updated_at', + 'value' => 'asc' + ]); + $db = []; + $latest_update = date('M d, Y'); + if(count($db_fuel_prices)) + { + foreach ($db_fuel_prices as $k => $v) + { + $db[$v['fuel_code']] = $v; + $latest_update = date('M d, Y',strtotime($details->StationFuels[0]->updatedAt)); + } + } + + $fuel_type = StaticContents::fuelType_code(); + $fuel_prices = []; + $except_where_in = []; // delete fuel prices that are not returned by stratuscast + if(count($details->StationFuels)) + { + foreach ($details->StationFuels as $key => $value) { + if(isset($db[$value->Fuel->code])) + { + if($db[$value->Fuel->code]['price'] != $value->price) + $this->station_fuel_prices->update_price($db[$value->Fuel->code]['fuel_price_uuid'],$value->price); + } + else + { + $this->station_fuel_prices->store($station[0]['sid'],[ + 'fuel_code' => $value->Fuel->code, + 'fuel_name' => isset($fuel_type[$value->Fuel->code]) ? $fuel_type[$value->Fuel->code] : '', + 'price' => $value->price, + ]); + } + + + $fuel_prices[] = [ + 'fuel_code' => $value->Fuel->code, + 'fuel_name' => isset($fuel_type[$value->Fuel->code]) ? $fuel_type[$value->Fuel->code] : '', + 'price' => $value->price, + ]; + + $except_where_in[] = $value->Fuel->code; + } + } + + // delete others + $this->station_fuel_prices->delete($station[0]['sid'],$except_where_in); + + return $this->format->mobile_success('Success',[ + 'name' => $station[0]['description'], + 'address' => $station[0]['address'], + 'longitude' => $station[0]['longitude'], + 'latitude' => $station[0]['latitude'], + 'favorite' => $station[0]['favorite'] > 0 ? true : false, + 'contact_numbers' => explode("/", $station[0]['contact_number']), + 'stars' => round($station[0]['average']), + 'fuel_prices' => $this->sortByField($fuel_prices, "fuel_code"), + 'latest_update' => $latest_update + ]); + + } + else + return $this->format->mobile_error('Station Not Found'); + } catch (Exception $e) { + return $this->format->mobile_error('Something went wrong'); + } + } + + // public function get_station_fuel_details2($uuid){ + // try { + // $station = $this->station->search_by_uuid($uuid); + // if($station && $station[0]) + // { + // $this->lcard_logs->log($station[0]['sid'],'STATIONLOCATOR','VIEW','Member views station details'); + // $rnrph = new RNRPHLibrary(); + // $rnrph->getStationDetails($station[0]['code']); + + // $details = $rnrph->response['data']; + // $db_fuel_prices = $this->station_fuel_prices->getByField([ + // 'station_id' => $station[0]['sid'], + // 'is_active' => 1, + // ], + // null, + // [ + // 'field' => 'updated_at', + // 'value' => 'asc' + // ]); + // $db = []; + // $latest_update = date('M d, Y'); + // if(count($db_fuel_prices)) + // { + // foreach ($db_fuel_prices as $k => $v) + // { + // $db[$v['fuel_code']] = $v; + // $latest_update = date('M d, Y',strtotime($details->StationFuels[0]->updatedAt)); + // } + // } + + // $fuel_type = StaticContents::fuelType_code(); + // $fuel_prices = []; + // $except_where_in = []; // delete fuel prices that are not returned by stratuscast + // if(count($details->StationFuels)) + // { + // foreach ($details->StationFuels as $key => $value) { + // if(isset($db[$value->Fuel->code])) + // { + // if($db[$value->Fuel->code]['price'] != $value->price) + // $this->station_fuel_prices->update_price($db[$value->Fuel->code]['fuel_price_uuid'],$value->price); + // } + // else + // { + // $this->station_fuel_prices->store($station[0]['sid'],[ + // 'fuel_code' => $value->Fuel->code, + // 'fuel_name' => isset($fuel_type[$value->Fuel->code]) ? $fuel_type[$value->Fuel->code] : '', + // 'price' => $value->price, + // ]); + // } + + + // $fuel_prices[] = [ + // 'fuel_code' => $value->Fuel->code, + // 'fuel_name' => isset($fuel_type[$value->Fuel->code]) ? $fuel_type[$value->Fuel->code] : '', + // 'price' => $value->price, + // ]; + + // $except_where_in[] = $value->Fuel->code; + // } + // } + + // // delete others + // $this->station_fuel_prices->delete($station[0]['sid'],$except_where_in); + + // return $this->format->mobile_success('Success',[ + // 'name' => $station[0]['description'], + // 'address' => $station[0]['address'], + // 'longitude' => $station[0]['longitude'], + // 'latitude' => $station[0]['latitude'], + // 'favorite' => $station[0]['favorite'] > 0 ? true : false, + // 'contact_numbers' => explode("/", $station[0]['contact_number']), + // 'stars' => round($station[0]['average']), + // 'fuel_prices' => $this->sortByField($fuel_prices, "fuel_code"), + // 'latest_update' => $latest_update + // ]); + + // } + // else + // return $this->format->mobile_error('Station Not Found'); + // } catch (Exception $e) { + // return $this->format->mobile_error('Something went wrong'); + // } + // } +} + + diff --git a/app/Http/Controllers/API/SystemPreferenceController.php b/app/Http/Controllers/API/SystemPreferenceController.php new file mode 100644 index 0000000..5ab5d54 --- /dev/null +++ b/app/Http/Controllers/API/SystemPreferenceController.php @@ -0,0 +1,318 @@ +systemPreference = $systemPreference; + $this->format = $httpStatusCode; + $this->module = "SystemPreference"; + $this->model = "SystemPreference"; + $this->url = $url; + $this->admin = $admin; + + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $rpreference = $this->systemPreference->getAll(); + $data = []; + foreach ($rpreference as $key => $value) { + $data[$value['name']] = $value['value'] ; + } + + return $this->format->success("SUCCESS",$data); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(SystemPreferenceFormValidation $request) + { + + $currentUser = CurrentUserHelper::get_currentAdmin(); + + $admin = $this->admin->show($currentUser->admin_uuid); + + $value['updated_by'] = $admin->admin_id; + + if ($request['logo'] != null && !empty($request['logo'])){ + $s3 = new S3; + $path = $s3->upload($request->file('logo'),'systemPreferences'); + $value['name'] = 'logo'; + $value['value'] = S3::public_path($path); + $this->systemPreference->store($request, $value ); + } + + if ($request->gps != null && !empty($request->gps)){ + $value['name'] = 'gps'; + $value['value'] = $request->gps; + $this->systemPreference->store($request, $value ); + + } + + if ($request->contact_email_address_mobile != null && !empty($request->contact_email_address_mobile)){ + $value['name'] = 'contact_email_address_mobile'; + $value['value'] = $request->contact_email_address_mobile; + $this->systemPreference->store($request, $value ); + } + + if ($request->contact_number_mobile != null && !empty($request->contact_number_mobile)){ + $value['name'] = 'contact_number_mobile'; + $value['value'] = $request->contact_number_mobile; + $this->systemPreference->store($request, $value ); + } + + if ($request->contact_details != null && !empty($request->contact_details)){ + $value['name'] = 'contact_details'; + $value['value'] = $request->contact_details; + $this->systemPreference->store($request, $value ); + + } + + // if ($request->information_guide_details != null && !empty($request->information_guide_details)){ + if ($request->has("information_guide_details")){ // allow empty + $value['name'] = 'information_guide_details'; + $value['value'] = $request->information_guide_details; + $this->systemPreference->store($request, $value ); + + } + + if ($request->has("android_version")){ // allow empty + $value['name'] = 'android_version'; + $value['value'] = $request->android_version; + $this->systemPreference->store($request, $value ); + + } + + if ($request->has("android_update_message")){ // allow empty + $value['name'] = 'android_update_message'; + $value['value'] = $request->android_update_message; + $this->systemPreference->store($request, $value ); + + } + + if ($request->has("android_action")){ // allow empty + $value['name'] = 'android_action'; + $value['value'] = $request->android_action; + $this->systemPreference->store($request, $value ); + + } + + + if ($request->has("ios_version")){ // allow empty + $value['name'] = 'ios_version'; + $value['value'] = $request->ios_version; + $this->systemPreference->store($request, $value ); + + } + + if ($request->has("ios_update_message")){ // allow empty + $value['name'] = 'ios_update_message'; + $value['value'] = $request->ios_update_message; + $this->systemPreference->store($request, $value ); + + } + + if ($request->has("ios_action")){ // allow empty + $value['name'] = 'ios_action'; + $value['value'] = $request->ios_action; + $this->systemPreference->store($request, $value ); + + } + + return $this->format->success("SUCCESS"); + + } + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + + $rpreference = $this->systemPreference->getByField('name', $id); + + if (!$rpreference){ + return $this->format->success("No records found",[]); + } + + $additionals = $this->format->success("Success",[],false); + $data = (new SystemPreferencesResource($rpreference['0']))->additional($additionals); + + return $data->response()->setStatusCode(200); + } + + public function show_mobile($id) + { + + $rpreference = $this->systemPreference->getByField('name', $id); + + if (!$rpreference){ + return $this->format->mobile_success("No records found",[]); + } + + + return $this->format->mobile_success('Success',[ + 'name' => $rpreference[0]->name, + 'value' => $rpreference[0]->value, + ]); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } + + public function mobile_system_preference() + { + $rpreference = $this->systemPreference->getAll(); + $data = []; + foreach ($rpreference as $key => $value) { + $data[$value['name']] = $value['value'] ; + } + + if (empty($data)){ + return $this->format->mobile_error('please contact us'); + } + return $this->format->mobile_success('Success',$data); + + } + + public function about_us() + { + $stratuscast = new StratuscastLibrary(); + $stratuscast->getAboutUs(); + + if(isset($stratuscast->response['data'])) + { + $response = $stratuscast->response['data']; + + $what_we_do_content = explode('  ', $response->what_we_do_content); + unset($what_we_do_content[0]); + + $why_unioil_content = explode(' ', $response->why_unioil_content); + unset($why_unioil_content[0]); + + if( + $this->systemPreference->update('who_we_are_content',$response->who_we_are_content) && + $this->systemPreference->update('what_we_do_content',serialize($what_we_do_content)) && + $this->systemPreference->update('why_unioil_content',serialize($why_unioil_content)) + ) + { + return $this->format->success('Success'); + } + else + { + return $this->format->badRequest('Something went wrong'); + } + } + else + return $this->format->badRequest('Something went wrong'); + } + + +public function mobile_version($platform) + { + $data = []; + if($platform != "android" && $platform != "ios"){ + return $this->format->mobile_error('please contact us'); + } + + $rpreference = $this->systemPreference->getByField('name', $platform."_version"); + + if (!$rpreference){ + return $this->format->success("No records found",[]); + } + + $updateMsg = $this->systemPreference->getByField('name', $platform."_update_message"); + $updateAct = $this->systemPreference->getByField('name', $platform."_action"); + + $data['version'] = $rpreference[0]->value; + $data['update_action'] = !$updateAct?"0":$updateAct[0]->value; + $data['update_message'] = !$updateMsg?"A new update is available to provide you with a more secure, stable and seamless user experience.":$updateMsg[0]->value; + + return $this->format->mobile_success('Success',$data); + } + +} + diff --git a/app/Http/Controllers/API/TermsAndPrivacyController.php b/app/Http/Controllers/API/TermsAndPrivacyController.php new file mode 100644 index 0000000..10b0322 --- /dev/null +++ b/app/Http/Controllers/API/TermsAndPrivacyController.php @@ -0,0 +1,213 @@ +terms_and_privacy = $terms_and_privacy; + $this->admin_logs = $admin_logs; + $this->format = $httpStatusCode; + $this->module = "TermsAndPrivacy"; + $this->model = "TermsAndPrivacy"; + } + + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + // + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + $list = $this->terms_and_privacy->listing($params); + + if(count($list)){ + $additionals = $this->format->success("Success",[],false); + $data = TermsAndPrivacyResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + }else{ + return $this->format->success("No records found",[]); + } + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(TermsAndPrivacyFormValidation $request) + { + + if ($request->type != 1 && $request->type != 2){ + return $this->format->badRequest(); + } + + $termsorprivacy = $request->type==1 ? "Terms" : "Privacy"; + + $id = $this->terms_and_privacy->store($request); + + if($id){ + $this->admin_logs->log($id,self::MODULE,'STORE'); + return $this->format->created($termsorprivacy.' has been added'); + }else{ + return $this->format->badRequest(); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = TermsAndPrivacy::where(['tp_uuid' => $uuid,'is_active' => 1])->first(); + if($details) + { + $additionals = $this->format->success("Success",[],false); + $data = (new TermsAndPrivacyResource($details))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else{ + return $this->format->notFound('Term And Privacy doesn\'t exists'); + } + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(TermsAndPrivacyFormValidation $request, $id) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + + if ($id == null && empty($id)) { + return $this->format->badRequest(); + + } + + $termsAndPrivacy = $this->terms_and_privacy->check($id); + + if(!$termsAndPrivacy){ + return $this->format->badRequest(); + } + + $termsAndPrivacy->update_by = $currentUser->admin_id; + $termsAndPrivacy->title = $request->title; + $termsAndPrivacy->details = $request->details; + + $details = $this->terms_and_privacy->update($termsAndPrivacy); + + if (!$details){ + return $this->format->badRequest(); + } + + $additionals = $this->format->success("Success",[],false); + $data = (new TermsAndPrivacyResource($details))->additional($additionals); + + return $data->response()->setStatusCode(200); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $details = $this->terms_and_privacy->getByField('tp_uuid',$uuid); + if(isset($details['0'])) + { + $details = $details['0']; + if($this->terms_and_privacy->delete($uuid)) + { + $this->admin_logs->log($details['tp_id'],self::MODULE,'DELETE'); + $termsorprivacy = $details->type==1 ? "Terms" : "Privacy"; + return $this->format->success($termsorprivacy." Successfully Deleted"); + } + } + + return $this->format->badRequest(); + } + + public function batch_delete(Request $request) + { + $uuid = $request->has('tp_uuid') ? $request->get('tp_uuid') : null; + + if($uuid) + { + $details = $this->terms_and_privacy->getDetailsWhereIn('tp_uuid',$uuid); + + if($this->terms_and_privacy->delete($uuid)) + { + foreach ($details as $key => $value) + { + $this->admin_logs->log($value['tp_id'],self::MODULE,'DELETE'); + } + + return $this->format->success("Terms and Privacy Successfully Deleted"); + + } + else + { + return $this->format->badRequest(); + } + } + else + { + $data['tp_uuid'] = 'tp_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one item",$data); + } + } + + public function mobile_terms_privacy() + { + $details = $this->terms_and_privacy->getAllActive(); + + if (empty($details)){ + return $this->format->mobile_error('please contact us'); + } + + $details = nl2br($details); + + return $this->format->mobile_success('Sucess',$details); + + } + + +} diff --git a/app/Http/Controllers/API/TopUpController.php b/app/Http/Controllers/API/TopUpController.php new file mode 100644 index 0000000..dcf89b6 --- /dev/null +++ b/app/Http/Controllers/API/TopUpController.php @@ -0,0 +1,237 @@ +top_up = $top_up; + $this->admin_logs = $admin_logs; + $this->format = $httpStatusCode; + $this->module = "TopUp"; + $this->model = "TopUp"; + } + + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $params = [ + 'search' => ($request->has('_search') ? $request->get('_search') : NULL), + 'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10), + 'page' => ($request->has('page') ? $request->get('page') : 10), + 'sorting' => ParameterHelper::prepareSortingParameter($request) + ]; + + $list = $this->top_up->listing($params); + + if(count($list)){ + $additionals = $this->format->success("Success",[],false); + $data = TopUpResource::collection($list)->additional($additionals); + return $data->response()->setStatusCode(200); + }else{ + return $this->format->success("No records found",[]); + } + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + return "create"; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(TopUpFormValidation $request) + { + $id = $this->top_up->store($request); + if($id){ + $this->admin_logs->log($id,self::MODULE,'STORE'); + return $this->format->created('TopUp has been added'); + }else{ + return $this->format->notFound(); + } + } + + // Count the total number of data in the top_up table + public function get_count(){ + $listCount = TopUp::where('created_at', '>=' ,date('Y-m-d').' 00:00:00')->where('created_at', '<=' ,date('Y-m-d').' 23:59:59')->count(); + if($listCount <= 5){ + return $this->format->mobile_success("Success",$listCount,false); + } + return $this->format->unprocessableEntity("You have reached today's top up limit",$listCount); + } + + public function generate_fee_code(Request $request) + { + $fee_code = "0001"; + $details = TopUp::orderBy('created_at', 'desc')->first(); + + if($details){ + $fee_code = ltrim($details->fee_code, '0') + 1; + } + + $data = [ + 'fee_code' => str_pad($fee_code, 4, '0', STR_PAD_LEFT) + ]; + + if ($data){ + return $this->format->success("SUCCESS",$data); + }else{ + return $this->format->notFound(); + } + } + + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($uuid) + { + $details = TopUp::where(['topup_uuid' => $uuid,'is_active' => 1])->first(); + if($details) + { + $additionals = $this->format->success("Success",[],false); + $data = (new TopUpResource($details))->additional($additionals); + return $data->response()->setStatusCode(200); + } + else{ + return $this->format->notFound('Top Up doesn\'t exists'); + } + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + return "edit"; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(TopUpFormValidation $request, $id) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if ($id == null && empty($id)) { + return $this->format->notFound(); + } + + if(!$this->top_up->check($id)){ + return $this->format->notFound(); + } + + $request->topup_uuid = $id; + $request->update_by = $currentUser->admin_id; + $details = $this->top_up->update($request); + + if (!$details){ + return $this->format->notFound(); + } + + $additionals = $this->format->success("Success",[],false); + $data = (new TopUpResource($details))->additional($additionals); + + return $data->response()->setStatusCode(200); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($uuid) + { + $details = $this->top_up->getByField('topup_uuid',$uuid); + + if(isset($details['0'])) + { + $details = $details['0']; + if($this->top_up->delete($uuid)) + { + $this->admin_logs->log($details['topup_id'],self::MODULE,'DELETE'); + return $this->format->success("TopUp Successfully Deleted"); + } + } + + return $this->format->notFound(); + } + + public function batch_delete(Request $request) + { + $uuid = $request->has('topup_uuid') ? $request->get('topup_uuid') : null; + + if($uuid) + { + $details = $this->top_up->getDetailsWhereIn('topup_uuid',$uuid); + + if($this->top_up->delete($uuid)) + { + foreach ($details as $key => $value) + { + $this->admin_logs->log($value['topup_id'],self::MODULE,'DELETE'); + } + + return $this->format->success("TopUp Successfully Deleted"); + + } + else + { + return $this->format->notFound(); + } + } + else + { + $data['topup_uuid'] = 'topup_uuid is required'; + return $this->format->unprocessableEntity("Submit at least one item",$data); + } + } +} diff --git a/app/Http/Controllers/API/UserController.php b/app/Http/Controllers/API/UserController.php new file mode 100644 index 0000000..39c473f --- /dev/null +++ b/app/Http/Controllers/API/UserController.php @@ -0,0 +1,1667 @@ +user = $user; + $this->format = $httpStatusCode; + $this->module = "User"; + $this->model = "User"; + $this->admin = $admin; + $this->password_logs = $password_logs; + $this->loyalty_card = $loyalty_card; + $this->personal_details = $personal_details; + $this->otp_logs = $otp_logs; + $this->admin_logs = $admin_logs; + $this->lcard_logs = $lcard_logs; + $this->system_preferences = $system_preferences; + $this->otp_attempts = $otp_attempts; + $this->mobile_usage = $mobile_usage; + $this->mpin_codes = $mpin_codes; + } + + /** + * CMS api + * + * @return \Illuminate\Http\Response + */ + + public function cms_usernameLogin(Request $request) + { + $admin = $this->admin->getByField([ + 'username' => $request->get('username'), + 'is_active' => 1, + ]); + + if($admin->count()) + { + if($admin[0]['status'] == 1) + { + $data['inactive'] = true; + return $this->format->unprocessableEntity("Username does not exist.",$data); + } + elseif($admin[0]['is_active'] == 1) + { + + // note : password checking must be in the password form + + // $password_log = $this->password_logs->getLastLog($admin[0]['admin_id']); + + // if($password_log) + // { + // $hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes'); + // if($password_log['generated_password'] != null && $hasExceeded == false) + // { + // $data['expired'] = true; + // return $this->format->unprocessableEntity("Your password is expired",$data); + // } + // } + + $data['is_verified'] = true; + $data['role'] = $admin[0]['role']; + return $this->format->success("Success",$data); + } + } + + $data['is_verified'] = false; + return $this->format->unprocessableEntity("Username does not exist.",$data); + + } + + + public function cms_login() + { + if(Auth::attempt(['username' => request('username'), 'password' => request('password')])) + { + + $user = Auth::user(); + $admin = $this->admin->getByField([ + 'username' => request('username'), + 'is_active' => 1, + ]); + + if($admin[0]['is_passwordChanged'] == 1) + { + $this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'LOGIN'); + // $success['token'] = $user->createToken('Admin')->accessToken; + + + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $admin[0]['email'], + 'password' => request('password'), + 'scope' => '' + ]; + + $request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($request)->getContent(); + $result = json_decode($result); + + + $success['token'] = $result->access_token; + // $success['refresh_token'] = $result->refresh_token; + $message = 'Success'; + } + else + { + $password_log = $this->password_logs->getLastLog($admin[0]['admin_id']); + if($password_log) + { + $hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes'); + if($password_log['generated_password'] != null && $hasExceeded == false) + { + $data['expired'] = true; + return $this->format->unprocessableEntity("Your password is expired",$data); + } + } + + $success['prompt_password'] = 1; + $success['admin_uuid'] = $admin[0]['admin_uuid']; + $message = 'User must change password'; + } + + return $this->format->success($message,$success); + } + else{ + return $this->format->unauthorized("Incorrect Password"); + } + } + + + public function cms_changePassword(UserFormValidation $request) + { + + $admin = $this->admin->getByField(['admin_uuid' => $request->get('admin_uuid')]); + + //added this to check if the admin uuid is correct and to avoid Undefined offset: 0 + if ($admin->count() == 0){ + return $this->format->unauthorized(); + } + + // Shall not be the same with the previous 2 passwords. + $logs = $this->password_logs->getByField([ + 'admin_id' =>$admin[0]['admin_id'], + 'is_generated' => 0 + ]); + $good_password = true; + if(count($logs) > 0) + { + $ctr = 1; + foreach ($logs as $key => $value) { + if($ctr <= 2) + { + if($value['password'] == md5($request->get('password'))) + $good_password = false; + } + $ctr++; + } + } + + if($good_password) + { + + $success_admin = $this->admin->changePassword($request); + $success_user = $this->user->changePassword($request,$admin[0]['username']); + $this->password_logs->store($admin[0]['admin_id'],$request->get('password'),$admin[0]['admin_id']); + + if($success_user && $success_admin) + { + $this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'UPDATE','Changed Password'); + + if(Auth::attempt(['username' => $admin[0]['username'], 'password' => $request->get('password')])) + { + $auth = Auth::user(); + // $success['token'] = $auth->createToken('Admin')->accessToken; + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $admin[0]['email'], + 'password' => $request->get('password'), + 'scope' => '' + ]; + + $auth_request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($auth_request)->getContent(); + $result = json_decode($result); + + + $success['token'] = $result->access_token; + // $success['refresh_token'] = $result->refresh_token; + + $this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'LOGIN'); + return $this->format->success("SUCCESS",$success); + } + else + { + return $this->format->unauthorized(); + } + } + } + else + { + $data['password'] = 'Shall not be the same with the previous 2 passwords'; + return $this->format->unprocessableEntity("Shall not be the same with the previous 2 passwords",$data); + } + } + + public function logout_cms() + { + if (Auth::check()) { + // Auth::user()->AauthAcessToken()->delete(); + Auth::user()->token()->revoke(); + return $this->format->success("Logout Success"); + } + } + + /** + * Mobile api + * + * @return \Illuminate\Http\Response + */ + + public function mobile_loginCardNumber(LoginCardNumberFormValidation $request) + { + $cardnumber = $request->get('card_number'); + $lcard_uuid = ""; + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardnumber); + $cyware->state_validate(); + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $cardnumber, + 'is_active' => 1 + ]); + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + $this->loyalty_card->update_deviceuuid($member_det[0]['lcard_id'],$request->get('deviceUUID')); + $lcard_uuid = $member_det[0]['lcard_uuid']; + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + }else{ + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardnumber); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + $pd_id = $this->personal_details->store($cyware->response['data']); + $lcard_store = $this->loyalty_card->store($pd_id, $cyware->response['data'], $request->get('deviceUUID'),1); + $this->user->store_member($cyware->response['data']); + $this->mobile_usage->add_inactive(); + $lcard_uuid = $lcard_store['lcard_uuid']; + + $this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member added a verified account to database'); + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + } + + return $this->format->mobile_success('Success',[ + 'is_valid' => 1, + 'card_number' => $cardnumber, + 'user_id' => $lcard_uuid, + 'number' => $cyware->response['data']->mobile + ]); + + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginCardNumberOld(LoginMobileNumberFormValidation $request) + { + + + $member_det = $this->loyalty_card->getByField([ + 'mobile' => '63'.$request->get('mobile_number'), + 'is_active' => 1 + ]); + $cardnumber = null; + if($member_det != null && count($member_det) > 0 && $member_det[0]['card_number'] != null){ + $cardnumber = $member_det[0]['card_number']; + }else{ + return $this->format->mobile_error("Mobile number is not yet registered",['code' => 2]); + } + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardnumber); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $cardnumber, + 'is_active' => 1 + ]); + + + + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + } + + + return $this->format->mobile_success('Success',[ + 'is_valid' => 1, + 'card_number' => $cardnumber + ]); + + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginMobileNumber(LoginMobileNumberFormValidation $request) + { + + $cyware = new CywareLibrary(); + $cyware->setMobile('63'.$request->get('mobile_number')); + $cyware->state_mobilevalidate(); + $lcard_uuid = ""; + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + //get card number details + $dataResult = $cyware->response['data']; + $cardnumber = null; + if(is_array($dataResult)){ + //get latest card + foreach ($dataResult as $key => $part) { + $sort[$key] = strtotime($part->app_date.$part->app_time); + } + array_multisort($sort, SORT_DESC, $dataResult); + + $cardnumber = $dataResult[0]->card_number; + + }else + $cardnumber = $dataResult->card_number; + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $cardnumber, + 'is_active' => 1 + ]); + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + $lcard_uuid = $member_det[0]['lcard_uuid']; + + } + else{ + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardnumber); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + $pd_id = $this->personal_details->store($cyware->response['data']); + $lcard_store = $this->loyalty_card->store($pd_id, $cyware->response['data'], $request->get('deviceUUID'),1); + $this->user->store_member($cyware->response['data']); + $this->mobile_usage->add_inactive(); + $lcard_uuid = $lcard_store['lcard_uuid']; + + $this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member added a verified account to database'); + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + return $this->format->mobile_success('Success',[ + 'is_valid' => 1, + 'card_number' => $cardnumber, + 'user_id' => $lcard_uuid + ]); + + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginCardNumber_enroll(LoginCardNumberFormValidation $request) + { + // // Number Verification Code + // $loyalty_card = $this->loyalty_card->getByField([ + // 'mobile' => $request->get('mobile'), + // 'is_active' => 1, + // ]); + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_entry(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'Pin is required') + { + + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_validate(); + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'No Records Found') + { + return $this->format->mobile_success('Success',[ + 'is_valid' => 1 + ]); + } + else + { + $message = $cyware->response['message']; + $code = 2; + if(isset($cyware->response['message']) && $cyware->response['message'] == "Success") + { + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $request->get('card_number'), + 'is_active' => 1 + ]); + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + } + + $message = 'Card Number is already registered. Do you want to proceed to login?'; + $code = 4; + return $this->format->mobile_error($message,['code' => $code,'number' => $cyware->response['data']->mobile]); + } + + + return $this->format->mobile_error($message,['code' => $code]); + } + + } + else + { + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginBirthdate(LoginBirthdateFormValidation $request) + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + if(Carbon::parse($request->get('birthdate'))->age < 18) + { + return $this->format->mobile_error('You must be at least 18 years old to join the Loyalty Program'); + } + elseif($cyware->response['data']->birthdate != $request->get('birthdate')) + { + return $this->format->mobile_error( 'Incorrect Birthdate'); + } + else + { + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $request->get('card_number'), + 'is_active' => 1 + ],'codeCardType'); + + if(count($loyalty_card)) + { + $cyware->state_retrieve(); + // update device uuid + $this->loyalty_card->update_deviceuuid($loyalty_card[0]['lcard_id'],$request->get('deviceUUID')); + + + $success = [ + 'mobile_number' => $loyalty_card[0]['mobile'], + // 'card_type' => $loyalty_card[0]['card_type']['code'], + // 'card_number' => $loyalty_card[0]['card_number'], + 'lcard_uuid' => $loyalty_card[0]['lcard_uuid'], + 'state_retrieve' => $cyware->response["data"] + ]; + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','LOGIN','Member logs in a verified account'); + } + else + { + // add details to database + + $pd_id = $this->personal_details->store($cyware->response['data']); + $lcard_store = $this->loyalty_card->store($pd_id, $cyware->response['data'], $request->get('deviceUUID'),1); + $this->user->store_member($cyware->response['data']); + $this->mobile_usage->add_inactive(); + $success = [ + 'mobile_number' => $cyware->response['data']->mobile, + // 'card_type' => $cyware->response['data']->card_type_code, + // 'card_number' => $cyware->response['data']->card_number, + 'lcard_uuid' => $lcard_store['lcard_uuid'], + ]; + + $this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member added a verified account to database'); + } + + return $this->format->mobile_success('Success',$success); + + } + + }else{ + return $this->format->mobile_error('Error',['card_number' => $cyware->response['message']]); + } + } + + public function create_otp(Request $request) + { + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + + + if(count($loyalty_card)) + { + // get if loyalty card is less than 30 seconds + // this is due to iOS' double request for OTP + $last_log = $this->otp_logs->getLastLog($loyalty_card[0]['lcard_id']); + if((isset($last_log->created_at) && strtotime($last_log->created_at.' +30 seconds') > strtotime(date('Y-m-d H:i:s'))) && $request->is_resend == 'true') + return $this->format->mobile_success('Success'); + + if($request->has('is_resend') && $request->is_resend != 'true') + { + // reset otp_attempts + $this->otp_attempts->delete($loyalty_card[0]['lcard_id']); + } + + $transid = date('YmdHis').$loyalty_card[0]['lcard_id']; + $mobile = $request->has('mobile') ? '63'.$request->mobile : $loyalty_card[0]['mobile']; + if(env("M360_ENV", 'TEST') == 'LOCAL'){ + $otp = StringHelper::random_num(4); + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + + $data = [ + 'otp' => $otp, + 'msisdn' => $mobile, + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $transid // $m360->get_transid() + ]; + + if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data)) + { + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success'); + } + else + { + return $this->format->mobile_error('Something went wrong'); + } + } + else{ + $otp = StringHelper::random_num(4); + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $m360 = new M360(); + + $m360->set_msisdn($mobile); + $m360->set_content($content); + $m360->set_rcvd_transid($transid); + $m360->send(); + + if($m360->success()) + { + $data = [ + 'otp' => $otp, + 'msisdn' => $mobile, + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $m360->get_transid() + ]; + + if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data)) + { + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success'); + } + else + { + return $this->format->mobile_error('Something went wrong'); + } + } + else + { + return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message()); + } + } + + } + else + { + return $this->format->mobile_error('User doesn\'t exist'); + } + + } + + public function mobile_otp(Request $request){ + + if($request->has('mobile')){ + + $mobile = '63'.$request->mobile; + + $loyalty_card = $this->loyalty_card->getByField([ + 'mobile' => $mobile, + 'is_active' => 1, + ]); + + if(count($loyalty_card)>0){ + return $this->format->mobile_error('Mobile number already used.'); + }else{ + + $lastlog = $this->otp_logs->getLastLogByNumber($mobile); + if($lastlog != null){ + $timeB = time(); + $lastlog = strtotime($lastlog->created_at); + if($lastlog+30 > $timeB){ + return $this->format->mobile_error("OTP too fast to request."); + } + } + + + if(env("M360_ENV", 'TEST') == 'LOCAL'){ + $otp = StringHelper::random_num(4); + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $transid = date('YmdHis')."validate"; + + $data = [ + 'otp' => $otp, + 'msisdn' => $mobile, + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $transid + ]; + + if($this->otp_logs->store("validation",$data)){ + $this->lcard_logs->log("validation",'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success', [ + 'trans_id' => $transid + ]); + }else{ + return $this->format->mobile_error('Something went wrong'); + } + }else{ + $otp = StringHelper::random_num(4); + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $transid = date('YmdHis')."validate"; + + $m360 = new M360(); + + $m360->set_msisdn($mobile); + $m360->set_content($content); + $m360->set_rcvd_transid($transid); + $m360->send(); + + if($m360->success()){ + + $data = [ + 'otp' => $otp, + 'msisdn' => $mobile, + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $m360->get_transid() + ]; + + // return $this->format->mobile_success('Success'); + if($this->otp_logs->store("validation",$data)){ + $this->lcard_logs->log("validation",'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success', [ + 'trans_id' => $transid + ]); + }else{ + return $this->format->mobile_error('Something went wrong'); + } + + }else{ + return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message()); + } + } + // return $this->format->mobile_success("Mobile number is valid."); + } + + }else{ + return $this->format->mobile_error("Mobile number is required"); + } + + } + + public function mobile_updateMpin(MpinFormValidation $request){ + + + //check if code exist + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + + if(count($loyalty_card)) + { + $cardNumber = $loyalty_card[0]['card_number']; + + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardNumber); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + //check if mpin exist + $mpin = $this->mpin_codes->getMpin($cyware->response['data']->customer_number); + if($mpin){ + //update + + $data = []; + $data['mpin_code'] = $request->get('mpin'); + $res = $this->mpin_codes->updateMpin($cyware->response['data']->customer_number,$data); + if($res){ + return $this->format->mobile_success('Success', [ + 'mpin' => $request->get('mpin') + ]); + }else{ + return $this->format->mobile_error('Something went wrong.'); + } + }else{ + //store + $data = []; + $data['customer_number'] = $cyware->response['data']->customer_number; + $data['mpin_code'] = $request->get('mpin'); + $res = $this->mpin_codes->store($data); + if($res){ + return $this->format->mobile_success('Success', [ + 'mpin' => $request->get('mpin') + ]); + }else{ + return $this->format->mobile_error('Something went wrong.'); + } + + } + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + }else{ + return $this->format->mobile_error('User doesn\'t exist'); + } + + + } + + public function mobile_getPin(Request $request){ + + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + + if(count($loyalty_card)) + { + $cardNumber = $loyalty_card[0]['card_number']; + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardNumber); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + $mpin = $this->mpin_codes->getMpin($cyware->response['data']->customer_number); + if($mpin){ + return $this->format->mobile_success('Success', [ + 'mpin' => $mpin->mpin_code + ]); + }else{ + return $this->format->mobile_error('MPIN is not yet set by the user.'); + } + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + }else{ + return $this->format->mobile_error('User doesn\'t exist'); + } + + } + + public function mobile_validate_otp(Request $request){ + $otp_log = $this->otp_logs->getByField([ + 'rcvd_transid' => $request->trans_id + ]); + if(count($otp_log)>0){ + $_otp = $otp_log[0]->otp; + $_otp_id = $otp_log[0]->otplog_id; + $_otp_used = $otp_log[0]->used; + // return $this->format->mobile_success("test", $otp_log[0]->otp); + if($_otp_used == 0){ + if($_otp == $request->otp){ + if($this->otp_logs->setUsed($_otp_id)){ + return $this->format->mobile_success('Success'); + }else{ + return $this->format->mobile_error("Something went wrong."); + } + }else{ + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + }else{ + return $this->format->mobile_error('The OTP you have entered has already used.'); + } + }else{ + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + } + + public function validate_otp(Request $request) + { + // lock after 3 attempts + $numberOfAttempts = 0; + + $attempts = $this->loyalty_card->numberOfOTPAttempts($request->get('lcard_uuid')); + + if(!is_null($attempts)) + { + $numberOfAttempts = $attempts->otpAttempts->count(); + } + + + if($numberOfAttempts >= 3) + { + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('You already entered the wrong OTP 3 times. Your account is locked for 24 hours. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + else + { + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ],'personalDetails'); + + $getuserDetails = $this->loyalty_card->show($request->get('lcard_uuid'),['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType','codeCity','codeFuelType']); + $data = new MobileUserProfileResource($getuserDetails); + $userDetails = null; + if($data != null){ + $userDetails = $data->toArray($getuserDetails); + + } + + + $numberOfAttempts++; + $this->otp_attempts->store($loyalty_card[0]['lcard_id'],$request->get('otp')); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','ATTEMPT','Member entered otp '.$request->get('otp')); + + // check if correct + + $otpLog = $this->otp_logs->getByField(['lcard_id' => $loyalty_card[0]['lcard_id'], 'otp' => $request->get('otp')]); + //var_dump($otpLog); + if(count($otpLog)) + { + $latestOtp = $this->otp_logs->getLastLog($loyalty_card[0]['lcard_id']); + + // checks if otp entered is expired and it's the latest otp created + if(!StringHelper::check_time_exceeded($otpLog[0]['created_at'],'+5 minutes') || $latestOtp->otp != $request->get('otp')) + { + if($numberOfAttempts >= 3) + { + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($loyalty_card)); + } + + return $this->format->mobile_error('The OTP you have entered has already expired. Please select the Resend OTP option',['code' => 3]); + } + else + { + if($loyalty_card[0]['cyware_synced'] == 0) + { + $cyware_response = $this->cyware_activate($loyalty_card[0]); + + if($cyware_response['success'] == true && isset($cyware_response['data'])) + { + $this->loyalty_card->cyware_activate($loyalty_card[0]['lcard_id'],$cyware_response['data']); + $this->user->store_member($cyware_response['data']); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','ACTIVATE','Member activated a card'); + } + else + { + return $this->format->mobile_error($cyware_response['message']); + } + } + + + if(Auth::attempt([ 'username' => $loyalty_card[0]['card_number'], 'password' => $loyalty_card[0]['birthdate']->toDateString() ])) + { + + if($loyalty_card[0]['is_validated'] == 0) + { + $this->loyalty_card->validateMember($loyalty_card[0]['lcard_id']); + $this->mobile_usage->add_active(); + } + + $mpin = null; + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($loyalty_card[0]['card_number']); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + $mpin = $this->mpin_codes->getMpin($cyware->response['data']->customer_number); + }else{ + return $this->format->mobile_error($cyware_response['message']); + } + + $this->otp_logs->setUsed($latestOtp->otplog_id); + + $user = Auth::user(); + $success['is_valid'] = 1; + // $success['token'] = $user->createToken('Mobile')->accessToken; // for multiple login + + // ---------------------------------------------------------------- new login start + + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $loyalty_card[0]['card_number'], + 'password' => $loyalty_card[0]['birthdate']->toDateString(), + 'scope' => '' + ]; + + // dd($data); + + $request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($request)->getContent(); + $result = json_decode($result); + + + $success['token'] = $result->access_token; + $userDetails['customer_number'] = $cyware->response['data']->customer_number; + $success['userDetails'] = $userDetails; + if($mpin){ + $success['userDetails']['mpin'] = $mpin->mpin_code; + } + // ---------------------------------------------------------------- new login end + + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','LOGIN','Member successfully logs in'); + return $this->format->mobile_success('Sucess',$success,$data); + } + } + } + else + { + if($numberOfAttempts >= 3) + { + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($loyalty_card)); + } + + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + } + } + + private function cyware_activate($loyalty_card) + { + $err = ''; + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($loyalty_card['card_number']); + $cyware->setPin($loyalty_card['pin']); + $cyware->setFirstName($loyalty_card['personalDetails']['firstname']); + $cyware->setLastName($loyalty_card['personalDetails']['lastname']); + $cyware->setBirthday(date('Ymd',strtotime($loyalty_card['birthdate']))); + $cyware->setMobile($loyalty_card['mobile']); + $cyware->setEmail($loyalty_card['email']); + $cyware->state_entry(); + + if ($cyware->response['status_code'] == 200 && $cyware->response['message'] == 'success') + { + $cyware->state_validate(); + + if ($cyware->response['status_code'] == 200 && $cyware->response['data'] != null) + { + return ['success' => true , 'data' => $cyware->response['data']]; + } + else + $err = $cyware->response['message']; + + } + else + $err = $cyware->response['message']; + + return ['success' => false , 'message' => $err]; + } + + private function lock_member($loyalty_card) + { + $this->loyalty_card->lockMember($loyalty_card[0]['lcard_id'],'01'); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','LOCKED','Account is locked due to wrong OTP entered for 3 times during login'); + $this->mobile_usage->add_locked(); + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return [ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]; + } + + public function mobile_validatePin(Request $request) + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->setPin($request->get('pin')); + $cyware->state_entry(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'First name is required') + { + return $this->format->mobile_success('Success'); + } + else + { + return $this->format->mobile_error($cyware->response['message']); + } + } + + public function mobile_activateCard(LoginActivateCardFormValidation $request) + { + // check if exists + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $request->card_number, + 'cyware_synced' => 0, + 'is_active' => 1 + ],'personalDetails'); + + if(count($loyalty_card) > 0) + { + $pd_id = $this->personal_details->update_non_cyware_synced($loyalty_card[0]['pd_id'],$request); + $lcard_store = $this->loyalty_card->update_non_cyware_synced($loyalty_card[0]['lcard_id'], $request); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','UPDATE','Member updated form for card activation'); + } + else + { + $pd_id = $this->personal_details->store($request); + $lcard_store = $this->loyalty_card->store($pd_id, $request); + $this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member filed for card activation'); + + // ------ send OTP start + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $lcard_store['lcard_uuid'], + 'is_active' => 1 + ]); + } + + + + if(count($loyalty_card)) + { + // reset otp_attempts + $this->otp_attempts->delete($loyalty_card[0]['lcard_id']); + + $otp = StringHelper::random_num(4); + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $transid = date('YmdHis').$loyalty_card[0]['lcard_id']; + + if(env("M360_ENV", 'TEST') == 'LOCAL'){ + $data = [ + 'otp' => $otp, + 'msisdn' => $loyalty_card[0]['mobile'], + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $transid + ]; + + if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data)) + { + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success',[ + 'mobile_number' => $loyalty_card[0]['mobile'], + 'lcard_uuid' => $loyalty_card[0]['lcard_uuid'], + ]); + } + else + { + return $this->format->mobile_error('Something went wrong'); + } + }else{ + $m360 = new M360(); + + $m360->set_msisdn($loyalty_card[0]['mobile']); + $m360->set_content($content); + $m360->set_rcvd_transid($transid); + $m360->send(); + + if($m360->success()) + { + // error_log('SMS Sent Activation!'); + $data = [ + 'otp' => $otp, + 'msisdn' => $loyalty_card[0]['mobile'], + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $m360->get_transid() + ]; + + if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data)) + { + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success',[ + 'mobile_number' => $loyalty_card[0]['mobile'], + 'lcard_uuid' => $loyalty_card[0]['lcard_uuid'], + ]); + } + else + { + return $this->format->mobile_error('Something went wrong'); + } + } + else + { + // return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message()); + return $this->format->mobile_error('There was a problem sending your OTP. Please try again.',$m360->get_response_message()); + } + } + + } + else + { + return $this->format->mobile_error('User doesn\'t exist'); + } + // ------ send OTP end + + + } + + public function logout_mobile() + { + + if (Auth::check()) { + $this->lcard_logs->log(0,'LOGIN','LOGOUT','Member logged out'); + $this->loyalty_card->remove_deviceuuid(Auth::user()->username); + // Auth::user()->AauthAcessToken()->delete(); + Auth::user()->token()->revoke(); + return $this->format->mobile_success("Logout Success"); + } + } + + + public function checkTime() + { + echo date('Y-m-d H:i:s').'
'; + echo config('app.timezone'); + } + + public function convertmd5() + { + echo md5(request('value')); + } + + public function checkOTP($card_number) + { + + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $card_number, + 'is_active' => 1, + ]); + + if(count($loyalty_card)>0) + { + $logs = $this->otp_logs->getLastLog_limit(1, $loyalty_card[0]->lcard_id); + + if(count($logs) > 0) + { + foreach ($logs as $k => $v) + { + echo ' +

'.$v->otp.'

+ '.($v->used == 1 ? 'used' : 'not used').' + '.date('F d, Y h:i A',strtotime($v->created_at)).' +
+ + '; + } + } + } + else + { + echo 'Card Number doesn\'t exists'; + } + } + + //check mobile number already exist + public function checkMobile($mobile) + { + $cyware = new CywareLibrary(); + $cyware->setMobile($mobile); + $cyware->state_mobilevalidate(); + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == "No record found") + { + return $this->format->mobile_success("Mobile number is valid."); + }else{ + return $this->format->mobile_error('Mobile number already used.'); + } + } + + //check mobile number already exist old notes + public function checkMobileOld($mobile) + { + + $loyalty_card = $this->loyalty_card->getByField([ + 'mobile' => $mobile, + 'is_active' => 1, + ]); + + if(count($loyalty_card)>0) + { + return $this->format->mobile_error('Mobile number already used.'); + } + else + { + return $this->format->mobile_success("Mobile number is valid."); + } + } + +//todo delete for testing only + public function state_validate() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber($_GET['as']); + $cyware->setBirthday('19800222'); + $cyware->state_validate(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_entry() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->setFirstName('vic'); + $cyware->setLastName('vic'); + $cyware->setBirthday('19991010'); + $cyware->setMobile('639178032215'); // must have 63 + $cyware->setEmail('gasdga@fasd.com'); + $cyware->setPin('99798722'); + $cyware->state_entry(); + $cyware->state_entry(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_trans() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->setStartDate('20180101'); + $cyware->setEndDate('20181231'); + $cyware->state_trans(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + +//this func is not yet available in phase 1 / but just in case + public function state_promo() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->state_promo(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_retrieve() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->state_retrieve(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function StateRetrieve($data){ + $newData = $data->getData(); + $mainData = []; + $mainData["lcard_uuid"] = $newData->data->lcard_uuid; + $mainData["card_number"] = $newData->data->card_number; + $mainData["customer_number"] = $newData->retrieved->customer_number; + $mainData["pin"] = $newData->data->pin; + $mainData["birthdate"] = $newData->data->birthdate; + $mainData["mobile"] = $newData->data->mobile; + $mainData["email"] = $newData->data->email; + $mainData["firstname"] = $newData->data->firstname; + $mainData["lastname"] = $newData->data->lastname; + $mainData["photo"] = $newData->data->photo; + $mainData["card_type"] = $newData->data->card_type; + $mainData["card_code"] = $newData->data->card_code; + $mainData["card_image"] = $newData->data->card_image; + $mainData["card_bg_image"] = $newData->data->card_bg_image; + $mainData["card_black_label"] = $newData->data->card_black_label; + $mainData["expiry_date"] = $newData->data->expiry_date; + $mainData["points"] = $newData->data->points; + //DATA THAT MUST GET FROM STATE RETRIEVE + $mainData["middlename"] = $newData->retrieved->middle_initial; + $mainData["city_name"] = $newData->retrieved->address; + $mainData["address"] = $newData->retrieved->address; + $mainData["civilstatus_code"] = $newData->retrieved->civil_status_code; + $mainData["gender_code"] = $newData->retrieved->gender_code; + $mainData["vo_code"] = $newData->retrieved->vehicle_own_code; + $mainData["fueltype_code"] = $newData->retrieved->fuel_type_code; + //$mainData['log'] = "start:".$datestart." ---- end:".$dateend; + $newData->data = $mainData; + return response()->json($newData); + } + + + public function state_update() + { + $cyware = new CywareLibrary(); + + $cyware->setCardNumber('1100000000000001'); + $cyware->setFirstName('vic'); + $cyware->setLastName('abalos'); + $cyware->setAddress('dun'); + $cyware->setMobile('639178032215'); + $cyware->setEmail('email@gmaill.com'); + $cyware->setCivilStatusCode('S'); + $cyware->setGenderCode('0'); + $cyware->setCivilStatusCode('S'); + $cyware->setFuelType('1'); + + + + $cyware->state_update(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_points() + { + $cyware = new CywareLibrary(); + + $cyware->setCardNumber('1100000000000001'); + $cyware->setSiNum(rand(1000,3000)); + $cyware->setTotalAmount('100'); + $cyware->state_points(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_redeemed() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->setStartDate('20180101'); + $cyware->setEndDate('20181231'); + $cyware->state_redeemed(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + + public function stations_fuel_prices() + { + $cyware = new StratuscastLibrary(); + $cyware->getAllFuelPrice(); + + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function station_fuel_price_station() + { + $cyware = new StratuscastLibrary(); + $cyware->getFuelPriceBystation($_GET['station']); + + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function city_provinces() + { + $cyware = new StratuscastLibrary(); + $cyware->getCityAndProvince(); + + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function city() + { + $cyware = new StratuscastLibrary(); + $cyware->getCity(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + public function province() + { + $cyware = new StratuscastLibrary(); + $cyware->getProvince(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function aboutus() + { + $cyware = new StratuscastLibrary(); + $cyware->getAboutUs(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function product() + { + $cyware = new StratuscastLibrary(); + $cyware->getProduct($_GET['id']); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function checkmobileotp($mobile){ + + $mobile = $mobile != null ? $mobile: ""; + + $lastlog = $this->otp_logs->getLastLogByNumber($mobile); + + if($lastlog){ + return $lastlog->content; + } + return "Sorry, this request is not available or no data found"; + } + + +} diff --git a/app/Http/Controllers/API/UserController.php.save b/app/Http/Controllers/API/UserController.php.save new file mode 100644 index 0000000..65bf076 --- /dev/null +++ b/app/Http/Controllers/API/UserController.php.save @@ -0,0 +1,1462 @@ +user = $user; + $this->format = $httpStatusCode; + $this->module = "User"; + $this->model = "User"; + $this->admin = $admin; + $this->password_logs = $password_logs; + $this->loyalty_card = $loyalty_card; + $this->personal_details = $personal_details; + $this->otp_logs = $otp_logs; + $this->admin_logs = $admin_logs; + $this->lcard_logs = $lcard_logs; + $this->system_preferences = $system_preferences; + $this->otp_attempts = $otp_attempts; + $this->mobile_usage = $mobile_usage; + $this->mpin_codes = $mpin_codes; + } + + /** + * CMS api + * + * @return \Illuminate\Http\Response + */ + + public function cms_usernameLogin(Request $request) + { + $admin = $this->admin->getByField([ + 'username' => $request->get('username'), + 'is_active' => 1, + ]); + + if($admin->count()) + { + if($admin[0]['status'] == 1) + { + $data['inactive'] = true; + return $this->format->unprocessableEntity("Username does not exist.",$data); + } + elseif($admin[0]['is_active'] == 1) + { + + // note : password checking must be in the password form + + // $password_log = $this->password_logs->getLastLog($admin[0]['admin_id']); + + // if($password_log) + // { + // $hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes'); + // if($password_log['generated_password'] != null && $hasExceeded == false) + // { + // $data['expired'] = true; + // return $this->format->unprocessableEntity("Your password is expired",$data); + // } + // } + + $data['is_verified'] = true; + $data['role'] = $admin[0]['role']; + return $this->format->success("Success",$data); + } + } + + $data['is_verified'] = false; + return $this->format->unprocessableEntity("Username does not exist.",$data); + + } + + + public function cms_login() + { + if(Auth::attempt(['username' => request('username'), 'password' => request('password')])) + { + + $user = Auth::user(); + $admin = $this->admin->getByField([ + 'username' => request('username'), + 'is_active' => 1, + ]); + + if($admin[0]['is_passwordChanged'] == 1) + { + $this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'LOGIN'); + // $success['token'] = $user->createToken('Admin')->accessToken; + + + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $admin[0]['email'], + 'password' => request('password'), + 'scope' => '' + ]; + + $request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($request)->getContent(); + $result = json_decode($result); + + + $success['token'] = $result->access_token; + // $success['refresh_token'] = $result->refresh_token; + $message = 'Success'; + } + else + { + $password_log = $this->password_logs->getLastLog($admin[0]['admin_id']); + if($password_log) + { + $hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes'); + if($password_log['generated_password'] != null && $hasExceeded == false) + { + $data['expired'] = true; + return $this->format->unprocessableEntity("Your password is expired",$data); + } + } + + $success['prompt_password'] = 1; + $success['admin_uuid'] = $admin[0]['admin_uuid']; + $message = 'User must change password'; + } + + return $this->format->success($message,$success); + } + else{ + return $this->format->unauthorized("Incorrect Password"); + } + } + + + public function cms_changePassword(UserFormValidation $request) + { + + $admin = $this->admin->getByField(['admin_uuid' => $request->get('admin_uuid')]); + + //added this to check if the admin uuid is correct and to avoid Undefined offset: 0 + if ($admin->count() == 0){ + return $this->format->unauthorized(); + } + + // Shall not be the same with the previous 2 passwords. + $logs = $this->password_logs->getByField([ + 'admin_id' =>$admin[0]['admin_id'], + 'is_generated' => 0 + ]); + $good_password = true; + if(count($logs) > 0) + { + $ctr = 1; + foreach ($logs as $key => $value) { + if($ctr <= 2) + { + if($value['password'] == md5($request->get('password'))) + $good_password = false; + } + $ctr++; + } + } + + if($good_password) + { + + $success_admin = $this->admin->changePassword($request); + $success_user = $this->user->changePassword($request,$admin[0]['username']); + $this->password_logs->store($admin[0]['admin_id'],$request->get('password'),$admin[0]['admin_id']); + + if($success_user && $success_admin) + { + $this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'UPDATE','Changed Password'); + + if(Auth::attempt(['username' => $admin[0]['username'], 'password' => $request->get('password')])) + { + $auth = Auth::user(); + // $success['token'] = $auth->createToken('Admin')->accessToken; + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $admin[0]['email'], + 'password' => $request->get('password'), + 'scope' => '' + ]; + + $auth_request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($auth_request)->getContent(); + $result = json_decode($result); + + + $success['token'] = $result->access_token; + // $success['refresh_token'] = $result->refresh_token; + + $this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'LOGIN'); + return $this->format->success("SUCCESS",$success); + } + else + { + return $this->format->unauthorized(); + } + } + } + else + { + $data['password'] = 'Shall not be the same with the previous 2 passwords'; + return $this->format->unprocessableEntity("Shall not be the same with the previous 2 passwords",$data); + } + } + + public function logout_cms() + { + if (Auth::check()) { + // Auth::user()->AauthAcessToken()->delete(); + Auth::user()->token()->revoke(); + return $this->format->success("Logout Success"); + } + } + + /** + * Mobile api + * + * @return \Illuminate\Http\Response + */ + + public function mobile_loginCardNumber(LoginMobileNumberFormValidation $request) + { + + + + $member_det = $this->loyalty_card->getByField([ + 'mobile' => '63'.$request->get('mobile_number'), + 'is_active' => 1 + ]); + $cardnumber = null; + if($member_det != null && count($member_det) > 0 && $member_det[0]['card_number'] != null){ + $cardnumber = $member_det[0]['card_number']; + }else{ + return $this->format->mobile_error("Mobile number is not yet registered",['code' => 2]); + } + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($cardnumber); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $cardnumber, + 'is_active' => 1 + ]); + + + + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + } + + + return $this->format->mobile_success('Success',[ + 'is_valid' => 1, + 'card_number' => $cardnumber + ]); + + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginMobileNumber(LoginMobileNumberFormValidation $request) + { + + $cyware = new CywareLibrary(); + $cyware->setMobile('63'.$request->get('mobile_number')); + $cyware->state_mobilevalidate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + + //get card number details + $dataResult = $cyware->response['data']; + $cardnumber = null; + if(is_array($dataResult)){ + //get latest card + foreach ($dataResult as $key => $part) { + $sort[$key] = strtotime($part->app_date.$part->app_time); + } + array_multisort($sort, SORT_DESC, $dataResult); + + $cardnumber = $dataResult[0]->card_number; + + }else + $cardnumber = $dataResult->card_number; + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $cardnumber, + 'is_active' => 1 + ]); + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + } + + $lcard_uuid = $member_det[0]['lcard_uuid']; + + return $this->format->mobile_success('Success',[ + 'is_valid' => 1, + 'card_number' => $cardnumber, + 'user_id' => $lcard_uuid + ]); + + }else{ + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginCardNumber_enroll(LoginCardNumberFormValidation $request) + { + // // Number Verification Code + // $loyalty_card = $this->loyalty_card->getByField([ + // 'mobile' => $request->get('mobile'), + // 'is_active' => 1, + // ]); + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_entry(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'Pin is required') + { + + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_validate(); + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'No Records Found') + { + return $this->format->mobile_success('Success',[ + 'is_valid' => 1 + ]); + } + else + { + $message = $cyware->response['message']; + $code = 2; + if(isset($cyware->response['message']) && $cyware->response['message'] == "Success") + { + + // check if locked + $member_det = $this->loyalty_card->getByField([ + 'card_number' => $request->get('card_number'), + 'is_active' => 1 + ]); + + if(count($member_det)) + { + if($member_det[0]['is_locked'] == 1) + { + + if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours')) + { + $this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']); + $this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated'); + } + else + { + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + } + + // todo remove this comment on live + // if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID')) + // { + // return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]); + // } + } + + $message = 'Card Number is already registered. Do you want to proceed to login?'; + $code = 4; +return $this->format->mobile_error($message,['code' => $code,'number' => $cyware->response['data']->mobile]); + } + + + return $this->format->mobile_error($message,['code' => $code,'number' => $cyware->response['data']->mobile]); + } + + } + else + { + return $this->format->mobile_error($cyware->response['message'],['code' => 2]); + } + + } + + public function mobile_loginBirthdate(LoginBirthdateFormValidation $request) + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->state_validate(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null) + { + if(Carbon::parse($request->get('birthdate'))->age < 18) + { + return $this->format->mobile_error('You must be at least 18 years old to join the Loyalty Program'); + } + elseif($cyware->response['data']->birthdate != $request->get('birthdate')) + { + return $this->format->mobile_error( 'Incorrect Birthdate'); + } + else + { + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $request->get('card_number'), + 'is_active' => 1 + ],'codeCardType'); + + if(count($loyalty_card)) + { + $cyware->state_retrieve(); + // update device uuid + $this->loyalty_card->update_deviceuuid($loyalty_card[0]['lcard_id'],$request->get('deviceUUID')); + + + $success = [ + 'mobile_number' => $loyalty_card[0]['mobile'], + // 'card_type' => $loyalty_card[0]['card_type']['code'], + // 'card_number' => $loyalty_card[0]['card_number'], + 'lcard_uuid' => $loyalty_card[0]['lcard_uuid'], + 'state_retrieve' => $cyware->response["data"] + ]; + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','LOGIN','Member logs in a verified account'); + } + else + { + // add details to database + + $pd_id = $this->personal_details->store($cyware->response['data']); + $lcard_store = $this->loyalty_card->store($pd_id, $cyware->response['data'], $request->get('deviceUUID'),1); + $this->user->store_member($cyware->response['data']); + $this->mobile_usage->add_inactive(); + $success = [ + 'mobile_number' => $cyware->response['data']->mobile, + // 'card_type' => $cyware->response['data']->card_type_code, + // 'card_number' => $cyware->response['data']->card_number, + 'lcard_uuid' => $lcard_store['lcard_uuid'], + ]; + + $this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member added a verified account to database'); + } + + return $this->format->mobile_success('Success',$success); + + } + + }else{ + return $this->format->mobile_error('Error',['card_number' => $cyware->response['message']]); + } + } + + public function create_otp(Request $request) + { + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + + + if(count($loyalty_card)) + { + // get if loyalty card is less than 30 seconds + // this is due to iOS' double request for OTP + $last_log = $this->otp_logs->getLastLog($loyalty_card[0]['lcard_id']); + if((isset($last_log->created_at) && strtotime($last_log->created_at.' +30 seconds') > strtotime(date('Y-m-d H:i:s'))) && $request->is_resend == 'true') + return $this->format->mobile_success('Success'); + + if($request->has('is_resend') && $request->is_resend != 'true') + { + // reset otp_attempts + $this->otp_attempts->delete($loyalty_card[0]['lcard_id']); + } + + if(env("M360_ENV", 'TEST') == 'LOCAL') + $otp = 1234; + else + $otp = StringHelper::random_num(4); + + + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $transid = date('YmdHis').$loyalty_card[0]['lcard_id']; + $mobile = $request->has('mobile') ? '63'.$request->mobile : $loyalty_card[0]['mobile']; + + $m360 = new M360(); + + $m360->set_msisdn($mobile); + $m360->set_content($content); + $m360->set_rcvd_transid($transid); + $m360->send(); + + if($m360->success()) + { + // error_log( "SMS Sent!" ); + $data = [ + 'otp' => $otp, + 'msisdn' => $mobile, + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $m360->get_transid() + ]; + + if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data)) + { + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success'); + } + else + { + return $this->format->mobile_error('Something went wrong'); + } + } + else + { + return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message()); + } + } + else + { + return $this->format->mobile_error('User doesn\'t exist'); + } + + } + + public function mobile_otp(Request $request){ + + if($request->has('mobile')){ + + $mobile = '63'.$request->mobile; + + $loyalty_card = $this->loyalty_card->getByField([ + 'mobile' => $mobile, + 'is_active' => 1, + ]); + + if(count($loyalty_card)>0){ + return $this->format->mobile_error('Mobile number already used.'); + }else{ + + $lastlog = $this->otp_logs->getLastLogByNumber($mobile); + if($lastlog != null){ + $timeB = time(); + $lastlog = strtotime($lastlog->created_at); + if($lastlog+30 > $timeB){ + return $this->format->mobile_error("OTP too fast to request."); + } + } + + $otp = StringHelper::random_num(4); + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $transid = date('YmdHis')."validate"; + + $m360 = new M360(); + + $m360->set_msisdn($mobile); + $m360->set_content($content); + $m360->set_rcvd_transid($transid); + $m360->send(); + + if($m360->success()){ + + $data = [ + 'otp' => $otp, + 'msisdn' => $mobile, + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $m360->get_transid() + ]; + + // return $this->format->mobile_success('Success'); + if($this->otp_logs->store("validation",$data)){ + $this->lcard_logs->log("validation",'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success', [ + 'trans_id' => $transid + ]); + }else{ + return $this->format->mobile_error('Something went wrong'); + } + + }else{ + return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message()); + } + + // return $this->format->mobile_success("Mobile number is valid."); + } + + }else{ + return $this->format->mobile_error("Mobile number is required"); + } + + } + + public function mobile_updateMpin(MpinFormValidation $request){ + + + //check if code exist + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + + if(count($loyalty_card)) + { + $cardNumber = $loyalty_card[0]['card_number']; + + //check if mpin exist + $mpin = $this->mpin_codes->getMpin($cardNumber); + if($mpin){ + //update + + $data = []; + $data['mpin_code'] = $request->get('mpin'); + $res = $this->mpin_codes->updateMpin($cardNumber,$data); + if($res){ + return $this->format->mobile_success('Success', [ + 'mpin' => $request->get('mpin') + ]); + }else{ + return $this->format->mobile_error('Something went wrong.'); + } + }else{ + //store + $data = []; + $data['lcard_id'] = $cardNumber; + $data['mpin_code'] = $request->get('mpin'); + $res = $this->mpin_codes->store($data); + if($res){ + return $this->format->mobile_success('Success', [ + 'mpin' => $request->get('mpin') + ]); + }else{ + return $this->format->mobile_error('Something went wrong.'); + } + + } + }else{ + return $this->format->mobile_error('User doesn\'t exist'); + } + + + } + + public function mobile_getPin(Request $request){ + + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ]); + + if(count($loyalty_card)) + { + $cardNumber = $loyalty_card[0]['card_number']; + $mpin = $this->mpin_codes->getMpin($cardNumber); + if($mpin){ + return $this->format->mobile_success('Success', [ + 'mpin' => $mpin->mpin_code + ]); + }else{ + return $this->format->mobile_error('MPIN is not yet set by the user.'); + } + + }else{ + return $this->format->mobile_error('User doesn\'t exist'); + } + + } + + public function mobile_validate_otp(Request $request){ + $otp_log = $this->otp_logs->getByField([ + 'rcvd_transid' => $request->trans_id + ]); + if(count($otp_log)>0){ + $_otp = $otp_log[0]->otp; + $_otp_id = $otp_log[0]->otplog_id; + $_otp_used = $otp_log[0]->used; + // return $this->format->mobile_success("test", $otp_log[0]->otp); + if($_otp_used == 0){ + if($_otp == $request->otp){ + if($this->otp_logs->setUsed($_otp_id)){ + return $this->format->mobile_success('Success'); + }else{ + return $this->format->mobile_error("Something went wrong."); + } + }else{ + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + }else{ + return $this->format->mobile_error('The OTP you have entered has already used.'); + } + }else{ + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + } + + public function validate_otp(Request $request) + { + // lock after 3 attempts + $numberOfAttempts = 0; + + $attempts = $this->loyalty_card->numberOfOTPAttempts($request->get('lcard_uuid')); + + if(!is_null($attempts)) + { + $numberOfAttempts = $attempts->otpAttempts->count(); + } + + + if($numberOfAttempts >= 3) + { + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return $this->format->mobile_error('You already entered the wrong OTP 3 times. Your account is locked for 24 hours. Please contact Customer Service for assistance, call or email customer service.',[ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]); + } + else + { + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $request->get('lcard_uuid'), + 'is_active' => 1 + ],'personalDetails'); + + $getuserDetails = $this->loyalty_card->show($request->get('lcard_uuid'),['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType','codeCity','codeFuelType']); + $data = new MobileUserProfileResource($getuserDetails); + $userDetails = null; + if($data != null){ + $userDetails = $data->toArray($getuserDetails); + + } + + + $numberOfAttempts++; + $this->otp_attempts->store($loyalty_card[0]['lcard_id'],$request->get('otp')); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','ATTEMPT','Member entered otp '.$request->get('otp')); + + // check if correct + + $otpLog = $this->otp_logs->getByField(['lcard_id' => $loyalty_card[0]['lcard_id'], 'otp' => $request->get('otp')]); + //var_dump($otpLog); + if(count($otpLog)) + { + $latestOtp = $this->otp_logs->getLastLog($loyalty_card[0]['lcard_id']); + + // checks if otp entered is expired and it's the latest otp created + if(!StringHelper::check_time_exceeded($otpLog[0]['created_at'],'+5 minutes') || $latestOtp->otp != $request->get('otp')) + { + if($numberOfAttempts >= 3) + { + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($loyalty_card)); + } + + return $this->format->mobile_error('The OTP you have entered has already expired. Please select the Resend OTP option',['code' => 3]); + } + else + { + if($loyalty_card[0]['cyware_synced'] == 0) + { + $cyware_response = $this->cyware_activate($loyalty_card[0]); + + if($cyware_response['success'] == true && isset($cyware_response['data'])) + { + $this->loyalty_card->cyware_activate($loyalty_card[0]['lcard_id'],$cyware_response['data']); + $this->user->store_member($cyware_response['data']); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','ACTIVATE','Member activated a card'); + } + else + { + return $this->format->mobile_error($cyware_response['message']); + } + } + + + if(Auth::attempt([ 'username' => $loyalty_card[0]['card_number'], 'password' => $loyalty_card[0]['birthdate']->toDateString() ])) + { + + if($loyalty_card[0]['is_validated'] == 0) + { + $this->loyalty_card->validateMember($loyalty_card[0]['lcard_id']); + $this->mobile_usage->add_active(); + } + + $mpin = $this->mpin_codes->getMpin($loyalty_card[0]['card_number']); + + $this->otp_logs->setUsed($latestOtp->otplog_id); + + $user = Auth::user(); + $success['is_valid'] = 1; + // $success['token'] = $user->createToken('Mobile')->accessToken; // for multiple login + + // ---------------------------------------------------------------- new login start + + $data = [ + 'grant_type' => 'password', + 'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2), + 'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"), + 'username' => $loyalty_card[0]['card_number'], + 'password' => $loyalty_card[0]['birthdate']->toDateString(), + 'scope' => '' + ]; + + // dd($data); + + $request = Request::create('/oauth/token', 'POST', $data); + $result = app()->handle($request)->getContent(); + $result = json_decode($result); + + + $success['token'] = $result->access_token; + $success['userDetails'] = $userDetails; + if($mpin){ + $success['userDetails']['mpin'] = $mpin->mpin_code; + } + // ---------------------------------------------------------------- new login end + + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','LOGIN','Member successfully logs in'); + return $this->format->mobile_success('Sucess',$success,$data); + } + } + } + else + { + if($numberOfAttempts >= 3) + { + return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($loyalty_card)); + } + + return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]); + } + } + } + + private function cyware_activate($loyalty_card) + { + $err = ''; + + $cyware = new CywareLibrary(); + $cyware->setCardNumber($loyalty_card['card_number']); + $cyware->setPin($loyalty_card['pin']); + $cyware->setFirstName($loyalty_card['personalDetails']['firstname']); + $cyware->setLastName($loyalty_card['personalDetails']['lastname']); + $cyware->setBirthday(date('Ymd',strtotime($loyalty_card['birthdate']))); + $cyware->setMobile($loyalty_card['mobile']); + $cyware->setEmail($loyalty_card['email']); + $cyware->state_entry(); + + if ($cyware->response['status_code'] == 200 && $cyware->response['message'] == 'success') + { + $cyware->state_validate(); + + if ($cyware->response['status_code'] == 200 && $cyware->response['data'] != null) + { + return ['success' => true , 'data' => $cyware->response['data']]; + } + else + $err = $cyware->response['message']; + + } + else + $err = $cyware->response['message']; + + return ['success' => false , 'message' => $err]; + } + + private function lock_member($loyalty_card) + { + $this->loyalty_card->lockMember($loyalty_card[0]['lcard_id'],'01'); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','LOCKED','Account is locked due to wrong OTP entered for 3 times during login'); + $this->mobile_usage->add_locked(); + + $customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile'); + $customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile'); + + return [ + 'code' => 1, + 'email' => $customer_service_email[0]['value'], + 'number' => $customer_service_number[0]['value'], + ]; + } + + public function mobile_validatePin(Request $request) + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber($request->get('card_number')); + $cyware->setPin($request->get('pin')); + $cyware->state_entry(); + + if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'First name is required') + { + return $this->format->mobile_success('Success'); + } + else + { + return $this->format->mobile_error($cyware->response['message']); + } + } + + public function mobile_activateCard(LoginActivateCardFormValidation $request) + { + // check if exists + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $request->card_number, + 'cyware_synced' => 0, + 'is_active' => 1 + ],'personalDetails'); + + if(count($loyalty_card) > 0) + { + $pd_id = $this->personal_details->update_non_cyware_synced($loyalty_card[0]['pd_id'],$request); + $lcard_store = $this->loyalty_card->update_non_cyware_synced($loyalty_card[0]['lcard_id'], $request); + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','UPDATE','Member updated form for card activation'); + } + else + { + $pd_id = $this->personal_details->store($request); + $lcard_store = $this->loyalty_card->store($pd_id, $request); + $this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member filed for card activation'); + + // ------ send OTP start + $loyalty_card = $this->loyalty_card->getByField([ + 'lcard_uuid' => $lcard_store['lcard_uuid'], + 'is_active' => 1 + ]); + } + + + + if(count($loyalty_card)) + { + // reset otp_attempts + $this->otp_attempts->delete($loyalty_card[0]['lcard_id']); + + if(env("M360_ENV", 'TEST') == 'LOCAL') + $otp = 1234; + else + $otp = StringHelper::random_num(4); + + + $content = 'Your Unioil Mobile Application OTP Code is '.$otp; + $transid = date('YmdHis').$loyalty_card[0]['lcard_id']; + + $m360 = new M360(); + + $m360->set_msisdn($loyalty_card[0]['mobile']); + $m360->set_content($content); + $m360->set_rcvd_transid($transid); + $m360->send(); + + if($m360->success()) + { + // error_log('SMS Sent Activation!'); + $data = [ + 'otp' => $otp, + 'msisdn' => $loyalty_card[0]['mobile'], + 'content' => $content, + 'rcvd_transid' => $transid, + 'transid' => $m360->get_transid() + ]; + + if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data)) + { + $this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP'); + return $this->format->mobile_success('Success',[ + 'mobile_number' => $loyalty_card[0]['mobile'], + 'lcard_uuid' => $loyalty_card[0]['lcard_uuid'], + ]); + } + else + { + return $this->format->mobile_error('Something went wrong'); + } + } + else + { + // return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message()); + return $this->format->mobile_error('There was a problem sending your OTP. Please try again.',$m360->get_response_message()); + } + } + else + { + return $this->format->mobile_error('User doesn\'t exist'); + } + // ------ send OTP end + + + } + + public function logout_mobile() + { + + if (Auth::check()) { + $this->lcard_logs->log(0,'LOGIN','LOGOUT','Member logged out'); + $this->loyalty_card->remove_deviceuuid(Auth::user()->username); + // Auth::user()->AauthAcessToken()->delete(); + Auth::user()->token()->revoke(); + return $this->format->mobile_success("Logout Success"); + } + } + + + public function checkTime() + { + echo date('Y-m-d H:i:s').'
'; + echo config('app.timezone'); + } + + public function convertmd5() + { + echo md5(request('value')); + } + + public function checkOTP($card_number) + { + + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $card_number, + 'is_active' => 1, + ]); + + if(count($loyalty_card)>0) + { + $logs = $this->otp_logs->getLastLog_limit(1, $loyalty_card[0]->lcard_id); + + if(count($logs) > 0) + { + foreach ($logs as $k => $v) + { + echo ' +

'.$v->otp.'

+ '.($v->used == 1 ? 'used' : 'not used').' + '.date('F d, Y h:i A',strtotime($v->created_at)).' +
+ + '; + } + } + } + else + { + echo 'Card Number doesn\'t exists'; + } + } + //check mobile number already exist + public function checkMobile($mobile) + { + + $loyalty_card = $this->loyalty_card->getByField([ + 'mobile' => $mobile, + 'is_active' => 1, + ]); + + if(count($loyalty_card)>0) + { + return $this->format->mobile_error('Mobile number already used.'); + } + else + { + return $this->format->mobile_success("Mobile number is valid."); + } + } + +//todo delete for testing only + public function state_validate() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber($_GET['as']); + $cyware->setBirthday('19800222'); + $cyware->state_validate(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_entry() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->setFirstName('vic'); + $cyware->setLastName('vic'); + $cyware->setBirthday('19991010'); + $cyware->setMobile('639178032215'); // must have 63 + $cyware->setEmail('gasdga@fasd.com'); + $cyware->setPin('99798722'); + $cyware->state_entry(); + $cyware->state_entry(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_trans() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->setStartDate('20180101'); + $cyware->setEndDate('20181231'); + $cyware->state_trans(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + +//this func is not yet available in phase 1 / but just in case + public function state_promo() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->state_promo(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_retrieve() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->state_retrieve(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function StateRetrieve($data){ + $newData = $data->getData(); + $mainData = []; + $mainData["lcard_uuid"] = $newData->data->lcard_uuid; + $mainData["card_number"] = $newData->data->card_number; + $mainData["pin"] = $newData->data->pin; + $mainData["birthdate"] = $newData->data->birthdate; + $mainData["mobile"] = $newData->data->mobile; + $mainData["email"] = $newData->data->email; + $mainData["firstname"] = $newData->data->firstname; + $mainData["lastname"] = $newData->data->lastname; + $mainData["photo"] = $newData->data->photo; + $mainData["card_type"] = $newData->data->card_type; + $mainData["card_code"] = $newData->data->card_code; + $mainData["card_image"] = $newData->data->card_image; + $mainData["card_bg_image"] = $newData->data->card_bg_image; + $mainData["card_black_label"] = $newData->data->card_black_label; + $mainData["expiry_date"] = $newData->data->expiry_date; + $mainData["points"] = $newData->data->points; + //DATA THAT MUST GET FROM STATE RETRIEVE + $mainData["middlename"] = $newData->retrieved->middle_initial; + $mainData["city_name"] = $newData->retrieved->address; + $mainData["address"] = $newData->retrieved->address; + $mainData["civilstatus_code"] = $newData->retrieved->civil_status_code; + $mainData["gender_code"] = $newData->retrieved->gender_code; + $mainData["vo_code"] = $newData->retrieved->vehicle_own_code; + $mainData["fueltype_code"] = $newData->retrieved->fuel_type_code; + //$mainData['log'] = "start:".$datestart." ---- end:".$dateend; + $newData->data = $mainData; + return response()->json($newData); + } + + + public function state_update() + { + $cyware = new CywareLibrary(); + + $cyware->setCardNumber('1100000000000001'); + $cyware->setFirstName('vic'); + $cyware->setLastName('abalos'); + $cyware->setAddress('dun'); + $cyware->setMobile('639178032215'); + $cyware->setEmail('email@gmaill.com'); + $cyware->setCivilStatusCode('S'); + $cyware->setGenderCode('0'); + $cyware->setCivilStatusCode('S'); + $cyware->setFuelType('1'); + + + + $cyware->state_update(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_points() + { + $cyware = new CywareLibrary(); + + $cyware->setCardNumber('1100000000000001'); + $cyware->setSiNum(rand(1000,3000)); + $cyware->setTotalAmount('100'); + $cyware->state_points(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + public function state_redeemed() + { + $cyware = new CywareLibrary(); + $cyware->setCardNumber('1100000000000001'); + $cyware->setStartDate('20180101'); + $cyware->setEndDate('20181231'); + $cyware->state_redeemed(); + + if ($cyware->response['data'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + }else{ + return $this->format->success($cyware->response['message'],$cyware->response['data']); + } + } + + + public function stations_fuel_prices() + { + $cyware = new StratuscastLibrary(); + $cyware->getAllFuelPrice(); + + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function station_fuel_price_station() + { + $cyware = new StratuscastLibrary(); + $cyware->getFuelPriceBystation($_GET['station']); + + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function city_provinces() + { + $cyware = new StratuscastLibrary(); + $cyware->getCityAndProvince(); + + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function city() + { + $cyware = new StratuscastLibrary(); + $cyware->getCity(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + public function province() + { + $cyware = new StratuscastLibrary(); + $cyware->getProvince(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function aboutus() + { + $cyware = new StratuscastLibrary(); + $cyware->getAboutUs(); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function product() + { + $cyware = new StratuscastLibrary(); + $cyware->getProduct($_GET['id']); + if ($cyware->response['status_code'] == "200"){ + return $this->format->success("curl success",$cyware->response['data']); + } + } + + public function checkmobileotp($mobile){ + + $mobile = $mobile != null ? $mobile: ""; + + $lastlog = $this->otp_logs->getLastLogByNumber($mobile); + + if($lastlog){ + return $lastlog->content; + } + return "Sorry, this request is not available or no data found"; + } + + +} diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..6a247fe --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,32 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..b2ea669 --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,39 @@ +middleware('guest')->except('logout'); + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 0000000..e749c07 --- /dev/null +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,72 @@ +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 \App\User + */ + protected function create(array $data) + { + return User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + ]); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..cf726ee --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,39 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Auth/VerificationController.php b/app/Http/Controllers/Auth/VerificationController.php new file mode 100644 index 0000000..4163aaa --- /dev/null +++ b/app/Http/Controllers/Auth/VerificationController.php @@ -0,0 +1,41 @@ +middleware('auth'); + $this->middleware('signed')->only('verify'); + $this->middleware('throttle:6,1')->only('verify', 'resend'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..03e02a2 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ +middleware('auth'); + } + + /** + * Show the application dashboard. + * + * @return \Illuminate\Contracts\Support\Renderable + */ + public function index() + { + return view('home'); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..d60d21e --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,83 @@ + [ + \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', + \Barryvdh\Cors\HandleCors::class, + \App\Http\Middleware\BeforeMiddleware::class, + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; + + /** + * The priority-sorted list of middleware. + * + * This forces the listed middleware to always be in the given order. + * + * @var array + */ + protected $middlewarePriority = [ + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\Authenticate::class, + \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + \Illuminate\Auth\Middleware\Authorize::class, + ]; +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..41ad4a9 --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,19 @@ +auth = $auth; + $this->lcard_logs = $lcard_logs; + $this->loyalty_card = $loyalty_card; + $this->personal_details = $personal_details; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if($this->auth->user() && + ( + $request->path() != "api/mobile/logout" || + $request->path() != "api/mobile/loginCardNumber" || + $request->path() != "api/mobile/loginCardNumberEnroll" + ) + ) + { + if($this->auth->user()->type == 2) + { + $cyware = new CywareLibrary; + $cyware->setCardNumber($this->auth->user()->username); + $cyware->state_validate(); + + $loyalty_card = $this->loyalty_card->getByField([ + 'card_number' => $this->auth->user()->username, + 'cyware_synced' => 1, + 'is_active' => 1 + ]); + + if($cyware->response['message'] == 'Card number is deactivated') + { + $this->lcard_logs->log(0,'LOGIN','LOGOUT','Member is deactivated'); + $this->loyalty_card->remove_deviceuuid($this->auth->user()->username, 1); + // Auth::user()->AauthAcessToken()->delete(); + Auth::user()->token()->revoke(); + $data = [ + 'status' => 0, + 'code' => 5, + 'message' => 'Your account has been deactivated' + ]; + return Response::json($data,200); + } + elseif($cyware->response['message'] == 'No Records Found' || $cyware->response['message'] == 'Account not found') + { + $this->lcard_logs->log(0,'LOGIN','LOGOUT','Member is removed'); + $this->loyalty_card->remove_deviceuuid($this->auth->user()->username, 1); + Auth::user()->token()->revoke(); + $data = [ + 'status' => 0, + 'code' => 5, + 'message' => 'Your account has been deleted' + ]; + return Response::json($data,200); + + } + elseif ($loyalty_card[0]['is_locked'] == 1) + { + $this->lcard_logs->log(0,'LOGIN','LOGOUT','Member is locked'); + $this->loyalty_card->remove_deviceuuid($this->auth->user()->username, 1); + Auth::user()->token()->revoke(); + $data = [ + 'status' => 0, + 'code' => 1, + 'message' => 'Your account has been locked' + ]; + return Response::json($data,200); + } + else + { + $pd_id = $this->loyalty_card->sync_cyware($cyware->response['data']); + $this->personal_details->sync_cyware($pd_id,$cyware->response['data']); + } + } + } + + // if($request->header('card_number')) + // { + // $card_number = $request->header('card_number'); + // $loyalty_card = $this->loyalty_card->getByField([ + // 'card_number' => $card_number, + // 'cyware_synced' => 1, + // 'is_active' => 1 + // ]); + // if($loyalty_card[0]['cyware_deactivated'] == 1) + // { + // $data = [ + // 'status' => 3, + // 'message' => 'Your account has been deactivated' + // ]; + + // return Response::json($data,203); + // } + + // if(!$this->auth->user()) + // { + // $data = [ + // 'status' => 3, + // 'message' => 'Your account has logged in a different device' + // ]; + + // return Response::json($data,203); + // } + // } + + return $next($request); + } +} diff --git a/app/Http/Middleware/CheckForMaintenanceMode.php b/app/Http/Middleware/CheckForMaintenanceMode.php new file mode 100644 index 0000000..35b9824 --- /dev/null +++ b/app/Http/Middleware/CheckForMaintenanceMode.php @@ -0,0 +1,17 @@ +check()) { + return redirect('/home'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..5a50e7b --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,18 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'email' => 'Invalid input format', + 'unique' => 'The :attribute is already taken' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'username' => 'required|max:32|unique:admin,username,null,null,is_active,1', + 'firstname' => ['required','max:32', new AlphaDash], + 'lastname' => ['required','max:32', new AlphaDash], + 'email' => 'required|email|max:32|unique:admin,email,null,null,is_active,1', + 'role' => 'required', + 'password' => 'required', + 'status' => 'required' + ]; + + return $rules; + case 'PUT': + $uuid = !empty($this->route('admin')) ? $this->route('admin') : $this->route('uuid'); + $details = Admin::whereAdminUuid($uuid)->first(); + $rules = [ + 'username' => 'required|max:32|unique:admin,username,'.$details['admin_id'].',admin_id,is_active,1', + 'firstname' => ['required','max:32', new AlphaDash], + 'lastname' => ['required','max:32', new AlphaDash], + 'email' => 'required|email|max:32|unique:admin,email,'.$details['admin_id'].',admin_id,is_active,1', + // 'role' => 'required' + 'status' => 'required' + ]; + + return $rules; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/CardTypeFormValidation.php b/app/Http/Requests/CardTypeFormValidation.php new file mode 100644 index 0000000..e679828 --- /dev/null +++ b/app/Http/Requests/CardTypeFormValidation.php @@ -0,0 +1,98 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + /* + Input from PUT requests sent as multipart/form-data is unavailable + check thread if fixed : https://github.com/laravel/framework/issues/13457 + + */ + + if($this->route('uuid') == null) + { + // STORE + + $rules = [ + 'code' => 'required|unique:code_card_type,code,null,null,is_active,1', + 'type' => 'required|unique:code_card_type,name,null,null,is_active,1', + 'description' => 'required|max:140', + 'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'terms_and_conditions' => 'required', + 'faqs' => 'required', + 'id_number' => 'required', + 'virtual_card_font_color' => 'required', + 'bg_image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + ]; + + if($request->id_number == 1) + $rules['id_number_description'] = 'required'; + + return $rules; + } + else + { + // UPDATE + + $uuid = !empty($this->route('cardType')) ? $this->route('cardType') : $this->route('uuid'); + $details = CodeCardType::whereCardtypeUuid($uuid)->first(); + + $rules = [ + 'code' => 'required|unique:code_card_type,code,'.$details['cardtype_id'].',cardtype_id,is_active,1', + 'type' => 'required|unique:code_card_type,name,'.$details['cardtype_id'].',cardtype_id,is_active,1', + 'description' => 'required|max:140', + 'image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'terms_and_conditions' => 'required', + 'faqs' => 'required', + 'id_number' => 'required', + 'virtual_card_font_color' => 'required', + 'bg_image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048', + ]; + + + if($request->id_number == 1) + $rules['id_number_description'] = 'required'; + + return $rules; + + } + + + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/FuelTrackerFormValidation.php b/app/Http/Requests/FuelTrackerFormValidation.php new file mode 100644 index 0000000..771b8c5 --- /dev/null +++ b/app/Http/Requests/FuelTrackerFormValidation.php @@ -0,0 +1,54 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + $rules = [ + 'fueltype_id' => 'required|numeric', + 'date' => 'required|date_format:Y-m-d', + 'kml' => 'required|numeric', + 'km' => 'required|numeric', + 'price' => 'required|numeric', + 'liters' => 'required|numeric', + 'total' => 'required|numeric' + ]; + return $rules; + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/InAppNotificationFormValidation.php b/app/Http/Requests/InAppNotificationFormValidation.php new file mode 100644 index 0000000..45d69f0 --- /dev/null +++ b/app/Http/Requests/InAppNotificationFormValidation.php @@ -0,0 +1,44 @@ +status = $httpStatusCode; + } + + public function authorize(){ + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + + public function rules(Request $request) + { + + $rules = [ + 'subject'=> 'required|string', + 'description'=> 'required|string' + ]; + return $rules; + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + } + +?> \ No newline at end of file diff --git a/app/Http/Requests/LoginActivateCardFormValidation.php b/app/Http/Requests/LoginActivateCardFormValidation.php new file mode 100644 index 0000000..9eae7da --- /dev/null +++ b/app/Http/Requests/LoginActivateCardFormValidation.php @@ -0,0 +1,71 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'card_number.size' => 'Please enter the 16-digit Loyalty Card Number', + 'pin.size' => 'Please enter the 8 digit Loyalty Card Pin', + 'mobile.size' => 'Please enter your 10-digit Mobile Phone Number', + 'email' => 'Please enter a valid email address' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'card_number' => 'required|size:16', + 'pin' => 'required|size:8', + 'firstname' => 'required', + 'lastname' => 'required', + 'birthdate' => ['required','date',new AdultAge], + 'mobile' => 'required|size:10', + 'email' => 'required|email', + 'deviceUUID' => 'required|max:64', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/LoginBirthdateFormValidation.php b/app/Http/Requests/LoginBirthdateFormValidation.php new file mode 100644 index 0000000..4df41d2 --- /dev/null +++ b/app/Http/Requests/LoginBirthdateFormValidation.php @@ -0,0 +1,62 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'size:16' => 'Please enter your 16-digit Loyalty Card Number' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'card_number' => 'required|size:16', + 'birthdate' => 'required|date', + 'deviceUUID' => 'required|max:64', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/LoginCardNumberFormValidation.php b/app/Http/Requests/LoginCardNumberFormValidation.php new file mode 100644 index 0000000..e655cfc --- /dev/null +++ b/app/Http/Requests/LoginCardNumberFormValidation.php @@ -0,0 +1,63 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + // public function messages() + // { + // // return [ + // // 'min:16' => 'Please enter your 16-digit Loyalty Card Number', + // // 'max:16' => 'Please enter your 16-digit Loyalty Card Number' + // // ]; + // } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'card_number' => 'required|min:16', + //'mobile_number' => 'required', + 'deviceUUID' => 'required|max:64', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/LoginMobileNumberFormValidation.php b/app/Http/Requests/LoginMobileNumberFormValidation.php new file mode 100644 index 0000000..26ac64f --- /dev/null +++ b/app/Http/Requests/LoginMobileNumberFormValidation.php @@ -0,0 +1,62 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + // public function messages() + // { + // // return [ + // // 'min:16' => 'Please enter your 16-digit Loyalty Card Number', + // // 'max:16' => 'Please enter your 16-digit Loyalty Card Number' + // // ]; + // } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'mobile_number' => 'required', + 'deviceUUID' => 'required|max:64', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/MobileEditProfileFormValidation.php b/app/Http/Requests/MobileEditProfileFormValidation.php new file mode 100644 index 0000000..e40cfc9 --- /dev/null +++ b/app/Http/Requests/MobileEditProfileFormValidation.php @@ -0,0 +1,80 @@ +status = $httpStatusCode; + } + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'mobile.size' => 'Please enter your 10-digit Mobile Phone Number', + 'email' => 'Please enter a valid email address' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + // $withOtp = $this->server()['PATH_INFO'] == '/api/mobile/editProfile' ? 'WITHOUT' : 'WITH'; + // switch($withOtp) + // { + // case 'WITHOUT': + $rules = [ + 'photo' => 'image', + 'firstname' => 'required', + 'lastname' => 'required', + 'birthdate' => 'required|date', + 'mobile' => 'required|size:10', + 'email' => 'required|email', + ]; + + return $rules; + // break; + + // case 'WITH': + // $rules = [ + // 'photo' => 'image', + // 'firstname' => 'required', + // 'lastname' => 'required', + // 'birthdate' => 'required|date', + // 'mobile' => 'required|size:10', + // 'otp' => 'required|size:4', + // ]; + + // return $rules; + // break; + // default: + // } + + } + + public function response(array $errors) + { + return $this->status->mobile_error('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/MobileSignupFormValidation.php b/app/Http/Requests/MobileSignupFormValidation.php new file mode 100644 index 0000000..f53e58c --- /dev/null +++ b/app/Http/Requests/MobileSignupFormValidation.php @@ -0,0 +1,70 @@ +status = $httpStatusCode; + } + + public function messages() + { + return [ + 'mobile.size' => 'Please enter your 10-digit Mobile Phone Number', + 'email' => 'Please enter a valid email address' + ]; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'cardtype_uuid' => 'required', + 'firstname' => 'required', + 'lastname' => 'required', + 'birthdate' => ['required','date',new AdultAge], + 'mobile' => ['required','size:10', new SignUpMobile], // unique mobile number + // 'mobile' => 'required|size:10', + 'email' => 'required|email', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->mobile_error('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/MobileSignupIDNumberValidation.php b/app/Http/Requests/MobileSignupIDNumberValidation.php new file mode 100644 index 0000000..7fd2d24 --- /dev/null +++ b/app/Http/Requests/MobileSignupIDNumberValidation.php @@ -0,0 +1,54 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'cardtype_uuid' => 'required', + 'id_number' => 'required|max:64', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/MobileTopUpFormValidation.php b/app/Http/Requests/MobileTopUpFormValidation.php new file mode 100644 index 0000000..d928bca --- /dev/null +++ b/app/Http/Requests/MobileTopUpFormValidation.php @@ -0,0 +1,60 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'amount.between' => 'Invalid top up amount' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'amount' => 'required|numeric|between:100,10000', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->mobile_error(isset($errors['amount'][0]) ? $errors['amount'][0] : 'Form Validation Error'); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/MpinFormValidation.php b/app/Http/Requests/MpinFormValidation.php new file mode 100644 index 0000000..4ebbd8e --- /dev/null +++ b/app/Http/Requests/MpinFormValidation.php @@ -0,0 +1,64 @@ +status = $httpStatusCode; + } + + public function messages() + { + return [ + ]; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'lcard_uuid' => 'required', + 'mpin' => 'required' + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->mobile_error('Form Validation Error',$errors); + } + +} + +?> + diff --git a/app/Http/Requests/PaymayaFormValidation.php b/app/Http/Requests/PaymayaFormValidation.php new file mode 100644 index 0000000..df80824 --- /dev/null +++ b/app/Http/Requests/PaymayaFormValidation.php @@ -0,0 +1,54 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + // 'paymentId' => 'required', + // 'token' => 'required', + // 'PayerID' => 'required', + ]; + + return $rules; + break; + default: + } + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/PaymayaTokenFormValidation.php b/app/Http/Requests/PaymayaTokenFormValidation.php new file mode 100644 index 0000000..b8ac83e --- /dev/null +++ b/app/Http/Requests/PaymayaTokenFormValidation.php @@ -0,0 +1,45 @@ +status = $httpStatusCode; + } + + public function authorize(){ + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + + public function rules(Request $request) + { + + $rules = [ + 'card_number'=> 'required|string', + 'customer_id'=> 'required|string', + 'token'=> 'required|string' + ]; + return $rules; + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + } + +?> \ No newline at end of file diff --git a/app/Http/Requests/PaypalExecuteFormValidation.php b/app/Http/Requests/PaypalExecuteFormValidation.php new file mode 100644 index 0000000..9308a68 --- /dev/null +++ b/app/Http/Requests/PaypalExecuteFormValidation.php @@ -0,0 +1,55 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'paymentId' => 'required', + 'token' => 'required', + 'PayerID' => 'required', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Requests/PhotoSliderFormValidation.php b/app/Http/Requests/PhotoSliderFormValidation.php new file mode 100644 index 0000000..2749f13 --- /dev/null +++ b/app/Http/Requests/PhotoSliderFormValidation.php @@ -0,0 +1,102 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'dimensions' => 'Image size must be 1020 x 621' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + /* + Input from PUT requests sent as multipart/form-data is unavailable + check thread if fixed : https://github.com/laravel/framework/issues/13457 + + */ + + if($this->route('uuid') == null) + { + // STORE + + $rules = [ + 'title' => 'required|max:32', + // 'description' => 'required', + // 'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'date_start' => ['required', 'date', new DateRange($request), new PhotoSliderDateStart($request)], + 'date_end' => ['required', 'date', new PhotoSliderDateEnd($request)], + ]; + if(is_file($request->image)) + { + $rules['image'] = 'required|image|mimes:jpeg,png,jpg,gif,svg|max:100|dimensions:max_width=1020,max_height=621,min_width=1020,min_height=621'; + } + else + $rules['image'] = 'required'; + + + return $rules; + + } + else + { + // UPDATE + + $rules = [ + 'title' => 'required|max:32', +// 'description' => 'required', + 'date_start' => ['required', 'date', new DateRange($request)], + 'date_end' => 'required|date', + ]; + + if(is_file($request->image)) + { + $rules['image'] = 'image|mimes:jpeg,png,jpg,gif,svg|max:100|dimensions:max_width=1020,max_height=621,min_width=1020,min_height=621'; + } + + return $rules; + + } + + + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/PromotionValidation.php b/app/Http/Requests/PromotionValidation.php new file mode 100644 index 0000000..befbb06 --- /dev/null +++ b/app/Http/Requests/PromotionValidation.php @@ -0,0 +1,98 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function messages() + { + return [ + 'dimensions' => 'Image size must be 1020 x 621' + ]; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + /* + Input from PUT requests sent as multipart/form-data is unavailable + check thread if fixed : https://github.com/laravel/framework/issues/13457 + + */ + + if($this->route('uuid') == null) + { + // STORE + + $rules = [ + 'title' => 'required|max:32', + 'description' => 'required', + 'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:100|dimensions:max_width=1020,max_height=621,min_width=1020,min_height=621', + 'date_start' => ['required', 'date', new DateRange($request)], + 'date_end' => 'required|date', + 'is_toppromotion' => 'required', + 'is_gps' => 'required', + 'promo_type' => 'required', + ]; + + + return $rules; + } + else + { + // UPDATE + + $uuid = !empty($this->route('promotion')) ? $this->route('promotion') : $this->route('uuid'); + $details = Promotions::wherePromotionUuid($uuid)->first(); + + $rules = [ + 'title' => 'required|max:32', + 'description' => 'required', + 'image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:100|dimensions:max_width=1020,max_height=621,min_width=1020,min_height=621', + 'date_start' => ['required', 'date', new DateRange($request)], + 'date_end' => 'required|date', + 'is_toppromotion' => 'required', + 'is_gps' => 'required', + 'promo_type' => 'required', + ]; + + return $rules; + + } + + + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/SecurityFormValidation.php b/app/Http/Requests/SecurityFormValidation.php new file mode 100644 index 0000000..b87be10 --- /dev/null +++ b/app/Http/Requests/SecurityFormValidation.php @@ -0,0 +1,50 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'email_address' => 'required', + 'card_number' => 'required', + 'birthdate' => 'required', + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/SystemPreferenceFormValidation.php b/app/Http/Requests/SystemPreferenceFormValidation.php new file mode 100644 index 0000000..7580b72 --- /dev/null +++ b/app/Http/Requests/SystemPreferenceFormValidation.php @@ -0,0 +1,61 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + + $rules = [ + 'logo' => 'image', + 'gps' => 'string', + 'contact_email_address_mobile' => 'email', + 'contact_number_mobile' => 'numeric', + 'contact_email' => 'email', + 'sys_add_contact_number' => 'numeric', + ]; + + return $rules; + case 'PUT': + + return $rules; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/TermsAndPrivacyFormValidation.php b/app/Http/Requests/TermsAndPrivacyFormValidation.php new file mode 100644 index 0000000..e0917f8 --- /dev/null +++ b/app/Http/Requests/TermsAndPrivacyFormValidation.php @@ -0,0 +1,62 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + + switch($this->method()) + { + case 'POST': + $rules = [ + 'title' => 'required|string', + 'details' => 'required|string', + 'type' => 'required|numeric', + ]; + return $rules; + case 'PUT': + $rules = [ + 'title' => 'required|string', + 'details' => 'required|string', + 'type' => 'required|numeric', + ]; + return $rules; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/TopUpFormValidation.php b/app/Http/Requests/TopUpFormValidation.php new file mode 100644 index 0000000..7653c3b --- /dev/null +++ b/app/Http/Requests/TopUpFormValidation.php @@ -0,0 +1,51 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + + $rules = [ + 'fee_code' => $this->method() == 'POST' ? 'required|unique:top_up,fee_code,null,null,is_active,1|string' : 'required|string', + 'name' => 'required|string', + 'amount' => $request->type == 1 ? 'required|numeric|between:0,99999.99' : 'required|numeric|between:0,100' , + 'type' => 'required|in:1,2', + ]; + return $rules; + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Validation Error',$errors); + } + +} + +?> diff --git a/app/Http/Requests/UserFormValidation.php b/app/Http/Requests/UserFormValidation.php new file mode 100644 index 0000000..4f6cb2f --- /dev/null +++ b/app/Http/Requests/UserFormValidation.php @@ -0,0 +1,56 @@ +status = $httpStatusCode; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'password' => 'required', + 'admin_uuid' => 'required' + ]; + + return $rules; + case 'PUT': + + return $rules; + default: + } + + } + + public function response(array $errors) + { + return $this->status->unprocessableEntity('Form Error',$errors); + } + +} + +?> \ No newline at end of file diff --git a/app/Http/Resources/AdminResource.php b/app/Http/Resources/AdminResource.php new file mode 100644 index 0000000..6d1c887 --- /dev/null +++ b/app/Http/Resources/AdminResource.php @@ -0,0 +1,58 @@ +withoutWrapping(); + $currentUser = CurrentUserHelper::get_currentAdmin(); + + $password_log = PasswordLogs::where('admin_id',$this->admin_id) + ->orderBy('created_dt', 'desc') + ->first(); + + $disable_generate = false; + if($password_log) + { + $hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes'); + + if($password_log['is_generated'] == 1 && $hasExceeded == true) + { + $disable_generate = true; + } + } + + return [ + 'admin_uuid' => $this->admin_uuid, + 'username' => $this->username, + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + 'email' => $this->email, + 'role' => $this->role, + 'created_by' => $this->created_by != 0 ? CurrentUserHelper::getAdminName($this->created_by) : null, + 'updated_by' => $this->updated_by != 0 ? CurrentUserHelper::getAdminName($this->updated_by) : null, + 'status' => StaticContents::admin_status($this->status), + 'generated_password' => isset($this->generated_password) ? $this->generated_password : null, + 'disable_generate' => $disable_generate, + 'created_at' => $this->created_at != null ? $this->created_at->toDateTimeString() : null, + 'updated_at' => $this->updated_at != null ? $this->updated_at->toDateTimeString() : null, + 'editable' => $currentUser->admin_id == $this->admin_id ? false: true, + ]; + } +} diff --git a/app/Http/Resources/CardTypeResource.php b/app/Http/Resources/CardTypeResource.php new file mode 100644 index 0000000..d659226 --- /dev/null +++ b/app/Http/Resources/CardTypeResource.php @@ -0,0 +1,36 @@ +withoutWrapping(); + + return [ + 'cardtype_uuid' => $this->cardtype_uuid, + 'code' => $this->code, + 'name' => $this->name, + 'description' => $this->description, + 'image' => $this->image != '' ? S3::public_path($this->image) : null, + 'bg_image' => $this->bg_image != '' ? S3::public_path($this->bg_image) : null, + 'terms_and_conditions' => $this->terms_and_conditions, + 'faqs' => $this->faqs, + 'id_number' => $this->id_number, + 'id_number_description' => $this->id_number_description, + 'virtual_card_font_color' => $this->is_black, + 'created_at' => $this->created_at != null ? $this->created_at->toDateTimeString() : null, + 'updated_at' => $this->updated_at != null ? $this->updated_at->toDateTimeString() : null, + ]; + } +} diff --git a/app/Http/Resources/InAppNotificationResource.php b/app/Http/Resources/InAppNotificationResource.php new file mode 100644 index 0000000..b59427e --- /dev/null +++ b/app/Http/Resources/InAppNotificationResource.php @@ -0,0 +1,26 @@ +withoutWrapping(); + + return [ + 'subject' => $this->subject, + 'description' => $this->description, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/app/Http/Resources/LoyaltyCardResource.php b/app/Http/Resources/LoyaltyCardResource.php new file mode 100644 index 0000000..7fa631e --- /dev/null +++ b/app/Http/Resources/LoyaltyCardResource.php @@ -0,0 +1,54 @@ +withoutWrapping(); + + $activated = AdminActionLogs::where('id',$this->lcard_id) + ->where('module','Member Management') + ->where('action','activate') + ->first(); + + return [ + 'lcard_uuid' => $this->lcard_uuid, + 'card_number' => $this->card_number, + 'pin' => $this->pin, + 'expiry_date' => $this->expiry_date != null ? date('F d, Y',strtotime($this->expiry_date)) : null, + 'birthdate' => date('F d, Y',strtotime($this->birthdate)), + 'mobile' => $this->mobile, + 'email' => $this->email, + 'firstname' => $this->personalDetails ? $this->personalDetails->firstname : '', + 'middlename' => $this->personalDetails ? $this->personalDetails->middlename : '', + 'lastname' => $this->personalDetails ? $this->personalDetails->lastname : '', + 'photo' => $this->personalDetails ? $this->personalDetails->photo : '', + 'address' => $this->personalDetails ? $this->personalDetails->address : '', + 'card_type' => $this->codeCardType ? $this->codeCardType->name : '', + 'vehicle_own' => $this->codeVehicleOwn ? $this->codeVehicleOwn->description : '', + 'civil_status' => $this->codeCivilStatus ? $this->codeCivilStatus->description : '', + 'gender' => $this->codeGender ? $this->codeGender->description : '', + 'status' => $this->is_locked == 1 ? 'locked' : StaticContents::member_status($this->is_validated), + 'validation_dt' => $this->validation_dt != null ? date('Y-m-d H:i:s',strtotime($this->validation_dt)) : null, + 'is_locked' => $this->is_locked, + 'lock_dt' => $this->lock_dt != null ? $this->lock_dt : null, + 'reason' => $this->lock_code != '' ? StaticContents::lock_code($this->lock_code): null, + 'created_at' => $this->created_at != null ? $this->created_at->toDateTimeString() : null, + 'updated_at' => $this->updated_at != null ? $this->updated_at->toDateTimeString() : null, + 'unlocked_by' => $activated ? CurrentUserHelper::getAdminName($activated->created_by) : null, + ]; + } +} diff --git a/app/Http/Resources/LoyaltyCardSignUpResource.php b/app/Http/Resources/LoyaltyCardSignUpResource.php new file mode 100644 index 0000000..0942692 --- /dev/null +++ b/app/Http/Resources/LoyaltyCardSignUpResource.php @@ -0,0 +1,64 @@ +withoutWrapping(); + + $details = [ + 'lcard_s_uuid' => $this->lcard_s_uuid, + 'card_type_code' => $this->codeCardType->code, + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + 'birthdate' => $this->birthdate->toDateString(), + 'mobile' => $this->mobile, + 'email' => $this->email, + // 'id_number' => $this->id_number, + // 'idnt_name' => isset($this->idNumberType) ? $this->idNumberType->name : "", + // 'photo_id' => $this->photo_id != '' ? S3::public_path($this->photo_id) : null, + // 'photo_document' => $this->photo_document != '' ? S3::public_path($this->photo_document) : null, + // 'selfie' => $this->selfie != '' ? S3::public_path($this->selfie) : null, + // 'selfie_w_card' => $this->selfie_w_card != '' ? S3::public_path($this->selfie_w_card) : null, + ]; + + if($this->id_number != '') + { + $details['id_number'] = $this->id_number; + $details['idnt_name'] = isset($this->idNumberType) ? $this->idNumberType->name : ""; + } + + if($this->photo_id != '') + { + $details['photo_id'] = $this->photo_id != '' ? S3::public_path($this->photo_id) : null; + } + + if($this->photo_document != '') + { + $details['photo_document'] = $this->photo_document != '' ? S3::public_path($this->photo_document) : null; + } + + if($this->selfie != '') + { + $details['selfie'] = $this->selfie != '' ? S3::public_path($this->selfie) : null; + } + + if($this->selfie_w_card != '') + { + $details['selfie_w_card'] = $this->selfie_w_card != '' ? S3::public_path($this->selfie_w_card) : null; + } + + return $details; + } +} diff --git a/app/Http/Resources/MobileUserProfileResource.php b/app/Http/Resources/MobileUserProfileResource.php new file mode 100644 index 0000000..836bfdf --- /dev/null +++ b/app/Http/Resources/MobileUserProfileResource.php @@ -0,0 +1,77 @@ +withoutWrapping(); + + // $city_uuid = ''; + // $city_name = ''; + // if($this->codeCity) + // { + // $city_uuid = $this->codeCity->city_uuid; + // $city_name = $this->codeCity->name; + // } + + $photo_url = ''; + if($this->personalDetails && $this->personalDetails->photo != '') + { + // $photo_url = str_replace('/public/index.php','',secure_url('storage/app/'.$this->personalDetails->photo)); + // $photo_url = str_replace('https','http',$photo_url); + $photo_url = S3::public_path($this->personalDetails->photo); + } + + $bg_image = ''; + if($this->codeCardType && $this->codeCardType->bg_image != '') + { + $bg_image = S3::public_path($this->codeCardType->bg_image); + } + + $card_image = ''; + if($this->codeCardType && $this->codeCardType->image != '') + { + $card_image = S3::public_path($this->codeCardType->image); + } + + return [ + 'lcard_uuid' => $this->lcard_uuid, + 'card_number' => $this->card_number, + 'pin' => $this->pin, + 'birthdate' => date('F d, Y',strtotime($this->birthdate)), + 'mobile' => $this->mobile, + 'email' => $this->email, + 'firstname' => $this->personalDetails ? $this->personalDetails->firstname : '', + 'middlename' => $this->personalDetails ? $this->personalDetails->middlename : '', + 'lastname' => $this->personalDetails ? $this->personalDetails->lastname : '', + 'photo' => $photo_url, + 'address' => $this->personalDetails ? $this->personalDetails->address : '', + 'card_type' => $this->codeCardType ? $this->codeCardType->name : '', + 'card_code' => $this->codeCardType ? $this->codeCardType->code : '', + 'card_image' => $card_image, + 'card_bg_image' => $bg_image, + 'card_black_label' => $this->codeCardType ? $this->codeCardType->is_black : 1, + 'vo_code' => $this->codeVehicleOwn ? $this->codeVehicleOwn->code : '', + 'civilstatus_code' => $this->codeCivilStatus ? $this->codeCivilStatus->code : '', + 'gender_code' => $this->codeGender ? $this->codeGender->code : '', + 'fueltype_code' => $this->codeFuelType ? $this->codeFuelType->code : '', + // 'city_uuid' => $city_uuid, + // 'city_name' => $city_name, + 'city_name' => $this->city_name, + 'expiry_date' => $this->expiry_date->toDateString(), + 'points' => $this->total_pts_bal, + ]; + } +} diff --git a/app/Http/Resources/MpinFormValidation.php b/app/Http/Resources/MpinFormValidation.php new file mode 100644 index 0000000..4ebbd8e --- /dev/null +++ b/app/Http/Resources/MpinFormValidation.php @@ -0,0 +1,64 @@ +status = $httpStatusCode; + } + + public function messages() + { + return [ + ]; + } + + + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(Request $request) + { + switch($this->method()) + { + case 'POST': + $rules = [ + 'lcard_uuid' => 'required', + 'mpin' => 'required' + ]; + + return $rules; + break; + default: + } + + } + + public function response(array $errors) + { + return $this->status->mobile_error('Form Validation Error',$errors); + } + +} + +?> + diff --git a/app/Http/Resources/PaymayaTokenResource.php b/app/Http/Resources/PaymayaTokenResource.php new file mode 100644 index 0000000..5f067d9 --- /dev/null +++ b/app/Http/Resources/PaymayaTokenResource.php @@ -0,0 +1,27 @@ +withoutWrapping(); + + return [ + 'card_number' => $this->card_number, + 'customer_id' => $this->customer_id, + 'token' => $this->token, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/app/Http/Resources/PersonalDetailsResource.php b/app/Http/Resources/PersonalDetailsResource.php new file mode 100644 index 0000000..c3e533e --- /dev/null +++ b/app/Http/Resources/PersonalDetailsResource.php @@ -0,0 +1,25 @@ +withoutWrapping(); + + return [ + 'pd_uuid' => $this->pd_uuid, + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + ]; + } +} diff --git a/app/Http/Resources/PhotoSliderResource.php b/app/Http/Resources/PhotoSliderResource.php new file mode 100644 index 0000000..406a239 --- /dev/null +++ b/app/Http/Resources/PhotoSliderResource.php @@ -0,0 +1,50 @@ +withoutWrapping(); + + $promotion = null; + if($this->promotion_id != 0) + { + if(isset($this->promotion->is_active) && $this->promotion->is_active == 1) + { + $promotion = array( + 'promotion_uuid' => $this->promotion->promotion_uuid, + 'title' => $this->promotion->title, + 'date_start' => $this->promotion->date_start, + 'date_end' => $this->promotion->date_end, + ); + } + } + + return [ + 'photoslider_uuid' => $this->photoslider_uuid, + 'type' => $this->promotion_id != 0 ? 'Promo' : 'Non-Promo', + 'promotion' => $promotion, + 'title' => $this->title, + 'description' => $this->description, + 'image' => $this->image != '' ? S3::public_path($this->image) : null, + 'date_start' => $this->date_start, + 'date_end' => $this->date_end, + 'created_at' => $this->created_at != null ? $this->created_at->toDateTimeString() : null, + 'updated_at' => $this->updated_at != null ? $this->updated_at->toDateTimeString() : null, + 'created_by' => $this->created_by != 0 ? CurrentUserHelper::getAdminName($this->created_by) : null, + 'updated_by' => $this->updated_by != 0 ? CurrentUserHelper::getAdminName($this->updated_by) : null, + ]; + } +} diff --git a/app/Http/Resources/PromotionResource.php b/app/Http/Resources/PromotionResource.php new file mode 100644 index 0000000..d552fbc --- /dev/null +++ b/app/Http/Resources/PromotionResource.php @@ -0,0 +1,54 @@ +withoutWrapping(); + + + $stations = array(); + + foreach ($this->promotionStations as $key => $value) { + $stations[] = array( + 'station_uuid' => $value->station->station_uuid, + 'description' => $value->station->description, + ); + } + + return [ + 'promotion_uuid' => $this->promotion_uuid, + 'stations' => $stations, + 'title' => $this->title, + 'description' => $this->description, + 'image' => $this->image != '' ? S3::public_path($this->image) : null, + 'date_start' => $this->date_start, + 'date_end' => $this->date_end, + 'is_toppromotion' => $this->is_toppromotion, + 'is_gps' => $this->is_gps, + 'promo_type' => array( + 'id' => $this->promo_type, + 'name' => StaticContents::promo_type($this->promo_type) + ), + 'status' => StringHelper::check_date_if_between($this->date_start,$this->date_end), + 'created_at' => $this->created_at != null ? $this->created_at->toDateTimeString() : null, + 'updated_at' => ($this->updated_at != null && $this->created_at != $this->updated_at) ? $this->updated_at->toDateTimeString() : null, + 'created_by' => $this->created_by != 0 ? CurrentUserHelper::getAdminName($this->created_by) : null, + 'updated_by' => $this->updated_by != 0 ? CurrentUserHelper::getAdminName($this->updated_by) : null, + ]; + } +} diff --git a/app/Http/Resources/RegistrationResource.php b/app/Http/Resources/RegistrationResource.php new file mode 100644 index 0000000..186f31f --- /dev/null +++ b/app/Http/Resources/RegistrationResource.php @@ -0,0 +1,26 @@ +withoutWrapping(); + + return [ + 'date' => $this->created_at->toDateString(), + 'activated' => $this->activated, + 'registered' => $this->registered, + ]; + } +} diff --git a/app/Http/Resources/ReportMobileUsageResource.php b/app/Http/Resources/ReportMobileUsageResource.php new file mode 100644 index 0000000..e00ce0f --- /dev/null +++ b/app/Http/Resources/ReportMobileUsageResource.php @@ -0,0 +1,27 @@ +withoutWrapping(); + + return [ + 'date' => $this->date->toDateString(), + 'active' => $this->active, + 'inactive' => $this->inactive, + 'locked' => $this->locked, + ]; + } +} diff --git a/app/Http/Resources/ReportStationRatingsResource.php b/app/Http/Resources/ReportStationRatingsResource.php new file mode 100644 index 0000000..f28a74d --- /dev/null +++ b/app/Http/Resources/ReportStationRatingsResource.php @@ -0,0 +1,27 @@ +withoutWrapping(); + + return [ + 'date' => $this->created_at != null ? date('d-M-Y h:i A',strtotime($this->created_at)) : '', + 'card_number' => ($this->loyaltyCard) ? $this->loyaltyCard->card_number : '', + 'invoice' => isset($this->payment->trans_num)? $this->payment->trans_num : '', + 'station' => $this->station->description, + 'rate' => $this->rate, + ]; + } +} diff --git a/app/Http/Resources/ReportTopUpResource.php b/app/Http/Resources/ReportTopUpResource.php new file mode 100644 index 0000000..164df1c --- /dev/null +++ b/app/Http/Resources/ReportTopUpResource.php @@ -0,0 +1,27 @@ +withoutWrapping(); + + return [ + 'payment_uuid' => $this->payment_uuid, + 'date' => $this->paid_at != null ? date('d-M-Y h:i A',strtotime($this->paid_at)) : '', + // 'time' => $this->paid_at != null ? date('h:i A',strtotime($this->paid_at)) : '', + 'card_number' => isset($this->loyaltyCard->card_number) ? $this->loyaltyCard->card_number : '', + 'amount' => $this->amount, + ]; + } +} diff --git a/app/Http/Resources/StationLocatorResource.php b/app/Http/Resources/StationLocatorResource.php new file mode 100644 index 0000000..e4d0f28 --- /dev/null +++ b/app/Http/Resources/StationLocatorResource.php @@ -0,0 +1,29 @@ +withoutWrapping(); + + return [ + 'station_uuid' => $this->station_uuid, + 'name' => $this->description, + 'address' => $this->address, + 'longitude' => $this->longitude, + 'latitude' => $this->latitude, + 'stars' => round($this->average), + 'favorite' => $this->favorite > 0 ? true : false, + ]; + } +} diff --git a/app/Http/Resources/StationSearchResource.php b/app/Http/Resources/StationSearchResource.php new file mode 100644 index 0000000..d5f8e65 --- /dev/null +++ b/app/Http/Resources/StationSearchResource.php @@ -0,0 +1,25 @@ +withoutWrapping(); + + return [ + 'city_uuid' => $this->city_uuid, + 'name' => $this->city_name, + 'count' => $this->station_count, + ]; + } +} diff --git a/app/Http/Resources/SystemPreferencesResource.php b/app/Http/Resources/SystemPreferencesResource.php new file mode 100644 index 0000000..bfaae3d --- /dev/null +++ b/app/Http/Resources/SystemPreferencesResource.php @@ -0,0 +1,25 @@ +withoutWrapping(); + + return [ + 'sp_uuid' => $this->sp_uuid, + 'name' => $this->name, + 'value' => $this->value, + ]; + } +} diff --git a/app/Http/Resources/TermsAndPrivacyResource.php b/app/Http/Resources/TermsAndPrivacyResource.php new file mode 100644 index 0000000..ce09ebd --- /dev/null +++ b/app/Http/Resources/TermsAndPrivacyResource.php @@ -0,0 +1,33 @@ +withoutWrapping(); + + return [ + 'tp_uuid' => $this->tp_uuid, + 'title' => $this->title, + // 'details' => $this->concatDetails($this->details), + 'details' => $this->details, + 'type' => $this->type, + ]; + } + + // function concatDetails($details) + // { + // return strlen($details) < 100 ? $details : substr($details, 0, 100)."..."; + // } + +} diff --git a/app/Http/Resources/TopUpResource.php b/app/Http/Resources/TopUpResource.php new file mode 100644 index 0000000..75d4ee3 --- /dev/null +++ b/app/Http/Resources/TopUpResource.php @@ -0,0 +1,27 @@ +withoutWrapping(); + + return [ + 'topup_uuid' => $this->topup_uuid, + 'fee_code' => $this->fee_code, + 'name' => $this->name, + 'type' => $this->type == 1 ? 'PH peso' : 'Percentage', + 'amount' => number_format($this->amount, 2, '.','') + ]; + } +} diff --git a/app/IDNumberType.php b/app/IDNumberType.php new file mode 100644 index 0000000..ce55d13 --- /dev/null +++ b/app/IDNumberType.php @@ -0,0 +1,36 @@ +random_key = rand(1001,5000); + $this->date = Carbon::now()->format('Ymd'); + $this->uri = new Uri(Config::get('app.cyware')); + $this->url = Config::get('app.cyware'); + } + + protected $url; + + protected $user = "APP"; + protected $branch = "APP"; + protected $cashier = "APP"; + protected $entry_type = "APP"; + protected $payment_type = "CC"; + protected $item_code = "PREPAID"; + + protected $register_num = "1"; + protected $dummy_transactions = false; + protected $dummy_id_entry = false; + protected $dummy_app_entry = false; + protected $dummy_data_success = false; + + public $response; + public $status_code; + +// generated + private $random_key; + private $date; + private $card_number; + private $uri; + +// user inputs + private $called_function = ""; + private $dummy_data = ""; + private $first_name; + private $last_name; + private $birthday; + private $mobile; + private $email; + private $address; + + private $pin; + private $start_date; + private $end_date; + private $si_num; + private $total_amount; + private $civil_status_code; + private $gender_code; + private $occupation_code; + private $number_cars; + private $is_petron; + private $is_phoenix; + private $is_shell; + private $is_flyingv; + private $is_caltex; + private $is_ptt; + private $is_total; + private $is_jetti; + private $is_seaoil; + private $is_sm; + private $is_robinson; + private $is_cebupacific; + private $is_petronv; + private $is_bdo; + private $is_mabuhay; + private $is_starbucks; +// private $is_s&r; // this is to be checked r only + private $snr; + private $is_national; + private $is_happy; + private $is_mercury; + private $fuel_type; + private $vehicle_own; + private $city_code; + private $card_type_code; + private $id_number; + private $lcard_id; + private $user_id; + + /** + * @return mixed + */ + public function getOccupationCode() + { + return $this->occupation_code; + } + + /** + * @param mixed $occupation_code + */ + public function setOccupationCode($occupation_code): void + { + $this->occupation_code = $occupation_code; + } + + /** + * @return mixed + */ + public function getNumberCars() + { + return $this->number_cars; + } + + /** + * @param mixed $number_cars + */ + public function setNumberCars($number_cars): void + { + $this->number_cars = $number_cars; + } + + /** + * @return mixed + */ + public function getisPetron() + { + return $this->is_petron; + } + + /** + * @param mixed $is_petron + */ + public function setIsPetron($is_petron): void + { + $this->is_petron = $is_petron; + } + + /** + * @return mixed + */ + public function getisPhoenix() + { + return $this->is_phoenix; + } + + /** + * @param mixed $is_phoenix + */ + public function setIsPhoenix($is_phoenix): void + { + $this->is_phoenix = $is_phoenix; + } + + /** + * @return mixed + */ + public function getisShell() + { + return $this->is_shell; + } + + /** + * @param mixed $is_shell + */ + public function setIsShell($is_shell): void + { + $this->is_shell = $is_shell; + } + + /** + * @return mixed + */ + public function getisFlyingv() + { + return $this->is_flyingv; + } + + /** + * @param mixed $is_flyingv + */ + public function setIsFlyingv($is_flyingv): void + { + $this->is_flyingv = $is_flyingv; + } + + /** + * @return mixed + */ + public function getisCaltex() + { + return $this->is_caltex; + } + + /** + * @param mixed $is_caltex + */ + public function setIsCaltex($is_caltex): void + { + $this->is_caltex = $is_caltex; + } + + /** + * @return mixed + */ + public function getisPtt() + { + return $this->is_ptt; + } + + /** + * @param mixed $is_ptt + */ + public function setIsPtt($is_ptt): void + { + $this->is_ptt = $is_ptt; + } + + /** + * @return mixed + */ + public function getisTotal() + { + return $this->is_total; + } + + /** + * @param mixed $is_total + */ + public function setIsTotal($is_total): void + { + $this->is_total = $is_total; + } + + /** + * @return mixed + */ + public function getisJetti() + { + return $this->is_jetti; + } + + /** + * @param mixed $is_jetti + */ + public function setIsJetti($is_jetti): void + { + $this->is_jetti = $is_jetti; + } + + /** + * @return mixed + */ + public function getisSeaoil() + { + return $this->is_seaoil; + } + + /** + * @param mixed $is_seaoil + */ + public function setIsSeaoil($is_seaoil): void + { + $this->is_seaoil = $is_seaoil; + } + + /** + * @return mixed + */ + public function getisSm() + { + return $this->is_sm; + } + + /** + * @param mixed $is_sm + */ + public function setIsSm($is_sm): void + { + $this->is_sm = $is_sm; + } + + /** + * @return mixed + */ + public function getisRobinson() + { + return $this->is_robinson; + } + + /** + * @param mixed $is_robinson + */ + public function setIsRobinson($is_robinson): void + { + $this->is_robinson = $is_robinson; + } + + /** + * @return mixed + */ + public function getisCebupacific() + { + return $this->is_cebupacific; + } + + /** + * @param mixed $is_cebupacific + */ + public function setIsCebupacific($is_cebupacific): void + { + $this->is_cebupacific = $is_cebupacific; + } + + /** + * @return mixed + */ + public function getisPetronv() + { + return $this->is_petronv; + } + + /** + * @param mixed $is_petronv + */ + public function setIsPetronv($is_petronv): void + { + $this->is_petronv = $is_petronv; + } + + /** + * @return mixed + */ + public function getisBdo() + { + return $this->is_bdo; + } + + /** + * @param mixed $is_bdo + */ + public function setIsBdo($is_bdo): void + { + $this->is_bdo = $is_bdo; + } + + /** + * @return mixed + */ + public function getisMabuhay() + { + return $this->is_mabuhay; + } + + /** + * @param mixed $is_mabuhay + */ + public function setIsMabuhay($is_mabuhay): void + { + $this->is_mabuhay = $is_mabuhay; + } + + /** + * @return mixed + */ + public function getisStarbucks() + { + return $this->is_starbucks; + } + + /** + * @param mixed $is_starbucks + */ + public function setIsStarbucks($is_starbucks): void + { + $this->is_starbucks = $is_starbucks; + } + + /** + * @return mixed + */ + public function getSnr() + { + return $this->snr; + } + + /** + * @param mixed $r + */ + public function setR($snr): void + { + $this->snr = $snr; + } + + /** + * @return mixed + */ + public function getisNational() + { + return $this->is_national; + } + + /** + * @param mixed $is_national + */ + public function setIsNational($is_national): void + { + $this->is_national = $is_national; + } + + /** + * @return mixed + */ + public function getisHappy() + { + return $this->is_happy; + } + + /** + * @param mixed $is_happy + */ + public function setIsHappy($is_happy): void + { + $this->is_happy = $is_happy; + } + + /** + * @return mixed + */ + public function getisMercury() + { + return $this->is_mercury; + } + + /** + * @param mixed $is_mercury + */ + public function setIsMercury($is_mercury): void + { + $this->is_mercury = $is_mercury; + } + + /** + * @return mixed + */ + public function getFuelType() + { + return $this->fuel_type; + } + + /** + * @param mixed $fuel_type + */ + public function setFuelType($fuel_type): void + { + $this->fuel_type = $fuel_type; + } + + /** + * @return mixed + */ + public function getVehicleOwn() + { + return $this->vehicle_own; + } + + /** + * @param mixed $vehicle_own + */ + public function setVehicleOwn($vehicle_own): void + { + $this->vehicle_own = $vehicle_own; + } + + /** + * @return mixed + */ + public function getGenderCode() + { + return $this->gender_code; + } + + /** + * @param mixed $gender_code + */ + public function setGenderCode($gender_code): void + { + $this->gender_code = $gender_code; + } + + /** + * @return mixed + */ + public function getCivilStatusCode() + { + return $this->civil_status_code; + } + + /** + * @param mixed $civil_status_code + */ + public function setCivilStatusCode($civil_status_code): void + { + $this->civil_status_code = $civil_status_code; + } + + /** + * @return mixed + */ + public function getAddress() + { + return $this->address; + } + + /** + * @param mixed $address + */ + public function setAddress($address): void + { + $this->address = $address; + } + + /** + * @return string + */ + public function getPaymentType(): string + { + return $this->payment_type; + } + + /** + * @param string $payment_type + */ + public function setPaymentType(string $payment_type): void + { + $this->payment_type = $payment_type; + } + + /** + * @return string + */ + public function getItemCode(): string + { + return $this->item_code; + } + + /** + * @param string $item_code + */ + public function setItemCode(string $item_code): void + { + $this->item_code = $item_code; + } + + /** + * @return mixed + */ + public function getTotalAmount() + { + return $this->total_amount; + } + + /** + * @param mixed $total_amount + */ + public function setTotalAmount($total_amount): void + { + $this->total_amount = $total_amount; + } + + /** + * @return mixed + */ + public function getSiNum() + { + return $this->si_num; + } + + /** + * @param mixed $si_num + */ + public function setSiNum($si_num): void + { + $this->si_num = $si_num; + } + + /** + * @return string + */ + public function getRegisterNum(): string + { + return $this->register_num; + } + + /** + * @param string $register_num + */ + public function setRegisterNum(string $register_num): void + { + $this->register_num = $register_num; + } + + /** + * @return string + */ + public function getCashier(): string + { + return $this->cashier; + } + + /** + * @param string $cashier + */ + public function setCashier(string $cashier): void + { + $this->cashier = $cashier; + } + + /** + * @return string + */ + public function getEntryType(): string + { + return $this->entry_type; + } + + /** + * @param string $entry_type + */ + public function setEntryType(string $entry_type): void + { + $this->entry_type = $entry_type; + } + + + /** + * @return mixed + */ + + function setCardNumber($card_number) + { + $this->card_number = $card_number; + } + + /** + * @return mixed + */ + + function getCardNumber() + { + return $this->card_number; + } + + /** + * @return mixed + */ + + function setBirthday($birthday) + { + $this->birthday = $birthday; + } + + /** + * @return mixed + */ + + function getBirthday() + { + return $this->birthday; + } + + /** + * @return mixed + */ + + public function getStartDate() + { + return $this->start_date; + } + + /** + * @param mixed $start_date + */ + + public function setStartDate($start_date): void + { + $this->start_date = $start_date; + } + + /** + * @return mixed + */ + + public function getEndDate() + { + return $this->end_date; + } + + /** + * @param mixed $end_date + */ + + public function setEndDate($end_date): void + { + $this->end_date = $end_date; + } + + /** + * @return mixed + */ + + public function getBranch() + { + return $this->branch ?? 'APP'; + } + + /** + * @param mixed $branch + */ + + public function setBranch($branch): void + { + $this->branch = $branch; + } + + /** + * @return mixed + */ + + public function getPin() + { + return $this->pin; + } + + /** + * @param mixed $pin + */ + + public function setPin($pin): void + { + $this->pin = $pin; + } + + /** + * @return mixed + */ + + public function getFirstName() + { + return $this->first_name; + } + + /** + * @param mixed $first_name + */ + + public function setFirstName($first_name): void + { + $this->first_name = $first_name; + } + + /** + * @return mixed + */ + + public function getLastName() + { + return $this->last_name; + } + + /** + * @param mixed $last_name + */ + + public function setLastName($last_name): void + { + $this->last_name = $last_name; + } + + /** + * @return mixed + */ + + public function getMobile() + { + return $this->mobile; + } + + /** + * @param mixed $mobile + */ + + public function setMobile($mobile): void + { + $this->mobile = $mobile; + } + + /** + * @return mixed + */ + + public function getEmail() + { + return $this->email; + } + + /** + * @param mixed $email + */ + + public function setEmail($email): void + { + $this->email = $email; + } + + /** + * @return mixed + */ + + public function getCardTypeCode() + { + return $this->card_type_code; + } + + /** + * @param mixed $card_type_code + */ + + public function setCardTypeCode($card_type_code): void + { + $this->card_type_code = $card_type_code; + } + + /** + * @return mixed + */ + + public function getIDNumber() + { + return $this->id_number; + } + + /** + * @param mixed $id_number + */ + + public function setIDNumber($id_number): void + { + $this->id_number = $id_number; + } + + /** + * @return mixed + */ + + public function getLcardID() + { + return $this->lcard_id; + } + + /** + * @param mixed $id_number + */ + + public function setLcardID($lcard_id): void + { + $this->lcard_id = $lcard_id; + } + + /** + * @return mixed + */ + + public function getUserID() + { + return $this->user_id; + } + + /** + * @param mixed $id_number + */ + + public function setUserID($user_id): void + { + $this->user_id = $user_id; + } + + /** + * @return mixed + */ + + public function getCityCode() + { + return $this->city_code; + } + + /** + * @param mixed $mobile + */ + + public function setCityCode($city_code): void + { + $this->city_code = $city_code; + } + + public function create_request($params) + { + $client = new Client(); + try{ + $response = $client->request('GET', $this->url, [ + 'query' => $params, + 'http_errors' => false + ]); + $this->setResponse($response); + + // $request = $client->get($this->uri->withQuery(http_build_query($params))); + // $this->setResponse($request); + } + catch (RequestException $e) + { + if ($e->hasResponse()) + { + $this->response = $e->getResponse()->getBody()->getContents(); + } + } + } + + function setResponse($var) + { + // for dummy data + $bypass = false; + if( + ($this->called_function == "state_trans" && $this->dummy_transactions == true) || + ($this->called_function == "state_id_entry" && $this->dummy_id_entry == true) || + ($this->called_function == "state_app_entry" && $this->dummy_app_entry == true) + ) + { + $bypass = true; + } + + $return = []; + if($bypass == true || $var->getStatusCode() == '200') + { + if($bypass == true) + $result = $this->dummy_data; + else + $result = json_decode($var->getBody()->getContents()); + + $return['data'] = null; + if (isset($result->loyalty->status->sql)) + { + if ($result->loyalty->status->sql == 'success' ) + { + if ( isset($result->loyalty->data) ) + { + // dd($result->loyalty->data); + if ( count($result->loyalty->data) == 1 ) + { + $return['data'] = $result->loyalty->data[0]; + + } + else + { + $return['data'] = isset($result->loyalty->data) ? $result->loyalty->data : null; + } + + $return['message'] = $result->loyalty->status->sql == 'success' ? 'Success' : $result->loyalty->status->result ; + + } + else + { + // $return['message'] = $result->loyalty->status->sql == 'success' ? $result->loyalty->status->success : $result->loyalty->status->result ; + $return['message'] = $result->loyalty->status->sql == 'success' ? $result->loyalty->status->sql : $result->loyalty->status->result ; + + + // include other arrays in $result->loyalty->status + $other = collect($result->loyalty->status); + if(count($other) > 0) + { + foreach ($other as $k => $v) { + if($k != 'sql') + $return[$k] = $v; + } + } + } + } + } + else + { + $return['message'] = isset($result) ? $result->loyalty->status->result : null; + } + } + else + { + $return['message'] = "Cyware Internal Server Error"; + } + + $return['status_code'] = $bypass == true ? 200 : $var->getStatusCode(); + $this->response = $return; + } + + function setBadResponse($message) + { + $return['data'] = null; + $return['message'] = $message; + $return['status_code'] = "500"; + $this->response = $return; + } + + function getResponse() + { + return $this->response ?? null; + } + + function validate_card_number($card_number){ + if(strlen($card_number) == 0 ){ + return false; + } + + if(strlen($card_number) > 16 ){ + return false; + } + if(!is_numeric($card_number) ){ + return false; + } + return $card_number; + } + + private function vendor_key(){ + return md5('UPPI'.$this->card_number.$this->random_key.$this->date); + } + + private function vendor_key_mobile(){ + return md5('UPPI'.$this->mobile.$this->random_key.$this->date); + } + + private function vendor_key_id_number(){ + return md5('UPPI'.$this->id_number.$this->random_key.$this->date); + } + + private function vendor_key_sign_up(){ + return md5('UPPI'.$this->user_id.$this->random_key.$this->date); + } + + public function state_validate() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + // if (!$this->getBirthday()){ + // $this->setBadResponse("Birthday is not valid"); + // return false; + // } + + $params = array( + 'birthdate' => $this->getBirthday(), + 'yyyymmdd' => $this->date, + 'card_number'=> $this->getCardNumber(), + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_validate' + ); + + $this->create_request($params); + } + + public function state_mobilevalidate() + { + $params = array( + 'yyyymmdd' => $this->date, + 'mobile_number' => $this->getMobile(), + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key_mobile(), + 'state' => 'state_mobile' + ); + $this->create_request($params); + } + + public function state_entry() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + $params = array( + 'first_name' => $this->getFirstName(), + 'last_name' => $this->getLastName(), + 'birthdate' => $this->getBirthday(), + 'mobile' => $this->getMobile(), + 'email' => $this->getEmail(), + 'user' => $this->user, + 'branch' => $this->getBranch(), + 'card_number' => $this->getCardNumber(), + 'pin' => $this->getPin(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_entry' + ); + + $this->create_request($params); + } + + public function state_trans() + { + $this->called_function = "state_trans"; + if(!$this->dummy_transactions) + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + if ($this->getStartDate() > $this->getEndDate() ){ + $this->setBadResponse("Start Date is Greater than End Date"); + return false; + } + + $params = array( + 'card_number' => $this->getCardNumber(), + 'user' => $this->user, + 'branch' => $this->getBranch(), + 'start_date' => $this->getStartDate(), + 'end_date' => $this->getEndDate(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_trans' + ); + + $this->create_request($params); + } + else + { + $this->dummy_data = $this->_get_state_trans_dummy($this->dummy_data_success); + $this->setResponse([]); + } + } + + public function state_promo() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + $params = array( + 'card_number' => $this->getCardNumber(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_promo' + ); + + $this->create_request($params); + } + + public function state_retrieve() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + $params = array( + 'card_number' => $this->getCardNumber(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_retrieve' + ); + + $this->create_request($params); + } + + public function state_update() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + if (!$this->validate_civil_status_code($this->getCivilStatusCode())){ + $this->setBadResponse("Civil Status Code is not valid"); + return false; + } + + if (!$this->validate_gender_code($this->getGenderCode())){ + $this->setBadResponse("Gender Code is not valid"); + return false; + } + + $params = array( + 'card_number' => $this->getCardNumber(), + 'user' => $this->user, + 'branch' => $this->branch, + + 'first_name' => $this->getFirstName(), + 'last_name' => $this->getLastName(), + 'address' => $this->getAddress() . ($this->getCityCode() != '' ? $this->getCityCode() : ''), + 'mobile' => $this->getMobile(), + 'email' => $this->getEmail(), + + 'vehicle_own' => $this->getVehicleOwn(), + 'fuel_type' => $this->getFuelType(), + + 'civil_status_code' => $this->getCivilStatusCode(), + 'gender_code' => $this->getGenderCode(), + 'occupation_code' => $this->getOccupationCode(), + 'number_cars' => $this->getNumberCars(), + 'is_petron' => $this->getisPetron(), + 'is_phoenix' => $this->getisPhoenix(), + 'is_shell' => $this->getisShell(), + 'is_flyingv' => $this->getisFlyingv(), + 'is_caltex' => $this->getisCaltex(), + 'is_ptt' => $this->getisPtt(), + 'is_total' => $this->getisTotal(), + 'is_jetti' => $this->getisJetti(), + 'is_seaoil' => $this->getisSeaoil(), + 'is_sm' => $this->getisSm(), + 'is_robinson' => $this->getisRobinson(), + 'is_cebupacific' => $this->getisCebupacific(), + 'is_petronv' => $this->getisPetronv(), + 'is_bdo' => $this->getisBdo(), + 'is_mabuhay' => $this->getisMabuhay(), + 'is_starbucks' => $this->getisStarbucks(), + 'is_s&r' => $this->getSnr(), + 'is_national' => $this->getisNational(), + 'is_happy' => $this->getisHappy(), + 'is_mercury' => $this->getisMercury(), + + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_update' + ); + + + $this->create_request($params); + } + + + public function state_points() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + $params = array( + 'card_number' => $this->getCardNumber(), + 'cashier' => $this->getCashier(), + 'branch' => $this->getBranch(), + 'entry_type' => $this->getEntryType(), + 'register_num' => $this->getRegisterNum(), + 'si_num' => $this->getSiNum(), + 'total_amount' => $this->getTotalAmount(), + 'payment_type' => $this->getPaymentType(), + 'item_code' => $this->getItemCode(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_points' + ); + +// $client = new Client(); +// $request = $client->get($this->uri->withQuery(http_build_query($params))); +// $result = json_decode($request->getBody()->getContents()); +// +// dd($result); + + $this->create_request($params); + } + + public function state_redeemed() + { + if (!$this->validate_card_number($this->getCardNumber())){ + $this->setBadResponse("Card Number is not valid"); + return false; + } + + if ($this->getStartDate() > $this->getEndDate() ){ + $this->setBadResponse("Start Date is Greater than End Date"); + return false; + } + + $params = array( + 'card_number' => $this->getCardNumber(), + 'start_date' => $this->getStartDate(), + 'end_date' => $this->getEndDate(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key(), + 'state' => 'state_redeemed' + ); + + $this->create_request($params); + } + + public function state_id_entry() + { + $this->called_function = "state_id_entry"; + if(!$this->dummy_id_entry) + { + $params = array( + 'card_type_code'=> $this->getCardTypeCode(), + 'id_number' => $this->getIDNumber(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key_id_number(), + 'state' => 'state_id_entry' + ); + + $this->create_request($params); + } + else + { + $this->dummy_data = $this->_get_state_id_entry_dummy($this->dummy_data_success); + $this->setResponse([]); + } + } + + public function state_app_entry() + { + $this->called_function = "state_app_entry"; + if(!$this->dummy_app_entry) + { + $params = array( + 'user' => $this->user, + 'branch' => $this->getBranch(), + 'card_type_code' => $this->getCardTypeCode(), + 'user_id' => $this->getUserID(), // for confirmation + 'first_name' => $this->getFirstName(), + 'last_name' => $this->getLastName(), + 'birthdate' => $this->getBirthday(), + 'mobile' => $this->getMobile(), + 'email' => $this->getEmail(), + 'id_number' => $this->getIDNumber(), + 'yyyymmdd' => $this->date, + 'random_key' => $this->random_key, + 'vendor_key' => $this->vendor_key_sign_up(), + 'state' => 'state_app_entry' + ); + + $this->create_request($params); + } + else + { + $this->dummy_data = $this->_get_state_app_entry_dummy($this->dummy_data_success); + $this->setResponse([]); + } + } + + private function validate_civil_status_code($getCivilStatusCode) + { + $array = array( + "S" => "SINGLE", + "M" => "MARRIED", + "0" => "NO DATA ENTERED", + "W" => "WIDOW", + "SE" => "SEPARATED", + ); + return $array[$getCivilStatusCode] ? true : false; + } + + private function validate_gender_code($gender_code) + { + $array = array( + "0"=>"NO DATA ENTERED", + "M"=>"MALE", + "F"=>"FEMALE", + ); + return $array[$gender_code] ? true : false; + } + +//todo please remove validation on library. + + + /* + |======================================================================================= + | DUMMY DATA + |======================================================================================= + */ + + private function _get_state_trans_dummy($success = true) + { + if($success) + { + $data = '{ + "loyalty": { + "status": { + "rows": "0", + "sql": "success", + "result": "ok" + }, + "data": [ + { + "ref_num": "APP-190329000001.00", + "store_id": "APP", + "store_name": "APP", + "date": "2019-03-03", + "time": "0624", + "trans_num": "'.$this->getLcardID().'0329000001.00", + "reward_code": "SHARED", + "reward_desc": "SHARED", + "total_amount": "1.00", + "total_points": "1.00", + "items": [ + { + "item_code": "G00000001012", + "item_desc": "Beef Bowl", + "qty": "1.00", + "price": "1.00" + } + ] + }, + { + "ref_num": "1032-310838", + "store_id": "1032", + "store_name": "UNIOIL MINDANAO AVENUE 1", + "date": "2019-03-02", + "time": "1029", + "entry_type_code": "BP2", + "entry_type_desc": "BONUS POINTS LEVEL 2", + "trans_num": "'.$this->getLcardID().'310838", + "total_amount": "1000000", + "total_points": "100.00", + "items": [ + { + "item_code": "SAMPLE", + "item_desc": "sample", + "qty": "1", + "price": "1000000" + } + ] + }, + { + "ref_num": "1032-255345", + "store_id": "1032", + "store_name": "UNIOIL MINDANAO AVENUE 1", + "date": "2019-03-04", + "time": "1431", + "entry_type_code": "1", + "entry_type_desc": "POS", + "trans_num": "'.$this->getLcardID().'255345", + "total_amount": "2600.01", + "total_points": "13.00", + "items": [ + { + "item_code": "ID944070", + "item_desc": "ID SN/CF 5W-40 FS (24X1)", + "qty": "1.00", + "price": "650.00" + }, + { + "item_code": "ID944070", + "item_desc": "ID SN/CF 5W-40 FS (24X1)", + "qty": "1.00", + "price": "650.00" + }, + { + "item_code": "ID944070", + "item_desc": "ID SN/CF 5W-40 FS (24X1)", + "qty": "1.00", + "price": "650.00" + }, + { + "item_code": "ID944070", + "item_desc": "ID SN/CF 5W-40 FS (24X1)", + "qty": "1.00", + "price": "650.00" + }, + { + "item_code": "FAD 17LOTUSEVORAS", + "item_desc": "(FREE) LOTUS EVORA S", + "qty": "1.00", + "price": "0.01" + } + ] + } + ] + } + }'; + } + else + { + $data = '{ + "loyalty": { + "status": { + "rows": "0", + "No Records Found": "No Records Found", + "result": "No Records Found" + } + } + }'; + } + + return json_decode($data); + } + + private function _get_state_id_entry_dummy($success = true) + { + if($success) + { + $data = '{ + "loyalty": { + "status": { + "rows": "1", + "sql": "success", + "result ": "Valid ID Number" + } + } + }'; + } + else + { + $data = '{ + "loyalty": { + "status": { + "rows": "0", + " card_type_code": "card_type_code ", + "result": "Invalid Card Type " + } + } + }'; + } + + return json_decode($data); + } + + private function _get_state_app_entry_dummy($success = true) + { + if($success) + { + $data = '{ + "loyalty": { + "status": { + "rows": "1", + "sql": "success", + "card_number": "11000000000'.StringHelper::random_num(5).'", + "pin": "'.StringHelper::random_num(8).'" + } + } + }'; + } + else + { + $data = '{ + "loyalty": { + "status": { + "rows": "0", + " birthdate": " birthdate ", + "result": "Invalid birthdate" + } + } + }'; + } + + return json_decode($data); + } + +} diff --git a/app/Libraries/ListHelper.php b/app/Libraries/ListHelper.php new file mode 100644 index 0000000..6f58231 --- /dev/null +++ b/app/Libraries/ListHelper.php @@ -0,0 +1,20 @@ + 0 && $page > 0) { + return true; + } + return false; + } +} diff --git a/app/Libraries/M360.php b/app/Libraries/M360.php new file mode 100644 index 0000000..f52d697 --- /dev/null +++ b/app/Libraries/M360.php @@ -0,0 +1,156 @@ +url = new Uri(env("M360_BROADCAST_URL", 'https://smsapi.mobile360.ph/v2/api/broadcast')); + $this->username = env("M360_BROADCAST_USERNAME", 'unioil'); + $this->password = env("M360_BROADCAST_PASSWORD", 'l42Bvzh5'); + $this->shortcode_mask = env("M360_BROADCAST_SHORTCODE", 'UNIOIL'); + $this->success = false; + $this->environment = env("M360_ENV", 'TEST'); + } + + public function get_url(){ return $this->url; } + public function set_url($var){ $this->url = $var; } + + public function get_username(){ return $this->username; } + public function set_username($var){ $this->username = $var; } + + public function get_password(){ return $this->password; } + public function set_password($var){ $this->password = $var; } + + public function get_shortcode_mask(){ return $this->shortcode_mask; } + public function set_shortcode_mask($var){ $this->shortcode_mask = $var; } + + public function get_content(){ return $this->content; } + public function set_content($var){ $this->content = $var; } + + public function get_msisdn(){ return $this->msisdn; } + public function set_msisdn($var){ $this->msisdn = $var; } + + public function get_rcvd_transid(){ return $this->rcvd_transid; } + public function set_rcvd_transid($var){ $this->rcvd_transid = $var; } + + public function get_transid(){ return $this->transid; } + public function set_transid($var){ $this->transid = $var; } + + public function get_timestamp(){ return $this->timestamp; } + public function set_timestamp($var){ $this->timestamp = $var; } + + public function get_response_code(){ return $this->response_code; } + public function set_response_code($var){ $this->response_code = $var; } + + public function get_response_name(){ return $this->response_name; } + public function set_response_name($var){ $this->response_name = $var; } + + public function get_response_message(){ return $this->response_message; } + public function set_response_message($var){ $this->response_message = $var; } + + public function success(){ return $this->success; } + + + public function send() + { + $params = [ + 'username' => $this->get_username(), + 'password' => $this->get_password(), + 'msisdn' => $this->environment == 'TEST' ? env("M360_TEST_MOBILE", '09231191959') : $this->get_msisdn(), + 'content' => $this->get_content(), + 'shortcode_mask' => $this->get_shortcode_mask(), + 'rcvd_transid' => $this->get_rcvd_transid(), + ]; + + if($this->environment != 'LOCAL') + { + + $client = new Client(); + try + { + $response = $client->post($this->url->withQuery(http_build_query($params))); + $this->setResponse($response); + } + catch (RequestException $e) + { + if ($e->hasResponse()) { + $response = json_decode($e->getResponse()->getBody()->getContents()); + + $this->set_response_code($response->code); + $this->set_response_name($response->name); + + if(isset($response->message)) + $this->set_response_message($response->message); + } + } + } + else + { + $this->fakeResponse(); + } + } + + public function setResponse($response) + { + $result = json_decode($response->getBody()->getContents()); + + $this->set_response_code($result->code); + $this->set_response_name($result->name); + + if($result->code == 201) + { + $this->set_transid($result->transid); + $this->set_timestamp($result->timestamp); + + $this->success = true; + } + else + { + if(isset($result->message)) + $this->set_response_message($result->message); + } + } + + public function fakeResponse() + { + $this->set_response_code(201); + $this->set_response_name('Created'); + $this->set_transid('testing'); + $this->set_timestamp(date('YmdHis')); + $this->success = true; + } + + + + +} diff --git a/app/Libraries/ParameterHelper.php b/app/Libraries/ParameterHelper.php new file mode 100644 index 0000000..97183dd --- /dev/null +++ b/app/Libraries/ParameterHelper.php @@ -0,0 +1,111 @@ + $value) { + if ($key == 'page_size') { + $parameter['page_size'] = $value; + } + if ($key == 'page') { + $parameter['page'] = $value; + } + } + return $parameter; + } + + /** + * Validate and prepare sorting order of model based on query string parameter + * @param Request $request + * @return array + */ + public static function prepareSortingParameter(Request $request) + { + $response = []; + + if ($request->has('_sort_by') && $request->has('_sort_order')) { + if ($request->get('_sort_by') != '') { + $response['field'] = $request->get('_sort_by'); + } + if ($request->get('_sort_order') != '') { + $response['sort_order'] = $request->get('_sort_order'); + } + } + + return $response; + } + + /** + * Prepare simple search parameters that will be used for eloquent + * @param array $fields + * @param string $value + * @return array + */ + public static function prepareSimpleSearchParameter($fields = [], $value = '') + { + $response = []; + foreach ($fields as $field) { + $response[] = [$field, 'LIKE', '%'.$value.'%']; + } + return $response; + } + + /** + * Prepare parameter for multiple storing of resource with timestamp + * @param array $request + * @return array + */ + public static function prepareMultipleResource($request = []) + { + $parameters = []; + foreach ($request as $param) { + foreach ($param as $key => $value) { + $resource[$key] = $value; + } + $resource['created_at'] = Carbon::now(); + $resource['updated_at'] = Carbon::now(); + $parameters[] = $resource; + } + return $parameters; + } + + /** + * Validate and prepare grouping of model based on query string parameter + * @param Request $request + * @return array + */ + public static function prepareGroupingParameter(Request $request) + { + $response = []; + if ($request->has('group_by')) { + if ($request->get('group_by') != '') { + $response['group_by'] = $request->get('group_by'); + } + } + return $response; + } + + public static function validateStartEndDate($params) + { + if($params['date_start'] != null && $params['date_end'] != null) + { + if(strtotime($params['date_start']) > strtotime($params['date_end'])) + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/app/Libraries/Paypal.php b/app/Libraries/Paypal.php new file mode 100644 index 0000000..7f02f0b --- /dev/null +++ b/app/Libraries/Paypal.php @@ -0,0 +1,307 @@ +url = new Uri(env("PAYPAL_SANDBOX_URL", '')); + $this->client_id = env("PAYPAL_SANDBOX_CLIENTID", ''); + $this->secret = env("PAYPAL_SANDBOX_SECRET", ''); + } + else + { + $this->url = new Uri(env("PAYPAL_LIVE_URL", '')); + $this->client_id = env("PAYPAL_LIVE_CLIENTID", ''); + $this->secret = env("PAYPAL_LIVE_SECRET", ''); + } + + $this->return_url = env("FRONT_END_URL", '').'/topup-success-page'; + $this->cancel_url = env("FRONT_END_URL", '').'/topup-error-page'; + + } + + public function set_amount($var){ $this->amount = $var; } + + public function set_invoice_number($var){ $this->invoice_number = $var; } + public function get_invoice_number(){ return $this->invoice_number; } + + public function set_trans_num($var){ $this->trans_num = $var; } + public function get_trans_num(){ return $this->trans_num; } + + public function set_paypal_id($var){ $this->paypal_id = $var; } + public function get_paypal_id(){ return $this->paypal_id; } + + public function set_self_url($var){ $this->self_url = $var; } + public function get_self_url(){ return $this->self_url; } + + public function set_approval_url($var){ $this->approval_url = $var; } + public function get_approval_url(){ return $this->approval_url; } + + public function set_execute_url($var){ $this->execute_url = $var; } + public function get_execute_url(){ return $this->execute_url; } + + public function set_payer_id($var){ $this->payer_id = $var; } + public function get_payer_id(){ return $this->payer_id; } + + public function set_response($var){ $this->response = $var; } + public function get_response(){ return $this->response; } + + public function set_error_message($var){ $this->error_message = $var; } + public function get_error_message(){ return $this->error_message; } + + public function set_payer_firstname($var){ $this->payer_firstname = $var; } + public function get_payer_firstname(){ return $this->payer_firstname; } + + public function set_payer_lastname($var){ $this->payer_lastname = $var; } + public function get_payer_lastname(){ return $this->payer_lastname; } + + public function set_payer_email($var){ $this->payer_email = $var; } + public function get_payer_email(){ return $this->payer_email; } + + public function set_receiver_email($var){ $this->receiver_email = $var; } + public function get_receiver_email(){ return $this->receiver_email; } + + public function set_paid_at($var){ $this->paid_at = $var; } + public function get_paid_at(){ return $this->paid_at; } + + public function set_total($var){ $this->total = $var; } + public function get_total(){ return $this->total; } + + public function set_paypal_fee($var){ $this->paypal_fee = $var; } + public function get_paypal_fee(){ return $this->paypal_fee; } + + + + + private function auth() + { + $client = new Client(); + $response = $client->request('POST', $this->url.'/oauth2/token', [ + 'auth' =>[ + $this->client_id, + $this->secret + ], + 'headers' => [ + 'Content-Type' => 'application/x-www-form-urlencoded' + ], + 'form_params' => [ + 'grant_type' => 'client_credentials' + ] + ]); + + $response = $response->getBody()->getContents(); + + if($response !== null) + { + $decoded = json_decode($response); + + if(isset($decoded->access_token)) + { + $this->access_token = $decoded->access_token; + return true; + } + } + + return false; + } + + private function exec_client($path, $body, $method = 'POST') + { + $client = new Client(); + try + { + + $response = $client->request($method, $this->url.$path, [ + 'headers' => [ + 'Authorization' => 'Bearer '.$this->access_token, + 'Content-Type' => 'application/json' + ], + 'json' => $body + ]); + + return $response->getBody()->getContents(); + } + catch (RequestException $e) + { + if ($e->hasResponse()) + { + return $e->getResponse()->getBody()->getContents(); + } + } + + } + + public function generate_paypal_url() + { + if($this->auth()) + { + $body = [ + 'intent' => 'sale', + 'redirect_urls' => [ + 'return_url' => $this->return_url, + 'cancel_url' => $this->return_url, + ], + 'payer' =>[ + 'payment_method' => 'paypal' + ], + 'transactions' => [ + 0 => [ + 'amount' => [ + 'total' => $this->amount, + 'currency' => 'PHP', + ], + 'description' => 'Unioil Top Up Points', + 'custom' => $this->get_invoice_number(), + 'invoice_number' => $this->get_invoice_number(), + 'payment_options' => [ + 'allowed_payment_method' => 'INSTANT_FUNDING_SOURCE' + ], + 'item_list' => [ + 'items' => [ + 0 => [ + 'name' => 'Unioil Top Up Points', + 'description' => 'Unioil Prepaid Load', + 'quantity' => 1, + 'price' => $this->amount, + 'tax' => 0, + 'sku' => 'PREPAID', + 'currency' => 'PHP' + ] + ] + ] + ] + ], + 'note_to_payer' => 'Contact us for any questions on your order' + ]; + + $response = $this->exec_client('/payments/payment', $body); + $response = json_decode($response); + + if(isset($response->id)) + { + $this->set_paypal_id($response->id); + $this->set_self_url($response->links[0]->href); + $this->set_approval_url($response->links[1]->href); + $this->set_execute_url($response->links[2]->href); + $this->set_response($response); + + return true; + } + } + + return false; + } + + public function paypal_verify() + { + if($this->auth()) + { + $response = $this->exec_client('/payments/payment/'.$this->get_paypal_id(),[],'GET'); + $response = json_decode($response); + + if(isset($response->payer->status) == "VERIFIED") + { + $this->set_payer_id($response->payer->payer_info->payer_id); + return true; + + } + elseif (isset($response->payer->status) == "UNVERIFIED") + { + $this->set_error_message('Paypal user unverified'); + return false; + } + else + { + $this->set_error_message('Paypal transaction incomplete'); + return false; + } + } + } + + public function paypal_execute() + { + if($this->auth()) + { + $body = ['payer_id' => $this->get_payer_id()]; + + $response = $this->exec_client('/payments/payment/'.$this->get_paypal_id().'/execute',$body); + $response = json_decode($response); + + if(isset($response->payer->status) && $response->payer->status == "VERIFIED") + { + $this->set_invoice_number($response->transactions[0]->invoice_number); + $this->set_trans_num($response->transactions[0]->related_resources[0]->sale->id); + $this->set_payer_firstname($response->payer->payer_info->first_name); + $this->set_payer_lastname($response->payer->payer_info->last_name); + $this->set_payer_email($response->payer->payer_info->email); + $this->set_receiver_email($response->transactions[0]->payee->email); + $this->set_paid_at($response->create_time); + $this->set_total($response->transactions[0]->amount->total); + $this->set_paypal_fee($response->transactions[0]->related_resources[0]->sale->transaction_fee->value); + $this->set_response($response); + return true; + } + elseif(isset($response->debug_id)) + { + $this->set_error_message($response->message); + $this->set_response($response); + return false; + } + else + { + $this->set_response($response); + return false; + } + } + } + + + + +} diff --git a/app/Libraries/RNRPHLibrary.php b/app/Libraries/RNRPHLibrary.php new file mode 100644 index 0000000..9112fd5 --- /dev/null +++ b/app/Libraries/RNRPHLibrary.php @@ -0,0 +1,133 @@ +url = Config::get('app.rnrph'); + $this->paymaya_url = Config::get('app.paymayaenv'); + $this->paymaya_api_key = Config::get('app.paymayaapikey'); + $this->paymaya_secret_key = Config::get('app.paymayasecretkey'); + $this->uri = new Uri($this->url); + $this->payamaya_uri = new Uri($this->paymaya_url); + } + + protected $uri; + protected $url; + protected $paymaya_uri; + protected $paymaya_url; + + public $response; + + public function getAllProvinces() { + $this->create_request("provinces/mobile/provinces"); + } + public function getAllBranches() { + $this->create_request("branches/mobile/branches"); + } + public function getAllStations() { + $this->create_request("stations/mobile/stations"); + } + public function getAllFuels() { + $this->create_request("fuels/mobile/fuels"); + } + public function getStationDetails($station_code) { + $this->create_request("stations/mobile/stations/".$station_code); + } + public function getPaymayaCustomerDetails($customer_id) { + $this->create_paymaya_request("payments/v1/customers/".$customer_id."/cards"); + } + + + public function create_request($params) + { + $client = new Client(); + + $request = $client->request('GET', $this->url.$params); + + switch ($params) { + case '': + $indata = true; + break; + default: + $indata = false; + break; + } + + $this->setResponse($request,$indata); + } + + public function create_paymaya_request($params) + { + $client = new Client(); + $token = base64_encode($this->paymaya_secret_key); + $request = $client->request('GET', $this->paymaya_url.$params,[ + 'headers' => [ + 'Authorization' => 'Basic '.$token, + 'Accept' => 'application/json', + ] + ]); + + switch ($params) { + case '': + $indata = true; + break; + default: + $indata = false; + break; + } + + $this->setResponse($request,$indata); + } + + /** + * @return $response + */ + public function getResponse() + { + return $this->response; + } + + /** + * @param $response + */ + function setResponse($response , $indata) + { + $result = $response->getStatusCode() != 200 ? null : json_decode($response->getBody()->getContents()); + + $return = []; + $return['data'] = $result; + + if ($indata){ + $return['data'] = $result[0]; + } + + // if (count($result) == 1){ + // $return['data'] = $result[0]; + // } + + $return['status_code'] = $response->getStatusCode(); + $this->response = $return; + + if ($indata){ + $return['data'] = $result[0][0]; + $this->response = $return; + } + + } + + +} + diff --git a/app/Libraries/ResourceHelper.php b/app/Libraries/ResourceHelper.php new file mode 100644 index 0000000..a9b9fb1 --- /dev/null +++ b/app/Libraries/ResourceHelper.php @@ -0,0 +1,963 @@ + 0 && $page > 0) { + return true; + } + return false; + } + /** + * Get all resource in the model within the module; if start and limit is specified then add in query; use relationship + * @param string $module + * @param string $model_name + * @param integer $start + * @param integer $limit + * @param array $relationship + * @param array $grouping + * @param array $condition + * @param string $generalSearch + * @return array + */ + public static function showListResource($module = '', $model_name = '', $page_size = 0, $page = 0, $sorting = [], $relationship = [], $grouping = [], $condition = [], $dateRange = [], $generalSearch = NULL) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + if (empty($sorting)) { + $model = $source::with($relationship); + } else { + $model = $source::with($relationship)->orderBy($sorting['field'], $sorting['sort_order']); + } + + if(!empty($generalSearch)){ + $model->search($generalSearch); + } + + if(!empty($dateRange)){ + foreach ($dateRange as $where){ + if(!empty($where['field']) && !empty($where['from']) && !empty($where['to'])){ + $fieldName = $where['field']; + $from = $where['from']; + $to = $where['to'] . " 23:59"; + $model->whereBetween($fieldName,[$from,$to]); + } + } + } + + foreach ($condition as $where){ + if(!empty($where['field']) && !empty($where['operator']) && !empty($where['value'])){ + $fieldName = $where['field']; + $operator = $where['operator']; + $value = $where['value']; + $model->where($fieldName,$operator,$value); + } + } + + if (empty($grouping)) { + $model = $model->get(); + } else { + $model = $model->get()->groupBy(function($grouping){ + return Carbon::parse($grouping['group_by'])->format('Y'); + }); + } + $pagination = self::validatePagination($page_size, $page); + if ($pagination == true) { + // $model = $source::skip($start)->take($limit)->get(); + $model = $source::paginate($page_size); + if (count($relationship)) { + // $model = $source::with($relationship)->take($limit)->get(); + $model = $source::with($relationship)->paginate($page_size); + } + } + if (count($model) > 0) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => $model->toArray() + ]; + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Get all resource in the model within the module; if start and limit is specified then add in query; use relationship + * @param string $module + * @param string $model_name + * @param integer $start + * @param integer $limit + * @param array $relationship + * @return array + */ + public static function showAllResource($module = '', $model_name = '', $page_size = 0, $page = 0, $sorting = [], $relationship = [], $grouping = [], $condition = []) + { + + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + + $model = $source::with($relationship); + + $pagination = self::validatePagination($page_size, $page); + if(!empty($condition)) + { + + foreach ($condition as $where){ + if(!empty($where['field']) && !empty($where['operator']) && !empty($where['value'])){ + $fieldName = $where['field']; + $operator = $where['operator']; + $value = $where['value']; + $model->where($fieldName,$operator,$value); + + } + } + } + + if (!empty($sorting)) { + $model = $model->orderBy($sorting['field'], $sorting['sort_order']); + if($pagination == true){ + $model = $model->orderBy($sorting['field'], $sorting['sort_order'])->paginate($page_size); + } + } + + if (count($model) > 0) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => !empty($sorting) ? $model->toArray() : $model->get()->toArray() + ]; + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Get soft deleted resource in the model within the module using the resource id as identifier; use relationship + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @param string $resource_field + * @param array $relationship + * @return array + */ + public static function showAllDeletedResource($module = '', $model_name = '', $start = 0, $limit = 0, $relationship = []) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = $source::onlyTrashed()->get(); + $pagination = self::validatePagination($start, $limit); + if ($pagination == true) { + $model = $source::onlyTrashed()->skip($start)->take($limit)->get(); + if (count($relationship)) { + $model = $source::onlyTrashed()->with($relationship)->take($limit)->get(); + } + } + if (count($model) > 0) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => $model->toArray() + ]; + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Get resource in the model within the module using the resource id as identifier; use relationship + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @param string $resource_field + * @param array $relationship + * @return array + */ + public static function showResource($module ='', $model_name ='', $resource_id = 0, $resource_field = '', $relationship = []) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = $source::where($resource_field, '=', $resource_id)->first(); + if (count($relationship)) { + $model = $source::with($relationship)->where($resource_field, '=', $resource_id)->first(); +// $model = $source::with($relationship)->find($resource_id); + } + if ($model) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => ($module == "Shipment") ? $model->makeVisible('shipment_id')->toArray() : $model->toArray() + ]; + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Get soft deleted resource in the model within the module using the resource id as identifier; use relationship + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @param string $resource_field + * @param array $relationship + * @return array + */ + public static function showDeletedResource($module ='', $model_name ='', $resource_id = 0, $resource_field = '', $relationship = []) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = $source::onlyTrashed()->where($resource_field, $resource_id)->first(); + if (count($relationship)) { + $model = $source::onlyTrashed()->with($relationship)->where($resource_field, '=', $resource_id)->first(); + } + if ($model) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => $model->toArray() + ]; + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Store resource in the model within the module using the request parameters as fields and values + * @param Reqeust $request_instance + * @param string $module + * @param string $model_name + * @param array $request + * @param integer $full_response + * @return array + */ + public static function storeResource(Request $request_instance, $module = '', $model_name = '', $request = [], $full_response = 0, $is_log = 0, $created_by = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = new $source; + $resource_id = $model->getKeyName(); + foreach ($request as $field => $value) { + if (Schema::hasColumn($model->getTable(), $field)) { + $model->{$field} = ($field == 'password' ? Hash::make($value) : $value); + // $model->{$field} = ($field == 'password' ? bcrypt($value) : $value); + } + } + if ($model->save()) { + if ($is_log > 0) { + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Save resource log + self::storeResourceLog($model_name, $model->getTable(), $model->$resource_id, ($user_access['code'] == '200' ? $user_access['data']['user_id'] : $model->$resource_id) ); + } + // Prepare response body + $response['code'] = '201'; + $response['status'] = "SC001"; + if ($full_response > 0) { + $response['data'] = $model->toArray(); + } + else { + $response['id'] = $model->$resource_id; + } + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while storing new resource.' + ]; + } + return $response; + } + + /** + * Store resource log mapped into model + * @param string $model_name + * @param string $table_name + * @param integer $resource_id + * @return array + */ + public static function storeResourceLog($model_name = '', $table_name = '', $resource_id = 0, $created_by = 0) + { + $source = "\App\Modules\Utility\Models\ResourceLog"; + $model = new $source; + // Set field values + $model->resource_model = $model_name; + $model->resource_table = $table_name; + $model->resource_id = $resource_id; + $model->created_by = $created_by; + // Save new resource log + if ($model->save()) { + $response = [ + 'code' => '201', + 'status' => "SC001", + 'data' => $model->toArray() + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while storing log' + ]; + } + return $response; + } + + /** + * Store mutltiple resource in the model within the module using the request parameters as fields and values + * @param string $module + * @param string $model_name + * @param array $request + * @param integer $full_response + * @return array + */ + public static function storeMultipleResource(Request $request_instance, $module = '', $model_name = '', $request = [], $full_response = 0, $is_log = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + foreach ($request as $resource) { + $model = new $source; + $resource_id = $model->getKeyName(); + + foreach ($resource as $field => $value) { + $model->{$field} = ($field == 'password' ? Hash::make($value) : $value); + // $model->{$field} = ($field == 'password' ? bcrypt($value) : $value); + + } + $user_id = AuthHelper::getUserDataUsingAuthToken($request_instance->header('X-Auth-Token')); + $truck_personnel_id = AuthHelper::getTruckPersonnelDataUsingAuthToken($request_instance->header('X-Auth-Token')); + $model->created_by = $user_id != 0 ? $user_id : $truck_personnel_id; + $model->updated_by = $user_id != 0 ? $user_id : $truck_personnel_id; + $model->created_at = Carbon::now()->toDateTimeString(); + $model->updated_at = Carbon::now()->toDateTimeString(); + + if ($model->save()) { + + if ($is_log > 0) { + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Save resource log + self::storeResourceLog($model_name, $model->getTable(), $model->$resource_id, ($user_access['code'] == '200' ? $user_access['data']['user_id'] : $model->$resource_id) ); + } + if ($full_response > 0) { + $data[] = $model->toArray(); + } + else { + $data[] = $model->$resource_id; + } + } + else { + $response = [ + 'code' => '400', + 'status' => "ER000", + 'message' => 'An error occurred while storing multiple resource.' + ]; + break; + } + } + if (count($data) > 0) { + $response['code'] = '201'; + $response['status'] = "SC001"; + $response['data'] = $data; + } + return $response; + } + + /** + * Update resource in the model within the module using the resource id as identifier as request parameters as fields and values + * @param string $module + * @param string $model + * @param integer $resource_id + * @param array $request + * @param integer $full_response + * @return array + */ + public static function updateResource(Request $request_instance, $module = '', $model_name = '', $resource_id = 0, $request = [], $full_response = 0, $is_log = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + if ($model = $source::find($resource_id)) { + $deactivated_at = ''; + $reference_key = $model->getKeyName(); + foreach ($request as $field => $value) { + if (Schema::hasColumn($model->getTable(), $field)) { + $model->{$field} = ($field == 'password' ? Hash::make($value) : $value); + // Check if resource status is being deactiveated + if ($field == 'is_active') { + if ($value == 0) { + $deactivated_at = Carbon::now(); + } + } + // $model->{$field} = ($field == 'password' ? bcrypt($value) : $value); + } + // $model->{$field} = ($field == 'password' ? bcrypt($value) : $value); + } + if ($model->save()) { + if ($is_log > 0) { + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Update resource log mapped into model + self::updateResourceLog($model_name, $model->getTable(), $model->$reference_key, $user_access['data']['user_id'], 'modified_by', $deactivated_at); + } + // Prepare response body + $response['code'] = '200'; + $response['status'] = "SC001"; + if ($full_response > 0) { + $response['data'] = $model->toArray(); + } + else { + $response['id'] = $model->$reference_key; + } + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while updating resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Update resource in the model using the resource id and resource field as identifier using the request parameters as values + * @param string $module + * @param string $model + * @param integer $resource_id + * @param array $request + * @param string $resource_field + * @param integer $full_response + * @return array + */ + public static function updateResourceByFieldValue(Request $request_instance, $module = '', $model_name = '', $resource_id = 0, $request = [], $resource_field = '', $full_response = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = $source::where($resource_field, $resource_id)->first(); + if ($model) { + $reference_key = $model->getKeyName(); + foreach ($request as $field => $value) { + if (Schema::hasColumn($model->getTable(), $field)) { + $model->{$field} = ($field == 'password' ? Hash::make($value) : $value); + } + } + if ($model->save()) { + // Prepare response body + $response['code'] = '200'; + $response['status'] = "SC001"; + if ($full_response > 0) { + $response['data'] = $model->toArray(); + } + else { + $response['id'] = $model->$reference_key; + } + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while updating resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found' + ]; + } + return $response; + } + + /** + * Update resource in the model using the resource id, resource field , resource header id and resource header field as identifier using the request parameters as values + * @param string $module + * @param string $model + * @param integer $resource_id + * @param integer $resource_header_id + * @param array $request + * @param string $resource_field + * @param string $resource_header_field + * @param integer $full_response + * @return array + */ + public static function updateResourceDetailByFieldValue(Request $request_instance, $module = '', $model_name = '', $resource_id = "", $resource_header_id = 0, $request = [], $resource_field = '',$resource_header_field = '', $full_response = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = $source::where($resource_field, $resource_id) + ->where($resource_header_field,$resource_header_id)->first(); + if ($model) { + $reference_key = $model->getKeyName(); + foreach ($request as $field => $value) { + $field = ($field == 'reason_uuid') ? 'reason_id' : $field; + if (Schema::hasColumn($model->getTable(), $field)) { + if($field == 'password'){ + $model->{$field} = Hash::make($value); + }elseif($field == 'reason_id'){ + $reason_id = self::getResourceId($request_instance, 'Reason' , 'Reason' , 'reason_uuid', $value); + $model->{$field} = $reason_id; + }else{ + $model->{$field} = $value; + } + + } + } + if ($model->save()) { + // Prepare response body + $response['code'] = '200'; + $response['status'] = "SC001"; + if ($full_response > 0) { + $response['data'] = $model->toArray(); + } + else { + $response['id'] = $model->$reference_key; + } + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while updating resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found' + ]; + } + return $response; + } + + /** + * Update resource log mapped into model + * @param string $model_name + * @param string $table_name + * @param integer $resource_id + * @param integer $modified_by + * @param string $deactivated_at + * @return array + */ + public static function updateResourceLog($model_name = '', $table_name = '', $resource_id = 0, $modified_by = 0, $reference_field = '', $deactivated_at = '') + { + $source = "\App\Modules\Utility\Models\ResourceLog"; + $model = $source::whereResourceModel($model_name)->whereResourceTable($table_name)->whereResourceId($resource_id)->first(); + // Check if resource log is found + if ($model) { + // Set field values + $model->{$reference_field} = $modified_by; + $model->deactivated_at = ($deactivated_at != '' ? $deactivated_at : null); + // Save new resource log + if ($model->save()) { + $response = [ + 'code' => '201', + 'status' => "SC001", + 'data' => $model->toArray() + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while storing log' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource log not found' + ]; + } + return $response; + } + + /** + * Soft delete resource in the model within the module using the resource id as identifier + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @return array + */ + public static function deleteResource(Request $request_instance, $module = '', $model_name = '', $resource_id = 0, $resource_field = "", $is_log = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + if ($model = $source::where($resource_field , "=", $resource_id)) { + if ($model->delete()) { + if ($is_log > 0) { + $reference_key = $model->getKeyName(); + + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Update resource log mapped into model + self::updateResourceLog($model_name, $model->getTable(), $model->$reference_key, $user_access['data']['user_id'], 'deleted_by'); + } + $response = [ + 'code' => '200', + 'status' => "SC001", + 'message' => 'Resource deleted.', + 'data' => $model + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while deleting resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Restore soft deleted resource in the model within the module using the resource id as identifier + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @return array + */ + public static function restoreResource($module = '', $model_name = '', $resource_id = 0, $resource_field = '') + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + if ($model = $source::onlyTrashed()->where($resource_field, $resource_id)) { + if ($model->restore()) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => $resource_id + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while deleting resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Force delete resource in the model within the module using the resource id as identifier + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @return array + */ + public static function forceDeleteResource($module = '', $model_name = '', $resource_id = 0, $resource_field = '', $uses_soft_delete = 1) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = (($uses_soft_delete == 1) ? $source::withTrashed()->where($resource_field, $resource_id) : $source::where($resource_field, $resource_id)); + if ($model) { + if ($model->forceDelete()) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => $resource_id + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while deleting resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Force delete batch resources in the model within the module using the resource id as identifier + * @param string $module + * @param string $model_name + * @param integer $resource_id + * @param integer $where_in + * @return array + */ + public static function forceBatchDeleteResource($module = '', $model_name = '', $resource_id = 0, $resource_field = '', $where_in = 1, $uses_soft_delete = 1) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + if ($where_in == 1) { + $model = (($uses_soft_delete == 1) ? $source::withTrashed()->whereIn($resource_field, $resource_id) : $source::whereIn($resource_field, $resource_id)); + } else { + // delete Ids not labaled + $model = (($uses_soft_delete == 1) ? $source::withTrashed()->whereNotIn($resource_field, $resource_id) : $source::whereNotIn($resource_field, $resource_id)); + } + if ($model) { + if ($model->forceDelete()) { + $response = [ + 'code' => '200', + 'status' => "SC001", + 'data' => $resource_id + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'An error occurred while deleting resource.' + ]; + } + } + else { + $response = [ + 'code' => '404', + 'status' => "NF002", + 'message' => 'Resource not found.' + ]; + } + return $response; + } + + /** + * Batch update resources (configuration) in the model within the module using the request parameters as fields and values + * @param Reqeust $request_instance + * @param string $table + * @param string $reference_field + * @param string $update_field + * @param array $request + * @param integer $is_logs + * @return array + */ + public static function batchUpdate(Request $request_instance, $table ='', $reference_field = '', $update_field = '', $request = [], $is_log = 0) + { + // build raw sql + $sql = "UPDATE $table SET $update_field = CASE [case] END"; + $case = ""; + $batch_updated = []; + + // loop thru input + foreach($request as $ref => $value){ + if(!is_array($value)) { + $case .= "WHEN $reference_field = '". $ref . "' THEN '" . $value ."' "; + array_push($batch_updated, "'".$ref."'"); + } + } + + // Replace [case] + $sql = str_replace("[case]", $case, $sql); + $sql .= " WHERE configuration IN(". implode(',', $batch_updated).")"; + + $model = count($batch_updated) > 0 ? DB::update(DB::raw($sql)) : 0; + + if ($model > 0) { + if ($is_log > 0) { + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Save resource log + self::storeResourceLog($model_name, $table, $reference_field, ($user_access['code'] == '200' ? $user_access['data']['user_id'] : $reference_field) ); + } + // Prepare response body + $response = [ + 'code' => '200', + 'status' => "SC001", + 'message' => 'Resources updated.' + ]; + } + else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'No changes made.' + ]; + } + return $response; + } + + /** + * Batch update resources (single field/column) in the model within the module using the request parameters as fields and values + * @param Request $request_instance + * @param string $table + * @param string $reference_field + * @param string $update_field + * @param array $request + * @param integer $is_log + * @return array + */ + public static function batchUpdateResource(Request $request_instance, $module = '', $model = '', $ref_field = '', $update_field = '', $comp_op = '', $request = [], $is_log = 0) + { + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model; + // Instantiate model and get table name + $table = (new $source())->getTable(); + // build sql using laravel's query builder + foreach($request as $key => $arr_value) { + $resource = DB::table($table)->where($ref_field, $comp_op, $request[$key][$ref_field])->update([$update_field => $request[$key][$update_field]]); + Log::info("update ".$table." :". $resource); + } + + if ($resource > 0) { + if ($is_log > 0) { + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Save resource log + self::storeResourceLog($model, $table, $ref_field, ($user_access['code'] == '200' ? $user_access['data']['user_id'] : $ref_field) ); + } + // Prepare response body + $response = [ + 'code' => '200', + 'status' => "SC001", + 'message' => 'Resources updated.' + ]; + } else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'No changes made.' + ]; + } + return $response; + } + + /** + * Batch update resources (single field/column) in the model within the module using the request parameters as fields and values + * @param Request $request_instance + * @param string $table + * @param string $reference_field + * @param string $update_field + * @param array $request + * @param integer $is_log + * @return array + */ + public static function batchUpdateWithDetailResource(Request $request_instance, $module = '', $model = '', $model_detail = '', $ref_field = '', $update_field = '', $comp_op = '', $request = [], $resource_detail_field = "", $detail_ref_field = "", $is_log = 0) + { + + //get user_id based on X-Authorization + $trucker_id = AuthHelper::getTruckPersonnelDataUsingAuthToken($request_instance->header('X-Auth-Token')); + + $resource_detail = 0; + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model; + // Instantiate model and get table name + $table = (new $source())->getTable(); + // build sql using laravel's query builder + foreach($request as $key => $arr_value) { + if(!empty($update_field)){ + $resource = DB::table($table)->where($ref_field, $comp_op, $request[$key][$ref_field])->update([$update_field => $request[$key][$update_field]]); + }else{ + $resource = 1; + } + $reference_id = DB::table($table)->where($ref_field, $comp_op, $request[$key][$ref_field])->first(); + $ref_column = $table."_id"; + if($resource > 0){ + foreach($request[$key][$resource_detail_field] as $key_detail => $arr_detail){ + + $resource_detail = self::updateResourceDetailByFieldValue($request_instance, $module, $model_detail, $arr_detail[$detail_ref_field], $reference_id->$ref_column, $arr_detail, $detail_ref_field , $ref_column, 1); + } + //for excess + if(!empty($request[$key]['excess'])){ + foreach($request[$key]['excess'] as $key_excess => $arr_excess){ + $arr_excess['created_by'] = $trucker_id; + $arr_excess['shipment_delivery_id'] = $reference_id->$ref_column; + //var_dump($arr_excess);die(); + $save_excess = self::storeResource($request_instance, $module, $model_detail, $arr_excess, 1, 0, $trucker_id); + } + + }else{ + $save_excess = 0; + } + } + } + if ($resource_detail['code'] == '200' && $save_excess !== NULL) { + if ($is_log > 0) { + $user_access = UserParser::getUserFromUserAccessByToken($request_instance->header('X-Auth-Token')); + // Save resource log + self::storeResourceLog($model, $table, $ref_field, ($user_access['code'] == '200' ? $user_access['data']['user_id'] : $ref_field) ); + } + // Prepare response body + $response = [ + 'code' => '200', + 'status' => "SC001", + 'message' => 'Resources updated.' + ]; + } else { + $response = [ + 'code' => '500', + 'status' => "ER000", + 'message' => 'No changes made.' + ]; + } + return $response; + } + + + public static function getResourceId(Request $request_instance, $module = '', $model_name = '', $resource_field = '', $resource_id = '') + { + + $source = "\App\Modules\\".$module."\\".$module."\Models\\".$model_name; + $model = $source::where($resource_field, $resource_id)->first(); + if ($model) { + $reference_key = $model->getKeyName(); + } + return $model[$reference_key]; + } +} \ No newline at end of file diff --git a/app/Libraries/S3.php b/app/Libraries/S3.php new file mode 100644 index 0000000..8a71dda --- /dev/null +++ b/app/Libraries/S3.php @@ -0,0 +1,41 @@ +getClientOriginalExtension(); + else + $imageFileName = time() . '.' . $image->getClientOriginalExtension(); + + $s3 = \Storage::disk('s3'); + $filePath = '/'.env('AWS_BUCKET_ENV').'/'.$folder.'/'.$imageFileName; + $s3->put($filePath, file_get_contents($image)); + + return $filePath; + } + + public static function public_path($path) + { + if(env('S3_FORMAT_VERSION') == 2) + return 'https://s3-'.env('AWS_DEFAULT_REGION').'.amazonaws.com/'.env('AWS_BUCKET').$path; + else + return 'https://'.env('AWS_BUCKET').'.s3-'.env('AWS_DEFAULT_REGION').'.amazonaws.com'.$path; + } + + public function remove_public_path($url) + { + $remove = 'https://'.env('AWS_BUCKET').'.s3-'.env('AWS_DEFAULT_REGION').'.amazonaws.com'; + return str_replace($remove, '', $url); + } +} diff --git a/app/Libraries/StaticContents.php b/app/Libraries/StaticContents.php new file mode 100644 index 0000000..369d6bf --- /dev/null +++ b/app/Libraries/StaticContents.php @@ -0,0 +1,181 @@ + 1, // regardless of the user type + 'Loyalty Exclusive' => 2, // logged in loyalty member + 'User Specific' => 3, // based on the birthday of the logged in user + ]; + } + else + { + $type = [ + 1 => 'General', + 2 => 'Loyalty Exclusive', + 3 => 'User Specific', + ]; + } + + if($value) + { + if(isset($type[$value])) + return $type[$value]; + } + else + return $type; + } + + /** + * Status for admin + * @param integer $id + * @return array / string + */ + public static function admin_status($value = null, $return_id = false) + { + if($return_id) + { + $status = [ + 'active' => 0, + 'inactive' => 1, + ]; + } + else + { + $status = [ + 0 => 'active', + 1 => 'inactive', + ]; + } + + if(!is_null($value)) + { + if(isset($status[$value])) + return $status[$value]; + } + else + return $status; + } + + /** + * Status for member (checks if the member is validated) + * @param integer $id + * @return array / string + */ + public static function member_status($value, $return_id = false) + { + if($return_id) + { + $status = [ + 'inactive' => 0, + 'active' => 1, + ]; + } + else + { + $status = [ + 0 => 'inactive', + 1 => 'active', + ]; + } + + if(!is_null($value)) + { + if(isset($status[$value])) + return $status[$value]; + } + else + return $status; + } + + /** + * Lock code for loyalty_card + * @param integer $id + * @return array / string + */ + public static function lock_code($value) + { + $code = [ + '01' => 'Account is locked due to wrong OTP entered for 3 times during login', + '02' => 'Account is locked due to wrong OTP entered for 3 times when updating the mobile phone number', + ]; + + if(!is_null($value)) + { + if(isset($code[$value])) + return $code[$value]; + } + else + return $code; + } + + /** + * Fuel Codes via Database + * @param integer $id + * @return array / string + */ + public static function fuelType_code($value = null) + { + $fuel_code = App\CodeFuelType::where('is_active',1)->get(); + + $code = []; + + foreach ($fuel_code as $key => $v) { + $code[$v['code']] = $v['description']; + } + + if(!is_null($value)) + { + if(isset($code[$value])) + return $code[$value]; + } + else + return $code; + } + + /** + * Station ID of APP via Database + * @param + * @return integer id + */ + public static function app_station_id() + { + $station = App\Station::where('code','APP') + ->where('is_active',1) + ->first(); + + if($station) + return $station->station_id; + else + return 0; + } + + /** + * Station Code for in-app purchase + * @param + * @return integer id + */ + public static function in_app_stations() + { + $code = [ + 'APP' => 'APP', + 'SMS' => 'SMS', + 'WEB' => 'WEB' + ]; + + return $code; + } +} diff --git a/app/Libraries/StratuscastLibrary.php b/app/Libraries/StratuscastLibrary.php new file mode 100644 index 0000000..23cfde9 --- /dev/null +++ b/app/Libraries/StratuscastLibrary.php @@ -0,0 +1,124 @@ +url = Config::get('app.stratuscast'); + $this->username = Config::get('app.stratuscastUsername'); + $this->password = Config::get('app.stratuscastPassword'); + $this->uri = new Uri($this->url); + } + + protected $uri; + protected $url; + protected $username; + protected $password; + public $response; + + public function getAllFuelPrice() { + $this->create_request("stations_fuel_prices/"); + } + + public function getFuelPriceBystation($station) { + $this->create_request("stations_fuel_prices/read_single/".$station); + } + + public function getCityAndProvince() { + $this->create_request("city_provinces/"); + } + + public function getCity() { + $this->create_request("city/"); + } + + public function getProvince() { + $this->create_request("province/"); + } + + public function getAboutUs() { + $this->create_request("about_us/"); + } + + public function getProducts() { + $this->create_request("products/"); + } + + public function getProduct($id) { + $this->create_request("products/read_single/".$id); + } + + public function create_request($params) + { + $client = new Client(); + + $request = $client->request('GET', $this->url.'/'.$params, [ + 'headers' => [ + 'Username' => $this->username, + 'Password' => $this->password + ] + ]); + + switch ($params) { + case 'about_us/': + $indata = true; + break; + default: + $indata = false; + break; + } + + $this->setResponse($request,$indata); + } + + /** + * @return $response + */ + public function getResponse() + { + return $this->response; + } + + /** + * @param $response + */ + function setResponse($response , $indata) + { + $result = $response->getStatusCode() != 200 ? null : json_decode($response->getBody()->getContents()); + + $return = []; + $return['data'] = $result; + + if ($indata){ + $return['data'] = $result[0]; + } + + if (count($result) == 1){ + $return['data'] = $result[0]; + } + + $return['status_code'] = $response->getStatusCode(); + $this->response = $return; + + if ($indata){ + $return['data'] = $result[0][0]; + $this->response = $return; + } + + } + + +} diff --git a/app/Libraries/UuidHelper.php b/app/Libraries/UuidHelper.php new file mode 100644 index 0000000..c9189ac --- /dev/null +++ b/app/Libraries/UuidHelper.php @@ -0,0 +1,13 @@ +toString(); + } +} \ No newline at end of file diff --git a/app/LoyaltyCard.php b/app/LoyaltyCard.php new file mode 100644 index 0000000..0ebf499 --- /dev/null +++ b/app/LoyaltyCard.php @@ -0,0 +1,117 @@ +belongsTo('App\PersonalDetails','pd_id','pd_id'); + } + + public function codeVehicleOwn() + { + return $this->hasOne('App\CodeVehicleOwn','vo_id','vo_id'); + } + + public function codeCity() + { + return $this->hasOne('App\CodeCity','city_id','city_id'); + } + + public function codeFuelType() + { + return $this->hasOne('App\CodeFuelType','fueltype_id','fueltype_id'); + } + + public function codeCivilStatus() + { + return $this->hasOne('App\CodeCivilStatus','civilstatus_id','civilstatus_id'); + } + + public function codeGender() + { + return $this->hasOne('App\CodeGender','gender_id','gender_id'); + } + + public function codeCardType() + { + return $this->hasOne('App\CodeCardType','cardtype_id','cardtype_id'); + } + + public function otpAttempts() + { + return $this->hasMany('App\OtpAttempts','lcard_id','lcard_id'); + } + + public function scopeSort($query, $field, $order) + { + switch ($field) { + case 'firstname': + $query->leftJoin('personal_details', 'loyalty_card.pd_id', '=','personal_details.pd_id'); + $query->orderBy('personal_details.firstname', $order); + break; + case 'lastname': + $query->leftJoin('personal_details', 'loyalty_card.pd_id', '=','personal_details.pd_id'); + $query->orderBy('personal_details.lastname', $order); + break; + case 'card_type': + $query->leftJoin('code_card_type', 'loyalty_card.cardtype_id', '=','code_card_type.cardtype_id'); + $query->orderBy('code_card_type.code', $order); + break; + case 'status': + $query->orderBy('is_validated', $order); + break; + default: + return $query->orderBy($field, $order); + } + } + + public function scopeNumberOfOTPAttempts($query) + { + $date_now = date('Y-m-d H:i:s'); + $date_yesterday = date('Y-m-d H:i:s',strtotime('-24 hours',strtotime($date_now))); + $query->leftJoin('otp_attempts', 'loyalty_card.lcard_id', '=','otp_attempts.lcard_id') + ->whereBetween('otp_attempts.created_at',[$date_yesterday,$date_now]); + + } +} diff --git a/app/LoyaltyCardSignUp.php b/app/LoyaltyCardSignUp.php new file mode 100644 index 0000000..b8cd30e --- /dev/null +++ b/app/LoyaltyCardSignUp.php @@ -0,0 +1,67 @@ +hasOne('App\CodeCardType','cardtype_id','cardtype_id'); + } + + + public function idNumberType() + { + return $this->hasOne('App\IDNumberType','idnt_id','idnt_id'); + } + + public function scopeSort($query, $field, $order) + { + switch ($field) { + case 'card_type': + $query->leftJoin('code_card_type', 'loyalty_card.cardtype_id', '=','code_card_type.cardtype_id'); + $query->orderBy('code_card_type.code', $order); + break; + default: + return $query->orderBy($field, $order); + } + } +} diff --git a/app/MobileAnalytics.php b/app/MobileAnalytics.php new file mode 100644 index 0000000..479ff4d --- /dev/null +++ b/app/MobileAnalytics.php @@ -0,0 +1,52 @@ +hasOne('App\LoyaltyCard','lcard_id','lcard_id'); + } + + public function ratings() + { + return $this->hasOne('App\Ratings','payment_id','payment_id'); + } + + public function items() + { + return $this->hasMany('App\PaymentsItems','payment_id','payment_id'); + } + + + public function scopeSort($query, $field, $order) + { + switch ($field) { + case 'card_number': + $query->leftJoin('loyalty_card', 'loyalty_card.lcard_id', '=','payments.lcard_id'); + $query->orderBy('loyalty_card.card_number', $order); + break; + default: + return $query->orderBy($field, $order); + } + } +} diff --git a/app/PaymentsItems.php b/app/PaymentsItems.php new file mode 100644 index 0000000..f92c4d7 --- /dev/null +++ b/app/PaymentsItems.php @@ -0,0 +1,52 @@ +hasOne('App\Promotions','promotion_id','promotion_id'); + } +} diff --git a/app/ProductCategory.php b/app/ProductCategory.php new file mode 100644 index 0000000..951897b --- /dev/null +++ b/app/ProductCategory.php @@ -0,0 +1,44 @@ +hasMany('App\ProductDetails','pc_id','pc_id'); + } + +} diff --git a/app/ProductDetails.php b/app/ProductDetails.php new file mode 100644 index 0000000..e5d5cb8 --- /dev/null +++ b/app/ProductDetails.php @@ -0,0 +1,43 @@ +hasOne('App\ProductCategory','pc_id','pc_id'); + } + +} diff --git a/app/PromotionStations.php b/app/PromotionStations.php new file mode 100644 index 0000000..415189b --- /dev/null +++ b/app/PromotionStations.php @@ -0,0 +1,55 @@ +hasOne('App\Station','station_id','station_id'); + } +} diff --git a/app/Promotions.php b/app/Promotions.php new file mode 100644 index 0000000..f94dc57 --- /dev/null +++ b/app/Promotions.php @@ -0,0 +1,46 @@ +hasMany('App\PromotionStations','promotion_id','promotion_id'); + } + + public function photoSlider() + { + return $this->hasMany('App\PhotoSlider','promotion_id','promotion_id'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..7a76f82 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,148 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Bootstrap any application services. + * + * @return void + */ + public function boot() + { + Schema::defaultStringLength(128); + $this->registerPolicies(); + Passport::routes(); + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + //for HTTP Status Code module + $this->app->bind('App\Contracts\HttpStatusCodeInterface', 'App\Helpers\HttpStatusCode'); + + //for USER module + $this->app->bind('App\Contracts\UserResourceInterface', 'App\Services\UserService'); + + //for ADMIN module + $this->app->bind('App\Contracts\AdminResourceInterface', 'App\Services\AdminService'); + + //for Password Logs module + $this->app->bind('App\Contracts\PasswordLogsResourceInterface', 'App\Services\PasswordLogsService'); + + //for SystemPreference module + $this->app->bind('App\Contracts\SystemPreferenceResourceInterface', 'App\Services\SystemPreferenceService'); + + //for Loyalty Card module + $this->app->bind('App\Contracts\LoyaltyCardResourceInterface', 'App\Services\LoyaltyCardService'); + + //for Personal Details module + $this->app->bind('App\Contracts\PersonalDetailsResourceInterface', 'App\Services\PersonalDetailsService'); + + //for TopUp module + $this->app->bind('App\Contracts\TopUpResourceInterface', 'App\Services\TopUpService'); + + //for Admin Logs + $this->app->bind('App\Contracts\AdminActionLogsInterface', 'App\Services\AdminActionLogsService'); + + //for Card Type module + $this->app->bind('App\Contracts\CardTypeResourceInterface', 'App\Services\CardTypeService'); + + //for Promotion module + $this->app->bind('App\Contracts\PromotionResourceInterface', 'App\Services\PromotionService'); + + //for Station module + $this->app->bind('App\Contracts\StationResourceInterface', 'App\Services\StationService'); + + //for Promotion Stations module + $this->app->bind('App\Contracts\PromotionStationsInterface', 'App\Services\PromotionStationsService'); + + //for Payment module + $this->app->bind('App\Contracts\PaymentResourceInterface', 'App\Services\PaymentService'); + + //for Ratings module + $this->app->bind('App\Contracts\RatingsResourceInterface', 'App\Services\RatingsService'); + + //for Photo Slider module + $this->app->bind('App\Contracts\PhotoSliderResourceInterface', 'App\Services\PhotoSliderService'); + + //for Terms And Privacy + $this->app->bind('App\Contracts\TermsAndPrivacyResourceInterface', 'App\Services\TermsAndPrivacyService'); + + //for Mobile Usage module + $this->app->bind('App\Contracts\MobileAnalyticsResourceInterface', 'App\Services\MabileAnalyticsService'); + + //for Registration + $this->app->bind('App\Contracts\RegistrationResourceInterface', 'App\Services\RegistrationService'); + + //for OTP Logs + $this->app->bind('App\Contracts\OtpLogResourceInterface', 'App\Services\OtpLogService'); + + //for Lcard Action Logs + $this->app->bind('App\Contracts\LcardActionLogsInterface', 'App\Services\LcardActionLogsService'); + + //for Otp Attempts + $this->app->bind('App\Contracts\OtpAttemptsResourceInterface', 'App\Services\OtpAttemptsService'); + + //for City And Province + $this->app->bind('App\Contracts\CityAndProvinceResourceInterface', 'App\Services\CityAndProvinceService'); + + //for Vehicle Own + $this->app->bind('App\Contracts\CodeVehicleOwnResourceInterface', 'App\Services\CodeVehicleOwnService'); + + //for Fuel Type + $this->app->bind('App\Contracts\CodeFuelTypeResourceInterface', 'App\Services\CodeFuelTypeService'); + + //for Civil Status + $this->app->bind('App\Contracts\CodeCivilStatusResourceInterface', 'App\Services\CodeCivilStatusService'); + + //for Gender + $this->app->bind('App\Contracts\CodeGenderResourceInterface', 'App\Services\CodeGenderService'); + + //for fuel tracker + $this->app->bind('App\Contracts\FuelTrackerResourceInterface', 'App\Services\FuelTrackerService'); + + + //for Station Favorites + $this->app->bind('App\Contracts\StationFavoriteResourceInterface', 'App\Services\StationFavoriteService'); + + //for Products + $this->app->bind('App\Contracts\ProductDetailsResourceInterface', 'App\Services\ProductDetailsService'); + + //for Loyalty Card Sign up + $this->app->bind('App\Contracts\LoyaltyCardSignUpInterface', 'App\Services\LoyaltyCardSignUpService'); + + //for ID Number Type + $this->app->bind('App\Contracts\IDNumberTypeInterface', 'App\Services\IDNumberTypeService'); + + //for Sign Up API Calls + $this->app->bind('App\Contracts\SignUpAPICallsInterface', 'App\Services\SignUpAPICallsService'); + + //for Station Fuel Prices Interface + $this->app->bind('App\Contracts\StationFuelPricesInterface', 'App\Services\StationFuelPricesService'); + + //for Mpin Interface + $this->app->bind('App\Contracts\MpinCodesResourceInterface', 'App\Services\MpinCodesService'); + + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..f9c3b1d --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,38 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + + Passport::routes(); + + Passport::tokensExpireIn(Carbon::now()->addMonths(10)); + + Passport::refreshTokensExpireIn(Carbon::now()->addMonths(10)); + + Passport::enableImplicitGrant(); + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..352cce4 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ +app->singleton(AuthorizationServer::class, function () { + return tap($this->makeAuthorizationServer(), function ($server) { + $server->enableGrantType( + $this->makeAuthCodeGrant(), Passport::tokensExpireIn() + ); + + $server->enableGrantType( + $this->makeRefreshTokenGrant(), Passport::tokensExpireIn() + ); + + $server->enableGrantType( + $this->makePasswordGrant(), Passport::tokensExpireIn() + ); + + $server->enableGrantType( + new PersonalAccessGrant, new DateInterval('P1Y') + ); + + $server->enableGrantType( + new ClientCredentialsGrant, Passport::tokensExpireIn() + ); + + if (Passport::$implicitGrantEnabled) { + $server->enableGrantType( + $this->makeImplicitGrant(), Passport::tokensExpireIn() + ); + } + }); + }); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php new file mode 100644 index 0000000..6c64e52 --- /dev/null +++ b/app/Providers/EventServiceProvider.php @@ -0,0 +1,34 @@ + [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + parent::boot(); + + // + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..5ea48d3 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,73 @@ +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')); + } +} diff --git a/app/Ratings.php b/app/Ratings.php new file mode 100644 index 0000000..a6cb363 --- /dev/null +++ b/app/Ratings.php @@ -0,0 +1,84 @@ +hasOne('App\LoyaltyCard','lcard_id','lcard_id'); + } + + public function payment() + { + return $this->hasOne('App\Payment','payment_id','payment_id'); + } + + public function station() + { + return $this->hasOne('App\Station','station_id','station_id'); + } + + + public function scopeSort($query, $field, $order) + { + switch ($field) { + case 'card_number': + $query->leftJoin('loyalty_card', 'loyalty_card.lcard_id', '=','ratings.lcard_id'); + $query->orderBy('loyalty_card.card_number', $order); + break; + case 'station': + $query->select(DB::raw('ratings.*,description')); + $query->leftJoin('station', 'station.station_id', '=','ratings.station_id'); + $query->orderBy('station.description', $order); + break; + case 'invoice': + $query->leftJoin('payments', 'payments.payment_id', '=','payments.payment_id'); + $query->orderBy('payments.item_number', $order); + break; + default: + return $query->orderBy($field, $order); + } + } + +} diff --git a/app/Rules/AdultAge.php b/app/Rules/AdultAge.php new file mode 100644 index 0000000..ed93d84 --- /dev/null +++ b/app/Rules/AdultAge.php @@ -0,0 +1,41 @@ +age > 17); + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return 'You must be at least 18 years old to join the Loyalty Program'; + } +} diff --git a/app/Rules/AlphaDash.php b/app/Rules/AlphaDash.php new file mode 100644 index 0000000..07a73ca --- /dev/null +++ b/app/Rules/AlphaDash.php @@ -0,0 +1,40 @@ +request = $request; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + if(strtotime($this->request->date_start) < strtotime($this->request->date_end)) + return true; + else + return false; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return 'Start date should not be earlier than end date'; + } +} diff --git a/app/Rules/PhotoSliderDateEnd.php b/app/Rules/PhotoSliderDateEnd.php new file mode 100644 index 0000000..935089a --- /dev/null +++ b/app/Rules/PhotoSliderDateEnd.php @@ -0,0 +1,54 @@ +request = $request; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + if(isset($this->request->promotion_uuid) && $this->request->promotion_uuid != '') + { + $promotion = Promotions::where('promotion_uuid',$this->request->promotion_uuid)->first(); + + if($promotion) + { + if(strtotime($promotion->date_end) < strtotime($value)) + return false; + } + } + + return true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return 'Invalid Date End'; + } +} diff --git a/app/Rules/PhotoSliderDateStart.php b/app/Rules/PhotoSliderDateStart.php new file mode 100644 index 0000000..fdb344d --- /dev/null +++ b/app/Rules/PhotoSliderDateStart.php @@ -0,0 +1,54 @@ +request = $request; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + if(isset($this->request->promotion_uuid) && $this->request->promotion_uuid != '') + { + $promotion = Promotions::where('promotion_uuid',$this->request->promotion_uuid)->first(); + + if($promotion) + { + if(strtotime($promotion->date_start) > strtotime($value)) + return false; + } + } + + return true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return 'Invalid Date Start'; + } +} diff --git a/app/Rules/SignUpMobile.php b/app/Rules/SignUpMobile.php new file mode 100644 index 0000000..125368e --- /dev/null +++ b/app/Rules/SignUpMobile.php @@ -0,0 +1,50 @@ +where('is_active',1) + ->where('cyware_synced',1) + ->count(); + + return ($loyaltyCard > 0) ? false : true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return 'Mobile Number already exists'; + } +} diff --git a/app/Services/AdminActionLogsService.php b/app/Services/AdminActionLogsService.php new file mode 100644 index 0000000..396ed65 --- /dev/null +++ b/app/Services/AdminActionLogsService.php @@ -0,0 +1,95 @@ +modules = [ + 'LOGIN' => 'Login', + 'USERMANAGEMENT' => 'User Management', + 'MEMBERMANAGEMENT' => 'Member Management', + 'PROMOTIONS' => 'Promotions', + 'TOPUP' => 'Top-Up', + 'CARDTYPES' => 'Card Types', + 'REPORT_TOPUP' => 'Report - Top Up', + 'REPORT_STATIONRATINGS' => 'Report - Station Ratings', + 'REPORT_MOBILEUSAGE' => 'Report - Mobile Usage', + 'REPORT_REGISTRATION' => 'Report - Registration', + 'SYSTEMPREFERENCES' => 'System Preferences', + 'STATION' => 'Station', + 'PHOTOSLIDER' => 'Photo Slider', + 'NOTIFICATION' => 'Notification' + ]; + + $this->actions = [ + 'STORE' => 'store', + 'UPDATE' => 'update', + 'DELETE' => 'delete', + 'ACTIVATE' => 'activate', + 'GENERATE' => 'generate', + 'EXPORT' => 'export', + 'LOGIN' => 'login', + 'LOGOUT' => 'logout', + ]; + } + + public function getByField($field,$value) + { + $this->adminActionLogs = AdminActionLogs::where($field,$value) + ->orderBy('created_dt','desc'); + return $this->adminActionLogs->get(); + } + + public function log($id, $module, $action, $remarks = '') + { + if(isset($this->modules[$module]) && isset($this->actions[$action])) + { + + $currentUser = CurrentUserHelper::get_currentAdmin(); + + $this->adminActionLogs = new AdminActionLogs; + + $this->adminActionLogs->id = $id; + $this->adminActionLogs->module = $this->modules[$module]; + $this->adminActionLogs->action = $this->actions[$action]; + $this->adminActionLogs->created_by = isset( $currentUser ) ? $currentUser->admin_id : $id; + + if($remarks != '') + $this->adminActionLogs->remarks = $remarks; + + if ($this->adminActionLogs->save()) + { + return true; + } + } + + return false; + + } + + +} diff --git a/app/Services/AdminService.php b/app/Services/AdminService.php new file mode 100644 index 0000000..f10a71c --- /dev/null +++ b/app/Services/AdminService.php @@ -0,0 +1,257 @@ +password_logs = $password_logs; + } + + public function listing($params) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $pagination = ListHelper::validatePagination($params['page_size'],$params['page']); + $list = Admin::where('is_active','=',1); + + if($params['search'] != null) + { + $list->where(function($query) use ($params){ + $query->where('username', 'LIKE', '%'.$params['search'].'%'); + $query->orWhere('firstname', 'LIKE', '%'.$params['search'].'%'); + $query->orWhere('lastname', 'LIKE', '%'.$params['search'].'%'); + $query->orWhere('email', 'LIKE', '%'.$params['search'].'%'); + }); + } + + if($params['filter']) + { + $list->where(function($query) use ($params){ + foreach($params['filter'] as $field => $value) + { + if($value != null) + { + if(is_array($value)) + { + foreach ($value as $v) { + $v = $field == 'status' ? StaticContents::admin_status($v, true) : $v; + $query->orWhere($field, $v); + } + } + else + { + $value = $field == 'status' ? StaticContents::admin_status($value, true) : $value; + $query->orWhere($field, $value); + } + } + } + + }); + } + + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true) + return $list->paginate($params['page_size']); + else + return $list->get(); + } + + public function getAll() + { + $this->admin = Admin::all(); + return $this->admin; + } + + public function getByField($data) + { + $this->admin = new Admin; + + if(count($data)) + { + foreach ($data as $field => $value) { + $this->admin = $this->admin->where($field,$value); + } + } + + return $this->admin->get(); + } + + public function store(Request $request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->admin = new Admin; + + $uuid = new UuidHelper; + $this->admin->admin_uuid = $uuid->generate_uuid1(); + $this->admin->username = strtolower($request->get('username')); + $this->admin->password = bcrypt($request->get('password')); + $this->admin->firstname = ucwords($request->get('firstname')); + $this->admin->lastname = ucwords($request->get('lastname')); + $this->admin->email = $request->get('email'); + $this->admin->role = $request->get('role'); + $this->admin->status = StaticContents::admin_status($request->get('status'), true); + $this->admin->created_by = $currentUser->admin_id; + + + if ($this->admin->save()) + { + $this->password_logs->store($this->admin->admin_id,$request->get('password'),$currentUser->admin_id, true); + return $this->admin->admin_id; + } + else + { + return false; + } + } + + public function changePassword(Request $request) + { + $this->admin = Admin::where('admin_uuid',$request->get('admin_uuid'))->first(); + + $this->admin->password = bcrypt($request->get('password')); + $this->admin->is_passwordChanged = 1; + + if ($this->admin->save()) + { + return true; + } + else + { + return false; + } + } + + public function show($uuid) + { + $this->admin = Admin::whereAdminUuid($uuid)->first(); + $this->admin->created_by = $this->admin->created_by ? CurrentUserHelper::getAdminName($this->admin->created_by) : null ; + $this->admin->updated_by = $this->admin->updated_by ? CurrentUserHelper::getAdminName($this->admin->updated_by) : null; + return $this->admin; + } + + public function update($request,$uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->admin = Admin::where('admin_uuid',$uuid)->first(); + + + if($this->admin) + { + $this->admin->username = strtolower($request->username); + $this->admin->firstname = ucwords($request->firstname); + $this->admin->lastname = ucwords($request->lastname); + $this->admin->email = $request->email; + $this->admin->status = StaticContents::admin_status($request->status, true); + $this->admin->updated_by = $currentUser->admin_id; + + if($request->has('role')) + $this->admin->role = $request->role; + + if($request->has('password') && ($request->password != '' || $request->password != null)) + { + $this->admin->password = bcrypt($request->password); + $this->admin->is_passwordChanged = 0; + } + + if ($this->admin->save()) + { + return $this->admin; + } + } + + return false; + } + + public function changeStatus($status,$uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->admin = Admin::where('admin_uuid',$uuid)->first(); + + $this->admin->status = $status; + $this->admin->updated_by = $currentUser->admin_id; + + if ($this->admin->save()) + { + return true; + } + else + { + return false; + } + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->admin = Admin::whereIn('admin_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->admin) + return true; + else + return false; + } + else + { + $this->admin = Admin::where('admin_uuid',$uuid)->first(); + $this->admin->is_active = 0; + $this->admin->updated_by = $currentUser->admin_id; + + if ($this->admin->save()) + return true; + else + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = Admin::with($relationship) + ->whereIn($field,$value)->get(); + } + else + { + $details = Admin::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + +} diff --git a/app/Services/CardTypeService.php b/app/Services/CardTypeService.php new file mode 100644 index 0000000..e104118 --- /dev/null +++ b/app/Services/CardTypeService.php @@ -0,0 +1,198 @@ +where(function($query) use ($params){ + $query->where('code', 'LIKE', '%'.$params['search'].'%'); + $query->orWhere('description', 'LIKE', '%'.$params['search'].'%'); + $query->orWhere('name', 'LIKE', '%'.$params['search'].'%'); + }); + } + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true) + return $list->paginate($params['page_size']); + else + return $list->get(); + + } + + public function store(Request $request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->cardType = new CodeCardType; + + $s3 = new S3; + $filePath = $s3->upload($request->file('image'),'cardTypes'); + $filePath_bgimage = $s3->upload($request->file('bg_image'),'cardTypes_bg_image'); + $uuid = new UuidHelper; + $this->cardType->cardtype_uuid = $uuid->generate_uuid1(); + $this->cardType->code = $request->get('code'); + $this->cardType->name = $request->get('type'); + $this->cardType->description = $request->get('description'); + $this->cardType->terms_and_conditions = $request->get('terms_and_conditions'); + $this->cardType->faqs = $request->get('faqs'); + $this->cardType->created_by = $currentUser->admin_id; + $this->cardType->image = $filePath; + $this->cardType->bg_image = $filePath_bgimage; + $this->cardType->id_number = $request->get('id_number'); + $this->cardType->id_number_description = $request->has('id_number_description') ? $request->get('id_number_description') : ""; + $this->cardType->is_black = $request->get('virtual_card_font_color'); + + + if ($this->cardType->save()) + { + return $this->cardType->cardtype_id; + } + else + { + return false; + } + } + + public function getByField($data, $relationship = null) + { + if($relationship) + { + $this->cardType = CodeCardType::with($relationship); + } + else + $this->cardType = new CodeCardType; + + if(count($data)) + { + foreach ($data as $field => $value) { + $this->cardType = $this->cardType->where($field,$value); + } + } + + return $this->cardType->get(); + } + + public function update($request,$uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->cardType = CodeCardType::where('cardtype_uuid',$uuid)->first(); + + + if($this->cardType) + { + $this->cardType->code = $request->get('code'); + $this->cardType->name = $request->get('type'); + $this->cardType->description = $request->get('description'); + $this->cardType->terms_and_conditions = $request->get('terms_and_conditions'); + $this->cardType->faqs = $request->get('faqs'); + $this->cardType->updated_by = $currentUser->admin_id; + $this->cardType->id_number = $request->get('id_number'); + $this->cardType->id_number_description = $request->has('id_number_description') ? $request->get('id_number_description') : ""; + $this->cardType->is_black = $request->get('virtual_card_font_color'); + + if($request->has('image')) + { + $s3 = new S3; + $filePath = $s3->upload($request->file('image'),'cardTypes'); + $this->cardType->image = $filePath; + } + + if($request->has('bg_image')) + { + $s3 = new S3; + $filePath_bgimage = $s3->upload($request->file('bg_image'),'cardTypes_bg_image'); + $this->cardType->bg_image = $filePath_bgimage; + } + + if ($this->cardType->save()) + { + return $this->cardType; + } + } + + return false; + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->cardType = CodeCardType::whereIn('cardtype_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->cardType) + return true; + else + return false; + } + else + { + $this->cardType = CodeCardType::where('cardtype_uuid',$uuid)->first(); + $this->cardType->is_active = 0; + $this->cardType->updated_by = $currentUser->admin_id; + + if ($this->cardType->save()) + return true; + else + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = CodeCardType::with($relationship) + ->whereIn($field,$value)->get(); + } + else + { + $details = CodeCardType::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + + public function getAllCardType() + { + $data = CodeCardType::where('is_active',1)->get(); + return $data; + } + +} diff --git a/app/Services/CityAndProvinceService.php b/app/Services/CityAndProvinceService.php new file mode 100644 index 0000000..ed44c4b --- /dev/null +++ b/app/Services/CityAndProvinceService.php @@ -0,0 +1,171 @@ +code_city = CodeCity::all(); + $this->code_province = CodeProvince::all(); + return $this->code_province; + } + + public function getCityByField($field,$value) + { + $this->code_city = CodeCity::where($field,$value); + return $this->code_city->get(); + } + + public function getProvinceByField($field,$value) + { + $this->code_province = CodeProvince::where($field,$value); + return $this->code_province->get(); + } + + public function storeCity($value) + { + $this->code_city = new CodeCity; + + $uuid = new UuidHelper; + $this->code_city->city_uuid = $uuid->generate_uuid1(); + $this->code_city->code = $value['code']; + $this->code_city->name = $value['name']; + // $this->code_city->province_id = $value['province_id']; + $this->code_city->is_active = 1; + $this->code_city->created_by = 0; + + if ($this->code_city->save()) + { + return $this->code_city->province_id; + } + else + { + return false; + } + } + + public function storeProvince($value) + { + $this->code_province = new CodeProvince; + + $uuid = new UuidHelper; + $this->code_province->province_uuid = $uuid->generate_uuid1(); + $this->code_province->code = $value['code']; + $this->code_province->name = $value['name']; + $this->code_province->is_active = 1; + $this->code_province->created_by = 0; + + if ($this->code_province->save()) + { + return $this->code_province->province_id; + } + else + { + return false; + } + + } + + public function updateProvince($value) + { + $this->code_province = CodeProvince::where([ + ['province_id',$value['province_id']] + ])->first(); + + $this->code_province->code = $value['code']; + $this->code_province->name = $value['name']; + + if ($this->code_province->save()) + { + return $this->code_province; + } + else + { + return false; + } + } + + public function updateCity($value) + { + $this->code_city = CodeCity::where([ + ['city_id',$value['city_id']] + ])->first(); + $this->code_city->code = $value['code']; + $this->code_city->name = $value['name']; + $this->code_city->is_active = 1; + // $this->code_city->province_id = $value['province_id']; + + if ($this->code_city->save()) + { + return $this->code_city; + } + else + { + return false; + } + } + + public function getAllRelationship() + { + $this->code_province = CodeProvince::select(DB::raw('code_province.*,code_city.name as city_name, city_uuid')) + ->leftJoin('code_city', 'code_province.province_id', '=','code_city.province_id') + ->orderBy('code_province.name','asc') + ->orderBy('code_city.name','asc') + ->get(); + + return $this->code_province; + } + + public function getAllCities() + { + $this->code_cities = CodeCity::select(DB::raw('*')) + ->where('is_active',1) + ->orderBy('name','asc') + ->get(); + + return $this->code_cities; + } + + public function disbale_cities($ids){ + $toUpdate = []; + $toUpdate['is_active'] = 0; + CodeCity::whereIn('city_id', $ids) + ->update($toUpdate); + } + + +} diff --git a/app/Services/CodeCivilStatusService.php b/app/Services/CodeCivilStatusService.php new file mode 100644 index 0000000..23fa3c4 --- /dev/null +++ b/app/Services/CodeCivilStatusService.php @@ -0,0 +1,33 @@ +civilStatus = CodeCivilStatus::where('is_active',1) + ->where('code','!=','0') + ->get(); + + return $this->civilStatus; + } + + +} diff --git a/app/Services/CodeFuelTypeService.php b/app/Services/CodeFuelTypeService.php new file mode 100644 index 0000000..aae28ab --- /dev/null +++ b/app/Services/CodeFuelTypeService.php @@ -0,0 +1,31 @@ +fueltype = CodeFuelType::where('is_active',1)->get(); + + return $this->fueltype; + } + + +} diff --git a/app/Services/CodeGenderService.php b/app/Services/CodeGenderService.php new file mode 100644 index 0000000..19f078d --- /dev/null +++ b/app/Services/CodeGenderService.php @@ -0,0 +1,33 @@ +civilStatus = CodeGender::where('is_active',1) + ->where('code','!=','0') + ->get(); + + return $this->civilStatus; + } + + +} diff --git a/app/Services/CodeVehicleOwnService.php b/app/Services/CodeVehicleOwnService.php new file mode 100644 index 0000000..0675d65 --- /dev/null +++ b/app/Services/CodeVehicleOwnService.php @@ -0,0 +1,31 @@ +vehicleOwn = CodeVehicleOwn::all(); + + return $this->vehicleOwn; + } + + +} diff --git a/app/Services/FuelTrackerService.php b/app/Services/FuelTrackerService.php new file mode 100644 index 0000000..b439d95 --- /dev/null +++ b/app/Services/FuelTrackerService.php @@ -0,0 +1,98 @@ +where('lcard_id', $lcard_id); + $list = $list->orderBy("created_at","asc"); + return $list->get(); + } + + public function store($request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->fuel_tracker = new FuelTracker; + + $uuid = new UuidHelper; + $this->fuel_tracker->lcard_id = $request->lcard_id; + $this->fuel_tracker->fueltracker_uuid = $uuid->generate_uuid1(); + $this->fuel_tracker->fueltype_id = $request->fueltype_id; + $this->fuel_tracker->date = $request->date; + $this->fuel_tracker->kml = $request->kml; + $this->fuel_tracker->km = $request->km; + $this->fuel_tracker->price = $request->price; + $this->fuel_tracker->liters = $request->liters; + $this->fuel_tracker->total = $request->total; + + return $this->fuel_tracker->save() ? $this->fuel_tracker->fueltracker_id : false; + } + + public function update($request) + { + $this->fuel_tracker = FuelTracker::where(['fueltracker_uuid' => $request->fueltracker_uuid, 'lcard_id' => $request->lcard_id, 'is_active' => 1])->first(); + + if (!$this->fuel_tracker){ + return false; + } + + $this->fuel_tracker->fueltype_id = $request->fueltype_id; + $this->fuel_tracker->date = $request->date; + $this->fuel_tracker->kml = $request->kml; + $this->fuel_tracker->km = $request->km; + $this->fuel_tracker->price = $request->price; + $this->fuel_tracker->liters = $request->liters; + $this->fuel_tracker->total = $request->total; + + return $this->fuel_tracker->save() ? $this->fuel_tracker : false; + + } + + + public function getByFieldAndLcardId($field,$value, $lcard_id) + { + $this->fuel_tracker = FuelTracker::where([$field => $value,'lcard_id' => $lcard_id, 'is_active' =>1])->first(); + + return $this->fuel_tracker ? $this->fuel_tracker->get() : false; + } + + public function delete($uuid) + { + $this->fuel_tracker = FuelTracker::where('fueltracker_uuid',$uuid)->first(); + $this->fuel_tracker->is_active = 0; + + if ($this->fuel_tracker->save()) + return $this->fuel_tracker->fueltracker_id; + else + return false; + } + + +} diff --git a/app/Services/IDNumberTypeService.php b/app/Services/IDNumberTypeService.php new file mode 100644 index 0000000..f2b1f2c --- /dev/null +++ b/app/Services/IDNumberTypeService.php @@ -0,0 +1,34 @@ +cardType = $cardType; + } + + + +} \ No newline at end of file diff --git a/app/Services/LcardActionLogsService.php b/app/Services/LcardActionLogsService.php new file mode 100644 index 0000000..07d28f0 --- /dev/null +++ b/app/Services/LcardActionLogsService.php @@ -0,0 +1,104 @@ +modules = [ + 'LOGIN' => 'Login', + 'OTP' => 'OTP', + 'PROFILE' => 'OTP', + 'STATIONLOCATOR' => 'Station Locator', + 'FUELTRACKER' => 'FUELTRACKER', + 'TRANSACTIONS' => 'Transactions', + 'RATINGS' => 'Ratings', + 'PAYMENTS' => 'Payment', + 'SHAREDTREATS' => 'SHAREDTREATS', + 'CRONJOB' => 'CRONJOB', + 'SIGNUP' => 'Sign Up', + ]; + + $this->actions = [ + 'STORE' => 'store', + 'UPDATE' => 'update', + 'DELETE' => 'delete', + 'VIEW' => 'view', + 'ACTIVATE' => 'activate', + 'GENERATE' => 'generate', + 'EXPORT' => 'export', + 'LOGIN' => 'login', + 'LOGOUT' => 'logout', + 'ATTEMPT' => 'attempt', + 'LOCKED' => 'locked', + 'SEARCH' => 'search', + 'INACTIVE' => 'inactive', + ]; + } + + public function getByField($field,$value) + { + $this->lcardActionLogs = LcardActionLogs::where($field,$value) + ->orderBy('created_dt','desc'); + return $this->lcardActionLogs->get(); + } + + public function log($id, $module, $action, $remarks = '') + { + if(isset($this->modules[$module]) && isset($this->actions[$action])) + { + + $currentUser = CurrentUserHelper::get_currentMember(); + + $this->lcardActionLogs = new LcardActionLogs; + + $this->lcardActionLogs->id = $id; + $this->lcardActionLogs->module = $this->modules[$module]; + $this->lcardActionLogs->action = $this->actions[$action]; + $this->lcardActionLogs->created_by = isset( $currentUser ) ? $currentUser->lcard_id : $id; + + if($remarks != '') + $this->lcardActionLogs->remarks = $remarks; + + if ($this->lcardActionLogs->save()) + { + return true; + } + } + + return false; + + } + + public function getByFieldWithOperator($field, $operator, $value) + { + $this->lcardActionLogs = LcardActionLogs::selectRaw('*, max(lactivity_id) as last') + ->where($field,$value) + ->groupBy('created_at')->orderBy('created_at','desc'); + return $this->lcardActionLogs->get(); + } + +} diff --git a/app/Services/LoyaltyCardService.php b/app/Services/LoyaltyCardService.php new file mode 100644 index 0000000..fb70aeb --- /dev/null +++ b/app/Services/LoyaltyCardService.php @@ -0,0 +1,490 @@ +cardType = $cardType; + } + + public function listing($params) + { + + $pagination = ListHelper::validatePagination($params['page_size'],$params['page']); + $list = LoyaltyCard::with(['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType']); + + if($params['search'] != null) + { + // $list = $list->whereHas('personalDetails', function ($query) use ($params) { + // $query->where('firstname', 'LIKE', '%'.$params['search'].'%'); + // $query->orWhere('lastname', 'LIKE', '%'.$params['search'].'%'); + // }) + // ->orWhere(function($query) use ($params){ + // $query->orWhere('card_number', 'LIKE', '%'.$params['search'].'%'); + // }); + + $list = $list->where(function($list_or) use ($params){ + $list_or->whereHas('personalDetails', function ($query) use ($params) { + $query->where('firstname', 'LIKE', '%'.$params['search'].'%'); + $query->orWhere('lastname', 'LIKE', '%'.$params['search'].'%'); + }) + ->orWhere(function($query) use ($params){ + $query->orWhere('card_number', 'LIKE', '%'.$params['search'].'%'); + }); + }); + } + + if($params['filter']) + { + $list->where(function($query) use ($params){ + foreach($params['filter'] as $field => $value) + { + if($value != null) + { + if(is_array($value)) + { + foreach ($value as $v) { + $v = $field == 'is_validated' ? StaticContents::member_status($v, true) : $v; + $query->orWhere($field, $v); + } + } + else + { + $value = $field == 'is_validated' ? StaticContents::member_status($value, true) : $value; + $query->orWhere($field, $value); + } + } + } + }); + } + + // query works if you put it in last + $list = $list->where('loyalty_card.is_active','=',1) + ->where('loyalty_card.is_locked', $params['locked']) + ->where('cyware_synced',1); + + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->sort($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true){ + return $list->paginate($params['page_size']); + }else + return $list->get(); + + } + + public function getAll() + { + $this->loyaltyCard = LoyaltyCard::all(); + return $this->loyaltyCard; + } + + public function getByField($data, $relationship = null) + { + if($relationship) + { + $this->loyaltyCard = LoyaltyCard::with($relationship); + } + else + $this->loyaltyCard = new LoyaltyCard; + + if(count($data)) + { + foreach ($data as $field => $value) { + $this->loyaltyCard = $this->loyaltyCard->where($field,$value); + } + } + + return $this->loyaltyCard->get(); + } + + public function store($pd_id, $data, $deviceUUID = null, $cyware_synced = null) + { + + + $this->loyaltyCard = new LoyaltyCard; + + $uuid = new UuidHelper; + $this->loyaltyCard->lcard_uuid = $uuid->generate_uuid1(); + $this->loyaltyCard->pd_id = $pd_id; + $this->loyaltyCard->card_number = $data->card_number; + $this->loyaltyCard->pin = $data->pin; + $this->loyaltyCard->birthdate = $data->birthdate; + $this->loyaltyCard->mobile = strlen($data->mobile) == 12 ? $data->mobile : '63'.$data->mobile; + $this->loyaltyCard->email = $data->email; + + // for card activation + if(isset($data->deviceUUID) && $data->deviceUUID != null) + $this->loyaltyCard->deviceUUID = $data->deviceUUID; + + // for card enrollment + if($cyware_synced == 1) + { + // get card type id + $cardtype = $this->cardType->getByField([ + 'code' => $data->card_type_code, + 'is_active' => 1 + ]); + + $card_id = count($cardtype) ? $cardtype[0]['cardtype_id'] : 0; + $this->loyaltyCard->cardtype_id = $card_id; + $this->loyaltyCard->expiry_date = $data->expiry_date; + $this->loyaltyCard->last_synchronized = date('Y-m-d H:i:s'); + // $this->loyaltyCard->is_validated = 1; + // $this->loyaltyCard->validation_dt = date('Y-m-d H:i:s'); + + if($deviceUUID != null) + $this->loyaltyCard->deviceUUID = $deviceUUID; + + if($cyware_synced != null) + $this->loyaltyCard->cyware_synced = $cyware_synced; + } + + + if ($this->loyaltyCard->save()) + { + return [ + 'lcard_uuid' => $this->loyaltyCard->lcard_uuid, + 'lcard_id' => $this->loyaltyCard->lcard_id, + ]; + } + else + { + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = LoyaltyCard::with($relationship) + ->whereIn($field,$value)->get(); + } + else + { + $details = LoyaltyCard::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->loyaltyCard = LoyaltyCard::whereIn('lcard_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + if($this->loyaltyCard) + return true; + else + return false; + } + else + { + + $this->loyaltyCard = LoyaltyCard::where('lcard_uuid',$uuid)->first(); + $this->loyaltyCard->is_active = 0; + $this->loyaltyCard->updated_by = $currentUser->id; + + if ($this->loyaltyCard->save()) + return true; + else + return false; + } + + } + + public function show($uuid,$relationship = null) + { + if($relationship) + { + $this->loyaltyCard = LoyaltyCard::with($relationship)->whereLcardUuid($uuid)->first(); + } + else + $this->loyaltyCard = LoyaltyCard::whereLcardUuid($uuid)->first(); + + return $this->loyaltyCard; + } + + public function activate_locked($uuid) + { + $this->loyaltyCard = LoyaltyCard::where('lcard_uuid',$uuid)->first(); + + $this->loyaltyCard->is_locked = 0; + // $this->loyaltyCard->lock_code = ''; + // $this->loyaltyCard->lock_dt = null; + + if ($this->loyaltyCard->save()) + { + return true; + } + else + { + return false; + } + } + + public function numberOfOTPAttempts($lcard_uuid) + { + $this->loyaltyCard = LoyaltyCard::with('otpAttempts') + ->where('lcard_uuid',$lcard_uuid) + ->numberOfOTPAttempts() + ->first(); + + return $this->loyaltyCard; + } + + public function lockMember($id,$lock_code) + { + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$id)->first(); + + $this->loyaltyCard->is_locked = 1; + $this->loyaltyCard->lock_code = $lock_code; + $this->loyaltyCard->lock_dt = date('Y-m-d H:i:s'); + + if ($this->loyaltyCard->save()) + { + return true; + } + else + { + return false; + } + } + + public function validateMember($id) + { + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$id)->first(); + + $this->loyaltyCard->is_validated = 1; + $this->loyaltyCard->validation_dt = date('Y-m-d H:i:s'); + + if ($this->loyaltyCard->save()) + { + return true; + } + else + { + return false; + } + } + + public function update($request, $id) + { + + $civil_status = $request->has('civilstatus_code') ? CodeCivilStatus::code($request->civilstatus_code)->first() : null; + $vehicle_own = $request->has('vo_code') ? CodeVehicleOwn::code($request->vo_code)->first() : null; + $fuel_type = $request->has('fueltype_code') ? CodeFuelType::code($request->fueltype_code)->first() : null; + $gender = $request->has('gender_code') ? CodeGender::code($request->gender_code)->first() : null; + + + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$id)->first(); + + $this->loyaltyCard->mobile = strlen($request->mobile) == 12 ? $request->mobile : '63'.$request->mobile; + $this->loyaltyCard->email = $request->email; + // $this->loyaltyCard->city_id = $request->city_id; + $this->loyaltyCard->city_name = $request->city; + $this->loyaltyCard->civilstatus_id = $civil_status ? $civil_status->civilstatus_id : 0; + $this->loyaltyCard->vo_id = $vehicle_own ? $vehicle_own->vo_id : 0; + $this->loyaltyCard->fueltype_id = $fuel_type ? $fuel_type->fueltype_id : 0; + $this->loyaltyCard->gender_id = $gender ? $gender->gender_id : 0; + $this->loyaltyCard->updated_by = $id; + + if ($this->loyaltyCard->save()) + { + return true; + } + else + { + return false; + } + + } + + public function setInactive($id) + { + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$id)->first(); + $this->loyaltyCard->is_validated = 0; + return $this->loyaltyCard->save() ? true : false; + } + + public function remove_deviceuuid($card_number, $deactivated = 0) + { + $this->loyaltyCard = LoyaltyCard::where('card_number',$card_number) + ->where('is_active',1) + ->first(); + $this->loyaltyCard->deviceUUID = ""; + $this->loyaltyCard->cyware_deactivated = $deactivated; + return $this->loyaltyCard->save() ? true : false; + } + + public function update_deviceuuid($lcard_id,$deviceUUID) + { + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$lcard_id) + ->first(); + $this->loyaltyCard->deviceUUID = $deviceUUID; + return $this->loyaltyCard->save() ? true : false; + } + + public function sync_cyware($data) + { + // get card type id + $cardtype = $this->cardType->getByField([ + 'code' => $data->card_type_code, + 'is_active' => 1 + ]); + + $card_id = count($cardtype) ? $cardtype[0]['cardtype_id'] : 0; + + $this->loyaltyCard = LoyaltyCard::where('card_number',$data->card_number)->first(); + + $this->loyaltyCard->card_number = $data->card_number; + $this->loyaltyCard->pin = $data->pin; + $this->loyaltyCard->cardtype_id = $card_id; + $this->loyaltyCard->expiry_date = $data->expiry_date; + $this->loyaltyCard->birthdate = $data->birthdate; + $this->loyaltyCard->mobile = strlen($data->mobile) == 12 ? $data->mobile : '63'.$data->mobile; + $this->loyaltyCard->email = $data->email; + $this->loyaltyCard->total_pts_earn = $data->total_pts_earn; + $this->loyaltyCard->total_pts_redeem = $data->total_pts_redeem; + $this->loyaltyCard->total_pts_bal = $data->total_pts_bal; + $this->loyaltyCard->last_synchronized = date('Y-m-d H:i:s'); + + if ($this->loyaltyCard->save()) + { + return $this->loyaltyCard->pd_id; + } + else + { + return false; + } + } + + public function cyware_activate($lcard_id, $data) + { + // get card type id + $cardtype = $this->cardType->getByField([ + 'code' => $data->card_type_code, + 'is_active' => 1 + ]); + + $card_id = count($cardtype) ? $cardtype[0]['cardtype_id'] : 0; + + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$lcard_id)->first(); + + $this->loyaltyCard->cardtype_id = $card_id; + $this->loyaltyCard->expiry_date = $data->expiry_date; + $this->loyaltyCard->last_synchronized = date('Y-m-d H:i:s'); + $this->loyaltyCard->cyware_synced = 1; + $this->loyaltyCard->is_locked = 0; + $this->loyaltyCard->lock_code = ''; + $this->loyaltyCard->lock_dt = null; + + if ($this->loyaltyCard->save()) + { + return true; + } + else + { + return false; + } + } + + public function update_non_cyware_synced($lcard_id, $data) + { + $this->loyaltyCard = LoyaltyCard::where('lcard_id',$lcard_id)->first(); + + $this->loyaltyCard->card_number = $data->card_number; + $this->loyaltyCard->pin = $data->pin; + $this->loyaltyCard->birthdate = $data->birthdate; + $this->loyaltyCard->mobile = strlen($data->mobile) == 12 ? $data->mobile : '63'.$data->mobile; + $this->loyaltyCard->email = $data->email; + $this->loyaltyCard->last_synchronized = date('Y-m-d H:i:s'); + + if($data->deviceUUID != null) + $this->loyaltyCard->deviceUUID = $data->deviceUUID; + + if ($this->loyaltyCard->save()) + { + return true; + } + else + { + return false; + } + } + + public function store_signup($pd_id, $data) + { + $this->loyaltyCard = new LoyaltyCard; + + $uuid = new UuidHelper; + $this->loyaltyCard->lcard_uuid = $uuid->generate_uuid1(); + $this->loyaltyCard->pd_id = $pd_id; + $this->loyaltyCard->card_number = $data->card_number; + $this->loyaltyCard->pin = $data->pin; + $this->loyaltyCard->birthdate = $data->birthdate; + $this->loyaltyCard->mobile = $data->mobile; + $this->loyaltyCard->email = $data->email; + + $this->loyaltyCard->cardtype_id = $data->card_id; + // $this->loyaltyCard->expiry_date = $data->expiry_date; + $this->loyaltyCard->is_validated = 1; + $this->loyaltyCard->validation_dt = date('Y-m-d H:i:s'); + $this->loyaltyCard->cyware_synced = 1; + $this->loyaltyCard->last_synchronized = date('Y-m-d H:i:s'); + + + + if ($this->loyaltyCard->save()) + { + return [ + 'lcard_uuid' => $this->loyaltyCard->lcard_uuid, + 'lcard_id' => $this->loyaltyCard->lcard_id, + ]; + } + else + { + return false; + } + } + +} diff --git a/app/Services/LoyaltyCardSignUpService.php b/app/Services/LoyaltyCardSignUpService.php new file mode 100644 index 0000000..1c038e0 --- /dev/null +++ b/app/Services/LoyaltyCardSignUpService.php @@ -0,0 +1,155 @@ +cardType = $cardType; + } + + public function store($data) + { + + $this->loyaltyCardSignUp = new LoyaltyCardSignUp; + + $uuid = new UuidHelper; + $this->loyaltyCardSignUp->lcard_s_uuid = $uuid->generate_uuid1(); + $this->loyaltyCardSignUp->firstname = $data->firstname; + $this->loyaltyCardSignUp->lastname = $data->lastname; + $this->loyaltyCardSignUp->email = $data->email; + $this->loyaltyCardSignUp->mobile = strlen($data->mobile) == 12 ? $data->mobile : '63'.$data->mobile; + $this->loyaltyCardSignUp->birthdate = $data->birthdate; + $this->loyaltyCardSignUp->deviceUUID = $data->deviceUUID; + $this->loyaltyCardSignUp->created_at = date('Y-m-d H:i:s'); + + $cardtype = $this->cardType->getByField([ + 'code' => $data->card_type_code, + 'is_active' => 1 + ]); + $card_id = count($cardtype) ? $cardtype[0]['cardtype_id'] : 0; + $this->loyaltyCardSignUp->cardtype_id = $card_id; + + if($this->loyaltyCardSignUp->save()) + return $this->loyaltyCardSignUp->lcard_s_uuid; + else + return false; + } + + public function upload_document($request) + { + $this->loyaltyCardSignUp = LoyaltyCardSignUp::where('lcard_s_uuid',$request->lcard_s_uuid)->first(); + + $s3 = new S3; + + if($request->hasFile('photo_id')) + { + $path = $s3->upload($request->file('photo_id'),'signupDocuments/'.$this->loyaltyCardSignUp->lcard_s_id,'photo_id'); + $this->loyaltyCardSignUp->photo_id = $path; + } + + if($request->hasFile('photo_document')) + { + $path = $s3->upload($request->file('photo_document'),'signupDocuments/'.$this->loyaltyCardSignUp->lcard_s_id,'photo_document'); + $this->loyaltyCardSignUp->photo_document = $path; + } + + if($request->hasFile('selfie')) + { + $path = $s3->upload($request->file('selfie'),'signupDocuments/'.$this->loyaltyCardSignUp->lcard_s_id,'selfie'); + $this->loyaltyCardSignUp->selfie = $path; + } + + if($request->hasFile('selfie_w_card')) + { + $path = $s3->upload($request->file('selfie_w_card'),'signupDocuments/'.$this->loyaltyCardSignUp->lcard_s_id,'selfie_w_card'); + $this->loyaltyCardSignUp->selfie_w_card = $path; + } + + if($request->has('id_number') && $request->id_number != '' && $request->id_number != null) + { + $this->loyaltyCardSignUp->id_number = $request->id_number; + if($request->has('idnt_uuid')) + { + $idnt = IDNumberType::where('idnt_uuid',$request->idnt_uuid)->first(); + $this->loyaltyCardSignUp->idnt_id = $idnt->idnt_id; + } + } + + + if($this->loyaltyCardSignUp->save()) + return true; + else + return false; + + } + + public function count_between($from,$to) + { + $count = LoyaltyCardSignUp::where('is_active',1) + ->where('ref_no','>=','') + ->where('created_at','>=',$from) + ->where('created_at','<=',$to) + ->count(); + + return $count; + } + + public function assign_ref_no($lcard_s_uuid,$ref_no) + { + $this->loyaltyCardSignUp = LoyaltyCardSignUp::where('lcard_s_uuid',$lcard_s_uuid)->first(); + + $this->loyaltyCardSignUp->ref_no = $ref_no; + + if($this->loyaltyCardSignUp->save()) + return true; + else + return false; + + } + + public function getByField($data, $relationship = null) + { + if($relationship) + { + $this->loyaltyCardSignUp = LoyaltyCardSignUp::with($relationship); + } + else + $this->loyaltyCardSignUp = new LoyaltyCardSignUp; + + if(count($data)) + { + foreach ($data as $field => $value) { + $this->loyaltyCardSignUp = $this->loyaltyCardSignUp->where($field,$value); + } + } + + return $this->loyaltyCardSignUp->get(); + } + + +} \ No newline at end of file diff --git a/app/Services/MabileAnalyticsService.php b/app/Services/MabileAnalyticsService.php new file mode 100644 index 0000000..dc6f372 --- /dev/null +++ b/app/Services/MabileAnalyticsService.php @@ -0,0 +1,87 @@ +where('date','>=',date('Y-m-d',strtotime($params['date_start']))) + ->where('date','<=',date('Y-m-d',strtotime($params['date_end']))); + } + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($export) + return $list->get(); + else + return $list->paginate($params['page_size']); + + } + + private function check_existing() + { + $date = date('Y-m-d'); + + $data = MobileAnalytics::where('date',$date)->first(); + + if($data) + $this->mobileAnalytics = $data; + else + { + $this->mobileAnalytics = new MobileAnalytics(); + $this->mobileAnalytics->date = $date; + } + + } + + public function add_active() + { + $this->check_existing(); + $this->mobileAnalytics->active = isset($this->mobileAnalytics->active) ? $this->mobileAnalytics->active + 1 : 1; + $this->mobileAnalytics->save(); + } + + public function add_inactive() + { + $this->check_existing(); + $this->mobileAnalytics->inactive = isset($this->mobileAnalytics->inactive) ? $this->mobileAnalytics->inactive + 1 : 1; + $this->mobileAnalytics->save(); + } + + public function add_locked() + { + $this->check_existing(); + $this->mobileAnalytics->locked = isset($this->mobileAnalytics->locked) ? $this->mobileAnalytics->locked + 1 : 1; + $this->mobileAnalytics->save(); + } + + +} \ No newline at end of file diff --git a/app/Services/MpinCodesService.php b/app/Services/MpinCodesService.php new file mode 100644 index 0000000..d5e0a87 --- /dev/null +++ b/app/Services/MpinCodesService.php @@ -0,0 +1,73 @@ +get(); + return $details; + } + + public function getMpin($customerNumber) + { + $this->mpin = MpinCodes::where([ + 'customer_number' => $customerNumber + ])->first(); + return $this->mpin; + } + + public function updateMpin($customerNumber,$data){ + $this->mpin = MpinCodes::where([ + 'customer_number' => $customerNumber + ])->first(); + + $this->mpin->mpin_code = $data['mpin_code']; + + if ($this->mpin->save()) + { + return true; + } + else + { + return false; + } + } + + public function store($data) + { + $this->mpin = new MpinCodes; + + $this->mpin->customer_number = $data['customer_number']; + $this->mpin->mpin_code = $data['mpin_code']; + + if ($this->mpin->save()) + { + return true; + } + else + { + return false; + } + } + +} + diff --git a/app/Services/OtpAttemptsService.php b/app/Services/OtpAttemptsService.php new file mode 100644 index 0000000..9b01d82 --- /dev/null +++ b/app/Services/OtpAttemptsService.php @@ -0,0 +1,47 @@ +otp_attempts = OtpAttempts::where('lcard_id',$id)->delete(); + return $this->otp_attempts; + } + + public function store($id, $otp) + { + $this->otp_attempts = new OtpAttempts; + + $this->otp_attempts->lcard_id = $id; + $this->otp_attempts->otp = $otp; + $this->otp_attempts->created_at = date('Y-m-d H:i:s'); + + if($this->otp_attempts->save()) + { + return true; + } + else + { + return false; + } + } + +} diff --git a/app/Services/OtpLogService.php b/app/Services/OtpLogService.php new file mode 100644 index 0000000..3c88be9 --- /dev/null +++ b/app/Services/OtpLogService.php @@ -0,0 +1,101 @@ +otp_log = new OtpLogs; + + $this->otp_log->lcard_id = $lcard_id; + $this->otp_log->otp = $data['otp']; + $this->otp_log->msisdn = $data['msisdn']; + $this->otp_log->content = $data['content']; + $this->otp_log->rcvd_transid = $data['rcvd_transid']; + $this->otp_log->transid = $data['transid']; + $this->otp_log->created_at = date('Y-m-d H:i:s'); + if($this->otp_log->save()) + return true; + else + return false; + } + + public function getByField($data) + { + $this->otp_log = new OtpLogs; + + foreach ($data as $field => $value) { + $this->otp_log = $this->otp_log->where($field,$value); + } + + $this->otp_log = $this->otp_log->orderBy('created_at','desc'); + return $this->otp_log->get(); + } + + public function getLastLog($lcard_id) + { + $this->otp_log = OtpLogs::where('lcard_id',$lcard_id) + ->orderBy('created_at', 'desc') + ->first(); + + return $this->otp_log; + } + + public function getLastLogByNumber($number) + { + $this->otp_log = OtpLogs::where('msisdn',$number) + ->orderBy('created_at', 'desc') + ->first(); + + return $this->otp_log; + } + + public function setUsed($id) + { + $this->otp_log = OtpLogs::where('otplog_id',$id)->first(); + + $this->otp_log->used = 1; + $this->otp_log->used_at = date('Y-m-d H:i:s'); + + if ($this->otp_log->save()) + { + return true; + } + else + { + return false; + } + } + + public function getLastLog_limit($limit,$card_number) + { + + $this->otp_log = OtpLogs::where('lcard_id',$card_number) + ->orderBy('created_at', 'desc') + ->limit($limit) + ->get(); + + return $this->otp_log; + } + + +} diff --git a/app/Services/PasswordLogsService.php b/app/Services/PasswordLogsService.php new file mode 100644 index 0000000..e6706b9 --- /dev/null +++ b/app/Services/PasswordLogsService.php @@ -0,0 +1,69 @@ +passwordLogs = new PasswordLogs; + + $this->passwordLogs->admin_id = $admin_id; + $this->passwordLogs->password = md5($password); + $this->passwordLogs->generated_password = $password; + $this->passwordLogs->created_by = $created_by; + $this->passwordLogs->created_dt = date('Y-m-d H:i:s'); + + if($is_generated) + $this->passwordLogs->is_generated = 1; + + $this->passwordLogs->save(); + } + + public function getByField($data) + { + $this->passwordLogs = new PasswordLogs; + + if(count($data)) + { + foreach ($data as $field => $value) { + $this->passwordLogs = $this->passwordLogs->where($field,$value); + } + } + return $this->passwordLogs->get(); + } + + public function getLastLog($admin_id) + { + $this->passwordLogs = PasswordLogs::where('admin_id',$admin_id) + ->orderBy('created_dt', 'desc') + ->first(); + + return $this->passwordLogs; + } + + +} diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php new file mode 100644 index 0000000..3bcf39f --- /dev/null +++ b/app/Services/PaymentService.php @@ -0,0 +1,247 @@ +where('payments.is_active','=',1) + ->where('payments.cyware_synced','=',1) + ->where('station_id',StaticContents::app_station_id()); + + if($params['date_start'] != null && $params['date_end'] != null) + { + $list = $list->where('paid_at','>=',date('Y-m-d',strtotime($params['date_start'])).' 00:00:00') + ->where('paid_at','<=',date('Y-m-d',strtotime($params['date_end'])).' 23:59:59'); + } + + if($params['search'] != null) + { + $list = $list->whereHas('loyaltyCard', function ($query) use ($params) { + $query->where('card_number', 'LIKE', '%'.$params['search'].'%'); + }); + } + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->sort($sorting['field'],$sorting['sort_order']); + } + + if($export) + return $list->get(); + else + return $list->paginate($params['page_size']); + + } + + public function get_by_trans_num($trans_num) + { + $data = Payment::with(['ratings','items']) + ->where('trans_num',$trans_num); + + return $data->first(); + } + + public function store_non_app($data,$member_data) + { + $this->payments = new Payment(); + + $uuid = new UuidHelper; + $this->payments->payment_uuid = $uuid->generate_uuid1(); + $this->payments->lcard_id = $member_data->lcard_id; + $this->payments->station_id = $data['station_id']; + $this->payments->firstname = $member_data->personalDetails->firstname; + $this->payments->lastname = $member_data->personalDetails->lastname; + $this->payments->payer_email = $member_data->email; + $this->payments->trans_num = $data['trans_num']; + // $this->payments->item_name = $data['item_name']; + // $this->payments->item_code = $data['item_code']; + $this->payments->amount = $data['total_amount']; + $this->payments->points = $data['points']; + $this->payments->entry_type_code = $data['entry_type_code']; + $this->payments->entry_type_desc = $data['entry_type_desc']; + // $this->payments->quantity = $data['quantity']; + $this->payments->created_by = $member_data->lcard_id; + + $this->payments->payer_id = 0; + $this->payments->business = ''; + $this->payments->verify_sign = ''; + $this->payments->receiver_email = ''; + + + if($this->payments->save()) + { + $payment_id = $this->payments->payment_id; + + foreach ($data['items'] as $k => $i) { + $this->items = new PaymentsItems(); + $this->items->payment_id = $payment_id; + $this->items->item_name = $i['item']; + $this->items->quantity = $i['quantity']; + $this->items->price = $i['price']; + $this->items->created_at = date('Y-m-d H:i:s'); + $this->items->save(); + } + + return $payment_id; + } + else + return false; + } + + public function store($data,$member_data) + { + $this->payments = new Payment(); + + $uuid = new UuidHelper; + $this->payments->payment_uuid = $uuid->generate_uuid1(); + $this->payments->lcard_id = $member_data->lcard_id; + $this->payments->station_id = StaticContents::app_station_id(); + $this->payments->trans_num = $data['trans_num']; + // $this->payments->item_name = $data['item_name']; + // $this->payments->item_code = $data['item_code']; + $this->payments->amount = $data['amount']; + $this->payments->points = 0; // cannot be known + $this->payments->entry_type_code = $data['entry_type_code']; + $this->payments->entry_type_desc = $data['entry_type_desc']; + // $this->payments->quantity = 1; + $this->payments->created_by = $member_data->lcard_id; + $this->payments->paypal_id = $data['paypal_id']; + $this->payments->other = $data['other']; + $this->payments->status = 0; + + // details to be updated after successful payment from paypal + $this->payments->payer_email = ''; + $this->payments->payer_id = 0; + $this->payments->business = ''; + $this->payments->verify_sign = ''; + $this->payments->receiver_email = ''; + $this->payments->firstname = ''; + $this->payments->lastname = ''; + + + if($this->payments->save()) + { + $payment_id = $this->payments->payment_id; + + foreach ($data['items'] as $k => $i) { + $this->items = new PaymentsItems(); + $this->items->payment_id = $payment_id; + $this->items->item_name = $i['item']; + $this->items->quantity = $i['quantity']; + $this->items->price = $i['price']; + $this->items->created_at = date('Y-m-d H:i:s'); + $this->items->save(); + } + + return $payment_id; + } + else + return false; + } + + public function count_between($lcard_id, $from, $to) + { + $count = Payment::where('is_active',1) + ->where('lcard_id',$lcard_id) + ->where('paid_at','>=',$from) + ->where('paid_at','<=',$to) + ->count(); + + return $count; + } + + public function count_trans_month() + { + $count = Payment::where('is_active',1) + ->where('created_at','>=',date('Y-m-01').' 00:00:00') + ->where('created_at','<=',date('Y-m-t').' 23:59:59') + ->count(); + return $count; + } + + public function failed_transaction($paypal_id,$other) + { + $this->payments = Payment::where('paypal_id',$paypal_id) + ->where('is_active',1) + ->first(); + + if($this->payments->status != 1) + { + $this->payments->status = 2; + $this->payments->other = serialize($other); + + if($this->payments->save()) + return true; + else + return false; + } + + } + + public function success_transaction($trans_num, $data) + { + $this->payments = Payment::where('trans_num',$trans_num) + ->where('is_active',1) + ->first(); + + $this->payments->status = 1; + $this->payments->other = serialize($data['other']); + $this->payments->firstname = $data['firstname']; + $this->payments->lastname = $data['lastname']; + $this->payments->payer_email = $data['payer_email']; + $this->payments->receiver_email = $data['receiver_email']; + $this->payments->paypal_trans_num = $data['paypal_trans_num']; + $this->payments->paid_at = $data['paid_at']; + + if($this->payments->save()) + return true; + else + return false; + + } + + public function cyware_synced($id, $points) + { + $this->payments = Payment::where('payment_id',$id) + ->first(); + + $this->payments->cyware_synced = 1; + $this->payments->points = $points; + + if($this->payments->save()) + return true; + else + return false; + + } + + +} diff --git a/app/Services/PersonalDetailsService.php b/app/Services/PersonalDetailsService.php new file mode 100644 index 0000000..3e5a71a --- /dev/null +++ b/app/Services/PersonalDetailsService.php @@ -0,0 +1,183 @@ +get(); + return $details; + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->personalDetailspersonalDetails = PersonalDetails::whereIn('pd_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->personalDetailspersonalDetails) + return true; + else + return false; + } + else + { + $this->personalDetails = PersonalDetails::where('pd_uuid',$uuid)->first(); + $this->personalDetails->is_active = 0; + $this->personalDetails->updated_by = $currentUser['admin_id']; + + if ($this->personalDetails->save()) + return true; + else + return false; + } + } + + public function store($data) + { + $this->personalDetails = new PersonalDetails; + + $uuid = new UuidHelper; + $this->personalDetails->pd_uuid = $uuid->generate_uuid1(); + + $this->personalDetails->firstname = isset($data->first_name) ? $data->first_name : $data->firstname; + $this->personalDetails->lastname = isset($data->last_name) ? $data->last_name : $data->lastname; + $this->personalDetails->birthdate = $data->birthdate; + $this->personalDetails->middlename = ''; + $this->personalDetails->photo = ''; + $this->personalDetails->address = ''; + + if ($this->personalDetails->save()) + { + return $this->personalDetails->pd_id; + } + else + { + return false; + } + } + + public function update($request, $id) + { + $this->personalDetails = PersonalDetails::where('pd_id',$id)->first(); + + $this->personalDetails->middlename = $request->middlename; + $this->personalDetails->address = $request->address; + + $path = null; + if($request->is_deleted == "true") + { + $this->personalDetails->photo = $path; + } + elseif($request->has('photo')) + { + $s3 = new S3; + $path = $s3->upload($request->file('photo'),'memberPhoto'); + $this->personalDetails->photo = $path; + } + else + { + $path = $this->personalDetails->photo; + } + + if ($this->personalDetails->save()) + { + return $path; + } + else + { + return false; + } + } + + public function sync_cyware($id, $data) + { + $this->personalDetails = PersonalDetails::where('pd_id',$id)->first(); + + $this->personalDetails->firstname = $data->first_name; + $this->personalDetails->lastname = $data->last_name; + $this->personalDetails->birthdate = $data->birthdate; + + if ($this->personalDetails->save()) + { + return true; + } + else + { + return false; + } + } + + + public function update_non_cyware_synced($pd_id, $data) + { + $this->personalDetails = PersonalDetails::where('pd_id',$pd_id)->first(); + + $this->personalDetails->firstname = $data->firstname; + $this->personalDetails->lastname = $data->lastname; + $this->personalDetails->birthdate = $data->birthdate; + + if ($this->personalDetails->save()) + { + return true; + } + else + { + return false; + } + } + + public function store_signup($data) + { + $this->personalDetails = new PersonalDetails; + + $uuid = new UuidHelper; + $this->personalDetails->pd_uuid = $uuid->generate_uuid1(); + + $this->personalDetails->firstname = $data->firstname; + $this->personalDetails->lastname = $data->lastname; + $this->personalDetails->birthdate = $data->birthdate; + $this->personalDetails->middlename = ''; + $this->personalDetails->photo = ''; + $this->personalDetails->address = ''; + + if ($this->personalDetails->save()) + { + return $this->personalDetails->pd_id; + } + else + { + return false; + } + } + + + + +} diff --git a/app/Services/PhotoSliderService.php b/app/Services/PhotoSliderService.php new file mode 100644 index 0000000..9dc7ed8 --- /dev/null +++ b/app/Services/PhotoSliderService.php @@ -0,0 +1,244 @@ +where('is_active','=',1); + + if($params['search'] != null) + { + $list->where(function($query) use ($params){ + $query->where('title', 'LIKE', '%'.$params['search'].'%'); + }); + } + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true) + return $list->paginate($params['page_size']); + else + return $list->get(); + + } + + public function store(Request $request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->photoSlider = new PhotoSlider; + + + $promotion = $request->get('promotion_uuid') != '' ? Promotions::wherePromotionUuid($request->get('promotion_uuid'))->first() : null; + + $s3 = new S3; + + if(is_file($request->image)) + $filePath = $s3->upload($request->file('image'),'photoSlider'); + else + $filePath = $s3->remove_public_path($request->image); + + $uuid = new UuidHelper; + $this->photoSlider->photoslider_uuid = $uuid->generate_uuid1(); + $this->photoSlider->promotion_id = ($promotion ? $promotion->promotion_id : 0); + $this->photoSlider->title = $request->get('title'); + $this->photoSlider->description = $request->get('description'); + $this->photoSlider->date_start = $request->get('date_start'); + $this->photoSlider->date_end = $request->get('date_end'); + $this->photoSlider->image = $filePath; + $this->photoSlider->created_by = $currentUser->admin_id; + + if ($this->photoSlider->save()) + { + return $this->photoSlider->photoslider_id; + } + else + { + return false; + } + } + + public function getByField($field,$value) + { + $this->photoSlider = PhotoSlider::where($field,$value); + return $this->photoSlider->get(); + } + + public function update($request,$uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->photoSlider = PhotoSlider::where('photoslider_uuid',$uuid)->first(); + + + if($this->photoSlider) + { + $promotion = $request->get('promotion_uuid') != '' ? Promotions::wherePromotionUuid($request->get('promotion_uuid'))->first() : null; + + $this->photoSlider->promotion_id = ($promotion ? $promotion->promotion_id : 0); + $this->photoSlider->title = $request->get('title'); + $this->photoSlider->description = $request->get('description'); + $this->photoSlider->date_start = $request->get('date_start'); + $this->photoSlider->date_end = $request->get('date_end'); + $this->photoSlider->updated_by = $currentUser->admin_id; + + if($request->has('image')) + { + $s3 = new S3; + + if(is_file($request->image)) + { + $filePath = $s3->upload($request->file('image'),'photoSlider'); + $this->photoSlider->image = $filePath; + } + else + $this->photoSlider->image = $s3->remove_public_path($request->image); + } + + if ($this->photoSlider->save()) + { + return $this->photoSlider; + } + } + + return false; + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->photoSlider = PhotoSlider::whereIn('photoslider_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->photoSlider) + return true; + else + return false; + } + else + { + $this->photoSlider = PhotoSlider::where('photoslider_uuid',$uuid)->first(); + $this->photoSlider->is_active = 0; + $this->photoSlider->updated_by = $currentUser->admin_id; + + if ($this->photoSlider->save()) + return true; + else + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = PhotoSlider::with($relationship) + ->whereIn($field,$value)->get(); + } + else + { + $details = PhotoSlider::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + + public function count() + { + return PhotoSlider::where('is_active',1)->count(); + } + + public function getPhotoSlider() + { + $date_now = date('Y-m-d H:i:s'); + + $photoslider = PhotoSlider::select( + "photo_slider.photoslider_id as photoslider_id_oder", + "promotion_id as promotion_uuid", + "photo_slider.description", + "promotion_id as is_toppromotion", + "promotion_id as is_gps", + "promotion_id as promo_type", + "photo_slider.promotion_id as promotion_id", + "photo_slider.title as title", + "promotion_id as promotion_date_start", + "promotion_id as promotion_date_end", + "photo_slider.image as image", + "photo_slider.date_start as date_start", + "photo_slider.date_end", + "photo_slider.photoslider_id", + "photo_slider.photoslider_uuid", + "photo_slider.created_at as created_at", + "promotion_id as promotion_title", + "promotion_id as promotion_description", + "promotion_id as promotion_image") + ->where('photo_slider.promotion_id', '=', 0) + ->where('photo_slider.date_start', '<=', $date_now) + ->where('photo_slider.date_end', '>=', $date_now) + ->where('photo_slider.is_active','=',1) + ->orderBy('date_start','asc') + ->orderBy('created_at','asc'); + + $getPromo = PhotoSlider::select( + "photo_slider.photoslider_id as photoslider_id_oder", + "promotions.promotion_uuid", + "promotions.description", + "promotions.is_toppromotion", + "promotions.is_gps", + "promotions.promo_type", + "promotions.promotion_id as promotion_id", + "promotions.title", + "promotions.date_start as promotion_date_start", + "promotions.date_end as promotion_date_end", + "photo_slider.image as image", + "photo_slider.date_start as date_start", + "photo_slider.date_end", + "photo_slider.photoslider_id", + "photo_slider.photoslider_uuid", + "photo_slider.created_at as created_at", + "promotions.title as promotion_title", + "promotions.description as promotion_description", + "promotions.image as promotion_image" + ) + ->join('promotions', 'promotions.promotion_id', '=', 'photo_slider.promotion_id') + ->where('photo_slider.date_start', '<=', $date_now) + ->where('photo_slider.date_end', '>=', $date_now) + ->where('photo_slider.is_active','=',1) + ->union($photoslider); + // return $getPromo->orderBy('photoslider_id_oder','asc')->limit(5)->get(); + return $getPromo->orderBy('date_start','asc')->orderBy('created_at','asc')->limit(5)->get(); + } +} diff --git a/app/Services/ProductDetailsService.php b/app/Services/ProductDetailsService.php new file mode 100644 index 0000000..eb8e4a6 --- /dev/null +++ b/app/Services/ProductDetailsService.php @@ -0,0 +1,162 @@ +product_category = ProductCategory::where($field,$value); + return $this->product_category->get(); + } + public function getProductDetailsByField($field,$value) + { + $this->product_details = ProductDetails::where($field,$value); + return $this->product_details->get(); + } + public function storeProductDetails($value) + { + $this->product_details = new ProductDetails; + + $uuid = new UuidHelper; + $this->product_details->pd_uuid = $uuid->generate_uuid1(); + $this->product_details->code = ""; + $this->product_details->name = $value['name']; + $this->product_details->description = $value['description']; + $this->product_details->details = $value['details']; + $this->product_details->image = $value['image']; + $this->product_details->is_active = 1; + $this->product_details->pc_id = $value['pc_id']; + + if ($this->product_details->save()) + { + return $this->product_details->pd_id; + } + else + { + return false; + } + } + + public function storeProductCategory($value) + { + $this->product_category = new ProductCategory; + + $uuid = new UuidHelper; + $this->product_category->pc_uuid = $uuid->generate_uuid1(); + $this->product_category->type = $value['type']; + $this->product_category->description = $value['description']; + $this->product_category->is_active = 1; + + if ($this->product_category->save()) + { + return $this->product_category->pc_id; + } + else + { + return false; + } + } + + public function updateProductCategory($value) + { + $this->product_category = ProductCategory::where([ + ['pc_id',$value['pc_id']] + ])->first(); + + $this->product_category->type = $value['type']; + $this->product_category->description = $value['description']; + + if ($this->product_category->save()) + { + return $this->product_category; + } + else + { + return false; + } + } + public function updateProductDetails($value) + { + $this->product_details = ProductDetails::where([ + ['pd_id',$value['pd_id']] + ])->first(); + + $this->product_details->code = $value['code']; + $this->product_details->name = $value['name']; + $this->product_details->description = $value['description']; + $this->product_details->details = $value['details']; + $this->product_details->image = $value['image']; + $this->product_details->pc_id = $value['pc_id']; + $this->product_details->is_active = $value['is_active']; + + + if ($this->product_details->save()) + { + return $this->product_details; + } + else + { + return false; + } + } + + public function getAllProductCategory() + { + return $this->product_details = ProductCategory::where([ + ['is_active',1] + ])->get(); + } + + public function getProductsByCategory($pc_id) + { + return $this->product_details = ProductDetails::where([ + ['is_active',1], + ['pc_id',$pc_id], + ]) + ->orderBy('name') + ->get(); + } + + public function inActiveProductDetails() + { + ProductDetails::where('is_active', '=', 1)->update(['is_active' => 0]); + } + +} diff --git a/app/Services/PromotionService.php b/app/Services/PromotionService.php new file mode 100644 index 0000000..367464d --- /dev/null +++ b/app/Services/PromotionService.php @@ -0,0 +1,328 @@ +where('is_active','=',1); + + if($params['search'] != null) + { + $list->where(function($query) use ($params){ + $query->where('title', 'LIKE', '%'.$params['search'].'%'); + }); + } + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true) + return $list->paginate($params['page_size']); + else + return $list->get(); + + } + + public function store(Request $request) + { + + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->promotion = new Promotions; + + $s3 = new S3; + $filePath = $s3->upload($request->file('image'),'promotions'); + + + $uuid = new UuidHelper; + $this->promotion->promotion_uuid = $uuid->generate_uuid1(); + $this->promotion->title = $request->get('title'); + $this->promotion->description = $request->get('description'); + $this->promotion->date_start = $request->get('date_start'); + $this->promotion->date_end = $request->get('date_end'); + $this->promotion->is_toppromotion = $request->get('is_toppromotion'); + $this->promotion->promo_type = $request->get('promo_type'); + $this->promotion->is_gps = $request->get('is_gps'); + $this->promotion->created_by = $currentUser->admin_id; + $this->promotion->image = $filePath; + + + if ($this->promotion->save()) + { + return $this->promotion->promotion_id; + } + + + return false; + + } + + public function getByField($field,$value, $relationship = null) + { + if($relationship) + { + $this->admin = Promotions::with($relationship) + ->where($field,$value); + } + else + $this->admin = Promotions::where($field,$value); + + return $this->admin->get(); + } + + public function update($request,$uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->promotion = Promotions::where('promotion_uuid',$uuid)->first(); + + + if($this->promotion) + { + $this->promotion->title = $request->get('title'); + $this->promotion->description = $request->get('description'); + $this->promotion->date_start = date('Y-m-d H:i:s',strtotime($request->get('date_start'))); + $this->promotion->date_end = date('Y-m-d H:i:s',strtotime($request->get('date_end'))); + $this->promotion->is_toppromotion = $request->get('is_toppromotion'); + $this->promotion->promo_type = $request->get('promo_type'); + $this->promotion->is_gps = $request->get('is_gps'); + $this->promotion->updated_by = $currentUser->admin_id; + + if($request->has('image')) + { + $s3 = new S3; + $path = $s3->upload($request->file('image'),'promotions'); + $this->promotion->image = $path; + } + + + if ($this->promotion->save()) + { + return $this->promotion; + } + } + + return false; + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->promotion = Promotions::whereIn('promotion_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->promotion) + { + $this->promotion = Promotions::whereIn('promotion_uuid',$uuid)->get(); + $promotion_id = []; + foreach ($this->promotion as $key => $value) { + $promotion_id[] = $value->promotion_id; + } + + PhotoSlider::whereIn('promotion_id',$promotion_id) + ->update(['promotion_id' => 0]); + + + return true; + } + else + return false; + } + else + { + $this->promotion = Promotions::where('promotion_uuid',$uuid)->first(); + $this->promotion->is_active = 0; + $this->promotion->updated_by = $currentUser->admin_id; + + PhotoSlider::where('promotion_id',$this->promotion->promotion_id) + ->update(['promotion_id' => 0]); + + if ($this->promotion->save()) + return true; + else + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = Promotions::with($relationship) + ->whereIn($field,$value)->get(); + } + else + { + $details = Promotions::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + + public function get_promotion($include_promotion = null) + { + + $list = Promotions::where('is_active',1) + ->where('date_end', '>=', date('Y-m-d H:i:s')) + ->whereNotIn('promotion_id',function($query) use ($include_promotion) { + $query->select('promotion_id') + ->from('photo_slider') + ->where('is_active',1); + + if($include_promotion != null) + { + $query->where('promotion_uuid','<>',$include_promotion); + } + + }); + + + + return $list->get(); + + } + + public function getTopTwoPromotion($type) + { + $date_now = date('Y-m-d H:i:s'); + + $this->promotion = Promotions::where([ + ['is_toppromotion',1], + ['is_active',1] + ]) + ->where('promo_type',$type) + ->where('date_start', '<=', $date_now) + ->where('date_end', '>=', $date_now); + + return $this->promotion->get(); + } + + public function get_promo_by_date_type($date,$type) + { + $list = Promotions::where('is_active',1) + ->where('promo_type',$type) + ->where('date_start', '<=', $date) + ->where('date_end', '>=', $date); + + return $list->get(); + } + + public function get_promo_by_date_birthdate_type($date,$birthdate,$type) + { + $birthdate = date('Y').'-'.date('m-d',strtotime($birthdate)); + $list = Promotions::where('is_active',1) + ->where('promo_type',$type) + ->where('date_start', '<=', $date) + ->where('date_end', '>=', $date) + ->where('date_start', '<=', $birthdate) + ->where('date_end', '>=', $birthdate); + + return $list->get(); + } + + public function get_promo_by_date_station_gps($station_ids, $date, $type) + { + $list = Promotions::with('promotionStations.station') + ->where('is_active',1) + ->where('is_gps',1) + ->where('promo_type',$type) + ->where('date_start', '<=', $date) + ->where('date_end', '>=', $date) + ->whereHas('promotionStations', function ($query) use ($station_ids) { + $query->whereIn('station_id', $station_ids); + }) + ->orderBy('created_at','desc'); + + return $list->get(); + } + + public function get_promo_by_birthdate_station_gps($station_ids,$date,$birthdate,$type) + { + $birthdate = date('Y').'-'.date('m-d',strtotime($birthdate)); + $list = Promotions::with('promotionStations.station') + ->where('is_active',1) + ->where('is_gps',1) + ->where('promo_type',$type) + ->where('date_start', '<=', $date) + ->where('date_end', '>=', $date) + ->where('date_start', '<=', $birthdate) + ->where('date_end', '>=', $birthdate) + ->whereHas('promotionStations', function ($query) use ($station_ids) { + $query->whereIn('station_id', $station_ids); + }) + ->orderBy('created_at','desc'); + + return $list->get(); + } + + public function expire_top_two() + { + $this->promotion = Promotions::where('is_active',1) + ->where('date_end', '<=', date('Y-m-d H:i:s')) + ->update(['is_toppromotion' => 0]); + + } + + public function get_all_branch_promo($date, $type) + { + $list = Promotions::where('is_active',1) + ->where('is_gps',1) + ->where('promo_type',$type) + ->where('date_start', '<=', $date) + ->where('date_end', '>=', $date) + ->whereDoesntHave('promotionStations', function ($query){}); + + return $list->get(); + } + + public function get_all_branch_promo_by_birthdate($date,$birthdate,$type) + { + $birthdate = date('Y').'-'.date('m-d',strtotime($birthdate)); + $list = Promotions::where('is_active',1) + ->where('is_gps',1) + ->where('promo_type',$type) + ->where('date_start', '<=', $date) + ->where('date_end', '>=', $date) + ->where('date_start', '<=', $birthdate) + ->where('date_end', '>=', $birthdate) + ->whereDoesntHave('promotionStations', function ($query){}); + + return $list->get(); + } + + +} diff --git a/app/Services/PromotionStationsService.php b/app/Services/PromotionStationsService.php new file mode 100644 index 0000000..26db314 --- /dev/null +++ b/app/Services/PromotionStationsService.php @@ -0,0 +1,54 @@ +promotionService = PromotionStations::where($field,$value); + return $this->promotionService->get(); + } + + public function store($promotion_id, $station_ids) + { + foreach ($station_ids as $key => $id) { + $this->promotionService = new PromotionStations; + $this->promotionService->promotion_id = $promotion_id; + $this->promotionService->station_id = $id; + + $this->promotionService->save(); + } + + } + + public function delete($promotion_id) + { + $this->promotionService = PromotionStations::where('promotion_id',$promotion_id); + $this->promotionService->delete(); + } + + +} \ No newline at end of file diff --git a/app/Services/RatingsService.php b/app/Services/RatingsService.php new file mode 100644 index 0000000..31df134 --- /dev/null +++ b/app/Services/RatingsService.php @@ -0,0 +1,99 @@ +where('ratings.is_active','=',1); + + if($params['date_start'] != null && $params['date_end'] != null) + { + $list = $list->where('ratings.created_at','>=',date('Y-m-d',strtotime($params['date_start'])).' 00:00:00') + ->where('ratings.created_at','<=',date('Y-m-d',strtotime($params['date_end'])).' 23:59:59'); + } + + + if($params['search'] != null) + { + $list = $list->whereHas('loyaltyCard', function ($query) use ($params) { + $query->where('card_number', 'LIKE', '%'.$params['search'].'%'); + }) + ->orWhereHas('payment', function ($query) use ($params) { + $query->where('item_name', 'LIKE', '%'.$params['search'].'%'); + }) + ->orWhereHas('station', function ($query) use ($params) { + $query->where('description', 'LIKE', '%'.$params['search'].'%'); + }); + } + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->sort($sorting['field'],$sorting['sort_order']); + } + + if($export) + return $list->get(); + else + return $list->paginate($params['page_size']); + + } + + public function store($data) + { + $this->rating = new Ratings(); + + $uuid = new UuidHelper; + $this->rating->rating_uuid = $uuid->generate_uuid1(); + $this->rating->lcard_id = $data['lcard_id']; + $this->rating->station_id = $data['station_id']; + $this->rating->payment_id = $data['payment_id']; + $this->rating->rate = $data['rate']; + $this->rating->created_by = $data['lcard_id']; + + if($this->rating->save()) + return true; + else + return false; + } + + public function update($data,$rating_id) + { + $this->rating = Ratings::where('rating_id',$rating_id)->first(); + + $this->rating->lcard_id = $data['lcard_id']; + $this->rating->station_id = $data['station_id']; + $this->rating->payment_id = $data['payment_id']; + $this->rating->rate = $data['rate']; + $this->rating->updated_by = $data['lcard_id']; + + if($this->rating->save()) + return true; + else + return false; + } + + +} \ No newline at end of file diff --git a/app/Services/RegistrationService.php b/app/Services/RegistrationService.php new file mode 100644 index 0000000..c279ab8 --- /dev/null +++ b/app/Services/RegistrationService.php @@ -0,0 +1,60 @@ +list = LoyaltyCard::query()->select( + 'created_at','created_at as date', + DB::raw("COUNT(CASE WHEN is_validated = '1' THEN 1 END) as activated"), + DB::raw("COUNT(CASE WHEN created_at <> '' THEN 1 END) as registered") + ); + + if($params['date_start'] != null && $params['date_end'] != null) + { + $this->list->whereDate('created_at', '>=', $params['date_start']) + ->whereDate('created_at', '<=', $params['date_end']); + } + + $this->list->groupBy(DB::raw('DATE(created_at)')); + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $this->list = $this->list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($export) + return $this->list->get(); + else + return $this->list->paginate($params['page_size']); + + } + + +} diff --git a/app/Services/SignUpAPICallsService.php b/app/Services/SignUpAPICallsService.php new file mode 100644 index 0000000..7cba1ba --- /dev/null +++ b/app/Services/SignUpAPICallsService.php @@ -0,0 +1,59 @@ +call = new SignUpAPICalls; + $this->call->user_id = $user_id; + $this->call->created_at = date('Y-m-d H:i:s'); + if($this->call->save()) + return $this->call->signup_api_id; + else + return false; + } + + public function success($signup_api_id,$lcard_id) + { + $this->call = SignUpAPICalls::where('signup_api_id',$signup_api_id)->first(); + $this->call->lcard_id = $lcard_id; + + if($this->call->save()) + return true; + else + return false; + + + } + + public function count($date = '') + { + if($date == '') + $date = date('Y-m-d'); + + $data = SignUpAPICalls::where('created_at','>=',$date.' 00:00:00') + ->where('created_at','<=',$date.' 23:59:59') + ->count(); + + return $data; + } + +} \ No newline at end of file diff --git a/app/Services/StationFavoriteService.php b/app/Services/StationFavoriteService.php new file mode 100644 index 0000000..9e438aa --- /dev/null +++ b/app/Services/StationFavoriteService.php @@ -0,0 +1,58 @@ +station_favorite = StationFavorites::with('station') + ->where('lcard_uuid',$lcard_id); + return $this->station_favorite->get(); + } + + public function store($station_id, $lcard_id) + { + $this->station_favorite = new StationFavorites; + + $this->station_favorite->station_id = $station_id; + $this->station_favorite->lcard_id = $lcard_id; + + if($this->station_favorite->save()) + return $this->station_favorite->sf_id; + else + return false; + } + + public function delete($station_id, $lcard_id) + { + $this->station_favorite = StationFavorites::where('station_id',$station_id) + ->where('lcard_id',$lcard_id); + + if($this->station_favorite->delete()) + return true; + else + return false; + } + + +} \ No newline at end of file diff --git a/app/Services/StationFuelPricesService.php b/app/Services/StationFuelPricesService.php new file mode 100644 index 0000000..29ecfe1 --- /dev/null +++ b/app/Services/StationFuelPricesService.php @@ -0,0 +1,103 @@ +stationFuelPrices = new StationFuelPrices; + + $uuid = new UuidHelper; + $this->stationFuelPrices->fuel_price_uuid = $uuid->generate_uuid1(); + $this->stationFuelPrices->station_id = $station_id; + $this->stationFuelPrices->fuel_code = $data['fuel_code']; + $this->stationFuelPrices->fuel_name = $data['fuel_name']; + $this->stationFuelPrices->price = $data['price']; + + + if ($this->stationFuelPrices->save()) + { + return true; + } + else + { + return false; + } + } + + public function getByField($data, $relationship = null, $order_by = null) + { + if($relationship) + { + $this->stationFuelPrices = StationFuelPrices::with($relationship); + } + else + $this->stationFuelPrices = new StationFuelPrices; + + if(count($data)) + { + foreach ($data as $field => $value) { + $this->stationFuelPrices = $this->stationFuelPrices->where($field,$value); + } + } + + if($order_by != null) + $this->stationFuelPrices->orderBy($order_by['field'],$order_by['value']); + + return $this->stationFuelPrices->get(); + } + + public function update_price($uuid,$price) + { + $this->stationFuelPrices = StationFuelPrices::where('fuel_price_uuid',$uuid)->first(); + + + if($this->stationFuelPrices) + { + $this->stationFuelPrices->price = $price; + + if ($this->stationFuelPrices->save()) + { + return $this->stationFuelPrices; + } + } + + return false; + } + + public function delete($station_id,$ids) + { + + $this->stationFuelPrices = StationFuelPrices::where('station_id',$station_id) + ->whereNotIn('fuel_code',$ids) + ->update([ + 'is_active' => 0 + ]); + + + if($this->stationFuelPrices) + return true; + else + return false; + + } + +} \ No newline at end of file diff --git a/app/Services/StationService.php b/app/Services/StationService.php new file mode 100644 index 0000000..acf0186 --- /dev/null +++ b/app/Services/StationService.php @@ -0,0 +1,339 @@ +station = Station::where($field,$value) + ->where('is_active',1) + ->orderBy('description','asc'); + return $this->station->get(); + } + + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = Station::with($relationship) + ->whereIn($field,$value)->get(); + } + else + { + $details = Station::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + + public function radius($meters,$longitude,$latitude) + { + $details = Station::select(DB::raw('station_id, station_uuid, description, address, longitude, latitude, ( + 6371 * + acos( + cos( radians( '.$latitude.' ) ) * + cos( radians( `latitude` ) ) * + cos( + radians( `longitude` ) - radians( '.$longitude.' ) + ) + + sin( radians('.$latitude.') ) * + sin( radians(`latitude`) ) + ) + ) `distance`')) + ->having('distance', '<=', $meters * .001) + ->orderBy('distance','asc') + ->get(); + + return $details; + } + + public function nearby($longitude,$latitude) + { + $member_details = CurrentUserHelper::get_currentMember(); + $details = Station::select(DB::raw('station_id as sid, station_uuid, description, address, longitude, latitude, ( + 6371 * + acos( + cos( radians( '.$latitude.' ) ) * + cos( radians( `latitude` ) ) * + cos( + radians( `longitude` ) - radians( '.$longitude.' ) + ) + + sin( radians('.$latitude.') ) * + sin( radians(`latitude`) ) + ) + ) `distance`, + ( + SELECT AVG(rate) + FROM ratings + WHERE station_id = sid + ) as average , + ( + SELECT COUNT(lcard_id) + FROM station_favorite + WHERE lcard_id = '.$member_details->lcard_id.' + AND station_id = sid + ) as favorite')) + ->where('is_viewable',1) + ->where('city_id','<>','0') // Unioil Tester + ->where('code','<>','1000') // Unioil Tester + ->orderBy('distance','asc'); + return $details->get(); + } + + public function favorites() + { + $member_details = CurrentUserHelper::get_currentMember(); + $details = Station::select(DB::raw('station_id as sid, station_uuid, description, address, longitude, latitude, + ( + SELECT AVG(rate) + FROM ratings + WHERE station_id = sid + ) as average , + ( + SELECT COUNT(lcard_id) + FROM station_favorite + WHERE lcard_id = '.$member_details->lcard_id.' + AND station_id = sid + ) as favorite')) + ->having('favorite','>',0); + + return $details->get(); + } + + public function search_by_keyword($keyword) + { + $details = CodeCity::select(DB::raw('city_id as cid, city_uuid,code_city.name as city_name, + ( + SELECT COUNT(station_id) + FROM station + WHERE city_id = cid + ) as station_count')) + ->leftJoin('code_province', 'code_province.province_id', '=','code_city.province_id') + ->where('code_city.name', 'LIKE', $keyword.'%') + ->orWhere('code_province.name', 'LIKE', $keyword.'%') + ->orderBy('city_name','asc'); + if(count($details->get())){ + if($details->get()[0]->station_count != 0) + return $details->get(); + } + else + return []; + } + + public function search_by_province($province_uuid) + { + $details = CodeCity::select(DB::raw('city_id as cid, city_uuid,code_city.name as city_name, + ( + SELECT COUNT(station_id) + FROM station + WHERE city_id = cid + ) as station_count')) + ->leftJoin('code_province', 'code_province.province_id', '=','code_city.province_id') + ->where('province_uuid', $province_uuid) + ->orderBy('city_name','asc'); + return $details->get(); + } + + public function search_all() + { + $details = CodeCity::select(DB::raw('city_id as cid, city_uuid,code_city.name as name, + ( + SELECT COUNT(station_id) + FROM station + WHERE city_id = cid + ) as count')) + ->where('code_city.is_active',1) + ->orderBy('name','asc') + ->get(); + $return = []; + foreach ($details as $key => $value){ + if($value->count != 0){ + $return[] = $value; + } + } + + return $return; + } + + public function search_by_city($city_uuid) + { + $member_details = CurrentUserHelper::get_currentMember(); + $details = Station::select(DB::raw('station_id as sid, station_uuid, description, address, longitude, latitude, + ( + SELECT AVG(rate) + FROM ratings + WHERE station_id = sid + AND ratings.is_active = 1 + ) as average , + ( + SELECT COUNT(lcard_id) + FROM station_favorite + WHERE lcard_id = '.$member_details->lcard_id.' + AND station_id = sid + ) as favorite')) + ->leftJoin('code_city', 'station.city_id', '=','code_city.city_id') + ->where('city_uuid', $city_uuid) + ->where('is_viewable',1) + ->where('station.code','<>','1000') // Unioil Tester + ->orderBy('description','asc'); + return $details->get(); + } + + public function search_by_uuid($uuid) + { + $member_details = CurrentUserHelper::get_currentMember(); + $details = Station::select(DB::raw('station_id as sid, station_uuid, code, description, address, longitude, latitude, contact_number, + ( + SELECT AVG(rate) + FROM ratings + WHERE station_id = sid + AND ratings.is_active = 1 + ) as average , + ( + SELECT COUNT(lcard_id) + FROM station_favorite + WHERE lcard_id = '.$member_details->lcard_id.' + AND station_id = sid + ) as favorite')) + ->where('station_uuid', $uuid); + return $details->get(); + } + + public function search_by_code($station_code) + { + $details = Station::where('code',$station_code) + ->where('is_active',1) + ->get(); + + return $details; + } + + public function update_content($value) + { + $toUpdate = []; + + if($value->station_name != '') $toUpdate['description'] = $value->station_name; + if($value->longitude != '') $toUpdate['longitude'] = $value->longitude; + if($value->latitude != '') $toUpdate['latitude'] = $value->latitude; + if($value->station_location != '') $toUpdate['address'] = $value->station_location; + if($value->contact_number != '') $toUpdate['contact_number'] = $this->removeSpecial($value->contact_number); + + if($value->city_code != '') + { + $city = CodeCity::where('code',$value->city_code)->first(); + if($city) $toUpdate['city_id'] = $city->city_id; + } + + + Station::where('code',$value->station_code) + ->where('is_active',1) + ->update($toUpdate); + } + + public function store($value) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->station = new Station; + + $uuid = new UuidHelper; + $this->station->station_uuid = $uuid->generate_uuid1(); + + $this->station->code = $value->code; + $this->station->description = $value->description; + $this->station->longitude = $value->longitude; + $this->station->latitude = $value->latitude; + $this->station->address = $value->address; + $this->station->contact_number = $value->contact_number; + $this->station->is_viewable = 1; + $this->station->created_by = $currentUser->admin_id; + $this->station->created_at = date('Y-m-d H:i:s'); + + + if($value->Branch->code != '') + { + $city = CodeCity::where('code',$value->Branch->code)->first(); + if($city) $this->station->city_id = $city->city_id; + } + + + if ($this->station->save()) + { + return $this->station->station_id; + } + else + { + return false; + } + } + + + private function removeSpecial($value){ + return str_replace('(', '', str_replace(')', '', str_replace(' ', '', str_replace('-', '', $value)))); + } +///RNRPH + public function update_stations($value) + { + $toUpdate = []; + + if($value->description != '') $toUpdate['description'] = $value->description; + if($value->longitude != '') $toUpdate['longitude'] = $value->longitude; + if($value->latitude != '') $toUpdate['latitude'] = $value->latitude; + if($value->address != '') $toUpdate['address'] = $value->address; + if($value->contact_number != '') $toUpdate['contact_number'] = $this->removeSpecial($value->contact_number); + + if($value->code != '') + { + $city = CodeCity::where('code',$value->Branch->code)->first(); + if($city) $toUpdate['city_id'] = $city->city_id; + } + + $toUpdate['is_viewable'] = 1; + + Station::where('code',$value->code) + ->where('is_active',1) + ->update($toUpdate); + } + + public function get_active_stations() + { + $stations = Station::where('is_active',1) + ->get(); + return $stations; + } + + public function disbale_stations($ids){ + $toUpdate = []; + $toUpdate['is_viewable'] = 0; + Station::whereIn('station_id', $ids) + ->update($toUpdate); + } + + public function get_station_by_city_uuid($city_id){ + $stations = Station::where('city_id',$city_id) + ->get(); + return $stations; + } +} diff --git a/app/Services/SystemPreferenceService.php b/app/Services/SystemPreferenceService.php new file mode 100644 index 0000000..7c18107 --- /dev/null +++ b/app/Services/SystemPreferenceService.php @@ -0,0 +1,87 @@ +systemPreference = SystemPreference::all(); + return $this->systemPreference; + } + + public function getByField($field,$value) + { + $this->systemPreference = SystemPreference::where($field,$value); + return $this->systemPreference->get(); + } + + public function store(Request $request, $value) + { + + $this->systemPreference = SystemPreference::where([ + ['name',$value['name']] + ])->first(); + + $this->systemPreference->value = $value['value']; + $this->systemPreference->updated_by = $value['updated_by']; + + + if ($this->systemPreference->save()) + { + return true; + } + else + { + return false; + } + } + + public function update($name, $value) + { + $this->systemPreference = SystemPreference::where('name',$name)->first(); + $this->systemPreference->value = $value; + + if ($this->systemPreference->save()) + { + return true; + } + else + { + return false; + } + } + + + + + +} diff --git a/app/Services/TermsAndPrivacyService.php b/app/Services/TermsAndPrivacyService.php new file mode 100644 index 0000000..34f949e --- /dev/null +++ b/app/Services/TermsAndPrivacyService.php @@ -0,0 +1,173 @@ +when($params['search'], function ($query) use ($params) { + + return $query->where('title', 'like', '%'.$params['search'].'%', 'and') + ->where('details', 'like', '%'.$params['search'].'%', 'or' ); + + }); + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true){ + return $list->paginate($params['page_size']); + }else + return $list->get(); + } + + public function store($request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->terms_and_privacy = new TermsAndPrivacy; + + $uuid = new UuidHelper; + $this->terms_and_privacy->tp_uuid = $uuid->generate_uuid1(); + $this->terms_and_privacy->title = $request->get('title'); + $this->terms_and_privacy->details = $request->get('details'); + $this->terms_and_privacy->type = $request->get('type'); + $this->terms_and_privacy->created_by = $currentUser->admin_id; + + if ($this->terms_and_privacy->save()) + { + return $this->terms_and_privacy->tp_id; + } + else + { + return false; + } + } + + public function update($request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + $this->terms_and_privacy = TermsAndPrivacy::where([ + ['tp_uuid',$request->tp_uuid] + ])->first(); + + $this->terms_and_privacy->title = $request->title; + $this->terms_and_privacy->details = $request->details; + $this->terms_and_privacy->type = $request->type; + $this->terms_and_privacy->updated_by = $currentUser->admin_id; + + if ($this->terms_and_privacy->save()) + { + return $this->terms_and_privacy; + } + else + { + return false; + } + } + + public function getByField($field,$value) + { + $this->terms_and_privacy = TermsAndPrivacy::where($field,$value); + return $this->terms_and_privacy->get(); + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->terms_and_privacy = TermsAndPrivacy::whereIn('tp_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->terms_and_privacy) + return true; + else + return false; + } + else + { + $this->terms_and_privacy = TermsAndPrivacy::where('tp_uuid',$uuid)->first(); + + $this->terms_and_privacy->updated_by = $currentUser->admin_id; + $this->terms_and_privacy->is_active = 0; + + if ($this->terms_and_privacy->save()) + return true; + else + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = TermsAndPrivacy::with($relationship)->whereIn($field,$value)->get(); + } + else + { + $details = TermsAndPrivacy::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + + public function check($id) + { + $this->terms_and_privacy = TermsAndPrivacy::where([ + ['tp_uuid',$id] + ])->first(); + + return $this->terms_and_privacy ? $this->terms_and_privacy : false; + } + + public function getAllActive() + { + $return1 = ""; + $return2 = ""; + $lastPart = ""; + $this->terms_and_privacy = TermsAndPrivacy::where("is_active",1)->get(); + + foreach ($this->terms_and_privacy as $key => $value) { + if ($value->type == 1){ + $return1 .= "

$value->title

$value->details

"; + }else{ + $return2 .= "

$value->title

$value->details

"; + } + } + + return $return1.$return2.$lastPart; + } +} diff --git a/app/Services/TopUpService.php b/app/Services/TopUpService.php new file mode 100644 index 0000000..954418b --- /dev/null +++ b/app/Services/TopUpService.php @@ -0,0 +1,160 @@ +where('name', 'like', '%'.$params['search'].'%', 'and') + ->where('fee_code', 'like', '%'.$params['search'].'%', 'or' ); + + }); + + $list = $list->where('is_active','=',1); + + $sorting = $params['sorting']; + if(count($sorting) > 0) + { + $list = $list->orderBy($sorting['field'],$sorting['sort_order']); + } + + if($pagination == true){ + return $list->paginate($params['page_size']); + }else + return $list->get(); + + } + + public function store($request) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + $this->top_up = new TopUp; + + $uuid = new UuidHelper; + $this->top_up->topup_uuid = $uuid->generate_uuid1(); + $this->top_up->fee_code = $request->get('fee_code'); + $this->top_up->name = $request->get('name'); + $this->top_up->amount = $request->get('amount'); + $this->top_up->type = $request->get('type'); + + + if ($this->top_up->save()) + { + return $this->top_up->topup_id; + } + else + { + return false; + } + } + + public function update($request) + { + $this->top_up = TopUp::where([ + ['topup_uuid',$request->topup_uuid] + ])->first(); + + $this->top_up->amount = $request->amount; + $this->top_up->type = $request->type; + $this->top_up->name = $request->name; + + if ($this->top_up->save()) + { + return $this->top_up; + } + else + { + return false; + } + } + + public function check($id) + { + $this->top_up = TopUp::where([ + ['topup_uuid',$id] + ])->first(); + + return $this->top_up ? $this->top_up : false; + } + + public function getByField($field,$value) + { + $this->top_up = TopUp::where($field,$value); + return $this->top_up->get(); + } + + public function delete($uuid) + { + $currentUser = CurrentUserHelper::get_currentAdmin(); + + if(is_array($uuid)) + { + $this->top_up = TopUp::whereIn('topup_uuid',$uuid) + ->update([ + 'is_active' => 0, + 'updated_by' => $currentUser->admin_id + ]); + + if($this->top_up) + return true; + else + return false; + } + else + { + $this->top_up = TopUp::where('topup_uuid',$uuid)->first(); + + $this->top_up->updated_by = $currentUser->admin_id; + $this->top_up->is_active = 0; + + if ($this->top_up->save()) + return true; + else + return false; + } + } + + public function getDetailsWhereIn($field,$value,$relationship = null) + { + if($relationship) + { + $details = TopUp::with($relationship)->whereIn($field,$value)->get(); + } + else + { + $details = TopUp::whereIn($field,$value)->get(); + } + + return $details->toArray(); + } + +} diff --git a/app/Services/UserService.php b/app/Services/UserService.php new file mode 100644 index 0000000..b397140 --- /dev/null +++ b/app/Services/UserService.php @@ -0,0 +1,163 @@ +user = User::all(); + return $this->user; + } + + public function getUsername($username, $type = 1) + { + $this->user = User::where([ + 'username' => $username, + 'type' => $type + ])->first(); + return $this->user; + } + + public function store(Request $request, $type) + { + $this->user = new User; + + $this->user->name = $request->get('firstname').' '.$request->get('lastname'); + $this->user->username = $request->get('username'); + $this->user->email = $request->get('email'); + $this->user->password = bcrypt($request->get('password')); + $this->user->type = $type; + + if ($this->user->save()) + { + return true; + } + else + { + return false; + } + } + + public function store_member($data) + { + $this->user = new User; + + $this->user->name = $data->first_name.' '.$data->last_name; + $this->user->username = $data->card_number; + // $this->user->email = $data->email; + $this->user->email = $data->card_number; + $this->user->password = bcrypt($data->birthdate); + $this->user->type = 2; + + if ($this->user->save()) + { + return true; + } + else + { + return false; + } + } + + public function updateAdmin(Request $request, $username) + { + $this->user = User::whereUsername($username)->first(); + + $this->user->name = $request->get('firstname').' '.$request->get('lastname'); + $this->user->username = $request->get('username'); + $this->user->email = $request->get('email'); + + if($request->has('password')) + $this->user->password = bcrypt($request->get('password')); + + if ($this->user->save()) + { + return true; + } + else + { + return false; + } + } + + public function updateMember(Request $request, $username) + { + $this->user = User::whereUsername($username) + ->where('type',2) + ->first(); + + $this->user->email = $request->get('email'); + + if ($this->user->save()) + { + return true; + } + else + { + return false; + } + } + + public function changePassword(Request $request, $username) + { + $this->user = User::where([ + ['username',$username], + ['type',1] + ])->first(); + + $this->user->password = bcrypt($request->get('password')); + + if ($this->user->save()) + { + return true; + } + else + { + return false; + } + } + + public function delete($uuid) + { + return User::destroy($uuid); + } + + public function force_logout($username, $type = 1) + { + $this->user = User::where('username',$username) + ->where('type',$type) + ->get(); + + if(count($this->user)) + { + OauthAccessToken::where('user_id',$this->user[0]->id)->delete(); + } + } + + +} diff --git a/app/SignUpAPICalls.php b/app/SignUpAPICalls.php new file mode 100644 index 0000000..1871823 --- /dev/null +++ b/app/SignUpAPICalls.php @@ -0,0 +1,44 @@ +belongsTo('App\Station','station_id','station_id'); + } + + public function loyaltyCard() + { + return $this->belongsTo('App\LoyaltyCard','lcard_id','lcard_id'); + } + +} diff --git a/app/StationFuelPrices.php b/app/StationFuelPrices.php new file mode 100644 index 0000000..758bd34 --- /dev/null +++ b/app/StationFuelPrices.php @@ -0,0 +1,42 @@ +hasOne('App\Station','station_id','station_id'); + } +} diff --git a/app/SystemPreference.php b/app/SystemPreference.php new file mode 100644 index 0000000..ea7304c --- /dev/null +++ b/app/SystemPreference.php @@ -0,0 +1,37 @@ +hasMany('\App\OauthAccessToken'); + } +} diff --git a/artisan b/artisan new file mode 100644 index 0000000..5c23e2e --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +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); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..f2801ad --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +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; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..fbbe4da --- /dev/null +++ b/composer.json @@ -0,0 +1,67 @@ +{ + "name": "laravel/laravel", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "type": "project", + "require": { + "php": "^7.1.3", + "barryvdh/laravel-cors": "^0.11.2", + "fideloper/proxy": "^4.0", + "guzzlehttp/guzzle": "^6.3", + "laravel/framework": "5.7.*", + "laravel/passport": "^7.0", + "laravel/tinker": "^1.0", + "league/flysystem-aws-s3-v3": "^1.0", + "maatwebsite/excel": "^3.1", + "moontoast/math": "^1.1", + "ramsey/uuid": "^3.8" + }, + "require-dev": { + "beyondcode/laravel-dump-server": "^1.0", + "filp/whoops": "^2.0", + "fzaninotto/faker": "^1.4", + "mockery/mockery": "^1.0", + "nunomaduro/collision": "^2.0", + "phpunit/phpunit": "^7.0" + }, + "autoload": { + "classmap": [ + "database/seeds", + "database/factories" + ], + "psr-4": { + "App\\": "app/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "extra": { + "laravel": { + "dont-discover": [ + ] + } + }, + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate" + ], + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover" + ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..8ae8e1e --- /dev/null +++ b/composer.lock @@ -0,0 +1,7440 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "c2532fce5d69f596812cfe89d0640bed", + "packages": [ + { + "name": "asm89/stack-cors", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/asm89/stack-cors.git", + "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/asm89/stack-cors/zipball/b9c31def6a83f84b4d4a40d35996d375755f0e08", + "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0", + "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8.10", + "squizlabs/php_codesniffer": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Asm89\\Stack\\": "src/Asm89/Stack/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander", + "email": "iam.asm89@gmail.com" + } + ], + "description": "Cross-origin resource sharing library and stack middleware", + "homepage": "https://github.com/asm89/stack-cors", + "keywords": [ + "cors", + "stack" + ], + "time": "2019-12-24T22:41:47+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.149.2", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "e8a0d608e8379ad8b283812064136229ba2c1d11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e8a0d608e8379ad8b283812064136229ba2c1d11", + "reference": "e8a0d608e8379ad8b283812064136229ba2c1d11", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4.1", + "mtdowling/jmespath.php": "^2.5", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^4.8.35|^5.4.3", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Aws\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "time": "2020-08-17T18:11:59+00:00" + }, + { + "name": "barryvdh/laravel-cors", + "version": "v0.11.4", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/laravel-cors.git", + "reference": "03492f1a3bc74a05de23f93b94ac7cc5c173eec9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/03492f1a3bc74a05de23f93b94ac7cc5c173eec9", + "reference": "03492f1a3bc74a05de23f93b94ac7cc5c173eec9", + "shasum": "" + }, + "require": { + "asm89/stack-cors": "^1.2", + "illuminate/support": "^5.5|^6", + "php": ">=7", + "symfony/http-foundation": "^3.1|^4", + "symfony/http-kernel": "^3.1|^4" + }, + "require-dev": { + "laravel/framework": "^5.5", + "orchestra/testbench": "3.3.x|3.4.x|3.5.x|3.6.x|3.7.x", + "phpunit/phpunit": "^4.8|^5.2|^7.0", + "squizlabs/php_codesniffer": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.11-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Cors\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "keywords": [ + "api", + "cors", + "crossdomain", + "laravel" + ], + "time": "2019-08-28T11:27:11+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.2.1", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "0f407c43b953d571421e0020ba92082ed5fb7620" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620", + "reference": "0f407c43b953d571421e0020ba92082ed5fb7620", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.4.0" + }, + "require-dev": { + "nikic/php-parser": "^2.0|^3.0|^4.0", + "phpunit/phpunit": "^4|^5" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "time": "2018-07-24T23:27:56+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/inflector", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "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": "2019-10-30T19:59:35+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "^4.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-06-08T11:03:04+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "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" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2019-03-31T00:38:28+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.19", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "840d5603eb84cc81a6a0382adac3293e57c1c64c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/840d5603eb84cc81a6a0382adac3293e57c1c64c", + "reference": "840d5603eb84cc81a6a0382adac3293e57c1c64c", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2020-08-08T21:28:19+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "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": "2019-12-30T22:54:17+00:00" + }, + { + "name": "fideloper/proxy", + "version": "4.4.0", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", + "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/http": "^5.0|^6.0|^7.0|^8.0", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Fideloper\\Proxy\\TrustedProxyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fideloper\\Proxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "time": "2020-06-23T01:36:47+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8 <=9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "time": "2020-03-25T18:49:23+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "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 is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2020-06-16T21:01:06+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://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "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.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-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", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "jakub-onderka/php-console-color", + "version": "v0.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "1.0", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "~4.3", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com" + } + ], + "abandoned": "php-parallel-lint/php-console-color", + "time": "2018-09-29T17:23:10+00:00" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.4", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2", + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~1.0", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleHighlighter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "description": "Highlight PHP code in terminal", + "abandoned": "php-parallel-lint/php-console-highlighter", + "time": "2018-09-29T18:48:56+00:00" + }, + { + "name": "kylekatarnls/update-helper", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/kylekatarnls/update-helper.git", + "reference": "429be50660ed8a196e0798e5939760f168ec8ce9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/429be50660ed8a196e0798e5939760f168ec8ce9", + "reference": "429be50660ed8a196e0798e5939760f168ec8ce9", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0.0", + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "composer/composer": "2.0.x-dev || ^2.0.0-dev", + "phpunit/phpunit": ">=4.8.35 <6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "UpdateHelper\\ComposerPlugin" + }, + "autoload": { + "psr-0": { + "UpdateHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Update helper", + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2020-04-07T20:44:10+00:00" + }, + { + "name": "laravel/framework", + "version": "v5.7.29", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "2555bf6ef6e6739e5f49f4a5d40f6264c57abd56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/2555bf6ef6e6739e5f49f4a5d40f6264c57abd56", + "reference": "2555bf6ef6e6739e5f49f4a5d40f6264c57abd56", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.1", + "dragonmantank/cron-expression": "^2.0", + "erusev/parsedown": "^1.7", + "ext-mbstring": "*", + "ext-openssl": "*", + "laravel/nexmo-notification-channel": "^1.0", + "laravel/slack-notification-channel": "^1.0", + "league/flysystem": "^1.0.8", + "monolog/monolog": "^1.12", + "nesbot/carbon": "^1.26.3", + "opis/closure": "^3.1", + "php": "^7.1.3", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^3.7", + "swiftmailer/swiftmailer": "^6.0", + "symfony/console": "^4.1", + "symfony/debug": "^4.1", + "symfony/finder": "^4.1", + "symfony/http-foundation": "^4.1", + "symfony/http-kernel": "^4.1", + "symfony/process": "^4.1", + "symfony/routing": "^4.1", + "symfony/var-dumper": "^4.1", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", + "vlucas/phpdotenv": "^2.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "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/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" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/dbal": "^2.6", + "filp/whoops": "^2.1.4", + "guzzlehttp/guzzle": "^6.3", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.0", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.7.*", + "pda/pheanstalk": "^3.0|^4.0", + "phpunit/phpunit": "^7.5", + "predis/predis": "^1.1.1", + "symfony/css-selector": "^4.1", + "symfony/dom-crawler": "^4.1", + "true/punycode": "^2.1" + }, + "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.6).", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "filp/whoops": "Required for friendly error pages in development (^2.1.4).", + "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-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "nexmo/client": "Required to use the Nexmo transport (^1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^3.0|^4.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 (^3.0).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (^4.1).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.1).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (^1.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.7-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": "2020-04-14T14:16:19+00:00" + }, + { + "name": "laravel/nexmo-notification-channel", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/nexmo-notification-channel.git", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/nexmo-notification-channel/zipball/03edd42a55b306ff980c9950899d5a2b03260d48", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48", + "shasum": "" + }, + "require": { + "nexmo/client": "^1.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\NexmoChannelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Nexmo Notification Channel for laravel.", + "keywords": [ + "laravel", + "nexmo", + "notifications" + ], + "time": "2018-12-04T12:57:08+00:00" + }, + { + "name": "laravel/passport", + "version": "v7.5.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "d63cdd672c3d65b3c35b73d0ef13a9dbfcb71c08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/d63cdd672c3d65b3c35b73d0ef13a9dbfcb71c08", + "reference": "d63cdd672c3d65b3c35b73d0ef13a9dbfcb71c08", + "shasum": "" + }, + "require": { + "ext-json": "*", + "firebase/php-jwt": "~3.0|~4.0|~5.0", + "guzzlehttp/guzzle": "~6.0", + "illuminate/auth": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/console": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/container": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/contracts": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/cookie": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/database": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/encryption": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/http": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/support": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", + "league/oauth2-server": "^7.0", + "php": ">=7.1", + "phpseclib/phpseclib": "^2.0", + "symfony/psr-http-message-bridge": "~1.0", + "zendframework/zend-diactoros": "~1.0|~2.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.4|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "time": "2019-10-08T16:45:24+00:00" + }, + { + "name": "laravel/slack-notification-channel", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/slack-notification-channel.git", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/6e164293b754a95f246faf50ab2bbea3e4923cc9", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\SlackChannelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Slack Notification Channel for laravel.", + "keywords": [ + "laravel", + "notifications", + "slack" + ], + "time": "2018-12-12T13:12:06+00:00" + }, + { + "name": "laravel/tinker", + "version": "v1.0.10", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ad571aacbac1539c30d480908f9d0c9614eaf1a7", + "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7", + "shasum": "" + }, + "require": { + "illuminate/console": "~5.1|^6.0", + "illuminate/contracts": "~5.1|^6.0", + "illuminate/support": "~5.1|^6.0", + "php": ">=5.5.9", + "psy/psysh": "0.7.*|0.8.*|0.9.*", + "symfony/var-dumper": "~3.0|~4.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" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "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": "2019-08-07T15:10:45+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "56f10808089e38623345e28af2f2d5e4eb579455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/56f10808089e38623345e28af2f2d5e4eb579455", + "reference": "56f10808089e38623345e28af2f2d5e4eb579455", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-openssl": "*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "^5.7 || ^7.3", + "squizlabs/php_codesniffer": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2020-05-22T08:21:12+00:00" + }, + { + "name": "league/event", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/d2cc124cf9a3fab2bb4ff963307f60361ce4d119", + "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "time": "2018-11-26T11:52:41+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.70", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/585824702f534f8d3cf7fab7225e8466cc4b7493", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/phpspec": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "phpunit/phpunit": "^5.7.26" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "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-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", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "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" + ], + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2020-07-26T07:20:36+00:00" + }, + { + "name": "league/flysystem-aws-s3-v3", + "version": "1.0.25", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "d409b97a50bf85fbde30cbc9fc10237475e696ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/d409b97a50bf85fbde30cbc9fc10237475e696ea", + "reference": "d409b97a50bf85fbde30cbc9fc10237475e696ea", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "^3.0.0", + "league/flysystem": "^1.0.40", + "php": ">=5.5.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\AwsS3v3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Flysystem adapter for the AWS S3 SDK v3.x", + "time": "2020-06-02T18:41:58+00:00" + }, + { + "name": "league/oauth2-server", + "version": "7.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "2eb1cf79e59d807d89c256e7ac5e2bf8bdbd4acf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/2eb1cf79e59d807d89c256e7ac5e2bf8bdbd4acf", + "reference": "2eb1cf79e59d807d89c256e7ac5e2bf8bdbd4acf", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.1", + "ext-openssl": "*", + "lcobucci/jwt": "^3.2.2", + "league/event": "^2.1", + "php": ">=7.0.0", + "psr/http-message": "^1.0.1" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.3 || ^7.0", + "roave/security-advisories": "dev-master", + "zendframework/zend-diactoros": "^1.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Andy Millington", + "email": "andrew@noexceptions.io", + "homepage": "https://www.noexceptions.io", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "time": "2019-05-05T09:22:01+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.19", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c", + "reference": "96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0", + "php": "^7.0", + "phpoffice/phpspreadsheet": "^1.10" + }, + "require-dev": { + "mockery/mockery": "^1.1", + "orchestra/database": "^4.0", + "orchestra/testbench": "^4.0", + "phpunit/phpunit": "^8.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2020-02-28T15:47:45+00:00" + }, + { + "name": "markbaker/complex", + "version": "1.4.8", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "8eaa40cceec7bf0518187530b2e63871be661b72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/8eaa40cceec7bf0518187530b2e63871be661b72", + "reference": "8eaa40cceec7bf0518187530b2e63871be661b72", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "time": "2020-03-11T20:15:49+00:00" + }, + { + "name": "markbaker/matrix", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "5348c5a67e3b75cd209d70103f916a93b1f1ed21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/5348c5a67e3b75cd209d70103f916a93b1f1ed21", + "reference": "5348c5a67e3b75cd209d70103f916a93b1f1ed21", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "dev-master", + "phploc/phploc": "^4", + "phpmd/phpmd": "dev-master", + "phpunit/phpunit": "^5.7", + "sebastian/phpcpd": "^3.0", + "squizlabs/php_codesniffer": "^3.0@dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/functions/adjoint.php", + "classes/src/functions/antidiagonal.php", + "classes/src/functions/cofactors.php", + "classes/src/functions/determinant.php", + "classes/src/functions/diagonal.php", + "classes/src/functions/identity.php", + "classes/src/functions/inverse.php", + "classes/src/functions/minors.php", + "classes/src/functions/trace.php", + "classes/src/functions/transpose.php", + "classes/src/operations/add.php", + "classes/src/operations/directsum.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "time": "2019-10-06T11:29:25+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.25.5", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", + "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", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpunit/phpunit": "~4.5", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:35:51+00:00" + }, + { + "name": "moontoast/math", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/moontoast-math.git", + "reference": "5f47d34c87767dbcc08b30377a9827df71de91fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/moontoast-math/zipball/5f47d34c87767dbcc08b30377a9827df71de91fa", + "reference": "5f47d34c87767dbcc08b30377a9827df71de91fa", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpseclib/bcmath_compat": ">=1.0.3" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "^0.9.0", + "phpunit/phpunit": "^4.8 || ^5.5 || ^6.5 || ^7.0", + "satooshi/php-coveralls": "^0.6.1", + "squizlabs/php_codesniffer": "^2.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Moontoast\\Math\\": "src/Moontoast/Math", + "Moontoast\\Math\\Exception\\": "src/Moontoast/Math/Exception" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A mathematics library, providing functionality for large numbers", + "homepage": "https://github.com/ramsey/moontoast-math", + "keywords": [ + "bcmath", + "math" + ], + "abandoned": "brick/math", + "time": "2020-01-05T04:49:34+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^1.4", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "JmesPath\\": "src/" + }, + "files": [ + "src/JmesPath.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "time": "2020-07-31T21:01:56+00:00" + }, + { + "name": "nesbot/carbon", + "version": "1.39.1", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4be0c005164249208ce1b5ca633cd57bdd42ff33", + "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33", + "shasum": "" + }, + "require": { + "kylekatarnls/update-helper": "^1.1", + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" + }, + "require-dev": { + "composer/composer": "^1.2", + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "^4.8.35 || ^5.7" + }, + "bin": [ + "bin/upgrade-carbon" + ], + "type": "library", + "extra": { + "update-helper": "Carbon\\Upgrade", + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "": "src/" + } + }, + "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": "2019-10-14T05:51:36+00:00" + }, + { + "name": "nexmo/client", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/Nexmo/nexmo-php-complete.git", + "reference": "c6d11d953c8c5594590bb9ebaba9616e76948f93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nexmo/nexmo-php-complete/zipball/c6d11d953c8c5594590bb9ebaba9616e76948f93", + "reference": "c6d11d953c8c5594590bb9ebaba9616e76948f93", + "shasum": "" + }, + "require": { + "nexmo/client-core": "^1.0", + "php": ">=5.6", + "php-http/guzzle6-adapter": "^1.0" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim Lytle", + "email": "tim@nexmo.com", + "homepage": "http://twitter.com/tjlytle", + "role": "Developer" + }, + { + "name": "Michael Heap", + "email": "michael.heap@vonage.com", + "role": "Developer" + }, + { + "name": "Lorna Mitchell", + "email": "lorna.mitchell@vonage.com", + "role": "Developer" + } + ], + "description": "PHP Client for using Nexmo's API.", + "time": "2019-11-26T15:25:11+00:00" + }, + { + "name": "nexmo/client-core", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/Nexmo/nexmo-php.git", + "reference": "182d41a02ebd3e4be147baea45458ccfe2f528c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/182d41a02ebd3e4be147baea45458ccfe2f528c4", + "reference": "182d41a02ebd3e4be147baea45458ccfe2f528c4", + "shasum": "" + }, + "require": { + "lcobucci/jwt": "^3.2", + "php": ">=5.6", + "php-http/client-implementation": "^1.0", + "php-http/guzzle6-adapter": "^1.0", + "zendframework/zend-diactoros": "^1.8.4 || ^2.0" + }, + "require-dev": { + "estahn/phpunit-json-assertions": "^1.0.0", + "php-http/mock-client": "^0.3.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Nexmo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim Lytle", + "email": "tim@nexmo.com", + "homepage": "http://twitter.com/tjlytle", + "role": "Developer" + } + ], + "description": "PHP Client for using Nexmo's API.", + "time": "2019-05-13T20:27:43+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.8.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8c58eb4cd4f3883f82611abeac2efbc3dbed787e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8c58eb4cd4f3883f82611abeac2efbc3dbed787e", + "reference": "8c58eb4cd4f3883f82611abeac2efbc3dbed787e", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.6", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8-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": "2020-08-09T10:23:20+00:00" + }, + { + "name": "opis/closure", + "version": "3.5.6", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "e8d34df855b0a0549a300cb8cb4db472556e8aa9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/e8d34df855b0a0549a300cb8cb4db472556e8aa9", + "reference": "e8d34df855b0a0549a300cb8cb4db472556e8aa9", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "time": "2020-08-11T08:46:50+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "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", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, + { + "name": "php-http/guzzle6-adapter", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": ">=5.5.0", + "php-http/httplug": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/adapter-integration-tests": "^0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2016-05-10T06:13:32+00:00" + }, + { + "name": "php-http/httplug", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/promise": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "time": "2016-08-31T08:30:17+00:00" + }, + { + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "f79611d6dc1f6b7e8e30b738fc371b392001dbfd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/f79611d6dc1f6b7e8e30b738fc371b392001dbfd", + "reference": "f79611d6dc1f6b7e8e30b738fc371b392001dbfd", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "markbaker/complex": "^1.4", + "markbaker/matrix": "^1.2", + "php": "^7.1", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dompdf/dompdf": "^0.8.3", + "friendsofphp/php-cs-fixer": "^2.16", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^8.0", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.5", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.3" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "time": "2020-04-27T08:12:48+00:00" + }, + { + "name": "phpseclib/bcmath_compat", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/bcmath_compat.git", + "reference": "89cbb63742a32730b7187773a60b6b12b9db4479" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/89cbb63742a32730b7187773a60b6b12b9db4479", + "reference": "89cbb63742a32730b7187773a60b6b12b9db4479", + "shasum": "" + }, + "require": { + "phpseclib/phpseclib": ">=2.0.19" + }, + "provide": { + "ext-bcmath": "7.3.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "suggest": { + "ext-gmp": "Will enable faster math operations" + }, + "type": "library", + "autoload": { + "files": [ + "lib/bcmath.php" + ], + "psr-4": { + "bcmath_compat\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "homepage": "http://phpseclib.sourceforge.net" + } + ], + "description": "PHP 5.x/7.x polyfill for bcmath extension", + "keywords": [ + "BigInteger", + "bcmath", + "bigdecimal", + "math", + "polyfill" + ], + "time": "2020-04-26T16:34:33+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "2.0.28", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "d1ca58cf33cb21046d702ae3a7b14fdacd9f3260" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d1ca58cf33cb21046d702ae3a7b14fdacd9f3260", + "reference": "d1ca58cf33cb21046d702ae3a7b14fdacd9f3260", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "sami/sami": "~2.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2020-07-08T09:08:33+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.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 interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.9.12", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "90da7f37568aee36b116a030c5f99c915267edd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4", + "reference": "90da7f37568aee36b116a030c5f99c915267edd4", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1.*", + "ext-json": "*", + "ext-tokenizer": "*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", + "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", + "php": ">=5.4.0", + "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0", + "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "~2.15|~3.16", + "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.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/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2019-12-06T14:19:43+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.9.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", + "shasum": "" + }, + "require": { + "ext-json": "*", + "paragonie/random_compat": "^1 | ^2 | 9.99.99", + "php": "^5.4 | ^7 | ^8", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^1 | ^2", + "doctrine/annotations": "^1.2", + "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", + "jakub-onderka/php-parallel-lint": "^1", + "mockery/mockery": "^0.9.11 | ^1", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-phpunit": "^0.3 | ^1.1", + "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-ctype": "Provides support for PHP Ctype functions", + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "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/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + }, + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + } + ], + "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": "2020-02-21T04:36:14+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.2.3", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-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": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2019-11-12T09:31:26+00:00" + }, + { + "name": "symfony/console", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "55d07021da933dd0d633ffdab6f45d5b230c7e02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/55d07021da933dd0d633ffdab6f45d5b230c7e02", + "reference": "55d07021da933dd0d633ffdab6f45d5b230c7e02", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:18:39+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/bf17dc9f6ce144e41f786c32435feea4d8e11dcc", + "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-05T09:39:30+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "47aa9064d75db36389692dd4d39895a0820f00f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/47aa9064d75db36389692dd4d39895a0820f00f2", + "reference": "47aa9064d75db36389692dd4d39895a0820f00f2", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:31:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "66f151360550ec2b3273b3746febb12e6ba0348b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/66f151360550ec2b3273b3746febb12e6ba0348b", + "reference": "66f151360550ec2b3273b3746febb12e6ba0348b", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/debug": "^4.4.5", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 ErrorHandler Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:35:20+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "6140fc7047dafc5abbe84ba16a34a86c0b0229b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6140fc7047dafc5abbe84ba16a34a86c0b0229b8", + "reference": "6140fc7047dafc5abbe84ba16a34a86c0b0229b8", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-06-18T17:59:13+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2727aa35fddfada1dd37599948528e9b152eb742" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2727aa35fddfada1dd37599948528e9b152eb742", + "reference": "2727aa35fddfada1dd37599948528e9b152eb742", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-05T09:39:30+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "3675676b6a47f3e71d3ab10bcf53fb9239eb77e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3675676b6a47f3e71d3ab10bcf53fb9239eb77e6", + "reference": "3675676b6a47f3e71d3ab10bcf53fb9239eb77e6", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T09:48:09+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "a675d2bf04a9328f164910cae6e3918b295151f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a675d2bf04a9328f164910cae6e3918b295151f3", + "reference": "a675d2bf04a9328f164910cae6e3918b295151f3", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-24T04:10:09+00:00" + }, + { + "name": "symfony/mime", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "cb00d7210bc096f997e63189a62b5e35d72babac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/cb00d7210bc096f997e63189a62b5e35d72babac", + "reference": "cb00d7210bc096f997e63189a62b5e35d72babac", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^3.4|^4.1|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-22T12:10:07+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36", + "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "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 Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-04T06:02:08+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "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" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "639447d008615574653fb3bc60d1986d7172eaae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", + "reference": "639447d008615574653fb3bc60d1986d7172eaae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "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 backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "shasum": "" + }, + "require": { + "php": ">=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "65e70bab62f3da7089a8d4591fb23fbacacb3479" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/65e70bab62f3da7089a8d4591fb23fbacacb3479", + "reference": "65e70bab62f3da7089a8d4591fb23fbacacb3479", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:31:43+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "9d3e80d54d9ae747ad573cad796e8e247df7b796" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9d3e80d54d9ae747ad573cad796e8e247df7b796", + "reference": "9d3e80d54d9ae747ad573cad796e8e247df7b796", + "shasum": "" + }, + "require": { + "php": "^7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "symfony/phpunit-bridge": "^4.4 || ^5.0", + "zendframework/zend-diactoros": "^1.4.1 || ^2.0" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "time": "2019-11-25T19:33:50+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e103381a4c2f0731c14589041852bf979e97c7af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/e103381a4c2f0731c14589041852bf979e97c7af", + "reference": "e103381a4c2f0731c14589041852bf979e97c7af", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "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": "4.4-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" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-05T09:39:30+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v1.1.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b776d18b303a39f56c63747bcb977ad4b27aca26", + "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "a8ea9d97353294eb6783f2894ef8cee99a045822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/a8ea9d97353294eb6783f2894ef8cee99a045822", + "reference": "a8ea9d97353294eb6783f2894ef8cee99a045822", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<4.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "symfony/translation-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/finder": "~2.8|~3.0|~4.0|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/intl": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:31:43+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v1.1.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "a5db6f7707fd35d137b1398734f2d745c8616ea2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/a5db6f7707fd35d137b1398734f2d745c8616ea2", + "reference": "a5db6f7707fd35d137b1398734f2d745c8616ea2", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "2125805a1a4e57f2340bc566c3013ca94d2722dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2125805a1a4e57f2340bc566c3013ca94d2722dc", + "reference": "2125805a1a4e57f2340bc566c3013ca94d2722dc", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-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" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-06-24T13:34:53+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.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": "2020-07-13T06:12:54+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v2.6.6", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "e1d57f62db3db00d9139078cbedf262280701479" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/e1d57f62db3db00d9139078cbedf262280701479", + "reference": "e1d57f62db3db00d9139078cbedf262280701479", + "shasum": "" + }, + "require": { + "php": "^5.3.9 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.17" + }, + "require-dev": { + "ext-filter": "*", + "ext-pcre": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7.27" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator.", + "ext-pcre": "Required to use most of the library." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "homepage": "https://gjcampbell.co.uk/" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://vancelucas.com/" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2020-07-14T17:54:18+00:00" + }, + { + "name": "zendframework/zend-diactoros", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "de5847b068362a88684a55b0dbb40d85986cfa52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/de5847b068362a88684a55b0dbb40d85986cfa52", + "reference": "de5847b068362a88684a55b0dbb40d85986cfa52", + "shasum": "" + }, + "require": { + "php": "^7.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "ext-dom": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^0.5.0", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^7.0.2", + "zendframework/zend-coding-standard": "~1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev", + "dev-develop": "2.2.x-dev", + "dev-release-1.8": "1.8.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "abandoned": "laminas/laminas-diactoros", + "time": "2019-11-13T19:16:13+00:00" + } + ], + "packages-dev": [ + { + "name": "beyondcode/laravel-dump-server", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/beyondcode/laravel-dump-server.git", + "reference": "fcc88fa66895f8c1ff83f6145a5eff5fa2a0739a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beyondcode/laravel-dump-server/zipball/fcc88fa66895f8c1ff83f6145a5eff5fa2a0739a", + "reference": "fcc88fa66895f8c1ff83f6145a5eff5fa2a0739a", + "shasum": "" + }, + "require": { + "illuminate/console": "5.6.*|5.7.*|5.8.*|^6.0", + "illuminate/http": "5.6.*|5.7.*|5.8.*|^6.0", + "illuminate/support": "5.6.*|5.7.*|5.8.*|^6.0", + "php": "^7.1", + "symfony/var-dumper": "^4.1.1" + }, + "require-dev": { + "larapack/dd": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BeyondCode\\DumpServer\\DumpServerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BeyondCode\\DumpServer\\": "src" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marcel Pociot", + "email": "marcel@beyondco.de", + "homepage": "https://beyondco.de", + "role": "Developer" + } + ], + "description": "Symfony Var-Dump Server for Laravel", + "homepage": "https://github.com/beyondcode/laravel-dump-server", + "keywords": [ + "beyondcode", + "laravel-dump-server" + ], + "time": "2019-08-11T13:17:40+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.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://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" + }, + { + "name": "filp/whoops", + "version": "2.7.3", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0", + "psr/log": "^1.0.1" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "time": "2020-06-14T09:00:00+00:00" + }, + { + "name": "fzaninotto/faker", + "version": "v1.9.1", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "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": "2019-12-12T13:22:17+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/60fa2f67f6e4d3634bb4a45ff3171fa52215800d", + "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.10|^6.5|^7.5|^8.5|^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.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", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2020-08-11T18:10:21+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-06-29T13:22:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b5feb0c0d92978ec7169232ce5d70d6da6b29f63", + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.1.4", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", + "php": "^7.1", + "symfony/console": "~2.8|~3.3|~4.0" + }, + "require-dev": { + "laravel/framework": "5.7.*", + "nunomaduro/larastan": "^0.3.0", + "phpstan/phpstan": "^0.10", + "phpunit/phpunit": "~7.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "time": "2018-11-21T21:40:54+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2020-04-27T09:25:28+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", + "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", + "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.0.5", + "mockery/mockery": "^1.0", + "phpdocumentor/type-resolver": "0.4.*", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2019-12-28T18:55:12+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "shasum": "" + }, + "require": { + "php": "^7.1", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "^7.1", + "mockery/mockery": "~1", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "time": "2019-08-22T18:11:29+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.10.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "451c3cd1418cf640de218914901e51b064abb093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5 || ^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2020-03-05T15:02:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.1 || ^4.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "ext-xdebug": "^2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-10-31T16:06:48+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "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": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-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": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-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" + ], + "abandoned": true, + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "7.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", + "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", + "sebastian/environment": "^4.0", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpunit/phpunit-mock-objects": "*" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.5-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": "2020-01-08T08:45:45+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://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "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": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-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": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "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": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-06-13T22:48:21+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "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": "2020-07-08T17:02:28+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^7.1.3" + }, + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..96973f7 --- /dev/null +++ b/config/app.php @@ -0,0 +1,228 @@ + env('APP_NAME', 'Laravel'), + 'cyware' => env('CYWARE', 'http://13.229.0.154/cgi-bin/uni_app.cgi'), + 'stratuscast' => env('STRATUSCAST', 'http://13.229.0.154/cgi-bin/uni_app.cgi'), + 'stratuscastUsername' => env('STRATUSCASTUSERNAME', 'http://13.229.0.154/cgi-bin/uni_app.cgi'), + 'stratuscastPassword' => env('STRATUSCASTPASSWORD', 'http://13.229.0.154/cgi-bin/uni_app.cgi'), + 'sharedtreatsEncryption' => env('SHAREDTREATSENCRYPTION', 'https://stg.sharetreats.ph:3044/encrypt/unioil/'), + 'sharedtreatsGateway' => env('SHAREDTREATSGATEWAY', 'https://stg.sharetreats.ph:3044/gateway/unioil/'), + 'rnrph' => env('RNRPH','https://station-locator-api.herokuapp.com/api/'), + 'rnrphdev' => env('RNRPHDEV','http://localhost:3000/api/'), + 'paymayaenv' => env('PAYMAYA_ENV','https://pg-sandbox.paymaya.com/'), + 'paymayaapikey' => env('PAYMAYA_SANDBOX_API_KEY','pk-Z0OSzLvIcOI2UIvDhdTGVVfRSSeiGStnceqwUE7n0Ah:'), + 'paymayasecretkey' => env('PAYMAYA_SANDBOX_SECRET_KEY','sk-X8qolYjy62kIzEbr0QRK1h4b4KDVHaNcwMYk39jInSl:'), + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the 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/Manila', + + /* + |-------------------------------------------------------------------------- + | 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', + + /* + |-------------------------------------------------------------------------- + | 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... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + App\Providers\CustomPassportServiceProvider::class, + + Laravel\Passport\PassportServiceProvider::class, + Barryvdh\Cors\ServiceProvider::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, + + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..f8a1194 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,102 @@ + [ + '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' => 'passport', + '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, + ], + + // '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, + ], + ], + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..3ca45ea --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,59 @@ + 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' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'encrypted' => true, + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..6c4629d --- /dev/null +++ b/config/cache.php @@ -0,0 +1,94 @@ + 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' => 'cache', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | 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' => env( + 'CACHE_PREFIX', + str_slug(env('APP_NAME', 'laravel'), '_').'_cache' + ), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..8aecc78 --- /dev/null +++ b/config/cors.php @@ -0,0 +1,23 @@ + false, + 'allowedOrigins' => ['*'], + 'allowedOriginsPatterns' => [], + 'allowedHeaders' => ['*'], + 'allowedMethods' => ['*'], + 'exposedHeaders' => ['Content-Disposition'], + 'maxAge' => 0, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..6d30389 --- /dev/null +++ b/config/database.php @@ -0,0 +1,127 @@ + 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' => '', + 'strict' => false, + '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', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer set of commands than a typical key-value systems + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => 'predis', + + 'default' => [ + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => env('REDIS_DB', 0), + ], + + 'cache' => [ + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => env('REDIS_CACHE_DB', 1), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..03bd05d --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,69 @@ + 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", "sftp", "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_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + // 'url' => env('AWS_URL'), + ], + + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..8425770 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 1024, + 'threads' => 2, + 'time' => 2, + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..c92561a --- /dev/null +++ b/config/logging.php @@ -0,0 +1,92 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels 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 Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + 'days' => 7, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => 'critical', + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => 'debug', + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => 'debug', + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => 'debug', + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..bb92224 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,123 @@ + 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'), + ], + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..38326ef --- /dev/null +++ b/config/queue.php @@ -0,0 +1,86 @@ + env('QUEUE_CONNECTION', '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. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + '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' => env('SQS_KEY', 'your-public-key'), + 'secret' => env('SQS_SECRET', 'your-secret-key'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'your-queue-name'), + 'region' => env('SQS_REGION', 'us-east-1'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => null, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | 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', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..55a520e --- /dev/null +++ b/config/services.php @@ -0,0 +1,39 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + ], + + 'ses' => [ + 'key' => env('SES_KEY'), + 'secret' => env('SES_SECRET'), + 'region' => env('SES_REGION', 'us-east-1'), + ], + + 'sparkpost' => [ + 'secret' => env('SPARKPOST_SECRET'), + ], + + 'stripe' => [ + 'model' => App\User::class, + 'key' => env('STRIPE_KEY'), + 'secret' => env('STRIPE_SECRET'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..7f6c76d --- /dev/null +++ b/config/session.php @@ -0,0 +1,197 @@ + 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' => env('SESSION_LIFETIME', 10), + + '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' => env('SESSION_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' => env('SESSION_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' => env( + 'SESSION_COOKIE', + str_slug(env('APP_NAME', '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, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | do not enable this as other CSRF protection services are in place. + | + | Supported: "lax", "strict" + | + */ + + 'same_site' => null, + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..2acfd9c --- /dev/null +++ b/config/view.php @@ -0,0 +1,33 @@ + [ + 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')), + +]; diff --git a/database/.DS_Store b/database/.DS_Store new file mode 100644 index 0000000..22203fc Binary files /dev/null and b/database/.DS_Store differ diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b1dffd --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..facf233 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,23 @@ +define(App\User::class, function (Faker $faker) { + return [ + 'name' => $faker->name, + 'email' => $faker->unique()->safeEmail, + 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret + 'remember_token' => str_random(10), + ]; +}); diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..5f73f0e --- /dev/null +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('name'); + $table->string('username',128); + $table->string('email',128); + $table->tinyInteger('type'); + // $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +} diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 0000000..487840a --- /dev/null +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,32 @@ +string('email',128)->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +} diff --git a/database/migrations/2018_09_20_024145_loyalty_card.php b/database/migrations/2018_09_20_024145_loyalty_card.php new file mode 100644 index 0000000..b30de7a --- /dev/null +++ b/database/migrations/2018_09_20_024145_loyalty_card.php @@ -0,0 +1,62 @@ +increments('lcard_id'); + $table->uuid('lcard_uuid')->unique(); + $table->integer('pd_id'); + $table->integer('lcard_s_id'); // CR1 + $table->string('card_number', 16); + $table->string('pin', 16); + $table->integer('cardtype_id'); + $table->dateTime('expiry_date'); + $table->date('birthdate'); + $table->string('mobile',32); + $table->string('email',64); + $table->integer('civilstatus_id'); + $table->integer('gender_id'); + $table->integer('vo_id'); + $table->integer('city_id'); + $table->string('city_name',64); + $table->integer('fueltype_id'); + $table->boolean('is_validated')->default(0); + $table->datetime('validation_dt')->nullable(); + $table->boolean('is_locked')->default(0); + $table->string('lock_code',10)->default(''); + $table->dateTime('lock_dt')->nullable(); + $table->string('deviceUUID',64); + $table->double('total_pts_earn')->default(0); + $table->double('total_pts_redeem')->default(0); + $table->double('total_pts_bal')->default(0); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->dateTime('last_synchronized')->nullable(); + $table->boolean('is_active')->default(1); + $table->boolean('cyware_synced')->default(0); + $table->boolean('cyware_deactivated')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('loyalty_card'); + } +} diff --git a/database/migrations/2018_09_20_025102_personal_details.php b/database/migrations/2018_09_20_025102_personal_details.php new file mode 100644 index 0000000..10da431 --- /dev/null +++ b/database/migrations/2018_09_20_025102_personal_details.php @@ -0,0 +1,41 @@ +increments('pd_id'); + $table->uuid('pd_uuid')->unique(); + $table->string('firstname', 32); + $table->string('middlename', 32); + $table->string('lastname', 32); + $table->string('photo', 128); + $table->datetime('birthdate'); + $table->text('address'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('personal_details'); + } +} diff --git a/database/migrations/2018_09_20_025914_lcard_action_logs.php b/database/migrations/2018_09_20_025914_lcard_action_logs.php new file mode 100644 index 0000000..412d2a5 --- /dev/null +++ b/database/migrations/2018_09_20_025914_lcard_action_logs.php @@ -0,0 +1,36 @@ +increments('lactivity_id'); + $table->integer('id'); + $table->string('module', 64); + $table->string('action', 64); + $table->text('remarks')->nullable(); + $table->timestamp('created_at'); + $table->integer('created_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lcard_action_logs'); + } +} diff --git a/database/migrations/2018_09_20_030125_otp_logs.php b/database/migrations/2018_09_20_030125_otp_logs.php new file mode 100644 index 0000000..a619e7c --- /dev/null +++ b/database/migrations/2018_09_20_030125_otp_logs.php @@ -0,0 +1,40 @@ +increments('otplog_id'); + $table->integer('lcard_id'); + $table->string('msisdn', 16); + $table->string('otp', 8); + $table->text('content'); + $table->string('rcvd_transid',64); + $table->string('transid',64); + $table->boolean('used')->default(0); + $table->datetime('used_at')->nullable(); + $table->timestamp('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('otp_logs'); + } +} + diff --git a/database/migrations/2018_09_20_030707_code_vehicle_own.php b/database/migrations/2018_09_20_030707_code_vehicle_own.php new file mode 100644 index 0000000..a03d52a --- /dev/null +++ b/database/migrations/2018_09_20_030707_code_vehicle_own.php @@ -0,0 +1,37 @@ +increments('vo_id'); + $table->uuid('vo_uuid')->unique(); + $table->string('code', 10); + $table->string('description', 64); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_vehicle_own'); + } +} diff --git a/database/migrations/2018_09_20_030920_code_civil_status.php b/database/migrations/2018_09_20_030920_code_civil_status.php new file mode 100644 index 0000000..a3907aa --- /dev/null +++ b/database/migrations/2018_09_20_030920_code_civil_status.php @@ -0,0 +1,37 @@ +increments('civilstatus_id'); + $table->uuid('civilstatus_uuid')->unique(); + $table->string('code', 10); + $table->string('description', 64); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_civil_status'); + } +} diff --git a/database/migrations/2018_09_20_031028_code_gender.php b/database/migrations/2018_09_20_031028_code_gender.php new file mode 100644 index 0000000..1939671 --- /dev/null +++ b/database/migrations/2018_09_20_031028_code_gender.php @@ -0,0 +1,37 @@ +increments('gender_id'); + $table->uuid('gender_uuid')->unique(); + $table->string('code', 10); + $table->string('description', 64); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_gender'); + } +} diff --git a/database/migrations/2018_09_20_031130_code_fuel_type.php b/database/migrations/2018_09_20_031130_code_fuel_type.php new file mode 100644 index 0000000..dcc29e8 --- /dev/null +++ b/database/migrations/2018_09_20_031130_code_fuel_type.php @@ -0,0 +1,37 @@ +increments('fueltype_id'); + $table->uuid('fueltype_uuid')->unique(); + $table->string('code', 10); + $table->string('description', 64); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_fuel_type'); + } +} diff --git a/database/migrations/2018_09_20_051054_fuel_tracker.php b/database/migrations/2018_09_20_051054_fuel_tracker.php new file mode 100644 index 0000000..132dd4e --- /dev/null +++ b/database/migrations/2018_09_20_051054_fuel_tracker.php @@ -0,0 +1,43 @@ +increments('fueltracker_id'); + $table->uuid('fueltracker_uuid')->unique(); + $table->integer('lcard_id'); + $table->integer('fueltype_id'); + $table->date('date'); + $table->double('kml', 8,2); + $table->double('km', 8,2); + $table->double('price', 8,2); + $table->double('liters', 8,2); + $table->double('total', 8,2); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('fuel_tracker'); + } +} diff --git a/database/migrations/2018_09_20_051502_payments.php b/database/migrations/2018_09_20_051502_payments.php new file mode 100644 index 0000000..1c92a0d --- /dev/null +++ b/database/migrations/2018_09_20_051502_payments.php @@ -0,0 +1,61 @@ +increments('payment_id'); + $table->uuid('payment_uuid')->unique(); + $table->integer('lcard_id'); + $table->integer('station_id'); + $table->integer('status')->comment('0 = created, 1 = approved, 2 = failed'); + $table->boolean('cyware_synced')->default(0); + $table->string('paypal_id'); + $table->string('payer_id',64); + $table->string('firstname',64); + $table->string('lastname',64); + $table->string('business',64); + $table->text('verify_sign'); + $table->string('payer_email',64); + $table->string('receiver_email',64); + $table->string('trans_num',64); + $table->string('paypal_trans_num',64)->nullable(); + $table->string('item_name',64)->comment('not used'); + $table->string('item_code',64)->comment('not used'); + $table->string('item_number',64)->comment('not used'); + $table->string('ip_track_id',64); + $table->text('other'); + $table->double('amount'); + $table->double('points'); + $table->string('entry_type_code',16); + $table->string('entry_type_desc',16); + $table->string('receipt_num',16)->nullable(); + $table->integer('quantity')->default(0)->comment('not used'); + $table->datetime('paid_at'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('payments'); + } +} diff --git a/database/migrations/2018_09_20_051837_ratings.php b/database/migrations/2018_09_20_051837_ratings.php new file mode 100644 index 0000000..d97291b --- /dev/null +++ b/database/migrations/2018_09_20_051837_ratings.php @@ -0,0 +1,39 @@ +increments('rating_id'); + $table->uuid('rating_uuid')->unique(); + $table->integer('lcard_id'); + $table->integer('station_id'); + $table->integer('payment_id'); + $table->integer('rate'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('ratings'); + } +} diff --git a/database/migrations/2018_09_20_052153_code_card_type.php b/database/migrations/2018_09_20_052153_code_card_type.php new file mode 100644 index 0000000..a0df21f --- /dev/null +++ b/database/migrations/2018_09_20_052153_code_card_type.php @@ -0,0 +1,45 @@ +increments('cardtype_id'); + $table->uuid('cardtype_uuid')->unique(); + $table->string('code', 12); + $table->string('name', 32); + $table->text('description')->nullable(); + $table->string('image', 128); + $table->text('terms_and_conditions')->nullable(); + $table->text('faqs')->nullable(); + $table->boolean('id_number')->default(0); // CR1 + $table->text('id_number_description')->nullable(); // CR1 + $table->boolean('is_black')->default(1); // CR1 + $table->string('bg_image',128); // CR1 + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_card_type'); + } +} diff --git a/database/migrations/2018_09_20_052747_station.php b/database/migrations/2018_09_20_052747_station.php new file mode 100644 index 0000000..881f696 --- /dev/null +++ b/database/migrations/2018_09_20_052747_station.php @@ -0,0 +1,43 @@ +increments('station_id'); + $table->uuid('station_uuid')->unique(); + $table->integer('city_id')->default(0); + $table->string('code', 12); + $table->string('description', 64); + $table->double('longitude')->default(0); + $table->double('latitude')->default(0); + $table->text('address')->nullable(); + $table->string('contact_number',64)->nullable(); + $table->boolean('is_viewable')->default(0); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('station'); + } +} diff --git a/database/migrations/2018_09_20_053100_admin.php b/database/migrations/2018_09_20_053100_admin.php new file mode 100644 index 0000000..f3220a0 --- /dev/null +++ b/database/migrations/2018_09_20_053100_admin.php @@ -0,0 +1,43 @@ +increments('admin_id'); + $table->uuid('admin_uuid')->unique(); + $table->string('username', 32); + $table->text('password'); + $table->string('firstname',32); + $table->string('lastname',32); + $table->string('email',32); + $table->tinyInteger('role'); + $table->tinyInteger('is_passwordChanged')->default(0); + $table->tinyInteger('status')->default(0); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('admin'); + } +} diff --git a/database/migrations/2018_09_20_053559_promotions.php b/database/migrations/2018_09_20_053559_promotions.php new file mode 100644 index 0000000..0e1cb70 --- /dev/null +++ b/database/migrations/2018_09_20_053559_promotions.php @@ -0,0 +1,43 @@ +increments('promotion_id'); + $table->uuid('promotion_uuid')->unique(); + $table->string('title', 32); + $table->text('description'); + $table->string('image',128); + $table->datetime('date_start'); + $table->datetime('date_end'); + $table->boolean('is_toppromotion'); + $table->boolean('is_gps'); + $table->tinyInteger('promo_type'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('promotions'); + } +} diff --git a/database/migrations/2018_09_20_053949_photo_slider.php b/database/migrations/2018_09_20_053949_photo_slider.php new file mode 100644 index 0000000..1984d70 --- /dev/null +++ b/database/migrations/2018_09_20_053949_photo_slider.php @@ -0,0 +1,41 @@ +increments('photoslider_id'); + $table->uuid('photoslider_uuid')->unique(); + $table->integer('promotion_id'); + $table->string('title', 32); + $table->text('description'); + $table->string('image',128); + $table->datetime('date_start'); + $table->datetime('date_end'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('photo_slider'); + } +} diff --git a/database/migrations/2018_09_20_054157_top_up.php b/database/migrations/2018_09_20_054157_top_up.php new file mode 100644 index 0000000..ea70d1e --- /dev/null +++ b/database/migrations/2018_09_20_054157_top_up.php @@ -0,0 +1,39 @@ +increments('topup_id'); + $table->uuid('topup_uuid')->unique(); + $table->string('fee_code',12); + $table->string('name', 32); + $table->double('amount',8,2); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + $table->tinyInteger('type')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('top_up'); + } +} diff --git a/database/migrations/2018_09_20_054431_admin_action_logs.php b/database/migrations/2018_09_20_054431_admin_action_logs.php new file mode 100644 index 0000000..d9f3ba7 --- /dev/null +++ b/database/migrations/2018_09_20_054431_admin_action_logs.php @@ -0,0 +1,36 @@ +increments('actionlog_id'); + $table->integer('id'); + $table->string('module', 64); + $table->string('action', 64); + $table->text('remarks')->nullable(); + $table->timestamp('created_dt'); + $table->integer('created_by')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('admin_action_logs'); + } +} diff --git a/database/migrations/2018_09_20_054804_terms_and_policy.php b/database/migrations/2018_09_20_054804_terms_and_policy.php new file mode 100644 index 0000000..f8d190d --- /dev/null +++ b/database/migrations/2018_09_20_054804_terms_and_policy.php @@ -0,0 +1,38 @@ +increments('tp_id'); + $table->uuid('tp_uuid')->unique(); + $table->string('title',64); + $table->text('details'); + $table->tinyInteger('type'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('terms_and_policy'); + } +} diff --git a/database/migrations/2018_09_20_055038_system_preferences.php b/database/migrations/2018_09_20_055038_system_preferences.php new file mode 100644 index 0000000..efdc6ed --- /dev/null +++ b/database/migrations/2018_09_20_055038_system_preferences.php @@ -0,0 +1,35 @@ +increments('sp_id'); + $table->uuid('sp_uuid')->unique(); + $table->string('name',64); + $table->text('value'); + $table->timestamp('updated_at'); + $table->integer('updated_by')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('system_preferences'); + } +} diff --git a/database/migrations/2018_09_20_055640_password_logs.php b/database/migrations/2018_09_20_055640_password_logs.php new file mode 100644 index 0000000..90ce0be --- /dev/null +++ b/database/migrations/2018_09_20_055640_password_logs.php @@ -0,0 +1,36 @@ +increments('pl_id'); + $table->integer('admin_id'); + $table->text('password'); + $table->string('generated_password',64)->nullable(); + $table->boolean('is_generated'); + $table->timestamp('created_dt'); + $table->integer('created_by')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_logs'); + } +} diff --git a/database/migrations/2018_09_20_055908_product_category.php b/database/migrations/2018_09_20_055908_product_category.php new file mode 100644 index 0000000..d55c341 --- /dev/null +++ b/database/migrations/2018_09_20_055908_product_category.php @@ -0,0 +1,37 @@ +increments('pc_id'); + $table->uuid('pc_uuid')->unique(); + $table->string('type',64); + $table->string('description',64); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_category'); + } +} diff --git a/database/migrations/2018_09_20_060225_product_details.php b/database/migrations/2018_09_20_060225_product_details.php new file mode 100644 index 0000000..34f0bf5 --- /dev/null +++ b/database/migrations/2018_09_20_060225_product_details.php @@ -0,0 +1,41 @@ +increments('pd_id'); + $table->uuid('pd_uuid')->unique(); + $table->integer('pc_id'); + $table->string('code',64); + $table->string('name',64); + $table->text('description'); + $table->text('details'); + $table->timestamps(); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + $table->string('image',128)->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_details'); + } +} diff --git a/database/migrations/2018_10_08_030525_promotion_stations.php b/database/migrations/2018_10_08_030525_promotion_stations.php new file mode 100644 index 0000000..76049f7 --- /dev/null +++ b/database/migrations/2018_10_08_030525_promotion_stations.php @@ -0,0 +1,32 @@ +increments('ps_id'); + $table->integer('promotion_id'); + $table->integer('station_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('promotion_stations'); + } +} diff --git a/database/migrations/2018_10_09_071627_mobile_analytics.php b/database/migrations/2018_10_09_071627_mobile_analytics.php new file mode 100644 index 0000000..631f9d9 --- /dev/null +++ b/database/migrations/2018_10_09_071627_mobile_analytics.php @@ -0,0 +1,34 @@ +increments('mba_id'); + $table->date('date'); + $table->integer('active'); + $table->integer('inactive'); + $table->integer('locked'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('mobile_analytics'); + } +} diff --git a/database/migrations/2018_10_19_101130_otp_attempts.php b/database/migrations/2018_10_19_101130_otp_attempts.php new file mode 100644 index 0000000..1a89677 --- /dev/null +++ b/database/migrations/2018_10_19_101130_otp_attempts.php @@ -0,0 +1,33 @@ +increments('otpatt_id'); + $table->integer('lcard_id'); + $table->string('otp', 8); + $table->timestamp('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('otp_attempts'); + } +} diff --git a/database/migrations/2018_10_22_152804_code_city.php b/database/migrations/2018_10_22_152804_code_city.php new file mode 100644 index 0000000..0491632 --- /dev/null +++ b/database/migrations/2018_10_22_152804_code_city.php @@ -0,0 +1,41 @@ +increments('city_id'); + $table->integer('province_id'); + $table->uuid('city_uuid')->unique(); + $table->string('code',64); + $table->string('name',64); + $table->integer('created_by')->default(0); + $table->integer('updated_by')->default(0); + $table->timestamp('created_at'); + $table->timestamp('updated_at'); + $table->boolean('is_active')->default(1); + + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_city'); + } +} diff --git a/database/migrations/2018_10_22_152804_code_province.php b/database/migrations/2018_10_22_152804_code_province.php new file mode 100644 index 0000000..1453bf5 --- /dev/null +++ b/database/migrations/2018_10_22_152804_code_province.php @@ -0,0 +1,38 @@ +increments('province_id'); + $table->uuid('province_uuid')->unique(); + $table->string('code',64); + $table->string('name',64); + $table->timestamp('updated_at')->nullable(); + $table->timestamp('created_at'); + $table->integer('created_by'); + $table->integer('updated_by')->nullable(); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('code_province'); + } +} diff --git a/database/migrations/2018_10_30_100622_station_favorite.php b/database/migrations/2018_10_30_100622_station_favorite.php new file mode 100644 index 0000000..81d21d7 --- /dev/null +++ b/database/migrations/2018_10_30_100622_station_favorite.php @@ -0,0 +1,32 @@ +increments('sf_id'); + $table->integer('station_id'); + $table->integer('lcard_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('station_favorite'); + } +} diff --git a/database/migrations/2019_01_23_154619_loyalty_card_signup.php b/database/migrations/2019_01_23_154619_loyalty_card_signup.php new file mode 100644 index 0000000..a847723 --- /dev/null +++ b/database/migrations/2019_01_23_154619_loyalty_card_signup.php @@ -0,0 +1,54 @@ +increments('lcard_s_id'); + $table->uuid('lcard_s_uuid')->unique(); + $table->integer('cardtype_id'); + $table->string('ref_no', 32); + $table->string('firstname', 32); + $table->string('lastname', 32); + $table->date('birthdate'); + $table->string('mobile', 16); + $table->string('email', 64); + $table->string('id_number', 64); + $table->integer('idnt_id'); + $table->string('photo_id',128); + $table->string('photo_document',128); + $table->string('selfie',128); + $table->string('selfie_w_card',128); + $table->tinyInteger('status')->default(0); + $table->string('deviceUUID',64); + $table->timestamps(); + $table->integer('updated_by')->default(0); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('loyalty_card_signup'); + } +} diff --git a/database/migrations/2019_04_08_114641_payments_items.php b/database/migrations/2019_04_08_114641_payments_items.php new file mode 100644 index 0000000..bfb9b96 --- /dev/null +++ b/database/migrations/2019_04_08_114641_payments_items.php @@ -0,0 +1,35 @@ +increments('p_item_id'); + $table->integer('payment_id'); + $table->string('item_name', 50); + $table->integer('quantity'); + $table->double('price'); + $table->datetime('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('payments_items'); + } +} diff --git a/database/migrations/2019_04_08_142053_signup_api_calls.php b/database/migrations/2019_04_08_142053_signup_api_calls.php new file mode 100644 index 0000000..194a2cf --- /dev/null +++ b/database/migrations/2019_04_08_142053_signup_api_calls.php @@ -0,0 +1,33 @@ +increments('signuip_api_id'); + $table->string('user_id', 50); + $table->integer('lcard_id'); + $table->datetime('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/migrations/2019_04_10_092238_station_fuel_prices.php b/database/migrations/2019_04_10_092238_station_fuel_prices.php new file mode 100644 index 0000000..ef7c23a --- /dev/null +++ b/database/migrations/2019_04_10_092238_station_fuel_prices.php @@ -0,0 +1,37 @@ +increments('fuel_price_id'); + $table->uuid('fuel_price_uuid')->unique(); + $table->integer('station_id'); + $table->string('fuel_code', 50); + $table->string('fuel_name', 50); + $table->double('price'); + $table->timestamps(); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('station_fuel_prices'); + } +} diff --git a/database/migrations/2019_10_10_110803_create_in_app_notifications_table.php b/database/migrations/2019_10_10_110803_create_in_app_notifications_table.php new file mode 100644 index 0000000..f539f43 --- /dev/null +++ b/database/migrations/2019_10_10_110803_create_in_app_notifications_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('subject')->nullable(); + $table->string('description')->nullable(); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('in_app_notifications'); + } +} diff --git a/database/migrations/2019_10_17_132311_add_schedule_and_expiration_to_in_app_notifications.php b/database/migrations/2019_10_17_132311_add_schedule_and_expiration_to_in_app_notifications.php new file mode 100644 index 0000000..7d2a4ee --- /dev/null +++ b/database/migrations/2019_10_17_132311_add_schedule_and_expiration_to_in_app_notifications.php @@ -0,0 +1,34 @@ +string('trigger_schedule')->nullable(); + // + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('in_app_notifications', function (Blueprint $table) { + $table->dropColumn('trigger_schedule'); + // + }); + } +} diff --git a/database/migrations/2019_10_21_114438_add_expiration_to_in_app_notifications.php b/database/migrations/2019_10_21_114438_add_expiration_to_in_app_notifications.php new file mode 100644 index 0000000..a3c6423 --- /dev/null +++ b/database/migrations/2019_10_21_114438_add_expiration_to_in_app_notifications.php @@ -0,0 +1,34 @@ +string('expiration_date')->nullable(); + // + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('in_app_notifications', function (Blueprint $table) { + $table->dropColumn('expiration_date'); + // + }); + } +} diff --git a/database/migrations/2020_08_11_163849_create_paymaya_tokens_table.php b/database/migrations/2020_08_11_163849_create_paymaya_tokens_table.php new file mode 100644 index 0000000..a0600f7 --- /dev/null +++ b/database/migrations/2020_08_11_163849_create_paymaya_tokens_table.php @@ -0,0 +1,37 @@ +increments('paymaya_token_id'); + $table->uuid('paymaya_token_uuid')->unique(); + $table->string('card_number', 16)->nullable(); + $table->string('customer_id')->nullable(); + $table->longtext('token')->nullable();; + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); + $table->boolean('is_active')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('paymaya_tokens'); + } +} diff --git a/database/seeds/AdminUserSeeder.php b/database/seeds/AdminUserSeeder.php new file mode 100644 index 0000000..57ef2a3 --- /dev/null +++ b/database/seeds/AdminUserSeeder.php @@ -0,0 +1,67 @@ +where('type',1)->delete(); + DB::table('admin')->truncate(); + + for ($i=0; $i < 9; $i++) { + $uuid = new UuidHelper; + + $uuid = $uuid->generate_uuid1(); + $faker = Faker::create(); + + $lastName = $faker->lastName; + $firstName = $faker->firstName; + $username = 'superadmin'.($i > 0 ? $i : ''); + + $dataadmin = array( + array( + "username" => $username, + "role" => 1, + "password" => bcrypt('Secret123!'), + "lastname" => $lastName, + "is_passwordChanged" => 0, + "is_active" => 1, + "firstname" => $firstName, + "email" => strtolower($firstName."_".$lastName)."@qqqq.com", + "created_by" => 0, + "admin_uuid" => $uuid, + ) + ); + + $datausers = array( + array( + "name" => $firstName." ".$lastName, + "username" => $username, + "email" => strtolower($firstName."_".$lastName)."@qqqq.com", + "type" => 1, + "password" => bcrypt('Secret123!'), + "remember_token" =>1 + ) + ); + + DB::table('users')->insert($datausers); + DB::table('admin')->insert($dataadmin); + } + + } +} diff --git a/database/seeds/CodeCardTypeTableSeeder.php b/database/seeds/CodeCardTypeTableSeeder.php new file mode 100644 index 0000000..311b62c --- /dev/null +++ b/database/seeds/CodeCardTypeTableSeeder.php @@ -0,0 +1,55 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( + 'cardtype_uuid' => $uuid->generate_uuid1(), + 'code' => "PARTNERGP", + 'name' => "GRAB - UNIOIL LOYALTY CARD", + ), + array( + 'cardtype_uuid' => $uuid->generate_uuid1(), + 'code' => "PARTNERICA", + 'name' => "ICA - UNIOIL LOYALTY CARD", + ), + array( + 'cardtype_uuid' => $uuid->generate_uuid1(), + 'code' => "PRIVATEB", + 'name' => "UNIOIL CLASSIC", + ), + array( + 'cardtype_uuid' => $uuid->generate_uuid1(), + 'code' => "PRIVATEP", + 'name' => "UNIOIL ELITE", + ), + array( + 'cardtype_uuid' => $uuid->generate_uuid1(), + 'code' => "PRIVATEV", + 'name' => "UNIOIL PREMUIM", + ), + array( + 'cardtype_uuid' => $uuid->generate_uuid1(), + 'code' => "PARTNERXSI", + 'name' => "XAVIER - UNIOIL LOYALTY CARD", + ), + ); + + DB::table('code_card_type')->insert($data); + } +} diff --git a/database/seeds/CodeCivilStatusTableSeeder.php b/database/seeds/CodeCivilStatusTableSeeder.php new file mode 100644 index 0000000..c797067 --- /dev/null +++ b/database/seeds/CodeCivilStatusTableSeeder.php @@ -0,0 +1,50 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( + 'civilstatus_uuid' => $uuid->generate_uuid1(), + 'code' => "S", + 'description' => "SINGLE", + ), + array( + 'civilstatus_uuid' => $uuid->generate_uuid1(), + 'code' => "M", + 'description' => "MARRIED", + ), + array( + 'civilstatus_uuid' => $uuid->generate_uuid1(), + 'code' => "0", + 'description' => "NO DATA ENTERED", + ), + array( + 'civilstatus_id' => $uuid->generate_uuid1(), + 'code' => "W", + 'description' => "WIDOW", + ), + array( + 'civilstatus_id' => $uuid->generate_uuid1(), + 'code' => "SE", + 'description' => "SEPARATED", + ), + ); + + DB::table('code_civil_status')->insert($data); + } +} diff --git a/database/seeds/CodeFuelTypeTableSeeder.php b/database/seeds/CodeFuelTypeTableSeeder.php new file mode 100644 index 0000000..8293a6a --- /dev/null +++ b/database/seeds/CodeFuelTypeTableSeeder.php @@ -0,0 +1,45 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( + 'fueltype_uuid' => $uuid->generate_uuid1(), + 'code' => "1", + 'description' => "GASOLINE 97", + ), + array( + 'fueltype_uuid' => $uuid->generate_uuid1(), + 'code' => "2", + 'description' => "GASOLINE 95", + ), + array( + 'fueltype_uuid' => $uuid->generate_uuid1(), + 'code' => "3", + 'description' => "GASOLINE 91", + ), + array( + 'fueltype_uuid' => $uuid->generate_uuid1(), + 'code' => "4", + 'description' => "DIESEL", + ) + ); + + DB::table('code_fuel_type')->insert($data); + } +} diff --git a/database/seeds/CodeGenderSeeder.php b/database/seeds/CodeGenderSeeder.php new file mode 100644 index 0000000..4175805 --- /dev/null +++ b/database/seeds/CodeGenderSeeder.php @@ -0,0 +1,40 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( + 'gender_uuid' => $uuid->generate_uuid1(), + 'code' => "0", + 'description' => "NO DATA ENTERED", + ), + array( + 'gender_uuid' => $uuid->generate_uuid1(), + 'code' => "M", + 'description' => "MALE", + ), + array( + 'gender_uuid' => $uuid->generate_uuid1(), + 'code' => "F", + 'description' => "FEMALE", + ) + ); + + DB::table('code_gender')->insert($data); + } +} diff --git a/database/seeds/CodeVehicleOwnTableSeeder.php b/database/seeds/CodeVehicleOwnTableSeeder.php new file mode 100644 index 0000000..8095265 --- /dev/null +++ b/database/seeds/CodeVehicleOwnTableSeeder.php @@ -0,0 +1,35 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( + 'vo_uuid' => $uuid->generate_uuid1(), + 'code' => "1", + 'description' => "4 WHEELER", + ), + array( + 'vo_uuid' => $uuid->generate_uuid1(), + 'code' => "2", + 'description' => "2 WHEELER", + ) + ); + + DB::table('code_vehicle_own')->insert($data); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php new file mode 100644 index 0000000..22340d9 --- /dev/null +++ b/database/seeds/DatabaseSeeder.php @@ -0,0 +1,29 @@ +call(MemberSeeder::class); + $this->call(AdminUserSeeder::class); + $this->call(CodeGenderSeeder::class); + $this->call(StationTableSeeder::class); + $this->call(CodeCardTypeTableSeeder::class); + $this->call(CodeCivilStatusTableSeeder::class); + $this->call(CodeVehicleOwnTableSeeder::class); + $this->call(SystemPreferenceTableSeeder::class); + // $this->call(TopUpTableSeeder::class); + // $this->call(PaymentsTableSeeder::class); + // $this->call(RatingsTableSeeder::class); + // $this->call(PhotoSliderTableSeeder::class); + // $this->call(MobileAnalyticsTableSeeder::class); + // $this->call(TermsAndPolicyTableSeeder::class); + } +} diff --git a/database/seeds/IDNumberTypeSeeder.php b/database/seeds/IDNumberTypeSeeder.php new file mode 100644 index 0000000..4ae619c --- /dev/null +++ b/database/seeds/IDNumberTypeSeeder.php @@ -0,0 +1,45 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( + 'idnt_uuid' => $uuid->generate_uuid1(), + 'name' => "School ID", + ), + array( + 'idnt_uuid' => $uuid->generate_uuid1(), + 'name' => "Company ID", + ), + array( + 'idnt_uuid' => $uuid->generate_uuid1(), + 'name' => "Passport", + ), + array( + 'idnt_uuid' => $uuid->generate_uuid1(), + 'name' => "SSS", + ), + array( + 'idnt_uuid' => $uuid->generate_uuid1(), + 'name' => "TIN", + ), + ); + + DB::table('id_number_type')->insert($data); + } +} diff --git a/database/seeds/MemberSeeder.php b/database/seeds/MemberSeeder.php new file mode 100644 index 0000000..1556482 --- /dev/null +++ b/database/seeds/MemberSeeder.php @@ -0,0 +1,94 @@ +truncate(); + DB::table('personal_details')->truncate(); + DB::table('users')->where('type',2)->delete(); + + $personal_details = array(); + $loyalty_card = array(); + $users = array(); + + for ($i=1; $i <= 200; $i++) + { + $uuid = new UuidHelper; + $pd_uuid = $uuid->generate_uuid1(); + $lcard_uuid = $uuid->generate_uuid1(); + $faker = Faker::create(); + + $lastName = $faker->lastName; + $firstName = $faker->firstName; + + $registration = $faker->dateTimeBetween($startDate = '-5 days', $endDate = 'now'); + $valitated = rand(0,1) ? $faker->dateTimeBetween($startDate = '-5 days', $endDate = 'now') : false; + + $personal_details[] = array( + 'pd_uuid' => $pd_uuid, + 'firstname' => $firstName, + 'middlename' => '', + 'lastname' => $lastName, + 'photo' => '', + 'birthdate' => '1994-11-25 00:00:00', + 'address' => 'Pembo Makati City', + 'created_at' => $registration, + 'created_by' => 0 + ); + + $card_number = StringHelper::random_num(16); + + $loyalty_card[] = array( + 'lcard_uuid' => $lcard_uuid, + 'pd_id' => $i, + 'lcard_s_id' => 0, + 'card_number' => $card_number, + 'pin' => (12345678 + $i), + 'cardtype_id' => 1, + 'expiry_date' => '2020-11-25 00:00:00', + 'birthdate' => '1994-11-25', + 'mobile' => '09155664820', + 'email' => strtolower($firstName."_".$lastName)."@qqqq.com", + 'civilstatus_id' => 1, + 'gender_id' => 1, + 'vo_id' => 1, + 'is_validated' => $valitated ? 1 : 0, + 'validation_dt' => $valitated ? $valitated : 0, + 'is_locked' => $i > 10 ? 1 : 0, + 'lock_code' => $i > 10 ? '01' : '', + 'lock_dt' => $i > 10 ? date('Y-m-d H:i:s') : '', + 'created_at' => $registration, + 'last_synchronized' => date('Y-m-d H:i:s'), + ); + + $users[] = array( + "name" => $firstName." ".$lastName, + "username" => $card_number, + "email" => strtolower($firstName."_".$lastName)."@qqqq.com", + "type" => 2, + "password" => bcrypt('19941125'), + "remember_token" => 1 + ); + + + } + + + DB::table('personal_details')->insert($personal_details); + DB::table('loyalty_card')->insert($loyalty_card); + DB::table('users')->insert($users); + + } +} diff --git a/database/seeds/MobileAnalyticsTableSeeder.php b/database/seeds/MobileAnalyticsTableSeeder.php new file mode 100644 index 0000000..e389bae --- /dev/null +++ b/database/seeds/MobileAnalyticsTableSeeder.php @@ -0,0 +1,37 @@ +truncate(); + + + for ($i=1; $i <= 20; $i++) { + $faker = Faker::create(); + $unixTimestamp = '1461067200'; + + $lastName = $faker->lastName; + $data[] = array( + 'date' => $faker->date('Y-m-d', $unixTimestamp), + 'active' => rand(100,500), + 'inactive' => rand(100,500), + 'locked' => rand(1,100), + ); + + + } + + DB::table('mobile_analytics')->insert($data); + } +} diff --git a/database/seeds/PaymentsTableSeeder.php b/database/seeds/PaymentsTableSeeder.php new file mode 100644 index 0000000..bad0785 --- /dev/null +++ b/database/seeds/PaymentsTableSeeder.php @@ -0,0 +1,63 @@ +truncate(); + + + for ($i=1; $i <= 20; $i++) { + $uuid = new UuidHelper; + $uuid = $uuid->generate_uuid1(); + $faker = Faker::create(); + + $lastName = $faker->lastName; + $firstName = $faker->firstName; + + $amount = rand(100,5000); + $data[] = array( + 'payment_uuid' => $uuid, + 'lcard_id' => rand(1,20), + 'station_id' => StaticContents::app_station_id(), + 'payer_id' => rand(1,20), + 'firstname' => $firstName, + 'lastname' => $lastName, + 'business' => 'sample', + 'verify_sign' => 'sample1234', + 'payer_email' => $faker->email, + 'receiver_email'=> $faker->email, + 'trans_num' => rand(10000,99999), + 'item_name' => 'PREPAID LOAD', + 'item_code' => 'PREPAID', + 'item_number' => rand(1,20), + 'ip_track_id' => '13.45.34.'.$i, + 'other' => 'other', + 'amount' => $amount, + 'points' => $amount, + 'entry_type_code' => 'APP', + 'entry_type_desc' => 'APP', + 'quantity' => 1, + 'paid_at' => date('Y-m-d H:i:s'), + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => 0 + ); + + + } + + DB::table('payments')->insert($data); + } +} diff --git a/database/seeds/PhotoSliderTableSeeder.php b/database/seeds/PhotoSliderTableSeeder.php new file mode 100644 index 0000000..d0f47a3 --- /dev/null +++ b/database/seeds/PhotoSliderTableSeeder.php @@ -0,0 +1,40 @@ +truncate(); + + + for ($i=1; $i <= 20; $i++) { + $uuid = new UuidHelper; + $uuid = $uuid->generate_uuid1(); + + $data[] = array( + 'photoslider_uuid' => $uuid, + 'promotion_id' => 0, + 'title' => 'sample title', + 'description' => 'sample description', + 'image' => '', + 'date_start' => date('Y-m-d H:i:s'), + 'date_end' => date('Y-m-d H:i:s',strtotime("+3 days")), + 'created_at' => date('Y-m-d H:i:s') + ); + + + } + + DB::table('photo_slider')->insert($data); + } +} diff --git a/database/seeds/RatingsTableSeeder.php b/database/seeds/RatingsTableSeeder.php new file mode 100644 index 0000000..50e8356 --- /dev/null +++ b/database/seeds/RatingsTableSeeder.php @@ -0,0 +1,38 @@ +truncate(); + + + for ($i=1; $i <= 20; $i++) { + $uuid = new UuidHelper; + $uuid = $uuid->generate_uuid1(); + + $data[] = array( + 'rating_uuid' => $uuid, + 'lcard_id' => rand(1,20), + 'station_id' => rand(1,63), + 'payment_id' => rand(1,20), + 'rate' => rand(1,5), + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => 0 + ); + + + } + + DB::table('ratings')->insert($data); + } +} diff --git a/database/seeds/StationTableSeeder.php b/database/seeds/StationTableSeeder.php new file mode 100644 index 0000000..0d4179b --- /dev/null +++ b/database/seeds/StationTableSeeder.php @@ -0,0 +1,93 @@ +truncate(); + + $uuid = new UuidHelper; + + $data = array( + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1051", 'description' => "UNIOIL A.BONIFACIO NORTH BOUND", 'longitude' => 120.992098, 'latitude' => 14.640393, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1050", 'description' => "UNIOIL MAYON", 'longitude' => 120.9978924, 'latitude' => 14.6230785, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1030", 'description' => "UNIOIL SLEX MAKATI", 'longitude' => 121.0100972, 'latitude' => 14.549909, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1004", 'description' => "UNIOIL NAIA ROAD", 'longitude' => 120.9949992, 'latitude' => 14.5008563, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1033", 'description' => "UNIOIL F BLUMENTRITT SAN JUAN", 'longitude' => 121.026365, 'latitude' => 14.602951, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1013", 'description' => "UNIOIL AIRPORT RD PARANAQUE", 'longitude' => 120.994102, 'latitude' => 14.527216, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1019", 'description' => "UNIOIL SUCAT RD PARANAQUE", 'longitude' => 120.996661, 'latitude' => 14.481546, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1055", 'description' => "UNIOIL GEN TRIAS", 'longitude' => 120.940213, 'latitude' => 14.405903, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1045", 'description' => "UNIOIL BF RESORT DRIVE LPINAS", 'longitude' => 120.992731, 'latitude' => 14.4439, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1054", 'description' => "UNIOIL CARMONA", 'longitude' => 14.288612, 'latitude' => 121.011742, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1023", 'description' => "UNIOIL MAKILING CALAMBA", 'longitude' => 121.138148, 'latitude' => 14.164657, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1027", 'description' => "UNIOIL BALANGA BATAAN", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1005", 'description' => "UNIOIL EDSA CALOOCAN", 'longitude' => 120.9904353, 'latitude' => 14.6573851, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1029", 'description' => "UNIOIL CONGRESSIONAL AVENUE", 'longitude' => 121.047271, 'latitude' => 14.672642, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1021", 'description' => "UNIOIL MINDANAO AVENUE 2", 'longitude' => 121.019763, 'latitude' => 14.694977, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1009", 'description' => "UNIOIL REGALADO FAIRVIEW", 'longitude' => 121.0612474, 'latitude' => 14.724898, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1010", 'description' => "UNIOIL FB HARRISON", 'longitude' => 120.991324, 'latitude' => 14.555401, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1040", 'description' => "UNIOIL BUENDIA AVENUE", 'longitude' => 121.002875, 'latitude' => 14.5557, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1024", 'description' => "UNIOIL SAN GUILLERMO", 'longitude' => 121.066386, 'latitude' => 14.554207, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1018", 'description' => "UNIOIL ORTIGAS EXTENSION", 'longitude' => 121.096902, 'latitude' => 14.589869, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1044", 'description' => "UNIOIL SANTA MESA", 'longitude' => 121.0825902, 'latitude' => 14.6344891, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1041", 'description' => "UNIOIL MEXICO PAMPANGA", 'longitude' => 120.702529, 'latitude' => 15.05112, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1068", 'description' => "UNIOIL DOLORES", 'longitude' => 120.674318, 'latitude' => 15.043945, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1003", 'description' => "UNIOIL SINGALONG", 'longitude' => 121.037499, 'latitude' => 14.58962, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1042", 'description' => "UNIOIL NAVOTAS", 'longitude' => 120.957621, 'latitude' => 14.640219, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1015", 'description' => "UNIOIL PANDACAN MANILA", 'longitude' => 121.001881, 'latitude' => 14.583601, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1031", 'description' => "UNIOIL COMMONWEALTH AVENUE", 'longitude' => 121.077101, 'latitude' => 14.704777, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1022", 'description' => "UNIOIL NOVALICHES QC", 'longitude' => 121.077101, 'latitude' => 14.704777, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1049", 'description' => "UNIOIL VALENZUELA", 'longitude' => 120.995159, 'latitude' => 14.704751, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1047", 'description' => "UNIOIL MEYCAUAYAN", 'longitude' => 120.995159, 'latitude' => 14.704751, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1060", 'description' => "UNIOIL MAKATI AVE.", 'longitude' => 121.030479, 'latitude' => 14.567192, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1017", 'description' => "UNIOIL ORTIGAS EXTENSION CAINTA", 'longitude' => 121.125456, 'latitude' => 14.583099, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1052", 'description' => "UNIOIL A.BONIFACIO SOUTH BOUND", 'longitude' => 121.407759, 'latitude' => 14.13275, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1067", 'description' => "UNIOIL SOUTHMALL LAS PINAS", 'longitude' => 121.012161, 'latitude' => 14.434301, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1062", 'description' => "UNIOIL E. RODRIGUEZ", 'longitude' => 121.033821, 'latitude' => 14.624307, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1048", 'description' => "UNIOIL V. LUNA", 'longitude' => 121.049203, 'latitude' => 14.6375, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1056", 'description' => "UNIOIL WEST AVENUE", 'longitude' => 121.02761, 'latitude' => 14.644908, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1028", 'description' => "UNIOIL KALAYAAN QC", 'longitude' => 121.054791, 'latitude' => 14.641948, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "UPPI", 'description' => "UNIOIL PETROLEUM PHILIPPINES INC.", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1046", 'description' => "UNIOIL ESR BICUTAN", 'longitude' => 121.045656, 'latitude' => 14.477386, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1020", 'description' => "UNIOIL ANABU 1 IMUS", 'longitude' => 120.939667, 'latitude' => 14.386135, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1032", 'description' => "UNIOIL MINDANAO AVENUE 1", 'longitude' => 121.032384, 'latitude' => 14.675889, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1026", 'description' => "UNIOIL EDSA BANSALANGIN", 'longitude' => 121.033821, 'latitude' => 14.624307, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1014", 'description' => "UNIOIL ANABU 2 IMUS", 'longitude' => 120.939689, 'latitude' => 14.389572, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1057", 'description' => "UNIOIL BARANGKA MARIKINA", 'longitude' => 121.083481, 'latitude' => 14.632964, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1059", 'description' => "UNIOIL SHAW BLVD.", 'longitude' => 121.037499, 'latitude' => 14.58962, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1053", 'description' => "UNIOIL SILANG 2", 'longitude' => 120.956839, 'latitude' => 14.132252, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1061", 'description' => "UNIOIL VITO CRUZ", 'longitude' => 121.037499, 'latitude' => 14.567192, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1016", 'description' => "UNIOIL FLORIDA BLANCA", 'longitude' => 120.504484, 'latitude' => 14.980026, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1006", 'description' => "UNIOIL GAPAN NUEVA ECIJA", 'longitude' => 120.948339, 'latitude' => 15.279713, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1036", 'description' => "UNIOIL CAVINTI LAGUNA", 'longitude' => 121.487034, 'latitude' => 14.233641, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1008", 'description' => "UNIOIL NAGCARLAN LAGUNA", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1012", 'description' => "UNIOIL SAN NICOLAS BACOOR", 'longitude' => 120.974799, 'latitude' => 14.429098, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1001", 'description' => "UNIOIL QUEZON AVENUE", 'longitude' => 121.005409, 'latitude' => 14.621561, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1011", 'description' => "UNIOIL SILANG CAVITE", 'longitude' => 120.975415, 'latitude' => 14.24422, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1000", 'description' => "UNIOIL - TESTER", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "SMS", 'description' => "SMS", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 0), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1065", 'description' => "UNIOIL EDSA GUADALUPE", 'longitude' => 121.040712, 'latitude' => 14.559526, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1025", 'description' => "UNIOIL PULILAN", 'longitude' => 120.990427, 'latitude' => 14.657546, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1035", 'description' => "UNIOIL VERMONT", 'longitude' => 121.094831, 'latitude' => 14.6232028, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1038", 'description' => "UNIOIL BUENDIA PASAY", 'longitude' => 120.9912174, 'latitude' => 14.553143, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1007", 'description' => "UNIOIL CONCEPCION MARIKINA", 'longitude' => 121.107028, 'latitude' => 14.650903, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1064", 'description' => "UNIOIL CONGRESSIONAL 2", 'longitude' => 121.0209062, 'latitude' => 14.6299896, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "WEB", 'description' => "WEB", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 0), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "1058", 'description' => "UNIOIL KATIPUNAN", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 1), + array( 'station_uuid' => $uuid->generate_uuid1(), 'code' => "APP", 'description' => "APP", 'longitude' => 0, 'latitude' => 0, 'is_viewable' => 0) + ); + + DB::table('station')->insert($data); + } +} + diff --git a/database/seeds/SystemPreferenceTableSeeder.php b/database/seeds/SystemPreferenceTableSeeder.php new file mode 100644 index 0000000..db9b07f --- /dev/null +++ b/database/seeds/SystemPreferenceTableSeeder.php @@ -0,0 +1,75 @@ +truncate(); + + $uuid = new UuidHelper; + $faker = Faker::create(); + + + + $data = array( + + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "logo", + 'value'=> "" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "gps", + 'value'=> 2000 + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "contact_email_address_mobile", + 'value'=> "sample@email.com" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "contact_number_mobile", + 'value'=> "09159999999" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "contact_details", + 'value'=> "sample" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "who_we_are_content", + 'value'=> "" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "what_we_do_content", + 'value'=> "" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "why_unioil_content", + 'value'=> "" + ), + array( + 'sp_uuid'=> $uuid->generate_uuid1(), + 'name'=> "information_guide_details", + 'value'=> "" + ) + ); + + DB::table('system_preferences')->insert($data); + } +} diff --git a/database/seeds/TermsAndPolicyTableSeeder.php b/database/seeds/TermsAndPolicyTableSeeder.php new file mode 100644 index 0000000..02aea00 --- /dev/null +++ b/database/seeds/TermsAndPolicyTableSeeder.php @@ -0,0 +1,39 @@ +truncate(); + + for ($i=1; $i < 100; $i++) { + $uuid = new UuidHelper; + $faker = Faker::create(); + $uuid = $uuid->generate_uuid1(); + $dataTopUp = array( + array( + "tp_uuid" => $uuid, + "title" => $faker->colorName, + "details" => $faker->paragraph($nbSentences = 3, $variableNbSentences = true), + "type" => rand(1,2), + "is_active" => rand(0,1), + "created_by" => 1, + "created_at" => date("Y-m-d H:i:s"), + ) + ); + DB::table('terms_and_policy')->insert($dataTopUp); + } + + + } +} diff --git a/database/seeds/TopUpTableSeeder.php b/database/seeds/TopUpTableSeeder.php new file mode 100644 index 0000000..4476cef --- /dev/null +++ b/database/seeds/TopUpTableSeeder.php @@ -0,0 +1,42 @@ +truncate(); + + + + for ($i=1; $i < 100; $i++) { + $uuid = new UuidHelper; + $faker = Faker::create(); + $uuid = $uuid->generate_uuid1(); + $dataTopUp = array( + array( + "topup_uuid" => $uuid, + "fee_code" => str_pad($i, 4, '0', STR_PAD_LEFT), + "name" => $faker->colorName, + "amount" => $faker->randomNumber(3), + "is_active" => rand(0,1), + "type" => rand(1,2), //1 PH peso 2 Percentage + "created_by" => 1, + "created_at" => date("Y-m-d H:i:s"), + ) + ); + DB::table('top_up')->insert($dataTopUp); + } + + + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d5f92f9 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "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": "npm run development -- --watch", + "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 --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + }, + "devDependencies": { + "axios": "^0.18", + "bootstrap": "^4.0.0", + "cross-env": "^5.1", + "jquery": "^3.2", + "laravel-mix": "^2.0", + "lodash": "^4.17.5", + "popper.js": "^1.12", + "vue": "^2.5.7" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..733dc0d --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,33 @@ + + + + + ./tests/Unit + + + + ./tests/Feature + + + + + ./app + + + + + + + + + + + diff --git a/public/.DS_Store b/public/.DS_Store new file mode 100644 index 0000000..c7f458c Binary files /dev/null and b/public/.DS_Store differ diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b75525b --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/css/app.css b/public/css/app.css new file mode 100644 index 0000000..262988d --- /dev/null +++ b/public/css/app.css @@ -0,0 +1,6 @@ +@import url(https://fonts.googleapis.com/css?family=Nunito);/*! + * Bootstrap v4.1.2 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--orange:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--warning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nunito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Nunito,sans-serif;font-size:.9rem;font-weight:400;line-height:1.6;color:#212529;text-align:left;background-color:#f8fafc}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#3490dc;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#1d68a7;text-decoration:underline}a:not([href]):not([tabindex]),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}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg:not(:root){vertical-align:middle}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.8rem}.h3,h3{font-size:1.575rem}.h4,h4{font-size:1.35rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:.9rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.125rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014 \A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f8fafc;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#f66d9b;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;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,.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-auto,.col-lg,.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-auto,.col-md,.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-auto,.col-sm,.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-auto,.col-xl,.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-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#f8fafc}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#c6e0f5}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0d4f1}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c7eed8}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b3e8ca}.table-info,.table-info>td,.table-info>th{background-color:#d6e9f9}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c0ddf6}.table-warning,.table-warning>td,.table-warning>th{background-color:#fffacc}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fff8b3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f7c6c5}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f4b0af}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#f8fafc;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#f8fafc;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#a1cbef;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.25);box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder,.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.19rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.6}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.7875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.6;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.68125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.6875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#38c172}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(56,193,114,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#38c172}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#38c172;-webkit-box-shadow:0 0 0 .2rem rgba(56,193,114,.25);box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#38c172}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#38c172}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{background-color:#98e1b7}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#5cd08d}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(56,193,114,.25);box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(56,193,114,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#38c172}.custom-file-input.is-valid~.custom-file-label:before,.was-validated .custom-file-input:valid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(56,193,114,.25);box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#e3342f}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(227,52,47,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#e3342f}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#e3342f;-webkit-box-shadow:0 0 0 .2rem rgba(227,52,47,.25);box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#e3342f}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#e3342f}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{background-color:#f2a29f}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e9605c}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(227,52,47,.25);box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(227,52,47,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#e3342f}.custom-file-input.is-invalid~.custom-file-label:before,.was-validated .custom-file-input:invalid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(227,52,47,.25);box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.25);box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-primary:hover{color:#fff;background-color:#227dc7;border-color:#2176bd}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.5);box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2176bd;border-color:#1f6fb2}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.5);box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-success{color:#fff;background-color:#38c172;border-color:#38c172}.btn-success:hover{color:#fff;background-color:#2fa360;border-color:#2d995b}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(56,193,114,.5);box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#38c172;border-color:#38c172}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#2d995b;border-color:#2a9055}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(56,193,114,.5);box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-info{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-info:hover{color:#fff;background-color:#4aa0e6;border-color:#3f9ae5}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,178,235,.5);box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-info.disabled,.btn-info:disabled{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#3f9ae5;border-color:#3495e3}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,178,235,.5);box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-warning{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-warning:hover{color:#212529;background-color:#ffe924;border-color:#ffe817}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,237,74,.5);box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#ffe817;border-color:#ffe70a}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,237,74,.5);box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-danger{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-danger:hover{color:#fff;background-color:#d0211c;border-color:#c51f1a}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(227,52,47,.5);box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c51f1a;border-color:#b91d19}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(227,52,47,.5);box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#3490dc;background-color:transparent;background-image:none;border-color:#3490dc}.btn-outline-primary:hover{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.5);box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3490dc;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.5);box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-success{color:#38c172;background-color:transparent;background-image:none;border-color:#38c172}.btn-outline-success:hover{color:#fff;background-color:#38c172;border-color:#38c172}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(56,193,114,.5);box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#38c172;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#38c172;border-color:#38c172}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(56,193,114,.5);box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-info{color:#6cb2eb;background-color:transparent;background-image:none;border-color:#6cb2eb}.btn-outline-info:hover{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,178,235,.5);box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#6cb2eb;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,178,235,.5);box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-warning{color:#ffed4a;background-color:transparent;background-image:none;border-color:#ffed4a}.btn-outline-warning:hover{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,237,74,.5);box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffed4a;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,237,74,.5);box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-danger{color:#e3342f;background-color:transparent;background-image:none;border-color:#e3342f}.btn-outline-danger:hover{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(227,52,47,.5);box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#e3342f;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(227,52,47,.5);box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#3490dc;background-color:transparent}.btn-link:hover{color:#1d68a7;background-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline;border-color:transparent}.btn-link.focus,.btn-link:focus{-webkit-box-shadow:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.9rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#3490dc}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.7875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group,.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;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-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.9rem;font-weight:400;line-height:1.6;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.6rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;background-color:#3490dc}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25);box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-control-input:active~.custom-control-label:before{color:#fff;background-color:#cce3f6}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label:before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.3rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background-repeat:no-repeat;background-position:50%;background-size:50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:before{background-color:#3490dc}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{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='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#3490dc}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:before{background-color:#3490dc}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.19rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.6;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#a1cbef;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(161,203,239,.5);box-shadow:0 0 0 .2rem rgba(161,203,239,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.68125rem + 2px);font-size:75%}.custom-select-lg,.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem}.custom-select-lg{height:calc(2.6875rem + 2px);font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.19rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#a1cbef;-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.25);box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.custom-file-input:focus~.custom-file-label:after{border-color:#a1cbef}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-label{left:0;z-index:1;height:calc(2.19rem + 2px);background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.6;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.19rem;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#3490dc;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:focus{outline:none;-webkit-box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25);box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#cce3f6}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#3490dc;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:focus{outline:none;box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range::-moz-range-thumb:active{background-color:#cce3f6}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#3490dc;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:focus{outline:none;box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range::-ms-thumb:active{background-color:#cce3f6}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#f8fafc;border-color:#dee2e6 #dee2e6 #f8fafc}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#3490dc}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.32rem;padding-bottom:.32rem;margin-right:1rem;font-size:1.125rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.125rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' 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 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' 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 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck,.card-deck .card{-webkit-box-direction:normal}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#3490dc;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#1d68a7;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(52,144,220,.25);box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#3490dc;border-color:#3490dc}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.125rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#3490dc}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#2176bd}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#38c172}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#2d995b}.badge-info{color:#212529;background-color:#6cb2eb}.badge-info[href]:focus,.badge-info[href]:hover{color:#212529;text-decoration:none;background-color:#3f9ae5}.badge-warning{color:#212529;background-color:#ffed4a}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#ffe817}.badge-danger{color:#fff;background-color:#e3342f}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#c51f1a}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.85rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#1b4b72;background-color:#d6e9f8;border-color:#c6e0f5}.alert-primary hr{border-top-color:#b0d4f1}.alert-primary .alert-link{color:#113049}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#1d643b;background-color:#d7f3e3;border-color:#c7eed8}.alert-success hr{border-top-color:#b3e8ca}.alert-success .alert-link{color:#123c24}.alert-info{color:#385d7a;background-color:#e2f0fb;border-color:#d6e9f9}.alert-info hr{border-top-color:#c0ddf6}.alert-info .alert-link{color:#284257}.alert-warning{color:#857b26;background-color:#fffbdb;border-color:#fffacc}.alert-warning hr{border-top-color:#fff8b3}.alert-warning .alert-link{color:#5d561b}.alert-danger{color:#761b18;background-color:#f9d6d5;border-color:#f7c6c5}.alert-danger hr{border-top-color:#f4b0af}.alert-danger .alert-link{color:#4c110f}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;overflow:hidden;font-size:.675rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#3490dc;-webkit-transition:width .6s ease;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#3490dc;border-color:#3490dc}.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-primary{color:#1b4b72;background-color:#c6e0f5}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#1b4b72;background-color:#b0d4f1}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1b4b72;border-color:#1b4b72}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#1d643b;background-color:#c7eed8}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#1d643b;background-color:#b3e8ca}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1d643b;border-color:#1d643b}.list-group-item-info{color:#385d7a;background-color:#d6e9f9}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#385d7a;background-color:#c0ddf6}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#385d7a;border-color:#385d7a}.list-group-item-warning{color:#857b26;background-color:#fffacc}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#857b26;background-color:#fff8b3}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#857b26;border-color:#857b26}.list-group-item-danger{color:#761b18;background-color:#f7c6c5}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#761b18;background-color:#f4b0af}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#761b18;border-color:#761b18}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.35rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal,.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-25%);transform:translateY(-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0);transform:translate(0)}.modal-dialog-centered{-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-content,.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex}.modal-content{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;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:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.6}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.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:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Nunito,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:Nunito,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:after,.bs-popover-top .arrow:before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-top .arrow:after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:after,.bs-popover-right .arrow:before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-right .arrow:after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:after,.bs-popover-bottom .arrow:before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-bottom .arrow:after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:after,.bs-popover-left .arrow:before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-left .arrow:after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.9rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateZ(0);transform:translateZ(0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-property:opacity;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateZ(0);transform:translateZ(0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;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='M5.25 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='M2.75 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:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:hsla(0,0%,100%,.5)}.carousel-indicators li:before{top:-10px}.carousel-indicators li:after,.carousel-indicators li:before{position:absolute;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li:after{bottom:-10px}.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-primary{background-color:#3490dc!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2176bd!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#38c172!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#2d995b!important}.bg-info{background-color:#6cb2eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#3f9ae5!important}.bg-warning{background-color:#ffed4a!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#ffe817!important}.bg-danger{background-color:#e3342f!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#c51f1a!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.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}.border-primary{border-color:#3490dc!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#38c172!important}.border-info{border-color:#6cb2eb!important}.border-warning{border-color:#ffed4a!important}.border-danger{border-color:#e3342f!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.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-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;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-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;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-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;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-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;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-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.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 embed,.embed-responsive iframe,.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.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;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}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.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-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#3490dc!important}a.text-primary:focus,a.text-primary:hover{color:#2176bd!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#38c172!important}a.text-success:focus,a.text-success:hover{color:#2d995b!important}.text-info{color:#6cb2eb!important}a.text-info:focus,a.text-info:hover{color:#3f9ae5!important}.text-warning{color:#ffed4a!important}a.text-warning:focus,a.text-warning:hover{color:#ffe817!important}.text-danger{color:#e3342f!important}a.text-danger:focus,a.text-danger:hover{color:#c51f1a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.navbar-laravel{background-color:#fff;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.04)} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..4584cbc --- /dev/null +++ b/public/index.php @@ -0,0 +1,60 @@ + + */ + +define('LARAVEL_START', microtime(true)); + +/* +|-------------------------------------------------------------------------- +| Register The Auto Loader +|-------------------------------------------------------------------------- +| +| Composer provides a convenient, automatically generated class loader for +| our application. We just need to utilize it! We'll simply require it +| into the script here so that we don't have to worry about manual +| loading any of our classes later on. It feels great to relax. +| +*/ + +require __DIR__.'/../vendor/autoload.php'; + +/* +|-------------------------------------------------------------------------- +| Turn On The Lights +|-------------------------------------------------------------------------- +| +| We need to illuminate PHP development, so let us turn on the lights. +| This bootstraps the framework and gets it ready for use, then it +| will load up this application so that we can run it and send +| the responses back to the browser and delight our users. +| +*/ + +$app = require_once __DIR__.'/../bootstrap/app.php'; + +/* +|-------------------------------------------------------------------------- +| Run The Application +|-------------------------------------------------------------------------- +| +| Once we have the application, we can handle the incoming request +| through the kernel, and send the associated response back to +| the client's browser allowing them to enjoy the creative +| and wonderful application we have prepared for them. +| +*/ + +$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); + +$response = $kernel->handle( + $request = Illuminate\Http\Request::capture() +); + +$response->send(); + +$kernel->terminate($request, $response); diff --git a/public/js/app.js b/public/js/app.js new file mode 100644 index 0000000..cb84758 --- /dev/null +++ b/public/js/app.js @@ -0,0 +1 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=11)}([function(e,t,n){"use strict";var r=n(5),i=n(19),o=Object.prototype.toString;function a(e){return"[object Array]"===o.call(e)}function s(e){return null!==e&&"object"==typeof e}function u(e){return"[object Function]"===o.call(e)}function c(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),a(e))for(var n=0,r=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],function(e){u.headers[e]={}}),r.forEach(["post","put","patch"],function(e){u.headers[e]=r.merge(o)}),e.exports=u}).call(t,n(6))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var n="undefined"!=typeof window&&"undefined"!=typeof document,r=["Edge","Trident","Firefox"],i=0,o=0;o=0){i=1;break}var a=n&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},i))}};function s(e){return e&&"[object Function]"==={}.toString.call(e)}function u(e,t){if(1!==e.nodeType)return[];var n=getComputedStyle(e,null);return t?n[t]:n}function c(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function l(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=u(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/(auto|scroll|overlay)/.test(n+i+r)?e:l(c(e))}var f=n&&!(!window.MSInputMethodContext||!document.documentMode),p=n&&/MSIE 10/.test(navigator.userAgent);function d(e){return 11===e?f:10===e?p:f||p}function h(e){if(!e)return document.documentElement;for(var t=d(10)?document.body:null,n=e.offsetParent;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var r=n&&n.nodeName;return r&&"BODY"!==r&&"HTML"!==r?-1!==["TD","TABLE"].indexOf(n.nodeName)&&"static"===u(n,"position")?h(n):n:e?e.ownerDocument.documentElement:document.documentElement}function v(e){return null!==e.parentNode?v(e.parentNode):e}function g(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,r=n?e:t,i=n?t:e,o=document.createRange();o.setStart(r,0),o.setEnd(i,0);var a,s,u=o.commonAncestorContainer;if(e!==u&&t!==u||r.contains(i))return"BODY"===(s=(a=u).nodeName)||"HTML"!==s&&h(a.firstElementChild)!==a?h(u):u;var c=v(e);return c.host?g(c.host,t):g(e,v(t).host)}function m(e){var t="top"===(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=e.nodeName;if("BODY"===n||"HTML"===n){var r=e.ownerDocument.documentElement;return(e.ownerDocument.scrollingElement||r)[t]}return e[t]}function y(e,t){var n="x"===t?"Left":"Top",r="Left"===n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"],10)+parseFloat(e["border"+r+"Width"],10)}function _(e,t,n,r){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],d(10)?n["offset"+e]+r["margin"+("Height"===e?"Top":"Left")]+r["margin"+("Height"===e?"Bottom":"Right")]:0)}function b(){var e=document.body,t=document.documentElement,n=d(10)&&getComputedStyle(t);return{height:_("Height",e,t,n),width:_("Width",e,t,n)}}var w=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},x=function(){function e(e,t){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],r=d(10),i="HTML"===t.nodeName,o=A(e),a=A(t),s=l(e),c=u(t),f=parseFloat(c.borderTopWidth,10),p=parseFloat(c.borderLeftWidth,10);n&&"HTML"===t.nodeName&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var h=T({top:o.top-a.top-f,left:o.left-a.left-p,width:o.width,height:o.height});if(h.marginTop=0,h.marginLeft=0,!r&&i){var v=parseFloat(c.marginTop,10),g=parseFloat(c.marginLeft,10);h.top-=f-v,h.bottom-=f-v,h.left-=p-g,h.right-=p-g,h.marginTop=v,h.marginLeft=g}return(r&&!n?t.contains(s):t===s&&"BODY"!==s.nodeName)&&(h=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=m(t,"top"),i=m(t,"left"),o=n?-1:1;return e.top+=r*o,e.bottom+=r*o,e.left+=i*o,e.right+=i*o,e}(h,t)),h}function k(e){if(!e||!e.parentElement||d())return document.documentElement;for(var t=e.parentElement;t&&"none"===u(t,"transform");)t=t.parentElement;return t||document.documentElement}function O(e,t,n,r){var i=arguments.length>4&&void 0!==arguments[4]&&arguments[4],o={top:0,left:0},a=i?k(e):g(e,t);if("viewport"===r)o=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,r=S(e,n),i=Math.max(n.clientWidth,window.innerWidth||0),o=Math.max(n.clientHeight,window.innerHeight||0),a=t?0:m(n),s=t?0:m(n,"left");return T({top:a-r.top+r.marginTop,left:s-r.left+r.marginLeft,width:i,height:o})}(a,i);else{var s=void 0;"scrollParent"===r?"BODY"===(s=l(c(t))).nodeName&&(s=e.ownerDocument.documentElement):s="window"===r?e.ownerDocument.documentElement:r;var f=S(s,a,i);if("HTML"!==s.nodeName||function e(t){var n=t.nodeName;return"BODY"!==n&&"HTML"!==n&&("fixed"===u(t,"position")||e(c(t)))}(a))o=f;else{var p=b(),d=p.height,h=p.width;o.top+=f.top-f.marginTop,o.bottom=d+f.top,o.left+=f.left-f.marginLeft,o.right=h+f.left}}return o.left+=n,o.top+=n,o.right-=n,o.bottom-=n,o}function D(e,t,n,r,i){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var a=O(n,r,o,i),s={top:{width:a.width,height:t.top-a.top},right:{width:a.right-t.right,height:a.height},bottom:{width:a.width,height:a.bottom-t.bottom},left:{width:t.left-a.left,height:a.height}},u=Object.keys(s).map(function(e){return E({key:e},s[e],{area:(t=s[e],t.width*t.height)});var t}).sort(function(e,t){return t.area-e.area}),c=u.filter(function(e){var t=e.width,r=e.height;return t>=n.clientWidth&&r>=n.clientHeight}),l=c.length>0?c[0].key:u[0].key,f=e.split("-")[1];return l+(f?"-"+f:"")}function I(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;return S(n,r?k(t):g(t,n),r)}function N(e){var t=getComputedStyle(e),n=parseFloat(t.marginTop)+parseFloat(t.marginBottom),r=parseFloat(t.marginLeft)+parseFloat(t.marginRight);return{width:e.offsetWidth+r,height:e.offsetHeight+n}}function j(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function L(e,t,n){n=n.split("-")[0];var r=N(e),i={width:r.width,height:r.height},o=-1!==["right","left"].indexOf(n),a=o?"top":"left",s=o?"left":"top",u=o?"height":"width",c=o?"width":"height";return i[a]=t[a]+t[u]/2-r[u]/2,i[s]=n===s?t[s]-r[c]:t[j(s)],i}function $(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function P(e,t,n){return(void 0===n?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===n});var r=$(e,function(e){return e[t]===n});return e.indexOf(r)}(e,"name",n))).forEach(function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var n=e.function||e.fn;e.enabled&&s(n)&&(t.offsets.popper=T(t.offsets.popper),t.offsets.reference=T(t.offsets.reference),t=n(t,e))}),t}function R(e,t){return e.some(function(e){var n=e.name;return e.enabled&&n===t})}function M(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),r=0;r1&&void 0!==arguments[1]&&arguments[1],n=V.indexOf(e),r=V.slice(n+1).concat(V.slice(0,n));return t?r.reverse():r}var Q={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function Y(e,t,n,r){var i=[0,0],o=-1!==["right","left"].indexOf(r),a=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=a.indexOf($(a,function(e){return-1!==e.search(/,|\s/)}));a[s]&&-1===a[s].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var u=/\s*,\s*|\s+/,c=-1!==s?[a.slice(0,s).concat([a[s].split(u)[0]]),[a[s].split(u)[1]].concat(a.slice(s+1))]:[a];return(c=c.map(function(e,r){var i=(1===r?!o:o)?"height":"width",a=!1;return e.reduce(function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,a=!0,e):a?(e[e.length-1]+=t,a=!1,e):e.concat(t)},[]).map(function(e){return function(e,t,n,r){var i=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),o=+i[1],a=i[2];if(!o)return e;if(0===a.indexOf("%")){var s=void 0;switch(a){case"%p":s=n;break;case"%":case"%r":default:s=r}return T(s)[t]/100*o}if("vh"===a||"vw"===a)return("vh"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*o;return o}(e,i,t,n)})})).forEach(function(e,t){e.forEach(function(n,r){B(n)&&(i[t]+=n*("-"===e[r-1]?-1:1))})}),i}var X={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],r=t.split("-")[1];if(r){var i=e.offsets,o=i.reference,a=i.popper,s=-1!==["bottom","top"].indexOf(n),u=s?"left":"top",c=s?"width":"height",l={start:C({},u,o[u]),end:C({},u,o[u]+o[c]-a[c])};e.offsets.popper=E({},a,l[r])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,r=e.placement,i=e.offsets,o=i.popper,a=i.reference,s=r.split("-")[0],u=void 0;return u=B(+n)?[+n,0]:Y(n,o,a,s),"left"===s?(o.top+=u[0],o.left-=u[1]):"right"===s?(o.top+=u[0],o.left+=u[1]):"top"===s?(o.left+=u[0],o.top-=u[1]):"bottom"===s&&(o.left+=u[0],o.top+=u[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var n=t.boundariesElement||h(e.instance.popper);e.instance.reference===n&&(n=h(n));var r=M("transform"),i=e.instance.popper.style,o=i.top,a=i.left,s=i[r];i.top="",i.left="",i[r]="";var u=O(e.instance.popper,e.instance.reference,t.padding,n,e.positionFixed);i.top=o,i.left=a,i[r]=s,t.boundaries=u;var c=t.priority,l=e.offsets.popper,f={primary:function(e){var n=l[e];return l[e]u[e]&&!t.escapeWithReference&&(r=Math.min(l[n],u[e]-("right"===e?l.width:l.height))),C({},n,r)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";l=E({},l,f[t](e))}),e.offsets.popper=l,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,r=t.reference,i=e.placement.split("-")[0],o=Math.floor,a=-1!==["top","bottom"].indexOf(i),s=a?"right":"bottom",u=a?"left":"top",c=a?"width":"height";return n[s]o(r[s])&&(e.offsets.popper[u]=o(r[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!U(e.instance.modifiers,"arrow","keepTogether"))return e;var r=t.element;if("string"==typeof r){if(!(r=e.instance.popper.querySelector(r)))return e}else if(!e.instance.popper.contains(r))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var i=e.placement.split("-")[0],o=e.offsets,a=o.popper,s=o.reference,c=-1!==["left","right"].indexOf(i),l=c?"height":"width",f=c?"Top":"Left",p=f.toLowerCase(),d=c?"left":"top",h=c?"bottom":"right",v=N(r)[l];s[h]-va[h]&&(e.offsets.popper[p]+=s[p]+v-a[h]),e.offsets.popper=T(e.offsets.popper);var g=s[p]+s[l]/2-v/2,m=u(e.instance.popper),y=parseFloat(m["margin"+f],10),_=parseFloat(m["border"+f+"Width"],10),b=g-e.offsets.popper[p]-y-_;return b=Math.max(Math.min(a[l]-v,b),0),e.arrowElement=r,e.offsets.arrow=(C(n={},p,Math.round(b)),C(n,d,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(e,t){if(R(e.instance.modifiers,"inner"))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var n=O(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),r=e.placement.split("-")[0],i=j(r),o=e.placement.split("-")[1]||"",a=[];switch(t.behavior){case Q.FLIP:a=[r,i];break;case Q.CLOCKWISE:a=K(r);break;case Q.COUNTERCLOCKWISE:a=K(r,!0);break;default:a=t.behavior}return a.forEach(function(s,u){if(r!==s||a.length===u+1)return e;r=e.placement.split("-")[0],i=j(r);var c=e.offsets.popper,l=e.offsets.reference,f=Math.floor,p="left"===r&&f(c.right)>f(l.left)||"right"===r&&f(c.left)f(l.top)||"bottom"===r&&f(c.top)f(n.right),v=f(c.top)f(n.bottom),m="left"===r&&d||"right"===r&&h||"top"===r&&v||"bottom"===r&&g,y=-1!==["top","bottom"].indexOf(r),_=!!t.flipVariations&&(y&&"start"===o&&d||y&&"end"===o&&h||!y&&"start"===o&&v||!y&&"end"===o&&g);(p||m||_)&&(e.flipped=!0,(p||m)&&(r=a[u+1]),_&&(o=function(e){return"end"===e?"start":"start"===e?"end":e}(o)),e.placement=r+(o?"-"+o:""),e.offsets.popper=E({},e.offsets.popper,L(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,"flip"))}),e},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],r=e.offsets,i=r.popper,o=r.reference,a=-1!==["left","right"].indexOf(n),s=-1===["top","left"].indexOf(n);return i[a?"left":"top"]=o[n]-(s?i[a?"width":"height"]:0),e.placement=j(t),e.offsets.popper=T(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!U(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=$(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.right2&&void 0!==arguments[2]?arguments[2]:{};w(this,e),this.scheduleUpdate=function(){return requestAnimationFrame(r.update)},this.update=a(this.update.bind(this)),this.options=E({},e.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(E({},e.Defaults.modifiers,i.modifiers)).forEach(function(t){r.options.modifiers[t]=E({},e.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return E({name:e},r.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(e){e.enabled&&s(e.onLoad)&&e.onLoad(r.reference,r.popper,r.options,e,r.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}return x(e,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=I(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=D(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=L(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=P(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,R(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[M("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=F(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return q.call(this)}}]),e}();G.Utils=("undefined"!=typeof window?window:e).PopperUtils,G.placements=z,G.Defaults=X,t.default=G}.call(t,n(1))},function(e,t,n){var r;!function(t,n){"use strict";"object"==typeof e&&"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,function(n,i){"use strict";var o=[],a=n.document,s=Object.getPrototypeOf,u=o.slice,c=o.concat,l=o.push,f=o.indexOf,p={},d=p.toString,h=p.hasOwnProperty,v=h.toString,g=v.call(Object),m={},y=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},_=function(e){return null!=e&&e===e.window},b={type:!0,src:!0,noModule:!0};function w(e,t,n){var r,i=(t=t||a).createElement("script");if(i.text=e,n)for(r in b)n[r]&&(i[r]=n[r]);t.head.appendChild(i).parentNode.removeChild(i)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?p[d.call(e)]||"object":typeof e}var C=function(e,t){return new C.fn.init(e,t)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function T(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!y(e)&&!_(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}C.fn=C.prototype={jquery:"3.3.1",constructor:C,length:0,toArray:function(){return u.call(this)},get:function(e){return null==e?u.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=C.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return C.each(this,e)},map:function(e){return this.pushStack(C.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(u.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+P+")"+P+"*"),U=new RegExp("="+P+"*([^\\]'\"]*?)"+P+"*\\]","g"),z=new RegExp(H),V=new RegExp("^"+R+"$"),K={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+H),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+$+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,X=/^[^{]+\{\s*\[native \w/,G=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=ye(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{N.apply(O=j.call(w.childNodes),w.childNodes),O[w.childNodes.length].nodeType}catch(e){N={apply:O.length?function(e,t){I.apply(e,j.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function oe(e,t,r,i){var o,s,c,l,f,h,m,y=t&&t.ownerDocument,x=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,v)){if(11!==x&&(f=G.exec(e)))if(o=f[1]){if(9===x){if(!(c=t.getElementById(o)))return r;if(c.id===o)return r.push(c),r}else if(y&&(c=y.getElementById(o))&&_(t,c)&&c.id===o)return r.push(c),r}else{if(f[2])return N.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return N.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!A[e+" "]&&(!g||!g.test(e))){if(1!==x)y=t,m=e;else if("object"!==t.nodeName.toLowerCase()){for((l=t.getAttribute("id"))?l=l.replace(te,ne):t.setAttribute("id",l=b),s=(h=a(e)).length;s--;)h[s]="#"+l+" "+me(h[s]);m=h.join(","),y=J.test(e)&&ve(t.parentNode)||t}if(m)try{return N.apply(r,y.querySelectorAll(m)),r}catch(e){}finally{l===b&&t.removeAttribute("id")}}}return u(e.replace(q,"$1"),t,r,i)}function ae(){var e=[];return function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ce(e,t){for(var n=e.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=t}function le(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(h=(d=a).documentElement,v=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=X.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&v){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&v){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&v)return t.getElementsByClassName(e)},m=[],g=[],(n.qsa=X.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+$+")"),e.querySelectorAll("[id~="+b+"-]").length||g.push("~="),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||g.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+P+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(n.matchesSelector=X.test(y=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=y.call(e,"*"),y.call(e,"[s!='']:x"),m.push("!=",H)}),g=g.length&&new RegExp(g.join("|")),m=m.length&&new RegExp(m.join("|")),t=X.test(h.compareDocumentPosition),_=t||X.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},S=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&_(w,e)?-1:t===d||t.ownerDocument===w&&_(w,t)?1:l?L(l,e)-L(l,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:l?L(l,e)-L(l,t):0;if(i===o)return le(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?le(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(U,"='$1']"),n.matchesSelector&&v&&!A[t+" "]&&(!m||!m.test(t))&&(!g||!g.test(t)))try{var r=y.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),_(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&k.call(r.attrHandle,t.toLowerCase())?i(e,t,!v):void 0;return void 0!==o?o:n.attributes||!v?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),f){for(;t=e[o++];)t===e[o]&&(i=r.push(o));for(;i--;)e.splice(r[i],1)}return l=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:K,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return K.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&z.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(F," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,d,h,v=o!==a?"nextSibling":"previousSibling",g=t.parentNode,m=s&&t.nodeName.toLowerCase(),y=!u&&!s,_=!1;if(g){if(o){for(;v;){for(p=t;p=p[v];)if(s?p.nodeName.toLowerCase()===m:1===p.nodeType)return!1;h=v="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(_=(d=(c=(l=(f=(p=g)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===x&&c[1])&&c[2],p=d&&g.childNodes[d];p=++d&&p&&p[v]||(_=d=0)||h.pop();)if(1===p.nodeType&&++_&&p===t){l[e]=[x,d,_];break}}else if(y&&(_=d=(c=(l=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===x&&c[1]),!1===_)for(;(p=++d&&p&&p[v]||(_=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==m:1!==p.nodeType)||!++_||(y&&((l=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[x,_]),p!==t)););return(_-=i)===r||_%r==0&&_/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){for(var r,o=i(e,t),a=o.length;a--;)e[r=L(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(q,"$1"));return r[b]?se(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return V.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=v?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,c=null!=t;s-1&&(o[c]=!(a[c]=f))}}else m=be(m===a?m.splice(h,m.length):m),i?i(null,a,m,u):N.apply(a,m)})}function xe(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,l=ye(function(e){return e===t},s,!0),f=ye(function(e){return L(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==c)||((t=n).nodeType?l(e,n,r):f(e,n,r));return t=null,i}];u1&&_e(p),u>1&&me(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(q,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,l){var f,h,g,m=0,y="0",_=o&&[],b=[],w=c,C=o||i&&r.find.TAG("*",l),E=x+=null==w?1:Math.random()||.1,T=C.length;for(l&&(c=a===d||a||l);y!==T&&null!=(f=C[y]);y++){if(i&&f){for(h=0,a||f.ownerDocument===d||(p(f),s=!v);g=e[h++];)if(g(f,a||d,s)){u.push(f);break}l&&(x=E)}n&&((f=!g&&f)&&m--,o&&_.push(f))}if(m+=y,n&&y!==m){for(h=0;g=t[h++];)g(_,b,a,s);if(o){if(m>0)for(;y--;)_[y]||b[y]||(b[y]=D.call(u));b=be(b)}N.apply(u,b),l&&!o&&b.length>0&&m+t.length>1&&oe.uniqueSort(u)}return l&&(x=E,c=w),_};return n?se(o):o}(o,i))).selector=e}return s},u=oe.select=function(e,t,n,i){var o,u,c,l,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(c=u[0]).type&&9===t.nodeType&&v&&r.relative[u[1].type]){if(!(t=(r.find.ID(c.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}for(o=K.needsContext.test(e)?0:u.length;o--&&(c=u[o],!r.relative[l=c.type]);)if((f=r.find[l])&&(i=f(c.matches[0].replace(Z,ee),J.test(u[0].type)&&ve(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&me(u)))return N.apply(n,i),n;break}}return(p||s(e,d))(i,t,!v,n,!t||J.test(e)&&ve(t.parentNode)||t),n},n.sortStable=b.split("").sort(S).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ce("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ce("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||ce($,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(n);C.find=A,C.expr=A.selectors,C.expr[":"]=C.expr.pseudos,C.uniqueSort=C.unique=A.uniqueSort,C.text=A.getText,C.isXMLDoc=A.isXML,C.contains=A.contains,C.escapeSelector=A.escape;var S=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&C(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},O=C.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(e,t,n){return y(t)?C.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?C.grep(e,function(e){return e===t!==n}):"string"!=typeof t?C.grep(e,function(e){return f.call(t,e)>-1!==n}):C.filter(t,e,n)}C.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?C.find.matchesSelector(r,e)?[r]:[]:C.find.matches(e,C.grep(t,function(e){return 1===e.nodeType}))},C.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(C(e).filter(function(){for(t=0;t1?C.uniqueSort(n):n},filter:function(e){return this.pushStack(N(this,e||[],!1))},not:function(e){return this.pushStack(N(this,e||[],!0))},is:function(e){return!!N(this,"string"==typeof e&&O.test(e)?C(e):e||[],!1).length}});var j,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(C.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:a,!0)),I.test(r[1])&&C.isPlainObject(t))for(r in t)y(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=a.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this)}).prototype=C.fn,j=C(a);var $=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};function R(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&C.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?C.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?f.call(C(e),this[0]):f.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),C.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return S(e,"parentNode")},parentsUntil:function(e,t,n){return S(e,"parentNode",n)},next:function(e){return R(e,"nextSibling")},prev:function(e){return R(e,"previousSibling")},nextAll:function(e){return S(e,"nextSibling")},prevAll:function(e){return S(e,"previousSibling")},nextUntil:function(e,t,n){return S(e,"nextSibling",n)},prevUntil:function(e,t,n){return S(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),C.merge([],e.childNodes))}},function(e,t){C.fn[e]=function(n,r){var i=C.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=C.filter(r,i)),this.length>1&&(P[e]||C.uniqueSort(i),$.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function H(e){return e}function F(e){throw e}function q(e,t,n,r){var i;try{e&&y(i=e.promise)?i.call(e).done(t).fail(n):e&&y(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}C.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return C.each(e.match(M)||[],function(e,n){t[n]=!0}),t}(e):C.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1)for(n=a.shift();++s-1;)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?C.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},C.extend({Deferred:function(e){var t=[["notify","progress",C.Callbacks("memory"),C.Callbacks("memory"),2],["resolve","done",C.Callbacks("once memory"),C.Callbacks("once memory"),0,"resolved"],["reject","fail",C.Callbacks("once memory"),C.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return C.Deferred(function(n){C.each(t,function(t,r){var i=y(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&y(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(e,r,i){var o=0;function a(e,t,r,i){return function(){var s=this,u=arguments,c=function(){var n,c;if(!(e=o&&(r!==F&&(s=void 0,u=[n]),t.rejectWith(s,u))}};e?l():(C.Deferred.getStackHook&&(l.stackTrace=C.Deferred.getStackHook()),n.setTimeout(l))}}return C.Deferred(function(n){t[0][3].add(a(0,n,y(i)?i:H,n.notifyWith)),t[1][3].add(a(0,n,y(e)?e:H)),t[2][3].add(a(0,n,y(r)?r:F))}).promise()},promise:function(e){return null!=e?C.extend(e,i):i}},o={};return C.each(t,function(e,n){var a=n[2],s=n[5];i[n[1]]=a.add,s&&a.add(function(){r=s},t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),a.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=a.fireWith}),i.promise(o),e&&e.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=u.call(arguments),o=C.Deferred(),a=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?u.call(arguments):n,--t||o.resolveWith(r,i)}};if(t<=1&&(q(e,o.done(a(n)).resolve,o.reject,!t),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();for(;n--;)q(i[n],a(n),o.reject);return o.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;C.Deferred.exceptionHook=function(e,t){n.console&&n.console.warn&&e&&B.test(e.name)&&n.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},C.readyException=function(e){n.setTimeout(function(){throw e})};var W=C.Deferred();function U(){a.removeEventListener("DOMContentLoaded",U),n.removeEventListener("load",U),C.ready()}C.fn.ready=function(e){return W.then(e).catch(function(e){C.readyException(e)}),this},C.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--C.readyWait:C.isReady)||(C.isReady=!0,!0!==e&&--C.readyWait>0||W.resolveWith(a,[C]))}}),C.ready.then=W.then,"complete"===a.readyState||"loading"!==a.readyState&&!a.documentElement.doScroll?n.setTimeout(C.ready):(a.addEventListener("DOMContentLoaded",U),n.addEventListener("load",U));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,c=null==n;if("object"===x(n))for(s in i=!0,n)z(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,y(r)||(a=!0),c&&(a?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(C(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){Z.remove(this,e)})}}),C.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,C.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=C.queue(e,t),r=n.length,i=n.shift(),o=C._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){C.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:C.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),C.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ve={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ge(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?C.merge([e],n):n}function me(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(c=C.contains(o.ownerDocument,o),a=ge(f.appendChild(o),"script"),c&&me(a),n)for(l=0;o=a[l++];)he.test(o.type||"")&&n.push(o);return f}ye=a.createDocumentFragment().appendChild(a.createElement("div")),(_e=a.createElement("input")).setAttribute("type","radio"),_e.setAttribute("checked","checked"),_e.setAttribute("name","t"),ye.appendChild(_e),m.checkClone=ye.cloneNode(!0).cloneNode(!0).lastChild.checked,ye.innerHTML="",m.noCloneChecked=!!ye.cloneNode(!0).lastChild.defaultValue;var xe=a.documentElement,Ce=/^key/,Ee=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ae(){return!0}function Se(){return!1}function ke(){try{return a.activeElement}catch(e){}}function Oe(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Oe(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return C().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=C.guid++)),e.each(function(){C.event.add(this,t,i,r,n)})}C.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,c,l,f,p,d,h,v,g=J.get(e);if(g)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&C.find.matchesSelector(xe,i),n.guid||(n.guid=C.guid++),(u=g.events)||(u=g.events={}),(a=g.handle)||(a=g.handle=function(t){return void 0!==C&&C.event.triggered!==t.type?C.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(M)||[""]).length;c--;)d=v=(s=Te.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=C.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=C.event.special[d]||{},l=C.extend({type:d,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&C.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,l):p.push(l),C.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,c,l,f,p,d,h,v,g=J.hasData(e)&&J.get(e);if(g&&(u=g.events)){for(c=(t=(t||"").match(M)||[""]).length;c--;)if(d=v=(s=Te.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=C.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)l=p[o],!i&&v!==l.origType||n&&n.guid!==l.guid||s&&!s.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(o,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,g.handle)||C.removeEvent(e,d,g.handle),delete u[d])}else for(d in u)C.event.remove(e,d+t[c],n,r,!0);C.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=C.event.fix(e),u=new Array(arguments.length),c=(J.get(this,"events")||{})[s.type]||[],l=C.event.special[s.type]||{};for(u[0]=s,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||!0!==c.disabled)){for(o=[],a={},n=0;n-1:C.find(i,this,null,[c]).length),a[i]&&o.push(r);o.length&&s.push({elem:c,handlers:o})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ie=/\s*$/g;function Le(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")&&C(e).children("tbody")[0]||e}function $e(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Re(e,t){var n,r,i,o,a,s,u,c;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),c=o.events))for(i in delete a.handle,a.events={},c)for(n=0,r=c[i].length;n1&&"string"==typeof h&&!m.checkClone&&Ne.test(h))return e.each(function(i){var o=e.eq(i);v&&(t[0]=h.call(this,i,o.html())),Me(o,t,n,r)});if(p&&(o=(i=we(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=C.map(ge(i,"script"),$e)).length;f")},clone:function(e,t,n){var r,i,o,a,s,u,c,l=e.cloneNode(!0),f=C.contains(e.ownerDocument,e);if(!(m.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(a=ge(l),r=0,i=(o=ge(e)).length;r0&&me(a,!f&&ge(e,"script")),l},cleanData:function(e){for(var t,n,r,i=C.event.special,o=0;void 0!==(n=e[o]);o++)if(X(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?C.event.remove(n,r):C.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[Z.expando]&&(n[Z.expando]=void 0)}}}),C.fn.extend({detach:function(e){return He(this,e,!0)},remove:function(e){return He(this,e)},text:function(e){return z(this,function(e){return void 0===e?C.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Me(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Me(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Me(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Me(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(C.cleanData(ge(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ie.test(e)&&!ve[(de.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=qe(e),i=We(e,t,r),o="border-box"===C.css(e,"boxSizing",!1,r),a=o;if(Fe.test(i)){if(!n)return i;i="auto"}return a=a&&(m.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===C.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}C.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=Y(t),u=Ve.test(t),c=e.style;if(u||(t=Ge(s)),a=C.cssHooks[t]||C.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:c[t];"string"===(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(C.cssNumber[s]?"":"px")),m.clearCloneStyle||""!==n||0!==t.indexOf("background")||(c[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?c.setProperty(t,n):c[t]=n))}},css:function(e,t,n,r){var i,o,a,s=Y(t);return Ve.test(t)||(t=Ge(s)),(a=C.cssHooks[t]||C.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),C.each(["height","width"],function(e,t){C.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(C.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ke,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=qe(e),a="border-box"===C.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&m.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=C.css(e,t)),Je(0,n,s)}}}),C.cssHooks.marginLeft=Ue(m.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),C.each({margin:"",padding:"",border:"Width"},function(e,t){C.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(C.cssHooks[e+t].set=Je)}),C.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=qe(e),i=t.length;a1)}}),C.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||C.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(C.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=C.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=C.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){C.fx.step[e.prop]?C.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[C.cssProps[e.prop]]&&!C.cssHooks[e.prop]?e.elem[e.prop]=e.now:C.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},C.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},C.fx=tt.prototype.init,C.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===a.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(at):n.setTimeout(at,C.fx.interval),C.fx.tick())}function st(){return n.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){C.removeAttr(this,e)})}}),C.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?C.prop(e,t,n):(1===o&&C.isXMLDoc(e)||(i=C.attrHooks[t.toLowerCase()]||(C.expr.match.bool.test(t)?ft:void 0)),void 0!==n?null===n?void C.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=C.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!m.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),ft={set:function(e,t,n){return!1===t?C.removeAttr(e,n):e.setAttribute(n,n),n}},C.each(C.expr.match.bool.source.match(/\w+/g),function(e,t){var n=pt[t]||C.find.attr;pt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=pt[a],pt[a]=i,i=null!=n(e,t,r)?a:null,pt[a]=o),i}});var dt=/^(?:input|select|textarea|button)$/i,ht=/^(?:a|area)$/i;function vt(e){return(e.match(M)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(M)||[]}C.fn.extend({prop:function(e,t){return z(this,C.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[C.propFix[e]||e]})}}),C.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&C.isXMLDoc(e)||(t=C.propFix[t]||t,i=C.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=C.find.attr(e,"tabindex");return t?parseInt(t,10):dt.test(e.nodeName)||ht.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(C.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),C.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){C.propFix[this.toLowerCase()]=this}),C.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(y(e))return this.each(function(t){C(this).addClass(e.call(this,t,gt(this)))});if((t=mt(e)).length)for(;n=this[u++];)if(i=gt(n),r=1===n.nodeType&&" "+vt(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(y(e))return this.each(function(t){C(this).removeClass(e.call(this,t,gt(this)))});if(!arguments.length)return this.attr("class","");if((t=mt(e)).length)for(;n=this[u++];)if(i=gt(n),r=1===n.nodeType&&" "+vt(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):y(e)?this.each(function(n){C(this).toggleClass(e.call(this,n,gt(this),t),t)}):this.each(function(){var t,i,o,a;if(r)for(i=0,o=C(this),a=mt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=gt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+vt(gt(n))+" ").indexOf(t)>-1)return!0;return!1}});var yt=/\r/g;C.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=y(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,C(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=C.map(i,function(e){return null==e?"":e+""})),(t=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(yt,""):null==n?"":n:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:vt(C.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),C.each(["radio","checkbox"],function(){C.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=C.inArray(C(e).val(),t)>-1}},m.checkOn||(C.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),m.focusin="onfocusin"in n;var _t=/^(?:focusinfocus|focusoutblur)$/,bt=function(e){e.stopPropagation()};C.extend(C.event,{trigger:function(e,t,r,i){var o,s,u,c,l,f,p,d,v=[r||a],g=h.call(e,"type")?e.type:e,m=h.call(e,"namespace")?e.namespace.split("."):[];if(s=d=u=r=r||a,3!==r.nodeType&&8!==r.nodeType&&!_t.test(g+C.event.triggered)&&(g.indexOf(".")>-1&&(g=(m=g.split(".")).shift(),m.sort()),l=g.indexOf(":")<0&&"on"+g,(e=e[C.expando]?e:new C.Event(g,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=m.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:C.makeArray(t,[e]),p=C.event.special[g]||{},i||!p.trigger||!1!==p.trigger.apply(r,t))){if(!i&&!p.noBubble&&!_(r)){for(c=p.delegateType||g,_t.test(c+g)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(r.ownerDocument||a)&&v.push(u.defaultView||u.parentWindow||n)}for(o=0;(s=v[o++])&&!e.isPropagationStopped();)d=s,e.type=o>1?c:p.bindType||g,(f=(J.get(s,"events")||{})[e.type]&&J.get(s,"handle"))&&f.apply(s,t),(f=l&&s[l])&&f.apply&&X(s)&&(e.result=f.apply(s,t),!1===e.result&&e.preventDefault());return e.type=g,i||e.isDefaultPrevented()||p._default&&!1!==p._default.apply(v.pop(),t)||!X(r)||l&&y(r[g])&&!_(r)&&((u=r[l])&&(r[l]=null),C.event.triggered=g,e.isPropagationStopped()&&d.addEventListener(g,bt),r[g](),e.isPropagationStopped()&&d.removeEventListener(g,bt),C.event.triggered=void 0,u&&(r[l]=u)),e.result}},simulate:function(e,t,n){var r=C.extend(new C.Event,n,{type:e,isSimulated:!0});C.event.trigger(r,null,t)}}),C.fn.extend({trigger:function(e,t){return this.each(function(){C.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return C.event.trigger(e,t,n,!0)}}),m.focusin||C.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){C.event.simulate(t,e.target,C.event.fix(e))};C.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var wt=n.location,xt=Date.now(),Ct=/\?/;C.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||C.error("Invalid XML: "+e),t};var Et=/\[\]$/,Tt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,St=/^(?:input|select|textarea|keygen)/i;function kt(e,t,n,r){var i;if(Array.isArray(t))C.each(t,function(t,i){n||Et.test(e)?r(e,i):kt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)kt(e+"["+i+"]",t[i],n,r)}C.param=function(e,t){var n,r=[],i=function(e,t){var n=y(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!C.isPlainObject(e))C.each(e,function(){i(this.name,this.value)});else for(n in e)kt(n,e[n],t,i);return r.join("&")},C.fn.extend({serialize:function(){return C.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=C.prop(this,"elements");return e?C.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!C(this).is(":disabled")&&St.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=C(this).val();return null==n?null:Array.isArray(n)?C.map(n,function(e){return{name:t.name,value:e.replace(Tt,"\r\n")}}):{name:t.name,value:n.replace(Tt,"\r\n")}}).get()}});var Ot=/%20/g,Dt=/#.*$/,It=/([?&])_=[^&]*/,Nt=/^(.*?):[ \t]*([^\r\n]*)$/gm,jt=/^(?:GET|HEAD)$/,Lt=/^\/\//,$t={},Pt={},Rt="*/".concat("*"),Mt=a.createElement("a");function Ht(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(y(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Ft(e,t,n,r){var i={},o=e===Pt;function a(s){var u;return i[s]=!0,C.each(e[s]||[],function(e,s){var c=s(t,n,r);return"string"!=typeof c||o||i[c]?o?!(u=c):void 0:(t.dataTypes.unshift(c),a(c),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function qt(e,t){var n,r,i=C.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&C.extend(!0,e,r),e}Mt.href=wt.href,C.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:wt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(wt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":C.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?qt(qt(e,C.ajaxSettings),t):qt(C.ajaxSettings,e)},ajaxPrefilter:Ht($t),ajaxTransport:Ht(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,s,u,c,l,f,p,d,h=C.ajaxSetup({},t),v=h.context||h,g=h.context&&(v.nodeType||v.jquery)?C(v):C.event,m=C.Deferred(),y=C.Callbacks("once memory"),_=h.statusCode||{},b={},w={},x="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(l){if(!s)for(s={};t=Nt.exec(o);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)E.always(e[E.status]);else for(t in e)_[t]=[_[t],e[t]];return this},abort:function(e){var t=e||x;return r&&r.abort(t),T(0,t),this}};if(m.promise(E),h.url=((e||h.url||wt.href)+"").replace(Lt,wt.protocol+"//"),h.type=t.method||t.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){c=a.createElement("a");try{c.href=h.url,c.href=c.href,h.crossDomain=Mt.protocol+"//"+Mt.host!=c.protocol+"//"+c.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=C.param(h.data,h.traditional)),Ft($t,h,t,E),l)return E;for(p in(f=C.event&&h.global)&&0==C.active++&&C.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!jt.test(h.type),i=h.url.replace(Dt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ot,"+")):(d=h.url.slice(i.length),h.data&&(h.processData||"string"==typeof h.data)&&(i+=(Ct.test(i)?"&":"?")+h.data,delete h.data),!1===h.cache&&(i=i.replace(It,"$1"),d=(Ct.test(i)?"&":"?")+"_="+xt+++d),h.url=i+d),h.ifModified&&(C.lastModified[i]&&E.setRequestHeader("If-Modified-Since",C.lastModified[i]),C.etag[i]&&E.setRequestHeader("If-None-Match",C.etag[i])),(h.data&&h.hasContent&&!1!==h.contentType||t.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Rt+"; q=0.01":""):h.accepts["*"]),h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(v,E,h)||l))return E.abort();if(x="abort",y.add(h.complete),E.done(h.success),E.fail(h.error),r=Ft(Pt,h,t,E)){if(E.readyState=1,f&&g.trigger("ajaxSend",[E,h]),l)return E;h.async&&h.timeout>0&&(u=n.setTimeout(function(){E.abort("timeout")},h.timeout));try{l=!1,r.send(b,T)}catch(e){if(l)throw e;T(-1,e)}}else T(-1,"No Transport");function T(e,t,a,s){var c,p,d,b,w,x=t;l||(l=!0,u&&n.clearTimeout(u),r=void 0,o=s||"",E.readyState=e>0?4:0,c=e>=200&&e<300||304===e,a&&(b=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(h,E,a)),b=function(e,t,n,r){var i,o,a,s,u,c={},l=e.dataTypes.slice();if(l[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=l.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=l.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=c[u+" "+o]||c["* "+o]))for(i in c)if((s=i.split(" "))[1]===o&&(a=c[u+" "+s[0]]||c["* "+s[0]])){!0===a?a=c[i]:!0!==c[i]&&(o=s[0],l.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(h,b,E,c),c?(h.ifModified&&((w=E.getResponseHeader("Last-Modified"))&&(C.lastModified[i]=w),(w=E.getResponseHeader("etag"))&&(C.etag[i]=w)),204===e||"HEAD"===h.type?x="nocontent":304===e?x="notmodified":(x=b.state,p=b.data,c=!(d=b.error))):(d=x,!e&&x||(x="error",e<0&&(e=0))),E.status=e,E.statusText=(t||x)+"",c?m.resolveWith(v,[p,x,E]):m.rejectWith(v,[E,x,d]),E.statusCode(_),_=void 0,f&&g.trigger(c?"ajaxSuccess":"ajaxError",[E,h,c?p:d]),y.fireWith(v,[E,x]),f&&(g.trigger("ajaxComplete",[E,h]),--C.active||C.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return C.get(e,t,n,"json")},getScript:function(e,t){return C.get(e,void 0,t,"script")}}),C.each(["get","post"],function(e,t){C[t]=function(e,n,r,i){return y(n)&&(i=i||r,r=n,n=void 0),C.ajax(C.extend({url:e,type:t,dataType:i,data:n,success:r},C.isPlainObject(e)&&e))}}),C._evalUrl=function(e){return C.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},C.fn.extend({wrapAll:function(e){var t;return this[0]&&(y(e)&&(e=e.call(this[0])),t=C(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return y(e)?this.each(function(t){C(this).wrapInner(e.call(this,t))}):this.each(function(){var t=C(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=y(e);return this.each(function(n){C(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){C(this).replaceWith(this.childNodes)}),this}}),C.expr.pseudos.hidden=function(e){return!C.expr.pseudos.visible(e)},C.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},C.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},Wt=C.ajaxSettings.xhr();m.cors=!!Wt&&"withCredentials"in Wt,m.ajax=Wt=!!Wt,C.ajaxTransport(function(e){var t,r;if(m.cors||Wt&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Bt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),r=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout(function(){t&&r()})},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),C.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),C.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return C.globalEval(e),e}}}),C.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),C.ajaxTransport("script",function(e){var t,n;if(e.crossDomain)return{send:function(r,i){t=C(" diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php new file mode 100644 index 0000000..e5506df --- /dev/null +++ b/resources/lang/en/auth.php @@ -0,0 +1,19 @@ + 'These credentials do not match our records.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php new file mode 100644 index 0000000..2b9b38e --- /dev/null +++ b/resources/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php new file mode 100644 index 0000000..e5544d2 --- /dev/null +++ b/resources/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Passwords must be at least six characters and match the confirmation.', + 'reset' => 'Your password has been reset!', + 'sent' => 'We have e-mailed your password reset link!', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that e-mail address.", + +]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php new file mode 100644 index 0000000..b163c42 --- /dev/null +++ b/resources/lang/en/validation.php @@ -0,0 +1,146 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss new file mode 100644 index 0000000..6799fc4 --- /dev/null +++ b/resources/sass/_variables.scss @@ -0,0 +1,20 @@ + +// Body +$body-bg: #f8fafc; + +// Typography +$font-family-sans-serif: "Nunito", sans-serif; +$font-size-base: 0.9rem; +$line-height-base: 1.6; + +// Colors +$blue: #3490dc; +$indigo: #6574cd; +$purple: #9561e2; +$pink: #f66D9b; +$red: #e3342f; +$orange: #f6993f; +$yellow: #ffed4a; +$green: #38c172; +$teal: #4dc0b5; +$cyan: #6cb2eb; diff --git a/resources/sass/app.scss b/resources/sass/app.scss new file mode 100644 index 0000000..f42e798 --- /dev/null +++ b/resources/sass/app.scss @@ -0,0 +1,14 @@ + +// Fonts +@import url('https://fonts.googleapis.com/css?family=Nunito'); + +// Variables +@import 'variables'; + +// Bootstrap +@import '~bootstrap/scss/bootstrap'; + +.navbar-laravel { + background-color: #fff; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04); +} diff --git a/resources/views/.DS_Store b/resources/views/.DS_Store new file mode 100644 index 0000000..8ea61fa Binary files /dev/null and b/resources/views/.DS_Store differ diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..9edb920 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,73 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Login') }}
+ +
+
+ @csrf + +
+ + +
+ + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
+
+ +
+ + +
+ + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
+
+ +
+
+
+ + + +
+
+
+ +
+
+ + + @if (Route::has('password.request')) + + {{ __('Forgot Your Password?') }} + + @endif +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php new file mode 100644 index 0000000..ccbee59 --- /dev/null +++ b/resources/views/auth/passwords/email.blade.php @@ -0,0 +1,47 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Reset Password') }}
+ +
+ @if (session('status')) + + @endif + +
+ @csrf + +
+ + +
+ + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php new file mode 100644 index 0000000..bf27f4c --- /dev/null +++ b/resources/views/auth/passwords/reset.blade.php @@ -0,0 +1,65 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Reset Password') }}
+ +
+
+ @csrf + + + +
+ + +
+ + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
+
+ +
+ + +
+ + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 0000000..ad95f2c --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,77 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Register') }}
+ +
+
+ @csrf + +
+ + +
+ + + @if ($errors->has('name')) + + {{ $errors->first('name') }} + + @endif +
+
+ +
+ + +
+ + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
+
+ +
+ + +
+ + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/verify.blade.php b/resources/views/auth/verify.blade.php new file mode 100644 index 0000000..c742cb4 --- /dev/null +++ b/resources/views/auth/verify.blade.php @@ -0,0 +1,24 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Verify Your Email Address') }}
+ +
+ @if (session('resent')) + + @endif + + {{ __('Before proceeding, please check your email for a verification link.') }} + {{ __('If you did not receive the email') }}, {{ __('click here to request another') }}. +
+
+
+
+
+@endsection diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php new file mode 100644 index 0000000..05dfca9 --- /dev/null +++ b/resources/views/home.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
Dashboard
+ +
+ @if (session('status')) + + @endif + + You are logged in! +
+
+
+
+
+@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..ee7767c --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,80 @@ + + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + + + + + + +
+ + +
+ @yield('content') +
+
+ + diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php new file mode 100644 index 0000000..66ab70f --- /dev/null +++ b/resources/views/welcome.blade.php @@ -0,0 +1,95 @@ + + + + + + + Laravel + + + + + + + + +
+ @if (Route::has('login')) + + @endif + +
+
+ Laravel +
+ + +
+
+ + diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..603b589 --- /dev/null +++ b/routes/api.php @@ -0,0 +1,255 @@ + 'auth:api'], function() { + // routes that needs authentication + + //system preference update + Route::post('cms/systemPreference', 'API\SystemPreferenceController@store'); + + Route::get('cms/logout','API\UserController@logout_cms'); + + // admin + Route::resource('cms/admin', 'API\AdminController'); + Route::post('cms/generatePassword', 'API\AdminController@generate_password'); + Route::post('cms/adminChangeStatus', 'API\AdminController@changeStatus'); + Route::delete('cms/adminBatchDelete', 'API\AdminController@batch_delete'); + Route::post('cms/adminProfile', 'API\AdminController@myProfile'); + + // members + Route::resource('cms/member', 'API\MemberController'); + Route::delete('cms/memberBatchDelete','API\MemberController@batch_delete'); + Route::post('cms/memberActivate/{uuid}','API\MemberController@activate_locked'); + + // Top Up + Route::resource('cms/topUp', 'API\TopUpController'); + Route::delete('cms/topUpBatchDelete', 'API\TopUpController@batch_delete'); + Route::get('cms/generateFeeCode', 'API\TopUpController@generate_fee_code'); + + // Card Types + Route::resource('cms/cardType','API\CardTypeController'); + Route::post('cms/cardTypeUpdate/{uuid}','API\CardTypeController@update'); + Route::delete('cms/cardTypeBatchDelete', 'API\CardTypeController@batch_delete'); + + // Promotions + Route::resource('cms/promotion','API\PromotionController'); + Route::get('cms/promoTypes','API\PromotionController@promo_types'); + Route::post('cms/updatePromotion/{uuid}','API\PromotionController@update'); + Route::delete('cms/promotionBatchDelete', 'API\PromotionController@batch_delete'); + Route::get('cms/getPromotions','API\PromotionController@get_promotions'); + Route::get('cms/promotionDisableTopTwo','API\PromotionController@disable_toptwo'); + + // Stations + Route::get('cms/getStations','API\StationController@get_viewable'); + + // Reports + Route::get('cms/reportTopUp','API\ReportsController@top_up'); + Route::get('cms/reportTopUpExport','API\ReportsController@export_top_up'); + + Route::get('cms/reportStationRatings','API\ReportsController@station_rating'); + Route::get('cms/reportStationRatingsExport','API\ReportsController@export_station_rating'); + + Route::get('cms/reportMobileUsage','API\ReportsController@mobile_usage'); + Route::get('cms/reportMobileUsageExport','API\ReportsController@export_mobile_usage'); + + Route::get('cms/reportRegistration','API\ReportsController@registration'); + Route::get('cms/reportRegistrationExport','API\ReportsController@export_registration'); + + // Terms And Privacy + Route::resource('cms/TermsAndPrivacy', 'API\TermsAndPrivacyController'); + Route::delete('cms/TermsAndPrivacyBatchDelete', 'API\TermsAndPrivacyController@batch_delete'); + + // Photo Slider + Route::resource('cms/photoSlider','API\PhotoSliderController'); + Route::post('cms/updatePhotoSlider/{uuid}','API\PhotoSliderController@update'); + Route::delete('cms/photoSliderBatchDelete', 'API\PhotoSliderController@batch_delete'); + Route::get('cms/photoSliderCount','API\PhotoSliderController@check_count'); + + // Stratuscast Update + Route::get('cms/stratuscastCityProvince','API\CityAndProvinceController@sync'); + Route::get('cms/stratuscastStation','API\StationController@manual_overide'); + Route::get('cms/stratuscastProducts','API\ProductDetailsController@sync'); + Route::get('cms/stratuscastAboutUs','API\SystemPreferenceController@about_us'); + + // //RNRPH Update Stations + Route::get('mobile/syncstations','API\StationController@manual_update'); + Route::get('mobile/synccities','API\CityAndProvinceController@syncCityProvince'); + + + // Notifications with Auth + Route::post('cms/notification', 'API\InAppNotificationController@store'); +// Route::put('cms/notification/{id}', 'API\InAppNotificationController@update'); + Route::delete('cms/notification/{id}', 'API\InAppNotificationController@destroy'); + + +}); + +/* +|-------------------------------------------------------------------------- +| Mobile API Routes +|-------------------------------------------------------------------------- +| +| +| +| +| +*/ + +// Enroll and Register +Route::get('mobile/topUp/get_count','API\TopUpController@get_count'); +Route::post('mobile/loginCardNumber','API\UserController@mobile_loginCardNumber'); +Route::post('mobile/loginMobileNumber','API\UserController@mobile_loginMobileNumber'); +Route::post('mobile/loginCardNumberEnroll','API\UserController@mobile_loginCardNumber_enroll'); +Route::post('mobile/loginBirthdate','API\UserController@mobile_loginBirthdate'); +Route::get('mobile/requestOtp','API\UserController@create_otp'); + +// Apply Card OTP +Route::get('mobile/mobileOtp','API\UserController@mobile_otp'); +Route::get('mobile/validateOtp','API\UserController@mobile_validate_otp'); + +Route::post('mobile/sendOTP','API\UserController@validate_otp'); +Route::post('mobile/validatePin','API\UserController@mobile_validatePin'); +Route::post('mobile/activateCard','API\UserController@mobile_activateCard'); + +// Sign Up +Route::post('mobile/signUpIDNumber','API\SignUpController@check_id_number'); +Route::post('mobile/signUp','API\SignUpController@store'); + +//otp checker +Route::get('extra/getotp/{mobile}','API\UserController@checkmobileotp'); + +// NOTE these routes are from inial plan of CR1 +// Route::post('mobile/signUp','API\SignUpController@store'); +// Route::post('mobile/signUpDocuments','API\SignUpController@upload'); +// Route::get('mobile/signUpSubmit/{uuid}','API\SignUpController@signupSubmit'); +// Route::get('mobile/signUpReview/{uuid}','API\SignUpController@review'); +// Route::get('mobile/idNumberType/{code}','API\IDNumberTypeController@mobile_show'); + +// Terms and Privacy +Route::get('mobile/termsAndPrivacy','API\TermsAndPrivacyController@mobile_terms_privacy'); + +// Promotions +Route::get('mobile/promotions','API\PromotionController@mobile_promotions'); +Route::post('mobile/promotionsGPS','API\PromotionController@mobile_promotions_gps'); +Route::get('mobile/promotions/{uuid}','API\PromotionController@mobile_promotions_details'); + +Route::get('mobile/getpromo','API\PromotionController@getTopTwoPromotion'); +Route::get('mobile/whatshot','API\PhotoSliderController@get_photo_slider'); +Route::get('mobile/contactus','API\SystemPreferenceController@mobile_system_preference'); +Route::get('mobile/getcardtype','API\CardTypeController@getAllCardType'); +Route::get('mobile/cityDropdown','API\CityAndProvinceController@get_all'); // stratus +Route::get('mobile/cityList','API\CityAndProvinceController@get_city_list'); //rnrph + +//mpin +Route::get('mobile/getMpin','API\UserController@mobile_getPin'); +Route::post('mobile/mpinUpdate','API\UserController@mobile_updateMpin'); + +//Route::post('mobile/securityQuestion','API\MemberController@validateMember'); +Route::group(['middleware' => 'auth:api'], function() { + + // User Profile + Route::get('mobile/userProfile','API\MemberController@myProfile'); + + //validate member + Route::post('mobile/securityQuestion','API\MemberController@validateMember'); + + // Edit Profile + Route::post('mobile/editProfile','API\MemberController@update'); + Route::post('mobile/editProfileOTP','API\MemberController@confirm_otp'); + Route::get('mobile/vehicleOwnDropdown','API\CodeVehicleOwnController@get_all'); + Route::get('mobile/fuelTypeDropdown','API\CodeFuelTypeController@get_all'); + Route::get('mobile/civilStatusDropdown','API\CodeCivilStatusController@get_all'); + Route::get('mobile/genderDropdown','API\CodeGenderController@get_all'); + Route::resource('mobile/fueltracker','API\FuelTrackerController'); + + //mpin + //Route::get('mobile/getMpin','API\UserController@mobile_getPin'); + //Route::post('mobile/mpinUpdate','API\UserController@mobile_updateMpin'); + + // Station Locator + Route::post('mobile/stationNearby','API\StationController@nearby'); +// Route::get('mobile/stationFavorites','API\StationController@favorites'); + Route::get('mobile/stationViaCity/{uuid}','API\StationController@by_city'); + Route::get('mobile/stationDetails/{uuid}','API\StationController@fuel_prices'); // stratus + Route::get('mobile/stationfuels/{uuid}','API\StationController@get_station_fuel_details'); // rnr + Route::get('mobile/stationFavorites','API\StationController@favorites'); + Route::get('mobile/stationSetFavorite/{uuid}','API\StationController@set_favorite'); + Route::delete('mobile/stationDeleteFavorite/{uuid}','API\StationController@delete_favorite'); + + // Transactions + Route::get('mobile/transactions','API\PaymentController@transactions'); + Route::get('mobile/singleTransaction','API\PaymentController@single_transaction'); + Route::post('mobile/rateTransaction','API\PaymentController@rate_transaction'); + Route::get('mobile/transactionStatus/{id}','API\PaymentController@get_status'); + Route::post('mobile/paymaya_execute','API\PaymentController@paymaya_execute'); + + + //shared treats + Route::get('mobile/sharedtreats','API\SharedTreatsController@index'); + + // Paypal + Route::post('mobile/paypalURL','API\PaymentController@get_paypal_url'); + + // Fuel List - Fuel Efficiency + Route::get('mobile/fuelList','API\ProductDetailsController@get_fuels_from_products'); + Route::get('mobile/fuels','API\ProductDetailsController@getFuelList'); + + //logout + Route::post('mobile/logout','API\UserController@logout_mobile'); + + // Count User Payment Transactions + Route::get('mobile/count_total_transactions','API\PaymentController@count_total_transactions'); + + + //Paymaya Tokenization + Route::get('mobile/paymayatokens','API\PaymayaTokensController@index'); + Route::post('mobile/paymayatokens','API\PaymayaTokensController@store'); + Route::get('mobile/paymayatokens/{card_number}','API\PaymayaTokensController@show'); + Route::delete('mobile/paymayatokens/{paymaya_token_uuid}', 'API\PaymayaTokensController@destroy'); + +}); + +Route::get('mobile/systemPreference/{id}', 'API\SystemPreferenceController@show_mobile'); +Route::resource('mobile/products','API\ProductDetailsController'); +Route::post('mobile/stationSearch','API\StationController@search'); +Route::get('mobile/productsSync','API\ProductDetailsController@sync'); +Route::get('mobile/checkOTP/{card_number}','API\UserController@checkOTP'); +Route::get('mobile/checkMobile/{mobile}','API\UserController@checkMobile'); + +//New Station endpoints +Route::get('mobile/provinces','API\StationController@get_provinces'); +Route::get('mobile/stations','API\StationController@get_stations'); +Route::get('mobile/cities','API\StationController@get_cities'); +Route::get('mobile/stationfuels','API\StationController@get_station_fuels'); + +//mobile version +Route::get('mobile/getVersion/{platform}','API\SystemPreferenceController@mobile_version'); diff --git a/routes/channels.php b/routes/channels.php new file mode 100644 index 0000000..f16a20b --- /dev/null +++ b/routes/channels.php @@ -0,0 +1,16 @@ +id === (int) $id; +}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 0000000..75dd0cd --- /dev/null +++ b/routes/console.php @@ -0,0 +1,18 @@ +comment(Inspiring::quote()); +})->describe('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..4665e59 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,21 @@ +name('home'); diff --git a/server.php b/server.php new file mode 100644 index 0000000..5fb6379 --- /dev/null +++ b/server.php @@ -0,0 +1,21 @@ + + */ + +$uri = urldecode( + parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) +); + +// This file allows us to emulate Apache's "mod_rewrite" functionality from the +// built-in PHP web server. This provides a convenient way to test a Laravel +// application without having installed a "real" web server software here. +if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { + return false; +} + +require_once __DIR__.'/public/index.php'; diff --git a/storage/.DS_Store b/storage/.DS_Store new file mode 100644 index 0000000..d474e6e Binary files /dev/null and b/storage/.DS_Store differ diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 0000000..8f4803c --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/.DS_Store b/storage/framework/.DS_Store new file mode 100644 index 0000000..ffdab46 Binary files /dev/null and b/storage/framework/.DS_Store differ diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 0000000..b02b700 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,8 @@ +config.php +routes.php +schedule-* +compiled.php +services.json +events.scanned.php +routes.scanned.php +down diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/oauth-private.key b/storage/oauth-private.key new file mode 100644 index 0000000..23fbd74 --- /dev/null +++ b/storage/oauth-private.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIJKAIBAAKCAgEAzLI0c0PEyprKQ7Ukzk52zazpvFk8njjCztsg1EE0Ak2YpAPe +rSFaAh5HJacqd3CsTO4xdnPslMEOkGzCwpBHV6F18cNnCH247eU5HbURIFyC7EKB +OEBegXaaqSsJrP2K7XWCoTqKlmTEsWkBVe/QTEN74mBvQh7i+vO+18y8pNEK3cE9 +1jHukGV02aeBRP8D945z47p3E7i85O1U8QKT/sX1a26lsnUaptt3pG1cd8gkGbPg +ADOE57jjRVBFliT8oBAL2tcYnVHbaHp+GYqMLpdHFoXy5IpmNZ4aI4Pib6bCUKb8 +NqzTffrTKHK/DKJVKzQ1PPp2kuugrHxBeytNTjPpCmkMmhEno6olBXU6+MCRGjNe +y0ABOHkLbyXJ6b6OYCZk7HpUMZ4uJ4/FiDeLuRG0NH7ccek9LD4zBy63R2UGpUb8 +MAmgL+SMWwEWs+zAYxk0gQDSUZpcAeHU+3uva/Qe/zUiyKbkX4iqC0oGqJLC+nnR +plUnGKB5agEDjgbxeRbUdaEXXtF5e56nNhQqBGS7aBJ/f0+yNQtQuZMX5f8+C0nZ +b9RVHD1XLsaLMKRVIZA/I9TeH+in9yNtfXKxxxlleRhpER7MuW5Ods5ZtHsEDSf0 +TjXZu8GdHYF6MobfZObnw2+xTrVTkXo7NY3AgweWPM7b0k/ZgiVRTpGeWL0CAwEA +AQKCAgEAnXVTrXrq7WMmxfCY8G4hK1OgtPb8D0XgbNjZJw1FIaRpD3m+l/U41LpP +xmIR47DziXYM7G5+BWuAdY6EPsBXcMxN+vxxzHFRiQYz6ms3Ump3d6As4IV7bSE8 +FXd6yOx8Ku+i3b03kDrRpxr8IQwJcjDTIi9GRlmWBq7rFfty/WGkdzLIC3V7au3w +deFJKjb06UBWW047fRs1ivAZ0A9IosnKYKrLoTw9lS7rmLtbTvTQ+EiKvfzjdpCd +mtsFvFqVTdcqF1wwnguyuGrJh4IxFUHfOC8vyafAuev1dW5lB7gCb6IUD0bgpV8F +gW7LEb/pvgM6FL8h6SCCB0zJ3iJQIsBmU178D5AgwUmYGIY4+XXsrU8z6NI3PZH/ +NqlaWuwGSIVAgbX5X05SeDLJ630DTKOj7t3C/cJmu1NTH72Xwen1qlPzeEjgIUm0 +LjZfPl/IZm3yN7ogt5POXqISu5frn2FdvL3/PXHyJN8n98wl0xcDsvifo8dRi9VG +T4d0dOIga7y6QfGzBVZ6pjQiYqiA+lrp27vSK/M/feH2tvGEZtKfPs5orp9V1+RC +vkH1VOXPwnVfX+Uj/dmedhzzEQorDuTQCVqz0Xht0gssgXcqrba7pFrR3rdoujvt +/FUKPplAIXQnPxZAA9IMmJ7QOSVB0CcHXB04w38iEMu6/tACUW0CggEBAPBwXI6h +bj8iaJTICi17NQIGKCWjYX6Utkgv54f8kYyWUnCP1rsHYuIzJjUI1B+IJw0i0qu5 +uBL6zWwEBgTMhC+e0t1lEdEswH7SPZmUuflwOdoEXTZmcz03ZzxySFxBUfN7qjBE +SVyr5zws6WwbRvxh3QUuL7IYR7kxBx81AhLB1LeAoTHTExq3A7egkkoyT4ieUiYV +FqTcoJkXggRHy2nONcS0048zzzL/AYO9G4dqwf0DSHxVXZzWoDVQxDA4Rvir7hoI +5AKjHtwPIwgKBkTy1BpDaRcAn9r95fPipo3fxebM1+4lGqi9w4ok+PzAU5KAD0oY +sRcEKe1adRLr/VsCggEBANnxplNxFZZ0BtqXyjg1K75O96kRlR8bzI18yP5V+8Hm +exBAiB4sRBWqSClaOS4IkacMKrwGsUIUQL0EGDrN2w0wgqIRyEhncKCJ5i7IlTtu +zRApdr0uPN0hbElF2Q6/YSAz3kUhy2DpUwOhMmaCytieW0JNPwRoWf3Va4qUxZ4G +cxgblkJXZjLRDJBI4QaYqpPKdl9kukjm2YP9E/1vxC41tV4bA0NYZtoEuK4z8FeP +Az7JXuaAgdZZv2YcXkZjqNLzG1/OtZjC4zfMoYv2sseEJiKoOqdic66PIN6Jz/2d +qCEal/6yIYYqvD5qqh99vPvLcDISYRwLA9KGrXu+5ccCggEABulz/7WsUaxPjVdi +04PjNjevF8Xmm5jy1IhsA4DDPmNj41B/P8kqko4d3xBt6KolVT9XBxDDtef3188V +zTWD50qNjUfGh1jd/8dTdgLMhdswDpBpjZLMZUoecaJnah+Gl5VKgzCzWzKl5xjz +bOQr2j2F+Qwm2tvP1AcQyVjgwmFIGC5ec+w5dF8mgDThf7iKiMbkXavlhr/A7iW6 +2xylQFlpOkpoeolmv3SNOphJHk93XCqn/ssFcejJmj7EJQ65G5T1t1HiHCFMVc8p +lqWTIJBKgKbHcp3V+pmp7qTpXNK+AbCJ1JLEfW1XHbWKYtm0jVWZGuwyyxKXkfcz +vmOCWQKCAQAjMaGRQeahiBT/QZm3H+bzcV8O3zb8cgnDI051u77O3gArbLBOZwmL +khbbDqXDKEEU/6L6//2p1QlrPHkJLerco2PE9igogQOv+PTBw0RN96OHo5p4DDpp +3xbUckIN3pu5joarFTz5ZlQwdtxjr2VAO7oy57RwasV1dvxJwaJz1UjKsNG/3ssz +E4z607n6zbZl7UDWQLbQRO8FIF4VA/JjH+ssyiHpwyHAvRhxkROToBV/ExePE1tk +GNQOkjArH7bIcdeOzhuHEpmMji/cITdXfqCF4jKuivhxTM2bAhgjNU1MIzY+O9es +CcSiM6lLMovNAVoZy9wAokq4uWTUYcxLAoIBAEvYQSRhxx6vTq03uCzKxBgta4BM +ce4gAxaJ1E2EWppFwg4Ix2wVLO7QdcDf5cyRDK6O6rX1fpXO/vp0L0f1IRH0mTvn +lz/0Sw3/Hl+3t0PHmtM5ZqBfus0hw3mhgEigNlRKAYTUpufH3KFldhd6rycG21vf +j3eLleSipPmKnSEEj4Wx4o1ugDUwylg7Jy5ynhzyO7ldlclUgdiJfsq2togJ7tJP +YHABT16CxKoxtdsb55mdW+TNRFCAOKhFQ3fkFuBye3zbQfYQwt6XPS/bfJWl8HDh +3V2EbACuuFC05y0sDzrIAKjjmjPQfW7oL4boAvEgW+24eoAFG53ys6Y26vc= +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/storage/oauth-public.key b/storage/oauth-public.key new file mode 100644 index 0000000..d17e8c4 --- /dev/null +++ b/storage/oauth-public.key @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzLI0c0PEyprKQ7Ukzk52 +zazpvFk8njjCztsg1EE0Ak2YpAPerSFaAh5HJacqd3CsTO4xdnPslMEOkGzCwpBH +V6F18cNnCH247eU5HbURIFyC7EKBOEBegXaaqSsJrP2K7XWCoTqKlmTEsWkBVe/Q +TEN74mBvQh7i+vO+18y8pNEK3cE91jHukGV02aeBRP8D945z47p3E7i85O1U8QKT +/sX1a26lsnUaptt3pG1cd8gkGbPgADOE57jjRVBFliT8oBAL2tcYnVHbaHp+GYqM +LpdHFoXy5IpmNZ4aI4Pib6bCUKb8NqzTffrTKHK/DKJVKzQ1PPp2kuugrHxBeytN +TjPpCmkMmhEno6olBXU6+MCRGjNey0ABOHkLbyXJ6b6OYCZk7HpUMZ4uJ4/FiDeL +uRG0NH7ccek9LD4zBy63R2UGpUb8MAmgL+SMWwEWs+zAYxk0gQDSUZpcAeHU+3uv +a/Qe/zUiyKbkX4iqC0oGqJLC+nnRplUnGKB5agEDjgbxeRbUdaEXXtF5e56nNhQq +BGS7aBJ/f0+yNQtQuZMX5f8+C0nZb9RVHD1XLsaLMKRVIZA/I9TeH+in9yNtfXKx +xxlleRhpER7MuW5Ods5ZtHsEDSf0TjXZu8GdHYF6MobfZObnw2+xTrVTkXo7NY3A +gweWPM7b0k/ZgiVRTpGeWL0CAwEAAQ== +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/terminal.glue b/terminal.glue new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/terminal.glue @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/.DS_Store b/tests/.DS_Store new file mode 100644 index 0000000..ec20e88 Binary files /dev/null and b/tests/.DS_Store differ diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php new file mode 100644 index 0000000..547152f --- /dev/null +++ b/tests/CreatesApplication.php @@ -0,0 +1,22 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..f31e495 --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,21 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..2932d4a --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/webpack.mix.js b/webpack.mix.js new file mode 100644 index 0000000..19a48fa --- /dev/null +++ b/webpack.mix.js @@ -0,0 +1,15 @@ +const mix = require('laravel-mix'); + +/* + |-------------------------------------------------------------------------- + | Mix Asset Management + |-------------------------------------------------------------------------- + | + | Mix provides a clean, fluent API for defining some Webpack build steps + | for your Laravel application. By default, we are compiling the Sass + | file for the application as well as bundling up all the JS files. + | + */ + +mix.js('resources/js/app.js', 'public/js') + .sass('resources/sass/app.scss', 'public/css'); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..ef3337e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5923 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" + +adjust-sourcemap-loader@^1.1.0: + version "1.2.0" + resolved "http://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz#e33fde95e50db9f2a802e3647e311d2fc5000c69" + dependencies: + assert "^1.3.0" + camelcase "^1.2.1" + loader-utils "^1.1.0" + lodash.assign "^4.0.1" + lodash.defaults "^3.1.2" + object-path "^0.9.2" + regex-parser "^2.2.9" + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^5.0.0, ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert@^1.1.1, assert@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.2, async@^2.4.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +autoprefixer@^7.2.6: + version "7.2.6" + resolved "http://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" + dependencies: + browserslist "^2.11.3" + caniuse-lite "^1.0.30000805" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.17" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + +axios@^0.18: + version "0.18.0" + resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.24.1, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@^7.1.1: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-runtime@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.1.1, bluebird@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +bootstrap@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz#0eb371af2c8448e8c210411d0cb824a6409a12be" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +browserslist@^2.11.3: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2, camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000885" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000885.tgz#cdc98dd168ed59678650071f7f6a70910e275bc8" + +caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844: + version "1.0.30000885" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.2.x, clean-css@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + dependencies: + source-map "~0.6.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3, color-name@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@2.17.x, commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + +commander@~2.14.1: + version "2.14.1" + resolved "http://registry.npmjs.org/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +compressible@~2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + dependencies: + mime-db ">= 1.34.0 < 2" + +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concatenate@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/concatenate/-/concatenate-0.0.2.tgz#0b49d6e8c41047d7728cdc8d62a086623397b49f" + dependencies: + globs "^0.1.2" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +consolidate@^0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "http://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + +convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.1.0" + os-homedir "^1.0.1" + parse-json "^2.2.0" + require-from-string "^1.1.0" + +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-env@^5.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" + dependencies: + cross-spawn "^6.0.5" + is-windows "^1.0.0" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-loader@^0.28.9: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-node@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +dotenv-expand@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47: + version "1.3.64" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.64.tgz#39f5a93bf84ab7e10cfbb7522ccfc3f1feb756cf" + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d" + dependencies: + stackframe "^1.0.4" + +es-abstract@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-templates@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + dependencies: + recast "~0.11.12" + through "~2.3.6" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express@^4.16.2: + version "4.16.3" + resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-text-webpack-plugin@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" + dependencies: + async "^2.4.1" + loader-utils "^1.1.0" + schema-utils "^0.3.0" + webpack-sources "^1.0.1" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +file-loader@^0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34" + dependencies: + loader-utils "^1.0.2" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.0.0, follow-redirects@^1.3.0: + version "1.5.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.7.tgz#a39e4804dacb90202bca76a9e2ac10433ca6a69a" + dependencies: + debug "^3.1.0" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +friendly-errors-webpack-plugin@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz#efc86cbb816224565861a1be7a9d84d0aafea136" + dependencies: + chalk "^1.1.3" + error-stack-parser "^2.0.0" + string-width "^2.0.0" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globs@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globs/-/globs-0.1.4.tgz#1d13639f6174e4ae73a7f936da7d9a079f657c1c" + dependencies: + glob "^7.1.1" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.1.x, he@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +html-loader@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.4.5.tgz#5fbcd87cd63a5c49a7fce2fe56f425e05729c68c" + dependencies: + es6-templates "^0.2.2" + fastparse "^1.1.1" + html-minifier "^3.0.1" + loader-utils "^1.0.2" + object-assign "^4.1.0" + +html-minifier@^3.0.1: + version "3.5.20" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + +http-proxy-middleware@~0.17.4: + version "0.17.4" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + +http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4.19, iconv-lite@^0.4.4: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +img-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/img-loader/-/img-loader-3.0.0.tgz#1543ced809b1ec9b4d5e77d2584159282f1c4dd6" + dependencies: + loader-utils "^1.1.0" + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + dependencies: + import-from "^2.1.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + dependencies: + resolve-from "^3.0.0" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +internal-ip@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.0, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jquery@^3.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.4.3, js-yaml@^3.9.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +laravel-mix@^2.0: + version "2.1.14" + resolved "https://registry.yarnpkg.com/laravel-mix/-/laravel-mix-2.1.14.tgz#5c3c778b888e21120aa9d8900c318411da2ec911" + dependencies: + autoprefixer "^7.2.6" + babel-core "^6.24.1" + babel-loader "^7.1.1" + babel-plugin-transform-object-rest-spread "^6.26.0" + babel-plugin-transform-runtime "^6.23.0" + babel-preset-env "^1.5.1" + chokidar "^2.0.3" + clean-css "^4.1.3" + concatenate "0.0.2" + css-loader "^0.28.9" + dotenv "^4.0.0" + dotenv-expand "^4.2.0" + extract-text-webpack-plugin "^3.0.2" + file-loader "^0.11.2" + friendly-errors-webpack-plugin "^1.6.1" + fs-extra "^3.0.1" + glob "^7.1.2" + html-loader "^0.4.5" + img-loader "^3.0.0" + lodash "^4.17.5" + md5 "^2.2.1" + node-sass "^4.9.0" + postcss-loader "^2.1.0" + resolve-url-loader "^2.2.1" + sass-loader "^6.0.5" + style-loader "^0.18.2" + uglify-js "^2.8.29" + uglifyjs-webpack-plugin "^1.1.8" + vue-loader "^13.7.1" + vue-template-compiler "^2.5.13" + webpack "^3.11.0" + webpack-chunk-hash "^0.4.0" + webpack-dev-server "^2.11.1" + webpack-merge "^4.1.0" + webpack-notifier "^1.5.1" + yargs "^8.0.2" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.0.1, lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.defaults@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0, meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.34.0 < 2", mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + dependencies: + mime-db "~1.36.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.10.0, nan@^2.9.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-notifier@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-sass@^4.9.0: + version "4.9.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "2.87.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + +npm-packlist@^1.1.6: + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + +object-path@^0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +opn@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + dependencies: + is-wsl "^1.1.0" + +original@>=0.0.5: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +popper.js@^1.12: + version "1.14.4" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz#8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6" + +portfinder@^1.0.9: + version "1.0.17" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + dependencies: + postcss "^5.0.4" + +postcss-load-config@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + postcss-load-options "^1.2.0" + postcss-load-plugins "^2.3.0" + +postcss-load-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" + dependencies: + cosmiconfig "^4.0.0" + import-cwd "^2.0.0" + +postcss-load-options@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + +postcss-load-plugins@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + dependencies: + cosmiconfig "^2.1.1" + object-assign "^4.1.0" + +postcss-loader@^2.1.0: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" + dependencies: + loader-utils "^1.1.0" + postcss "^6.0.0" + postcss-load-config "^2.0.0" + schema-utils "^0.4.0" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.17, postcss@^6.0.8: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +prettier@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9" + +private@^0.1.6, private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +proxy-addr@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + +randomatic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.9: + version "2.2.9" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz#a372f45a248b62976a568037c1b6e60a60599192" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2.87.0, request@^2.87.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url-loader@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.1.tgz#b462fc7a78a22baf3ee462568d8ff5d766f7f1da" + dependencies: + adjust-sourcemap-loader "^1.1.0" + camelcase "^4.1.0" + convert-source-map "^1.5.1" + loader-utils "^1.1.0" + lodash.defaults "^4.0.0" + rework "^1.0.1" + rework-visit "^1.0.0" + source-map "^0.5.7" + urix "^0.1.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.4.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +rework-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + +rework@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^6.0.5: + version "6.0.7" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.7.tgz#dd2fdb3e7eeff4a53f35ba6ac408715488353d00" + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + +sax@^1.2.4, sax@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +schema-utils@^0.4.0, schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.3" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" + dependencies: + node-forge "0.7.5" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" + +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@^0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.3.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +thunky@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + +time-stamp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.1.0.tgz#6c5c0b2bc835a244616abcfddf81ce13a1975c9f" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + dependencies: + glob "^7.1.2" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-es@^3.3.4: + version "3.3.10" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.10.tgz#8b0b7992cebe20edc26de1bf325cef797b8f3fa5" + dependencies: + commander "~2.14.1" + source-map "~0.6.1" + +uglify-js@3.4.x: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +uglify-js@^2.8.29: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + +uglifyjs-webpack-plugin@^1.1.8: + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse@^1.1.8, url-parse@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.1, uuid@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +vue-hot-reload-api@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926" + +vue-loader@^13.7.1: + version "13.7.3" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-13.7.3.tgz#e07440f78230a639d00ada4da7b96d0e9d62037f" + dependencies: + consolidate "^0.14.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + lru-cache "^4.1.1" + postcss "^6.0.8" + postcss-load-config "^1.1.0" + postcss-selector-parser "^2.0.0" + prettier "^1.7.0" + resolve "^1.4.0" + source-map "^0.6.1" + vue-hot-reload-api "^2.2.0" + vue-style-loader "^3.0.0" + vue-template-es2015-compiler "^1.6.0" + +vue-style-loader@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-3.1.2.tgz#6b66ad34998fc9520c2f1e4d5fa4091641c1597a" + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.5.13: + version "2.5.17" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.17.tgz#52a4a078c327deb937482a509ae85c06f346c3cb" + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" + +vue@^2.5.7: + version "2.5.17" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.17.tgz#0f8789ad718be68ca1872629832ed533589c6ada" + +watchpack@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + dependencies: + minimalistic-assert "^1.0.0" + +webpack-chunk-hash@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.4.0.tgz#6b40c3070fbc9ff0cfe0fe781c7174af6c7c16a4" + +webpack-dev-middleware@1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" + dependencies: + memory-fs "~0.4.1" + mime "^1.5.0" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + time-stamp "^2.0.0" + +webpack-dev-server@^2.11.1: + version "2.11.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz#3fd48a402164a6569d94d3d17f131432631b4873" + dependencies: + ansi-html "0.0.7" + array-includes "^3.0.3" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.17.4" + import-local "^1.0.0" + internal-ip "1.2.0" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.1.5" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "1.12.2" + yargs "6.6.0" + +webpack-merge@^4.1.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + dependencies: + lodash "^4.17.5" + +webpack-notifier@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.6.0.tgz#ffac8e55ff8c469752b8c1bbb011a16f10986e02" + dependencies: + node-notifier "^5.1.2" + object-assign "^4.1.0" + strip-ansi "^3.0.1" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@6.6.0: + version "6.6.0" + resolved "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"