From 8698b7072942e8c53f27673b0db932d8fc725d8e Mon Sep 17 00:00:00 2001 From: nsanders Date: Wed, 11 May 2016 16:00:38 -0700 Subject: [PATCH 1/2] Initial Commit of SPA using In-Context, beta --- README.md | 2 + install.js | 5 + kraken-angular-single-page-app/.bowerrc | 4 + kraken-angular-single-page-app/.editorconfig | 13 + kraken-angular-single-page-app/.eslintrc | 27 ++ kraken-angular-single-page-app/.gitignore | 4 + kraken-angular-single-page-app/.nodemonignore | 5 + kraken-angular-single-page-app/.npmignore | 5 + kraken-angular-single-page-app/.yo-rc.json | 14 + kraken-angular-single-page-app/Gruntfile.js | 19 ++ kraken-angular-single-page-app/README.md | 8 + kraken-angular-single-page-app/bower.json | 24 ++ .../config/config.json | 74 +++++ .../config/development.json | 61 ++++ .../controllers/api/index.js | 111 +++++++ .../controllers/index.js | 13 + kraken-angular-single-page-app/index.js | 36 +++ .../locales/US/en/errors/404.properties | 2 + .../locales/US/en/errors/500.properties | 2 + .../locales/US/en/errors/503.properties | 2 + .../locales/US/en/index.properties | 1 + .../locales/US/en/layouts/master.properties | 1 + .../models/index.js | 14 + kraken-angular-single-page-app/package.json | 39 +++ .../public/css/app.less | 0 .../public/css/psychic-min.css | 1 + .../public/favicon.ico | Bin 0 -> 6544 bytes .../public/js/app.js | 14 + .../public/js/service/api.service.js | 178 +++++++++++ .../public/js/single-pageapp/directive.js | 102 ++++++ .../public/js/single-pageapp/template.html | 291 ++++++++++++++++++ .../public/templates/errors/404.dust | 6 + .../public/templates/errors/500.dust | 6 + .../public/templates/errors/503.dust | 6 + .../public/templates/index.dust | 5 + .../public/templates/layouts/master.dust | 36 +++ kraken-angular-single-page-app/server.js | 17 + kraken-angular-single-page-app/tasks/clean.js | 13 + .../tasks/copy-browser-modules.js | 13 + .../tasks/copyto.js | 25 ++ .../tasks/dustjs.js | 32 ++ .../tasks/eslint.js | 21 ++ kraken-angular-single-page-app/tasks/less.js | 23 ++ .../tasks/mochacli.js | 18 ++ kraken-angular-single-page-app/test/index.js | 47 +++ 45 files changed, 1340 insertions(+) create mode 100644 kraken-angular-single-page-app/.bowerrc create mode 100644 kraken-angular-single-page-app/.editorconfig create mode 100644 kraken-angular-single-page-app/.eslintrc create mode 100644 kraken-angular-single-page-app/.gitignore create mode 100644 kraken-angular-single-page-app/.nodemonignore create mode 100644 kraken-angular-single-page-app/.npmignore create mode 100644 kraken-angular-single-page-app/.yo-rc.json create mode 100644 kraken-angular-single-page-app/Gruntfile.js create mode 100644 kraken-angular-single-page-app/README.md create mode 100644 kraken-angular-single-page-app/bower.json create mode 100644 kraken-angular-single-page-app/config/config.json create mode 100644 kraken-angular-single-page-app/config/development.json create mode 100644 kraken-angular-single-page-app/controllers/api/index.js create mode 100644 kraken-angular-single-page-app/controllers/index.js create mode 100644 kraken-angular-single-page-app/index.js create mode 100644 kraken-angular-single-page-app/locales/US/en/errors/404.properties create mode 100644 kraken-angular-single-page-app/locales/US/en/errors/500.properties create mode 100644 kraken-angular-single-page-app/locales/US/en/errors/503.properties create mode 100644 kraken-angular-single-page-app/locales/US/en/index.properties create mode 100644 kraken-angular-single-page-app/locales/US/en/layouts/master.properties create mode 100644 kraken-angular-single-page-app/models/index.js create mode 100644 kraken-angular-single-page-app/package.json create mode 100644 kraken-angular-single-page-app/public/css/app.less create mode 100644 kraken-angular-single-page-app/public/css/psychic-min.css create mode 100644 kraken-angular-single-page-app/public/favicon.ico create mode 100644 kraken-angular-single-page-app/public/js/app.js create mode 100644 kraken-angular-single-page-app/public/js/service/api.service.js create mode 100644 kraken-angular-single-page-app/public/js/single-pageapp/directive.js create mode 100644 kraken-angular-single-page-app/public/js/single-pageapp/template.html create mode 100644 kraken-angular-single-page-app/public/templates/errors/404.dust create mode 100644 kraken-angular-single-page-app/public/templates/errors/500.dust create mode 100644 kraken-angular-single-page-app/public/templates/errors/503.dust create mode 100644 kraken-angular-single-page-app/public/templates/index.dust create mode 100644 kraken-angular-single-page-app/public/templates/layouts/master.dust create mode 100644 kraken-angular-single-page-app/server.js create mode 100644 kraken-angular-single-page-app/tasks/clean.js create mode 100644 kraken-angular-single-page-app/tasks/copy-browser-modules.js create mode 100644 kraken-angular-single-page-app/tasks/copyto.js create mode 100644 kraken-angular-single-page-app/tasks/dustjs.js create mode 100644 kraken-angular-single-page-app/tasks/eslint.js create mode 100644 kraken-angular-single-page-app/tasks/less.js create mode 100644 kraken-angular-single-page-app/tasks/mochacli.js create mode 100644 kraken-angular-single-page-app/test/index.js diff --git a/README.md b/README.md index d4c4a83..5215263 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ Currently these examples are setup to show the PayPal Express Checkout solution * This is a progression from the [Kraken-In-Context](kraken-in-context) app, adding in [AngularJS](https://angularjs.org/) for the front-end APIs. 5. [Hapi-In-Context](hapi-in-context) * This is a simple example using [HapiJS](http://hapijs.com/) with the [PayPal In-Context Experience](https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/in-context/). +6. [Kraken-Angular-Single-Page-App](kraken-angular-single-page-app) + * This is a single-page-app or "SPA" that uses PayPal In-Context Checkout with Callbacks from the In-Context Experience. ## Running specific examples diff --git a/install.js b/install.js index 2f6a48a..20e2918 100644 --- a/install.js +++ b/install.js @@ -35,6 +35,11 @@ var apps = [ name: 'hapi-in-context', npm: true, bower: true + }, + { + name: 'kraken-angular-single-page-app', + npm: true, + bower: true } ]; diff --git a/kraken-angular-single-page-app/.bowerrc b/kraken-angular-single-page-app/.bowerrc new file mode 100644 index 0000000..c52cc15 --- /dev/null +++ b/kraken-angular-single-page-app/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "public/components", + "json": "bower.json" +} \ No newline at end of file diff --git a/kraken-angular-single-page-app/.editorconfig b/kraken-angular-single-page-app/.editorconfig new file mode 100644 index 0000000..c308ed0 --- /dev/null +++ b/kraken-angular-single-page-app/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/kraken-angular-single-page-app/.eslintrc b/kraken-angular-single-page-app/.eslintrc new file mode 100644 index 0000000..fe93ffa --- /dev/null +++ b/kraken-angular-single-page-app/.eslintrc @@ -0,0 +1,27 @@ +{ + "rules": { + "indent": [ + 2, + 4 + ], + "quotes": [ + 2, + "single" + ], + "linebreak-style": [ + 2, + "unix" + ], + "semi": [ + 2, + "always" + ], + "no-console": 1 + }, + "env": { + "node": true, + "browser": true, + "mocha": true + }, + "extends": "eslint:recommended" +} diff --git a/kraken-angular-single-page-app/.gitignore b/kraken-angular-single-page-app/.gitignore new file mode 100644 index 0000000..2d3874b --- /dev/null +++ b/kraken-angular-single-page-app/.gitignore @@ -0,0 +1,4 @@ +node_modules +.build +public/components +npm-debug.log \ No newline at end of file diff --git a/kraken-angular-single-page-app/.nodemonignore b/kraken-angular-single-page-app/.nodemonignore new file mode 100644 index 0000000..5a67173 --- /dev/null +++ b/kraken-angular-single-page-app/.nodemonignore @@ -0,0 +1,5 @@ +/.build/* # Build folder +/public/* # ignore all public resources +/.* # any hidden (dot) files +*.md # Markdown files +*.css # CSS files diff --git a/kraken-angular-single-page-app/.npmignore b/kraken-angular-single-page-app/.npmignore new file mode 100644 index 0000000..69a12c7 --- /dev/null +++ b/kraken-angular-single-page-app/.npmignore @@ -0,0 +1,5 @@ +.DS_Store +.idea/ +.build/ +node_modules/ +*.iml diff --git a/kraken-angular-single-page-app/.yo-rc.json b/kraken-angular-single-page-app/.yo-rc.json new file mode 100644 index 0000000..a8002a2 --- /dev/null +++ b/kraken-angular-single-page-app/.yo-rc.json @@ -0,0 +1,14 @@ +{ + "generator-kraken": { + "taskModule": "grunt", + "lintModule": "eslint", + "description": "Single Page App using PayPal In-Context and AngularJS", + "author": "Nate Sanders", + "templateModule": "makara", + "i18n": "i18n", + "componentPackager": "bower", + "cssModule": "less", + "jsModule": false, + "useJson": null + } +} \ No newline at end of file diff --git a/kraken-angular-single-page-app/Gruntfile.js b/kraken-angular-single-page-app/Gruntfile.js new file mode 100644 index 0000000..cf43849 --- /dev/null +++ b/kraken-angular-single-page-app/Gruntfile.js @@ -0,0 +1,19 @@ +'use strict'; + + +module.exports = function (grunt) { + + // Load the project's grunt tasks from a directory + require('grunt-config-dir')(grunt, { + configDir: require('path').resolve('tasks') + }); + + + + // Register group tasks + grunt.registerTask('build', ['eslint', 'eslint', 'dustjs', 'less', 'copyto']); + + grunt.registerTask('test', [ 'eslint', 'mochacli' ]); + + +}; diff --git a/kraken-angular-single-page-app/README.md b/kraken-angular-single-page-app/README.md new file mode 100644 index 0000000..771aa55 --- /dev/null +++ b/kraken-angular-single-page-app/README.md @@ -0,0 +1,8 @@ +kraken-angular-single-page-app +=========== + +Single Page App using PayPal In-Context and AngularJS + +## Still in beta + +will update once in a usable state. \ No newline at end of file diff --git a/kraken-angular-single-page-app/bower.json b/kraken-angular-single-page-app/bower.json new file mode 100644 index 0000000..54a197b --- /dev/null +++ b/kraken-angular-single-page-app/bower.json @@ -0,0 +1,24 @@ +{ + "name": "kraken-angular-single-page-app", + "description": "Single Page App using PayPal In-Context and AngularJS", + "main": "index.js", + "author": "Nate Sanders", + "moduleType": [ + "node" + ], + "private": true, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "public/components", + "test", + "tests" + ], + "dependencies": { + "angular": "^1.5.5", + "angular-load": "^0.4.1", + "angular-cookies": "^1.5.5", + "jquery": "^2.2.3" + } +} diff --git a/kraken-angular-single-page-app/config/config.json b/kraken-angular-single-page-app/config/config.json new file mode 100644 index 0000000..767915d --- /dev/null +++ b/kraken-angular-single-page-app/config/config.json @@ -0,0 +1,74 @@ +{ + + + "express": { + "view cache": false, + "view engine": "js", + "views": "path:./.build/templates" + }, + + + + "view engines": { + "js": { + "module": "makara", + "renderer": { + "method": "js", + "arguments": [ + { "cache": true, "helpers": "config:dust.helpers" } + ] + } + } + }, + + "dust": { + "helpers": [ + + "dust-makara-helpers" + + ] + }, + + + + "i18n": { + "contentPath": "path:./locales", + "fallback": "en-US" + }, + + + "specialization": { + }, + + "middleware": { + + + "makara": { + "priority": 100, + "enabled": true, + "module": { + "name": "makara", + "arguments": [ + { + "i18n": "config:i18n", + "specialization": "config:specialization" + } + ] + } + }, + + + "static": { + "module": { + "arguments": [ "path:./.build" ] + } + }, + + "router": { + "module": { + "arguments": [{ "directory": "path:./controllers" }] + } + } + + } +} diff --git a/kraken-angular-single-page-app/config/development.json b/kraken-angular-single-page-app/config/development.json new file mode 100644 index 0000000..8595da5 --- /dev/null +++ b/kraken-angular-single-page-app/config/development.json @@ -0,0 +1,61 @@ +{ + + "express": { + "view cache": false, + "view engine": "dust", + "views": "path:./public/templates" + }, + + + "view engines": { + "dust": { + "module": "makara", + "renderer": { + "method": "dust", + "arguments": [ + { + "cache": false, + "helpers": "config:dust.helpers", + "whitespace": true + } + ] + } + } + }, + + + + "middleware": { + + "devtools": { + "enabled": true, + "priority": 35, + "module": { + "name": "construx", + "arguments": [ + "path:./public", + "path:./.build", + { + + "template": { + "module": "construx-dustjs", + "files": "/templates/**/*.js", + "base": "templates" + }, + + + "css": { + "module": "construx-less", + "files": "/css/**/*.css" + }, + + "copier": { + "module": "construx-copier", + "files": "**/*" + } + } + ] + } + } + } +} diff --git a/kraken-angular-single-page-app/controllers/api/index.js b/kraken-angular-single-page-app/controllers/api/index.js new file mode 100644 index 0000000..759fbd8 --- /dev/null +++ b/kraken-angular-single-page-app/controllers/api/index.js @@ -0,0 +1,111 @@ +'use strict'; + +var paypal = require('paypal-rest-sdk'); +var async = require('async'); + +module.exports = function (router) { + + router.post('/createPayment', function (req, res) { + var reqObj = req.body; + console.log('----------------------------------------------------------'); + console.log('---------- PAYMENT_DETAILS OBJ ----------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(reqObj)); + + async.waterfall([ + function (callback) { + paypal.generate_token( function (err, token) { + if(err) { + console.log('generate_token ERROR: '); + console.log(err); + callback(err); + } else { + console.log('----------------------------------------------------------'); + console.log('---------- ACCESS TOKEN RESPONSE ----------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(token)); + callback(null, token); + } + }); + }, + function (token, callback) { + paypal.payment.create(reqObj, function (err, response) { + if(err) { + console.log('create payment ERROR: '); + console.log(err); + callback(err); + } else { + console.log('----------------------------------------------------------'); + console.log('---------- CREATE PAYMENT RESPONSE ----------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(response)); + + var url = response.links[1].href; + var tmpAr = url.split('EC-'); + var token = {}; + token.redirectUrl = 'https://www.sandbox.paypal.com/checkoutnow?token=EC-' + tmpAr[1]; + token.token = 'EC-' + tmpAr[1]; + console.log('------ Token Split ------'); + console.log(token); + + callback(null, token); + } + }); + }], function (err, result) { + if(err){ + console.log('An ERROR occured!'); + console.log(err); + return res.json(err); + } else { + console.log('----------------------------------------------------------'); + console.log('---------- RESPONSE TO ANGULAR ----------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(result)); + return res.json(result); + } + }); + }); + + router.post('/getPaymentDetails', function (req, res) { + console.log('----------------------------------------------------------'); + console.log('-------------- PAYMENT DETAILS REQUEST ----------------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(req.body)); + paypal.payment.get(req.body.paymentId, function (error, payment){ + if(error !== null){ + console.log('ERROR'); + console.log(error); + res.json(error); + } else { + console.log('----------------------------------------------------------'); + console.log('-------------- PAYMENT DETAILS RESPONSE ----------------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(payment)); + res.json(payment); + } + }); + }); + + router.post('/executePayment', function (req, res) { + console.log('----------------------------------------------------------'); + console.log('--------------- EXECUTE PAYMENT REQUEST -----------------'); + console.log('----------------------------------------------------------'); + var pmtDetails = req.body; + var execute_details = { 'payer_id': pmtDetails.payer.payer_info.payer_id }; + console.log(JSON.stringify(execute_details)); + console.log(JSON.stringify(pmtDetails.id)); + paypal.payment.execute(pmtDetails.id, execute_details, function (err, response) { + if(err) { + console.log('execute payment ERROR: '); + console.log(err); + res.json(err); + } else { + console.log('----------------------------------------------------------'); + console.log('--------------- EXECUTE PAYMENT RESPONSE ----------------'); + console.log('----------------------------------------------------------'); + console.log(JSON.stringify(response)); + res.json(response); + } + }); + }); +}; \ No newline at end of file diff --git a/kraken-angular-single-page-app/controllers/index.js b/kraken-angular-single-page-app/controllers/index.js new file mode 100644 index 0000000..63f050f --- /dev/null +++ b/kraken-angular-single-page-app/controllers/index.js @@ -0,0 +1,13 @@ +'use strict'; + +var IndexModel = require('../models/index'); + + +module.exports = function (router) { + + router.get('/', function (req, res) { + var model = new IndexModel('single-pageapp'); + res.cookie('XSRF-TOKEN', res.locals._csrf); //setting a cookie that is accessible by Angular + res.render('index', model); + }); +}; \ No newline at end of file diff --git a/kraken-angular-single-page-app/index.js b/kraken-angular-single-page-app/index.js new file mode 100644 index 0000000..904f313 --- /dev/null +++ b/kraken-angular-single-page-app/index.js @@ -0,0 +1,36 @@ +'use strict'; + +var express = require('express'); +var kraken = require('kraken-js'); +var ppconfig = require('../ppconfig/sandbox'); +var paypal = require('paypal-rest-sdk'); + +var options, app; + +/* + * Create and configure application. Also exports application instance for use by tests. + * See https://github.com/krakenjs/kraken-js#options for additional configuration options. + */ +options = { + onconfig: function (config, next) { + /* + * Add any additional config setup or overrides here. `config` is an initialized + * `confit` (https://github.com/krakenjs/confit/) configuration object. + */ + paypal.configure({ + 'mode': 'sandbox', //sandbox or live + 'client_id': ppconfig.client_id, + 'client_secret': ppconfig.client_secret, + 'grant_type': 'client_credentials', + 'content_type': 'application/x-www-form-urlencoded' + }); + next(null, config); + } +}; + +app = module.exports = express(); +app.use(kraken(options)); +app.on('start', function () { + console.log('Application ready to serve requests.'); + console.log('Environment: %s', app.kraken.get('env:env')); +}); diff --git a/kraken-angular-single-page-app/locales/US/en/errors/404.properties b/kraken-angular-single-page-app/locales/US/en/errors/404.properties new file mode 100644 index 0000000..ccfa6de --- /dev/null +++ b/kraken-angular-single-page-app/locales/US/en/errors/404.properties @@ -0,0 +1,2 @@ +header=File not found +description=The URL {url} did not resolve to a route. \ No newline at end of file diff --git a/kraken-angular-single-page-app/locales/US/en/errors/500.properties b/kraken-angular-single-page-app/locales/US/en/errors/500.properties new file mode 100644 index 0000000..7a85f70 --- /dev/null +++ b/kraken-angular-single-page-app/locales/US/en/errors/500.properties @@ -0,0 +1,2 @@ +header=Internal server error +description=The URL {url} had the following error {err}. \ No newline at end of file diff --git a/kraken-angular-single-page-app/locales/US/en/errors/503.properties b/kraken-angular-single-page-app/locales/US/en/errors/503.properties new file mode 100644 index 0000000..3dd31de --- /dev/null +++ b/kraken-angular-single-page-app/locales/US/en/errors/503.properties @@ -0,0 +1,2 @@ +header=Service unavailable +description=The service is unavailable. Please try back shortly. diff --git a/kraken-angular-single-page-app/locales/US/en/index.properties b/kraken-angular-single-page-app/locales/US/en/index.properties new file mode 100644 index 0000000..9d0f74f --- /dev/null +++ b/kraken-angular-single-page-app/locales/US/en/index.properties @@ -0,0 +1 @@ +greeting=Hello, {name}! diff --git a/kraken-angular-single-page-app/locales/US/en/layouts/master.properties b/kraken-angular-single-page-app/locales/US/en/layouts/master.properties new file mode 100644 index 0000000..9d0f74f --- /dev/null +++ b/kraken-angular-single-page-app/locales/US/en/layouts/master.properties @@ -0,0 +1 @@ +greeting=Hello, {name}! diff --git a/kraken-angular-single-page-app/models/index.js b/kraken-angular-single-page-app/models/index.js new file mode 100644 index 0000000..fa61170 --- /dev/null +++ b/kraken-angular-single-page-app/models/index.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = function IndexModel(page) { + if(page === 'single-pageapp') { + return { + component: 'single-pageapp', + title: 'SPA - Checkout' + }; + } else { + return { + name: 'index' + }; + } +}; \ No newline at end of file diff --git a/kraken-angular-single-page-app/package.json b/kraken-angular-single-page-app/package.json new file mode 100644 index 0000000..9bed6ab --- /dev/null +++ b/kraken-angular-single-page-app/package.json @@ -0,0 +1,39 @@ +{ + "name": "kraken-angular-single-page-app", + "version": "0.1.0", + "description": "Single Page App using PayPal In-Context and AngularJS", + "author": "Nate Sanders", + "main": "index.js", + "scripts": { + "test": "grunt test", + "build": "grunt build", + "all": "npm run build && npm run test" + }, + "dependencies": { + "async": "^2.0.0-rc.4", + "construx": "^1.0.0", + "construx-copier": "^1.0.0", + "construx-dustjs": "^1.1.0", + "construx-less": "^1.0.0", + "dust-makara-helpers": "^4.1.2", + "eslint": "^1.10.3", + "express": "^4.12.2", + "kraken-js": "^1.0.3", + "makara": "^2.0.3", + "paypal-rest-sdk": "^1.6.8", + "psychic-ui": "0.0.1" + }, + "devDependencies": { + "grunt": "^0.4.5", + "grunt-cli": "^0.1.13", + "grunt-config-dir": "^0.3.2", + "grunt-contrib-clean": "^0.6.0", + "grunt-contrib-less": "^1.3.0", + "grunt-copy-to": "0.0.10", + "grunt-dustjs": "^1.4.0", + "grunt-eslint": "^17.3.2", + "grunt-mocha-cli": "^1.14.0", + "mocha": "^1.18.0", + "supertest": "^0.9.0" + } +} diff --git a/kraken-angular-single-page-app/public/css/app.less b/kraken-angular-single-page-app/public/css/app.less new file mode 100644 index 0000000..e69de29 diff --git a/kraken-angular-single-page-app/public/css/psychic-min.css b/kraken-angular-single-page-app/public/css/psychic-min.css new file mode 100644 index 0000000..580dc25 --- /dev/null +++ b/kraken-angular-single-page-app/public/css/psychic-min.css @@ -0,0 +1 @@ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */progress,sub,sup{vertical-align:baseline}[type=checkbox],[type=radio],legend{box-sizing:border-box;padding:0}button,hr,input{overflow:visible}.grid>*>*,pre{word-wrap:break-word}.table,pre{word-break:break-all}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}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{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{color:inherit;display:table;max-width:100%;white-space:normal}textarea{overflow:auto}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.text-white{color:#fff!important}.background-white{background-color:#fff!important}.text-black{color:#000!important}.background-black{background-color:#000!important}.text-default{color:#cfcfc4!important}.background-default{background-color:#cfcfc4!important}.text-primary{color:#779ecb!important}.background-primary{background-color:#779ecb!important}.text-success{color:#7d7!important}.background-success{background-color:#7d7!important}.text-info{color:#9bddff!important}.background-info{background-color:#9bddff!important}.text-warning{color:#ffb347!important}.background-warning{background-color:#ffb347!important}.text-danger{color:#ff6961!important}.background-danger{background-color:#ff6961!important}.no-border{border:0!important}.responsive{width:100%;height:auto}.text-right{text-align:right}.text-left{text-align:left}.table,.text-center{text-align:center}hr{box-sizing:content-box;border:0;height:0;border-top:1px solid #cfcfc4;border-bottom:1px solid rgba(255,255,255,.3)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:5px}.grid>.col-1-12,.grid>.col-10-12,.grid>.col-11-12,.grid>.col-12-12,.grid>.col-2-12,.grid>.col-3-12,.grid>.col-4-12,.grid>.col-5-12,.grid>.col-7-12,.grid>.col-8-12,.grid>.col-9-12{margin-left:0;margin-right:0}.a{color:#0079ad;text-decoration:none;font-weight:300}.a:hover{text-decoration:underline}small{color:#777;font-size:75%;font-weight:400}.grid{width:100%}.grid:after{clear:both;visibility:hidden;display:block;font-size:0;content:' ';height:0}.grid>div{float:left;box-sizing:border-box;min-height:1px}.grid>.col-0-12{display:none}.grid>.col-1-12{width:8.333333333333332%}.grid>.col-2-12{width:16.666666666666664%}.grid>.col-3-12{width:25%}.grid>.col-4-12{width:33.33333333333333%}.grid>.col-5-12{width:41.66666666666667%}.grid>.col-6-12{width:50%;margin-left:0;margin-right:0}.grid>.col-7-12{width:58.333333333333336%}.grid>.col-8-12{width:66.66666666666666%}.grid>.col-9-12{width:75%}.grid>.col-10-12{width:83.33333333333334%}.grid>.col-11-12{width:91.66666666666666%}.grid>.col-12-12{width:100%}@media screen and (min-width:32em){.grid>.col-sm-1-12,.grid>.col-sm-10-12,.grid>.col-sm-11-12,.grid>.col-sm-12-12,.grid>.col-sm-2-12,.grid>.col-sm-3-12,.grid>.col-sm-4-12,.grid>.col-sm-5-12,.grid>.col-sm-7-12,.grid>.col-sm-8-12,.grid>.col-sm-9-12{margin-left:0;margin-right:0}.grid>.col-sm-0-12{display:none}.grid>.col-sm-1-12{width:8.3333%}.grid>.col-sm-2-12{width:16.6666%}.grid>.col-sm-3-12{width:25%}.grid>.col-sm-4-12{width:33.3333%}.grid>.col-sm-5-12{width:41.6666%}.grid>.col-sm-6-12{width:50%;margin-left:0;margin-right:0}.grid>.col-sm-7-12{width:58.3333%}.grid>.col-sm-8-12{width:66.6666%}.grid>.col-sm-9-12{width:75%}.grid>.col-sm-10-12{width:83.3333%}.grid>.col-sm-11-12{width:91.6666%}.grid>.col-sm-12-12{width:100%}}@media screen and (min-width:48em){.grid>.col-md-1-12,.grid>.col-md-10-12,.grid>.col-md-11-12,.grid>.col-md-12-12,.grid>.col-md-2-12,.grid>.col-md-3-12,.grid>.col-md-4-12,.grid>.col-md-5-12,.grid>.col-md-7-12,.grid>.col-md-8-12,.grid>.col-md-9-12{margin-left:0;margin-right:0}.grid>.col-md-0-12{display:none}.grid>.col-md-1-12{width:8.3333%}.grid>.col-md-2-12{width:16.6666%}.grid>.col-md-3-12{width:25%}.grid>.col-md-4-12{width:33.3333%}.grid>.col-md-5-12{width:41.6666%}.grid>.col-md-6-12{width:50%;margin-left:0;margin-right:0}.grid>.col-md-7-12{width:58.3333%}.grid>.col-md-8-12{width:66.6666%}.grid>.col-md-9-12{width:75%}.grid>.col-md-10-12{width:83.3333%}.grid>.col-md-11-12{width:91.6666%}.grid>.col-md-12-12{width:100%}}@media screen and (min-width:64em){.grid>.col-lg-1-12,.grid>.col-lg-10-12,.grid>.col-lg-11-12,.grid>.col-lg-12-12,.grid>.col-lg-2-12,.grid>.col-lg-3-12,.grid>.col-lg-4-12,.grid>.col-lg-5-12,.grid>.col-lg-7-12,.grid>.col-lg-8-12,.grid>.col-lg-9-12{margin-left:0;margin-right:0}.grid>.col-lg-0-12{display:none}.grid>.col-lg-1-12{width:8.3333%}.grid>.col-lg-2-12{width:16.6666%}.grid>.col-lg-3-12{width:25%}.grid>.col-lg-4-12{width:33.3333%}.grid>.col-lg-5-12{width:41.6666%}.grid>.col-lg-6-12{width:50%;margin-left:0;margin-right:0}.grid>.col-lg-7-12{width:58.3333%}.grid>.col-lg-8-12{width:66.6666%}.grid>.col-lg-9-12{width:75%}.grid>.col-lg-10-12{width:83.3333%}.grid>.col-lg-11-12{width:91.6666%}.grid>.col-lg-12-12{width:100%}}@media screen and (min-width:80em){.grid>.col-xl-1-12,.grid>.col-xl-10-12,.grid>.col-xl-11-12,.grid>.col-xl-12-12,.grid>.col-xl-2-12,.grid>.col-xl-3-12,.grid>.col-xl-4-12,.grid>.col-xl-5-12,.grid>.col-xl-7-12,.grid>.col-xl-8-12,.grid>.col-xl-9-12{margin-left:0;margin-right:0}.grid>.col-xl-0-12{display:none}.grid>.col-xl-1-12{width:8.3333%}.grid>.col-xl-2-12{width:16.6666%}.grid>.col-xl-3-12{width:25%}.grid>.col-xl-4-12{width:33.3333%}.grid>.col-xl-5-12{width:41.6666%}.grid>.col-xl-6-12{width:50%;margin-left:0;margin-right:0}.grid>.col-xl-7-12{width:58.3333%}.grid>.col-xl-8-12{width:66.6666%}.grid>.col-xl-9-12{width:75%}.grid>.col-xl-10-12{width:83.3333%}.grid>.col-xl-11-12{width:91.6666%}.grid>.col-xl-12-12{width:100%}}.table.border-white{border:none}.table.border-white td,.table.border-white th,.table.border-white thead>tr>th{color:#fff}.table.border-white td,.table.border-white th{border-bottom:.1rem solid #fff}.table.border-black{border:none}.table.border-black thead>tr>th{color:#000}.table.border-black td,.table.border-black th{color:#0d0d0d;border-bottom:.1rem solid #000}.table.border-default{border:none}.table.border-default thead>tr>th{color:#cfcfc4}.table.border-default td,.table.border-default th{color:#d1d1c7;border-bottom:.1rem solid #cfcfc4}.table.border-primary{border:none}.table.border-primary thead>tr>th{color:#779ecb}.table.border-primary td,.table.border-primary th{color:#7ea3ce;border-bottom:.1rem solid #779ecb}.table.border-success{border:none}.table.border-success thead>tr>th{color:#7d7}.table.border-success td,.table.border-success th{color:#7edf7e;border-bottom:.1rem solid #7d7}.table.border-info{border:none}.table.border-info thead>tr>th{color:#9bddff}.table.border-info td,.table.border-info th{color:#a0dfff;border-bottom:.1rem solid #9bddff}.table.border-warning{border:none}.table.border-warning thead>tr>th{color:#ffb347}.table.border-warning td,.table.border-warning th{color:#ffb750;border-bottom:.1rem solid #ffb347}.table.border-danger{border:none}.table.border-danger thead>tr>th{color:#ff6961}.table.border-danger td,.table.border-danger th{color:#ff7069;border-bottom:.1rem solid #ff6961}.table thead>tr>th{font-weight:700}.table td,.table th{border-bottom:.1rem solid #e1e1e1;text-align:left;padding:10px}.badge,.btn,.modal-close,.progress{text-align:center}.table.responsive{width:100%;border-collapse:collapse;border-spacing:0;display:table}.table.border{border:solid}.navbar{position:relative;min-height:50px;width:100%;display:table}.navbar.navbar-absolute,.navbar.navbar-fixed{border-right:1px solid #cfcfc4;border-left:1px solid #cfcfc4;border-bottom:1px solid #cfcfc4}.navbar.navbar-center>.container{margin:0 auto;width:50%;position:relative}.navbar.navbar-white,.navbar.navbar-white>.navbar-title{color:#000}.navbar.navbar-black,.navbar.navbar-black>.navbar-title,.navbar.navbar-danger,.navbar.navbar-danger>.navbar-title,.navbar.navbar-default,.navbar.navbar-default>.navbar-title,.navbar.navbar-info,.navbar.navbar-info>.navbar-title,.navbar.navbar-primary,.navbar.navbar-primary>.navbar-title,.navbar.navbar-success,.navbar.navbar-success>.navbar-title,.navbar.navbar-warning,.navbar.navbar-warning>.navbar-title{color:#fff}.navbar.navbar-white>.container,.navbar.navbar-white>.navbar-title>.container{background-color:#fff;border-color:#bfbfbf}.navbar.navbar-black>.container,.navbar.navbar-black>.navbar-title>.container{background-color:#000;border-color:#000}.navbar.navbar-default>.container,.navbar.navbar-default>.navbar-title>.container{background-color:#cfcfc4;border-color:#cfcfc4}.navbar.navbar-primary>.container,.navbar.navbar-primary>.navbar-title>.container{background-color:#779ecb;border-color:#779ecb}.navbar.navbar-success>.container,.navbar.navbar-success>.navbar-title>.container{background-color:#7d7;border-color:#7d7}.navbar.navbar-info>.container,.navbar.navbar-info>.navbar-title>.container{background-color:#9bddff;border-color:#9bddff}.navbar.navbar-warning>.container,.navbar.navbar-warning>.navbar-title>.container{background-color:#ffb347;border-color:#ffb347}.nav>a,.navbar .navbar-title>*>a{color:#000;text-decoration:none}.navbar.navbar-danger>.container,.navbar.navbar-danger>.navbar-title>.container{background-color:#ff6961;border-color:#ff6961}.navbar>.container{clear:both;margin-right:auto;margin-left:auto;display:table;width:100%;height:60px}.navbar .navbar-title{float:left;display:inline-block;margin-left:20px;margin-top:20px;font-weight:700}.navbar .navbar-content{float:right;margin-left:20px;margin-top:20px}.nav.nav-left>a{border-left:3px solid transparent}.nav.nav-left:hover{text-decoration:none;border-left:3px solid #dde7f2;border-right:0!important;border-bottom:0}.nav.nav-left.active,.nav.nav-left:target{border-left:3px solid #779ecb;border-right:0!important;border-bottom:0}.nav.nav-stacked{display:inline-block}.nav.nav-stacked>a{border-right:3px solid transparent;display:block}.nav.nav-stacked>a:hover{text-decoration:none;border-right:3px solid #dde7f2;border-bottom:0}.nav.nav-stacked>a.active,.nav.nav-stacked>a:target{border-right:3px solid #779ecb;border-bottom:0}.nav.nav-stacked>label{font-weight:700;display:inline-block;margin-top:15px;margin-bottom:15px}.nav>a{padding-bottom:5px;padding-left:4px;padding-right:4px;margin-left:2px;margin-right:2px}.nav>a.active,.nav>a:target{border-bottom:3px solid #779ecb}.nav>a:hover{text-decoration:none;border-bottom:3px solid #dde7f2}.spinner-overlay{position:relative;top:0;left:0;width:100%;height:auto;background-color:#fff;opacity:.75;z-index:3}.spinner-overlay .spinner-wrapper{position:relative;top:calc(50% - 50px)}.spinner-overlay .spinner-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:30px;text-align:center;font-weight:400;z-index:100;outline:0}.spinner-overlay .spinner{height:30px;width:30px;margin:0 auto;opacity:1;background-color:rgba(255,255,255,.702);-webkit-animation:rotation .7s infinite linear;-moz-animation:rotation .7s infinite linear;-o-animation:rotation .7s infinite linear;animation:rotation .7s infinite linear;border-left:8px solid rgba(0,0,0,.2);border-right:8px solid rgba(0,0,0,.2);border-bottom:8px solid rgba(0,0,0,.2);border-top:8px solid #2180c0;border-radius:100%}.spinner-overlay .spinner.spinner-white.done:after,.spinner-overlay .spinner.spinner-white.spinner-done{border-right:8px solid #fff;border-bottom:8px solid #fff}.spinner-overlay .spinner.spinner-white{border-top:8px solid #fff}.spinner-overlay .spinner.spinner-white.spinner-done{border-left:8px solid #fff;border-top:8px solid #fff}.spinner-overlay .spinner.spinner-black.done:after,.spinner-overlay .spinner.spinner-black.spinner-done{border-right:8px solid #000;border-bottom:8px solid #000}.spinner-overlay .spinner.spinner-black{border-top:8px solid #000}.spinner-overlay .spinner.spinner-black.spinner-done{border-left:8px solid #000;border-top:8px solid #000}.spinner-overlay .spinner.spinner-default.done:after,.spinner-overlay .spinner.spinner-default.spinner-done{border-right:8px solid #cfcfc4;border-bottom:8px solid #cfcfc4}.spinner-overlay .spinner.spinner-default{border-top:8px solid #cfcfc4}.spinner-overlay .spinner.spinner-default.spinner-done{border-left:8px solid #cfcfc4;border-top:8px solid #cfcfc4}.spinner-overlay .spinner.spinner-primary.done:after,.spinner-overlay .spinner.spinner-primary.spinner-done{border-right:8px solid #779ecb;border-bottom:8px solid #779ecb}.spinner-overlay .spinner.spinner-primary{border-top:8px solid #779ecb}.spinner-overlay .spinner.spinner-primary.spinner-done{border-left:8px solid #779ecb;border-top:8px solid #779ecb}.spinner-overlay .spinner.spinner-success.done:after,.spinner-overlay .spinner.spinner-success.spinner-done{border-right:8px solid #7d7;border-bottom:8px solid #7d7}.spinner-overlay .spinner.spinner-success{border-top:8px solid #7d7}.spinner-overlay .spinner.spinner-success.spinner-done{border-left:8px solid #7d7;border-top:8px solid #7d7}.spinner-overlay .spinner.spinner-info.done:after,.spinner-overlay .spinner.spinner-info.spinner-done{border-right:8px solid #9bddff;border-bottom:8px solid #9bddff}.spinner-overlay .spinner.spinner-info{border-top:8px solid #9bddff}.spinner-overlay .spinner.spinner-info.spinner-done{border-left:8px solid #9bddff;border-top:8px solid #9bddff}.spinner-overlay .spinner.spinner-warning.done:after,.spinner-overlay .spinner.spinner-warning.spinner-done{border-right:8px solid #ffb347;border-bottom:8px solid #ffb347}.spinner-overlay .spinner.spinner-warning{border-top:8px solid #ffb347}.spinner-overlay .spinner.spinner-warning.spinner-done{border-left:8px solid #ffb347;border-top:8px solid #ffb347}.spinner-overlay .spinner.spinner-danger.done:after,.spinner-overlay .spinner.spinner-danger.spinner-done{border-right:8px solid #ff6961;border-bottom:8px solid #ff6961}.spinner-overlay .spinner.spinner-danger{border-top:8px solid #ff6961}.spinner-overlay .spinner.spinner-danger.spinner-done{border-left:8px solid #ff6961;border-top:8px solid #ff6961}@-moz-keyframes rotation{from{transform:rotate(0)}to{transform:rotate(359deg)}}@-webkit-keyframes rotation{from{transform:rotate(0)}to{transform:rotate(359deg)}}@-o-keyframes rotation{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes rotation{from{transform:rotate(0)}to{transform:rotate(359deg)}}.btn{padding:12px 18px;margin:10px;cursor:pointer;display:inline-block;background-color:#fff;border:1px solid #cfcfc4;color:#fff}.btn:hover{opacity:.95}.btn:focus{outline:0}.btn.btn-block{width:100%}.popover.bottom,.popover.top{width:200px;z-index:4;margin-right:-50%;transform:translate(-50%,-50%)}.btn.border-radius-0{border-radius:0}.btn.border-radius-1{border-radius:1px}.btn.border-radius-2{border-radius:2px}.btn.border-radius-3{border-radius:3px}.btn.border-radius-4{border-radius:4px}.btn.border-radius-5{border-radius:5px}.btn.border-radius-6{border-radius:6px}.btn.border-radius-7{border-radius:7px}.btn.border-radius-8{border-radius:8px}.btn.border-radius-9{border-radius:9px}.btn.border-radius-10{border-radius:10px}.btn.border-radius-11{border-radius:11px}.btn.border-radius-12{border-radius:12px}.btn.border-radius-13{border-radius:13px}.btn.border-radius-14{border-radius:14px}.btn.border-radius-15{border-radius:15px}.btn.border-radius-16{border-radius:16px}.btn.border-radius-17{border-radius:17px}.btn.border-radius-18{border-radius:18px}.btn.border-radius-19{border-radius:19px}.btn.border-radius-20{border-radius:20px}.btn.border-radius-21{border-radius:21px}.btn.border-radius-22{border-radius:22px}.btn.border-radius-23{border-radius:23px}.btn.border-radius-24{border-radius:24px}.btn.border-radius-25{border-radius:25px}.btn.border-radius-26{border-radius:26px}.btn.border-radius-27{border-radius:27px}.btn.border-radius-28{border-radius:28px}.btn.border-radius-29{border-radius:29px}.btn.border-radius-30{border-radius:30px}.btn.border-radius-31{border-radius:31px}.btn.border-radius-32{border-radius:32px}.btn.border-radius-33{border-radius:33px}.btn.border-radius-34{border-radius:34px}.btn.border-radius-35{border-radius:35px}.btn.border-radius-36{border-radius:36px}.btn.border-radius-37{border-radius:37px}.btn.border-radius-38{border-radius:38px}.btn.border-radius-39{border-radius:39px}.btn.border-radius-40{border-radius:40px}.btn.border-radius-41{border-radius:41px}.btn.border-radius-42{border-radius:42px}.btn.border-radius-43{border-radius:43px}.btn.border-radius-44{border-radius:44px}.btn.border-radius-45{border-radius:45px}.btn.border-radius-46{border-radius:46px}.btn.border-radius-47{border-radius:47px}.btn.border-radius-48{border-radius:48px}.btn.border-radius-49{border-radius:49px}.btn.border-radius-50{border-radius:50px}.btn.border-radius-51{border-radius:51px}.btn.border-radius-52{border-radius:52px}.btn.border-radius-53{border-radius:53px}.btn.border-radius-54{border-radius:54px}.btn.border-radius-55{border-radius:55px}.btn.border-radius-56{border-radius:56px}.btn.border-radius-57{border-radius:57px}.btn.border-radius-58{border-radius:58px}.btn.border-radius-59{border-radius:59px}.btn.border-radius-60{border-radius:60px}.btn.border-radius-61{border-radius:61px}.btn.border-radius-62{border-radius:62px}.btn.border-radius-63{border-radius:63px}.btn.border-radius-64{border-radius:64px}.btn.border-radius-65{border-radius:65px}.btn.border-radius-66{border-radius:66px}.btn.border-radius-67{border-radius:67px}.btn.border-radius-68{border-radius:68px}.btn.border-radius-69{border-radius:69px}.btn.border-radius-70{border-radius:70px}.btn.border-radius-71{border-radius:71px}.btn.border-radius-72{border-radius:72px}.btn.border-radius-73{border-radius:73px}.btn.border-radius-74{border-radius:74px}.btn.border-radius-75{border-radius:75px}.btn.border-radius-76{border-radius:76px}.btn.border-radius-77{border-radius:77px}.btn.border-radius-78{border-radius:78px}.btn.border-radius-79{border-radius:79px}.btn.border-radius-80{border-radius:80px}.btn.border-radius-81{border-radius:81px}.btn.border-radius-82{border-radius:82px}.btn.border-radius-83{border-radius:83px}.btn.border-radius-84{border-radius:84px}.btn.border-radius-85{border-radius:85px}.btn.border-radius-86{border-radius:86px}.btn.border-radius-87{border-radius:87px}.btn.border-radius-88{border-radius:88px}.btn.border-radius-89{border-radius:89px}.btn.border-radius-90{border-radius:90px}.btn.border-radius-91{border-radius:91px}.btn.border-radius-92{border-radius:92px}.btn.border-radius-93{border-radius:93px}.btn.border-radius-94{border-radius:94px}.btn.border-radius-95{border-radius:95px}.btn.border-radius-96{border-radius:96px}.btn.border-radius-97{border-radius:97px}.btn.border-radius-98{border-radius:98px}.btn.border-radius-99{border-radius:99px}.btn.border-radius-100{border-radius:100px}.btn.border-white{border:1px solid #fff;color:#fff}.btn.border-white:hover{background-color:#fff;opacity:.5;border-color:#d9d9d9;color:#000}.btn.border-white:active{background-color:#d9d9d9;opacity:.5;border-color:#d9d9d9;color:#000}.btn.btn-white{border:1px solid #d9d9d9;background-color:#fff}.btn.btn-white:active{background-color:#d9d9d9;opacity:.5;border-color:#d9d9d9;color:#000}.btn.border-black{border:1px solid #000;color:#000}.btn.border-black:hover{background-color:grey;opacity:.5;border-color:#000;color:#fff}.btn.border-black:active{background-color:#000;opacity:.5;border-color:#000;color:#fff}.btn.btn-black{border:1px solid #000;background-color:#000}.btn.btn-black:active{background-color:#000;opacity:.5;border-color:#000;color:#fff}.btn.border-default{border:1px solid #cfcfc4;color:#cfcfc4}.btn.border-default:hover{background-color:#e7e7e2;opacity:.5;border-color:#b4b4a3;color:#fff}.btn.border-default:active{background-color:#b4b4a3;opacity:.5;border-color:#b4b4a3;color:#fff}.btn.btn-default{border:1px solid #b4b4a3;background-color:#cfcfc4}.btn.btn-default:active{background-color:#b4b4a3;opacity:.5;border-color:#b4b4a3;color:#fff}.btn.border-primary{border:1px solid #779ecb;color:#779ecb}.btn.border-primary:hover{background-color:#bbcee5;opacity:.5;border-color:#5485be;color:#fff}.btn.border-primary:active{background-color:#5485be;opacity:.5;border-color:#5485be;color:#fff}.btn.btn-primary{border:1px solid #5485be;background-color:#779ecb}.btn.btn-primary:active{background-color:#5485be;opacity:.5;border-color:#5485be;color:#fff}.btn.border-success{border:1px solid #7d7;color:#7d7}.btn.border-success:hover{background-color:#beb;opacity:.5;border-color:#4ed34e;color:#fff}.btn.border-success:active{background-color:#4ed34e;opacity:.5;border-color:#4ed34e;color:#fff}.btn.btn-success{border:1px solid #4ed34e;background-color:#7d7}.btn.btn-success:active{background-color:#4ed34e;opacity:.5;border-color:#4ed34e;color:#fff}.btn.border-info{border:1px solid #9bddff;color:#9bddff}.btn.border-info:hover{background-color:#cdeeff;opacity:.5;border-color:#5dc8ff;color:#fff}.btn.border-info:active{background-color:#5dc8ff;opacity:.5;border-color:#5dc8ff;color:#fff}.btn.btn-info{border:1px solid #5dc8ff;background-color:#9bddff}.btn.btn-info:active{background-color:#5dc8ff;opacity:.5;border-color:#5dc8ff;color:#fff}.btn.border-warning{border:1px solid #ffb347;color:#ffb347}.btn.border-warning:hover{background-color:#ffd9a3;opacity:.5;border-color:#ff9f16;color:#fff}.btn.border-warning:active{background-color:#ff9f16;opacity:.5;border-color:#ff9f16;color:#fff}.btn.btn-warning{border:1px solid #ff9f16;background-color:#ffb347}.btn.btn-warning:active{background-color:#ff9f16;opacity:.5;border-color:#ff9f16;color:#fff}.btn.border-danger{border:1px solid #ff6961;color:#ff6961}.btn.border-danger:hover{background-color:#ffb4b0;opacity:.5;border-color:#ff372c;color:#fff}.btn.border-danger:active{background-color:#ff372c;opacity:.5;border-color:#ff372c;color:#fff}.btn.btn-danger{border:1px solid #ff372c;background-color:#ff6961}.btn.btn-danger:active{background-color:#ff372c;opacity:.5;border-color:#ff372c;color:#fff}.popover-container{display:inline-block;position:relative}.popover-container:hover .popover{display:block}.popover-container:hover .popover.left,.popover-container:hover .popover.right{display:inline-block}.popover{position:absolute;font-size:12px;display:none;padding:7px 10px;color:#fff;background-color:rgba(0,0,0,.85);border-radius:5px}.popover.bottom:before,.popover.top:before{border-right:7px solid transparent;border-left:7px solid transparent;display:block;left:50%;margin-left:-7px}.popover.top{bottom:10px;left:50%}.popover.top:before{border-top:7px solid rgba(0,0,0,.85);bottom:-7px;content:'';position:absolute}.popover.bottom{bottom:-50px;left:50%}.popover.bottom:before{border-bottom:7px solid rgba(0,0,0,.85);top:-7px;content:'';position:absolute}.popover.left:before,.popover.right:before{border-top:7px solid transparent;border-bottom:7px solid transparent;content:'';position:absolute}.dropdown,.popover.left:before{display:inline-block}.popover.right{margin-left:10px;margin-top:-10px}.popover.right:before{border-right:7px solid rgba(0,0,0,.85);display:inline-block;left:-7px;margin-top:7px}.popover.left{margin-top:-10px;right:115%}.popover.left:before{border-left:7px solid rgba(0,0,0,.85);margin-top:7px;right:-10%}@-webkit-keyframes fade-in{from{opacity:0}to{opacity:1}}@-moz-keyframes fade-in{from{opacity:0}to{opacity:1}}@-ms-keyframes fade-in{from{opacity:0}to{opacity:1}}@-webkit-keyframes move-up{from{bottom:30px}to{bottom:42px}}@-moz-keyframes move-up{from{bottom:30px}to{bottom:42px}}@-ms-keyframes move-up{from{bottom:30px}to{bottom:42px}}.progress{width:100%;border:1px solid #cfcfc4}.progress .progress-fill{padding:10px;height:15px;background-color:#779ecb}.progress .progress-fill.progress-fill-white{background-color:#fff;color:#000}.progress .progress-fill.progress-fill-white:hover{background-color:#fff}.progress .progress-fill.progress-fill-black{background-color:#000;color:#fff}.progress .progress-fill.progress-fill-black:hover{background-color:#404040}.progress .progress-fill.progress-fill-default{background-color:#cfcfc4;color:#fff}.progress .progress-fill.progress-fill-default:hover{background-color:#dbdbd3}.progress .progress-fill.progress-fill-primary{background-color:#779ecb;color:#fff}.progress .progress-fill.progress-fill-primary:hover{background-color:#99b6d8}.progress .progress-fill.progress-fill-success{background-color:#7d7;color:#fff}.progress .progress-fill.progress-fill-success:hover{background-color:#99e599}.progress .progress-fill.progress-fill-info{background-color:#9bddff;color:#fff}.progress .progress-fill.progress-fill-info:hover{background-color:#b4e6ff}.progress .progress-fill.progress-fill-warning{background-color:#ffb347;color:#fff}.progress .progress-fill.progress-fill-warning:hover{background-color:#ffc675}.progress .progress-fill.progress-fill-danger{background-color:#ff6961;color:#fff}.progress .progress-fill.progress-fill-danger:hover{background-color:#ff8f89}.list{list-style:none;margin:0;padding:0}.list>.list-item{clear:both;min-height:30px;height:auto;line-height:30px;overflow:auto;padding:10px;border-top:1px solid #cfcfc4;border-right:1px solid #cfcfc4;border-left:1px solid #cfcfc4}.list>.list-item:last-child{border-bottom:1px solid #cfcfc4;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.list>.list-item.list-item-white{border-top:1px solid #fff;border-right:1px solid #fff;border-left:1px solid #fff;background-color:#fff;color:#000}.list>.list-item.list-item-white:last-child{border-bottom:1px solid #fff}.list>.list-item.list-item-black{border-top:1px solid #333;border-right:1px solid #333;border-left:1px solid #333;background-color:#000;color:#fff}.list>.list-item.list-item-black:last-child{border-bottom:1px solid #333}.list>.list-item.list-item-default{border-top:1px solid #d9d9d0;border-right:1px solid #d9d9d0;border-left:1px solid #d9d9d0;background-color:#cfcfc4;color:#fff}.list>.list-item.list-item-default:last-child{border-bottom:1px solid #d9d9d0}.list>.list-item.list-item-primary{border-top:1px solid #92b1d5;border-right:1px solid #92b1d5;border-left:1px solid #92b1d5;background-color:#779ecb;color:#fff}.list>.list-item.list-item-primary:last-child{border-bottom:1px solid #92b1d5}.list>.list-item.list-item-success{border-top:1px solid #92e492;border-right:1px solid #92e492;border-left:1px solid #92e492;background-color:#7d7;color:#fff}.list>.list-item.list-item-success:last-child{border-bottom:1px solid #92e492}.list>.list-item.list-item-info{border-top:1px solid #afe4ff;border-right:1px solid #afe4ff;border-left:1px solid #afe4ff;background-color:#9bddff;color:#fff}.list>.list-item.list-item-info:last-child{border-bottom:1px solid #afe4ff}.list>.list-item.list-item-warning{border-top:1px solid #ffc26c;border-right:1px solid #ffc26c;border-left:1px solid #ffc26c;background-color:#ffb347;color:#fff}.list>.list-item.list-item-warning:last-child{border-bottom:1px solid #ffc26c}.list>.list-item.list-item-danger{border-top:1px solid #ff8781;border-right:1px solid #ff8781;border-left:1px solid #ff8781;background-color:#ff6961;color:#fff}.list>.list-item.list-item-danger:last-child{border-bottom:1px solid #ff8781}.list>.list-item:first-child{border-top-left-radius:5px;border-top-right-radius:5px}.list>.list-item>.list-item-right{float:right}.list>.list-item>.list-item-left{float:left}.dropdown:hover{border-bottom-left-radius:0;border-bottom-right-radius:0}.dropdown:hover .block{border-bottom-right-radius:5px}.dropdown:hover .dropdown-content{display:block}.dropdown:hover .dropdown-content:empty{display:none}.dropdown.block>.dropdown-content{margin-left:-1px}.dropdown-content{display:none;z-index:1000;position:absolute;background-color:#fff;border:1px solid #cfcfc4;border-bottom-right-radius:5px;border-bottom-left-radius:5px;margin-top:6px;margin-left:-19px;min-width:160px;box-shadow:0 0 0 0 rgba(0,0,0,.2)}.dropdown-content>ul{list-style:none;margin:0;padding:0}.dropdown-content>ul>li{color:#000;padding:12px 16px;text-decoration:none;display:block}.dropdown-content>ul>li:hover{background-color:#dedede}.modal{position:fixed;font-family:Arial,Helvetica,sans-serif;top:0;right:0;bottom:0;left:0;background:rgba(50,50,50,.6);z-index:99999;opacity:0;transition:opacity .4s ease-in;pointer-events:none}.modal.active,.modal.modal-active,.modal:target{opacity:1;pointer-events:auto}.modal.modal-absolute{position:absolute;z-index:1}.modal.modal-absolute>div{position:absolute}.modal>div{width:400px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);padding:5px 20px 13px;border-radius:0;background:#fff}.modal.modal-white>div{color:#000;border-left:10px solid #fff}.modal.modal-white>div>.modal-close{color:#000}.modal.modal-black>div{color:#000;border-left:10px solid #000}.modal.modal-black>div>.modal-close{color:#000}.modal.modal-default>div{color:#000;border-left:10px solid #cfcfc4}.modal.modal-default>div>.modal-close{color:#000}.modal.modal-primary>div{color:#000;border-left:10px solid #779ecb}.modal.modal-primary>div>.modal-close{color:#000}.modal.modal-success>div{color:#000;border-left:10px solid #7d7}.modal.modal-success>div>.modal-close{color:#000}.modal.modal-info>div{color:#000;border-left:10px solid #9bddff}.modal.modal-info>div>.modal-close{color:#000}.modal.modal-warning>div{color:#000;border-left:10px solid #ffb347}.modal.modal-warning>div>.modal-close{color:#000}.modal.modal-danger>div{color:#000;border-left:10px solid #ff6961}.modal.modal-danger>div>.modal-close{color:#000}.modal-close{line-height:25px;position:absolute;right:5px;top:5px;width:24px;text-decoration:none}.alert,.panel{position:relative}.panel{height:auto;border:1px solid #cfcfc4}.panel.panel-white{border:1px solid #fff}.panel.panel-white>.panel-footer,.panel.panel-white>.panel-header{background-color:#fff;color:#fff}.panel.panel-black{border:1px solid #000}.panel.panel-black>.panel-footer,.panel.panel-black>.panel-header{background-color:#000;color:#fff}.panel.panel-default{border:1px solid #cfcfc4}.panel.panel-default>.panel-footer,.panel.panel-default>.panel-header{background-color:#cfcfc4;color:#fff}.panel.panel-primary{border:1px solid #779ecb}.panel.panel-primary>.panel-footer,.panel.panel-primary>.panel-header{background-color:#779ecb;color:#fff}.panel.panel-success{border:1px solid #7d7}.panel.panel-success>.panel-footer,.panel.panel-success>.panel-header{background-color:#7d7;color:#fff}.panel.panel-info{border:1px solid #9bddff}.panel.panel-info>.panel-footer,.panel.panel-info>.panel-header{background-color:#9bddff;color:#fff}.panel.panel-warning{border:1px solid #ffb347}.panel.panel-warning>.panel-footer,.panel.panel-warning>.panel-header{background-color:#ffb347;color:#fff}.panel.panel-danger{border:1px solid #ff6961}.panel.panel-danger>.panel-footer,.panel.panel-danger>.panel-header{background-color:#ff6961;color:#fff}.panel>.panel-body{padding:15px}.panel>.panel-header{top:0;padding:15px}.panel>.panel-footer{bottom:0;padding:15px}.badge{display:table-cell;padding:5px;border-radius:100px;vertical-align:middle}.badge.badge-white{background-color:#fff;color:#fff}.badge.badge-black{background-color:#000;color:#fff}.badge.badge-default{background-color:#cfcfc4;color:#fff}.badge.badge-primary{background-color:#779ecb;color:#fff}.badge.badge-success{background-color:#7d7;color:#fff}.badge.badge-info{background-color:#9bddff;color:#fff}.badge.badge-warning{background-color:#ffb347;color:#fff}.badge.badge-danger{background-color:#ff6961;color:#fff}.list-item>.badge{float:right;line-height:20px}.icon-currency-dollar:before{content:"$"}.icon-currency-cent:before{content:"¢"}.icon-currency-pound:before{content:"£"}.icon-currency-euro:before{content:"€"}.icon-currency-currency:before{content:"¤"}.icon-currency-yen:before{content:"¥"}.icon-currency-dram:before{content:"֏"}.icon-currency-baht:before{content:"฿"}.icon-currency-riel:before{content:"¤"}.icon-currency-franc:before{content:"₣"}.icon-currency-kip:before{content:"₭"}.icon-currency-drachma:before{content:"₯"}.icon-currency-peso:before{content:"₱"}.icon-currency-guarani:before{content:"₲"}.icon-currency-austral:before{content:"₳"}.icon-currency-hryvnia:before{content:"₴"}.icon-currency-cedi:before{content:"₵"}.icon-currency-spesmilo:before{content:"₷"}.icon-currency-tenge:before{content:"₸"}.icon-currency-rupee:before{content:"₹"}.icon-currency-lira:before{content:"₺"}.icon-currency-mark:before{content:"M"}.icon-currency-manat:before{content:"₼"}.icon-currency-ruble:before{content:"₽"}.icon-currency-lari:before{content:"₾"}.alert{padding:10px 0;border-radius:5px;border:1px solid;padding-left:10px}.alert>.alert-close{font-size:25px;line-height:15px;position:absolute;right:10px;top:10px}.alert.alert-white{color:#000;background-color:#fff;border:1px solid #e6e6e6}.alert.alert-white>.alert-close{color:#000}.alert.alert-black,.alert.alert-black>.alert-close,.alert.alert-danger,.alert.alert-danger>.alert-close,.alert.alert-default,.alert.alert-default>.alert-close,.alert.alert-info,.alert.alert-info>.alert-close,.alert.alert-primary,.alert.alert-primary>.alert-close,.alert.alert-success>.alert-close,.alert.alert-warning,.alert.alert-warning>.alert-close{color:#fff}.alert.alert-black{background-color:#000;border:1px solid #000}.alert.alert-default{background-color:#cfcfc4;border:1px solid #bdbdae}.alert.alert-primary{background-color:#779ecb;border:1px solid #608dc2}.alert.alert-success{color:#fff;background-color:#7d7;border:1px solid #5cd65c}.alert.alert-info{background-color:#9bddff;border:1px solid #72cfff}.alert.alert-warning{background-color:#ffb347;border:1px solid #ffa626}.alert.alert-danger{background-color:#ff6961;border:1px solid #ff483e}.callout{padding:15px;border-radius:5px;border-top:1px solid #eee;border-bottom:1px solid #eee;border-right:1px solid #eee}.callout.callout-white{border-left:5px solid #fff}.callout.callout-black{border-left:5px solid #000}.callout.callout-default{border-left:5px solid #cfcfc4}.callout.callout-primary{border-left:5px solid #779ecb}.callout.callout-success{border-left:5px solid #7d7}.callout.callout-info{border-left:5px solid #9bddff}.callout.callout-warning{border-left:5px solid #ffb347}.callout.callout-danger{border-left:5px solid #ff6961} \ No newline at end of file diff --git a/kraken-angular-single-page-app/public/favicon.ico b/kraken-angular-single-page-app/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..49fef67a64e076c72ee17834abf35419432160bd GIT binary patch literal 6544 zcmd5=+iFu$5Zy_t^@6n8;+5JIuXshQR8VO9)F*94QD0OlY71%$`r?Zg9|XZ45<~@W>_8w;baJ**^KMI-@YP) z5%JTAV*ymmVG03p|M~tt1ZRV?J^`O*7|mJC=2O6-c1~{(WLG(7}r(%Qat%jVbr7D zhYi3Y=6Lk5`288f&yPbGe|;Loi0_{-7*Z_HsJJHo9?Udr@b{$Ih3NhGuv6Jt|8B}4 zml~#L^IOC&rKqfeMy7y!lcPbcAsEl8LonqO`G zK&q}^5kowA-oknZY!bGb<{rV* zyBvMSVolVLF9QT0c^!hsHa*FGh&l>E- zu2I$1qr)>+b6eThD~;R6>uM|a%l_$TsK*^Bn3e)3i>2{!^~tA>@~ndx zV-FVbbNfDE8P&;uN?&%>l#!qFI_qos>)Wz6^PXnUOs#dUqz}b)U%A%S;dca`3q{KkKOU;P&2Am=|{1V%`=G6s(YviPp!#RPwRE-Ph{9d zwW`LggUDkYi*z%$uPVNY8>4CuMR?QW8%)Ghd6(V`)_`}|fs`g#5GH(=HMqImN2bbF1x{*S(1ZBQ@V79M}y?rwa4UiP|AJipmxPsDldMy$*J z)12L;9&Eej+`i%3a+^7GyEl8=`?`HN(Tl!gNUXtXu<2yxpTUgr@3?VTBe6xyA_y;M|>O8$vmFSabhONV>9vF_E